[pktools] 02/05: Imported Upstream version 2.6.5

Sebastiaan Couwenberg sebastic at moszumanska.debian.org
Fri Dec 18 02:04:02 UTC 2015


This is an automated email from the git hooks/post-receive script.

sebastic pushed a commit to branch master
in repository pktools.

commit 6ac6ee4c5eff14449070ed7acc4b3f02460f7006
Author: Bas Couwenberg <sebastic at xs4all.nl>
Date:   Fri Dec 18 02:54:22 2015 +0100

    Imported Upstream version 2.6.5
---
 ChangeLog                                          |   31 +-
 configure                                          |   22 +-
 configure.ac                                       |    4 +-
 doc/Doxyfile                                       |    2 +-
 doc/apps.dox~                                      |   33 -
 doc/description_pkstat.dox                         |    0
 doc/examples_pkfilter.dox                          |   41 +-
 doc/html/ConfusionMatrix_8cc_source.html           |    4 +-
 doc/html/ConfusionMatrix_8h_source.html            |    4 +-
 doc/html/CostFactorySVM_8cc_source.html            |    4 +-
 doc/html/CostFactorySVM_8h_source.html             |    4 +-
 doc/html/CostFactory_8h_source.html                |    4 +-
 doc/html/Egcs_8cc_source.html                      |    4 +-
 doc/html/Egcs_8h_source.html                       |    4 +-
 doc/html/FeatureSelector_8h_source.html            |   12 +-
 doc/html/FileReaderAscii_8cc_source.html           |    4 +-
 doc/html/FileReaderAscii_8h_source.html            |    4 +-
 doc/html/FileReaderLas_8cc_source.html             |    4 +-
 doc/html/FileReaderLas_8h_source.html              |    4 +-
 doc/html/Filter2d_8cc_source.html                  | 1520 +++----
 doc/html/Filter2d_8h_source.html                   | 2378 +++++-----
 doc/html/Filter_8cc_source.html                    |    4 +-
 doc/html/Filter_8h_source.html                     |    4 +-
 doc/html/Filter__old_8h_source.html                |    4 +-
 doc/html/ImgReaderGdal_8cc_source.html             |    4 +-
 doc/html/ImgReaderGdal_8h_source.html              |    4 +-
 doc/html/ImgReaderOgr_8cc_source.html              |    6 +-
 doc/html/ImgReaderOgr_8h_source.html               |    6 +-
 doc/html/ImgRegression_8cc_source.html             |    4 +-
 doc/html/ImgRegression_8h_source.html              |    4 +-
 doc/html/ImgWriterGdal_8cc_source.html             |    4 +-
 doc/html/ImgWriterGdal_8h_source.html              |    4 +-
 doc/html/ImgWriterOgr_8cc_source.html              |   12 +-
 doc/html/ImgWriterOgr_8h_source.html               |    4 +-
 doc/html/IndexValue_8h_source.html                 |    4 +-
 doc/html/OptFactory_8h_source.html                 |    4 +-
 doc/html/Optionpk_8cc_source.html                  |    4 +-
 doc/html/Optionpk_8h_source.html                   |    4 +-
 doc/html/PosValue_8h_source.html                   |    4 +-
 doc/html/ProcessingPktoolsPlugin_8py_source.html   |    4 +-
 doc/html/StatFactory_8h_source.html                | 2574 ++++++-----
 doc/html/Vector2d_8h_source.html                   |    4 +-
 doc/html/____init_____8py_source.html              |    4 +-
 doc/html/annotated.html                            |  205 +-
 ...gui-gcc-Debug_2moc__mainwindow_8cpp_source.html |    4 +-
 ...e__gui-gcc-Debug_2ui__mainwindow_8h_source.html |    4 +-
 ...i-gcc-Release_2moc__mainwindow_8cpp_source.html |    4 +-
 ..._gui-gcc-Release_2ui__mainwindow_8h_source.html |    4 +-
 ...gui-gcc-Debug_2moc__mainwindow_8cpp_source.html |    4 +-
 ...p__gui-gcc-Debug_2ui__mainwindow_8h_source.html |    4 +-
 ...i-gcc-Release_2moc__mainwindow_8cpp_source.html |    4 +-
 ..._gui-gcc-Release_2ui__mainwindow_8h_source.html |    4 +-
 ...gui-gcc-Debug_2moc__mainwindow_8cpp_source.html |    4 +-
 ...f__gui-gcc-Debug_2ui__mainwindow_8h_source.html |    4 +-
 ...i-gcc-Release_2moc__mainwindow_8cpp_source.html |    4 +-
 ..._gui-gcc-Release_2ui__mainwindow_8h_source.html |    4 +-
 ...gui-gcc-Debug_2moc__mainwindow_8cpp_source.html |    4 +-
 ...t__gui-gcc-Debug_2ui__mainwindow_8h_source.html |    4 +-
 ...i-gcc-Release_2moc__mainwindow_8cpp_source.html |    4 +-
 ..._gui-gcc-Release_2ui__mainwindow_8h_source.html |    4 +-
 ...gui-gcc-Debug_2moc__mainwindow_8cpp_source.html |    4 +-
 ...m__gui-gcc-Debug_2ui__mainwindow_8h_source.html |    4 +-
 ...i-gcc-Release_2moc__mainwindow_8cpp_source.html |    4 +-
 ..._gui-gcc-Release_2ui__mainwindow_8h_source.html |    4 +-
 doc/html/classBadConversion-members.html           |    4 +-
 doc/html/classBadConversion.html                   |    4 +-
 doc/html/classCache-members.html                   |    4 +-
 doc/html/classCache.html                           |    4 +-
 doc/html/classCompare__IndexValue-members.html     |    4 +-
 doc/html/classCompare__IndexValue.html             |    4 +-
 doc/html/classCompare__PosValue-members.html       |    4 +-
 doc/html/classCompare__PosValue.html               |    4 +-
 doc/html/classCostFactory-members.html             |    4 +-
 doc/html/classCostFactory.html                     |    4 +-
 doc/html/classCostFactoryANN-members.html          |    4 +-
 doc/html/classCostFactoryANN.html                  |    4 +-
 doc/html/classCostFactorySVM-members.html          |    4 +-
 doc/html/classCostFactorySVM.html                  |    4 +-
 doc/html/classDataModel-members.html               |    4 +-
 doc/html/classDataModel.html                       |    4 +-
 doc/html/classDecrease__IndexValue-members.html    |    4 +-
 doc/html/classDecrease__IndexValue.html            |    4 +-
 doc/html/classDecrease__PosValue-members.html      |    4 +-
 doc/html/classDecrease__PosValue.html              |    4 +-
 doc/html/classEgcs-members.html                    |    4 +-
 doc/html/classEgcs.html                            |    4 +-
 doc/html/classFANN_1_1neural__net-members.html     |    4 +-
 doc/html/classFANN_1_1neural__net.html             |    4 +-
 doc/html/classFANN_1_1training__data-members.html  |    4 +-
 doc/html/classFANN_1_1training__data.html          |    4 +-
 doc/html/classFeatureSelector-members.html         |    6 +-
 doc/html/classFeatureSelector.html                 |   10 +-
 doc/html/classFileReaderAscii-members.html         |    4 +-
 doc/html/classFileReaderAscii.html                 |    4 +-
 doc/html/classFileReaderLas-members.html           |    4 +-
 doc/html/classFileReaderLas.html                   |    4 +-
 doc/html/classImgReaderGdal-members.html           |    4 +-
 doc/html/classImgReaderGdal.html                   |    4 +-
 doc/html/classImgReaderOgr-members.html            |    6 +-
 doc/html/classImgReaderOgr.html                    |   10 +-
 doc/html/classImgWriterGdal-members.html           |    4 +-
 doc/html/classImgWriterGdal.html                   |    4 +-
 doc/html/classImgWriterOgr-members.html            |    4 +-
 doc/html/classImgWriterOgr.html                    |    4 +-
 doc/html/classIncrease__IndexValue-members.html    |    4 +-
 doc/html/classIncrease__IndexValue.html            |    4 +-
 doc/html/classIncrease__PosValue-members.html      |    4 +-
 doc/html/classIncrease__PosValue.html              |    4 +-
 doc/html/classKernel-members.html                  |    4 +-
 doc/html/classKernel.html                          |    4 +-
 doc/html/classLastReturnFilter-members.html        |    4 +-
 doc/html/classLastReturnFilter.html                |    4 +-
 doc/html/classMainWindow-members.html              |    4 +-
 doc/html/classMainWindow.html                      |    4 +-
 doc/html/classONE__CLASS__Q-members.html           |    4 +-
 doc/html/classONE__CLASS__Q.html                   |    4 +-
 doc/html/classOptFactory-members.html              |    4 +-
 doc/html/classOptFactory.html                      |    4 +-
 doc/html/classOptionpk-members.html                |    4 +-
 doc/html/classOptionpk.html                        |    4 +-
 doc/html/classQMatrix-members.html                 |    4 +-
 doc/html/classQMatrix.html                         |    4 +-
 doc/html/classSVC__Q-members.html                  |    4 +-
 doc/html/classSVC__Q.html                          |    4 +-
 doc/html/classSVR__Q-members.html                  |    4 +-
 doc/html/classSVR__Q.html                          |    4 +-
 doc/html/classSolver-members.html                  |    4 +-
 doc/html/classSolver.html                          |    4 +-
 doc/html/classSolver__NU-members.html              |    4 +-
 doc/html/classSolver__NU.html                      |    4 +-
 doc/html/classUi_1_1MainWindow-members.html        |    4 +-
 doc/html/classUi_1_1MainWindow.html                |    4 +-
 doc/html/classUi__MainWindow-members.html          |    4 +-
 doc/html/classUi__MainWindow.html                  |    4 +-
 doc/html/classVector2d-members.html                |    4 +-
 doc/html/classVector2d.html                        |    4 +-
 ...confusionmatrix_1_1ConfusionMatrix-members.html |    4 +-
 .../classconfusionmatrix_1_1ConfusionMatrix.html   |    4 +-
 doc/html/classes.html                              |   82 +-
 doc/html/classfilter2d_1_1Filter2d-members.html    |    4 +-
 doc/html/classfilter2d_1_1Filter2d.html            |    4 +-
 doc/html/classfilter_1_1Filter-members.html        |    4 +-
 doc/html/classfilter_1_1Filter.html                |    4 +-
 ...lassimgregression_1_1ImgRegression-members.html |    4 +-
 doc/html/classimgregression_1_1ImgRegression.html  |    4 +-
 ...sPlugin_1_1ProcessingPktoolsPlugin-members.html |    4 +-
 ...ngPktoolsPlugin_1_1ProcessingPktoolsPlugin.html |    4 +-
 ...qgis_1_1pkcomposite_1_1pkcomposite-members.html |    4 +-
 .../classqgis_1_1pkcomposite_1_1pkcomposite.html   |    4 +-
 .../classqgis_1_1pkcrop_1_1pkcrop-members.html     |    4 +-
 doc/html/classqgis_1_1pkcrop_1_1pkcrop.html        |    4 +-
 ...diff__accuracy_1_1pkdiff__accuracy-members.html |    4 +-
 ...is_1_1pkdiff__accuracy_1_1pkdiff__accuracy.html |    4 +-
 ...lassqgis_1_1pkextract_1_1pkextract-members.html |    4 +-
 doc/html/classqgis_1_1pkextract_1_1pkextract.html  |    6 +-
 ...pkextract__grid_1_1pkextract__grid-members.html |    4 +-
 ...qgis_1_1pkextract__grid_1_1pkextract__grid.html |    4 +-
 ...tract__random_1_1pkextract__random-members.html |    4 +-
 ..._1_1pkextract__random_1_1pkextract__random.html |    4 +-
 ...lter__spatial_1_1pkfilter__spatial-members.html |    4 +-
 ..._1_1pkfilter__spatial_1_1pkfilter__spatial.html |    4 +-
 ...er__spectral_1_1pkfilter__spectral-members.html |    4 +-
 ..._1pkfilter__spectral_1_1pkfilter__spectral.html |    4 +-
 ...qgis_1_1pkfilterdem_1_1pkfilterdem-members.html |    4 +-
 .../classqgis_1_1pkfilterdem_1_1pkfilterdem.html   |    4 +-
 ...lassqgis_1_1pkgetmask_1_1pkgetmask-members.html |    4 +-
 doc/html/classqgis_1_1pkgetmask_1_1pkgetmask.html  |    4 +-
 ...lassqgis_1_1pklas2img_1_1pklas2img-members.html |    4 +-
 doc/html/classqgis_1_1pklas2img_1_1pklas2img.html  |    4 +-
 ...lassqgis_1_1pkreclass_1_1pkreclass-members.html |    4 +-
 doc/html/classqgis_1_1pkreclass_1_1pkreclass.html  |    4 +-
 ...lassqgis_1_1pksetmask_1_1pksetmask-members.html |    4 +-
 doc/html/classqgis_1_1pksetmask_1_1pksetmask.html  |    4 +-
 doc/html/classqgis_1_1pksvm_1_1pksvm-members.html  |    4 +-
 doc/html/classqgis_1_1pksvm_1_1pksvm.html          |    6 +-
 ...orithmProvider_1_1pktoolsAlgorithmProvider.html |    4 +-
 ...toolsAlgorithm_1_1pktoolsAlgorithm-members.html |    4 +-
 ...is_1_1pktoolsAlgorithm_1_1pktoolsAlgorithm.html |    4 +-
 ...is_1_1pktoolsUtils_1_1pktoolsUtils-members.html |    4 +-
 .../classqgis_1_1pktoolsUtils_1_1pktoolsUtils.html |    4 +-
 ...ools_1_1pkcomposite_1_1pkcomposite-members.html |  101 +
 ..._1_1pktools_1_1pkcomposite_1_1pkcomposite.html} |  116 +-
 ..._1_1pkcomposite_1_1pkcomposite__coll__graph.map |    2 +
 ..._1_1pkcomposite_1_1pkcomposite__coll__graph.md5 |    1 +
 ..._1_1pkcomposite_1_1pkcomposite__coll__graph.png |  Bin 0 -> 3833 bytes
 ...1pkcomposite_1_1pkcomposite__inherit__graph.map |    2 +
 ...1pkcomposite_1_1pkcomposite__inherit__graph.md5 |    1 +
 ...1pkcomposite_1_1pkcomposite__inherit__graph.png |  Bin 0 -> 3833 bytes
 ...gis_1_1pktools_1_1pkcrop_1_1pkcrop-members.html |   95 +
 ... classqgis_1_1pktools_1_1pkcrop_1_1pkcrop.html} |   92 +-
 ...1_1pktools_1_1pkcrop_1_1pkcrop__coll__graph.map |    2 +
 ...1_1pktools_1_1pkcrop_1_1pkcrop__coll__graph.md5 |    1 +
 ...1_1pktools_1_1pkcrop_1_1pkcrop__coll__graph.png |  Bin 0 -> 3561 bytes
 ...pktools_1_1pkcrop_1_1pkcrop__inherit__graph.map |    2 +
 ...pktools_1_1pkcrop_1_1pkcrop__inherit__graph.md5 |    1 +
 ...pktools_1_1pkcrop_1_1pkcrop__inherit__graph.png |  Bin 0 -> 3561 bytes
 ...diff__accuracy_1_1pkdiff__accuracy-members.html |   95 +
 ...s_1_1pkdiff__accuracy_1_1pkdiff__accuracy.html} |   92 +-
 ...__accuracy_1_1pkdiff__accuracy__coll__graph.map |    2 +
 ...__accuracy_1_1pkdiff__accuracy__coll__graph.md5 |    1 +
 ...__accuracy_1_1pkdiff__accuracy__coll__graph.png |  Bin 0 -> 4317 bytes
 ...1pktools_1_1pkextract_1_1pkextract-members.html |   95 +
 ...qgis_1_1pktools_1_1pkextract_1_1pkextract.html} |   92 +-
 ...ools_1_1pkextract_1_1pkextract__coll__graph.map |    2 +
 ...ools_1_1pkextract_1_1pkextract__coll__graph.md5 |    1 +
 ...ools_1_1pkextract_1_1pkextract__coll__graph.png |  Bin 0 -> 4375 bytes
 ...s_1_1pkextract_1_1pkextract__inherit__graph.map |    2 +
 ...s_1_1pkextract_1_1pkextract__inherit__graph.md5 |    1 +
 ...s_1_1pkextract_1_1pkextract__inherit__graph.png |  Bin 0 -> 4375 bytes
 ...pkextract__grid_1_1pkextract__grid-members.html |   94 +
 ...ols_1_1pkextract__grid_1_1pkextract__grid.html} |   88 +-
 ...tract__grid_1_1pkextract__grid__coll__graph.map |    2 +
 ...tract__grid_1_1pkextract__grid__coll__graph.md5 |    1 +
 ...tract__grid_1_1pkextract__grid__coll__graph.png |  Bin 0 -> 4317 bytes
 ...tract__random_1_1pkextract__random-members.html |   94 +
 ...1_1pkextract__random_1_1pkextract__random.html} |   88 +-
 ...lter__spatial_1_1pkfilter__spatial-members.html |   94 +
 ...1_1pkfilter__spatial_1_1pkfilter__spatial.html} |   88 +-
 ...er__spectral_1_1pkfilter__spectral-members.html |   94 +
 ...1pkfilter__spectral_1_1pkfilter__spectral.html} |   88 +-
 ...ools_1_1pkfilterdem_1_1pkfilterdem-members.html |   91 +
 ..._1_1pktools_1_1pkfilterdem_1_1pkfilterdem.html} |   76 +-
 ..._1_1pkfilterdem_1_1pkfilterdem__coll__graph.map |    2 +
 ..._1_1pkfilterdem_1_1pkfilterdem__coll__graph.md5 |    1 +
 ..._1_1pkfilterdem_1_1pkfilterdem__coll__graph.png |  Bin 0 -> 3843 bytes
 ...1pkfilterdem_1_1pkfilterdem__inherit__graph.map |    2 +
 ...1pkfilterdem_1_1pkfilterdem__inherit__graph.md5 |    1 +
 ...1pkfilterdem_1_1pkfilterdem__inherit__graph.png |  Bin 0 -> 3843 bytes
 ...1pktools_1_1pkgetmask_1_1pkgetmask-members.html |   95 +
 ...qgis_1_1pktools_1_1pkgetmask_1_1pkgetmask.html} |   92 +-
 ...ools_1_1pkgetmask_1_1pkgetmask__coll__graph.map |    2 +
 ...ools_1_1pkgetmask_1_1pkgetmask__coll__graph.md5 |    1 +
 ...ools_1_1pkgetmask_1_1pkgetmask__coll__graph.png |  Bin 0 -> 3889 bytes
 ...s_1_1pkgetmask_1_1pkgetmask__inherit__graph.map |    2 +
 ...s_1_1pkgetmask_1_1pkgetmask__inherit__graph.md5 |    1 +
 ...s_1_1pkgetmask_1_1pkgetmask__inherit__graph.png |  Bin 0 -> 3889 bytes
 ...1pktools_1_1pklas2img_1_1pklas2img-members.html |   98 +
 ...qgis_1_1pktools_1_1pklas2img_1_1pklas2img.html} |  104 +-
 ...ools_1_1pklas2img_1_1pklas2img__coll__graph.map |    2 +
 ...ools_1_1pklas2img_1_1pklas2img__coll__graph.md5 |    1 +
 ...ools_1_1pklas2img_1_1pklas2img__coll__graph.png |  Bin 0 -> 3890 bytes
 ...s_1_1pklas2img_1_1pklas2img__inherit__graph.map |    2 +
 ...s_1_1pklas2img_1_1pklas2img__inherit__graph.md5 |    1 +
 ...s_1_1pklas2img_1_1pklas2img__inherit__graph.png |  Bin 0 -> 3890 bytes
 ...1pktools_1_1pkreclass_1_1pkreclass-members.html |   94 +
 ...qgis_1_1pktools_1_1pkreclass_1_1pkreclass.html} |   88 +-
 ...ools_1_1pkreclass_1_1pkreclass__coll__graph.map |    2 +
 ...ools_1_1pkreclass_1_1pkreclass__coll__graph.md5 |    1 +
 ...ools_1_1pkreclass_1_1pkreclass__coll__graph.png |  Bin 0 -> 3859 bytes
 ...s_1_1pkreclass_1_1pkreclass__inherit__graph.map |    2 +
 ...s_1_1pkreclass_1_1pkreclass__inherit__graph.md5 |    1 +
 ...s_1_1pkreclass_1_1pkreclass__inherit__graph.png |  Bin 0 -> 3859 bytes
 ...1pktools_1_1pksetmask_1_1pksetmask-members.html |   94 +
 ...qgis_1_1pktools_1_1pksetmask_1_1pksetmask.html} |   88 +-
 ...ools_1_1pksetmask_1_1pksetmask__coll__graph.map |    2 +
 ...ools_1_1pksetmask_1_1pksetmask__coll__graph.md5 |    1 +
 ...ools_1_1pksetmask_1_1pksetmask__coll__graph.png |  Bin 0 -> 3825 bytes
 ...s_1_1pksetmask_1_1pksetmask__inherit__graph.map |    2 +
 ...s_1_1pksetmask_1_1pksetmask__inherit__graph.md5 |    1 +
 ...s_1_1pksetmask_1_1pksetmask__inherit__graph.png |  Bin 0 -> 3825 bytes
 ...sqgis_1_1pktools_1_1pksvm_1_1pksvm-members.html |   93 +
 ...=> classqgis_1_1pktools_1_1pksvm_1_1pksvm.html} |   84 +-
 ...s_1_1pktools_1_1pksvm_1_1pksvm__coll__graph.map |    2 +
 ...s_1_1pktools_1_1pksvm_1_1pksvm__coll__graph.md5 |    1 +
 ...s_1_1pktools_1_1pksvm_1_1pksvm__coll__graph.png |  Bin 0 -> 3563 bytes
 ..._1pktools_1_1pksvm_1_1pksvm__inherit__graph.map |    2 +
 ..._1pktools_1_1pksvm_1_1pksvm__inherit__graph.md5 |    1 +
 ..._1pktools_1_1pksvm_1_1pksvm__inherit__graph.png |  Bin 0 -> 3563 bytes
 ...oolsAlgorithm_1_1pktoolsAlgorithm-members.html} |   16 +-
 ...s_1_1pktoolsAlgorithm_1_1pktoolsAlgorithm.html} |   36 +-
 ...sAlgorithm_1_1pktoolsAlgorithm__coll__graph.map |    2 +
 ...sAlgorithm_1_1pktoolsAlgorithm__coll__graph.md5 |    1 +
 ...sAlgorithm_1_1pktoolsAlgorithm__coll__graph.png |  Bin 0 -> 4162 bytes
 ...s_1_1pktoolsUtils_1_1pktoolsUtils-members.html} |   16 +-
 ..._1pktools_1_1pktoolsUtils_1_1pktoolsUtils.html} |   28 +-
 .../classstatfactory_1_1StatFactory-members.html   |    4 +-
 doc/html/classstatfactory_1_1StatFactory.html      |    4 +-
 doc/html/config_8h_source.html                     |   10 +-
 doc/html/dir_0af1587c8378955de40f48b4bd1869f0.html |    4 +-
 doc/html/dir_0d45166ba6790a432639a127a727f02c.html |    4 +-
 doc/html/dir_0f38b5d14ac73b43e2a48a75f9e70be8.html |    4 +-
 doc/html/dir_0f63d6441a2c250919e1e8723011eb2f.html |    4 +-
 doc/html/dir_2676862852e3d558e3597542a81ecc63.html |    4 +-
 doc/html/dir_280a0ba2820d23d6529bf494f1ea3ddd.html |    4 +-
 doc/html/dir_35acdce8930fac877097c845a64519e5.html |    4 +-
 doc/html/dir_41d189c72498e24f979b227eb8e138b1.html |    4 +-
 doc/html/dir_457de909e3893805a4d2d0b8c0742bd8.html |    4 +-
 doc/html/dir_4dfaa1fe1382d1276d1c80b1d5035ade.html |    4 +-
 doc/html/dir_53adf0b982dc8545998aae3f283a5a58.html |    6 +-
 doc/html/dir_5785acc8d2e42f8795bdbe936856f26d.html |   11 +-
 .../dir_5785acc8d2e42f8795bdbe936856f26d_dep.map   |    3 +-
 .../dir_5785acc8d2e42f8795bdbe936856f26d_dep.md5   |    2 +-
 .../dir_5785acc8d2e42f8795bdbe936856f26d_dep.png   |  Bin 1083 -> 1970 bytes
 doc/html/dir_5f1e10fd305b434def78aaf73fd56d60.html |    4 +-
 doc/html/dir_68267d1309a1af8e8297ef4c3efbcdba.html |    4 +-
 doc/html/dir_6d2fd95b0bd390617ad5a1eb4a537b4a.html |    4 +-
 doc/html/dir_849702d4228bd835bdf1201002937cb3.html |    4 +-
 doc/html/dir_89a0bd85ecec8fbb2c320310670be290.html |    4 +-
 doc/html/dir_ab1bbd5a6b4bd6507847335527b029bb.html |    4 +-
 doc/html/dir_b66e135988e27fdc966ddddb8708f514.html |    4 +-
 doc/html/dir_b6b6de371025fb67c6b8623f3d3cd2ce.html |    4 +-
 doc/html/dir_b7cc22b4453454f1e686d9a2e78d988d.html |  116 +
 .../dir_b7cc22b4453454f1e686d9a2e78d988d_dep.map   |    4 +
 .../dir_b7cc22b4453454f1e686d9a2e78d988d_dep.md5   |    1 +
 .../dir_b7cc22b4453454f1e686d9a2e78d988d_dep.png   |  Bin 0 -> 2189 bytes
 doc/html/dir_b8eb6544d8d9ffceba16909a7b9d17d7.html |    4 +-
 doc/html/dir_d7b2ebecdb5f44d7fa09bdedebc881a7.html |    4 +-
 doc/html/dir_e28b2035b152bb51229fe7a0fca4e376.html |    4 +-
 doc/html/dir_e61db0d85028141ec5940fd7f2a6e0fc.html |    4 +-
 doc/html/dir_e6df591b0639d4c4807ef64d058833e2.html |    4 +-
 doc/html/dir_ed1df9621940d6aa1183c365ad1750d2.html |    4 +-
 doc/html/dir_f92e37ed5759424bff98155847b1034b.html |    4 +-
 doc/html/files.html                                |  341 +-
 doc/html/functions.html                            |   16 +-
 doc/html/functions_func.html                       |   16 +-
 doc/html/functions_rela.html                       |    4 +-
 doc/html/graph_legend.html                         |    4 +-
 doc/html/hierarchy.html                            |  172 +-
 doc/html/index.html                                |   30 +-
 doc/html/inherit_graph_31.map                      |   42 +-
 doc/html/inherit_graph_31.md5                      |    2 +-
 doc/html/inherit_graph_31.png                      |  Bin 60471 -> 167041 bytes
 doc/html/inherit_graph_32.map                      |    3 +-
 doc/html/inherit_graph_32.md5                      |    2 +-
 doc/html/inherit_graph_32.png                      |  Bin 3924 -> 5862 bytes
 doc/html/inherit_graph_33.map                      |    3 +-
 doc/html/inherit_graph_33.md5                      |    2 +-
 doc/html/inherit_graph_33.png                      |  Bin 4628 -> 9013 bytes
 doc/html/inherit_graph_34.map                      |    2 +-
 doc/html/inherit_graph_34.md5                      |    2 +-
 doc/html/inherit_graph_34.png                      |  Bin 1915 -> 1956 bytes
 doc/html/inherit_graph_35.map                      |    2 +-
 doc/html/inherit_graph_35.md5                      |    2 +-
 doc/html/inherit_graph_35.png                      |  Bin 2334 -> 2724 bytes
 doc/html/inherit_graph_36.map                      |    6 +-
 doc/html/inherit_graph_36.md5                      |    2 +-
 doc/html/inherit_graph_36.png                      |  Bin 8435 -> 1915 bytes
 doc/html/inherit_graph_37.map                      |    3 +-
 doc/html/inherit_graph_37.md5                      |    2 +-
 doc/html/inherit_graph_37.png                      |  Bin 1729 -> 2334 bytes
 doc/html/inherit_graph_38.map                      |    6 +-
 doc/html/inherit_graph_38.md5                      |    2 +-
 doc/html/inherit_graph_38.png                      |  Bin 1477 -> 8435 bytes
 doc/html/inherit_graph_39.map                      |    3 +-
 doc/html/inherit_graph_39.md5                      |    2 +-
 doc/html/inherit_graph_39.png                      |  Bin 1721 -> 1729 bytes
 doc/html/inherit_graph_40.map                      |    2 +-
 doc/html/inherit_graph_40.md5                      |    2 +-
 doc/html/inherit_graph_40.png                      |  Bin 1134 -> 1477 bytes
 doc/html/inherit_graph_41.map                      |    2 +-
 doc/html/inherit_graph_41.md5                      |    2 +-
 doc/html/inherit_graph_41.png                      |  Bin 1161 -> 1721 bytes
 doc/html/inherit_graph_42.map                      |    2 +-
 doc/html/inherit_graph_42.md5                      |    2 +-
 doc/html/inherit_graph_42.png                      |  Bin 1350 -> 1134 bytes
 doc/html/inherit_graph_43.map                      |    2 +-
 doc/html/inherit_graph_43.md5                      |    2 +-
 doc/html/inherit_graph_43.png                      |  Bin 1221 -> 1161 bytes
 doc/html/inherit_graph_44.map                      |    3 +-
 doc/html/inherit_graph_44.md5                      |    2 +-
 doc/html/inherit_graph_44.png                      |  Bin 2164 -> 1350 bytes
 .../{inherit_graph_43.map => inherit_graph_45.map} |    0
 .../{inherit_graph_43.md5 => inherit_graph_45.md5} |    0
 .../{inherit_graph_43.png => inherit_graph_45.png} |  Bin
 .../{inherit_graph_44.map => inherit_graph_46.map} |    0
 .../{inherit_graph_44.md5 => inherit_graph_46.md5} |    0
 .../{inherit_graph_44.png => inherit_graph_46.png} |  Bin
 doc/html/inherits.html                             |   48 +-
 doc/html/md_apps.html                              |    4 +-
 ...md_mainpage.html => md_description_pkstat.html} |    8 +-
 doc/html/md_examples_pkann.html                    |    4 +-
 doc/html/md_examples_pkascii2img.html              |    4 +-
 doc/html/md_examples_pkascii2ogr.html              |    4 +-
 doc/html/md_examples_pkcomposite.html              |    4 +-
 doc/html/md_examples_pkcreatect.html               |    4 +-
 doc/html/md_examples_pkcrop.html                   |    4 +-
 doc/html/md_examples_pkdiff.html                   |    4 +-
 doc/html/md_examples_pkdsm2shadow.html             |    4 +-
 doc/html/md_examples_pkdumpimg.html                |    4 +-
 doc/html/md_examples_pkdumpogr.html                |    4 +-
 doc/html/md_examples_pkextract.html                |    4 +-
 doc/html/md_examples_pkfilter.html                 |   33 +-
 doc/html/md_examples_pkgetmask.html                |    4 +-
 doc/html/md_examples_pkinfo.html                   |    4 +-
 doc/html/md_examples_pkpolygonize.html             |    4 +-
 doc/html/md_examples_pkreclass.html                |    4 +-
 doc/html/md_examples_pksetmask.html                |    4 +-
 doc/html/md_examples_pksieve.html                  |    4 +-
 doc/html/md_examples_pkstatogr.html                |    4 +-
 doc/html/md_examples_pksvm.html                    |    4 +-
 doc/html/md_faq_pkcomposite.html                   |    4 +-
 doc/html/md_faq_pksetmask.html                     |    4 +-
 doc/html/md_header.html                            |    4 +-
 doc/html/md_installation_linux.html                |    4 +-
 ...pkstatogr.html => md_installation_plugins.html} |   21 +-
 doc/html/md_installation_windows.html              |    8 +-
 doc/html/md_mainpage.html                          |    4 +-
 doc/html/myfann__cpp_8h_source.html                |    4 +-
 doc/html/pages.html                                |  122 +-
 doc/html/pkann.html                                |   14 +-
 doc/html/pkann_8cc_source.html                     | 2261 +++++-----
 doc/html/pkascii2img.html                          |    4 +-
 doc/html/pkascii2img_8cc_source.html               |    4 +-
 doc/html/pkascii2ogr.html                          |    4 +-
 doc/html/pkascii2ogr_8cc_source.html               |    4 +-
 doc/html/pkcomposite.html                          |   20 +-
 doc/html/pkcomposite_8cc_source.html               | 2127 +++++----
 doc/html/pkcomposite_8py_source.html               |    6 +-
 doc/html/pkcomposite__gui_2main_8cc_source.html    |    4 +-
 .../pkcomposite__gui_2mainwindow_8cc_source.html   |    4 +-
 .../pkcomposite__gui_2mainwindow_8h_source.html    |    4 +-
 doc/html/pkcreatect.html                           |    4 +-
 doc/html/pkcreatect_8cc_source.html                |    4 +-
 doc/html/pkcrop.html                               |   22 +-
 doc/html/pkcrop_8cc_source.html                    | 1403 +++---
 doc/html/pkcrop_8py_source.html                    |    4 +-
 doc/html/pkcrop__gui_2main_8cc_source.html         |    4 +-
 doc/html/pkcrop__gui_2mainwindow_8cc_source.html   |    4 +-
 doc/html/pkcrop__gui_2mainwindow_8h_source.html    |    4 +-
 doc/html/pkdiff.html                               |    4 +-
 doc/html/pkdiff_8cc_source.html                    |    4 +-
 doc/html/pkdiff__accuracy_8py_source.html          |    4 +-
 doc/html/pkdiff__gui_2main_8cpp_source.html        |    4 +-
 doc/html/pkdiff__gui_2mainwindow_8cpp_source.html  |    4 +-
 doc/html/pkdiff__gui_2mainwindow_8h_source.html    |    4 +-
 doc/html/pkdsm2shadow.html                         |    4 +-
 doc/html/pkdsm2shadow_8cc_source.html              |    4 +-
 doc/html/pkdumpimg.html                            |    4 +-
 doc/html/pkdumpimg_8cc_source.html                 |    4 +-
 doc/html/pkdumpogr.html                            |    4 +-
 doc/html/pkdumpogr_8cc_source.html                 |    4 +-
 doc/html/pkdumpogr_8h_source.html                  |    4 +-
 doc/html/pkeditogr_8cc_source.html                 |    4 +-
 doc/html/pkegcs.html                               |    4 +-
 doc/html/pkegcs_8cc_source.html                    |    4 +-
 doc/html/pkenhance_8cc_source.html                 |    4 +-
 doc/html/pkextract.html                            |   44 +-
 doc/html/pkextract_8cc_source.html                 | 4764 ++++++++++----------
 doc/html/pkextract_8py_source.html                 |   54 +-
 doc/html/pkextract__grid_8py_source.html           |    4 +-
 doc/html/pkextract__gui_2main_8cpp_source.html     |    4 +-
 .../pkextract__gui_2mainwindow_8cpp_source.html    |    4 +-
 doc/html/pkextract__gui_2mainwindow_8h_source.html |    4 +-
 doc/html/pkextract__random_8py_source.html         |    4 +-
 doc/html/pkfillnodata.html                         |    4 +-
 doc/html/pkfillnodata_8cc_source.html              |    4 +-
 doc/html/pkfilter.html                             |  135 +-
 doc/html/pkfilter_8cc_source.html                  | 1839 ++++----
 doc/html/pkfilter__spatial_8py_source.html         |    4 +-
 doc/html/pkfilter__spectral_8py_source.html        |    4 +-
 doc/html/pkfilterascii.html                        |    4 +-
 doc/html/pkfilterascii_8cc_source.html             |    4 +-
 doc/html/pkfilterdem.html                          |    4 +-
 doc/html/pkfilterdem_8cc_source.html               |    4 +-
 doc/html/pkfilterdem_8py_source.html               |    4 +-
 doc/html/pkfsann.html                              |   14 +-
 doc/html/pkfsann_8cc_source.html                   |  700 +--
 doc/html/pkfsann_8h_source.html                    |    4 +-
 doc/html/pkfssvm.html                              |   14 +-
 doc/html/pkfssvm_8cc_source.html                   |  694 +--
 doc/html/pkgetmask.html                            |    4 +-
 doc/html/pkgetmask_8cc_source.html                 |    4 +-
 doc/html/pkgetmask_8py_source.html                 |   57 +-
 doc/html/pkinfo.html                               |    4 +-
 doc/html/pkinfo_8cc_source.html                    |    4 +-
 doc/html/pkkalman.html                             |   60 +-
 ...n_8cc_source.html => pkkalman1_8cc_source.html} | 3355 +++++++-------
 doc/html/pkkalman_8cc_source.html                  | 3002 ++++++------
 doc/html/pklas2img.html                            |   12 +-
 doc/html/pklas2img_8cc_source.html                 | 1037 ++---
 doc/html/pklas2img_8py_source.html                 |    4 +-
 doc/html/pkndvi_8cc_source.html                    |    4 +-
 doc/html/pkoptsvm.html                             |   14 +-
 doc/html/pkoptsvm_8cc_source.html                  |  746 +--
 doc/html/pkpolygonize.html                         |    4 +-
 doc/html/pkpolygonize_8cc_source.html              |    4 +-
 doc/html/pkreclass.html                            |    4 +-
 doc/html/pkreclass_8cc_source.html                 |    4 +-
 doc/html/pkreclass_8py_source.html                 |    4 +-
 doc/html/pkregann.html                             |    4 +-
 doc/html/pkregann_8cc_source.html                  |    4 +-
 doc/html/pksensormodel_8h_source.html              |    4 +-
 doc/html/pksetmask.html                            |   12 +-
 doc/html/pksetmask_8cc_source.html                 |  612 +--
 doc/html/pksetmask_8py_source.html                 |   43 +-
 doc/html/pksieve.html                              |    4 +-
 doc/html/pksieve_8cc_source.html                   |    4 +-
 doc/html/pkstat.html                               |    4 +-
 doc/html/pkstat_8cc_source.html                    | 1896 ++++----
 doc/html/pkstatascii.html                          |    4 +-
 doc/html/pkstatascii_8cc_source.html               |    4 +-
 doc/html/pkstatogr.html                            |    4 +-
 doc/html/pkstatogr_8cc_source.html                 |    4 +-
 doc/html/pksvm.html                                |   18 +-
 doc/html/pksvm_8cc_source.html                     | 2550 +++++------
 doc/html/pksvm_8py_source.html                     |  223 +-
 doc/html/pksvm__gui_2main_8cpp_source.html         |    4 +-
 doc/html/pksvm__gui_2mainwindow_8cpp_source.html   |    4 +-
 doc/html/pksvm__gui_2mainwindow_8h_source.html     |    4 +-
 doc/html/pktestOption_8cc_source.html              |    4 +-
 doc/html/pktoolsAlgorithmProvider_8py_source.html  |    4 +-
 doc/html/pktoolsAlgorithm_8py_source.html          |    9 +-
 doc/html/pktoolsUtils_8py_source.html              |    4 +-
 ...tools_2ProcessingPktoolsPlugin_8py_source.html} |   20 +-
 ....html => pktools_2____init_____8py_source.html} |    8 +-
 ...e.html => pktools_2pkcomposite_8py_source.html} |  126 +-
 ...source.html => pktools_2pkcrop_8py_source.html} |   94 +-
 ...l => pktools_2pkdiff__accuracy_8py_source.html} |   92 +-
 ...rce.html => pktools_2pkextract_8py_source.html} |   94 +-
 ...ml => pktools_2pkextract__grid_8py_source.html} |   88 +-
 ... => pktools_2pkextract__random_8py_source.html} |   88 +-
 ... => pktools_2pkfilter__spatial_8py_source.html} |   84 +-
 ...=> pktools_2pkfilter__spectral_8py_source.html} |   82 +-
 ...e.html => pktools_2pkfilterdem_8py_source.html} |   68 +-
 ...rce.html => pktools_2pkgetmask_8py_source.html} |  131 +-
 ...rce.html => pktools_2pklas2img_8py_source.html} |  102 +-
 ...rce.html => pktools_2pkreclass_8py_source.html} |   88 +-
 ...rce.html => pktools_2pksetmask_8py_source.html} |  115 +-
 ..._source.html => pktools_2pksvm_8py_source.html} |   84 +-
 ...ools_2pktoolsAlgorithmProvider_8py_source.html} |   44 +-
 ...l => pktools_2pktoolsAlgorithm_8py_source.html} |   12 +-
 ....html => pktools_2pktoolsUtils_8py_source.html} |   12 +-
 doc/html/structIndexValue-members.html             |    4 +-
 doc/html/structIndexValue.html                     |    4 +-
 doc/html/structPosValue-members.html               |    4 +-
 doc/html/structPosValue.html                       |    4 +-
 doc/html/structSolver_1_1SolutionInfo-members.html |    4 +-
 doc/html/structSolver_1_1SolutionInfo.html         |    4 +-
 doc/html/structdecision__function-members.html     |    4 +-
 doc/html/structdecision__function.html             |    4 +-
 doc/html/structsvm__model-members.html             |    4 +-
 doc/html/structsvm__model.html                     |    4 +-
 doc/html/structsvm__node-members.html              |    4 +-
 doc/html/structsvm__node.html                      |    4 +-
 doc/html/structsvm__parameter-members.html         |    4 +-
 doc/html/structsvm__parameter.html                 |    4 +-
 doc/html/structsvm__problem-members.html           |    4 +-
 doc/html/structsvm__problem.html                   |    4 +-
 doc/html/svm_8cpp_source.html                      |    4 +-
 doc/html/svm_8h_source.html                        |    4 +-
 doc/html/vis__studio_2config_8h_source.html        |    4 +-
 doc/installation_plugins.dox                       |   12 +
 doc/installation_windows.dox                       |    6 -
 doc/mainpage.dox                                   |   45 +-
 src/algorithms/Filter.cc                           |   85 +-
 src/algorithms/Filter.h                            |   16 +-
 src/algorithms/Filter2d.cc                         |   15 +
 src/algorithms/Filter2d.h                          |   16 +-
 src/algorithms/StatFactory.h                       |  271 +-
 src/apps/Makefile.am                               |    6 +-
 src/apps/Makefile.in                               |   26 +-
 src/apps/pkann.cc                                  |   81 +-
 src/apps/pkcomposite.cc                            |  205 +-
 src/apps/pkcreatect.cc                             |    4 +-
 src/apps/pkcrop.cc                                 |   68 +-
 src/apps/pkdiff.cc                                 |    5 +-
 src/apps/pkdsm2shadow.cc                           |    6 +-
 src/apps/pkextract.cc                              |  199 +-
 src/apps/pkfilter.cc                               |  158 +-
 src/apps/pkfilterdem.cc                            |    6 +-
 src/apps/pkfsann.cc                                |   42 +-
 src/apps/pkfssvm.cc                                |   46 +-
 src/apps/pkgetmask.cc                              |    6 +-
 src/apps/pkinfo.cc                                 |    2 +-
 src/apps/pkkalman.cc                               | 1628 ++++---
 src/apps/pklas2img.cc                              |   37 +-
 src/apps/pkoptsvm.cc                               |   47 +-
 src/apps/pkreclass.cc                              |    5 +-
 src/apps/pksetmask.cc                              |   17 +-
 src/apps/pkstat.cc                                 |  163 +-
 src/apps/{pkdsm2shadow.cc => pkstatprofile.cc}     |  173 +-
 src/apps/pksvm.cc                                  |   86 +-
 src/imageclasses/ImgReaderGdal.cc                  |  177 +-
 src/imageclasses/ImgReaderGdal.h                   |    4 +-
 src/imageclasses/ImgReaderOgr.cc                   |   13 +-
 src/imageclasses/ImgReaderOgr.h                    |   11 +-
 src/imageclasses/ImgWriterOgr.cc                   |   56 +-
 src/imageclasses/ImgWriterOgr.h                    |   13 +
 578 files changed, 24193 insertions(+), 20779 deletions(-)

diff --git a/ChangeLog b/ChangeLog
index 4188a7e..3e819ef 100755
--- a/ChangeLog
+++ b/ChangeLog
@@ -404,17 +404,38 @@ version 2.6.4
  - pkcrop
 	support mask
 	support extent to cutline
+	support start and end band sequence
  - pksvm
-	support extent to cutline (change request #108835)
+	support vector mask to cutline (change request #108835)
+	support start and end band sequence
  - pkann
-	support extent to cutline (change request #108835)
+	support vector mask to cutline (change request #108835)
+	support start and end band sequence
  - FeatureSelector.h
 	compilation error due to redeclaration with default arguments
 	patch from Bas Couwenberg (ticket #45416)
+
+version 2.6.5
+ - GTiff default output image format for all applications
+ - ImgReaderOgr.h patch for gdal 2.0 (ticket #46270), thanks to Bas Couwenberg
+ - ImgReaderOgr.cc patch for gdal 2.0 (ticket #46270), thanks to Bas Couwenberg
+ - ImgWriterOgr.h patch for gdal 2.0 (ticket #46270), thanks to Bas Couwenberg
+ - ImgWriterOgr.cc patch for gdal 2.0 (ticket #46270), thanks to Bas Couwenberg
+ - cmake support, thanks to Peter Bunting and Kris Vanhoof
+ - StatFactory
+	minimum and maximum values in case of nodata (initial value)
+	erase nodata values when calculating percentiles
+ - pkextract
+	support automatically retrieval of classes in case of mode, proportion and count rule
+	support count (-r count) extraction rule similar to proportion (change request #108902)
+ - pklas2img
+	support for scan angle rank (change request #108901)
+	support for minimum and maximum scan angle rank (change request #108901)
+ - pkcomposite
+	performace gain: keep all input images open and read line for all inputs at once. Warning for large number of input: 1) memory issues, 2) GDAL_MAX_DATASET_POOL_SIZE which defaults to 100 3) restriction in Linux: number of file handles that can be opened by a process is generally limited to 1024.
+ - pkstatprofile
+	Calculate statistical functions on temporal/spectral profile (multi-band rater dataset), replaces some functionality in pkfilter -dz 1. Supports multiple functions to produced multi-band output
 Todo:
- - pkann
-	support extent to cutline (similar to pksvm, change request #108835)
  - todo for API
 	ImgReaderGdal (ImgWriterGdal) open in update mode (check gdal_edit.py: http://searchcode.com/codesearch/view/18938404)
-	Img[Reader|Writer]Ogr replace OGRDataSource with GDALDataset conform to GDAL API 2.x
 
diff --git a/configure b/configure
index b5c4ba2..3bc9b17 100755
--- a/configure
+++ b/configure
@@ -1,6 +1,6 @@
 #! /bin/sh
 # Guess values for system-dependent variables and create Makefiles.
-# Generated by GNU Autoconf 2.69 for pktools 2.6.4.
+# Generated by GNU Autoconf 2.69 for pktools 2.6.5.
 #
 # Report bugs to <kempenep at gmail.com>.
 #
@@ -590,8 +590,8 @@ MAKEFLAGS=
 # Identity of this package.
 PACKAGE_NAME='pktools'
 PACKAGE_TARNAME='pktools'
-PACKAGE_VERSION='2.6.4'
-PACKAGE_STRING='pktools 2.6.4'
+PACKAGE_VERSION='2.6.5'
+PACKAGE_STRING='pktools 2.6.5'
 PACKAGE_BUGREPORT='kempenep at gmail.com'
 PACKAGE_URL=''
 
@@ -1366,7 +1366,7 @@ if test "$ac_init_help" = "long"; then
   # Omit some internal or obsolete options to make the list less imposing.
   # This message is too long to be a string in the A/UX 3.1 sh.
   cat <<_ACEOF
-\`configure' configures pktools 2.6.4 to adapt to many kinds of systems.
+\`configure' configures pktools 2.6.5 to adapt to many kinds of systems.
 
 Usage: $0 [OPTION]... [VAR=VALUE]...
 
@@ -1436,7 +1436,7 @@ fi
 
 if test -n "$ac_init_help"; then
   case $ac_init_help in
-     short | recursive ) echo "Configuration of pktools 2.6.4:";;
+     short | recursive ) echo "Configuration of pktools 2.6.5:";;
    esac
   cat <<\_ACEOF
 
@@ -1562,7 +1562,7 @@ fi
 test -n "$ac_init_help" && exit $ac_status
 if $ac_init_version; then
   cat <<\_ACEOF
-pktools configure 2.6.4
+pktools configure 2.6.5
 generated by GNU Autoconf 2.69
 
 Copyright (C) 2012 Free Software Foundation, Inc.
@@ -2323,7 +2323,7 @@ cat >config.log <<_ACEOF
 This file contains any messages produced by compilers while
 running configure, to aid debugging if configure makes a mistake.
 
-It was created by pktools $as_me 2.6.4, which was
+It was created by pktools $as_me 2.6.5, which was
 generated by GNU Autoconf 2.69.  Invocation command line was
 
   $ $0 $@
@@ -3187,7 +3187,7 @@ fi
 
 # Define the identity of the package.
  PACKAGE='pktools'
- VERSION='2.6.4'
+ VERSION='2.6.5'
 
 
 cat >>confdefs.h <<_ACEOF
@@ -19597,7 +19597,7 @@ fi
 # For information on how to properly maintain the library version information,
 # refer to the libtool manual, section "Updating library version information":
 # http://www.gnu.org/software/libtool/manual/html_node/Updating-version-info.html
-PKTOOLS_SO_VERSION=1:4:0
+PKTOOLS_SO_VERSION=1:5:0
 
 
 # files to generate via autotools (.am or .in source files)
@@ -20175,7 +20175,7 @@ cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
 # report actual input values of CONFIG_FILES etc. instead of their
 # values after options handling.
 ac_log="
-This file was extended by pktools $as_me 2.6.4, which was
+This file was extended by pktools $as_me 2.6.5, which was
 generated by GNU Autoconf 2.69.  Invocation command line was
 
   CONFIG_FILES    = $CONFIG_FILES
@@ -20241,7 +20241,7 @@ _ACEOF
 cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
 ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`"
 ac_cs_version="\\
-pktools config.status 2.6.4
+pktools config.status 2.6.5
 configured by $0, generated by GNU Autoconf 2.69,
   with options \\"\$ac_cs_config\\"
 
diff --git a/configure.ac b/configure.ac
index d6bb620..4b7cdd1 100644
--- a/configure.ac
+++ b/configure.ac
@@ -1,4 +1,4 @@
-AC_INIT([pktools], [2.6.4], [kempenep at gmail.com])
+AC_INIT([pktools], [2.6.5], [kempenep at gmail.com])
 #AM_INIT_AUTOMAKE([-Wall -Werror foreign])
 AM_INIT_AUTOMAKE([-Wall -Wno-extra-portability foreign])
 #AM_INIT_AUTOMAKE([subdir-objects]) #not working due to bug in autoconf, see Debian list: Bug #752993)
@@ -114,7 +114,7 @@ AC_SUBST([LIBS])
 # For information on how to properly maintain the library version information,
 # refer to the libtool manual, section "Updating library version information":
 # http://www.gnu.org/software/libtool/manual/html_node/Updating-version-info.html
-AC_SUBST([PKTOOLS_SO_VERSION], [1:4:0])
+AC_SUBST([PKTOOLS_SO_VERSION], [1:5:0])
 
 # files to generate via autotools (.am or .in source files)
 AC_CONFIG_HEADERS([config.h])
diff --git a/doc/Doxyfile b/doc/Doxyfile
index 56fb28b..6892989 100644
--- a/doc/Doxyfile
+++ b/doc/Doxyfile
@@ -38,7 +38,7 @@ PROJECT_NAME           = pktools
 # could be handy for archiving the generated documentation or if some version
 # control system is used.
 
-PROJECT_NUMBER         = 2.6.3
+PROJECT_NUMBER         = 2.6.5
 
 # Using the PROJECT_BRIEF tag one can provide an optional one line description
 # for a project that appears at the top of each page and should give viewer a
diff --git a/doc/apps.dox~ b/doc/apps.dox~
deleted file mode 100644
index 5c06efc..0000000
--- a/doc/apps.dox~
+++ /dev/null
@@ -1,33 +0,0 @@
-\section available_tools Available tools
-- \ref pkann  classify raster image using Artificial Neural Network
-- \ref pkascii2img  program to create raster image based on ascii file
-- \ref pkascii2ogr  program to create vector points or polygons from text file
-- \ref pkcomposite  program to mosaic and composite geo-referenced images
-- \ref pkcreatect  program to create and import colour table to GTiff image
-- \ref pkcrop  perform raster data operations on image such as crop, extract and stack bands
-- \ref pkdiff  program to compare two raster image files
-- \ref pkdsm2shadow  program to calculate sun shadow based on digital surface model and sun angles
-- \ref pkdumpimg  program to dump image content to ascii or std out
-- \ref pkdumpogr  dump ogr file to text file or standard output
-- \ref pkegcs  Utility for raster files in European Grid Coordinate System
-- \ref pkextract  extract pixel values from raster image from a (vector or raster) sample
-- \ref pkfillnodata  program to fill holes in raster image
-- \ref pkfilterascii  program to filter data in an ASCII file
-- \ref pkfilter  program to filter raster images
-- \ref pkfilterdem  Filter digital elevation model raster datasets
-- \ref pkfsann  feature selection for artificial neural network classifier pkann
-- \ref pkfssvm  feature selection for support vector machine classifier pksvm
-- \ref pkgetmask  program to create mask image based on values in input raster image
-- \ref pkinfo  Report basic information from raster datasets (similar to gdalinfo)
-- \ref pkkalman  program to kalman raster images
-- \ref pklas2img  Rasterize LAS/LAZ point clouds with filtering/compositing options
-- \ref pkoptsvm  program to optimize parameters for support vector machine classifier pksvm
-- \ref pkpolygonize  program to make vector file from raster image
-- \ref pkreclass  program to replace pixel values in raster image
-- \ref pkregann  regression with artificial neural network (multi-layer perceptron)
-- \ref pksetmask  program to apply mask image (set invalid values) to raster image
-- \ref pksieve  program to sieve filter raster image
-- \ref pkstatascii  program to calculate basic statistics from text file
-- \ref pkstat  program to calculate basic statistics from raster dataset
-- \ref pkstatogr  program to calculate basic statistics from vector file
-- \ref pksvm  classify raster image using Support Vector Machine
diff --git a/doc/description_pkstat.dox b/doc/description_pkstat.dox
new file mode 100644
index 0000000..e69de29
diff --git a/doc/examples_pkfilter.dox b/doc/examples_pkfilter.dox
index d4e04af..cfebe24 100644
--- a/doc/examples_pkfilter.dox
+++ b/doc/examples_pkfilter.dox
@@ -24,7 +24,7 @@ Calculate the median value for each pixel, calculated on a moving window of widt
 pkfilter -i input.tif -o filter_stdev.tif -dz 3 -f median
 \endcode
 
-\subsubsection examples_pkfilter_spectral_no_moving_window Applications without moving window
+\subsubsection examples_pkfilter_spectral_statistics Applications of statistical functions in spectral domain
 
 Calculate the standard deviation for each pixel, calculated on all input bands. The output raster dataset will contain a single band only, no moving window is used (-dz 1). 
 
@@ -35,7 +35,7 @@ pkfilter -i input.tif -o filter_stdev.tif -dz 1 -f stdev
 "Smooth" (interpolate) nodata in spectral/temporal domain (-dz 1), using a linear interpolation. The following interpolation types are supported: akima (default), linear, polynomial, cspline, cspline_periodic, akima_periodic (please check <a href="http://www.gnu.org/software/gsl/manual/html_node/Interpolation-Types.html">gsl</a> page for more information on the interpolation types).
 
 \code
-pkfilter -i input.tif -o input_smoothed.tif -dz 1 -f smoothnodata -interp linear
+pkfilter -i input.tif -o smoothed.tif -dz 1 -f smoothnodata -interp linear
 \endcode
 
 \subsubsection examples_pkfilter_srf Filter with spectral response functions
@@ -59,3 +59,40 @@ The next example is similar to the previous. Instead of providing a spectral res
 \code
 pkfilter -i hyperspectral.tif -o multispectral.tif -wout 650 -wout 510 -wout 475 -fwhm 50 -fwhm 50  -fwhm 50 $(cat wavelengths.txt | while read W;do echo " -win $W";done)
 \endcode
+
+\subsubsection examples_pkfilter_savgolay Applying the Savitzky-Golay filter to reconstruct a time-series data set
+The following example reconstructs a time-series data set based on the Savitzky--Golay filter, as suggested by <a href="http://www.sciencedirect.com/science/article/pii/S003442570400080X">J. Chen 2004</a>. 
+
+Input is a multi-band (Byte) raster dataset containing a noisy time series, e.g., a normalized difference vegetation index (NDVI) with cloud contaminated (low) NDVI values. Output is the reconstructed time-series data set, which approaches the upper NDVI enveloppe. Please refer to <a href="http://www.sciencedirect.com/science/article/pii/S003442570400080X">J. Chen 2004</a> for more details.
+
+\subsubsection savgolay_preparation Preparation
+
+Create a long-term change trend fitting (lta.tif) using the Savitzky-Golay filter. Choose the number of lefward (past) and rightward (future) data points (e.g., 7). The order of smoothing polynomial in the Savitzky-Golay filter is set to 2.
+\code
+pkfilter -i input.tif -o lta.tif -f savgolay -nl 7 -nr 7 -m 2 -pad replicate
+\endcode
+
+\subsubsection savgolay_initialization Initialization
+
+Decrease the number of lefward (past) and rightward (future) data points to 4. The order of smoothing polynomial in the Savitzky-Golay filter is set to 6. Valid data are from 0 to 250 (nodata is set to 250). 
+\code
+pkcomposite -i lta.tif -i input.tif -o iter1.tif -cr maxallbands -max 250 -dstnodata 250
+pkfilter -i iter1.tif -o savgolay1.tif -f savgolay -nl 4 -nr 4 -m 6 -pad replicate
+\endcode
+
+\subsubsection savgolay_iteration Iterative process (repeat, e.g., 5-10 times)
+
+\code
+pkcomposite -i input.tif -i savgolay1.tif -o iter2.tif -cr maxallbands -max 250 -dstnodata 
+pkfilter -i iter2.tif -o savgolay2.tif -f savgolay -nl 4 -nr 4 -m 6 -pad replicate
+\endcode
+
+\code
+pkcomposite -i input.tif -i savgolay2.tif -o iter3.tif -cr maxallbands -max 250 -dstnodata 
+pkfilter -i iter3.tif -o savgolay3.tif -f savgolay -nl 4 -nr 4 -m 6 -pad replicate
+\endcode
+\code
+etc.
+\endcode
+
+Output savgolay<n>.tif is the reconstructed time-series data set.
\ No newline at end of file
diff --git a/doc/html/ConfusionMatrix_8cc_source.html b/doc/html/ConfusionMatrix_8cc_source.html
index ee9a0b1..5a93722 100644
--- a/doc/html/ConfusionMatrix_8cc_source.html
+++ b/doc/html/ConfusionMatrix_8cc_source.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.3</span>
+    <span id="projectnumber">2.6.4</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -342,7 +342,7 @@
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Jun 23 2015 17:09:36 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Tue Nov 3 2015 15:58:26 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/ConfusionMatrix_8h_source.html b/doc/html/ConfusionMatrix_8h_source.html
index b34319d..45bb08e 100644
--- a/doc/html/ConfusionMatrix_8h_source.html
+++ b/doc/html/ConfusionMatrix_8h_source.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.3</span>
+    <span id="projectnumber">2.6.4</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -256,7 +256,7 @@
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Jun 23 2015 17:09:36 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Tue Nov 3 2015 15:58:26 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/CostFactorySVM_8cc_source.html b/doc/html/CostFactorySVM_8cc_source.html
index e250aaa..ac006d5 100644
--- a/doc/html/CostFactorySVM_8cc_source.html
+++ b/doc/html/CostFactorySVM_8cc_source.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.3</span>
+    <span id="projectnumber">2.6.4</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -240,7 +240,7 @@
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Jun 23 2015 17:09:36 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Tue Nov 3 2015 15:58:26 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/CostFactorySVM_8h_source.html b/doc/html/CostFactorySVM_8h_source.html
index a04b237..5a90967 100644
--- a/doc/html/CostFactorySVM_8h_source.html
+++ b/doc/html/CostFactorySVM_8h_source.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.3</span>
+    <span id="projectnumber">2.6.4</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -115,7 +115,7 @@
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Jun 23 2015 17:09:36 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Tue Nov 3 2015 15:58:26 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/CostFactory_8h_source.html b/doc/html/CostFactory_8h_source.html
index 603bbaf..793631d 100644
--- a/doc/html/CostFactory_8h_source.html
+++ b/doc/html/CostFactory_8h_source.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.3</span>
+    <span id="projectnumber">2.6.4</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -121,7 +121,7 @@
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Jun 23 2015 17:09:36 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Tue Nov 3 2015 15:58:26 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/Egcs_8cc_source.html b/doc/html/Egcs_8cc_source.html
index 674d3fb..2c29ee3 100644
--- a/doc/html/Egcs_8cc_source.html
+++ b/doc/html/Egcs_8cc_source.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.3</span>
+    <span id="projectnumber">2.6.4</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -264,7 +264,7 @@
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Jun 23 2015 17:09:36 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Tue Nov 3 2015 15:58:26 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/Egcs_8h_source.html b/doc/html/Egcs_8h_source.html
index 66c8f34..ec92fd3 100644
--- a/doc/html/Egcs_8h_source.html
+++ b/doc/html/Egcs_8h_source.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.3</span>
+    <span id="projectnumber">2.6.4</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -112,7 +112,7 @@
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Jun 23 2015 17:09:36 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Tue Nov 3 2015 15:58:26 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/FeatureSelector_8h_source.html b/doc/html/FeatureSelector_8h_source.html
index a6b3cc5..02f7eae 100644
--- a/doc/html/FeatureSelector_8h_source.html
+++ b/doc/html/FeatureSelector_8h_source.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.3</span>
+    <span id="projectnumber">2.6.4</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -91,7 +91,7 @@
 <div class="line"><a name="l00037"></a><span class="lineno">   37</span>  <span class="keyword">public</span>:</div>
 <div class="line"><a name="l00038"></a><span class="lineno">   38</span>   <a class="code" href="classFeatureSelector.html">FeatureSelector</a>(){};</div>
 <div class="line"><a name="l00039"></a><span class="lineno">   39</span>   ~<a class="code" href="classFeatureSelector.html">FeatureSelector</a>(){};</div>
-<div class="line"><a name="l00040"></a><span class="lineno">   40</span>   <span class="keyword">template</span><<span class="keyword">class</span> T> <span class="keywordtype">double</span> forward(std::vector< <a class="code" href="classVector2d.html">Vector2d<T></a> >& v, <a class="code" href="classCostFactory.html">CostFactory</a>& theCostFactory, std::list<int>& subset, <span class="keywordtype">int</span> maxFeatures, <span class="keywordtyp [...]
+<div class="line"><a name="l00040"></a><span class="lineno">   40</span>   <span class="keyword">template</span><<span class="keyword">class</span> T> <span class="keywordtype">double</span> forward(std::vector< <a class="code" href="classVector2d.html">Vector2d<T></a> >& v, <a class="code" href="classCostFactory.html">CostFactory</a>& theCostFactory, std::list<int>& subset, <span class="keywordtype">int</span> maxFeatures=0, <span class="keywordt [...]
 <div class="line"><a name="l00041"></a><span class="lineno">   41</span>   <span class="keyword">template</span><<span class="keyword">class</span> T> <span class="keywordtype">double</span> backward(std::vector< <a class="code" href="classVector2d.html">Vector2d<T></a> >& v, <a class="code" href="classCostFactory.html">CostFactory</a>& theCostFactory, std::list<int>& subset, <span class="keywordtype">int</span> minFeatures, <span class="keywordty [...]
 <div class="line"><a name="l00042"></a><span class="lineno">   42</span>   <span class="keyword">template</span><<span class="keyword">class</span> T> <span class="keywordtype">double</span> floating(std::vector< <a class="code" href="classVector2d.html">Vector2d<T></a> >& v, <a class="code" href="classCostFactory.html">CostFactory</a>& theCostFactory, std::list<int>& subset, <span class="keywordtype">int</span> maxFeatures=0, <span class="keyword [...]
 <div class="line"><a name="l00043"></a><span class="lineno">   43</span>   <span class="keyword">template</span><<span class="keyword">class</span> T> <span class="keywordtype">double</span> bruteForce(std::vector< <a class="code" href="classVector2d.html">Vector2d<T></a> >& v, <a class="code" href="classCostFactory.html">CostFactory</a>& theCostFactory, std::list<int>& subset, <span class="keywordtype">int</span> maxFeatures=0, <span class="keywo [...]
@@ -99,11 +99,11 @@
 <div class="line"><a name="l00045"></a><span class="lineno">   45</span>   <span class="keyword">private</span>:</div>
 <div class="line"><a name="l00046"></a><span class="lineno">   46</span>     <span class="keyword">template</span><<span class="keyword">class</span> T> <span class="keywordtype">double</span> addFeature(std::vector< <a class="code" href="classVector2d.html">Vector2d<T></a> >& v, <a class="code" href="classCostFactory.html">CostFactory</a>& theCostFactory, std::list<int>& subset, <span class="keywordtype">short</span> verbose=0);</div>
 <div class="line"><a name="l00047"></a><span class="lineno">   47</span>   <span class="keyword">template</span><<span class="keyword">class</span> T> <span class="keywordtype">double</span> removeFeature(std::vector< <a class="code" href="classVector2d.html">Vector2d<T></a> >& v, <a class="code" href="classCostFactory.html">CostFactory</a>& theCostFactory, std::list<int>& subset, <span class="keywordtype">int</span>& r, <span class="keywordty [...]
-<div class="line"><a name="l00048"></a><span class="lineno">   48</span>   <span class="keyword">template</span><<span class="keyword">class</span> T> <span class="keywordtype">double</span> forwardUnivariate(std::vector< <a class="code" href="classVector2d.html">Vector2d<T></a> >& v, <a class="code" href="classCostFactory.html">CostFactory</a>& theCostFactory, std::list<int>& subset, <span class="keywordtype">int</span> maxFeatures, <span class=" [...]
+<div class="line"><a name="l00048"></a><span class="lineno">   48</span>   <span class="keyword">template</span><<span class="keyword">class</span> T> <span class="keywordtype">double</span> forwardUnivariate(std::vector< <a class="code" href="classVector2d.html">Vector2d<T></a> >& v, <a class="code" href="classCostFactory.html">CostFactory</a>& theCostFactory, std::list<int>& subset, <span class="keywordtype">int</span> maxFeatures=0, <span class [...]
 <div class="line"><a name="l00049"></a><span class="lineno">   49</span> };</div>
 <div class="line"><a name="l00050"></a><span class="lineno">   50</span> </div>
 <div class="line"><a name="l00051"></a><span class="lineno">   51</span> <span class="comment">//sequential forward selection Univariate (N single best features)</span></div>
-<div class="line"><a name="l00052"></a><span class="lineno">   52</span> <span class="keyword">template</span><<span class="keyword">class</span> T> <span class="keywordtype">double</span> FeatureSelector::forwardUnivariate(std::vector< <a class="code" href="classVector2d.html">Vector2d<T></a> >& v, <a class="code" href="classCostFactory.html">CostFactory</a>& theCostFactory, std::list<int>& subset, <span class="keywordtype">int</span> maxFeatures [...]
+<div class="line"><a name="l00052"></a><span class="lineno">   52</span> <span class="keyword">template</span><<span class="keyword">class</span> T> <span class="keywordtype">double</span> FeatureSelector::forwardUnivariate(std::vector< <a class="code" href="classVector2d.html">Vector2d<T></a> >& v, <a class="code" href="classCostFactory.html">CostFactory</a>& theCostFactory, std::list<int>& subset, <span class="keywordtype">int</span> maxFeatures [...]
 <div class="line"><a name="l00053"></a><span class="lineno">   53</span>   <span class="keywordtype">int</span> maxLevels=v[0][0].size();</div>
 <div class="line"><a name="l00054"></a><span class="lineno">   54</span>   <span class="keywordflow">if</span>(!maxFeatures)</div>
 <div class="line"><a name="l00055"></a><span class="lineno">   55</span>     maxFeatures=maxLevels;</div>
@@ -162,7 +162,7 @@
 <div class="line"><a name="l00108"></a><span class="lineno">  108</span> }</div>
 <div class="line"><a name="l00109"></a><span class="lineno">  109</span> </div>
 <div class="line"><a name="l00110"></a><span class="lineno">  110</span> <span class="comment">//sequential forward selection Multivariate (Combination of N best features)</span></div>
-<div class="line"><a name="l00111"></a><span class="lineno">  111</span> <span class="keyword">template</span><<span class="keyword">class</span> T> <span class="keywordtype">double</span> FeatureSelector::forward(std::vector< <a class="code" href="classVector2d.html">Vector2d<T></a> >& v, <a class="code" href="classCostFactory.html">CostFactory</a>& theCostFactory, std::list<int>& subset, <span class="keywordtype">int</span> maxFeatures=0, <span  [...]
+<div class="line"><a name="l00111"></a><span class="lineno">  111</span> <span class="keyword">template</span><<span class="keyword">class</span> T> <span class="keywordtype">double</span> FeatureSelector::forward(std::vector< <a class="code" href="classVector2d.html">Vector2d<T></a> >& v, <a class="code" href="classCostFactory.html">CostFactory</a>& theCostFactory, std::list<int>& subset, <span class="keywordtype">int</span> maxFeatures, <span cl [...]
 <div class="line"><a name="l00112"></a><span class="lineno">  112</span>   <span class="comment">//Select feature with the best value (get maximal cost for 1 feature)</span></div>
 <div class="line"><a name="l00113"></a><span class="lineno">  113</span>   <span class="keywordtype">double</span> maxCost=0;</div>
 <div class="line"><a name="l00114"></a><span class="lineno">  114</span>   <span class="keywordtype">int</span> maxLevels=v[0][0].size();</div>
@@ -424,7 +424,7 @@
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Jun 23 2015 17:09:36 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Tue Nov 3 2015 15:58:26 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/FileReaderAscii_8cc_source.html b/doc/html/FileReaderAscii_8cc_source.html
index 103f7aa..2070eba 100644
--- a/doc/html/FileReaderAscii_8cc_source.html
+++ b/doc/html/FileReaderAscii_8cc_source.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.3</span>
+    <span id="projectnumber">2.6.4</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -297,7 +297,7 @@
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Jun 23 2015 17:09:36 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/FileReaderAscii_8h_source.html b/doc/html/FileReaderAscii_8h_source.html
index 878671f..6587f87 100644
--- a/doc/html/FileReaderAscii_8h_source.html
+++ b/doc/html/FileReaderAscii_8h_source.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.3</span>
+    <span id="projectnumber">2.6.4</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -358,7 +358,7 @@
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Jun 23 2015 17:09:36 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/FileReaderLas_8cc_source.html b/doc/html/FileReaderLas_8cc_source.html
index 902a9fb..4080306 100644
--- a/doc/html/FileReaderLas_8cc_source.html
+++ b/doc/html/FileReaderLas_8cc_source.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.3</span>
+    <span id="projectnumber">2.6.4</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -237,7 +237,7 @@
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Jun 23 2015 17:09:37 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/FileReaderLas_8h_source.html b/doc/html/FileReaderLas_8h_source.html
index 62b9f59..15bf5eb 100644
--- a/doc/html/FileReaderLas_8h_source.html
+++ b/doc/html/FileReaderLas_8h_source.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.3</span>
+    <span id="projectnumber">2.6.4</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -130,7 +130,7 @@
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Jun 23 2015 17:09:37 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/Filter2d_8cc_source.html b/doc/html/Filter2d_8cc_source.html
index e9a1e91..3e54bce 100644
--- a/doc/html/Filter2d_8cc_source.html
+++ b/doc/html/Filter2d_8cc_source.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.3</span>
+    <span id="projectnumber">2.6.4</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -599,762 +599,774 @@
 <div class="line"><a name="l00545"></a><span class="lineno">  545</span>       outBuffer[x/down]=stat.percentile(windowBuffer,windowBuffer.begin(),windowBuffer.end(),m_threshold[0]);</div>
 <div class="line"><a name="l00546"></a><span class="lineno">  546</span>       <span class="keywordflow">break</span>;</div>
 <div class="line"><a name="l00547"></a><span class="lineno">  547</span>     }</div>
-<div class="line"><a name="l00548"></a><span class="lineno">  548</span>         <span class="keywordflow">case</span>(filter2d::homog):</div>
-<div class="line"><a name="l00549"></a><span class="lineno">  549</span>       <span class="keywordflow">if</span>(occurrence.size()==1)<span class="comment">//all values in window are the same</span></div>
-<div class="line"><a name="l00550"></a><span class="lineno">  550</span>         outBuffer[x/down]=inBuffer[(dimY-1)/2][x];</div>
-<div class="line"><a name="l00551"></a><span class="lineno">  551</span>       <span class="keywordflow">else</span></div>
-<div class="line"><a name="l00552"></a><span class="lineno">  552</span>         outBuffer[x/down]=(m_noDataValues.size())? m_noDataValues[0] : 0;</div>
-<div class="line"><a name="l00553"></a><span class="lineno">  553</span>           <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l00554"></a><span class="lineno">  554</span>         <span class="keywordflow">case</span>(filter2d::heterog):{</div>
-<div class="line"><a name="l00555"></a><span class="lineno">  555</span>       <span class="keywordflow">if</span>(occurrence.size()==windowBuffer.size())</div>
-<div class="line"><a name="l00556"></a><span class="lineno">  556</span>         outBuffer[x/down]=inBuffer[(dimY-1)/2][x];</div>
-<div class="line"><a name="l00557"></a><span class="lineno">  557</span>       <span class="keywordflow">else</span>      </div>
-<div class="line"><a name="l00558"></a><span class="lineno">  558</span>         outBuffer[x/down]=(m_noDataValues.size())? m_noDataValues[0] : 0;</div>
-<div class="line"><a name="l00559"></a><span class="lineno">  559</span>       <span class="comment">// if(occurrence.size()==1)//all values in window are the same</span></div>
-<div class="line"><a name="l00560"></a><span class="lineno">  560</span>       <span class="comment">//   outBuffer[x/down]=(m_noDataValues.size())? m_noDataValues[0] : 0;</span></div>
-<div class="line"><a name="l00561"></a><span class="lineno">  561</span>       <span class="comment">// else</span></div>
-<div class="line"><a name="l00562"></a><span class="lineno">  562</span>       <span class="comment">//   outBuffer[x/down]=inBuffer[(dimY-1)/2][x];</span></div>
-<div class="line"><a name="l00563"></a><span class="lineno">  563</span>           <span class="comment">// break;</span></div>
-<div class="line"><a name="l00564"></a><span class="lineno">  564</span>           <span class="comment">// for(std::vector<double>::const_iterator wit=windowBuffer.begin();wit!=windowBuffer.end();++wit){</span></div>
-<div class="line"><a name="l00565"></a><span class="lineno">  565</span>           <span class="comment">//   if(wit==windowBuffer.begin()+windowBuffer.size()/2)</span></div>
-<div class="line"><a name="l00566"></a><span class="lineno">  566</span>           <span class="comment">//     continue;</span></div>
-<div class="line"><a name="l00567"></a><span class="lineno">  567</span>           <span class="comment">//   else if(*wit!=inBuffer[(dimY-1)/2][x]){</span></div>
-<div class="line"><a name="l00568"></a><span class="lineno">  568</span>           <span class="comment">//     outBuffer[x/down]=1;</span></div>
-<div class="line"><a name="l00569"></a><span class="lineno">  569</span>       <span class="comment">//     break;</span></div>
-<div class="line"><a name="l00570"></a><span class="lineno">  570</span>       <span class="comment">//   }</span></div>
-<div class="line"><a name="l00571"></a><span class="lineno">  571</span>           <span class="comment">//   else if(*wit==inBuffer[(dimY-1)/2][x]){//todo:wit mag niet central pixel zijn</span></div>
-<div class="line"><a name="l00572"></a><span class="lineno">  572</span>           <span class="comment">//     outBuffer[x/down]=(m_noDataValues.size())? m_noDataValues[0] : 0;</span></div>
-<div class="line"><a name="l00573"></a><span class="lineno">  573</span>           <span class="comment">//     break;</span></div>
-<div class="line"><a name="l00574"></a><span class="lineno">  574</span>           <span class="comment">//   }</span></div>
-<div class="line"><a name="l00575"></a><span class="lineno">  575</span>           <span class="comment">// }</span></div>
-<div class="line"><a name="l00576"></a><span class="lineno">  576</span>           <span class="comment">// break;</span></div>
-<div class="line"><a name="l00577"></a><span class="lineno">  577</span>         }</div>
-<div class="line"><a name="l00578"></a><span class="lineno">  578</span>         <span class="keywordflow">case</span>(filter2d::density):{</div>
-<div class="line"><a name="l00579"></a><span class="lineno">  579</span>       <span class="keywordflow">if</span>(windowBuffer.size()){</div>
-<div class="line"><a name="l00580"></a><span class="lineno">  580</span>         std::vector<short>::const_iterator vit=m_class.begin();</div>
-<div class="line"><a name="l00581"></a><span class="lineno">  581</span>         <span class="keywordflow">while</span>(vit!=m_class.end())</div>
-<div class="line"><a name="l00582"></a><span class="lineno">  582</span>           outBuffer[x/down]+=100.0*occurrence[*(vit++)]/windowBuffer.size();</div>
-<div class="line"><a name="l00583"></a><span class="lineno">  583</span>       }</div>
-<div class="line"><a name="l00584"></a><span class="lineno">  584</span>       <span class="keywordflow">else</span></div>
-<div class="line"><a name="l00585"></a><span class="lineno">  585</span>         outBuffer[x/down]=(m_noDataValues.size())? m_noDataValues[0] : 0;</div>
-<div class="line"><a name="l00586"></a><span class="lineno">  586</span>           <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l00587"></a><span class="lineno">  587</span>     }</div>
-<div class="line"><a name="l00588"></a><span class="lineno">  588</span>         <span class="keywordflow">case</span>(filter2d::countid):{</div>
-<div class="line"><a name="l00589"></a><span class="lineno">  589</span>       <span class="keywordflow">if</span>(windowBuffer.size())</div>
-<div class="line"><a name="l00590"></a><span class="lineno">  590</span>         outBuffer[x/down]=occurrence.size();</div>
-<div class="line"><a name="l00591"></a><span class="lineno">  591</span>       <span class="keywordflow">else</span></div>
-<div class="line"><a name="l00592"></a><span class="lineno">  592</span>         outBuffer[x/down]=(m_noDataValues.size())? m_noDataValues[0] : 0;</div>
-<div class="line"><a name="l00593"></a><span class="lineno">  593</span>           <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l00594"></a><span class="lineno">  594</span>     }</div>
-<div class="line"><a name="l00595"></a><span class="lineno">  595</span>         <span class="keywordflow">case</span>(filter2d::mode):{</div>
-<div class="line"><a name="l00596"></a><span class="lineno">  596</span>       <span class="keywordflow">if</span>(occurrence.size()){</div>
-<div class="line"><a name="l00597"></a><span class="lineno">  597</span>             std::map<long int,int>::const_iterator maxit=occurrence.begin();</div>
-<div class="line"><a name="l00598"></a><span class="lineno">  598</span>             <span class="keywordflow">for</span>(std::map<long int,int>::const_iterator mit=occurrence.begin();mit!=occurrence.end();++mit){</div>
-<div class="line"><a name="l00599"></a><span class="lineno">  599</span>               <span class="keywordflow">if</span>(mit->second>maxit->second)</div>
-<div class="line"><a name="l00600"></a><span class="lineno">  600</span>                 maxit=mit;</div>
-<div class="line"><a name="l00601"></a><span class="lineno">  601</span>             }</div>
-<div class="line"><a name="l00602"></a><span class="lineno">  602</span>             <span class="keywordflow">if</span>(occurrence[inBuffer[(dimY-1)/2][x]]<maxit->second)<span class="comment">//</span></div>
-<div class="line"><a name="l00603"></a><span class="lineno">  603</span>               outBuffer[x/down]=maxit->first;</div>
-<div class="line"><a name="l00604"></a><span class="lineno">  604</span>             <span class="keywordflow">else</span><span class="comment">//favorize original value in case of ties</span></div>
-<div class="line"><a name="l00605"></a><span class="lineno">  605</span>               outBuffer[x/down]=inBuffer[(dimY-1)/2][x];</div>
-<div class="line"><a name="l00606"></a><span class="lineno">  606</span>       }</div>
-<div class="line"><a name="l00607"></a><span class="lineno">  607</span>       <span class="keywordflow">else</span></div>
-<div class="line"><a name="l00608"></a><span class="lineno">  608</span>         outBuffer[x/down]=(m_noDataValues.size())? m_noDataValues[0] : 0;</div>
-<div class="line"><a name="l00609"></a><span class="lineno">  609</span>           <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l00610"></a><span class="lineno">  610</span>         }</div>
-<div class="line"><a name="l00611"></a><span class="lineno">  611</span>         <span class="keywordflow">case</span>(filter2d::threshold):{</div>
-<div class="line"><a name="l00612"></a><span class="lineno">  612</span>           assert(m_class.size()==m_threshold.size());</div>
-<div class="line"><a name="l00613"></a><span class="lineno">  613</span>       <span class="keywordflow">if</span>(windowBuffer.size()){</div>
-<div class="line"><a name="l00614"></a><span class="lineno">  614</span>             outBuffer[x/down]=inBuffer[(dimY-1)/2][x];<span class="comment">//initialize with original value (in case thresholds not met)</span></div>
-<div class="line"><a name="l00615"></a><span class="lineno">  615</span>             <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iclass=0;iclass<m_class.size();++iclass){</div>
-<div class="line"><a name="l00616"></a><span class="lineno">  616</span>               <span class="keywordflow">if</span>(100.0*(occurrence[m_class[iclass]])/windowBuffer.size()>m_threshold[iclass])</div>
-<div class="line"><a name="l00617"></a><span class="lineno">  617</span>                 outBuffer[x/down]=m_class[iclass];</div>
-<div class="line"><a name="l00618"></a><span class="lineno">  618</span>             }</div>
-<div class="line"><a name="l00619"></a><span class="lineno">  619</span>           }</div>
-<div class="line"><a name="l00620"></a><span class="lineno">  620</span>           <span class="keywordflow">else</span></div>
-<div class="line"><a name="l00621"></a><span class="lineno">  621</span>         outBuffer[x/down]=(m_noDataValues.size())? m_noDataValues[0] : 0;</div>
-<div class="line"><a name="l00622"></a><span class="lineno">  622</span>           <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l00623"></a><span class="lineno">  623</span>         }</div>
-<div class="line"><a name="l00624"></a><span class="lineno">  624</span>         <span class="keywordflow">case</span>(filter2d::scramble):{<span class="comment">//could be done more efficiently window by window with random shuffling entire buffer and assigning entire buffer at once to output image...</span></div>
+<div class="line"><a name="l00548"></a><span class="lineno">  548</span>         <span class="keywordflow">case</span>(filter2d::proportion):{</div>
+<div class="line"><a name="l00549"></a><span class="lineno">  549</span>       <span class="keywordflow">if</span>(windowBuffer.size()){</div>
+<div class="line"><a name="l00550"></a><span class="lineno">  550</span>         <span class="keywordtype">double</span> sum=stat.sum(windowBuffer);</div>
+<div class="line"><a name="l00551"></a><span class="lineno">  551</span>         <span class="keywordflow">if</span>(sum)</div>
+<div class="line"><a name="l00552"></a><span class="lineno">  552</span>           outBuffer[x/down]=100.0*windowBuffer[centre]/stat.sum(windowBuffer);</div>
+<div class="line"><a name="l00553"></a><span class="lineno">  553</span>         <span class="keywordflow">else</span></div>
+<div class="line"><a name="l00554"></a><span class="lineno">  554</span>           outBuffer[x/down]=(m_noDataValues.size())? m_noDataValues[0] : 0;</div>
+<div class="line"><a name="l00555"></a><span class="lineno">  555</span>       }</div>
+<div class="line"><a name="l00556"></a><span class="lineno">  556</span>       <span class="keywordflow">else</span></div>
+<div class="line"><a name="l00557"></a><span class="lineno">  557</span>         outBuffer[x/down]=(m_noDataValues.size())? m_noDataValues[0] : 0;</div>
+<div class="line"><a name="l00558"></a><span class="lineno">  558</span>           <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l00559"></a><span class="lineno">  559</span>     }</div>
+<div class="line"><a name="l00560"></a><span class="lineno">  560</span>         <span class="keywordflow">case</span>(filter2d::homog):</div>
+<div class="line"><a name="l00561"></a><span class="lineno">  561</span>       <span class="keywordflow">if</span>(occurrence.size()==1)<span class="comment">//all values in window are the same</span></div>
+<div class="line"><a name="l00562"></a><span class="lineno">  562</span>         outBuffer[x/down]=inBuffer[(dimY-1)/2][x];</div>
+<div class="line"><a name="l00563"></a><span class="lineno">  563</span>       <span class="keywordflow">else</span></div>
+<div class="line"><a name="l00564"></a><span class="lineno">  564</span>         outBuffer[x/down]=(m_noDataValues.size())? m_noDataValues[0] : 0;</div>
+<div class="line"><a name="l00565"></a><span class="lineno">  565</span>           <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l00566"></a><span class="lineno">  566</span>         <span class="keywordflow">case</span>(filter2d::heterog):{</div>
+<div class="line"><a name="l00567"></a><span class="lineno">  567</span>       <span class="keywordflow">if</span>(occurrence.size()==windowBuffer.size())</div>
+<div class="line"><a name="l00568"></a><span class="lineno">  568</span>         outBuffer[x/down]=inBuffer[(dimY-1)/2][x];</div>
+<div class="line"><a name="l00569"></a><span class="lineno">  569</span>       <span class="keywordflow">else</span>      </div>
+<div class="line"><a name="l00570"></a><span class="lineno">  570</span>         outBuffer[x/down]=(m_noDataValues.size())? m_noDataValues[0] : 0;</div>
+<div class="line"><a name="l00571"></a><span class="lineno">  571</span>       <span class="comment">// if(occurrence.size()==1)//all values in window are the same</span></div>
+<div class="line"><a name="l00572"></a><span class="lineno">  572</span>       <span class="comment">//   outBuffer[x/down]=(m_noDataValues.size())? m_noDataValues[0] : 0;</span></div>
+<div class="line"><a name="l00573"></a><span class="lineno">  573</span>       <span class="comment">// else</span></div>
+<div class="line"><a name="l00574"></a><span class="lineno">  574</span>       <span class="comment">//   outBuffer[x/down]=inBuffer[(dimY-1)/2][x];</span></div>
+<div class="line"><a name="l00575"></a><span class="lineno">  575</span>           <span class="comment">// break;</span></div>
+<div class="line"><a name="l00576"></a><span class="lineno">  576</span>           <span class="comment">// for(std::vector<double>::const_iterator wit=windowBuffer.begin();wit!=windowBuffer.end();++wit){</span></div>
+<div class="line"><a name="l00577"></a><span class="lineno">  577</span>           <span class="comment">//   if(wit==windowBuffer.begin()+windowBuffer.size()/2)</span></div>
+<div class="line"><a name="l00578"></a><span class="lineno">  578</span>           <span class="comment">//     continue;</span></div>
+<div class="line"><a name="l00579"></a><span class="lineno">  579</span>           <span class="comment">//   else if(*wit!=inBuffer[(dimY-1)/2][x]){</span></div>
+<div class="line"><a name="l00580"></a><span class="lineno">  580</span>           <span class="comment">//     outBuffer[x/down]=1;</span></div>
+<div class="line"><a name="l00581"></a><span class="lineno">  581</span>       <span class="comment">//     break;</span></div>
+<div class="line"><a name="l00582"></a><span class="lineno">  582</span>       <span class="comment">//   }</span></div>
+<div class="line"><a name="l00583"></a><span class="lineno">  583</span>           <span class="comment">//   else if(*wit==inBuffer[(dimY-1)/2][x]){//todo:wit mag niet central pixel zijn</span></div>
+<div class="line"><a name="l00584"></a><span class="lineno">  584</span>           <span class="comment">//     outBuffer[x/down]=(m_noDataValues.size())? m_noDataValues[0] : 0;</span></div>
+<div class="line"><a name="l00585"></a><span class="lineno">  585</span>           <span class="comment">//     break;</span></div>
+<div class="line"><a name="l00586"></a><span class="lineno">  586</span>           <span class="comment">//   }</span></div>
+<div class="line"><a name="l00587"></a><span class="lineno">  587</span>           <span class="comment">// }</span></div>
+<div class="line"><a name="l00588"></a><span class="lineno">  588</span>           <span class="comment">// break;</span></div>
+<div class="line"><a name="l00589"></a><span class="lineno">  589</span>         }</div>
+<div class="line"><a name="l00590"></a><span class="lineno">  590</span>         <span class="keywordflow">case</span>(filter2d::density):{</div>
+<div class="line"><a name="l00591"></a><span class="lineno">  591</span>       <span class="keywordflow">if</span>(windowBuffer.size()){</div>
+<div class="line"><a name="l00592"></a><span class="lineno">  592</span>         std::vector<short>::const_iterator vit=m_class.begin();</div>
+<div class="line"><a name="l00593"></a><span class="lineno">  593</span>         <span class="keywordflow">while</span>(vit!=m_class.end())</div>
+<div class="line"><a name="l00594"></a><span class="lineno">  594</span>           outBuffer[x/down]+=100.0*occurrence[*(vit++)]/windowBuffer.size();</div>
+<div class="line"><a name="l00595"></a><span class="lineno">  595</span>       }</div>
+<div class="line"><a name="l00596"></a><span class="lineno">  596</span>       <span class="keywordflow">else</span></div>
+<div class="line"><a name="l00597"></a><span class="lineno">  597</span>         outBuffer[x/down]=(m_noDataValues.size())? m_noDataValues[0] : 0;</div>
+<div class="line"><a name="l00598"></a><span class="lineno">  598</span>           <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l00599"></a><span class="lineno">  599</span>     }</div>
+<div class="line"><a name="l00600"></a><span class="lineno">  600</span>         <span class="keywordflow">case</span>(filter2d::countid):{</div>
+<div class="line"><a name="l00601"></a><span class="lineno">  601</span>       <span class="keywordflow">if</span>(windowBuffer.size())</div>
+<div class="line"><a name="l00602"></a><span class="lineno">  602</span>         outBuffer[x/down]=occurrence.size();</div>
+<div class="line"><a name="l00603"></a><span class="lineno">  603</span>       <span class="keywordflow">else</span></div>
+<div class="line"><a name="l00604"></a><span class="lineno">  604</span>         outBuffer[x/down]=(m_noDataValues.size())? m_noDataValues[0] : 0;</div>
+<div class="line"><a name="l00605"></a><span class="lineno">  605</span>           <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l00606"></a><span class="lineno">  606</span>     }</div>
+<div class="line"><a name="l00607"></a><span class="lineno">  607</span>         <span class="keywordflow">case</span>(filter2d::mode):{</div>
+<div class="line"><a name="l00608"></a><span class="lineno">  608</span>       <span class="keywordflow">if</span>(occurrence.size()){</div>
+<div class="line"><a name="l00609"></a><span class="lineno">  609</span>             std::map<long int,int>::const_iterator maxit=occurrence.begin();</div>
+<div class="line"><a name="l00610"></a><span class="lineno">  610</span>             <span class="keywordflow">for</span>(std::map<long int,int>::const_iterator mit=occurrence.begin();mit!=occurrence.end();++mit){</div>
+<div class="line"><a name="l00611"></a><span class="lineno">  611</span>               <span class="keywordflow">if</span>(mit->second>maxit->second)</div>
+<div class="line"><a name="l00612"></a><span class="lineno">  612</span>                 maxit=mit;</div>
+<div class="line"><a name="l00613"></a><span class="lineno">  613</span>             }</div>
+<div class="line"><a name="l00614"></a><span class="lineno">  614</span>             <span class="keywordflow">if</span>(occurrence[inBuffer[(dimY-1)/2][x]]<maxit->second)<span class="comment">//</span></div>
+<div class="line"><a name="l00615"></a><span class="lineno">  615</span>               outBuffer[x/down]=maxit->first;</div>
+<div class="line"><a name="l00616"></a><span class="lineno">  616</span>             <span class="keywordflow">else</span><span class="comment">//favorize original value in case of ties</span></div>
+<div class="line"><a name="l00617"></a><span class="lineno">  617</span>               outBuffer[x/down]=inBuffer[(dimY-1)/2][x];</div>
+<div class="line"><a name="l00618"></a><span class="lineno">  618</span>       }</div>
+<div class="line"><a name="l00619"></a><span class="lineno">  619</span>       <span class="keywordflow">else</span></div>
+<div class="line"><a name="l00620"></a><span class="lineno">  620</span>         outBuffer[x/down]=(m_noDataValues.size())? m_noDataValues[0] : 0;</div>
+<div class="line"><a name="l00621"></a><span class="lineno">  621</span>           <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l00622"></a><span class="lineno">  622</span>         }</div>
+<div class="line"><a name="l00623"></a><span class="lineno">  623</span>         <span class="keywordflow">case</span>(filter2d::threshold):{</div>
+<div class="line"><a name="l00624"></a><span class="lineno">  624</span>           assert(m_class.size()==m_threshold.size());</div>
 <div class="line"><a name="l00625"></a><span class="lineno">  625</span>       <span class="keywordflow">if</span>(windowBuffer.size()){</div>
-<div class="line"><a name="l00626"></a><span class="lineno">  626</span>             <span class="keywordtype">int</span> randomIndex=std::rand()%windowBuffer.size();</div>
-<div class="line"><a name="l00627"></a><span class="lineno">  627</span>         <span class="keywordflow">if</span>(randomIndex>=windowBuffer.size())</div>
-<div class="line"><a name="l00628"></a><span class="lineno">  628</span>           outBuffer[x/down]=windowBuffer.back();</div>
-<div class="line"><a name="l00629"></a><span class="lineno">  629</span>         <span class="keywordflow">else</span> <span class="keywordflow">if</span>(randomIndex<0)</div>
-<div class="line"><a name="l00630"></a><span class="lineno">  630</span>           outBuffer[x/down]=windowBuffer[0];</div>
-<div class="line"><a name="l00631"></a><span class="lineno">  631</span>         <span class="keywordflow">else</span></div>
-<div class="line"><a name="l00632"></a><span class="lineno">  632</span>           outBuffer[x/down]=windowBuffer[randomIndex];</div>
-<div class="line"><a name="l00633"></a><span class="lineno">  633</span>           }</div>
-<div class="line"><a name="l00634"></a><span class="lineno">  634</span>           <span class="keywordflow">else</span></div>
-<div class="line"><a name="l00635"></a><span class="lineno">  635</span>         outBuffer[x/down]=(m_noDataValues.size())? m_noDataValues[0] : 0;</div>
-<div class="line"><a name="l00636"></a><span class="lineno">  636</span>           <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l00637"></a><span class="lineno">  637</span>         }</div>
-<div class="line"><a name="l00638"></a><span class="lineno">  638</span>         <span class="keywordflow">case</span>(filter2d::mixed):{</div>
-<div class="line"><a name="l00639"></a><span class="lineno">  639</span>           <span class="keyword">enum</span> Type { BF=11, CF=12, MF=13, NF=20, W=30 };</div>
-<div class="line"><a name="l00640"></a><span class="lineno">  640</span>           <span class="keywordtype">double</span> nBF=occurrence[BF];</div>
-<div class="line"><a name="l00641"></a><span class="lineno">  641</span>           <span class="keywordtype">double</span> nCF=occurrence[CF];</div>
-<div class="line"><a name="l00642"></a><span class="lineno">  642</span>           <span class="keywordtype">double</span> nMF=occurrence[MF];</div>
-<div class="line"><a name="l00643"></a><span class="lineno">  643</span>           <span class="keywordtype">double</span> nNF=occurrence[NF];</div>
-<div class="line"><a name="l00644"></a><span class="lineno">  644</span>           <span class="keywordtype">double</span> nW=occurrence[W];</div>
-<div class="line"><a name="l00645"></a><span class="lineno">  645</span>       <span class="keywordflow">if</span>(windowBuffer.size()){</div>
-<div class="line"><a name="l00646"></a><span class="lineno">  646</span>             <span class="keywordflow">if</span>((nBF+nCF+nMF)&&(nBF+nCF+nMF>=nNF+nW)){<span class="comment">//forest</span></div>
-<div class="line"><a name="l00647"></a><span class="lineno">  647</span>               <span class="keywordflow">if</span>(nBF/(nBF+nCF)>=0.75)</div>
-<div class="line"><a name="l00648"></a><span class="lineno">  648</span>                 outBuffer[x/down]=BF;</div>
-<div class="line"><a name="l00649"></a><span class="lineno">  649</span>               <span class="keywordflow">else</span> <span class="keywordflow">if</span>(nCF/(nBF+nCF)>=0.75)</div>
-<div class="line"><a name="l00650"></a><span class="lineno">  650</span>                 outBuffer[x/down]=CF;</div>
-<div class="line"><a name="l00651"></a><span class="lineno">  651</span>               <span class="keywordflow">else</span></div>
-<div class="line"><a name="l00652"></a><span class="lineno">  652</span>                 outBuffer[x/down]=MF;</div>
-<div class="line"><a name="l00653"></a><span class="lineno">  653</span>             }</div>
-<div class="line"><a name="l00654"></a><span class="lineno">  654</span>             <span class="keywordflow">else</span>{<span class="comment">//non-forest</span></div>
-<div class="line"><a name="l00655"></a><span class="lineno">  655</span>               <span class="keywordflow">if</span>(nW&&(nW>=nNF))</div>
-<div class="line"><a name="l00656"></a><span class="lineno">  656</span>                 outBuffer[x/down]=W;</div>
-<div class="line"><a name="l00657"></a><span class="lineno">  657</span>               <span class="keywordflow">else</span></div>
-<div class="line"><a name="l00658"></a><span class="lineno">  658</span>                 outBuffer[x/down]=NF;</div>
-<div class="line"><a name="l00659"></a><span class="lineno">  659</span>             }</div>
-<div class="line"><a name="l00660"></a><span class="lineno">  660</span>           }</div>
-<div class="line"><a name="l00661"></a><span class="lineno">  661</span>       <span class="keywordflow">else</span></div>
-<div class="line"><a name="l00662"></a><span class="lineno">  662</span>         outBuffer[x/down]=inBuffer[indexJ][indexI];</div>
-<div class="line"><a name="l00663"></a><span class="lineno">  663</span>           <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l00664"></a><span class="lineno">  664</span>         }</div>
-<div class="line"><a name="l00665"></a><span class="lineno">  665</span>         <span class="keywordflow">default</span>:{</div>
-<div class="line"><a name="l00666"></a><span class="lineno">  666</span>       std::ostringstream ess;</div>
-<div class="line"><a name="l00667"></a><span class="lineno">  667</span>       ess << <span class="stringliteral">"Error: filter method "</span> << method << <span class="stringliteral">" not supported"</span> << std::endl;</div>
-<div class="line"><a name="l00668"></a><span class="lineno">  668</span>       <span class="keywordflow">throw</span>(ess.str());</div>
-<div class="line"><a name="l00669"></a><span class="lineno">  669</span>           <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l00670"></a><span class="lineno">  670</span>     }</div>
-<div class="line"><a name="l00671"></a><span class="lineno">  671</span>         }</div>
-<div class="line"><a name="l00672"></a><span class="lineno">  672</span>       }</div>
-<div class="line"><a name="l00673"></a><span class="lineno">  673</span>       progress=(1.0+y/down);</div>
-<div class="line"><a name="l00674"></a><span class="lineno">  674</span>       progress+=(output.nrOfRow()*iband);</div>
-<div class="line"><a name="l00675"></a><span class="lineno">  675</span>       progress/=output.nrOfBand()*output.nrOfRow();</div>
-<div class="line"><a name="l00676"></a><span class="lineno">  676</span>       pfnProgress(progress,pszMessage,pProgressArg);</div>
-<div class="line"><a name="l00677"></a><span class="lineno">  677</span>       <span class="comment">//write outBuffer to file</span></div>
-<div class="line"><a name="l00678"></a><span class="lineno">  678</span>       <span class="keywordflow">try</span>{</div>
-<div class="line"><a name="l00679"></a><span class="lineno">  679</span>         output.writeData(outBuffer,GDT_Float64,y/down,iband);</div>
-<div class="line"><a name="l00680"></a><span class="lineno">  680</span>       }</div>
-<div class="line"><a name="l00681"></a><span class="lineno">  681</span>       <span class="keywordflow">catch</span>(std::string errorstring){</div>
-<div class="line"><a name="l00682"></a><span class="lineno">  682</span>     std::cerr << errorstring << <span class="stringliteral">"in band "</span> << iband << <span class="stringliteral">", line "</span> << y << std::endl;</div>
-<div class="line"><a name="l00683"></a><span class="lineno">  683</span>       }</div>
-<div class="line"><a name="l00684"></a><span class="lineno">  684</span>     }</div>
-<div class="line"><a name="l00685"></a><span class="lineno">  685</span>   }</div>
-<div class="line"><a name="l00686"></a><span class="lineno">  686</span>   pfnProgress(1.0,pszMessage,pProgressArg);</div>
-<div class="line"><a name="l00687"></a><span class="lineno">  687</span> }</div>
-<div class="line"><a name="l00688"></a><span class="lineno">  688</span> </div>
-<div class="line"><a name="l00689"></a><span class="lineno">  689</span> <span class="keywordtype">void</span> filter2d::Filter2d::mrf(<span class="keyword">const</span> <a class="code" href="classImgReaderGdal.html">ImgReaderGdal</a>& input, <a class="code" href="classImgWriterGdal.html">ImgWriterGdal</a>& output, <span class="keywordtype">int</span> dimX, <span class="keywordtype">int</span> dimY, <span class="keywordtype">double</span> beta, <span class="keywordtype">bool [...]
-<div class="line"><a name="l00690"></a><span class="lineno">  690</span>   assert(m_class.size()>1);</div>
-<div class="line"><a name="l00691"></a><span class="lineno">  691</span>   <a class="code" href="classVector2d.html">Vector2d<double></a> fullBeta(m_class.size(),m_class.size());</div>
-<div class="line"><a name="l00692"></a><span class="lineno">  692</span>   <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iclass1=0;iclass1<m_class.size();++iclass1)</div>
-<div class="line"><a name="l00693"></a><span class="lineno">  693</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iclass2=0;iclass2<m_class.size();++iclass2)</div>
-<div class="line"><a name="l00694"></a><span class="lineno">  694</span>       fullBeta[iclass1][iclass2]=beta;</div>
-<div class="line"><a name="l00695"></a><span class="lineno">  695</span>   mrf(input,output,dimX,dimY,fullBeta,eightConnectivity,down,verbose);</div>
-<div class="line"><a name="l00696"></a><span class="lineno">  696</span> }</div>
-<div class="line"><a name="l00697"></a><span class="lineno">  697</span> </div>
-<div class="line"><a name="l00698"></a><span class="lineno">  698</span> <span class="comment">//beta[classTo][classFrom]</span></div>
-<div class="line"><a name="l00699"></a><span class="lineno">  699</span> <span class="keywordtype">void</span> filter2d::Filter2d::mrf(<span class="keyword">const</span> <a class="code" href="classImgReaderGdal.html">ImgReaderGdal</a>& input, <a class="code" href="classImgWriterGdal.html">ImgWriterGdal</a>& output, <span class="keywordtype">int</span> dimX, <span class="keywordtype">int</span> dimY, <a class="code" href="classVector2d.html">Vector2d<double></a> beta, < [...]
-<div class="line"><a name="l00700"></a><span class="lineno">  700</span> {</div>
-<div class="line"><a name="l00701"></a><span class="lineno">  701</span>   <span class="keyword">const</span> <span class="keywordtype">char</span>* pszMessage;</div>
-<div class="line"><a name="l00702"></a><span class="lineno">  702</span>   <span class="keywordtype">void</span>* pProgressArg=NULL;</div>
-<div class="line"><a name="l00703"></a><span class="lineno">  703</span>   GDALProgressFunc pfnProgress=GDALTermProgress;</div>
-<div class="line"><a name="l00704"></a><span class="lineno">  704</span>   <span class="keywordtype">double</span> progress=0;</div>
-<div class="line"><a name="l00705"></a><span class="lineno">  705</span>   pfnProgress(progress,pszMessage,pProgressArg);</div>
-<div class="line"><a name="l00706"></a><span class="lineno">  706</span> </div>
-<div class="line"><a name="l00707"></a><span class="lineno">  707</span>   assert(dimX);</div>
-<div class="line"><a name="l00708"></a><span class="lineno">  708</span>   assert(dimY);</div>
+<div class="line"><a name="l00626"></a><span class="lineno">  626</span>             outBuffer[x/down]=inBuffer[(dimY-1)/2][x];<span class="comment">//initialize with original value (in case thresholds not met)</span></div>
+<div class="line"><a name="l00627"></a><span class="lineno">  627</span>             <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iclass=0;iclass<m_class.size();++iclass){</div>
+<div class="line"><a name="l00628"></a><span class="lineno">  628</span>               <span class="keywordflow">if</span>(100.0*(occurrence[m_class[iclass]])/windowBuffer.size()>m_threshold[iclass])</div>
+<div class="line"><a name="l00629"></a><span class="lineno">  629</span>                 outBuffer[x/down]=m_class[iclass];</div>
+<div class="line"><a name="l00630"></a><span class="lineno">  630</span>             }</div>
+<div class="line"><a name="l00631"></a><span class="lineno">  631</span>           }</div>
+<div class="line"><a name="l00632"></a><span class="lineno">  632</span>           <span class="keywordflow">else</span></div>
+<div class="line"><a name="l00633"></a><span class="lineno">  633</span>         outBuffer[x/down]=(m_noDataValues.size())? m_noDataValues[0] : 0;</div>
+<div class="line"><a name="l00634"></a><span class="lineno">  634</span>           <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l00635"></a><span class="lineno">  635</span>         }</div>
+<div class="line"><a name="l00636"></a><span class="lineno">  636</span>         <span class="keywordflow">case</span>(filter2d::scramble):{<span class="comment">//could be done more efficiently window by window with random shuffling entire buffer and assigning entire buffer at once to output image...</span></div>
+<div class="line"><a name="l00637"></a><span class="lineno">  637</span>       <span class="keywordflow">if</span>(windowBuffer.size()){</div>
+<div class="line"><a name="l00638"></a><span class="lineno">  638</span>             <span class="keywordtype">int</span> randomIndex=std::rand()%windowBuffer.size();</div>
+<div class="line"><a name="l00639"></a><span class="lineno">  639</span>         <span class="keywordflow">if</span>(randomIndex>=windowBuffer.size())</div>
+<div class="line"><a name="l00640"></a><span class="lineno">  640</span>           outBuffer[x/down]=windowBuffer.back();</div>
+<div class="line"><a name="l00641"></a><span class="lineno">  641</span>         <span class="keywordflow">else</span> <span class="keywordflow">if</span>(randomIndex<0)</div>
+<div class="line"><a name="l00642"></a><span class="lineno">  642</span>           outBuffer[x/down]=windowBuffer[0];</div>
+<div class="line"><a name="l00643"></a><span class="lineno">  643</span>         <span class="keywordflow">else</span></div>
+<div class="line"><a name="l00644"></a><span class="lineno">  644</span>           outBuffer[x/down]=windowBuffer[randomIndex];</div>
+<div class="line"><a name="l00645"></a><span class="lineno">  645</span>           }</div>
+<div class="line"><a name="l00646"></a><span class="lineno">  646</span>           <span class="keywordflow">else</span></div>
+<div class="line"><a name="l00647"></a><span class="lineno">  647</span>         outBuffer[x/down]=(m_noDataValues.size())? m_noDataValues[0] : 0;</div>
+<div class="line"><a name="l00648"></a><span class="lineno">  648</span>           <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l00649"></a><span class="lineno">  649</span>         }</div>
+<div class="line"><a name="l00650"></a><span class="lineno">  650</span>         <span class="keywordflow">case</span>(filter2d::mixed):{</div>
+<div class="line"><a name="l00651"></a><span class="lineno">  651</span>           <span class="keyword">enum</span> Type { BF=11, CF=12, MF=13, NF=20, W=30 };</div>
+<div class="line"><a name="l00652"></a><span class="lineno">  652</span>           <span class="keywordtype">double</span> nBF=occurrence[BF];</div>
+<div class="line"><a name="l00653"></a><span class="lineno">  653</span>           <span class="keywordtype">double</span> nCF=occurrence[CF];</div>
+<div class="line"><a name="l00654"></a><span class="lineno">  654</span>           <span class="keywordtype">double</span> nMF=occurrence[MF];</div>
+<div class="line"><a name="l00655"></a><span class="lineno">  655</span>           <span class="keywordtype">double</span> nNF=occurrence[NF];</div>
+<div class="line"><a name="l00656"></a><span class="lineno">  656</span>           <span class="keywordtype">double</span> nW=occurrence[W];</div>
+<div class="line"><a name="l00657"></a><span class="lineno">  657</span>       <span class="keywordflow">if</span>(windowBuffer.size()){</div>
+<div class="line"><a name="l00658"></a><span class="lineno">  658</span>             <span class="keywordflow">if</span>((nBF+nCF+nMF)&&(nBF+nCF+nMF>=nNF+nW)){<span class="comment">//forest</span></div>
+<div class="line"><a name="l00659"></a><span class="lineno">  659</span>               <span class="keywordflow">if</span>(nBF/(nBF+nCF)>=0.75)</div>
+<div class="line"><a name="l00660"></a><span class="lineno">  660</span>                 outBuffer[x/down]=BF;</div>
+<div class="line"><a name="l00661"></a><span class="lineno">  661</span>               <span class="keywordflow">else</span> <span class="keywordflow">if</span>(nCF/(nBF+nCF)>=0.75)</div>
+<div class="line"><a name="l00662"></a><span class="lineno">  662</span>                 outBuffer[x/down]=CF;</div>
+<div class="line"><a name="l00663"></a><span class="lineno">  663</span>               <span class="keywordflow">else</span></div>
+<div class="line"><a name="l00664"></a><span class="lineno">  664</span>                 outBuffer[x/down]=MF;</div>
+<div class="line"><a name="l00665"></a><span class="lineno">  665</span>             }</div>
+<div class="line"><a name="l00666"></a><span class="lineno">  666</span>             <span class="keywordflow">else</span>{<span class="comment">//non-forest</span></div>
+<div class="line"><a name="l00667"></a><span class="lineno">  667</span>               <span class="keywordflow">if</span>(nW&&(nW>=nNF))</div>
+<div class="line"><a name="l00668"></a><span class="lineno">  668</span>                 outBuffer[x/down]=W;</div>
+<div class="line"><a name="l00669"></a><span class="lineno">  669</span>               <span class="keywordflow">else</span></div>
+<div class="line"><a name="l00670"></a><span class="lineno">  670</span>                 outBuffer[x/down]=NF;</div>
+<div class="line"><a name="l00671"></a><span class="lineno">  671</span>             }</div>
+<div class="line"><a name="l00672"></a><span class="lineno">  672</span>           }</div>
+<div class="line"><a name="l00673"></a><span class="lineno">  673</span>       <span class="keywordflow">else</span></div>
+<div class="line"><a name="l00674"></a><span class="lineno">  674</span>         outBuffer[x/down]=inBuffer[indexJ][indexI];</div>
+<div class="line"><a name="l00675"></a><span class="lineno">  675</span>           <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l00676"></a><span class="lineno">  676</span>         }</div>
+<div class="line"><a name="l00677"></a><span class="lineno">  677</span>         <span class="keywordflow">default</span>:{</div>
+<div class="line"><a name="l00678"></a><span class="lineno">  678</span>       std::ostringstream ess;</div>
+<div class="line"><a name="l00679"></a><span class="lineno">  679</span>       ess << <span class="stringliteral">"Error: filter method "</span> << method << <span class="stringliteral">" not supported"</span> << std::endl;</div>
+<div class="line"><a name="l00680"></a><span class="lineno">  680</span>       <span class="keywordflow">throw</span>(ess.str());</div>
+<div class="line"><a name="l00681"></a><span class="lineno">  681</span>           <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l00682"></a><span class="lineno">  682</span>     }</div>
+<div class="line"><a name="l00683"></a><span class="lineno">  683</span>         }</div>
+<div class="line"><a name="l00684"></a><span class="lineno">  684</span>       }</div>
+<div class="line"><a name="l00685"></a><span class="lineno">  685</span>       progress=(1.0+y/down);</div>
+<div class="line"><a name="l00686"></a><span class="lineno">  686</span>       progress+=(output.nrOfRow()*iband);</div>
+<div class="line"><a name="l00687"></a><span class="lineno">  687</span>       progress/=output.nrOfBand()*output.nrOfRow();</div>
+<div class="line"><a name="l00688"></a><span class="lineno">  688</span>       pfnProgress(progress,pszMessage,pProgressArg);</div>
+<div class="line"><a name="l00689"></a><span class="lineno">  689</span>       <span class="comment">//write outBuffer to file</span></div>
+<div class="line"><a name="l00690"></a><span class="lineno">  690</span>       <span class="keywordflow">try</span>{</div>
+<div class="line"><a name="l00691"></a><span class="lineno">  691</span>         output.writeData(outBuffer,GDT_Float64,y/down,iband);</div>
+<div class="line"><a name="l00692"></a><span class="lineno">  692</span>       }</div>
+<div class="line"><a name="l00693"></a><span class="lineno">  693</span>       <span class="keywordflow">catch</span>(std::string errorstring){</div>
+<div class="line"><a name="l00694"></a><span class="lineno">  694</span>     std::cerr << errorstring << <span class="stringliteral">"in band "</span> << iband << <span class="stringliteral">", line "</span> << y << std::endl;</div>
+<div class="line"><a name="l00695"></a><span class="lineno">  695</span>       }</div>
+<div class="line"><a name="l00696"></a><span class="lineno">  696</span>     }</div>
+<div class="line"><a name="l00697"></a><span class="lineno">  697</span>   }</div>
+<div class="line"><a name="l00698"></a><span class="lineno">  698</span>   pfnProgress(1.0,pszMessage,pProgressArg);</div>
+<div class="line"><a name="l00699"></a><span class="lineno">  699</span> }</div>
+<div class="line"><a name="l00700"></a><span class="lineno">  700</span> </div>
+<div class="line"><a name="l00701"></a><span class="lineno">  701</span> <span class="keywordtype">void</span> filter2d::Filter2d::mrf(<span class="keyword">const</span> <a class="code" href="classImgReaderGdal.html">ImgReaderGdal</a>& input, <a class="code" href="classImgWriterGdal.html">ImgWriterGdal</a>& output, <span class="keywordtype">int</span> dimX, <span class="keywordtype">int</span> dimY, <span class="keywordtype">double</span> beta, <span class="keywordtype">bool [...]
+<div class="line"><a name="l00702"></a><span class="lineno">  702</span>   assert(m_class.size()>1);</div>
+<div class="line"><a name="l00703"></a><span class="lineno">  703</span>   <a class="code" href="classVector2d.html">Vector2d<double></a> fullBeta(m_class.size(),m_class.size());</div>
+<div class="line"><a name="l00704"></a><span class="lineno">  704</span>   <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iclass1=0;iclass1<m_class.size();++iclass1)</div>
+<div class="line"><a name="l00705"></a><span class="lineno">  705</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iclass2=0;iclass2<m_class.size();++iclass2)</div>
+<div class="line"><a name="l00706"></a><span class="lineno">  706</span>       fullBeta[iclass1][iclass2]=beta;</div>
+<div class="line"><a name="l00707"></a><span class="lineno">  707</span>   mrf(input,output,dimX,dimY,fullBeta,eightConnectivity,down,verbose);</div>
+<div class="line"><a name="l00708"></a><span class="lineno">  708</span> }</div>
 <div class="line"><a name="l00709"></a><span class="lineno">  709</span> </div>
-<div class="line"><a name="l00710"></a><span class="lineno">  710</span>   <a class="code" href="classVector2d.html">Vector2d<short></a> inBuffer(dimY,input.nrOfCol());</div>
-<div class="line"><a name="l00711"></a><span class="lineno">  711</span>   <a class="code" href="classVector2d.html">Vector2d<double></a> outBuffer(m_class.size(),(input.nrOfCol()+down-1)/down);</div>
-<div class="line"><a name="l00712"></a><span class="lineno">  712</span>   assert(input.nrOfBand()==1);</div>
-<div class="line"><a name="l00713"></a><span class="lineno">  713</span>   assert(output.nrOfBand()==m_class.size());</div>
-<div class="line"><a name="l00714"></a><span class="lineno">  714</span>   assert(m_class.size()>1);</div>
-<div class="line"><a name="l00715"></a><span class="lineno">  715</span>   assert(beta.size()==m_class.size());</div>
-<div class="line"><a name="l00716"></a><span class="lineno">  716</span>   <span class="keywordtype">int</span> indexI=0;</div>
-<div class="line"><a name="l00717"></a><span class="lineno">  717</span>   <span class="keywordtype">int</span> indexJ=0;</div>
-<div class="line"><a name="l00718"></a><span class="lineno">  718</span>   <span class="comment">//initialize last half of inBuffer</span></div>
-<div class="line"><a name="l00719"></a><span class="lineno">  719</span>   <span class="keywordflow">for</span>(<span class="keywordtype">int</span> j=-(dimY-1)/2;j<=dimY/2;++j){</div>
-<div class="line"><a name="l00720"></a><span class="lineno">  720</span>     <span class="keywordflow">try</span>{</div>
-<div class="line"><a name="l00721"></a><span class="lineno">  721</span>       input.readData(inBuffer[indexJ],GDT_Int16,abs(j));</div>
-<div class="line"><a name="l00722"></a><span class="lineno">  722</span>     }</div>
-<div class="line"><a name="l00723"></a><span class="lineno">  723</span>     <span class="keywordflow">catch</span>(std::string errorstring){</div>
-<div class="line"><a name="l00724"></a><span class="lineno">  724</span>       std::cerr << errorstring << <span class="stringliteral">"in line "</span> << indexJ << std::endl;</div>
-<div class="line"><a name="l00725"></a><span class="lineno">  725</span>     }</div>
-<div class="line"><a name="l00726"></a><span class="lineno">  726</span>     ++indexJ;</div>
-<div class="line"><a name="l00727"></a><span class="lineno">  727</span>   }</div>
-<div class="line"><a name="l00728"></a><span class="lineno">  728</span>   <span class="keywordflow">for</span>(<span class="keywordtype">int</span> y=0;y<input.nrOfRow();++y){</div>
-<div class="line"><a name="l00729"></a><span class="lineno">  729</span>     <span class="keywordflow">if</span>(y){<span class="comment">//inBuffer already initialized for y=0</span></div>
-<div class="line"><a name="l00730"></a><span class="lineno">  730</span>       <span class="comment">//erase first line from inBuffer</span></div>
-<div class="line"><a name="l00731"></a><span class="lineno">  731</span>       <span class="keywordflow">if</span>(dimY>1)</div>
-<div class="line"><a name="l00732"></a><span class="lineno">  732</span>     inBuffer.erase(inBuffer.begin());</div>
-<div class="line"><a name="l00733"></a><span class="lineno">  733</span>       <span class="comment">//read extra line and push back to inBuffer if not out of bounds</span></div>
-<div class="line"><a name="l00734"></a><span class="lineno">  734</span>       <span class="keywordflow">if</span>(y+dimY/2<input.nrOfRow()){</div>
-<div class="line"><a name="l00735"></a><span class="lineno">  735</span>         <span class="comment">//allocate buffer</span></div>
-<div class="line"><a name="l00736"></a><span class="lineno">  736</span>     <span class="keywordflow">if</span>(dimY>1)</div>
-<div class="line"><a name="l00737"></a><span class="lineno">  737</span>       inBuffer.push_back(inBuffer.back());</div>
-<div class="line"><a name="l00738"></a><span class="lineno">  738</span>         <span class="keywordflow">try</span>{</div>
-<div class="line"><a name="l00739"></a><span class="lineno">  739</span>           input.readData(inBuffer[inBuffer.size()-1],GDT_Int16,y+dimY/2);</div>
-<div class="line"><a name="l00740"></a><span class="lineno">  740</span>         }</div>
-<div class="line"><a name="l00741"></a><span class="lineno">  741</span>         <span class="keywordflow">catch</span>(std::string errorstring){</div>
-<div class="line"><a name="l00742"></a><span class="lineno">  742</span>           std::cerr << errorstring << <span class="stringliteral">"in line "</span> << y << std::endl;</div>
-<div class="line"><a name="l00743"></a><span class="lineno">  743</span>         }</div>
-<div class="line"><a name="l00744"></a><span class="lineno">  744</span>       }</div>
-<div class="line"><a name="l00745"></a><span class="lineno">  745</span>       <span class="keywordflow">else</span>{</div>
-<div class="line"><a name="l00746"></a><span class="lineno">  746</span>         <span class="keywordtype">int</span> over=y+dimY/2-input.nrOfRow();</div>
-<div class="line"><a name="l00747"></a><span class="lineno">  747</span>         <span class="keywordtype">int</span> index=(inBuffer.size()-1)-over;</div>
-<div class="line"><a name="l00748"></a><span class="lineno">  748</span>         assert(index>=0);</div>
-<div class="line"><a name="l00749"></a><span class="lineno">  749</span>         assert(index<inBuffer.size());</div>
-<div class="line"><a name="l00750"></a><span class="lineno">  750</span>         inBuffer.push_back(inBuffer[index]);</div>
-<div class="line"><a name="l00751"></a><span class="lineno">  751</span>       }</div>
-<div class="line"><a name="l00752"></a><span class="lineno">  752</span>     }</div>
-<div class="line"><a name="l00753"></a><span class="lineno">  753</span>     <span class="keywordflow">if</span>((y+1+down/2)%down)</div>
-<div class="line"><a name="l00754"></a><span class="lineno">  754</span>       <span class="keywordflow">continue</span>;</div>
-<div class="line"><a name="l00755"></a><span class="lineno">  755</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> x=0;x<input.nrOfCol();++x){</div>
-<div class="line"><a name="l00756"></a><span class="lineno">  756</span>       <span class="keywordflow">if</span>((x+1+down/2)%down)</div>
-<div class="line"><a name="l00757"></a><span class="lineno">  757</span>         <span class="keywordflow">continue</span>;</div>
-<div class="line"><a name="l00758"></a><span class="lineno">  758</span>       std::vector<short> potential(m_class.size());</div>
-<div class="line"><a name="l00759"></a><span class="lineno">  759</span>       <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iclass=0;iclass<m_class.size();++iclass){</div>
-<div class="line"><a name="l00760"></a><span class="lineno">  760</span>         potential[iclass]=0;</div>
-<div class="line"><a name="l00761"></a><span class="lineno">  761</span>         outBuffer[iclass][x/down]=0;</div>
-<div class="line"><a name="l00762"></a><span class="lineno">  762</span>       }</div>
-<div class="line"><a name="l00763"></a><span class="lineno">  763</span>       std::vector<double> windowBuffer;</div>
-<div class="line"><a name="l00764"></a><span class="lineno">  764</span>       <span class="keywordtype">int</span> centre=dimX*(dimY-1)/2+(dimX-1)/2;</div>
-<div class="line"><a name="l00765"></a><span class="lineno">  765</span>       <span class="keywordflow">for</span>(<span class="keywordtype">int</span> j=-(dimY-1)/2;j<=dimY/2;++j){</div>
-<div class="line"><a name="l00766"></a><span class="lineno">  766</span>         <span class="keywordflow">for</span>(<span class="keywordtype">int</span> i=-(dimX-1)/2;i<=dimX/2;++i){</div>
-<div class="line"><a name="l00767"></a><span class="lineno">  767</span>           <span class="keywordflow">if</span>(i!=0&&j!=0&&!eightConnectivity)</div>
-<div class="line"><a name="l00768"></a><span class="lineno">  768</span>             <span class="keywordflow">continue</span>;</div>
-<div class="line"><a name="l00769"></a><span class="lineno">  769</span>           <span class="keywordflow">if</span>(i==0&&j==0)</div>
-<div class="line"><a name="l00770"></a><span class="lineno">  770</span>             <span class="keywordflow">continue</span>;</div>
-<div class="line"><a name="l00771"></a><span class="lineno">  771</span>           indexI=x+i;</div>
-<div class="line"><a name="l00772"></a><span class="lineno">  772</span>           <span class="comment">//check if out of bounds</span></div>
-<div class="line"><a name="l00773"></a><span class="lineno">  773</span>           <span class="keywordflow">if</span>(indexI<0)</div>
-<div class="line"><a name="l00774"></a><span class="lineno">  774</span>             indexI=-indexI;</div>
-<div class="line"><a name="l00775"></a><span class="lineno">  775</span>           <span class="keywordflow">else</span> <span class="keywordflow">if</span>(indexI>=input.nrOfCol())</div>
-<div class="line"><a name="l00776"></a><span class="lineno">  776</span>             indexI=input.nrOfCol()-i;</div>
-<div class="line"><a name="l00777"></a><span class="lineno">  777</span>           <span class="keywordflow">if</span>(y+j<0)</div>
-<div class="line"><a name="l00778"></a><span class="lineno">  778</span>             indexJ=-j;</div>
-<div class="line"><a name="l00779"></a><span class="lineno">  779</span>           <span class="keywordflow">else</span> <span class="keywordflow">if</span>(y+j>=input.nrOfRow())</div>
-<div class="line"><a name="l00780"></a><span class="lineno">  780</span>             indexJ=(dimY>2) ? (dimY-1)/2-j : 0;</div>
-<div class="line"><a name="l00781"></a><span class="lineno">  781</span>           <span class="keywordflow">else</span></div>
-<div class="line"><a name="l00782"></a><span class="lineno">  782</span>             indexJ=(dimY-1)/2+j;</div>
-<div class="line"><a name="l00783"></a><span class="lineno">  783</span>           <span class="keywordtype">bool</span> masked=<span class="keyword">false</span>;</div>
-<div class="line"><a name="l00784"></a><span class="lineno">  784</span>           <span class="keywordflow">for</span>(<span class="keywordtype">int</span> imask=0;imask<m_noDataValues.size();++imask){</div>
-<div class="line"><a name="l00785"></a><span class="lineno">  785</span>             <span class="keywordflow">if</span>(inBuffer[indexJ][indexI]==m_noDataValues[imask]){</div>
-<div class="line"><a name="l00786"></a><span class="lineno">  786</span>               masked=<span class="keyword">true</span>;</div>
-<div class="line"><a name="l00787"></a><span class="lineno">  787</span>               <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l00788"></a><span class="lineno">  788</span>             }</div>
-<div class="line"><a name="l00789"></a><span class="lineno">  789</span>           }</div>
-<div class="line"><a name="l00790"></a><span class="lineno">  790</span>           <span class="keywordflow">if</span>(!masked){</div>
-<div class="line"><a name="l00791"></a><span class="lineno">  791</span>             <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iclass=0;iclass<m_class.size();++iclass){</div>
-<div class="line"><a name="l00792"></a><span class="lineno">  792</span>               <span class="keywordflow">if</span>(inBuffer[indexJ][indexI]==m_class[iclass])</div>
-<div class="line"><a name="l00793"></a><span class="lineno">  793</span>                 potential[iclass]+=1;</div>
-<div class="line"><a name="l00794"></a><span class="lineno">  794</span>             }</div>
-<div class="line"><a name="l00795"></a><span class="lineno">  795</span>           }</div>
-<div class="line"><a name="l00796"></a><span class="lineno">  796</span>         }</div>
-<div class="line"><a name="l00797"></a><span class="lineno">  797</span>       }</div>
-<div class="line"><a name="l00798"></a><span class="lineno">  798</span>       <span class="keywordtype">double</span> norm=0;</div>
-<div class="line"><a name="l00799"></a><span class="lineno">  799</span>       <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iclass1=0;iclass1<m_class.size();++iclass1){</div>
-<div class="line"><a name="l00800"></a><span class="lineno">  800</span>     assert(beta[iclass1].size()==m_class.size());</div>
-<div class="line"><a name="l00801"></a><span class="lineno">  801</span>         <span class="keywordtype">double</span> pot=0;</div>
-<div class="line"><a name="l00802"></a><span class="lineno">  802</span>         <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iclass2=0;iclass2<m_class.size();++iclass2)</div>
-<div class="line"><a name="l00803"></a><span class="lineno">  803</span>       <span class="keywordflow">if</span>(iclass2!=iclass1)</div>
-<div class="line"><a name="l00804"></a><span class="lineno">  804</span>         pot+=potential[iclass2]*beta[iclass1][iclass2];</div>
-<div class="line"><a name="l00805"></a><span class="lineno">  805</span>         <span class="keywordtype">double</span> prior=exp(-pot);</div>
-<div class="line"><a name="l00806"></a><span class="lineno">  806</span>         outBuffer[iclass1][x/down]=prior;</div>
-<div class="line"><a name="l00807"></a><span class="lineno">  807</span>         norm+=prior;</div>
-<div class="line"><a name="l00808"></a><span class="lineno">  808</span>       }</div>
-<div class="line"><a name="l00809"></a><span class="lineno">  809</span>       <span class="keywordflow">if</span>(norm){</div>
-<div class="line"><a name="l00810"></a><span class="lineno">  810</span>         <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iclass1=0;iclass1<m_class.size();++iclass1)</div>
-<div class="line"><a name="l00811"></a><span class="lineno">  811</span>           outBuffer[iclass1][x/down]/=norm;</div>
-<div class="line"><a name="l00812"></a><span class="lineno">  812</span>       }</div>
-<div class="line"><a name="l00813"></a><span class="lineno">  813</span>     }</div>
-<div class="line"><a name="l00814"></a><span class="lineno">  814</span>     progress=(1.0+y/down)/output.nrOfRow();</div>
-<div class="line"><a name="l00815"></a><span class="lineno">  815</span>     pfnProgress(progress,pszMessage,pProgressArg);</div>
-<div class="line"><a name="l00816"></a><span class="lineno">  816</span>     <span class="comment">//write outBuffer to file</span></div>
-<div class="line"><a name="l00817"></a><span class="lineno">  817</span>     assert(outBuffer.size()==m_class.size());</div>
-<div class="line"><a name="l00818"></a><span class="lineno">  818</span>     assert(y<output.nrOfRow());</div>
-<div class="line"><a name="l00819"></a><span class="lineno">  819</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iclass=0;iclass<m_class.size();++iclass){</div>
-<div class="line"><a name="l00820"></a><span class="lineno">  820</span>       assert(outBuffer[iclass].size()==output.nrOfCol());</div>
-<div class="line"><a name="l00821"></a><span class="lineno">  821</span>       <span class="keywordflow">try</span>{</div>
-<div class="line"><a name="l00822"></a><span class="lineno">  822</span>         output.writeData(outBuffer[iclass],GDT_Float64,y/down,iclass);</div>
-<div class="line"><a name="l00823"></a><span class="lineno">  823</span>       }</div>
-<div class="line"><a name="l00824"></a><span class="lineno">  824</span>       <span class="keywordflow">catch</span>(std::string errorstring){</div>
-<div class="line"><a name="l00825"></a><span class="lineno">  825</span>         std::cerr << errorstring << <span class="stringliteral">"in class "</span> << iclass << <span class="stringliteral">", line "</span> << y << std::endl;</div>
-<div class="line"><a name="l00826"></a><span class="lineno">  826</span>       }</div>
-<div class="line"><a name="l00827"></a><span class="lineno">  827</span>     }</div>
-<div class="line"><a name="l00828"></a><span class="lineno">  828</span>   }</div>
-<div class="line"><a name="l00829"></a><span class="lineno">  829</span> }</div>
-<div class="line"><a name="l00830"></a><span class="lineno">  830</span> </div>
-<div class="line"><a name="l00831"></a><span class="lineno">  831</span> <span class="keywordtype">void</span> filter2d::Filter2d::shift(<span class="keyword">const</span> <a class="code" href="classImgReaderGdal.html">ImgReaderGdal</a>& input, <a class="code" href="classImgWriterGdal.html">ImgWriterGdal</a>& output, <span class="keywordtype">double</span> offsetX, <span class="keywordtype">double</span> offsetY, <span class="keywordtype">double</span> randomSigma, RESAMPLE  [...]
-<div class="line"><a name="l00832"></a><span class="lineno">  832</span> {</div>
-<div class="line"><a name="l00833"></a><span class="lineno">  833</span>   assert(input.nrOfCol()==output.nrOfCol());</div>
-<div class="line"><a name="l00834"></a><span class="lineno">  834</span>   assert(input.nrOfRow()==output.nrOfRow());</div>
-<div class="line"><a name="l00835"></a><span class="lineno">  835</span>   assert(input.nrOfBand()==output.nrOfBand());</div>
-<div class="line"><a name="l00836"></a><span class="lineno">  836</span>   <span class="keyword">const</span> <span class="keywordtype">char</span>* pszMessage;</div>
-<div class="line"><a name="l00837"></a><span class="lineno">  837</span>   <span class="keywordtype">void</span>* pProgressArg=NULL;</div>
-<div class="line"><a name="l00838"></a><span class="lineno">  838</span>   GDALProgressFunc pfnProgress=GDALTermProgress;</div>
-<div class="line"><a name="l00839"></a><span class="lineno">  839</span>   <span class="keywordtype">double</span> progress=0;</div>
-<div class="line"><a name="l00840"></a><span class="lineno">  840</span>   pfnProgress(progress,pszMessage,pProgressArg);</div>
-<div class="line"><a name="l00841"></a><span class="lineno">  841</span>   <span class="comment">//process band per band in memory</span></div>
-<div class="line"><a name="l00842"></a><span class="lineno">  842</span>   <a class="code" href="classVector2d.html">Vector2d<double></a> inBuffer(input.nrOfRow(),output.nrOfCol());</div>
-<div class="line"><a name="l00843"></a><span class="lineno">  843</span>   <a class="code" href="classVector2d.html">Vector2d<double></a> outBuffer(input.nrOfRow(),output.nrOfCol());</div>
-<div class="line"><a name="l00844"></a><span class="lineno">  844</span>   <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iband=0;iband<input.nrOfBand();++iband){</div>
-<div class="line"><a name="l00845"></a><span class="lineno">  845</span>     input.readDataBlock(inBuffer,GDT_Float64,0,inBuffer.nCols()-1,0,inBuffer.nRows()-1,iband);</div>
-<div class="line"><a name="l00846"></a><span class="lineno">  846</span>     shift(inBuffer,outBuffer,offsetX,offsetY,randomSigma,resample,verbose);</div>
-<div class="line"><a name="l00847"></a><span class="lineno">  847</span>     output.writeDataBlock(outBuffer,GDT_Float64,0,outBuffer.nCols()-1,0,outBuffer.nRows()-1,iband);</div>
-<div class="line"><a name="l00848"></a><span class="lineno">  848</span>   }</div>
-<div class="line"><a name="l00849"></a><span class="lineno">  849</span> }</div>
-<div class="line"><a name="l00850"></a><span class="lineno">  850</span> </div>
-<div class="line"><a name="l00851"></a><span class="lineno">  851</span> <span class="comment">//todo: re-implement without dependency of CImg and reg libraries</span></div>
-<div class="line"><a name="l00852"></a><span class="lineno">  852</span> <span class="comment">// void filter2d::Filter2d::dwt_texture(const std::string& inputFilename, const std::string& outputFilename,int dim, int scale, int down, int iband, bool verbose)</span></div>
-<div class="line"><a name="l00853"></a><span class="lineno">  853</span> <span class="comment">// {</span></div>
-<div class="line"><a name="l00854"></a><span class="lineno">  854</span> <span class="comment">//   ImgReaderGdal input;</span></div>
-<div class="line"><a name="l00855"></a><span class="lineno">  855</span> <span class="comment">//   ImgWriterGdal output;</span></div>
-<div class="line"><a name="l00856"></a><span class="lineno">  856</span> <span class="comment">//   if(verbose)</span></div>
-<div class="line"><a name="l00857"></a><span class="lineno">  857</span> <span class="comment">//     std::cout << "opening file " << inputFilename << std::endl;</span></div>
-<div class="line"><a name="l00858"></a><span class="lineno">  858</span> <span class="comment">//   input.open(inputFilename);</span></div>
-<div class="line"><a name="l00859"></a><span class="lineno">  859</span> <span class="comment">//   double magicX=1,magicY=1;</span></div>
-<div class="line"><a name="l00860"></a><span class="lineno">  860</span> <span class="comment">//   output.open(outputFilename,(input.nrOfCol()+down-1)/down,(input.nrOfRow()+down-1)/down,scale*3,GDT_Float32,input.getImageType());</span></div>
-<div class="line"><a name="l00861"></a><span class="lineno">  861</span> <span class="comment">//   if(input.isGeoRef()){</span></div>
-<div class="line"><a name="l00862"></a><span class="lineno">  862</span> <span class="comment">//     output.setProjection(input.getProjection());</span></div>
-<div class="line"><a name="l00863"></a><span class="lineno">  863</span> <span class="comment">//     output.copyGeoTransform(input);</span></div>
-<div class="line"><a name="l00864"></a><span class="lineno">  864</span> <span class="comment">//   }</span></div>
-<div class="line"><a name="l00865"></a><span class="lineno">  865</span> <span class="comment">//   if(verbose)</span></div>
-<div class="line"><a name="l00866"></a><span class="lineno">  866</span> <span class="comment">//     std::cout << "Dimension texture (row x col x band) = " << (input.nrOfCol()+down-1)/down << " x " << (input.nrOfRow()+down-1)/down << " x " << scale*3 << std::endl;</span></div>
-<div class="line"><a name="l00867"></a><span class="lineno">  867</span> <span class="comment">//   assert(dim%2);</span></div>
-<div class="line"><a name="l00868"></a><span class="lineno">  868</span> <span class="comment">//   int dimX=dim;</span></div>
-<div class="line"><a name="l00869"></a><span class="lineno">  869</span> <span class="comment">//   int dimY=dim;</span></div>
-<div class="line"><a name="l00870"></a><span class="lineno">  870</span> <span class="comment">//   Vector2d<float> inBuffer(dimY,input.nrOfCol());</span></div>
-<div class="line"><a name="l00871"></a><span class="lineno">  871</span> <span class="comment">//   Vector2d<float> outBuffer(scale*3,(input.nrOfCol()+down-1)/down);</span></div>
-<div class="line"><a name="l00872"></a><span class="lineno">  872</span> <span class="comment">//   //initialize last half of inBuffer</span></div>
-<div class="line"><a name="l00873"></a><span class="lineno">  873</span> <span class="comment">//   int indexI=0;</span></div>
-<div class="line"><a name="l00874"></a><span class="lineno">  874</span> <span class="comment">//   int indexJ=0;</span></div>
-<div class="line"><a name="l00875"></a><span class="lineno">  875</span> <span class="comment">//   for(int j=-dimY/2;j<(dimY+1)/2;++j){</span></div>
-<div class="line"><a name="l00876"></a><span class="lineno">  876</span> <span class="comment">//     try{</span></div>
-<div class="line"><a name="l00877"></a><span class="lineno">  877</span> <span class="comment">//       if(verbose)</span></div>
-<div class="line"><a name="l00878"></a><span class="lineno">  878</span> <span class="comment">//  cout << "reading input line " << abs(j) << std::endl;</span></div>
-<div class="line"><a name="l00879"></a><span class="lineno">  879</span> <span class="comment">//       input.readData(inBuffer[indexJ],GDT_Float32,abs(j),iband);</span></div>
-<div class="line"><a name="l00880"></a><span class="lineno">  880</span> <span class="comment">//       ++indexJ;</span></div>
-<div class="line"><a name="l00881"></a><span class="lineno">  881</span> <span class="comment">//     }</span></div>
-<div class="line"><a name="l00882"></a><span class="lineno">  882</span> <span class="comment">//     catch(std::string errorstring){</span></div>
-<div class="line"><a name="l00883"></a><span class="lineno">  883</span> <span class="comment">//       std::cerr << errorstring << "in band " << iband << ", line " << indexJ << std::endl;</span></div>
-<div class="line"><a name="l00884"></a><span class="lineno">  884</span> <span class="comment">//     }</span></div>
-<div class="line"><a name="l00885"></a><span class="lineno">  885</span> <span class="comment">//   }</span></div>
-<div class="line"><a name="l00886"></a><span class="lineno">  886</span> <span class="comment">//   const char* pszMessage;</span></div>
-<div class="line"><a name="l00887"></a><span class="lineno">  887</span> <span class="comment">//   void* pProgressArg=NULL;</span></div>
-<div class="line"><a name="l00888"></a><span class="lineno">  888</span> <span class="comment">//   GDALProgressFunc pfnProgress=GDALTermProgress;</span></div>
-<div class="line"><a name="l00889"></a><span class="lineno">  889</span> <span class="comment">//   double progress=0;</span></div>
-<div class="line"><a name="l00890"></a><span class="lineno">  890</span> <span class="comment">//   pfnProgress(progress,pszMessage,pProgressArg);</span></div>
-<div class="line"><a name="l00891"></a><span class="lineno">  891</span> <span class="comment">//   for(int y=0;y<input.nrOfRow();y+=down){</span></div>
-<div class="line"><a name="l00892"></a><span class="lineno">  892</span> <span class="comment">//     if(verbose)</span></div>
-<div class="line"><a name="l00893"></a><span class="lineno">  893</span> <span class="comment">//       std::cout << "calculating line " << y/down << std::endl;</span></div>
-<div class="line"><a name="l00894"></a><span class="lineno">  894</span> <span class="comment">//     if(y){//inBuffer already initialized for y=0</span></div>
-<div class="line"><a name="l00895"></a><span class="lineno">  895</span> <span class="comment">//       //erase first line from inBuffer</span></div>
-<div class="line"><a name="l00896"></a><span class="lineno">  896</span> <span class="comment">//       inBuffer.erase(inBuffer.begin());</span></div>
-<div class="line"><a name="l00897"></a><span class="lineno">  897</span> <span class="comment">//       //read extra line and push back to inBuffer if not out of bounds</span></div>
-<div class="line"><a name="l00898"></a><span class="lineno">  898</span> <span class="comment">//       if(y+dimY/2<input.nrOfRow()){</span></div>
-<div class="line"><a name="l00899"></a><span class="lineno">  899</span> <span class="comment">//  //allocate buffer</span></div>
-<div class="line"><a name="l00900"></a><span class="lineno">  900</span> <span class="comment">//  inBuffer.push_back(inBuffer.back());</span></div>
-<div class="line"><a name="l00901"></a><span class="lineno">  901</span> <span class="comment">//  try{</span></div>
-<div class="line"><a name="l00902"></a><span class="lineno">  902</span> <span class="comment">//    if(verbose)</span></div>
-<div class="line"><a name="l00903"></a><span class="lineno">  903</span> <span class="comment">//      std::cout << "reading input line " << y+dimY/2 << std::endl;</span></div>
-<div class="line"><a name="l00904"></a><span class="lineno">  904</span> <span class="comment">//           input.readData(inBuffer[inBuffer.size()-1],GDT_Float32,y+dimY/2,iband);</span></div>
-<div class="line"><a name="l00905"></a><span class="lineno">  905</span> <span class="comment">//  }</span></div>
-<div class="line"><a name="l00906"></a><span class="lineno">  906</span> <span class="comment">//  catch(std::string errorstring){</span></div>
-<div class="line"><a name="l00907"></a><span class="lineno">  907</span> <span class="comment">//    std::cerr << errorstring << "in band " << iband << ", line " << y << std::endl;</span></div>
-<div class="line"><a name="l00908"></a><span class="lineno">  908</span> <span class="comment">//  }</span></div>
-<div class="line"><a name="l00909"></a><span class="lineno">  909</span> <span class="comment">//       }</span></div>
-<div class="line"><a name="l00910"></a><span class="lineno">  910</span> <span class="comment">//     }</span></div>
-<div class="line"><a name="l00911"></a><span class="lineno">  911</span> <span class="comment">//     for(int x=0;x<input.nrOfCol();x+=down){</span></div>
-<div class="line"><a name="l00912"></a><span class="lineno">  912</span> <span class="comment">//       Vector2d<double> texture_feature(scale,3);</span></div>
-<div class="line"><a name="l00913"></a><span class="lineno">  913</span> <span class="comment">//       CImg<> texture_in(dimX,dimY);</span></div>
-<div class="line"><a name="l00914"></a><span class="lineno">  914</span> <span class="comment">//       int r=0;//index for row of texture_in</span></div>
-<div class="line"><a name="l00915"></a><span class="lineno">  915</span> <span class="comment">//       for(int j=-dimY/2;j<(dimY+1)/2;++j){</span></div>
-<div class="line"><a name="l00916"></a><span class="lineno">  916</span> <span class="comment">//  int c=0;</span></div>
-<div class="line"><a name="l00917"></a><span class="lineno">  917</span> <span class="comment">//  for(int i=-dimX/2;i<(dimX+1)/2;++i){</span></div>
-<div class="line"><a name="l00918"></a><span class="lineno">  918</span> <span class="comment">//    indexI=x+i;</span></div>
-<div class="line"><a name="l00919"></a><span class="lineno">  919</span> <span class="comment">//    //check if out of bounds</span></div>
-<div class="line"><a name="l00920"></a><span class="lineno">  920</span> <span class="comment">//    if(indexI<0)</span></div>
-<div class="line"><a name="l00921"></a><span class="lineno">  921</span> <span class="comment">//      indexI=-indexI;</span></div>
-<div class="line"><a name="l00922"></a><span class="lineno">  922</span> <span class="comment">//    else if(indexI>=input.nrOfCol())</span></div>
-<div class="line"><a name="l00923"></a><span class="lineno">  923</span> <span class="comment">//      indexI=input.nrOfCol()-i;</span></div>
-<div class="line"><a name="l00924"></a><span class="lineno">  924</span> <span class="comment">//    if(y+j<0)</span></div>
-<div class="line"><a name="l00925"></a><span class="lineno">  925</span> <span class="comment">//      indexJ=-j;</span></div>
-<div class="line"><a name="l00926"></a><span class="lineno">  926</span> <span class="comment">//    else if(y+j>=input.nrOfRow())</span></div>
-<div class="line"><a name="l00927"></a><span class="lineno">  927</span> <span class="comment">//      indexJ=dimY/2-j;//indexJ=inBuffer.size()-1-j;</span></div>
-<div class="line"><a name="l00928"></a><span class="lineno">  928</span> <span class="comment">//    else</span></div>
-<div class="line"><a name="l00929"></a><span class="lineno">  929</span> <span class="comment">//      indexJ=dimY/2+j;</span></div>
-<div class="line"><a name="l00930"></a><span class="lineno">  930</span> <span class="comment">//    assert(indexJ<inBuffer.size());</span></div>
-<div class="line"><a name="l00931"></a><span class="lineno">  931</span> <span class="comment">//    assert(indexI<inBuffer[indexJ].size());</span></div>
-<div class="line"><a name="l00932"></a><span class="lineno">  932</span> <span class="comment">//    texture_in(r,c)=inBuffer[indexJ][indexI];</span></div>
-<div class="line"><a name="l00933"></a><span class="lineno">  933</span> <span class="comment">//    c++;</span></div>
-<div class="line"><a name="l00934"></a><span class="lineno">  934</span> <span class="comment">//  }</span></div>
-<div class="line"><a name="l00935"></a><span class="lineno">  935</span> <span class="comment">//  ++r;</span></div>
-<div class="line"><a name="l00936"></a><span class="lineno">  936</span> <span class="comment">//       }</span></div>
-<div class="line"><a name="l00937"></a><span class="lineno">  937</span> <span class="comment">//       texture_in.dwt_texture(texture_feature,scale);</span></div>
-<div class="line"><a name="l00938"></a><span class="lineno">  938</span> <span class="comment">//       for(int v=0;v<scale*3;++v)</span></div>
-<div class="line"><a name="l00939"></a><span class="lineno">  939</span> <span class="comment">//  outBuffer[v][x/down]=texture_feature[v/3][v%3];</span></div>
-<div class="line"><a name="l00940"></a><span class="lineno">  940</span> <span class="comment">//     }</span></div>
-<div class="line"><a name="l00941"></a><span class="lineno">  941</span> <span class="comment">//     //write outBuffer to file</span></div>
-<div class="line"><a name="l00942"></a><span class="lineno">  942</span> <span class="comment">//     try{</span></div>
-<div class="line"><a name="l00943"></a><span class="lineno">  943</span> <span class="comment">//       if(verbose)</span></div>
-<div class="line"><a name="l00944"></a><span class="lineno">  944</span> <span class="comment">//         std::cout << "writing line " << y/down << std::endl;</span></div>
-<div class="line"><a name="l00945"></a><span class="lineno">  945</span> <span class="comment">//       for(int v=0;v<scale*3;++v)</span></div>
-<div class="line"><a name="l00946"></a><span class="lineno">  946</span> <span class="comment">//         output.writeData(outBuffer[v],GDT_Float32,y/down,v);</span></div>
-<div class="line"><a name="l00947"></a><span class="lineno">  947</span> <span class="comment">//     }</span></div>
-<div class="line"><a name="l00948"></a><span class="lineno">  948</span> <span class="comment">//     catch(std::string errorstring){</span></div>
-<div class="line"><a name="l00949"></a><span class="lineno">  949</span> <span class="comment">//       std::cerr << errorstring << "in band " << iband << ", line " << y << std::endl;</span></div>
-<div class="line"><a name="l00950"></a><span class="lineno">  950</span> <span class="comment">//     }</span></div>
-<div class="line"><a name="l00951"></a><span class="lineno">  951</span> <span class="comment">//     progress=(1.0+y)/output.nrOfRow();</span></div>
-<div class="line"><a name="l00952"></a><span class="lineno">  952</span> <span class="comment">//     pfnProgress(progress,pszMessage,pProgressArg);</span></div>
-<div class="line"><a name="l00953"></a><span class="lineno">  953</span> <span class="comment">//   }</span></div>
-<div class="line"><a name="l00954"></a><span class="lineno">  954</span> <span class="comment">//   input.close();</span></div>
-<div class="line"><a name="l00955"></a><span class="lineno">  955</span> <span class="comment">//   output.close();</span></div>
-<div class="line"><a name="l00956"></a><span class="lineno">  956</span> <span class="comment">// }</span></div>
-<div class="line"><a name="l00957"></a><span class="lineno">  957</span> </div>
-<div class="line"><a name="l00958"></a><span class="lineno">  958</span> <span class="keywordtype">void</span> filter2d::Filter2d::morphology(<span class="keyword">const</span> <a class="code" href="classImgReaderGdal.html">ImgReaderGdal</a>& input, <a class="code" href="classImgWriterGdal.html">ImgWriterGdal</a>& output, <span class="keyword">const</span> std::string& method, <span class="keywordtype">int</span> dimX, <span class="keywordtype">int</span> dimY, <span cla [...]
-<div class="line"><a name="l00959"></a><span class="lineno">  959</span> {</div>
-<div class="line"><a name="l00960"></a><span class="lineno">  960</span>   <span class="keyword">const</span> <span class="keywordtype">char</span>* pszMessage;</div>
-<div class="line"><a name="l00961"></a><span class="lineno">  961</span>   <span class="keywordtype">void</span>* pProgressArg=NULL;</div>
-<div class="line"><a name="l00962"></a><span class="lineno">  962</span>   GDALProgressFunc pfnProgress=GDALTermProgress;</div>
-<div class="line"><a name="l00963"></a><span class="lineno">  963</span>   <span class="keywordtype">double</span> progress=0;</div>
-<div class="line"><a name="l00964"></a><span class="lineno">  964</span>   pfnProgress(progress,pszMessage,pProgressArg);</div>
-<div class="line"><a name="l00965"></a><span class="lineno">  965</span> </div>
-<div class="line"><a name="l00966"></a><span class="lineno">  966</span>   assert(dimX);</div>
-<div class="line"><a name="l00967"></a><span class="lineno">  967</span>   assert(dimY);</div>
-<div class="line"><a name="l00968"></a><span class="lineno">  968</span> </div>
-<div class="line"><a name="l00969"></a><span class="lineno">  969</span>   <a class="code" href="classstatfactory_1_1StatFactory.html">statfactory::StatFactory</a> stat;</div>
-<div class="line"><a name="l00970"></a><span class="lineno">  970</span>   <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iband=0;iband<input.nrOfBand();++iband){</div>
-<div class="line"><a name="l00971"></a><span class="lineno">  971</span>     <a class="code" href="classVector2d.html">Vector2d<double></a> inBuffer(dimY,input.nrOfCol());</div>
-<div class="line"><a name="l00972"></a><span class="lineno">  972</span>     std::vector<double> outBuffer(input.nrOfCol());</div>
-<div class="line"><a name="l00973"></a><span class="lineno">  973</span>     <span class="keywordtype">int</span> indexI=0;</div>
-<div class="line"><a name="l00974"></a><span class="lineno">  974</span>     <span class="keywordtype">int</span> indexJ=0;</div>
-<div class="line"><a name="l00975"></a><span class="lineno">  975</span>     <span class="comment">//initialize last half of inBuffer</span></div>
-<div class="line"><a name="l00976"></a><span class="lineno">  976</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> j=-(dimY-1)/2;j<=dimY/2;++j){</div>
-<div class="line"><a name="l00977"></a><span class="lineno">  977</span>       <span class="keywordflow">try</span>{</div>
-<div class="line"><a name="l00978"></a><span class="lineno">  978</span>     input.readData(inBuffer[indexJ],GDT_Float64,abs(j),iband);</div>
-<div class="line"><a name="l00979"></a><span class="lineno">  979</span>     ++indexJ;</div>
-<div class="line"><a name="l00980"></a><span class="lineno">  980</span>       }</div>
-<div class="line"><a name="l00981"></a><span class="lineno">  981</span>       <span class="keywordflow">catch</span>(std::string errorstring){</div>
-<div class="line"><a name="l00982"></a><span class="lineno">  982</span>     std::cerr << errorstring << <span class="stringliteral">"in line "</span> << indexJ << std::endl;</div>
-<div class="line"><a name="l00983"></a><span class="lineno">  983</span>       }</div>
-<div class="line"><a name="l00984"></a><span class="lineno">  984</span>     }</div>
-<div class="line"><a name="l00985"></a><span class="lineno">  985</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> y=0;y<input.nrOfRow();++y){</div>
-<div class="line"><a name="l00986"></a><span class="lineno">  986</span>       <span class="keywordflow">if</span>(y){<span class="comment">//inBuffer already initialized for y=0</span></div>
-<div class="line"><a name="l00987"></a><span class="lineno">  987</span>     <span class="comment">//erase first line from inBuffer</span></div>
-<div class="line"><a name="l00988"></a><span class="lineno">  988</span>     <span class="keywordflow">if</span>(dimY>1)</div>
-<div class="line"><a name="l00989"></a><span class="lineno">  989</span>       inBuffer.erase(inBuffer.begin());</div>
-<div class="line"><a name="l00990"></a><span class="lineno">  990</span>     <span class="comment">//read extra line and push back to inBuffer if not out of bounds</span></div>
-<div class="line"><a name="l00991"></a><span class="lineno">  991</span>     <span class="keywordflow">if</span>(y+dimY/2<input.nrOfRow()){</div>
-<div class="line"><a name="l00992"></a><span class="lineno">  992</span>       <span class="comment">//allocate buffer</span></div>
-<div class="line"><a name="l00993"></a><span class="lineno">  993</span>       <span class="keywordflow">if</span>(dimY>1)</div>
-<div class="line"><a name="l00994"></a><span class="lineno">  994</span>         inBuffer.push_back(inBuffer.back());</div>
-<div class="line"><a name="l00995"></a><span class="lineno">  995</span>       <span class="keywordflow">try</span>{</div>
-<div class="line"><a name="l00996"></a><span class="lineno">  996</span>             input.readData(inBuffer[inBuffer.size()-1],GDT_Float64,y+dimY/2,iband);</div>
-<div class="line"><a name="l00997"></a><span class="lineno">  997</span>       }</div>
-<div class="line"><a name="l00998"></a><span class="lineno">  998</span>       <span class="keywordflow">catch</span>(std::string errorstring){</div>
-<div class="line"><a name="l00999"></a><span class="lineno">  999</span>         std::cerr << errorstring << <span class="stringliteral">"in band "</span> << iband << <span class="stringliteral">", line "</span> << y << std::endl;</div>
-<div class="line"><a name="l01000"></a><span class="lineno"> 1000</span>       }</div>
-<div class="line"><a name="l01001"></a><span class="lineno"> 1001</span>     }</div>
-<div class="line"><a name="l01002"></a><span class="lineno"> 1002</span>         <span class="keywordflow">else</span>{</div>
-<div class="line"><a name="l01003"></a><span class="lineno"> 1003</span>           <span class="keywordtype">int</span> over=y+dimY/2-input.nrOfRow();</div>
-<div class="line"><a name="l01004"></a><span class="lineno"> 1004</span>           <span class="keywordtype">int</span> index=(inBuffer.size()-1)-over;</div>
-<div class="line"><a name="l01005"></a><span class="lineno"> 1005</span>           assert(index>=0);</div>
-<div class="line"><a name="l01006"></a><span class="lineno"> 1006</span>           assert(index<inBuffer.size());</div>
-<div class="line"><a name="l01007"></a><span class="lineno"> 1007</span>           inBuffer.push_back(inBuffer[index]);</div>
-<div class="line"><a name="l01008"></a><span class="lineno"> 1008</span>         }</div>
+<div class="line"><a name="l00710"></a><span class="lineno">  710</span> <span class="comment">//beta[classTo][classFrom]</span></div>
+<div class="line"><a name="l00711"></a><span class="lineno">  711</span> <span class="keywordtype">void</span> filter2d::Filter2d::mrf(<span class="keyword">const</span> <a class="code" href="classImgReaderGdal.html">ImgReaderGdal</a>& input, <a class="code" href="classImgWriterGdal.html">ImgWriterGdal</a>& output, <span class="keywordtype">int</span> dimX, <span class="keywordtype">int</span> dimY, <a class="code" href="classVector2d.html">Vector2d<double></a> beta, < [...]
+<div class="line"><a name="l00712"></a><span class="lineno">  712</span> {</div>
+<div class="line"><a name="l00713"></a><span class="lineno">  713</span>   <span class="keyword">const</span> <span class="keywordtype">char</span>* pszMessage;</div>
+<div class="line"><a name="l00714"></a><span class="lineno">  714</span>   <span class="keywordtype">void</span>* pProgressArg=NULL;</div>
+<div class="line"><a name="l00715"></a><span class="lineno">  715</span>   GDALProgressFunc pfnProgress=GDALTermProgress;</div>
+<div class="line"><a name="l00716"></a><span class="lineno">  716</span>   <span class="keywordtype">double</span> progress=0;</div>
+<div class="line"><a name="l00717"></a><span class="lineno">  717</span>   pfnProgress(progress,pszMessage,pProgressArg);</div>
+<div class="line"><a name="l00718"></a><span class="lineno">  718</span> </div>
+<div class="line"><a name="l00719"></a><span class="lineno">  719</span>   assert(dimX);</div>
+<div class="line"><a name="l00720"></a><span class="lineno">  720</span>   assert(dimY);</div>
+<div class="line"><a name="l00721"></a><span class="lineno">  721</span> </div>
+<div class="line"><a name="l00722"></a><span class="lineno">  722</span>   <a class="code" href="classVector2d.html">Vector2d<short></a> inBuffer(dimY,input.nrOfCol());</div>
+<div class="line"><a name="l00723"></a><span class="lineno">  723</span>   <a class="code" href="classVector2d.html">Vector2d<double></a> outBuffer(m_class.size(),(input.nrOfCol()+down-1)/down);</div>
+<div class="line"><a name="l00724"></a><span class="lineno">  724</span>   assert(input.nrOfBand()==1);</div>
+<div class="line"><a name="l00725"></a><span class="lineno">  725</span>   assert(output.nrOfBand()==m_class.size());</div>
+<div class="line"><a name="l00726"></a><span class="lineno">  726</span>   assert(m_class.size()>1);</div>
+<div class="line"><a name="l00727"></a><span class="lineno">  727</span>   assert(beta.size()==m_class.size());</div>
+<div class="line"><a name="l00728"></a><span class="lineno">  728</span>   <span class="keywordtype">int</span> indexI=0;</div>
+<div class="line"><a name="l00729"></a><span class="lineno">  729</span>   <span class="keywordtype">int</span> indexJ=0;</div>
+<div class="line"><a name="l00730"></a><span class="lineno">  730</span>   <span class="comment">//initialize last half of inBuffer</span></div>
+<div class="line"><a name="l00731"></a><span class="lineno">  731</span>   <span class="keywordflow">for</span>(<span class="keywordtype">int</span> j=-(dimY-1)/2;j<=dimY/2;++j){</div>
+<div class="line"><a name="l00732"></a><span class="lineno">  732</span>     <span class="keywordflow">try</span>{</div>
+<div class="line"><a name="l00733"></a><span class="lineno">  733</span>       input.readData(inBuffer[indexJ],GDT_Int16,abs(j));</div>
+<div class="line"><a name="l00734"></a><span class="lineno">  734</span>     }</div>
+<div class="line"><a name="l00735"></a><span class="lineno">  735</span>     <span class="keywordflow">catch</span>(std::string errorstring){</div>
+<div class="line"><a name="l00736"></a><span class="lineno">  736</span>       std::cerr << errorstring << <span class="stringliteral">"in line "</span> << indexJ << std::endl;</div>
+<div class="line"><a name="l00737"></a><span class="lineno">  737</span>     }</div>
+<div class="line"><a name="l00738"></a><span class="lineno">  738</span>     ++indexJ;</div>
+<div class="line"><a name="l00739"></a><span class="lineno">  739</span>   }</div>
+<div class="line"><a name="l00740"></a><span class="lineno">  740</span>   <span class="keywordflow">for</span>(<span class="keywordtype">int</span> y=0;y<input.nrOfRow();++y){</div>
+<div class="line"><a name="l00741"></a><span class="lineno">  741</span>     <span class="keywordflow">if</span>(y){<span class="comment">//inBuffer already initialized for y=0</span></div>
+<div class="line"><a name="l00742"></a><span class="lineno">  742</span>       <span class="comment">//erase first line from inBuffer</span></div>
+<div class="line"><a name="l00743"></a><span class="lineno">  743</span>       <span class="keywordflow">if</span>(dimY>1)</div>
+<div class="line"><a name="l00744"></a><span class="lineno">  744</span>     inBuffer.erase(inBuffer.begin());</div>
+<div class="line"><a name="l00745"></a><span class="lineno">  745</span>       <span class="comment">//read extra line and push back to inBuffer if not out of bounds</span></div>
+<div class="line"><a name="l00746"></a><span class="lineno">  746</span>       <span class="keywordflow">if</span>(y+dimY/2<input.nrOfRow()){</div>
+<div class="line"><a name="l00747"></a><span class="lineno">  747</span>         <span class="comment">//allocate buffer</span></div>
+<div class="line"><a name="l00748"></a><span class="lineno">  748</span>     <span class="keywordflow">if</span>(dimY>1)</div>
+<div class="line"><a name="l00749"></a><span class="lineno">  749</span>       inBuffer.push_back(inBuffer.back());</div>
+<div class="line"><a name="l00750"></a><span class="lineno">  750</span>         <span class="keywordflow">try</span>{</div>
+<div class="line"><a name="l00751"></a><span class="lineno">  751</span>           input.readData(inBuffer[inBuffer.size()-1],GDT_Int16,y+dimY/2);</div>
+<div class="line"><a name="l00752"></a><span class="lineno">  752</span>         }</div>
+<div class="line"><a name="l00753"></a><span class="lineno">  753</span>         <span class="keywordflow">catch</span>(std::string errorstring){</div>
+<div class="line"><a name="l00754"></a><span class="lineno">  754</span>           std::cerr << errorstring << <span class="stringliteral">"in line "</span> << y << std::endl;</div>
+<div class="line"><a name="l00755"></a><span class="lineno">  755</span>         }</div>
+<div class="line"><a name="l00756"></a><span class="lineno">  756</span>       }</div>
+<div class="line"><a name="l00757"></a><span class="lineno">  757</span>       <span class="keywordflow">else</span>{</div>
+<div class="line"><a name="l00758"></a><span class="lineno">  758</span>         <span class="keywordtype">int</span> over=y+dimY/2-input.nrOfRow();</div>
+<div class="line"><a name="l00759"></a><span class="lineno">  759</span>         <span class="keywordtype">int</span> index=(inBuffer.size()-1)-over;</div>
+<div class="line"><a name="l00760"></a><span class="lineno">  760</span>         assert(index>=0);</div>
+<div class="line"><a name="l00761"></a><span class="lineno">  761</span>         assert(index<inBuffer.size());</div>
+<div class="line"><a name="l00762"></a><span class="lineno">  762</span>         inBuffer.push_back(inBuffer[index]);</div>
+<div class="line"><a name="l00763"></a><span class="lineno">  763</span>       }</div>
+<div class="line"><a name="l00764"></a><span class="lineno">  764</span>     }</div>
+<div class="line"><a name="l00765"></a><span class="lineno">  765</span>     <span class="keywordflow">if</span>((y+1+down/2)%down)</div>
+<div class="line"><a name="l00766"></a><span class="lineno">  766</span>       <span class="keywordflow">continue</span>;</div>
+<div class="line"><a name="l00767"></a><span class="lineno">  767</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> x=0;x<input.nrOfCol();++x){</div>
+<div class="line"><a name="l00768"></a><span class="lineno">  768</span>       <span class="keywordflow">if</span>((x+1+down/2)%down)</div>
+<div class="line"><a name="l00769"></a><span class="lineno">  769</span>         <span class="keywordflow">continue</span>;</div>
+<div class="line"><a name="l00770"></a><span class="lineno">  770</span>       std::vector<short> potential(m_class.size());</div>
+<div class="line"><a name="l00771"></a><span class="lineno">  771</span>       <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iclass=0;iclass<m_class.size();++iclass){</div>
+<div class="line"><a name="l00772"></a><span class="lineno">  772</span>         potential[iclass]=0;</div>
+<div class="line"><a name="l00773"></a><span class="lineno">  773</span>         outBuffer[iclass][x/down]=0;</div>
+<div class="line"><a name="l00774"></a><span class="lineno">  774</span>       }</div>
+<div class="line"><a name="l00775"></a><span class="lineno">  775</span>       std::vector<double> windowBuffer;</div>
+<div class="line"><a name="l00776"></a><span class="lineno">  776</span>       <span class="keywordtype">int</span> centre=dimX*(dimY-1)/2+(dimX-1)/2;</div>
+<div class="line"><a name="l00777"></a><span class="lineno">  777</span>       <span class="keywordflow">for</span>(<span class="keywordtype">int</span> j=-(dimY-1)/2;j<=dimY/2;++j){</div>
+<div class="line"><a name="l00778"></a><span class="lineno">  778</span>         <span class="keywordflow">for</span>(<span class="keywordtype">int</span> i=-(dimX-1)/2;i<=dimX/2;++i){</div>
+<div class="line"><a name="l00779"></a><span class="lineno">  779</span>           <span class="keywordflow">if</span>(i!=0&&j!=0&&!eightConnectivity)</div>
+<div class="line"><a name="l00780"></a><span class="lineno">  780</span>             <span class="keywordflow">continue</span>;</div>
+<div class="line"><a name="l00781"></a><span class="lineno">  781</span>           <span class="keywordflow">if</span>(i==0&&j==0)</div>
+<div class="line"><a name="l00782"></a><span class="lineno">  782</span>             <span class="keywordflow">continue</span>;</div>
+<div class="line"><a name="l00783"></a><span class="lineno">  783</span>           indexI=x+i;</div>
+<div class="line"><a name="l00784"></a><span class="lineno">  784</span>           <span class="comment">//check if out of bounds</span></div>
+<div class="line"><a name="l00785"></a><span class="lineno">  785</span>           <span class="keywordflow">if</span>(indexI<0)</div>
+<div class="line"><a name="l00786"></a><span class="lineno">  786</span>             indexI=-indexI;</div>
+<div class="line"><a name="l00787"></a><span class="lineno">  787</span>           <span class="keywordflow">else</span> <span class="keywordflow">if</span>(indexI>=input.nrOfCol())</div>
+<div class="line"><a name="l00788"></a><span class="lineno">  788</span>             indexI=input.nrOfCol()-i;</div>
+<div class="line"><a name="l00789"></a><span class="lineno">  789</span>           <span class="keywordflow">if</span>(y+j<0)</div>
+<div class="line"><a name="l00790"></a><span class="lineno">  790</span>             indexJ=-j;</div>
+<div class="line"><a name="l00791"></a><span class="lineno">  791</span>           <span class="keywordflow">else</span> <span class="keywordflow">if</span>(y+j>=input.nrOfRow())</div>
+<div class="line"><a name="l00792"></a><span class="lineno">  792</span>             indexJ=(dimY>2) ? (dimY-1)/2-j : 0;</div>
+<div class="line"><a name="l00793"></a><span class="lineno">  793</span>           <span class="keywordflow">else</span></div>
+<div class="line"><a name="l00794"></a><span class="lineno">  794</span>             indexJ=(dimY-1)/2+j;</div>
+<div class="line"><a name="l00795"></a><span class="lineno">  795</span>           <span class="keywordtype">bool</span> masked=<span class="keyword">false</span>;</div>
+<div class="line"><a name="l00796"></a><span class="lineno">  796</span>           <span class="keywordflow">for</span>(<span class="keywordtype">int</span> imask=0;imask<m_noDataValues.size();++imask){</div>
+<div class="line"><a name="l00797"></a><span class="lineno">  797</span>             <span class="keywordflow">if</span>(inBuffer[indexJ][indexI]==m_noDataValues[imask]){</div>
+<div class="line"><a name="l00798"></a><span class="lineno">  798</span>               masked=<span class="keyword">true</span>;</div>
+<div class="line"><a name="l00799"></a><span class="lineno">  799</span>               <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l00800"></a><span class="lineno">  800</span>             }</div>
+<div class="line"><a name="l00801"></a><span class="lineno">  801</span>           }</div>
+<div class="line"><a name="l00802"></a><span class="lineno">  802</span>           <span class="keywordflow">if</span>(!masked){</div>
+<div class="line"><a name="l00803"></a><span class="lineno">  803</span>             <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iclass=0;iclass<m_class.size();++iclass){</div>
+<div class="line"><a name="l00804"></a><span class="lineno">  804</span>               <span class="keywordflow">if</span>(inBuffer[indexJ][indexI]==m_class[iclass])</div>
+<div class="line"><a name="l00805"></a><span class="lineno">  805</span>                 potential[iclass]+=1;</div>
+<div class="line"><a name="l00806"></a><span class="lineno">  806</span>             }</div>
+<div class="line"><a name="l00807"></a><span class="lineno">  807</span>           }</div>
+<div class="line"><a name="l00808"></a><span class="lineno">  808</span>         }</div>
+<div class="line"><a name="l00809"></a><span class="lineno">  809</span>       }</div>
+<div class="line"><a name="l00810"></a><span class="lineno">  810</span>       <span class="keywordtype">double</span> norm=0;</div>
+<div class="line"><a name="l00811"></a><span class="lineno">  811</span>       <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iclass1=0;iclass1<m_class.size();++iclass1){</div>
+<div class="line"><a name="l00812"></a><span class="lineno">  812</span>     assert(beta[iclass1].size()==m_class.size());</div>
+<div class="line"><a name="l00813"></a><span class="lineno">  813</span>         <span class="keywordtype">double</span> pot=0;</div>
+<div class="line"><a name="l00814"></a><span class="lineno">  814</span>         <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iclass2=0;iclass2<m_class.size();++iclass2)</div>
+<div class="line"><a name="l00815"></a><span class="lineno">  815</span>       <span class="keywordflow">if</span>(iclass2!=iclass1)</div>
+<div class="line"><a name="l00816"></a><span class="lineno">  816</span>         pot+=potential[iclass2]*beta[iclass1][iclass2];</div>
+<div class="line"><a name="l00817"></a><span class="lineno">  817</span>         <span class="keywordtype">double</span> prior=exp(-pot);</div>
+<div class="line"><a name="l00818"></a><span class="lineno">  818</span>         outBuffer[iclass1][x/down]=prior;</div>
+<div class="line"><a name="l00819"></a><span class="lineno">  819</span>         norm+=prior;</div>
+<div class="line"><a name="l00820"></a><span class="lineno">  820</span>       }</div>
+<div class="line"><a name="l00821"></a><span class="lineno">  821</span>       <span class="keywordflow">if</span>(norm){</div>
+<div class="line"><a name="l00822"></a><span class="lineno">  822</span>         <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iclass1=0;iclass1<m_class.size();++iclass1)</div>
+<div class="line"><a name="l00823"></a><span class="lineno">  823</span>           outBuffer[iclass1][x/down]/=norm;</div>
+<div class="line"><a name="l00824"></a><span class="lineno">  824</span>       }</div>
+<div class="line"><a name="l00825"></a><span class="lineno">  825</span>     }</div>
+<div class="line"><a name="l00826"></a><span class="lineno">  826</span>     progress=(1.0+y/down)/output.nrOfRow();</div>
+<div class="line"><a name="l00827"></a><span class="lineno">  827</span>     pfnProgress(progress,pszMessage,pProgressArg);</div>
+<div class="line"><a name="l00828"></a><span class="lineno">  828</span>     <span class="comment">//write outBuffer to file</span></div>
+<div class="line"><a name="l00829"></a><span class="lineno">  829</span>     assert(outBuffer.size()==m_class.size());</div>
+<div class="line"><a name="l00830"></a><span class="lineno">  830</span>     assert(y<output.nrOfRow());</div>
+<div class="line"><a name="l00831"></a><span class="lineno">  831</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iclass=0;iclass<m_class.size();++iclass){</div>
+<div class="line"><a name="l00832"></a><span class="lineno">  832</span>       assert(outBuffer[iclass].size()==output.nrOfCol());</div>
+<div class="line"><a name="l00833"></a><span class="lineno">  833</span>       <span class="keywordflow">try</span>{</div>
+<div class="line"><a name="l00834"></a><span class="lineno">  834</span>         output.writeData(outBuffer[iclass],GDT_Float64,y/down,iclass);</div>
+<div class="line"><a name="l00835"></a><span class="lineno">  835</span>       }</div>
+<div class="line"><a name="l00836"></a><span class="lineno">  836</span>       <span class="keywordflow">catch</span>(std::string errorstring){</div>
+<div class="line"><a name="l00837"></a><span class="lineno">  837</span>         std::cerr << errorstring << <span class="stringliteral">"in class "</span> << iclass << <span class="stringliteral">", line "</span> << y << std::endl;</div>
+<div class="line"><a name="l00838"></a><span class="lineno">  838</span>       }</div>
+<div class="line"><a name="l00839"></a><span class="lineno">  839</span>     }</div>
+<div class="line"><a name="l00840"></a><span class="lineno">  840</span>   }</div>
+<div class="line"><a name="l00841"></a><span class="lineno">  841</span> }</div>
+<div class="line"><a name="l00842"></a><span class="lineno">  842</span> </div>
+<div class="line"><a name="l00843"></a><span class="lineno">  843</span> <span class="keywordtype">void</span> filter2d::Filter2d::shift(<span class="keyword">const</span> <a class="code" href="classImgReaderGdal.html">ImgReaderGdal</a>& input, <a class="code" href="classImgWriterGdal.html">ImgWriterGdal</a>& output, <span class="keywordtype">double</span> offsetX, <span class="keywordtype">double</span> offsetY, <span class="keywordtype">double</span> randomSigma, RESAMPLE  [...]
+<div class="line"><a name="l00844"></a><span class="lineno">  844</span> {</div>
+<div class="line"><a name="l00845"></a><span class="lineno">  845</span>   assert(input.nrOfCol()==output.nrOfCol());</div>
+<div class="line"><a name="l00846"></a><span class="lineno">  846</span>   assert(input.nrOfRow()==output.nrOfRow());</div>
+<div class="line"><a name="l00847"></a><span class="lineno">  847</span>   assert(input.nrOfBand()==output.nrOfBand());</div>
+<div class="line"><a name="l00848"></a><span class="lineno">  848</span>   <span class="keyword">const</span> <span class="keywordtype">char</span>* pszMessage;</div>
+<div class="line"><a name="l00849"></a><span class="lineno">  849</span>   <span class="keywordtype">void</span>* pProgressArg=NULL;</div>
+<div class="line"><a name="l00850"></a><span class="lineno">  850</span>   GDALProgressFunc pfnProgress=GDALTermProgress;</div>
+<div class="line"><a name="l00851"></a><span class="lineno">  851</span>   <span class="keywordtype">double</span> progress=0;</div>
+<div class="line"><a name="l00852"></a><span class="lineno">  852</span>   pfnProgress(progress,pszMessage,pProgressArg);</div>
+<div class="line"><a name="l00853"></a><span class="lineno">  853</span>   <span class="comment">//process band per band in memory</span></div>
+<div class="line"><a name="l00854"></a><span class="lineno">  854</span>   <a class="code" href="classVector2d.html">Vector2d<double></a> inBuffer(input.nrOfRow(),output.nrOfCol());</div>
+<div class="line"><a name="l00855"></a><span class="lineno">  855</span>   <a class="code" href="classVector2d.html">Vector2d<double></a> outBuffer(input.nrOfRow(),output.nrOfCol());</div>
+<div class="line"><a name="l00856"></a><span class="lineno">  856</span>   <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iband=0;iband<input.nrOfBand();++iband){</div>
+<div class="line"><a name="l00857"></a><span class="lineno">  857</span>     input.readDataBlock(inBuffer,GDT_Float64,0,inBuffer.nCols()-1,0,inBuffer.nRows()-1,iband);</div>
+<div class="line"><a name="l00858"></a><span class="lineno">  858</span>     shift(inBuffer,outBuffer,offsetX,offsetY,randomSigma,resample,verbose);</div>
+<div class="line"><a name="l00859"></a><span class="lineno">  859</span>     output.writeDataBlock(outBuffer,GDT_Float64,0,outBuffer.nCols()-1,0,outBuffer.nRows()-1,iband);</div>
+<div class="line"><a name="l00860"></a><span class="lineno">  860</span>   }</div>
+<div class="line"><a name="l00861"></a><span class="lineno">  861</span> }</div>
+<div class="line"><a name="l00862"></a><span class="lineno">  862</span> </div>
+<div class="line"><a name="l00863"></a><span class="lineno">  863</span> <span class="comment">//todo: re-implement without dependency of CImg and reg libraries</span></div>
+<div class="line"><a name="l00864"></a><span class="lineno">  864</span> <span class="comment">// void filter2d::Filter2d::dwt_texture(const std::string& inputFilename, const std::string& outputFilename,int dim, int scale, int down, int iband, bool verbose)</span></div>
+<div class="line"><a name="l00865"></a><span class="lineno">  865</span> <span class="comment">// {</span></div>
+<div class="line"><a name="l00866"></a><span class="lineno">  866</span> <span class="comment">//   ImgReaderGdal input;</span></div>
+<div class="line"><a name="l00867"></a><span class="lineno">  867</span> <span class="comment">//   ImgWriterGdal output;</span></div>
+<div class="line"><a name="l00868"></a><span class="lineno">  868</span> <span class="comment">//   if(verbose)</span></div>
+<div class="line"><a name="l00869"></a><span class="lineno">  869</span> <span class="comment">//     std::cout << "opening file " << inputFilename << std::endl;</span></div>
+<div class="line"><a name="l00870"></a><span class="lineno">  870</span> <span class="comment">//   input.open(inputFilename);</span></div>
+<div class="line"><a name="l00871"></a><span class="lineno">  871</span> <span class="comment">//   double magicX=1,magicY=1;</span></div>
+<div class="line"><a name="l00872"></a><span class="lineno">  872</span> <span class="comment">//   output.open(outputFilename,(input.nrOfCol()+down-1)/down,(input.nrOfRow()+down-1)/down,scale*3,GDT_Float32,input.getImageType());</span></div>
+<div class="line"><a name="l00873"></a><span class="lineno">  873</span> <span class="comment">//   if(input.isGeoRef()){</span></div>
+<div class="line"><a name="l00874"></a><span class="lineno">  874</span> <span class="comment">//     output.setProjection(input.getProjection());</span></div>
+<div class="line"><a name="l00875"></a><span class="lineno">  875</span> <span class="comment">//     output.copyGeoTransform(input);</span></div>
+<div class="line"><a name="l00876"></a><span class="lineno">  876</span> <span class="comment">//   }</span></div>
+<div class="line"><a name="l00877"></a><span class="lineno">  877</span> <span class="comment">//   if(verbose)</span></div>
+<div class="line"><a name="l00878"></a><span class="lineno">  878</span> <span class="comment">//     std::cout << "Dimension texture (row x col x band) = " << (input.nrOfCol()+down-1)/down << " x " << (input.nrOfRow()+down-1)/down << " x " << scale*3 << std::endl;</span></div>
+<div class="line"><a name="l00879"></a><span class="lineno">  879</span> <span class="comment">//   assert(dim%2);</span></div>
+<div class="line"><a name="l00880"></a><span class="lineno">  880</span> <span class="comment">//   int dimX=dim;</span></div>
+<div class="line"><a name="l00881"></a><span class="lineno">  881</span> <span class="comment">//   int dimY=dim;</span></div>
+<div class="line"><a name="l00882"></a><span class="lineno">  882</span> <span class="comment">//   Vector2d<float> inBuffer(dimY,input.nrOfCol());</span></div>
+<div class="line"><a name="l00883"></a><span class="lineno">  883</span> <span class="comment">//   Vector2d<float> outBuffer(scale*3,(input.nrOfCol()+down-1)/down);</span></div>
+<div class="line"><a name="l00884"></a><span class="lineno">  884</span> <span class="comment">//   //initialize last half of inBuffer</span></div>
+<div class="line"><a name="l00885"></a><span class="lineno">  885</span> <span class="comment">//   int indexI=0;</span></div>
+<div class="line"><a name="l00886"></a><span class="lineno">  886</span> <span class="comment">//   int indexJ=0;</span></div>
+<div class="line"><a name="l00887"></a><span class="lineno">  887</span> <span class="comment">//   for(int j=-dimY/2;j<(dimY+1)/2;++j){</span></div>
+<div class="line"><a name="l00888"></a><span class="lineno">  888</span> <span class="comment">//     try{</span></div>
+<div class="line"><a name="l00889"></a><span class="lineno">  889</span> <span class="comment">//       if(verbose)</span></div>
+<div class="line"><a name="l00890"></a><span class="lineno">  890</span> <span class="comment">//  cout << "reading input line " << abs(j) << std::endl;</span></div>
+<div class="line"><a name="l00891"></a><span class="lineno">  891</span> <span class="comment">//       input.readData(inBuffer[indexJ],GDT_Float32,abs(j),iband);</span></div>
+<div class="line"><a name="l00892"></a><span class="lineno">  892</span> <span class="comment">//       ++indexJ;</span></div>
+<div class="line"><a name="l00893"></a><span class="lineno">  893</span> <span class="comment">//     }</span></div>
+<div class="line"><a name="l00894"></a><span class="lineno">  894</span> <span class="comment">//     catch(std::string errorstring){</span></div>
+<div class="line"><a name="l00895"></a><span class="lineno">  895</span> <span class="comment">//       std::cerr << errorstring << "in band " << iband << ", line " << indexJ << std::endl;</span></div>
+<div class="line"><a name="l00896"></a><span class="lineno">  896</span> <span class="comment">//     }</span></div>
+<div class="line"><a name="l00897"></a><span class="lineno">  897</span> <span class="comment">//   }</span></div>
+<div class="line"><a name="l00898"></a><span class="lineno">  898</span> <span class="comment">//   const char* pszMessage;</span></div>
+<div class="line"><a name="l00899"></a><span class="lineno">  899</span> <span class="comment">//   void* pProgressArg=NULL;</span></div>
+<div class="line"><a name="l00900"></a><span class="lineno">  900</span> <span class="comment">//   GDALProgressFunc pfnProgress=GDALTermProgress;</span></div>
+<div class="line"><a name="l00901"></a><span class="lineno">  901</span> <span class="comment">//   double progress=0;</span></div>
+<div class="line"><a name="l00902"></a><span class="lineno">  902</span> <span class="comment">//   pfnProgress(progress,pszMessage,pProgressArg);</span></div>
+<div class="line"><a name="l00903"></a><span class="lineno">  903</span> <span class="comment">//   for(int y=0;y<input.nrOfRow();y+=down){</span></div>
+<div class="line"><a name="l00904"></a><span class="lineno">  904</span> <span class="comment">//     if(verbose)</span></div>
+<div class="line"><a name="l00905"></a><span class="lineno">  905</span> <span class="comment">//       std::cout << "calculating line " << y/down << std::endl;</span></div>
+<div class="line"><a name="l00906"></a><span class="lineno">  906</span> <span class="comment">//     if(y){//inBuffer already initialized for y=0</span></div>
+<div class="line"><a name="l00907"></a><span class="lineno">  907</span> <span class="comment">//       //erase first line from inBuffer</span></div>
+<div class="line"><a name="l00908"></a><span class="lineno">  908</span> <span class="comment">//       inBuffer.erase(inBuffer.begin());</span></div>
+<div class="line"><a name="l00909"></a><span class="lineno">  909</span> <span class="comment">//       //read extra line and push back to inBuffer if not out of bounds</span></div>
+<div class="line"><a name="l00910"></a><span class="lineno">  910</span> <span class="comment">//       if(y+dimY/2<input.nrOfRow()){</span></div>
+<div class="line"><a name="l00911"></a><span class="lineno">  911</span> <span class="comment">//  //allocate buffer</span></div>
+<div class="line"><a name="l00912"></a><span class="lineno">  912</span> <span class="comment">//  inBuffer.push_back(inBuffer.back());</span></div>
+<div class="line"><a name="l00913"></a><span class="lineno">  913</span> <span class="comment">//  try{</span></div>
+<div class="line"><a name="l00914"></a><span class="lineno">  914</span> <span class="comment">//    if(verbose)</span></div>
+<div class="line"><a name="l00915"></a><span class="lineno">  915</span> <span class="comment">//      std::cout << "reading input line " << y+dimY/2 << std::endl;</span></div>
+<div class="line"><a name="l00916"></a><span class="lineno">  916</span> <span class="comment">//           input.readData(inBuffer[inBuffer.size()-1],GDT_Float32,y+dimY/2,iband);</span></div>
+<div class="line"><a name="l00917"></a><span class="lineno">  917</span> <span class="comment">//  }</span></div>
+<div class="line"><a name="l00918"></a><span class="lineno">  918</span> <span class="comment">//  catch(std::string errorstring){</span></div>
+<div class="line"><a name="l00919"></a><span class="lineno">  919</span> <span class="comment">//    std::cerr << errorstring << "in band " << iband << ", line " << y << std::endl;</span></div>
+<div class="line"><a name="l00920"></a><span class="lineno">  920</span> <span class="comment">//  }</span></div>
+<div class="line"><a name="l00921"></a><span class="lineno">  921</span> <span class="comment">//       }</span></div>
+<div class="line"><a name="l00922"></a><span class="lineno">  922</span> <span class="comment">//     }</span></div>
+<div class="line"><a name="l00923"></a><span class="lineno">  923</span> <span class="comment">//     for(int x=0;x<input.nrOfCol();x+=down){</span></div>
+<div class="line"><a name="l00924"></a><span class="lineno">  924</span> <span class="comment">//       Vector2d<double> texture_feature(scale,3);</span></div>
+<div class="line"><a name="l00925"></a><span class="lineno">  925</span> <span class="comment">//       CImg<> texture_in(dimX,dimY);</span></div>
+<div class="line"><a name="l00926"></a><span class="lineno">  926</span> <span class="comment">//       int r=0;//index for row of texture_in</span></div>
+<div class="line"><a name="l00927"></a><span class="lineno">  927</span> <span class="comment">//       for(int j=-dimY/2;j<(dimY+1)/2;++j){</span></div>
+<div class="line"><a name="l00928"></a><span class="lineno">  928</span> <span class="comment">//  int c=0;</span></div>
+<div class="line"><a name="l00929"></a><span class="lineno">  929</span> <span class="comment">//  for(int i=-dimX/2;i<(dimX+1)/2;++i){</span></div>
+<div class="line"><a name="l00930"></a><span class="lineno">  930</span> <span class="comment">//    indexI=x+i;</span></div>
+<div class="line"><a name="l00931"></a><span class="lineno">  931</span> <span class="comment">//    //check if out of bounds</span></div>
+<div class="line"><a name="l00932"></a><span class="lineno">  932</span> <span class="comment">//    if(indexI<0)</span></div>
+<div class="line"><a name="l00933"></a><span class="lineno">  933</span> <span class="comment">//      indexI=-indexI;</span></div>
+<div class="line"><a name="l00934"></a><span class="lineno">  934</span> <span class="comment">//    else if(indexI>=input.nrOfCol())</span></div>
+<div class="line"><a name="l00935"></a><span class="lineno">  935</span> <span class="comment">//      indexI=input.nrOfCol()-i;</span></div>
+<div class="line"><a name="l00936"></a><span class="lineno">  936</span> <span class="comment">//    if(y+j<0)</span></div>
+<div class="line"><a name="l00937"></a><span class="lineno">  937</span> <span class="comment">//      indexJ=-j;</span></div>
+<div class="line"><a name="l00938"></a><span class="lineno">  938</span> <span class="comment">//    else if(y+j>=input.nrOfRow())</span></div>
+<div class="line"><a name="l00939"></a><span class="lineno">  939</span> <span class="comment">//      indexJ=dimY/2-j;//indexJ=inBuffer.size()-1-j;</span></div>
+<div class="line"><a name="l00940"></a><span class="lineno">  940</span> <span class="comment">//    else</span></div>
+<div class="line"><a name="l00941"></a><span class="lineno">  941</span> <span class="comment">//      indexJ=dimY/2+j;</span></div>
+<div class="line"><a name="l00942"></a><span class="lineno">  942</span> <span class="comment">//    assert(indexJ<inBuffer.size());</span></div>
+<div class="line"><a name="l00943"></a><span class="lineno">  943</span> <span class="comment">//    assert(indexI<inBuffer[indexJ].size());</span></div>
+<div class="line"><a name="l00944"></a><span class="lineno">  944</span> <span class="comment">//    texture_in(r,c)=inBuffer[indexJ][indexI];</span></div>
+<div class="line"><a name="l00945"></a><span class="lineno">  945</span> <span class="comment">//    c++;</span></div>
+<div class="line"><a name="l00946"></a><span class="lineno">  946</span> <span class="comment">//  }</span></div>
+<div class="line"><a name="l00947"></a><span class="lineno">  947</span> <span class="comment">//  ++r;</span></div>
+<div class="line"><a name="l00948"></a><span class="lineno">  948</span> <span class="comment">//       }</span></div>
+<div class="line"><a name="l00949"></a><span class="lineno">  949</span> <span class="comment">//       texture_in.dwt_texture(texture_feature,scale);</span></div>
+<div class="line"><a name="l00950"></a><span class="lineno">  950</span> <span class="comment">//       for(int v=0;v<scale*3;++v)</span></div>
+<div class="line"><a name="l00951"></a><span class="lineno">  951</span> <span class="comment">//  outBuffer[v][x/down]=texture_feature[v/3][v%3];</span></div>
+<div class="line"><a name="l00952"></a><span class="lineno">  952</span> <span class="comment">//     }</span></div>
+<div class="line"><a name="l00953"></a><span class="lineno">  953</span> <span class="comment">//     //write outBuffer to file</span></div>
+<div class="line"><a name="l00954"></a><span class="lineno">  954</span> <span class="comment">//     try{</span></div>
+<div class="line"><a name="l00955"></a><span class="lineno">  955</span> <span class="comment">//       if(verbose)</span></div>
+<div class="line"><a name="l00956"></a><span class="lineno">  956</span> <span class="comment">//         std::cout << "writing line " << y/down << std::endl;</span></div>
+<div class="line"><a name="l00957"></a><span class="lineno">  957</span> <span class="comment">//       for(int v=0;v<scale*3;++v)</span></div>
+<div class="line"><a name="l00958"></a><span class="lineno">  958</span> <span class="comment">//         output.writeData(outBuffer[v],GDT_Float32,y/down,v);</span></div>
+<div class="line"><a name="l00959"></a><span class="lineno">  959</span> <span class="comment">//     }</span></div>
+<div class="line"><a name="l00960"></a><span class="lineno">  960</span> <span class="comment">//     catch(std::string errorstring){</span></div>
+<div class="line"><a name="l00961"></a><span class="lineno">  961</span> <span class="comment">//       std::cerr << errorstring << "in band " << iband << ", line " << y << std::endl;</span></div>
+<div class="line"><a name="l00962"></a><span class="lineno">  962</span> <span class="comment">//     }</span></div>
+<div class="line"><a name="l00963"></a><span class="lineno">  963</span> <span class="comment">//     progress=(1.0+y)/output.nrOfRow();</span></div>
+<div class="line"><a name="l00964"></a><span class="lineno">  964</span> <span class="comment">//     pfnProgress(progress,pszMessage,pProgressArg);</span></div>
+<div class="line"><a name="l00965"></a><span class="lineno">  965</span> <span class="comment">//   }</span></div>
+<div class="line"><a name="l00966"></a><span class="lineno">  966</span> <span class="comment">//   input.close();</span></div>
+<div class="line"><a name="l00967"></a><span class="lineno">  967</span> <span class="comment">//   output.close();</span></div>
+<div class="line"><a name="l00968"></a><span class="lineno">  968</span> <span class="comment">// }</span></div>
+<div class="line"><a name="l00969"></a><span class="lineno">  969</span> </div>
+<div class="line"><a name="l00970"></a><span class="lineno">  970</span> <span class="keywordtype">void</span> filter2d::Filter2d::morphology(<span class="keyword">const</span> <a class="code" href="classImgReaderGdal.html">ImgReaderGdal</a>& input, <a class="code" href="classImgWriterGdal.html">ImgWriterGdal</a>& output, <span class="keyword">const</span> std::string& method, <span class="keywordtype">int</span> dimX, <span class="keywordtype">int</span> dimY, <span cla [...]
+<div class="line"><a name="l00971"></a><span class="lineno">  971</span> {</div>
+<div class="line"><a name="l00972"></a><span class="lineno">  972</span>   <span class="keyword">const</span> <span class="keywordtype">char</span>* pszMessage;</div>
+<div class="line"><a name="l00973"></a><span class="lineno">  973</span>   <span class="keywordtype">void</span>* pProgressArg=NULL;</div>
+<div class="line"><a name="l00974"></a><span class="lineno">  974</span>   GDALProgressFunc pfnProgress=GDALTermProgress;</div>
+<div class="line"><a name="l00975"></a><span class="lineno">  975</span>   <span class="keywordtype">double</span> progress=0;</div>
+<div class="line"><a name="l00976"></a><span class="lineno">  976</span>   pfnProgress(progress,pszMessage,pProgressArg);</div>
+<div class="line"><a name="l00977"></a><span class="lineno">  977</span> </div>
+<div class="line"><a name="l00978"></a><span class="lineno">  978</span>   assert(dimX);</div>
+<div class="line"><a name="l00979"></a><span class="lineno">  979</span>   assert(dimY);</div>
+<div class="line"><a name="l00980"></a><span class="lineno">  980</span> </div>
+<div class="line"><a name="l00981"></a><span class="lineno">  981</span>   <a class="code" href="classstatfactory_1_1StatFactory.html">statfactory::StatFactory</a> stat;</div>
+<div class="line"><a name="l00982"></a><span class="lineno">  982</span>   <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iband=0;iband<input.nrOfBand();++iband){</div>
+<div class="line"><a name="l00983"></a><span class="lineno">  983</span>     <a class="code" href="classVector2d.html">Vector2d<double></a> inBuffer(dimY,input.nrOfCol());</div>
+<div class="line"><a name="l00984"></a><span class="lineno">  984</span>     std::vector<double> outBuffer(input.nrOfCol());</div>
+<div class="line"><a name="l00985"></a><span class="lineno">  985</span>     <span class="keywordtype">int</span> indexI=0;</div>
+<div class="line"><a name="l00986"></a><span class="lineno">  986</span>     <span class="keywordtype">int</span> indexJ=0;</div>
+<div class="line"><a name="l00987"></a><span class="lineno">  987</span>     <span class="comment">//initialize last half of inBuffer</span></div>
+<div class="line"><a name="l00988"></a><span class="lineno">  988</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> j=-(dimY-1)/2;j<=dimY/2;++j){</div>
+<div class="line"><a name="l00989"></a><span class="lineno">  989</span>       <span class="keywordflow">try</span>{</div>
+<div class="line"><a name="l00990"></a><span class="lineno">  990</span>     input.readData(inBuffer[indexJ],GDT_Float64,abs(j),iband);</div>
+<div class="line"><a name="l00991"></a><span class="lineno">  991</span>     ++indexJ;</div>
+<div class="line"><a name="l00992"></a><span class="lineno">  992</span>       }</div>
+<div class="line"><a name="l00993"></a><span class="lineno">  993</span>       <span class="keywordflow">catch</span>(std::string errorstring){</div>
+<div class="line"><a name="l00994"></a><span class="lineno">  994</span>     std::cerr << errorstring << <span class="stringliteral">"in line "</span> << indexJ << std::endl;</div>
+<div class="line"><a name="l00995"></a><span class="lineno">  995</span>       }</div>
+<div class="line"><a name="l00996"></a><span class="lineno">  996</span>     }</div>
+<div class="line"><a name="l00997"></a><span class="lineno">  997</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> y=0;y<input.nrOfRow();++y){</div>
+<div class="line"><a name="l00998"></a><span class="lineno">  998</span>       <span class="keywordflow">if</span>(y){<span class="comment">//inBuffer already initialized for y=0</span></div>
+<div class="line"><a name="l00999"></a><span class="lineno">  999</span>     <span class="comment">//erase first line from inBuffer</span></div>
+<div class="line"><a name="l01000"></a><span class="lineno"> 1000</span>     <span class="keywordflow">if</span>(dimY>1)</div>
+<div class="line"><a name="l01001"></a><span class="lineno"> 1001</span>       inBuffer.erase(inBuffer.begin());</div>
+<div class="line"><a name="l01002"></a><span class="lineno"> 1002</span>     <span class="comment">//read extra line and push back to inBuffer if not out of bounds</span></div>
+<div class="line"><a name="l01003"></a><span class="lineno"> 1003</span>     <span class="keywordflow">if</span>(y+dimY/2<input.nrOfRow()){</div>
+<div class="line"><a name="l01004"></a><span class="lineno"> 1004</span>       <span class="comment">//allocate buffer</span></div>
+<div class="line"><a name="l01005"></a><span class="lineno"> 1005</span>       <span class="keywordflow">if</span>(dimY>1)</div>
+<div class="line"><a name="l01006"></a><span class="lineno"> 1006</span>         inBuffer.push_back(inBuffer.back());</div>
+<div class="line"><a name="l01007"></a><span class="lineno"> 1007</span>       <span class="keywordflow">try</span>{</div>
+<div class="line"><a name="l01008"></a><span class="lineno"> 1008</span>             input.readData(inBuffer[inBuffer.size()-1],GDT_Float64,y+dimY/2,iband);</div>
 <div class="line"><a name="l01009"></a><span class="lineno"> 1009</span>       }</div>
-<div class="line"><a name="l01010"></a><span class="lineno"> 1010</span>       <span class="keywordflow">for</span>(<span class="keywordtype">int</span> x=0;x<input.nrOfCol();++x){</div>
-<div class="line"><a name="l01011"></a><span class="lineno"> 1011</span>         <span class="keywordtype">double</span> currentValue=inBuffer[(dimY-1)/2][x];</div>
-<div class="line"><a name="l01012"></a><span class="lineno"> 1012</span>     outBuffer[x]=currentValue;</div>
-<div class="line"><a name="l01013"></a><span class="lineno"> 1013</span>     std::vector<double> statBuffer;</div>
-<div class="line"><a name="l01014"></a><span class="lineno"> 1014</span>     <span class="keywordtype">bool</span> currentMasked=<span class="keyword">false</span>;</div>
-<div class="line"><a name="l01015"></a><span class="lineno"> 1015</span>         <span class="keywordtype">int</span> centre=dimX*(dimY-1)/2+(dimX-1)/2;</div>
-<div class="line"><a name="l01016"></a><span class="lineno"> 1016</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> imask=0;imask<m_noDataValues.size();++imask){</div>
-<div class="line"><a name="l01017"></a><span class="lineno"> 1017</span>       <span class="keywordflow">if</span>(currentValue==m_noDataValues[imask]){</div>
-<div class="line"><a name="l01018"></a><span class="lineno"> 1018</span>         currentMasked=<span class="keyword">true</span>;</div>
-<div class="line"><a name="l01019"></a><span class="lineno"> 1019</span>         <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l01020"></a><span class="lineno"> 1020</span>       }</div>
-<div class="line"><a name="l01021"></a><span class="lineno"> 1021</span>     }</div>
-<div class="line"><a name="l01022"></a><span class="lineno"> 1022</span>     <span class="keywordflow">if</span>(currentMasked){</div>
-<div class="line"><a name="l01023"></a><span class="lineno"> 1023</span>       outBuffer[x]=currentValue;</div>
-<div class="line"><a name="l01024"></a><span class="lineno"> 1024</span>     }</div>
-<div class="line"><a name="l01025"></a><span class="lineno"> 1025</span>     <span class="keywordflow">else</span>{</div>
-<div class="line"><a name="l01026"></a><span class="lineno"> 1026</span>           <span class="keywordflow">for</span>(<span class="keywordtype">int</span> j=-(dimY-1)/2;j<=dimY/2;++j){</div>
-<div class="line"><a name="l01027"></a><span class="lineno"> 1027</span>             <span class="keywordflow">for</span>(<span class="keywordtype">int</span> i=-(dimX-1)/2;i<=dimX/2;++i){</div>
-<div class="line"><a name="l01028"></a><span class="lineno"> 1028</span>               <span class="keywordtype">double</span> d2=i*i+j*j;<span class="comment">//square distance</span></div>
-<div class="line"><a name="l01029"></a><span class="lineno"> 1029</span>               <span class="keywordflow">if</span>(disc&&(d2>(dimX/2)*(dimY/2)))</div>
-<div class="line"><a name="l01030"></a><span class="lineno"> 1030</span>                 <span class="keywordflow">continue</span>;</div>
-<div class="line"><a name="l01031"></a><span class="lineno"> 1031</span>           <span class="keywordflow">if</span>(angle.size()){</div>
-<div class="line"><a name="l01032"></a><span class="lineno"> 1032</span>             <span class="keywordtype">double</span> theta;</div>
-<div class="line"><a name="l01033"></a><span class="lineno"> 1033</span>         <span class="comment">//use polar coordinates in radians</span></div>
-<div class="line"><a name="l01034"></a><span class="lineno"> 1034</span>             <span class="keywordflow">if</span>(i>0){</div>
-<div class="line"><a name="l01035"></a><span class="lineno"> 1035</span>           <span class="keywordflow">if</span>(j<0)</div>
-<div class="line"><a name="l01036"></a><span class="lineno"> 1036</span>             theta=atan(static_cast<double>(-j)/(static_cast<double>(i)));</div>
-<div class="line"><a name="l01037"></a><span class="lineno"> 1037</span>           <span class="keywordflow">else</span></div>
-<div class="line"><a name="l01038"></a><span class="lineno"> 1038</span>             theta=-atan(static_cast<double>(j)/(static_cast<double>(i)));</div>
-<div class="line"><a name="l01039"></a><span class="lineno"> 1039</span>         }</div>
-<div class="line"><a name="l01040"></a><span class="lineno"> 1040</span>             <span class="keywordflow">else</span> <span class="keywordflow">if</span>(i<0){</div>
-<div class="line"><a name="l01041"></a><span class="lineno"> 1041</span>           <span class="keywordflow">if</span>(j<0)</div>
-<div class="line"><a name="l01042"></a><span class="lineno"> 1042</span>             theta=PI-atan(static_cast<double>(-j)/(static_cast<double>(-i)));</div>
-<div class="line"><a name="l01043"></a><span class="lineno"> 1043</span>           <span class="keywordflow">else</span></div>
-<div class="line"><a name="l01044"></a><span class="lineno"> 1044</span>             theta=PI+atan(static_cast<double>(j)/(static_cast<double>(-i)));</div>
-<div class="line"><a name="l01045"></a><span class="lineno"> 1045</span>         }</div>
-<div class="line"><a name="l01046"></a><span class="lineno"> 1046</span>             <span class="keywordflow">else</span> <span class="keywordflow">if</span>(j<0)</div>
-<div class="line"><a name="l01047"></a><span class="lineno"> 1047</span>               theta=PI/2.0;</div>
-<div class="line"><a name="l01048"></a><span class="lineno"> 1048</span>             <span class="keywordflow">else</span> <span class="keywordflow">if</span>(j>0)</div>
-<div class="line"><a name="l01049"></a><span class="lineno"> 1049</span>               theta=3.0*PI/2.0;</div>
-<div class="line"><a name="l01050"></a><span class="lineno"> 1050</span>         <span class="comment">//convert to North (0), East (90), South (180), West (270) in degrees</span></div>
-<div class="line"><a name="l01051"></a><span class="lineno"> 1051</span>         theta=360-(theta/PI*180)+90;</div>
-<div class="line"><a name="l01052"></a><span class="lineno"> 1052</span>         <span class="keywordflow">if</span>(theta<0)</div>
-<div class="line"><a name="l01053"></a><span class="lineno"> 1053</span>           theta+=360;</div>
-<div class="line"><a name="l01054"></a><span class="lineno"> 1054</span>         <span class="keywordflow">while</span>(theta>360)</div>
-<div class="line"><a name="l01055"></a><span class="lineno"> 1055</span>           theta-=360;</div>
-<div class="line"><a name="l01056"></a><span class="lineno"> 1056</span>         <span class="keywordtype">bool</span> alligned=<span class="keyword">false</span>;</div>
-<div class="line"><a name="l01057"></a><span class="lineno"> 1057</span>         <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iangle=0;iangle<angle.size();++iangle){</div>
-<div class="line"><a name="l01058"></a><span class="lineno"> 1058</span>           <span class="keywordflow">if</span>(sqrt((theta-angle[iangle])*(theta-angle[iangle]))<10){</div>
-<div class="line"><a name="l01059"></a><span class="lineno"> 1059</span>             alligned=<span class="keyword">true</span>;</div>
-<div class="line"><a name="l01060"></a><span class="lineno"> 1060</span>             <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l01061"></a><span class="lineno"> 1061</span>           }</div>
-<div class="line"><a name="l01062"></a><span class="lineno"> 1062</span>         }</div>
-<div class="line"><a name="l01063"></a><span class="lineno"> 1063</span>         <span class="keywordflow">if</span>(!alligned)</div>
-<div class="line"><a name="l01064"></a><span class="lineno"> 1064</span>           <span class="keywordflow">continue</span>;</div>
-<div class="line"><a name="l01065"></a><span class="lineno"> 1065</span>           }</div>
-<div class="line"><a name="l01066"></a><span class="lineno"> 1066</span>           indexI=x+i;</div>
-<div class="line"><a name="l01067"></a><span class="lineno"> 1067</span>           <span class="comment">//check if out of bounds</span></div>
-<div class="line"><a name="l01068"></a><span class="lineno"> 1068</span>           <span class="keywordflow">if</span>(indexI<0)</div>
-<div class="line"><a name="l01069"></a><span class="lineno"> 1069</span>         indexI=-indexI;</div>
-<div class="line"><a name="l01070"></a><span class="lineno"> 1070</span>           <span class="keywordflow">else</span> <span class="keywordflow">if</span>(indexI>=input.nrOfCol())</div>
-<div class="line"><a name="l01071"></a><span class="lineno"> 1071</span>         indexI=input.nrOfCol()-i;</div>
-<div class="line"><a name="l01072"></a><span class="lineno"> 1072</span>           <span class="keywordflow">if</span>(y+j<0)</div>
-<div class="line"><a name="l01073"></a><span class="lineno"> 1073</span>         indexJ=-j;</div>
-<div class="line"><a name="l01074"></a><span class="lineno"> 1074</span>               <span class="keywordflow">else</span> <span class="keywordflow">if</span>(y+j>=input.nrOfRow())</div>
-<div class="line"><a name="l01075"></a><span class="lineno"> 1075</span>                 indexJ=(dimY>2) ? (dimY-1)/2-j : 0;</div>
-<div class="line"><a name="l01076"></a><span class="lineno"> 1076</span>               <span class="keywordflow">else</span></div>
-<div class="line"><a name="l01077"></a><span class="lineno"> 1077</span>                 indexJ=(dimY-1)/2+j;</div>
-<div class="line"><a name="l01078"></a><span class="lineno"> 1078</span>               <span class="comment">//todo: introduce novalue as this: ?</span></div>
-<div class="line"><a name="l01079"></a><span class="lineno"> 1079</span>               <span class="comment">// if(inBuffer[indexJ][indexI]==(m_noDataValues.size())? m_noDataValues[0] : 0)</span></div>
-<div class="line"><a name="l01080"></a><span class="lineno"> 1080</span>               <span class="comment">//   continue;</span></div>
-<div class="line"><a name="l01081"></a><span class="lineno"> 1081</span>               <span class="keywordtype">bool</span> masked=<span class="keyword">false</span>;</div>
-<div class="line"><a name="l01082"></a><span class="lineno"> 1082</span>           <span class="keywordflow">for</span>(<span class="keywordtype">int</span> imask=0;imask<m_noDataValues.size();++imask){</div>
-<div class="line"><a name="l01083"></a><span class="lineno"> 1083</span>         <span class="keywordflow">if</span>(inBuffer[indexJ][indexI]==m_noDataValues[imask]){</div>
-<div class="line"><a name="l01084"></a><span class="lineno"> 1084</span>           masked=<span class="keyword">true</span>;</div>
-<div class="line"><a name="l01085"></a><span class="lineno"> 1085</span>           <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l01086"></a><span class="lineno"> 1086</span>         }</div>
-<div class="line"><a name="l01087"></a><span class="lineno"> 1087</span>           }</div>
-<div class="line"><a name="l01088"></a><span class="lineno"> 1088</span>           <span class="keywordflow">if</span>(!masked){</div>
-<div class="line"><a name="l01089"></a><span class="lineno"> 1089</span>         <span class="keywordtype">short</span> binValue=0;</div>
-<div class="line"><a name="l01090"></a><span class="lineno"> 1090</span>         <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iclass=0;iclass<m_class.size();++iclass){</div>
-<div class="line"><a name="l01091"></a><span class="lineno"> 1091</span>           <span class="keywordflow">if</span>(inBuffer[indexJ][indexI]==m_class[iclass]){</div>
-<div class="line"><a name="l01092"></a><span class="lineno"> 1092</span>             binValue=1;</div>
-<div class="line"><a name="l01093"></a><span class="lineno"> 1093</span>             <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l01094"></a><span class="lineno"> 1094</span>           }</div>
-<div class="line"><a name="l01095"></a><span class="lineno"> 1095</span>         }</div>
-<div class="line"><a name="l01096"></a><span class="lineno"> 1096</span>         <span class="keywordflow">if</span>(m_class.size())</div>
-<div class="line"><a name="l01097"></a><span class="lineno"> 1097</span>           statBuffer.push_back(binValue);</div>
-<div class="line"><a name="l01098"></a><span class="lineno"> 1098</span>         <span class="keywordflow">else</span></div>
-<div class="line"><a name="l01099"></a><span class="lineno"> 1099</span>           statBuffer.push_back(inBuffer[indexJ][indexI]);</div>
-<div class="line"><a name="l01100"></a><span class="lineno"> 1100</span>           }</div>
-<div class="line"><a name="l01101"></a><span class="lineno"> 1101</span>         }</div>
-<div class="line"><a name="l01102"></a><span class="lineno"> 1102</span>           }</div>
-<div class="line"><a name="l01103"></a><span class="lineno"> 1103</span>       <span class="keywordflow">if</span>(statBuffer.size()){</div>
-<div class="line"><a name="l01104"></a><span class="lineno"> 1104</span>             <span class="keywordflow">switch</span>(getFilterType(method)){</div>
-<div class="line"><a name="l01105"></a><span class="lineno"> 1105</span>             <span class="keywordflow">case</span>(filter2d::dilate):</div>
-<div class="line"><a name="l01106"></a><span class="lineno"> 1106</span>               outBuffer[x]=stat.mymax(statBuffer);</div>
-<div class="line"><a name="l01107"></a><span class="lineno"> 1107</span>               <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l01108"></a><span class="lineno"> 1108</span>             <span class="keywordflow">case</span>(filter2d::erode):</div>
-<div class="line"><a name="l01109"></a><span class="lineno"> 1109</span>               outBuffer[x]=stat.mymin(statBuffer);</div>
-<div class="line"><a name="l01110"></a><span class="lineno"> 1110</span>               <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l01111"></a><span class="lineno"> 1111</span>             <span class="keywordflow">default</span>:</div>
-<div class="line"><a name="l01112"></a><span class="lineno"> 1112</span>               std::ostringstream ess;</div>
-<div class="line"><a name="l01113"></a><span class="lineno"> 1113</span>               ess << <span class="stringliteral">"Error:  morphology method "</span> << method << <span class="stringliteral">" not supported, choose "</span> << filter2d::dilate << <span class="stringliteral">" (dilate) or "</span> << filter2d::erode << <span class="stringliteral">" (erode)"</span> << std::endl;</div>
-<div class="line"><a name="l01114"></a><span class="lineno"> 1114</span>               <span class="keywordflow">throw</span>(ess.str());</div>
-<div class="line"><a name="l01115"></a><span class="lineno"> 1115</span>               <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l01116"></a><span class="lineno"> 1116</span>             }</div>
-<div class="line"><a name="l01117"></a><span class="lineno"> 1117</span>           }</div>
-<div class="line"><a name="l01118"></a><span class="lineno"> 1118</span>       <span class="keywordflow">if</span>(outBuffer[x]&&m_class.size())</div>
-<div class="line"><a name="l01119"></a><span class="lineno"> 1119</span>         outBuffer[x]=m_class[0];</div>
-<div class="line"><a name="l01120"></a><span class="lineno"> 1120</span>     }</div>
-<div class="line"><a name="l01121"></a><span class="lineno"> 1121</span>       }</div>
-<div class="line"><a name="l01122"></a><span class="lineno"> 1122</span>       <span class="comment">//write outBuffer to file</span></div>
-<div class="line"><a name="l01123"></a><span class="lineno"> 1123</span>       <span class="keywordflow">try</span>{</div>
-<div class="line"><a name="l01124"></a><span class="lineno"> 1124</span>         output.writeData(outBuffer,GDT_Float64,y,iband);</div>
-<div class="line"><a name="l01125"></a><span class="lineno"> 1125</span>       }</div>
-<div class="line"><a name="l01126"></a><span class="lineno"> 1126</span>       <span class="keywordflow">catch</span>(std::string errorstring){</div>
-<div class="line"><a name="l01127"></a><span class="lineno"> 1127</span>     std::cerr << errorstring << <span class="stringliteral">"in band "</span> << iband << <span class="stringliteral">", line "</span> << y << std::endl;</div>
-<div class="line"><a name="l01128"></a><span class="lineno"> 1128</span>       }</div>
-<div class="line"><a name="l01129"></a><span class="lineno"> 1129</span>       progress=(1.0+y);</div>
-<div class="line"><a name="l01130"></a><span class="lineno"> 1130</span>       progress+=(output.nrOfRow()*iband);</div>
-<div class="line"><a name="l01131"></a><span class="lineno"> 1131</span>       progress/=output.nrOfBand()*output.nrOfRow();</div>
-<div class="line"><a name="l01132"></a><span class="lineno"> 1132</span>       pfnProgress(progress,pszMessage,pProgressArg);</div>
-<div class="line"><a name="l01133"></a><span class="lineno"> 1133</span>     }</div>
-<div class="line"><a name="l01134"></a><span class="lineno"> 1134</span>   }</div>
-<div class="line"><a name="l01135"></a><span class="lineno"> 1135</span> }</div>
-<div class="line"><a name="l01136"></a><span class="lineno"> 1136</span> </div>
-<div class="line"><a name="l01137"></a><span class="lineno"> 1137</span> <span class="keywordtype">void</span> filter2d::Filter2d::shadowDsm(<span class="keyword">const</span> <a class="code" href="classImgReaderGdal.html">ImgReaderGdal</a>& input, <a class="code" href="classImgWriterGdal.html">ImgWriterGdal</a>& output, <span class="keywordtype">double</span> sza, <span class="keywordtype">double</span> saa, <span class="keywordtype">double</span> pixelSize, <span class="ke [...]
-<div class="line"><a name="l01138"></a><span class="lineno"> 1138</span>   <a class="code" href="classVector2d.html">Vector2d<float></a> inputBuffer;</div>
-<div class="line"><a name="l01139"></a><span class="lineno"> 1139</span>   <a class="code" href="classVector2d.html">Vector2d<float></a> outputBuffer;</div>
-<div class="line"><a name="l01140"></a><span class="lineno"> 1140</span>   input.readDataBlock(inputBuffer, GDT_Float32, 0, input.nrOfCol()-1, 0, input.nrOfRow()-1, 0);</div>
-<div class="line"><a name="l01141"></a><span class="lineno"> 1141</span>   shadowDsm(inputBuffer, outputBuffer, sza, saa, pixelSize, shadowFlag);</div>
-<div class="line"><a name="l01142"></a><span class="lineno"> 1142</span>   output.writeDataBlock(outputBuffer,GDT_Float32,0,output.nrOfCol()-1,0,output.nrOfRow()-1,0);</div>
-<div class="line"><a name="l01143"></a><span class="lineno"> 1143</span> }</div>
-<div class="line"><a name="l01144"></a><span class="lineno"> 1144</span> </div>
-<div class="line"><a name="l01145"></a><span class="lineno"> 1145</span> <span class="keywordtype">void</span> filter2d::Filter2d::dwtForward(<span class="keyword">const</span> <a class="code" href="classImgReaderGdal.html">ImgReaderGdal</a>& input, <a class="code" href="classImgWriterGdal.html">ImgWriterGdal</a>& output, <span class="keyword">const</span> std::string& wavelet_type, <span class="keywordtype">int</span> family){</div>
-<div class="line"><a name="l01146"></a><span class="lineno"> 1146</span>   <a class="code" href="classVector2d.html">Vector2d<float></a> theBuffer;</div>
-<div class="line"><a name="l01147"></a><span class="lineno"> 1147</span>   <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iband=0;iband<input.nrOfBand();++iband){</div>
-<div class="line"><a name="l01148"></a><span class="lineno"> 1148</span>     input.readDataBlock(theBuffer, GDT_Float32, 0, input.nrOfCol()-1, 0, input.nrOfRow()-1, iband);</div>
-<div class="line"><a name="l01149"></a><span class="lineno"> 1149</span>     std::cout << <span class="stringliteral">"filtering band "</span> << iband << std::endl << std::flush;</div>
-<div class="line"><a name="l01150"></a><span class="lineno"> 1150</span>     dwtForward(theBuffer, wavelet_type, family);</div>
-<div class="line"><a name="l01151"></a><span class="lineno"> 1151</span>     output.writeDataBlock(theBuffer,GDT_Float32,0,output.nrOfCol()-1,0,output.nrOfRow()-1,iband);</div>
-<div class="line"><a name="l01152"></a><span class="lineno"> 1152</span>   }</div>
-<div class="line"><a name="l01153"></a><span class="lineno"> 1153</span> }</div>
-<div class="line"><a name="l01154"></a><span class="lineno"> 1154</span> </div>
-<div class="line"><a name="l01155"></a><span class="lineno"> 1155</span> <span class="keywordtype">void</span> filter2d::Filter2d::dwtInverse(<span class="keyword">const</span> <a class="code" href="classImgReaderGdal.html">ImgReaderGdal</a>& input, <a class="code" href="classImgWriterGdal.html">ImgWriterGdal</a>& output, <span class="keyword">const</span> std::string& wavelet_type, <span class="keywordtype">int</span> family){</div>
-<div class="line"><a name="l01156"></a><span class="lineno"> 1156</span>   <a class="code" href="classVector2d.html">Vector2d<float></a> theBuffer;</div>
-<div class="line"><a name="l01157"></a><span class="lineno"> 1157</span>   <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iband=0;iband<input.nrOfBand();++iband){</div>
-<div class="line"><a name="l01158"></a><span class="lineno"> 1158</span>     input.readDataBlock(theBuffer, GDT_Float32, 0, input.nrOfCol()-1, 0, input.nrOfRow()-1, iband);</div>
-<div class="line"><a name="l01159"></a><span class="lineno"> 1159</span>     std::cout << <span class="stringliteral">"filtering band "</span> << iband << std::endl << std::flush;</div>
-<div class="line"><a name="l01160"></a><span class="lineno"> 1160</span>     dwtInverse(theBuffer, wavelet_type, family);</div>
-<div class="line"><a name="l01161"></a><span class="lineno"> 1161</span>     output.writeDataBlock(theBuffer,GDT_Float32,0,output.nrOfCol()-1,0,output.nrOfRow()-1,iband);</div>
-<div class="line"><a name="l01162"></a><span class="lineno"> 1162</span>   }</div>
-<div class="line"><a name="l01163"></a><span class="lineno"> 1163</span> }</div>
-<div class="line"><a name="l01164"></a><span class="lineno"> 1164</span> </div>
-<div class="line"><a name="l01165"></a><span class="lineno"> 1165</span> <span class="keywordtype">void</span> filter2d::Filter2d::dwtCut(<span class="keyword">const</span> <a class="code" href="classImgReaderGdal.html">ImgReaderGdal</a>& input, <a class="code" href="classImgWriterGdal.html">ImgWriterGdal</a>& output, <span class="keyword">const</span> std::string& wavelet_type, <span class="keywordtype">int</span> family, <span class="keywordtype">double</span> cut, <sp [...]
-<div class="line"><a name="l01166"></a><span class="lineno"> 1166</span>   <a class="code" href="classVector2d.html">Vector2d<float></a> theBuffer;</div>
-<div class="line"><a name="l01167"></a><span class="lineno"> 1167</span>   <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iband=0;iband<input.nrOfBand();++iband){</div>
-<div class="line"><a name="l01168"></a><span class="lineno"> 1168</span>     input.readDataBlock(theBuffer, GDT_Float32, 0, input.nrOfCol()-1, 0, input.nrOfRow()-1, iband);</div>
-<div class="line"><a name="l01169"></a><span class="lineno"> 1169</span>     std::cout << <span class="stringliteral">"filtering band "</span> << iband << std::endl << std::flush;</div>
-<div class="line"><a name="l01170"></a><span class="lineno"> 1170</span>     dwtCut(theBuffer, wavelet_type, family, cut);</div>
-<div class="line"><a name="l01171"></a><span class="lineno"> 1171</span>     output.writeDataBlock(theBuffer,GDT_Float32,0,output.nrOfCol()-1,0,output.nrOfRow()-1,iband);</div>
-<div class="line"><a name="l01172"></a><span class="lineno"> 1172</span>   }</div>
-<div class="line"><a name="l01173"></a><span class="lineno"> 1173</span> }</div>
-<div class="line"><a name="l01174"></a><span class="lineno"> 1174</span> </div>
-<div class="line"><a name="l01175"></a><span class="lineno"> 1175</span> <span class="keywordtype">void</span> filter2d::Filter2d::linearFeature(<span class="keyword">const</span> <a class="code" href="classImgReaderGdal.html">ImgReaderGdal</a>& input, <a class="code" href="classImgWriterGdal.html">ImgWriterGdal</a>& output, <span class="keywordtype">float</span> angle, <span class="keywordtype">float</span> angleStep, <span class="keywordtype">float</span> maxDistance, <spa [...]
-<div class="line"><a name="l01176"></a><span class="lineno"> 1176</span>   <a class="code" href="classVector2d.html">Vector2d<float></a> inputBuffer;</div>
-<div class="line"><a name="l01177"></a><span class="lineno"> 1177</span>   std::vector< Vector2d<float> > outputBuffer;</div>
-<div class="line"><a name="l01178"></a><span class="lineno"> 1178</span>   input.readDataBlock(inputBuffer, GDT_Float32, 0, input.nrOfCol()-1, 0, input.nrOfRow()-1, band);</div>
-<div class="line"><a name="l01179"></a><span class="lineno"> 1179</span>   <span class="keywordflow">if</span>(maxDistance<=0)</div>
-<div class="line"><a name="l01180"></a><span class="lineno"> 1180</span>     maxDistance=sqrt(static_cast<float>(input.nrOfCol()*input.nrOfRow()));</div>
-<div class="line"><a name="l01181"></a><span class="lineno"> 1181</span>   linearFeature(inputBuffer,outputBuffer,angle,angleStep,maxDistance,eps, l1, a1, l2, a2,verbose);</div>
-<div class="line"><a name="l01182"></a><span class="lineno"> 1182</span>   <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iband=0;iband<outputBuffer.size();++iband)</div>
-<div class="line"><a name="l01183"></a><span class="lineno"> 1183</span>     output.writeDataBlock(outputBuffer[iband],GDT_Float32,0,output.nrOfCol()-1,0,output.nrOfRow()-1,iband);</div>
-<div class="line"><a name="l01184"></a><span class="lineno"> 1184</span> }</div>
-<div class="line"><a name="l01185"></a><span class="lineno"> 1185</span> </div>
-<div class="line"><a name="l01186"></a><span class="lineno"> 1186</span> <span class="keywordtype">void</span> filter2d::Filter2d::linearFeature(<span class="keyword">const</span> <a class="code" href="classVector2d.html">Vector2d<float></a>& input, std::vector< <a class="code" href="classVector2d.html">Vector2d<float></a> >& output, <span class="keywordtype">float</span> angle, <span class="keywordtype">float</span> angleStep, <span class="keywordtype">flo [...]
-<div class="line"><a name="l01187"></a><span class="lineno"> 1187</span> {</div>
-<div class="line"><a name="l01188"></a><span class="lineno"> 1188</span>   output.clear();</div>
-<div class="line"><a name="l01189"></a><span class="lineno"> 1189</span>   <span class="keywordtype">int</span> nband=0;<span class="comment">//linear feature</span></div>
-<div class="line"><a name="l01190"></a><span class="lineno"> 1190</span>   <span class="keywordflow">if</span>(l1)</div>
-<div class="line"><a name="l01191"></a><span class="lineno"> 1191</span>     ++nband;</div>
-<div class="line"><a name="l01192"></a><span class="lineno"> 1192</span>   <span class="keywordflow">if</span>(a1)</div>
-<div class="line"><a name="l01193"></a><span class="lineno"> 1193</span>     ++nband;</div>
-<div class="line"><a name="l01194"></a><span class="lineno"> 1194</span>   <span class="keywordflow">if</span>(l2)</div>
-<div class="line"><a name="l01195"></a><span class="lineno"> 1195</span>     ++nband;</div>
-<div class="line"><a name="l01196"></a><span class="lineno"> 1196</span>   <span class="keywordflow">if</span>(a2)</div>
-<div class="line"><a name="l01197"></a><span class="lineno"> 1197</span>     ++nband;</div>
-<div class="line"><a name="l01198"></a><span class="lineno"> 1198</span>   output.resize(nband);</div>
-<div class="line"><a name="l01199"></a><span class="lineno"> 1199</span>   <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iband=0;iband<output.size();++iband)</div>
-<div class="line"><a name="l01200"></a><span class="lineno"> 1200</span>     output[iband].resize(input.nRows(),input.nCols());</div>
-<div class="line"><a name="l01201"></a><span class="lineno"> 1201</span>   <span class="keywordflow">if</span>(maxDistance<=0)</div>
-<div class="line"><a name="l01202"></a><span class="lineno"> 1202</span>     maxDistance=sqrt(static_cast<float>(input.nRows()*input.nCols()));</div>
-<div class="line"><a name="l01203"></a><span class="lineno"> 1203</span>   <span class="keywordtype">int</span> indexI=0;</div>
-<div class="line"><a name="l01204"></a><span class="lineno"> 1204</span>   <span class="keywordtype">int</span> indexJ=0;</div>
-<div class="line"><a name="l01205"></a><span class="lineno"> 1205</span>   <span class="keyword">const</span> <span class="keywordtype">char</span>* pszMessage;</div>
-<div class="line"><a name="l01206"></a><span class="lineno"> 1206</span>   <span class="keywordtype">void</span>* pProgressArg=NULL;</div>
-<div class="line"><a name="l01207"></a><span class="lineno"> 1207</span>   GDALProgressFunc pfnProgress=GDALTermProgress;</div>
-<div class="line"><a name="l01208"></a><span class="lineno"> 1208</span>   <span class="keywordtype">double</span> progress=0;</div>
-<div class="line"><a name="l01209"></a><span class="lineno"> 1209</span>   pfnProgress(progress,pszMessage,pProgressArg);</div>
-<div class="line"><a name="l01210"></a><span class="lineno"> 1210</span>   <span class="keywordflow">for</span>(<span class="keywordtype">int</span> y=0;y<input.nRows();++y){</div>
-<div class="line"><a name="l01211"></a><span class="lineno"> 1211</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> x=0;x<input.nCols();++x){</div>
-<div class="line"><a name="l01212"></a><span class="lineno"> 1212</span>       <span class="keywordtype">float</span> currentValue=input[y][x];</div>
-<div class="line"><a name="l01213"></a><span class="lineno"> 1213</span>       <span class="comment">//find values equal to current value with some error margin</span></div>
-<div class="line"><a name="l01214"></a><span class="lineno"> 1214</span>       <span class="comment">//todo: add distance for two opposite directions</span></div>
-<div class="line"><a name="l01215"></a><span class="lineno"> 1215</span>       <span class="keywordtype">float</span> lineDistance1=0;<span class="comment">//longest line of object</span></div>
-<div class="line"><a name="l01216"></a><span class="lineno"> 1216</span>       <span class="keywordtype">float</span> lineDistance2=maxDistance;<span class="comment">//shortest line of object</span></div>
-<div class="line"><a name="l01217"></a><span class="lineno"> 1217</span>       <span class="keywordtype">float</span> lineAngle1=0;<span class="comment">//angle to longest line (North=0)</span></div>
-<div class="line"><a name="l01218"></a><span class="lineno"> 1218</span>       <span class="keywordtype">float</span> lineAngle2=0;<span class="comment">//angle to shortest line (North=0)</span></div>
-<div class="line"><a name="l01219"></a><span class="lineno"> 1219</span>       <span class="keywordtype">float</span> northAngle=0;<span class="comment">//rotating angle</span></div>
-<div class="line"><a name="l01220"></a><span class="lineno"> 1220</span>       <span class="keywordflow">for</span>(northAngle=0;northAngle<180;northAngle+=angleStep){</div>
-<div class="line"><a name="l01221"></a><span class="lineno"> 1221</span>     <span class="keywordflow">if</span>(angle<=360&&angle>=0&&angle!=northAngle)</div>
-<div class="line"><a name="l01222"></a><span class="lineno"> 1222</span>       <span class="keywordflow">continue</span>;</div>
-<div class="line"><a name="l01223"></a><span class="lineno"> 1223</span>     <span class="comment">//test</span></div>
-<div class="line"><a name="l01224"></a><span class="lineno"> 1224</span>     <span class="keywordflow">if</span>(verbose)</div>
-<div class="line"><a name="l01225"></a><span class="lineno"> 1225</span>       std::cout << <span class="stringliteral">"northAngle: "</span> << northAngle << std::endl;</div>
-<div class="line"><a name="l01226"></a><span class="lineno"> 1226</span>     <span class="keywordtype">float</span> currentDistance=0;</div>
-<div class="line"><a name="l01227"></a><span class="lineno"> 1227</span>     <span class="keywordtype">float</span> theDir=0;</div>
-<div class="line"><a name="l01228"></a><span class="lineno"> 1228</span>     <span class="keywordflow">for</span>(<span class="keywordtype">short</span> side=0;side<=1;side+=1){</div>
-<div class="line"><a name="l01229"></a><span class="lineno"> 1229</span>       theDir=PI/2.0-DEG2RAD(northAngle)+side*PI;<span class="comment">//in radians</span></div>
-<div class="line"><a name="l01230"></a><span class="lineno"> 1230</span>       <span class="comment">//test</span></div>
-<div class="line"><a name="l01231"></a><span class="lineno"> 1231</span>       <span class="keywordflow">if</span>(verbose)</div>
-<div class="line"><a name="l01232"></a><span class="lineno"> 1232</span>         std::cout << <span class="stringliteral">"theDir in deg: "</span> << RAD2DEG(theDir) << std::endl;</div>
-<div class="line"><a name="l01233"></a><span class="lineno"> 1233</span>       <span class="keywordflow">if</span>(theDir<0)</div>
-<div class="line"><a name="l01234"></a><span class="lineno"> 1234</span>         theDir+=2*PI;</div>
-<div class="line"><a name="l01235"></a><span class="lineno"> 1235</span>       <span class="comment">//test</span></div>
-<div class="line"><a name="l01236"></a><span class="lineno"> 1236</span>       <span class="keywordflow">if</span>(verbose)</div>
-<div class="line"><a name="l01237"></a><span class="lineno"> 1237</span>         std::cout << <span class="stringliteral">"theDir in deg: "</span> << RAD2DEG(theDir) << std::endl;</div>
-<div class="line"><a name="l01238"></a><span class="lineno"> 1238</span>       <span class="keywordtype">float</span> nextValue=currentValue;</div>
-<div class="line"><a name="l01239"></a><span class="lineno"> 1239</span>       <span class="keywordflow">for</span>(<span class="keywordtype">float</span> currentRay=1;currentRay<maxDistance;++currentRay){</div>
-<div class="line"><a name="l01240"></a><span class="lineno"> 1240</span>         indexI=x+currentRay*cos(theDir);</div>
-<div class="line"><a name="l01241"></a><span class="lineno"> 1241</span>         indexJ=y-currentRay*sin(theDir);</div>
-<div class="line"><a name="l01242"></a><span class="lineno"> 1242</span>         <span class="keywordflow">if</span>(indexJ<0||indexJ>=input.size())</div>
-<div class="line"><a name="l01243"></a><span class="lineno"> 1243</span>           <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l01244"></a><span class="lineno"> 1244</span>         <span class="keywordflow">if</span>(indexI<0||indexI>=input[indexJ].size())</div>
-<div class="line"><a name="l01245"></a><span class="lineno"> 1245</span>           <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l01246"></a><span class="lineno"> 1246</span>         nextValue=input[indexJ][indexI];</div>
-<div class="line"><a name="l01247"></a><span class="lineno"> 1247</span>         <span class="keywordflow">if</span>(verbose){</div>
-<div class="line"><a name="l01248"></a><span class="lineno"> 1248</span>           std::cout << <span class="stringliteral">"x: "</span> << x << std::endl;</div>
-<div class="line"><a name="l01249"></a><span class="lineno"> 1249</span>           std::cout << <span class="stringliteral">"y: "</span> << y << std::endl;</div>
-<div class="line"><a name="l01250"></a><span class="lineno"> 1250</span>           std::cout << <span class="stringliteral">"currentValue: "</span> << currentValue << std::endl;</div>
-<div class="line"><a name="l01251"></a><span class="lineno"> 1251</span>           std::cout << <span class="stringliteral">"theDir in degrees: "</span> << RAD2DEG(theDir) << std::endl;</div>
-<div class="line"><a name="l01252"></a><span class="lineno"> 1252</span>           std::cout << <span class="stringliteral">"cos(theDir): "</span> << cos(theDir) << std::endl;</div>
-<div class="line"><a name="l01253"></a><span class="lineno"> 1253</span>           std::cout << <span class="stringliteral">"sin(theDir): "</span> << sin(theDir) << std::endl;</div>
-<div class="line"><a name="l01254"></a><span class="lineno"> 1254</span>           std::cout << <span class="stringliteral">"currentRay: "</span> << currentRay << std::endl;</div>
-<div class="line"><a name="l01255"></a><span class="lineno"> 1255</span>           std::cout << <span class="stringliteral">"currentDistance: "</span> << currentDistance << std::endl;</div>
-<div class="line"><a name="l01256"></a><span class="lineno"> 1256</span>           std::cout << <span class="stringliteral">"indexI: "</span> << indexI << std::endl;</div>
-<div class="line"><a name="l01257"></a><span class="lineno"> 1257</span>           std::cout << <span class="stringliteral">"indexJ: "</span> << indexJ << std::endl;</div>
-<div class="line"><a name="l01258"></a><span class="lineno"> 1258</span>           std::cout << <span class="stringliteral">"nextValue: "</span> << nextValue << std::endl;</div>
-<div class="line"><a name="l01259"></a><span class="lineno"> 1259</span>         }</div>
-<div class="line"><a name="l01260"></a><span class="lineno"> 1260</span>         <span class="keywordflow">if</span>(fabs(currentValue-nextValue)<=eps){</div>
-<div class="line"><a name="l01261"></a><span class="lineno"> 1261</span>           ++currentDistance;</div>
-<div class="line"><a name="l01262"></a><span class="lineno"> 1262</span>           <span class="comment">//test</span></div>
-<div class="line"><a name="l01263"></a><span class="lineno"> 1263</span>           <span class="keywordflow">if</span>(verbose)</div>
-<div class="line"><a name="l01264"></a><span class="lineno"> 1264</span>         std::cout << <span class="stringliteral">"currentDistance: "</span> << currentDistance << <span class="stringliteral">", continue"</span> << std::endl;</div>
-<div class="line"><a name="l01265"></a><span class="lineno"> 1265</span>         }</div>
-<div class="line"><a name="l01266"></a><span class="lineno"> 1266</span>         <span class="keywordflow">else</span>{</div>
-<div class="line"><a name="l01267"></a><span class="lineno"> 1267</span>           <span class="keywordflow">if</span>(verbose)</div>
-<div class="line"><a name="l01268"></a><span class="lineno"> 1268</span>         std::cout << <span class="stringliteral">"currentDistance: "</span> << currentDistance << <span class="stringliteral">", break"</span> << std::endl;</div>
-<div class="line"><a name="l01269"></a><span class="lineno"> 1269</span>           <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l01270"></a><span class="lineno"> 1270</span>         }</div>
-<div class="line"><a name="l01271"></a><span class="lineno"> 1271</span>       }</div>
-<div class="line"><a name="l01272"></a><span class="lineno"> 1272</span>     }</div>
-<div class="line"><a name="l01273"></a><span class="lineno"> 1273</span>     <span class="keywordflow">if</span>(lineDistance1<currentDistance){</div>
-<div class="line"><a name="l01274"></a><span class="lineno"> 1274</span>       lineDistance1=currentDistance;</div>
-<div class="line"><a name="l01275"></a><span class="lineno"> 1275</span>       lineAngle1=northAngle;</div>
-<div class="line"><a name="l01276"></a><span class="lineno"> 1276</span>     }</div>
-<div class="line"><a name="l01277"></a><span class="lineno"> 1277</span>     <span class="keywordflow">if</span>(lineDistance2>currentDistance){</div>
-<div class="line"><a name="l01278"></a><span class="lineno"> 1278</span>       lineDistance2=currentDistance;</div>
-<div class="line"><a name="l01279"></a><span class="lineno"> 1279</span>       lineAngle2=northAngle;</div>
-<div class="line"><a name="l01280"></a><span class="lineno"> 1280</span>     }</div>
-<div class="line"><a name="l01281"></a><span class="lineno"> 1281</span>     <span class="keywordflow">if</span>(verbose){</div>
-<div class="line"><a name="l01282"></a><span class="lineno"> 1282</span>       std::cout << <span class="stringliteral">"lineDistance1: "</span> << lineDistance1 << std::endl;</div>
-<div class="line"><a name="l01283"></a><span class="lineno"> 1283</span>       std::cout << <span class="stringliteral">"lineAngle1: "</span> << lineAngle1 << std::endl;</div>
-<div class="line"><a name="l01284"></a><span class="lineno"> 1284</span>       std::cout << <span class="stringliteral">"lineDistance2: "</span> << lineDistance2 << std::endl;</div>
-<div class="line"><a name="l01285"></a><span class="lineno"> 1285</span>       std::cout << <span class="stringliteral">"lineAngle2: "</span> << lineAngle2 << std::endl;</div>
-<div class="line"><a name="l01286"></a><span class="lineno"> 1286</span>     }</div>
-<div class="line"><a name="l01287"></a><span class="lineno"> 1287</span>       }</div>
-<div class="line"><a name="l01288"></a><span class="lineno"> 1288</span>       <span class="keywordtype">int</span> iband=0;</div>
-<div class="line"><a name="l01289"></a><span class="lineno"> 1289</span>       <span class="keywordflow">if</span>(l1)</div>
-<div class="line"><a name="l01290"></a><span class="lineno"> 1290</span>     output[iband++][y][x]=lineDistance1;</div>
-<div class="line"><a name="l01291"></a><span class="lineno"> 1291</span>       <span class="keywordflow">if</span>(a1)</div>
-<div class="line"><a name="l01292"></a><span class="lineno"> 1292</span>     output[iband++][y][x]=lineAngle1;</div>
-<div class="line"><a name="l01293"></a><span class="lineno"> 1293</span>       <span class="keywordflow">if</span>(l2)</div>
-<div class="line"><a name="l01294"></a><span class="lineno"> 1294</span>     output[iband++][y][x]=lineDistance2;</div>
-<div class="line"><a name="l01295"></a><span class="lineno"> 1295</span>       <span class="keywordflow">if</span>(a2)</div>
-<div class="line"><a name="l01296"></a><span class="lineno"> 1296</span>     output[iband++][y][x]=lineAngle2;</div>
-<div class="line"><a name="l01297"></a><span class="lineno"> 1297</span>       assert(iband==nband);</div>
+<div class="line"><a name="l01010"></a><span class="lineno"> 1010</span>       <span class="keywordflow">catch</span>(std::string errorstring){</div>
+<div class="line"><a name="l01011"></a><span class="lineno"> 1011</span>         std::cerr << errorstring << <span class="stringliteral">"in band "</span> << iband << <span class="stringliteral">", line "</span> << y << std::endl;</div>
+<div class="line"><a name="l01012"></a><span class="lineno"> 1012</span>       }</div>
+<div class="line"><a name="l01013"></a><span class="lineno"> 1013</span>     }</div>
+<div class="line"><a name="l01014"></a><span class="lineno"> 1014</span>         <span class="keywordflow">else</span>{</div>
+<div class="line"><a name="l01015"></a><span class="lineno"> 1015</span>           <span class="keywordtype">int</span> over=y+dimY/2-input.nrOfRow();</div>
+<div class="line"><a name="l01016"></a><span class="lineno"> 1016</span>           <span class="keywordtype">int</span> index=(inBuffer.size()-1)-over;</div>
+<div class="line"><a name="l01017"></a><span class="lineno"> 1017</span>           assert(index>=0);</div>
+<div class="line"><a name="l01018"></a><span class="lineno"> 1018</span>           assert(index<inBuffer.size());</div>
+<div class="line"><a name="l01019"></a><span class="lineno"> 1019</span>           inBuffer.push_back(inBuffer[index]);</div>
+<div class="line"><a name="l01020"></a><span class="lineno"> 1020</span>         }</div>
+<div class="line"><a name="l01021"></a><span class="lineno"> 1021</span>       }</div>
+<div class="line"><a name="l01022"></a><span class="lineno"> 1022</span>       <span class="keywordflow">for</span>(<span class="keywordtype">int</span> x=0;x<input.nrOfCol();++x){</div>
+<div class="line"><a name="l01023"></a><span class="lineno"> 1023</span>         <span class="keywordtype">double</span> currentValue=inBuffer[(dimY-1)/2][x];</div>
+<div class="line"><a name="l01024"></a><span class="lineno"> 1024</span>     outBuffer[x]=currentValue;</div>
+<div class="line"><a name="l01025"></a><span class="lineno"> 1025</span>     std::vector<double> statBuffer;</div>
+<div class="line"><a name="l01026"></a><span class="lineno"> 1026</span>     <span class="keywordtype">bool</span> currentMasked=<span class="keyword">false</span>;</div>
+<div class="line"><a name="l01027"></a><span class="lineno"> 1027</span>         <span class="keywordtype">int</span> centre=dimX*(dimY-1)/2+(dimX-1)/2;</div>
+<div class="line"><a name="l01028"></a><span class="lineno"> 1028</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> imask=0;imask<m_noDataValues.size();++imask){</div>
+<div class="line"><a name="l01029"></a><span class="lineno"> 1029</span>       <span class="keywordflow">if</span>(currentValue==m_noDataValues[imask]){</div>
+<div class="line"><a name="l01030"></a><span class="lineno"> 1030</span>         currentMasked=<span class="keyword">true</span>;</div>
+<div class="line"><a name="l01031"></a><span class="lineno"> 1031</span>         <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l01032"></a><span class="lineno"> 1032</span>       }</div>
+<div class="line"><a name="l01033"></a><span class="lineno"> 1033</span>     }</div>
+<div class="line"><a name="l01034"></a><span class="lineno"> 1034</span>     <span class="keywordflow">if</span>(currentMasked){</div>
+<div class="line"><a name="l01035"></a><span class="lineno"> 1035</span>       outBuffer[x]=currentValue;</div>
+<div class="line"><a name="l01036"></a><span class="lineno"> 1036</span>     }</div>
+<div class="line"><a name="l01037"></a><span class="lineno"> 1037</span>     <span class="keywordflow">else</span>{</div>
+<div class="line"><a name="l01038"></a><span class="lineno"> 1038</span>           <span class="keywordflow">for</span>(<span class="keywordtype">int</span> j=-(dimY-1)/2;j<=dimY/2;++j){</div>
+<div class="line"><a name="l01039"></a><span class="lineno"> 1039</span>             <span class="keywordflow">for</span>(<span class="keywordtype">int</span> i=-(dimX-1)/2;i<=dimX/2;++i){</div>
+<div class="line"><a name="l01040"></a><span class="lineno"> 1040</span>               <span class="keywordtype">double</span> d2=i*i+j*j;<span class="comment">//square distance</span></div>
+<div class="line"><a name="l01041"></a><span class="lineno"> 1041</span>               <span class="keywordflow">if</span>(disc&&(d2>(dimX/2)*(dimY/2)))</div>
+<div class="line"><a name="l01042"></a><span class="lineno"> 1042</span>                 <span class="keywordflow">continue</span>;</div>
+<div class="line"><a name="l01043"></a><span class="lineno"> 1043</span>           <span class="keywordflow">if</span>(angle.size()){</div>
+<div class="line"><a name="l01044"></a><span class="lineno"> 1044</span>             <span class="keywordtype">double</span> theta;</div>
+<div class="line"><a name="l01045"></a><span class="lineno"> 1045</span>         <span class="comment">//use polar coordinates in radians</span></div>
+<div class="line"><a name="l01046"></a><span class="lineno"> 1046</span>             <span class="keywordflow">if</span>(i>0){</div>
+<div class="line"><a name="l01047"></a><span class="lineno"> 1047</span>           <span class="keywordflow">if</span>(j<0)</div>
+<div class="line"><a name="l01048"></a><span class="lineno"> 1048</span>             theta=atan(static_cast<double>(-j)/(static_cast<double>(i)));</div>
+<div class="line"><a name="l01049"></a><span class="lineno"> 1049</span>           <span class="keywordflow">else</span></div>
+<div class="line"><a name="l01050"></a><span class="lineno"> 1050</span>             theta=-atan(static_cast<double>(j)/(static_cast<double>(i)));</div>
+<div class="line"><a name="l01051"></a><span class="lineno"> 1051</span>         }</div>
+<div class="line"><a name="l01052"></a><span class="lineno"> 1052</span>             <span class="keywordflow">else</span> <span class="keywordflow">if</span>(i<0){</div>
+<div class="line"><a name="l01053"></a><span class="lineno"> 1053</span>           <span class="keywordflow">if</span>(j<0)</div>
+<div class="line"><a name="l01054"></a><span class="lineno"> 1054</span>             theta=PI-atan(static_cast<double>(-j)/(static_cast<double>(-i)));</div>
+<div class="line"><a name="l01055"></a><span class="lineno"> 1055</span>           <span class="keywordflow">else</span></div>
+<div class="line"><a name="l01056"></a><span class="lineno"> 1056</span>             theta=PI+atan(static_cast<double>(j)/(static_cast<double>(-i)));</div>
+<div class="line"><a name="l01057"></a><span class="lineno"> 1057</span>         }</div>
+<div class="line"><a name="l01058"></a><span class="lineno"> 1058</span>             <span class="keywordflow">else</span> <span class="keywordflow">if</span>(j<0)</div>
+<div class="line"><a name="l01059"></a><span class="lineno"> 1059</span>               theta=PI/2.0;</div>
+<div class="line"><a name="l01060"></a><span class="lineno"> 1060</span>             <span class="keywordflow">else</span> <span class="keywordflow">if</span>(j>0)</div>
+<div class="line"><a name="l01061"></a><span class="lineno"> 1061</span>               theta=3.0*PI/2.0;</div>
+<div class="line"><a name="l01062"></a><span class="lineno"> 1062</span>         <span class="comment">//convert to North (0), East (90), South (180), West (270) in degrees</span></div>
+<div class="line"><a name="l01063"></a><span class="lineno"> 1063</span>         theta=360-(theta/PI*180)+90;</div>
+<div class="line"><a name="l01064"></a><span class="lineno"> 1064</span>         <span class="keywordflow">if</span>(theta<0)</div>
+<div class="line"><a name="l01065"></a><span class="lineno"> 1065</span>           theta+=360;</div>
+<div class="line"><a name="l01066"></a><span class="lineno"> 1066</span>         <span class="keywordflow">while</span>(theta>360)</div>
+<div class="line"><a name="l01067"></a><span class="lineno"> 1067</span>           theta-=360;</div>
+<div class="line"><a name="l01068"></a><span class="lineno"> 1068</span>         <span class="keywordtype">bool</span> alligned=<span class="keyword">false</span>;</div>
+<div class="line"><a name="l01069"></a><span class="lineno"> 1069</span>         <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iangle=0;iangle<angle.size();++iangle){</div>
+<div class="line"><a name="l01070"></a><span class="lineno"> 1070</span>           <span class="keywordflow">if</span>(sqrt((theta-angle[iangle])*(theta-angle[iangle]))<10){</div>
+<div class="line"><a name="l01071"></a><span class="lineno"> 1071</span>             alligned=<span class="keyword">true</span>;</div>
+<div class="line"><a name="l01072"></a><span class="lineno"> 1072</span>             <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l01073"></a><span class="lineno"> 1073</span>           }</div>
+<div class="line"><a name="l01074"></a><span class="lineno"> 1074</span>         }</div>
+<div class="line"><a name="l01075"></a><span class="lineno"> 1075</span>         <span class="keywordflow">if</span>(!alligned)</div>
+<div class="line"><a name="l01076"></a><span class="lineno"> 1076</span>           <span class="keywordflow">continue</span>;</div>
+<div class="line"><a name="l01077"></a><span class="lineno"> 1077</span>           }</div>
+<div class="line"><a name="l01078"></a><span class="lineno"> 1078</span>           indexI=x+i;</div>
+<div class="line"><a name="l01079"></a><span class="lineno"> 1079</span>           <span class="comment">//check if out of bounds</span></div>
+<div class="line"><a name="l01080"></a><span class="lineno"> 1080</span>           <span class="keywordflow">if</span>(indexI<0)</div>
+<div class="line"><a name="l01081"></a><span class="lineno"> 1081</span>         indexI=-indexI;</div>
+<div class="line"><a name="l01082"></a><span class="lineno"> 1082</span>           <span class="keywordflow">else</span> <span class="keywordflow">if</span>(indexI>=input.nrOfCol())</div>
+<div class="line"><a name="l01083"></a><span class="lineno"> 1083</span>         indexI=input.nrOfCol()-i;</div>
+<div class="line"><a name="l01084"></a><span class="lineno"> 1084</span>           <span class="keywordflow">if</span>(y+j<0)</div>
+<div class="line"><a name="l01085"></a><span class="lineno"> 1085</span>         indexJ=-j;</div>
+<div class="line"><a name="l01086"></a><span class="lineno"> 1086</span>               <span class="keywordflow">else</span> <span class="keywordflow">if</span>(y+j>=input.nrOfRow())</div>
+<div class="line"><a name="l01087"></a><span class="lineno"> 1087</span>                 indexJ=(dimY>2) ? (dimY-1)/2-j : 0;</div>
+<div class="line"><a name="l01088"></a><span class="lineno"> 1088</span>               <span class="keywordflow">else</span></div>
+<div class="line"><a name="l01089"></a><span class="lineno"> 1089</span>                 indexJ=(dimY-1)/2+j;</div>
+<div class="line"><a name="l01090"></a><span class="lineno"> 1090</span>               <span class="comment">//todo: introduce novalue as this: ?</span></div>
+<div class="line"><a name="l01091"></a><span class="lineno"> 1091</span>               <span class="comment">// if(inBuffer[indexJ][indexI]==(m_noDataValues.size())? m_noDataValues[0] : 0)</span></div>
+<div class="line"><a name="l01092"></a><span class="lineno"> 1092</span>               <span class="comment">//   continue;</span></div>
+<div class="line"><a name="l01093"></a><span class="lineno"> 1093</span>               <span class="keywordtype">bool</span> masked=<span class="keyword">false</span>;</div>
+<div class="line"><a name="l01094"></a><span class="lineno"> 1094</span>           <span class="keywordflow">for</span>(<span class="keywordtype">int</span> imask=0;imask<m_noDataValues.size();++imask){</div>
+<div class="line"><a name="l01095"></a><span class="lineno"> 1095</span>         <span class="keywordflow">if</span>(inBuffer[indexJ][indexI]==m_noDataValues[imask]){</div>
+<div class="line"><a name="l01096"></a><span class="lineno"> 1096</span>           masked=<span class="keyword">true</span>;</div>
+<div class="line"><a name="l01097"></a><span class="lineno"> 1097</span>           <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l01098"></a><span class="lineno"> 1098</span>         }</div>
+<div class="line"><a name="l01099"></a><span class="lineno"> 1099</span>           }</div>
+<div class="line"><a name="l01100"></a><span class="lineno"> 1100</span>           <span class="keywordflow">if</span>(!masked){</div>
+<div class="line"><a name="l01101"></a><span class="lineno"> 1101</span>         <span class="keywordtype">short</span> binValue=0;</div>
+<div class="line"><a name="l01102"></a><span class="lineno"> 1102</span>         <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iclass=0;iclass<m_class.size();++iclass){</div>
+<div class="line"><a name="l01103"></a><span class="lineno"> 1103</span>           <span class="keywordflow">if</span>(inBuffer[indexJ][indexI]==m_class[iclass]){</div>
+<div class="line"><a name="l01104"></a><span class="lineno"> 1104</span>             binValue=1;</div>
+<div class="line"><a name="l01105"></a><span class="lineno"> 1105</span>             <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l01106"></a><span class="lineno"> 1106</span>           }</div>
+<div class="line"><a name="l01107"></a><span class="lineno"> 1107</span>         }</div>
+<div class="line"><a name="l01108"></a><span class="lineno"> 1108</span>         <span class="keywordflow">if</span>(m_class.size())</div>
+<div class="line"><a name="l01109"></a><span class="lineno"> 1109</span>           statBuffer.push_back(binValue);</div>
+<div class="line"><a name="l01110"></a><span class="lineno"> 1110</span>         <span class="keywordflow">else</span></div>
+<div class="line"><a name="l01111"></a><span class="lineno"> 1111</span>           statBuffer.push_back(inBuffer[indexJ][indexI]);</div>
+<div class="line"><a name="l01112"></a><span class="lineno"> 1112</span>           }</div>
+<div class="line"><a name="l01113"></a><span class="lineno"> 1113</span>         }</div>
+<div class="line"><a name="l01114"></a><span class="lineno"> 1114</span>           }</div>
+<div class="line"><a name="l01115"></a><span class="lineno"> 1115</span>       <span class="keywordflow">if</span>(statBuffer.size()){</div>
+<div class="line"><a name="l01116"></a><span class="lineno"> 1116</span>             <span class="keywordflow">switch</span>(getFilterType(method)){</div>
+<div class="line"><a name="l01117"></a><span class="lineno"> 1117</span>             <span class="keywordflow">case</span>(filter2d::dilate):</div>
+<div class="line"><a name="l01118"></a><span class="lineno"> 1118</span>               outBuffer[x]=stat.mymax(statBuffer);</div>
+<div class="line"><a name="l01119"></a><span class="lineno"> 1119</span>               <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l01120"></a><span class="lineno"> 1120</span>             <span class="keywordflow">case</span>(filter2d::erode):</div>
+<div class="line"><a name="l01121"></a><span class="lineno"> 1121</span>               outBuffer[x]=stat.mymin(statBuffer);</div>
+<div class="line"><a name="l01122"></a><span class="lineno"> 1122</span>               <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l01123"></a><span class="lineno"> 1123</span>             <span class="keywordflow">default</span>:</div>
+<div class="line"><a name="l01124"></a><span class="lineno"> 1124</span>               std::ostringstream ess;</div>
+<div class="line"><a name="l01125"></a><span class="lineno"> 1125</span>               ess << <span class="stringliteral">"Error:  morphology method "</span> << method << <span class="stringliteral">" not supported, choose "</span> << filter2d::dilate << <span class="stringliteral">" (dilate) or "</span> << filter2d::erode << <span class="stringliteral">" (erode)"</span> << std::endl;</div>
+<div class="line"><a name="l01126"></a><span class="lineno"> 1126</span>               <span class="keywordflow">throw</span>(ess.str());</div>
+<div class="line"><a name="l01127"></a><span class="lineno"> 1127</span>               <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l01128"></a><span class="lineno"> 1128</span>             }</div>
+<div class="line"><a name="l01129"></a><span class="lineno"> 1129</span>           }</div>
+<div class="line"><a name="l01130"></a><span class="lineno"> 1130</span>       <span class="keywordflow">if</span>(outBuffer[x]&&m_class.size())</div>
+<div class="line"><a name="l01131"></a><span class="lineno"> 1131</span>         outBuffer[x]=m_class[0];</div>
+<div class="line"><a name="l01132"></a><span class="lineno"> 1132</span>     }</div>
+<div class="line"><a name="l01133"></a><span class="lineno"> 1133</span>       }</div>
+<div class="line"><a name="l01134"></a><span class="lineno"> 1134</span>       <span class="comment">//write outBuffer to file</span></div>
+<div class="line"><a name="l01135"></a><span class="lineno"> 1135</span>       <span class="keywordflow">try</span>{</div>
+<div class="line"><a name="l01136"></a><span class="lineno"> 1136</span>         output.writeData(outBuffer,GDT_Float64,y,iband);</div>
+<div class="line"><a name="l01137"></a><span class="lineno"> 1137</span>       }</div>
+<div class="line"><a name="l01138"></a><span class="lineno"> 1138</span>       <span class="keywordflow">catch</span>(std::string errorstring){</div>
+<div class="line"><a name="l01139"></a><span class="lineno"> 1139</span>     std::cerr << errorstring << <span class="stringliteral">"in band "</span> << iband << <span class="stringliteral">", line "</span> << y << std::endl;</div>
+<div class="line"><a name="l01140"></a><span class="lineno"> 1140</span>       }</div>
+<div class="line"><a name="l01141"></a><span class="lineno"> 1141</span>       progress=(1.0+y);</div>
+<div class="line"><a name="l01142"></a><span class="lineno"> 1142</span>       progress+=(output.nrOfRow()*iband);</div>
+<div class="line"><a name="l01143"></a><span class="lineno"> 1143</span>       progress/=output.nrOfBand()*output.nrOfRow();</div>
+<div class="line"><a name="l01144"></a><span class="lineno"> 1144</span>       pfnProgress(progress,pszMessage,pProgressArg);</div>
+<div class="line"><a name="l01145"></a><span class="lineno"> 1145</span>     }</div>
+<div class="line"><a name="l01146"></a><span class="lineno"> 1146</span>   }</div>
+<div class="line"><a name="l01147"></a><span class="lineno"> 1147</span> }</div>
+<div class="line"><a name="l01148"></a><span class="lineno"> 1148</span> </div>
+<div class="line"><a name="l01149"></a><span class="lineno"> 1149</span> <span class="keywordtype">void</span> filter2d::Filter2d::shadowDsm(<span class="keyword">const</span> <a class="code" href="classImgReaderGdal.html">ImgReaderGdal</a>& input, <a class="code" href="classImgWriterGdal.html">ImgWriterGdal</a>& output, <span class="keywordtype">double</span> sza, <span class="keywordtype">double</span> saa, <span class="keywordtype">double</span> pixelSize, <span class="ke [...]
+<div class="line"><a name="l01150"></a><span class="lineno"> 1150</span>   <a class="code" href="classVector2d.html">Vector2d<float></a> inputBuffer;</div>
+<div class="line"><a name="l01151"></a><span class="lineno"> 1151</span>   <a class="code" href="classVector2d.html">Vector2d<float></a> outputBuffer;</div>
+<div class="line"><a name="l01152"></a><span class="lineno"> 1152</span>   input.readDataBlock(inputBuffer, GDT_Float32, 0, input.nrOfCol()-1, 0, input.nrOfRow()-1, 0);</div>
+<div class="line"><a name="l01153"></a><span class="lineno"> 1153</span>   shadowDsm(inputBuffer, outputBuffer, sza, saa, pixelSize, shadowFlag);</div>
+<div class="line"><a name="l01154"></a><span class="lineno"> 1154</span>   output.writeDataBlock(outputBuffer,GDT_Float32,0,output.nrOfCol()-1,0,output.nrOfRow()-1,0);</div>
+<div class="line"><a name="l01155"></a><span class="lineno"> 1155</span> }</div>
+<div class="line"><a name="l01156"></a><span class="lineno"> 1156</span> </div>
+<div class="line"><a name="l01157"></a><span class="lineno"> 1157</span> <span class="keywordtype">void</span> filter2d::Filter2d::dwtForward(<span class="keyword">const</span> <a class="code" href="classImgReaderGdal.html">ImgReaderGdal</a>& input, <a class="code" href="classImgWriterGdal.html">ImgWriterGdal</a>& output, <span class="keyword">const</span> std::string& wavelet_type, <span class="keywordtype">int</span> family){</div>
+<div class="line"><a name="l01158"></a><span class="lineno"> 1158</span>   <a class="code" href="classVector2d.html">Vector2d<float></a> theBuffer;</div>
+<div class="line"><a name="l01159"></a><span class="lineno"> 1159</span>   <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iband=0;iband<input.nrOfBand();++iband){</div>
+<div class="line"><a name="l01160"></a><span class="lineno"> 1160</span>     input.readDataBlock(theBuffer, GDT_Float32, 0, input.nrOfCol()-1, 0, input.nrOfRow()-1, iband);</div>
+<div class="line"><a name="l01161"></a><span class="lineno"> 1161</span>     std::cout << <span class="stringliteral">"filtering band "</span> << iband << std::endl << std::flush;</div>
+<div class="line"><a name="l01162"></a><span class="lineno"> 1162</span>     dwtForward(theBuffer, wavelet_type, family);</div>
+<div class="line"><a name="l01163"></a><span class="lineno"> 1163</span>     output.writeDataBlock(theBuffer,GDT_Float32,0,output.nrOfCol()-1,0,output.nrOfRow()-1,iband);</div>
+<div class="line"><a name="l01164"></a><span class="lineno"> 1164</span>   }</div>
+<div class="line"><a name="l01165"></a><span class="lineno"> 1165</span> }</div>
+<div class="line"><a name="l01166"></a><span class="lineno"> 1166</span> </div>
+<div class="line"><a name="l01167"></a><span class="lineno"> 1167</span> <span class="keywordtype">void</span> filter2d::Filter2d::dwtInverse(<span class="keyword">const</span> <a class="code" href="classImgReaderGdal.html">ImgReaderGdal</a>& input, <a class="code" href="classImgWriterGdal.html">ImgWriterGdal</a>& output, <span class="keyword">const</span> std::string& wavelet_type, <span class="keywordtype">int</span> family){</div>
+<div class="line"><a name="l01168"></a><span class="lineno"> 1168</span>   <a class="code" href="classVector2d.html">Vector2d<float></a> theBuffer;</div>
+<div class="line"><a name="l01169"></a><span class="lineno"> 1169</span>   <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iband=0;iband<input.nrOfBand();++iband){</div>
+<div class="line"><a name="l01170"></a><span class="lineno"> 1170</span>     input.readDataBlock(theBuffer, GDT_Float32, 0, input.nrOfCol()-1, 0, input.nrOfRow()-1, iband);</div>
+<div class="line"><a name="l01171"></a><span class="lineno"> 1171</span>     std::cout << <span class="stringliteral">"filtering band "</span> << iband << std::endl << std::flush;</div>
+<div class="line"><a name="l01172"></a><span class="lineno"> 1172</span>     dwtInverse(theBuffer, wavelet_type, family);</div>
+<div class="line"><a name="l01173"></a><span class="lineno"> 1173</span>     output.writeDataBlock(theBuffer,GDT_Float32,0,output.nrOfCol()-1,0,output.nrOfRow()-1,iband);</div>
+<div class="line"><a name="l01174"></a><span class="lineno"> 1174</span>   }</div>
+<div class="line"><a name="l01175"></a><span class="lineno"> 1175</span> }</div>
+<div class="line"><a name="l01176"></a><span class="lineno"> 1176</span> </div>
+<div class="line"><a name="l01177"></a><span class="lineno"> 1177</span> <span class="keywordtype">void</span> filter2d::Filter2d::dwtCut(<span class="keyword">const</span> <a class="code" href="classImgReaderGdal.html">ImgReaderGdal</a>& input, <a class="code" href="classImgWriterGdal.html">ImgWriterGdal</a>& output, <span class="keyword">const</span> std::string& wavelet_type, <span class="keywordtype">int</span> family, <span class="keywordtype">double</span> cut, <sp [...]
+<div class="line"><a name="l01178"></a><span class="lineno"> 1178</span>   <a class="code" href="classVector2d.html">Vector2d<float></a> theBuffer;</div>
+<div class="line"><a name="l01179"></a><span class="lineno"> 1179</span>   <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iband=0;iband<input.nrOfBand();++iband){</div>
+<div class="line"><a name="l01180"></a><span class="lineno"> 1180</span>     input.readDataBlock(theBuffer, GDT_Float32, 0, input.nrOfCol()-1, 0, input.nrOfRow()-1, iband);</div>
+<div class="line"><a name="l01181"></a><span class="lineno"> 1181</span>     std::cout << <span class="stringliteral">"filtering band "</span> << iband << std::endl << std::flush;</div>
+<div class="line"><a name="l01182"></a><span class="lineno"> 1182</span>     dwtCut(theBuffer, wavelet_type, family, cut);</div>
+<div class="line"><a name="l01183"></a><span class="lineno"> 1183</span>     output.writeDataBlock(theBuffer,GDT_Float32,0,output.nrOfCol()-1,0,output.nrOfRow()-1,iband);</div>
+<div class="line"><a name="l01184"></a><span class="lineno"> 1184</span>   }</div>
+<div class="line"><a name="l01185"></a><span class="lineno"> 1185</span> }</div>
+<div class="line"><a name="l01186"></a><span class="lineno"> 1186</span> </div>
+<div class="line"><a name="l01187"></a><span class="lineno"> 1187</span> <span class="keywordtype">void</span> filter2d::Filter2d::linearFeature(<span class="keyword">const</span> <a class="code" href="classImgReaderGdal.html">ImgReaderGdal</a>& input, <a class="code" href="classImgWriterGdal.html">ImgWriterGdal</a>& output, <span class="keywordtype">float</span> angle, <span class="keywordtype">float</span> angleStep, <span class="keywordtype">float</span> maxDistance, <spa [...]
+<div class="line"><a name="l01188"></a><span class="lineno"> 1188</span>   <a class="code" href="classVector2d.html">Vector2d<float></a> inputBuffer;</div>
+<div class="line"><a name="l01189"></a><span class="lineno"> 1189</span>   std::vector< Vector2d<float> > outputBuffer;</div>
+<div class="line"><a name="l01190"></a><span class="lineno"> 1190</span>   input.readDataBlock(inputBuffer, GDT_Float32, 0, input.nrOfCol()-1, 0, input.nrOfRow()-1, band);</div>
+<div class="line"><a name="l01191"></a><span class="lineno"> 1191</span>   <span class="keywordflow">if</span>(maxDistance<=0)</div>
+<div class="line"><a name="l01192"></a><span class="lineno"> 1192</span>     maxDistance=sqrt(static_cast<float>(input.nrOfCol()*input.nrOfRow()));</div>
+<div class="line"><a name="l01193"></a><span class="lineno"> 1193</span>   linearFeature(inputBuffer,outputBuffer,angle,angleStep,maxDistance,eps, l1, a1, l2, a2,verbose);</div>
+<div class="line"><a name="l01194"></a><span class="lineno"> 1194</span>   <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iband=0;iband<outputBuffer.size();++iband)</div>
+<div class="line"><a name="l01195"></a><span class="lineno"> 1195</span>     output.writeDataBlock(outputBuffer[iband],GDT_Float32,0,output.nrOfCol()-1,0,output.nrOfRow()-1,iband);</div>
+<div class="line"><a name="l01196"></a><span class="lineno"> 1196</span> }</div>
+<div class="line"><a name="l01197"></a><span class="lineno"> 1197</span> </div>
+<div class="line"><a name="l01198"></a><span class="lineno"> 1198</span> <span class="keywordtype">void</span> filter2d::Filter2d::linearFeature(<span class="keyword">const</span> <a class="code" href="classVector2d.html">Vector2d<float></a>& input, std::vector< <a class="code" href="classVector2d.html">Vector2d<float></a> >& output, <span class="keywordtype">float</span> angle, <span class="keywordtype">float</span> angleStep, <span class="keywordtype">flo [...]
+<div class="line"><a name="l01199"></a><span class="lineno"> 1199</span> {</div>
+<div class="line"><a name="l01200"></a><span class="lineno"> 1200</span>   output.clear();</div>
+<div class="line"><a name="l01201"></a><span class="lineno"> 1201</span>   <span class="keywordtype">int</span> nband=0;<span class="comment">//linear feature</span></div>
+<div class="line"><a name="l01202"></a><span class="lineno"> 1202</span>   <span class="keywordflow">if</span>(l1)</div>
+<div class="line"><a name="l01203"></a><span class="lineno"> 1203</span>     ++nband;</div>
+<div class="line"><a name="l01204"></a><span class="lineno"> 1204</span>   <span class="keywordflow">if</span>(a1)</div>
+<div class="line"><a name="l01205"></a><span class="lineno"> 1205</span>     ++nband;</div>
+<div class="line"><a name="l01206"></a><span class="lineno"> 1206</span>   <span class="keywordflow">if</span>(l2)</div>
+<div class="line"><a name="l01207"></a><span class="lineno"> 1207</span>     ++nband;</div>
+<div class="line"><a name="l01208"></a><span class="lineno"> 1208</span>   <span class="keywordflow">if</span>(a2)</div>
+<div class="line"><a name="l01209"></a><span class="lineno"> 1209</span>     ++nband;</div>
+<div class="line"><a name="l01210"></a><span class="lineno"> 1210</span>   output.resize(nband);</div>
+<div class="line"><a name="l01211"></a><span class="lineno"> 1211</span>   <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iband=0;iband<output.size();++iband)</div>
+<div class="line"><a name="l01212"></a><span class="lineno"> 1212</span>     output[iband].resize(input.nRows(),input.nCols());</div>
+<div class="line"><a name="l01213"></a><span class="lineno"> 1213</span>   <span class="keywordflow">if</span>(maxDistance<=0)</div>
+<div class="line"><a name="l01214"></a><span class="lineno"> 1214</span>     maxDistance=sqrt(static_cast<float>(input.nRows()*input.nCols()));</div>
+<div class="line"><a name="l01215"></a><span class="lineno"> 1215</span>   <span class="keywordtype">int</span> indexI=0;</div>
+<div class="line"><a name="l01216"></a><span class="lineno"> 1216</span>   <span class="keywordtype">int</span> indexJ=0;</div>
+<div class="line"><a name="l01217"></a><span class="lineno"> 1217</span>   <span class="keyword">const</span> <span class="keywordtype">char</span>* pszMessage;</div>
+<div class="line"><a name="l01218"></a><span class="lineno"> 1218</span>   <span class="keywordtype">void</span>* pProgressArg=NULL;</div>
+<div class="line"><a name="l01219"></a><span class="lineno"> 1219</span>   GDALProgressFunc pfnProgress=GDALTermProgress;</div>
+<div class="line"><a name="l01220"></a><span class="lineno"> 1220</span>   <span class="keywordtype">double</span> progress=0;</div>
+<div class="line"><a name="l01221"></a><span class="lineno"> 1221</span>   pfnProgress(progress,pszMessage,pProgressArg);</div>
+<div class="line"><a name="l01222"></a><span class="lineno"> 1222</span>   <span class="keywordflow">for</span>(<span class="keywordtype">int</span> y=0;y<input.nRows();++y){</div>
+<div class="line"><a name="l01223"></a><span class="lineno"> 1223</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> x=0;x<input.nCols();++x){</div>
+<div class="line"><a name="l01224"></a><span class="lineno"> 1224</span>       <span class="keywordtype">float</span> currentValue=input[y][x];</div>
+<div class="line"><a name="l01225"></a><span class="lineno"> 1225</span>       <span class="comment">//find values equal to current value with some error margin</span></div>
+<div class="line"><a name="l01226"></a><span class="lineno"> 1226</span>       <span class="comment">//todo: add distance for two opposite directions</span></div>
+<div class="line"><a name="l01227"></a><span class="lineno"> 1227</span>       <span class="keywordtype">float</span> lineDistance1=0;<span class="comment">//longest line of object</span></div>
+<div class="line"><a name="l01228"></a><span class="lineno"> 1228</span>       <span class="keywordtype">float</span> lineDistance2=maxDistance;<span class="comment">//shortest line of object</span></div>
+<div class="line"><a name="l01229"></a><span class="lineno"> 1229</span>       <span class="keywordtype">float</span> lineAngle1=0;<span class="comment">//angle to longest line (North=0)</span></div>
+<div class="line"><a name="l01230"></a><span class="lineno"> 1230</span>       <span class="keywordtype">float</span> lineAngle2=0;<span class="comment">//angle to shortest line (North=0)</span></div>
+<div class="line"><a name="l01231"></a><span class="lineno"> 1231</span>       <span class="keywordtype">float</span> northAngle=0;<span class="comment">//rotating angle</span></div>
+<div class="line"><a name="l01232"></a><span class="lineno"> 1232</span>       <span class="keywordflow">for</span>(northAngle=0;northAngle<180;northAngle+=angleStep){</div>
+<div class="line"><a name="l01233"></a><span class="lineno"> 1233</span>     <span class="keywordflow">if</span>(angle<=360&&angle>=0&&angle!=northAngle)</div>
+<div class="line"><a name="l01234"></a><span class="lineno"> 1234</span>       <span class="keywordflow">continue</span>;</div>
+<div class="line"><a name="l01235"></a><span class="lineno"> 1235</span>     <span class="comment">//test</span></div>
+<div class="line"><a name="l01236"></a><span class="lineno"> 1236</span>     <span class="keywordflow">if</span>(verbose)</div>
+<div class="line"><a name="l01237"></a><span class="lineno"> 1237</span>       std::cout << <span class="stringliteral">"northAngle: "</span> << northAngle << std::endl;</div>
+<div class="line"><a name="l01238"></a><span class="lineno"> 1238</span>     <span class="keywordtype">float</span> currentDistance=0;</div>
+<div class="line"><a name="l01239"></a><span class="lineno"> 1239</span>     <span class="keywordtype">float</span> theDir=0;</div>
+<div class="line"><a name="l01240"></a><span class="lineno"> 1240</span>     <span class="keywordflow">for</span>(<span class="keywordtype">short</span> side=0;side<=1;side+=1){</div>
+<div class="line"><a name="l01241"></a><span class="lineno"> 1241</span>       theDir=PI/2.0-DEG2RAD(northAngle)+side*PI;<span class="comment">//in radians</span></div>
+<div class="line"><a name="l01242"></a><span class="lineno"> 1242</span>       <span class="comment">//test</span></div>
+<div class="line"><a name="l01243"></a><span class="lineno"> 1243</span>       <span class="keywordflow">if</span>(verbose)</div>
+<div class="line"><a name="l01244"></a><span class="lineno"> 1244</span>         std::cout << <span class="stringliteral">"theDir in deg: "</span> << RAD2DEG(theDir) << std::endl;</div>
+<div class="line"><a name="l01245"></a><span class="lineno"> 1245</span>       <span class="keywordflow">if</span>(theDir<0)</div>
+<div class="line"><a name="l01246"></a><span class="lineno"> 1246</span>         theDir+=2*PI;</div>
+<div class="line"><a name="l01247"></a><span class="lineno"> 1247</span>       <span class="comment">//test</span></div>
+<div class="line"><a name="l01248"></a><span class="lineno"> 1248</span>       <span class="keywordflow">if</span>(verbose)</div>
+<div class="line"><a name="l01249"></a><span class="lineno"> 1249</span>         std::cout << <span class="stringliteral">"theDir in deg: "</span> << RAD2DEG(theDir) << std::endl;</div>
+<div class="line"><a name="l01250"></a><span class="lineno"> 1250</span>       <span class="keywordtype">float</span> nextValue=currentValue;</div>
+<div class="line"><a name="l01251"></a><span class="lineno"> 1251</span>       <span class="keywordflow">for</span>(<span class="keywordtype">float</span> currentRay=1;currentRay<maxDistance;++currentRay){</div>
+<div class="line"><a name="l01252"></a><span class="lineno"> 1252</span>         indexI=x+currentRay*cos(theDir);</div>
+<div class="line"><a name="l01253"></a><span class="lineno"> 1253</span>         indexJ=y-currentRay*sin(theDir);</div>
+<div class="line"><a name="l01254"></a><span class="lineno"> 1254</span>         <span class="keywordflow">if</span>(indexJ<0||indexJ>=input.size())</div>
+<div class="line"><a name="l01255"></a><span class="lineno"> 1255</span>           <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l01256"></a><span class="lineno"> 1256</span>         <span class="keywordflow">if</span>(indexI<0||indexI>=input[indexJ].size())</div>
+<div class="line"><a name="l01257"></a><span class="lineno"> 1257</span>           <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l01258"></a><span class="lineno"> 1258</span>         nextValue=input[indexJ][indexI];</div>
+<div class="line"><a name="l01259"></a><span class="lineno"> 1259</span>         <span class="keywordflow">if</span>(verbose){</div>
+<div class="line"><a name="l01260"></a><span class="lineno"> 1260</span>           std::cout << <span class="stringliteral">"x: "</span> << x << std::endl;</div>
+<div class="line"><a name="l01261"></a><span class="lineno"> 1261</span>           std::cout << <span class="stringliteral">"y: "</span> << y << std::endl;</div>
+<div class="line"><a name="l01262"></a><span class="lineno"> 1262</span>           std::cout << <span class="stringliteral">"currentValue: "</span> << currentValue << std::endl;</div>
+<div class="line"><a name="l01263"></a><span class="lineno"> 1263</span>           std::cout << <span class="stringliteral">"theDir in degrees: "</span> << RAD2DEG(theDir) << std::endl;</div>
+<div class="line"><a name="l01264"></a><span class="lineno"> 1264</span>           std::cout << <span class="stringliteral">"cos(theDir): "</span> << cos(theDir) << std::endl;</div>
+<div class="line"><a name="l01265"></a><span class="lineno"> 1265</span>           std::cout << <span class="stringliteral">"sin(theDir): "</span> << sin(theDir) << std::endl;</div>
+<div class="line"><a name="l01266"></a><span class="lineno"> 1266</span>           std::cout << <span class="stringliteral">"currentRay: "</span> << currentRay << std::endl;</div>
+<div class="line"><a name="l01267"></a><span class="lineno"> 1267</span>           std::cout << <span class="stringliteral">"currentDistance: "</span> << currentDistance << std::endl;</div>
+<div class="line"><a name="l01268"></a><span class="lineno"> 1268</span>           std::cout << <span class="stringliteral">"indexI: "</span> << indexI << std::endl;</div>
+<div class="line"><a name="l01269"></a><span class="lineno"> 1269</span>           std::cout << <span class="stringliteral">"indexJ: "</span> << indexJ << std::endl;</div>
+<div class="line"><a name="l01270"></a><span class="lineno"> 1270</span>           std::cout << <span class="stringliteral">"nextValue: "</span> << nextValue << std::endl;</div>
+<div class="line"><a name="l01271"></a><span class="lineno"> 1271</span>         }</div>
+<div class="line"><a name="l01272"></a><span class="lineno"> 1272</span>         <span class="keywordflow">if</span>(fabs(currentValue-nextValue)<=eps){</div>
+<div class="line"><a name="l01273"></a><span class="lineno"> 1273</span>           ++currentDistance;</div>
+<div class="line"><a name="l01274"></a><span class="lineno"> 1274</span>           <span class="comment">//test</span></div>
+<div class="line"><a name="l01275"></a><span class="lineno"> 1275</span>           <span class="keywordflow">if</span>(verbose)</div>
+<div class="line"><a name="l01276"></a><span class="lineno"> 1276</span>         std::cout << <span class="stringliteral">"currentDistance: "</span> << currentDistance << <span class="stringliteral">", continue"</span> << std::endl;</div>
+<div class="line"><a name="l01277"></a><span class="lineno"> 1277</span>         }</div>
+<div class="line"><a name="l01278"></a><span class="lineno"> 1278</span>         <span class="keywordflow">else</span>{</div>
+<div class="line"><a name="l01279"></a><span class="lineno"> 1279</span>           <span class="keywordflow">if</span>(verbose)</div>
+<div class="line"><a name="l01280"></a><span class="lineno"> 1280</span>         std::cout << <span class="stringliteral">"currentDistance: "</span> << currentDistance << <span class="stringliteral">", break"</span> << std::endl;</div>
+<div class="line"><a name="l01281"></a><span class="lineno"> 1281</span>           <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l01282"></a><span class="lineno"> 1282</span>         }</div>
+<div class="line"><a name="l01283"></a><span class="lineno"> 1283</span>       }</div>
+<div class="line"><a name="l01284"></a><span class="lineno"> 1284</span>     }</div>
+<div class="line"><a name="l01285"></a><span class="lineno"> 1285</span>     <span class="keywordflow">if</span>(lineDistance1<currentDistance){</div>
+<div class="line"><a name="l01286"></a><span class="lineno"> 1286</span>       lineDistance1=currentDistance;</div>
+<div class="line"><a name="l01287"></a><span class="lineno"> 1287</span>       lineAngle1=northAngle;</div>
+<div class="line"><a name="l01288"></a><span class="lineno"> 1288</span>     }</div>
+<div class="line"><a name="l01289"></a><span class="lineno"> 1289</span>     <span class="keywordflow">if</span>(lineDistance2>currentDistance){</div>
+<div class="line"><a name="l01290"></a><span class="lineno"> 1290</span>       lineDistance2=currentDistance;</div>
+<div class="line"><a name="l01291"></a><span class="lineno"> 1291</span>       lineAngle2=northAngle;</div>
+<div class="line"><a name="l01292"></a><span class="lineno"> 1292</span>     }</div>
+<div class="line"><a name="l01293"></a><span class="lineno"> 1293</span>     <span class="keywordflow">if</span>(verbose){</div>
+<div class="line"><a name="l01294"></a><span class="lineno"> 1294</span>       std::cout << <span class="stringliteral">"lineDistance1: "</span> << lineDistance1 << std::endl;</div>
+<div class="line"><a name="l01295"></a><span class="lineno"> 1295</span>       std::cout << <span class="stringliteral">"lineAngle1: "</span> << lineAngle1 << std::endl;</div>
+<div class="line"><a name="l01296"></a><span class="lineno"> 1296</span>       std::cout << <span class="stringliteral">"lineDistance2: "</span> << lineDistance2 << std::endl;</div>
+<div class="line"><a name="l01297"></a><span class="lineno"> 1297</span>       std::cout << <span class="stringliteral">"lineAngle2: "</span> << lineAngle2 << std::endl;</div>
 <div class="line"><a name="l01298"></a><span class="lineno"> 1298</span>     }</div>
-<div class="line"><a name="l01299"></a><span class="lineno"> 1299</span>     progress=(1.0+y);</div>
-<div class="line"><a name="l01300"></a><span class="lineno"> 1300</span>     progress/=input.nRows();</div>
-<div class="line"><a name="l01301"></a><span class="lineno"> 1301</span>     pfnProgress(progress,pszMessage,pProgressArg);</div>
-<div class="line"><a name="l01302"></a><span class="lineno"> 1302</span>   }</div>
-<div class="line"><a name="l01303"></a><span class="lineno"> 1303</span> }</div>
+<div class="line"><a name="l01299"></a><span class="lineno"> 1299</span>       }</div>
+<div class="line"><a name="l01300"></a><span class="lineno"> 1300</span>       <span class="keywordtype">int</span> iband=0;</div>
+<div class="line"><a name="l01301"></a><span class="lineno"> 1301</span>       <span class="keywordflow">if</span>(l1)</div>
+<div class="line"><a name="l01302"></a><span class="lineno"> 1302</span>     output[iband++][y][x]=lineDistance1;</div>
+<div class="line"><a name="l01303"></a><span class="lineno"> 1303</span>       <span class="keywordflow">if</span>(a1)</div>
+<div class="line"><a name="l01304"></a><span class="lineno"> 1304</span>     output[iband++][y][x]=lineAngle1;</div>
+<div class="line"><a name="l01305"></a><span class="lineno"> 1305</span>       <span class="keywordflow">if</span>(l2)</div>
+<div class="line"><a name="l01306"></a><span class="lineno"> 1306</span>     output[iband++][y][x]=lineDistance2;</div>
+<div class="line"><a name="l01307"></a><span class="lineno"> 1307</span>       <span class="keywordflow">if</span>(a2)</div>
+<div class="line"><a name="l01308"></a><span class="lineno"> 1308</span>     output[iband++][y][x]=lineAngle2;</div>
+<div class="line"><a name="l01309"></a><span class="lineno"> 1309</span>       assert(iband==nband);</div>
+<div class="line"><a name="l01310"></a><span class="lineno"> 1310</span>     }</div>
+<div class="line"><a name="l01311"></a><span class="lineno"> 1311</span>     progress=(1.0+y);</div>
+<div class="line"><a name="l01312"></a><span class="lineno"> 1312</span>     progress/=input.nRows();</div>
+<div class="line"><a name="l01313"></a><span class="lineno"> 1313</span>     pfnProgress(progress,pszMessage,pProgressArg);</div>
+<div class="line"><a name="l01314"></a><span class="lineno"> 1314</span>   }</div>
+<div class="line"><a name="l01315"></a><span class="lineno"> 1315</span> }</div>
 <div class="ttc" id="classImgReaderGdal_html"><div class="ttname"><a href="classImgReaderGdal.html">ImgReaderGdal</a></div><div class="ttdef"><b>Definition:</b> <a href="ImgReaderGdal_8h_source.html#l00033">ImgReaderGdal.h:33</a></div></div>
 <div class="ttc" id="classImgWriterGdal_html"><div class="ttname"><a href="classImgWriterGdal.html">ImgWriterGdal</a></div><div class="ttdef"><b>Definition:</b> <a href="ImgWriterGdal_8h_source.html#l00032">ImgWriterGdal.h:32</a></div></div>
 <div class="ttc" id="classVector2d_html"><div class="ttname"><a href="classVector2d.html">Vector2d< double ></a></div></div>
@@ -1363,7 +1375,7 @@
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Jun 23 2015 17:09:36 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Tue Nov 3 2015 15:58:26 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/Filter2d_8h_source.html b/doc/html/Filter2d_8h_source.html
index 429120d..caf024e 100644
--- a/doc/html/Filter2d_8h_source.html
+++ b/doc/html/Filter2d_8h_source.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.3</span>
+    <span id="projectnumber">2.6.4</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -112,7 +112,7 @@
 <div class="line"><a name="l00058"></a><span class="lineno">   58</span> </div>
 <div class="line"><a name="l00059"></a><span class="lineno">   59</span> <span class="keyword">namespace </span>filter2d</div>
 <div class="line"><a name="l00060"></a><span class="lineno">   60</span> {</div>
-<div class="line"><a name="l00061"></a><span class="lineno">   61</span>   <span class="keyword">enum</span> FILTER_TYPE { median=100, var=101 , min=102, max=103, sum=104, mean=105, minmax=106, dilate=107, erode=108, close=109, open=110, homog=111, sobelx=112, sobely=113, sobelxy=114, sobelyx=115, smooth=116, density=117, mode=118, mixed=119, threshold=120, ismin=121, ismax=122, heterog=123, order=124, stdev=125, mrf=126, dwt=127, dwti=128, dwt_cut=129, scramble=130, shift=131, line [...]
+<div class="line"><a name="l00061"></a><span class="lineno">   61</span>   <span class="keyword">enum</span> FILTER_TYPE { median=100, var=101 , min=102, max=103, sum=104, mean=105, minmax=106, dilate=107, erode=108, close=109, open=110, homog=111, sobelx=112, sobely=113, sobelxy=114, sobelyx=115, smooth=116, density=117, mode=118, mixed=119, threshold=120, ismin=121, ismax=122, heterog=123, order=124, stdev=125, mrf=126, dwt=127, dwti=128, dwt_cut=129, scramble=130, shift=131, line [...]
 <div class="line"><a name="l00062"></a><span class="lineno">   62</span> </div>
 <div class="line"><a name="l00063"></a><span class="lineno">   63</span>   <span class="keyword">enum</span> RESAMPLE { NEAR = 0, BILINEAR = 1, BICUBIC = 2 };<span class="comment">//bicubic not supported yet...</span></div>
 <div class="line"><a name="l00064"></a><span class="lineno">   64</span>   </div>
@@ -223,1190 +223,1200 @@
 <div class="line"><a name="l00169"></a><span class="lineno">  169</span>     m_filterMap[<span class="stringliteral">"countid"</span>]=filter2d::countid;</div>
 <div class="line"><a name="l00170"></a><span class="lineno">  170</span>     m_filterMap[<span class="stringliteral">"savgolay"</span>]=filter2d::savgolay;</div>
 <div class="line"><a name="l00171"></a><span class="lineno">  171</span>     m_filterMap[<span class="stringliteral">"percentile"</span>]=filter2d::percentile;</div>
-<div class="line"><a name="l00172"></a><span class="lineno">  172</span>   }</div>
-<div class="line"><a name="l00173"></a><span class="lineno">  173</span> </div>
-<div class="line"><a name="l00174"></a><span class="lineno">  174</span>   <a class="code" href="classVector2d.html">Vector2d<double></a> m_taps;</div>
-<div class="line"><a name="l00175"></a><span class="lineno">  175</span>   <span class="comment">/* double m_noValue; */</span></div>
-<div class="line"><a name="l00176"></a><span class="lineno">  176</span>   std::vector<short> m_class;</div>
-<div class="line"><a name="l00177"></a><span class="lineno">  177</span>   <span class="comment">/* std::vector<short> m_mask; */</span></div>
-<div class="line"><a name="l00178"></a><span class="lineno">  178</span>   std::vector<double> m_noDataValues;</div>
-<div class="line"><a name="l00179"></a><span class="lineno">  179</span>   std::vector<double> m_threshold;</div>
-<div class="line"><a name="l00180"></a><span class="lineno">  180</span> };</div>
-<div class="line"><a name="l00181"></a><span class="lineno">  181</span> </div>
+<div class="line"><a name="l00172"></a><span class="lineno">  172</span>     m_filterMap[<span class="stringliteral">"proportion"</span>]=filter2d::proportion;</div>
+<div class="line"><a name="l00173"></a><span class="lineno">  173</span>   }</div>
+<div class="line"><a name="l00174"></a><span class="lineno">  174</span> </div>
+<div class="line"><a name="l00175"></a><span class="lineno">  175</span>   <a class="code" href="classVector2d.html">Vector2d<double></a> m_taps;</div>
+<div class="line"><a name="l00176"></a><span class="lineno">  176</span>   <span class="comment">/* double m_noValue; */</span></div>
+<div class="line"><a name="l00177"></a><span class="lineno">  177</span>   std::vector<short> m_class;</div>
+<div class="line"><a name="l00178"></a><span class="lineno">  178</span>   <span class="comment">/* std::vector<short> m_mask; */</span></div>
+<div class="line"><a name="l00179"></a><span class="lineno">  179</span>   std::vector<double> m_noDataValues;</div>
+<div class="line"><a name="l00180"></a><span class="lineno">  180</span>   std::vector<double> m_threshold;</div>
+<div class="line"><a name="l00181"></a><span class="lineno">  181</span> };</div>
 <div class="line"><a name="l00182"></a><span class="lineno">  182</span> </div>
-<div class="line"><a name="l00183"></a><span class="lineno">  183</span>  <span class="keyword">template</span><<span class="keyword">class</span> T1, <span class="keyword">class</span> T2> <span class="keywordtype">void</span> Filter2d::smooth(<span class="keyword">const</span> <a class="code" href="classVector2d.html">Vector2d<T1></a>& inputVector, <a class="code" href="classVector2d.html">Vector2d<T2></a>& outputVector,<span class="keywordtype">int</span [...]
-<div class="line"><a name="l00184"></a><span class="lineno">  184</span>   {</div>
-<div class="line"><a name="l00185"></a><span class="lineno">  185</span>     smooth(inputVector,outputVector,dim,dim);</div>
-<div class="line"><a name="l00186"></a><span class="lineno">  186</span>   }</div>
-<div class="line"><a name="l00187"></a><span class="lineno">  187</span> </div>
-<div class="line"><a name="l00188"></a><span class="lineno">  188</span>  <span class="keyword">template</span><<span class="keyword">class</span> T1, <span class="keyword">class</span> T2> <span class="keywordtype">void</span> Filter2d::smooth(<span class="keyword">const</span> <a class="code" href="classVector2d.html">Vector2d<T1></a>& inputVector, <a class="code" href="classVector2d.html">Vector2d<T2></a>& outputVector,<span class="keywordtype">int</span [...]
-<div class="line"><a name="l00189"></a><span class="lineno">  189</span>   {</div>
-<div class="line"><a name="l00190"></a><span class="lineno">  190</span>     m_taps.resize(dimY);</div>
-<div class="line"><a name="l00191"></a><span class="lineno">  191</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> j=0;j<dimY;++j){</div>
-<div class="line"><a name="l00192"></a><span class="lineno">  192</span>       m_taps[j].resize(dimX);</div>
-<div class="line"><a name="l00193"></a><span class="lineno">  193</span>       <span class="keywordflow">for</span>(<span class="keywordtype">int</span> i=0;i<dimX;++i)</div>
-<div class="line"><a name="l00194"></a><span class="lineno">  194</span>     m_taps[j][i]=1.0/dimX/dimY;</div>
-<div class="line"><a name="l00195"></a><span class="lineno">  195</span>     }</div>
-<div class="line"><a name="l00196"></a><span class="lineno">  196</span>     filter(inputVector,outputVector);</div>
-<div class="line"><a name="l00197"></a><span class="lineno">  197</span>   }</div>
-<div class="line"><a name="l00198"></a><span class="lineno">  198</span>   </div>
-<div class="line"><a name="l00199"></a><span class="lineno">  199</span>   <span class="keyword">template</span><<span class="keyword">class</span> T1, <span class="keyword">class</span> T2> <span class="keywordtype">void</span> Filter2d::filter(<span class="keyword">const</span> <a class="code" href="classVector2d.html">Vector2d<T1></a>& inputVector, <a class="code" href="classVector2d.html">Vector2d<T2></a>& outputVector)</div>
-<div class="line"><a name="l00200"></a><span class="lineno">  200</span>   {</div>
-<div class="line"><a name="l00201"></a><span class="lineno">  201</span>     outputVector.resize(inputVector.size());</div>
-<div class="line"><a name="l00202"></a><span class="lineno">  202</span>     <span class="keywordtype">int</span> dimX=m_taps[0].size();<span class="comment">//horizontal!!!</span></div>
-<div class="line"><a name="l00203"></a><span class="lineno">  203</span>     <span class="keywordtype">int</span> dimY=m_taps.size();<span class="comment">//vertical!!!</span></div>
-<div class="line"><a name="l00204"></a><span class="lineno">  204</span>     <a class="code" href="classVector2d.html">Vector2d<T1></a> inBuffer(dimY);</div>
-<div class="line"><a name="l00205"></a><span class="lineno">  205</span>     std::vector<T2> outBuffer(inputVector[0].size());</div>
-<div class="line"><a name="l00206"></a><span class="lineno">  206</span>     <span class="comment">//initialize last half of inBuffer</span></div>
-<div class="line"><a name="l00207"></a><span class="lineno">  207</span>     <span class="keywordtype">int</span> indexI=0;</div>
-<div class="line"><a name="l00208"></a><span class="lineno">  208</span>     <span class="keywordtype">int</span> indexJ=0;</div>
-<div class="line"><a name="l00209"></a><span class="lineno">  209</span>     <span class="comment">//initialize last half of inBuffer</span></div>
-<div class="line"><a name="l00210"></a><span class="lineno">  210</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> j=-(dimY-1)/2;j<=dimY/2;++j){</div>
-<div class="line"><a name="l00211"></a><span class="lineno">  211</span>       inBuffer[indexJ]=inputVector[abs(j)];</div>
-<div class="line"><a name="l00212"></a><span class="lineno">  212</span>       ++indexJ;</div>
-<div class="line"><a name="l00213"></a><span class="lineno">  213</span>     }</div>
-<div class="line"><a name="l00214"></a><span class="lineno">  214</span> </div>
-<div class="line"><a name="l00215"></a><span class="lineno">  215</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> y=0;y<inputVector.size();++y){</div>
-<div class="line"><a name="l00216"></a><span class="lineno">  216</span>       <span class="keywordflow">if</span>(y){<span class="comment">//inBuffer already initialized for y=0</span></div>
-<div class="line"><a name="l00217"></a><span class="lineno">  217</span>         <span class="comment">//erase first line from inBuffer</span></div>
-<div class="line"><a name="l00218"></a><span class="lineno">  218</span>         inBuffer.erase(inBuffer.begin());</div>
-<div class="line"><a name="l00219"></a><span class="lineno">  219</span>         <span class="comment">//read extra line and push back to inBuffer if not out of bounds</span></div>
-<div class="line"><a name="l00220"></a><span class="lineno">  220</span>         <span class="keywordflow">if</span>(y+dimY/2<inputVector.size()){</div>
-<div class="line"><a name="l00221"></a><span class="lineno">  221</span>       <span class="comment">//allocate buffer</span></div>
-<div class="line"><a name="l00222"></a><span class="lineno">  222</span>           inBuffer.push_back(inputVector[y+dimY/2]);</div>
-<div class="line"><a name="l00223"></a><span class="lineno">  223</span>         }</div>
-<div class="line"><a name="l00224"></a><span class="lineno">  224</span>         <span class="keywordflow">else</span>{</div>
-<div class="line"><a name="l00225"></a><span class="lineno">  225</span>           <span class="keywordtype">int</span> over=y+dimY/2-inputVector.nRows();</div>
-<div class="line"><a name="l00226"></a><span class="lineno">  226</span>           <span class="keywordtype">int</span> index=(inBuffer.size()-1)-over;</div>
-<div class="line"><a name="l00227"></a><span class="lineno">  227</span>           assert(index>=0);</div>
-<div class="line"><a name="l00228"></a><span class="lineno">  228</span>           assert(index<inBuffer.size());</div>
-<div class="line"><a name="l00229"></a><span class="lineno">  229</span>           inBuffer.push_back(inBuffer[index]);</div>
-<div class="line"><a name="l00230"></a><span class="lineno">  230</span>         }</div>
-<div class="line"><a name="l00231"></a><span class="lineno">  231</span>       }</div>
-<div class="line"><a name="l00232"></a><span class="lineno">  232</span>       <span class="keywordflow">for</span>(<span class="keywordtype">int</span> x=0;x<inputVector.nCols();++x){</div>
-<div class="line"><a name="l00233"></a><span class="lineno">  233</span>         outBuffer[x]=0;</div>
-<div class="line"><a name="l00234"></a><span class="lineno">  234</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> j=-(dimY-1)/2;j<=dimY/2;++j){</div>
-<div class="line"><a name="l00235"></a><span class="lineno">  235</span>       <span class="keywordflow">for</span>(<span class="keywordtype">int</span> i=-(dimX-1)/2;i<=dimX/2;++i){</div>
-<div class="line"><a name="l00236"></a><span class="lineno">  236</span>         indexI=x+i;</div>
-<div class="line"><a name="l00237"></a><span class="lineno">  237</span>         indexJ=(dimY-1)/2+j;</div>
-<div class="line"><a name="l00238"></a><span class="lineno">  238</span>         <span class="comment">//check if out of bounds</span></div>
-<div class="line"><a name="l00239"></a><span class="lineno">  239</span>         <span class="keywordflow">if</span>(x<(dimX-1)/2)</div>
-<div class="line"><a name="l00240"></a><span class="lineno">  240</span>           indexI=x+abs(i);</div>
-<div class="line"><a name="l00241"></a><span class="lineno">  241</span>         <span class="keywordflow">else</span> <span class="keywordflow">if</span>(x>=inputVector.nCols()-(dimX-1)/2)</div>
-<div class="line"><a name="l00242"></a><span class="lineno">  242</span>           indexI=x-abs(i);</div>
-<div class="line"><a name="l00243"></a><span class="lineno">  243</span>         <span class="keywordflow">if</span>(y<(dimY-1)/2)</div>
-<div class="line"><a name="l00244"></a><span class="lineno">  244</span>           indexJ=(dimY-1)/2+abs(j);</div>
-<div class="line"><a name="l00245"></a><span class="lineno">  245</span>         <span class="keywordflow">else</span> <span class="keywordflow">if</span>(y>=inputVector.nRows()-(dimY-1)/2)</div>
-<div class="line"><a name="l00246"></a><span class="lineno">  246</span>           indexJ=(dimY-1)/2-abs(j);</div>
-<div class="line"><a name="l00247"></a><span class="lineno">  247</span>             outBuffer[x]+=(m_taps[(dimY-1)/2+j][(dimX-1)/2+i]*inBuffer[indexJ][indexI]);</div>
-<div class="line"><a name="l00248"></a><span class="lineno">  248</span>           }</div>
-<div class="line"><a name="l00249"></a><span class="lineno">  249</span>         }</div>
-<div class="line"><a name="l00250"></a><span class="lineno">  250</span>       }</div>
-<div class="line"><a name="l00251"></a><span class="lineno">  251</span>       <span class="comment">//copy outBuffer to outputVector</span></div>
-<div class="line"><a name="l00252"></a><span class="lineno">  252</span>       outputVector[y]=outBuffer;</div>
-<div class="line"><a name="l00253"></a><span class="lineno">  253</span>     }</div>
-<div class="line"><a name="l00254"></a><span class="lineno">  254</span>   }</div>
-<div class="line"><a name="l00255"></a><span class="lineno">  255</span> </div>
-<div class="line"><a name="l00256"></a><span class="lineno">  256</span> <span class="keyword">template</span><<span class="keyword">class</span> T1, <span class="keyword">class</span> T2> <span class="keywordtype">void</span> Filter2d::doit(<span class="keyword">const</span> <a class="code" href="classVector2d.html">Vector2d<T1></a>& inputVector, <a class="code" href="classVector2d.html">Vector2d<T2></a>& outputVector, <span class="keyword">const</span> st [...]
-<div class="line"><a name="l00257"></a><span class="lineno">  257</span> {</div>
-<div class="line"><a name="l00258"></a><span class="lineno">  258</span>   <span class="keyword">const</span> <span class="keywordtype">char</span>* pszMessage;</div>
-<div class="line"><a name="l00259"></a><span class="lineno">  259</span>   <span class="keywordtype">void</span>* pProgressArg=NULL;</div>
-<div class="line"><a name="l00260"></a><span class="lineno">  260</span>   GDALProgressFunc pfnProgress=GDALTermProgress;</div>
-<div class="line"><a name="l00261"></a><span class="lineno">  261</span>   <span class="keywordtype">double</span> progress=0;</div>
-<div class="line"><a name="l00262"></a><span class="lineno">  262</span>   pfnProgress(progress,pszMessage,pProgressArg);</div>
-<div class="line"><a name="l00263"></a><span class="lineno">  263</span> </div>
-<div class="line"><a name="l00264"></a><span class="lineno">  264</span>   <span class="keywordtype">double</span> noDataValue=0;</div>
-<div class="line"><a name="l00265"></a><span class="lineno">  265</span>   <span class="keywordflow">if</span>(m_noDataValues.size())</div>
-<div class="line"><a name="l00266"></a><span class="lineno">  266</span>     noDataValue=m_noDataValues[0];</div>
-<div class="line"><a name="l00267"></a><span class="lineno">  267</span> </div>
-<div class="line"><a name="l00268"></a><span class="lineno">  268</span>   assert(dimX);</div>
-<div class="line"><a name="l00269"></a><span class="lineno">  269</span>   assert(dimY);</div>
-<div class="line"><a name="l00270"></a><span class="lineno">  270</span> </div>
-<div class="line"><a name="l00271"></a><span class="lineno">  271</span>   <a class="code" href="classstatfactory_1_1StatFactory.html">statfactory::StatFactory</a> stat;</div>
-<div class="line"><a name="l00272"></a><span class="lineno">  272</span>   outputVector.resize((inputVector.size()+down-1)/down);</div>
-<div class="line"><a name="l00273"></a><span class="lineno">  273</span>   <a class="code" href="classVector2d.html">Vector2d<T1></a> inBuffer(dimY);</div>
-<div class="line"><a name="l00274"></a><span class="lineno">  274</span>   std::vector<T2> outBuffer((inputVector[0].size()+down-1)/down);</div>
-<div class="line"><a name="l00275"></a><span class="lineno">  275</span>   <span class="keywordtype">int</span> indexI=0;</div>
-<div class="line"><a name="l00276"></a><span class="lineno">  276</span>   <span class="keywordtype">int</span> indexJ=0;</div>
-<div class="line"><a name="l00277"></a><span class="lineno">  277</span>   <span class="comment">//initialize last half of inBuffer</span></div>
-<div class="line"><a name="l00278"></a><span class="lineno">  278</span>   <span class="keywordflow">for</span>(<span class="keywordtype">int</span> j=-(dimY-1)/2;j<=dimY/2;++j){</div>
-<div class="line"><a name="l00279"></a><span class="lineno">  279</span>     inBuffer[indexJ]=inputVector[abs(j)];</div>
-<div class="line"><a name="l00280"></a><span class="lineno">  280</span>     ++indexJ;</div>
-<div class="line"><a name="l00281"></a><span class="lineno">  281</span>   }</div>
-<div class="line"><a name="l00282"></a><span class="lineno">  282</span>   <span class="keywordflow">for</span>(<span class="keywordtype">int</span> y=0;y<inputVector.size();++y){</div>
-<div class="line"><a name="l00283"></a><span class="lineno">  283</span>     <span class="keywordflow">if</span>(y){<span class="comment">//inBuffer already initialized for y=0</span></div>
-<div class="line"><a name="l00284"></a><span class="lineno">  284</span>       <span class="comment">//erase first line from inBuffer</span></div>
-<div class="line"><a name="l00285"></a><span class="lineno">  285</span>       inBuffer.erase(inBuffer.begin());</div>
-<div class="line"><a name="l00286"></a><span class="lineno">  286</span>       <span class="comment">//read extra line and push back to inBuffer if not out of bounds</span></div>
-<div class="line"><a name="l00287"></a><span class="lineno">  287</span>       <span class="keywordflow">if</span>(y+dimY/2<inputVector.size())</div>
-<div class="line"><a name="l00288"></a><span class="lineno">  288</span>     inBuffer.push_back(inputVector[y+dimY/2]);</div>
-<div class="line"><a name="l00289"></a><span class="lineno">  289</span>       <span class="keywordflow">else</span>{</div>
-<div class="line"><a name="l00290"></a><span class="lineno">  290</span>         <span class="keywordtype">int</span> over=y+dimY/2-inputVector.size();</div>
-<div class="line"><a name="l00291"></a><span class="lineno">  291</span>         <span class="keywordtype">int</span> index=(inBuffer.size()-1)-over;</div>
-<div class="line"><a name="l00292"></a><span class="lineno">  292</span>         assert(index>=0);</div>
-<div class="line"><a name="l00293"></a><span class="lineno">  293</span>         assert(index<inBuffer.size());</div>
-<div class="line"><a name="l00294"></a><span class="lineno">  294</span>         inBuffer.push_back(inBuffer[index]);</div>
-<div class="line"><a name="l00295"></a><span class="lineno">  295</span>       }</div>
-<div class="line"><a name="l00296"></a><span class="lineno">  296</span>     }</div>
-<div class="line"><a name="l00297"></a><span class="lineno">  297</span>     <span class="keywordflow">if</span>((y+1+down/2)%down)</div>
-<div class="line"><a name="l00298"></a><span class="lineno">  298</span>       <span class="keywordflow">continue</span>;</div>
-<div class="line"><a name="l00299"></a><span class="lineno">  299</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> x=0;x<inputVector[0].size();++x){</div>
-<div class="line"><a name="l00300"></a><span class="lineno">  300</span>       <span class="keywordflow">if</span>((x+1+down/2)%down)</div>
-<div class="line"><a name="l00301"></a><span class="lineno">  301</span>         <span class="keywordflow">continue</span>;</div>
-<div class="line"><a name="l00302"></a><span class="lineno">  302</span>       outBuffer[x/down]=0;</div>
-<div class="line"><a name="l00303"></a><span class="lineno">  303</span>       std::vector<double> windowBuffer;</div>
-<div class="line"><a name="l00304"></a><span class="lineno">  304</span>       std::map<int,int> occurrence;</div>
-<div class="line"><a name="l00305"></a><span class="lineno">  305</span>       <span class="keywordtype">int</span> centre=dimX*(dimY-1)/2+(dimX-1)/2;</div>
-<div class="line"><a name="l00306"></a><span class="lineno">  306</span>       <span class="keywordflow">for</span>(<span class="keywordtype">int</span> j=-(dimY-1)/2;j<=dimY/2;++j){</div>
-<div class="line"><a name="l00307"></a><span class="lineno">  307</span>         <span class="keywordflow">for</span>(<span class="keywordtype">int</span> i=-(dimX-1)/2;i<=dimX/2;++i){</div>
-<div class="line"><a name="l00308"></a><span class="lineno">  308</span>       indexI=x+i;</div>
-<div class="line"><a name="l00309"></a><span class="lineno">  309</span>       <span class="comment">//check if out of bounds</span></div>
-<div class="line"><a name="l00310"></a><span class="lineno">  310</span>           <span class="keywordflow">if</span>(indexI<0)</div>
-<div class="line"><a name="l00311"></a><span class="lineno">  311</span>             indexI=-indexI;</div>
-<div class="line"><a name="l00312"></a><span class="lineno">  312</span>           <span class="keywordflow">else</span> <span class="keywordflow">if</span>(indexI>=inputVector[0].size())</div>
-<div class="line"><a name="l00313"></a><span class="lineno">  313</span>             indexI=inputVector[0].size()-i;</div>
-<div class="line"><a name="l00314"></a><span class="lineno">  314</span>           <span class="keywordflow">if</span>(y+j<0)</div>
-<div class="line"><a name="l00315"></a><span class="lineno">  315</span>             indexJ=-j;</div>
-<div class="line"><a name="l00316"></a><span class="lineno">  316</span>           <span class="keywordflow">else</span> <span class="keywordflow">if</span>(y+j>=inputVector.size())</div>
-<div class="line"><a name="l00317"></a><span class="lineno">  317</span>             indexJ=(dimY>2) ? (dimY-1)/2-j : 0;</div>
-<div class="line"><a name="l00318"></a><span class="lineno">  318</span>           <span class="keywordflow">else</span></div>
-<div class="line"><a name="l00319"></a><span class="lineno">  319</span>             indexJ=(dimY-1)/2+j;</div>
-<div class="line"><a name="l00320"></a><span class="lineno">  320</span>           <span class="keywordtype">bool</span> masked=<span class="keyword">false</span>;</div>
-<div class="line"><a name="l00321"></a><span class="lineno">  321</span>           <span class="keywordflow">for</span>(<span class="keywordtype">int</span> imask=0;imask<m_noDataValues.size();++imask){</div>
-<div class="line"><a name="l00322"></a><span class="lineno">  322</span>             <span class="keywordflow">if</span>(inBuffer[indexJ][indexI]==m_noDataValues[imask]){</div>
-<div class="line"><a name="l00323"></a><span class="lineno">  323</span>               masked=<span class="keyword">true</span>;</div>
-<div class="line"><a name="l00324"></a><span class="lineno">  324</span>               <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l00325"></a><span class="lineno">  325</span>             }</div>
-<div class="line"><a name="l00326"></a><span class="lineno">  326</span>           }</div>
-<div class="line"><a name="l00327"></a><span class="lineno">  327</span>           <span class="keywordflow">if</span>(!masked){</div>
-<div class="line"><a name="l00328"></a><span class="lineno">  328</span>             std::vector<short>::const_iterator vit=m_class.begin();</div>
-<div class="line"><a name="l00329"></a><span class="lineno">  329</span>             <span class="comment">//todo: test if this works (only add occurrence if within defined classes)!</span></div>
-<div class="line"><a name="l00330"></a><span class="lineno">  330</span>             <span class="keywordflow">if</span>(!m_class.size())</div>
-<div class="line"><a name="l00331"></a><span class="lineno">  331</span>               ++occurrence[inBuffer[indexJ][indexI]];</div>
-<div class="line"><a name="l00332"></a><span class="lineno">  332</span>             <span class="keywordflow">else</span>{</div>
-<div class="line"><a name="l00333"></a><span class="lineno">  333</span>               <span class="keywordflow">while</span>(vit!=m_class.end()){</div>
-<div class="line"><a name="l00334"></a><span class="lineno">  334</span>                 <span class="keywordflow">if</span>(inBuffer[indexJ][indexI]==*(vit++))</div>
-<div class="line"><a name="l00335"></a><span class="lineno">  335</span>                   ++occurrence[inBuffer[indexJ][indexI]];</div>
-<div class="line"><a name="l00336"></a><span class="lineno">  336</span>               }</div>
-<div class="line"><a name="l00337"></a><span class="lineno">  337</span>             }</div>
-<div class="line"><a name="l00338"></a><span class="lineno">  338</span>             windowBuffer.push_back(inBuffer[indexJ][indexI]);</div>
-<div class="line"><a name="l00339"></a><span class="lineno">  339</span>           }</div>
-<div class="line"><a name="l00340"></a><span class="lineno">  340</span>         }</div>
-<div class="line"><a name="l00341"></a><span class="lineno">  341</span>       }</div>
-<div class="line"><a name="l00342"></a><span class="lineno">  342</span>       <span class="keywordflow">switch</span>(getFilterType(method)){</div>
-<div class="line"><a name="l00343"></a><span class="lineno">  343</span>       <span class="keywordflow">case</span>(filter2d::median):</div>
-<div class="line"><a name="l00344"></a><span class="lineno">  344</span>         <span class="keywordflow">if</span>(windowBuffer.empty())</div>
-<div class="line"><a name="l00345"></a><span class="lineno">  345</span>           outBuffer[x/down]=noDataValue;</div>
-<div class="line"><a name="l00346"></a><span class="lineno">  346</span>         <span class="keywordflow">else</span></div>
-<div class="line"><a name="l00347"></a><span class="lineno">  347</span>           outBuffer[x/down]=stat.median(windowBuffer);</div>
-<div class="line"><a name="l00348"></a><span class="lineno">  348</span>         <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l00349"></a><span class="lineno">  349</span>       <span class="keywordflow">case</span>(filter2d::var):{</div>
-<div class="line"><a name="l00350"></a><span class="lineno">  350</span>         <span class="keywordflow">if</span>(windowBuffer.empty())</div>
-<div class="line"><a name="l00351"></a><span class="lineno">  351</span>           outBuffer[x/down]=noDataValue;</div>
-<div class="line"><a name="l00352"></a><span class="lineno">  352</span>         <span class="keywordflow">else</span></div>
-<div class="line"><a name="l00353"></a><span class="lineno">  353</span>           outBuffer[x/down]=stat.var(windowBuffer);</div>
-<div class="line"><a name="l00354"></a><span class="lineno">  354</span>         <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l00355"></a><span class="lineno">  355</span>       }</div>
-<div class="line"><a name="l00356"></a><span class="lineno">  356</span>       <span class="keywordflow">case</span>(filter2d::stdev):{</div>
-<div class="line"><a name="l00357"></a><span class="lineno">  357</span>         <span class="keywordflow">if</span>(windowBuffer.empty())</div>
-<div class="line"><a name="l00358"></a><span class="lineno">  358</span>           outBuffer[x/down]=noDataValue;</div>
-<div class="line"><a name="l00359"></a><span class="lineno">  359</span>         <span class="keywordflow">else</span></div>
-<div class="line"><a name="l00360"></a><span class="lineno">  360</span>           outBuffer[x/down]=sqrt(stat.var(windowBuffer));</div>
-<div class="line"><a name="l00361"></a><span class="lineno">  361</span>         <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l00362"></a><span class="lineno">  362</span>       }</div>
-<div class="line"><a name="l00363"></a><span class="lineno">  363</span>       <span class="keywordflow">case</span>(filter2d::mean):{</div>
-<div class="line"><a name="l00364"></a><span class="lineno">  364</span>         <span class="keywordflow">if</span>(windowBuffer.empty())</div>
-<div class="line"><a name="l00365"></a><span class="lineno">  365</span>           outBuffer[x/down]=noDataValue;</div>
-<div class="line"><a name="l00366"></a><span class="lineno">  366</span>         <span class="keywordflow">else</span></div>
-<div class="line"><a name="l00367"></a><span class="lineno">  367</span>           outBuffer[x/down]=stat.mean(windowBuffer);</div>
-<div class="line"><a name="l00368"></a><span class="lineno">  368</span>         <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l00369"></a><span class="lineno">  369</span>       }</div>
-<div class="line"><a name="l00370"></a><span class="lineno">  370</span>       <span class="keywordflow">case</span>(filter2d::min):{</div>
-<div class="line"><a name="l00371"></a><span class="lineno">  371</span>         <span class="keywordflow">if</span>(windowBuffer.empty())</div>
-<div class="line"><a name="l00372"></a><span class="lineno">  372</span>           outBuffer[x/down]=noDataValue;</div>
-<div class="line"><a name="l00373"></a><span class="lineno">  373</span>         <span class="keywordflow">else</span></div>
-<div class="line"><a name="l00374"></a><span class="lineno">  374</span>           outBuffer[x/down]=stat.mymin(windowBuffer);</div>
-<div class="line"><a name="l00375"></a><span class="lineno">  375</span>         <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l00376"></a><span class="lineno">  376</span>       }</div>
-<div class="line"><a name="l00377"></a><span class="lineno">  377</span>       <span class="keywordflow">case</span>(filter2d::ismin):{</div>
-<div class="line"><a name="l00378"></a><span class="lineno">  378</span>         <span class="keywordflow">if</span>(windowBuffer.empty())</div>
-<div class="line"><a name="l00379"></a><span class="lineno">  379</span>           outBuffer[x/down]=noDataValue;</div>
-<div class="line"><a name="l00380"></a><span class="lineno">  380</span>         <span class="keywordflow">else</span></div>
-<div class="line"><a name="l00381"></a><span class="lineno">  381</span>           outBuffer[x/down]=(stat.mymin(windowBuffer)==windowBuffer[centre])? 1:0;</div>
-<div class="line"><a name="l00382"></a><span class="lineno">  382</span>         <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l00383"></a><span class="lineno">  383</span>       }</div>
-<div class="line"><a name="l00384"></a><span class="lineno">  384</span>       <span class="keywordflow">case</span>(filter2d::minmax):{</div>
-<div class="line"><a name="l00385"></a><span class="lineno">  385</span>         <span class="keywordtype">double</span> min=0;</div>
-<div class="line"><a name="l00386"></a><span class="lineno">  386</span>         <span class="keywordtype">double</span> max=0;</div>
-<div class="line"><a name="l00387"></a><span class="lineno">  387</span>         <span class="keywordflow">if</span>(windowBuffer.empty())</div>
-<div class="line"><a name="l00388"></a><span class="lineno">  388</span>           outBuffer[x/down]=noDataValue;</div>
-<div class="line"><a name="l00389"></a><span class="lineno">  389</span>         <span class="keywordflow">else</span>{</div>
-<div class="line"><a name="l00390"></a><span class="lineno">  390</span>           stat.minmax(windowBuffer,windowBuffer.begin(),windowBuffer.end(),min,max);</div>
-<div class="line"><a name="l00391"></a><span class="lineno">  391</span>           <span class="keywordflow">if</span>(min!=max)</div>
-<div class="line"><a name="l00392"></a><span class="lineno">  392</span>             outBuffer[x/down]=0;</div>
-<div class="line"><a name="l00393"></a><span class="lineno">  393</span>           <span class="keywordflow">else</span></div>
-<div class="line"><a name="l00394"></a><span class="lineno">  394</span>             outBuffer[x/down]=windowBuffer[centre];<span class="comment">//centre pixels</span></div>
-<div class="line"><a name="l00395"></a><span class="lineno">  395</span>         }</div>
-<div class="line"><a name="l00396"></a><span class="lineno">  396</span>         <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l00397"></a><span class="lineno">  397</span>       }</div>
-<div class="line"><a name="l00398"></a><span class="lineno">  398</span>       <span class="keywordflow">case</span>(filter2d::max):{</div>
-<div class="line"><a name="l00399"></a><span class="lineno">  399</span>         <span class="keywordflow">if</span>(windowBuffer.empty())</div>
-<div class="line"><a name="l00400"></a><span class="lineno">  400</span>           outBuffer[x/down]=noDataValue;</div>
-<div class="line"><a name="l00401"></a><span class="lineno">  401</span>         <span class="keywordflow">else</span></div>
-<div class="line"><a name="l00402"></a><span class="lineno">  402</span>           outBuffer[x/down]=stat.mymax(windowBuffer);</div>
-<div class="line"><a name="l00403"></a><span class="lineno">  403</span>         <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l00404"></a><span class="lineno">  404</span>       }</div>
-<div class="line"><a name="l00405"></a><span class="lineno">  405</span>       <span class="keywordflow">case</span>(filter2d::ismax):{</div>
-<div class="line"><a name="l00406"></a><span class="lineno">  406</span>         <span class="keywordflow">if</span>(windowBuffer.empty())</div>
-<div class="line"><a name="l00407"></a><span class="lineno">  407</span>           outBuffer[x/down]=noDataValue;</div>
-<div class="line"><a name="l00408"></a><span class="lineno">  408</span>         <span class="keywordflow">else</span></div>
-<div class="line"><a name="l00409"></a><span class="lineno">  409</span>           outBuffer[x/down]=(stat.mymax(windowBuffer)==windowBuffer[centre])? 1:0;</div>
-<div class="line"><a name="l00410"></a><span class="lineno">  410</span>         <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l00411"></a><span class="lineno">  411</span>       }</div>
-<div class="line"><a name="l00412"></a><span class="lineno">  412</span>       <span class="keywordflow">case</span>(filter2d::order):{</div>
-<div class="line"><a name="l00413"></a><span class="lineno">  413</span>         <span class="keywordflow">if</span>(windowBuffer.empty())</div>
-<div class="line"><a name="l00414"></a><span class="lineno">  414</span>           outBuffer[x/down]=noDataValue;</div>
-<div class="line"><a name="l00415"></a><span class="lineno">  415</span>         <span class="keywordflow">else</span>{</div>
-<div class="line"><a name="l00416"></a><span class="lineno">  416</span>           <span class="keywordtype">double</span> lbound=0;</div>
-<div class="line"><a name="l00417"></a><span class="lineno">  417</span>           <span class="keywordtype">double</span> ubound=dimX*dimY;</div>
-<div class="line"><a name="l00418"></a><span class="lineno">  418</span>           <span class="keywordtype">double</span> theMin=stat.mymin(windowBuffer);</div>
-<div class="line"><a name="l00419"></a><span class="lineno">  419</span>           <span class="keywordtype">double</span> theMax=stat.mymax(windowBuffer);</div>
-<div class="line"><a name="l00420"></a><span class="lineno">  420</span>           <span class="keywordtype">double</span> scale=(ubound-lbound)/(theMax-theMin);</div>
-<div class="line"><a name="l00421"></a><span class="lineno">  421</span>           outBuffer[x/down]=<span class="keyword">static_cast<</span><span class="keywordtype">short</span><span class="keyword">></span>(scale*(windowBuffer[centre]-theMin)+lbound);</div>
-<div class="line"><a name="l00422"></a><span class="lineno">  422</span>         }</div>
-<div class="line"><a name="l00423"></a><span class="lineno">  423</span>         <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l00424"></a><span class="lineno">  424</span>       }</div>
-<div class="line"><a name="l00425"></a><span class="lineno">  425</span>       <span class="keywordflow">case</span>(filter2d::sum):{</div>
-<div class="line"><a name="l00426"></a><span class="lineno">  426</span>         outBuffer[x/down]=stat.sum(windowBuffer);</div>
-<div class="line"><a name="l00427"></a><span class="lineno">  427</span>         <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l00428"></a><span class="lineno">  428</span>       }</div>
-<div class="line"><a name="l00429"></a><span class="lineno">  429</span>       <span class="keywordflow">case</span>(filter2d::percentile):{</div>
-<div class="line"><a name="l00430"></a><span class="lineno">  430</span>     assert(m_threshold.size());</div>
-<div class="line"><a name="l00431"></a><span class="lineno">  431</span>         outBuffer[x/down]=stat.percentile(windowBuffer,windowBuffer.begin(),windowBuffer.end(),m_threshold[0]);</div>
-<div class="line"><a name="l00432"></a><span class="lineno">  432</span>         <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l00433"></a><span class="lineno">  433</span>       }</div>
-<div class="line"><a name="l00434"></a><span class="lineno">  434</span>       <span class="keywordflow">case</span>(filter2d::homog):</div>
-<div class="line"><a name="l00435"></a><span class="lineno">  435</span>         <span class="keywordflow">if</span>(occurrence.size()==1)<span class="comment">//all values in window must be the same</span></div>
-<div class="line"><a name="l00436"></a><span class="lineno">  436</span>           outBuffer[x/down]=inBuffer[(dimY-1)/2][x];</div>
-<div class="line"><a name="l00437"></a><span class="lineno">  437</span>         <span class="keywordflow">else</span><span class="comment">//favorize original value in case of ties</span></div>
-<div class="line"><a name="l00438"></a><span class="lineno">  438</span>           outBuffer[x/down]=noDataValue;</div>
-<div class="line"><a name="l00439"></a><span class="lineno">  439</span>         <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l00440"></a><span class="lineno">  440</span>       <span class="keywordflow">case</span>(filter2d::heterog):{</div>
-<div class="line"><a name="l00441"></a><span class="lineno">  441</span>         <span class="keywordflow">for</span>(std::vector<double>::const_iterator wit=windowBuffer.begin();wit!=windowBuffer.end();++wit){</div>
-<div class="line"><a name="l00442"></a><span class="lineno">  442</span>           <span class="keywordflow">if</span>(wit==windowBuffer.begin()+windowBuffer.size()/2)</div>
-<div class="line"><a name="l00443"></a><span class="lineno">  443</span>             <span class="keywordflow">continue</span>;</div>
-<div class="line"><a name="l00444"></a><span class="lineno">  444</span>           <span class="keywordflow">else</span> <span class="keywordflow">if</span>(*wit!=inBuffer[(dimY-1)/2][x])</div>
-<div class="line"><a name="l00445"></a><span class="lineno">  445</span>             outBuffer[x/down]=1;</div>
-<div class="line"><a name="l00446"></a><span class="lineno">  446</span>           <span class="keywordflow">else</span> <span class="keywordflow">if</span>(*wit==inBuffer[(dimY-1)/2][x]){<span class="comment">//todo:wit mag niet central pixel zijn</span></div>
-<div class="line"><a name="l00447"></a><span class="lineno">  447</span>             outBuffer[x/down]=noDataValue;</div>
-<div class="line"><a name="l00448"></a><span class="lineno">  448</span>             <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l00449"></a><span class="lineno">  449</span>           }</div>
-<div class="line"><a name="l00450"></a><span class="lineno">  450</span>         }</div>
-<div class="line"><a name="l00451"></a><span class="lineno">  451</span>         <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l00452"></a><span class="lineno">  452</span>       }</div>
-<div class="line"><a name="l00453"></a><span class="lineno">  453</span>       <span class="keywordflow">case</span>(filter2d::density):{</div>
-<div class="line"><a name="l00454"></a><span class="lineno">  454</span>         <span class="keywordflow">if</span>(windowBuffer.size()){</div>
-<div class="line"><a name="l00455"></a><span class="lineno">  455</span>           std::vector<short>::const_iterator vit=m_class.begin();</div>
-<div class="line"><a name="l00456"></a><span class="lineno">  456</span>           <span class="keywordflow">while</span>(vit!=m_class.end())</div>
-<div class="line"><a name="l00457"></a><span class="lineno">  457</span>             outBuffer[x/down]+=100.0*occurrence[*(vit++)]/windowBuffer.size();</div>
-<div class="line"><a name="l00458"></a><span class="lineno">  458</span>         }</div>
-<div class="line"><a name="l00459"></a><span class="lineno">  459</span>         <span class="keywordflow">else</span></div>
-<div class="line"><a name="l00460"></a><span class="lineno">  460</span>           outBuffer[x/down]=noDataValue;</div>
+<div class="line"><a name="l00183"></a><span class="lineno">  183</span> </div>
+<div class="line"><a name="l00184"></a><span class="lineno">  184</span>  <span class="keyword">template</span><<span class="keyword">class</span> T1, <span class="keyword">class</span> T2> <span class="keywordtype">void</span> Filter2d::smooth(<span class="keyword">const</span> <a class="code" href="classVector2d.html">Vector2d<T1></a>& inputVector, <a class="code" href="classVector2d.html">Vector2d<T2></a>& outputVector,<span class="keywordtype">int</span [...]
+<div class="line"><a name="l00185"></a><span class="lineno">  185</span>   {</div>
+<div class="line"><a name="l00186"></a><span class="lineno">  186</span>     smooth(inputVector,outputVector,dim,dim);</div>
+<div class="line"><a name="l00187"></a><span class="lineno">  187</span>   }</div>
+<div class="line"><a name="l00188"></a><span class="lineno">  188</span> </div>
+<div class="line"><a name="l00189"></a><span class="lineno">  189</span>  <span class="keyword">template</span><<span class="keyword">class</span> T1, <span class="keyword">class</span> T2> <span class="keywordtype">void</span> Filter2d::smooth(<span class="keyword">const</span> <a class="code" href="classVector2d.html">Vector2d<T1></a>& inputVector, <a class="code" href="classVector2d.html">Vector2d<T2></a>& outputVector,<span class="keywordtype">int</span [...]
+<div class="line"><a name="l00190"></a><span class="lineno">  190</span>   {</div>
+<div class="line"><a name="l00191"></a><span class="lineno">  191</span>     m_taps.resize(dimY);</div>
+<div class="line"><a name="l00192"></a><span class="lineno">  192</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> j=0;j<dimY;++j){</div>
+<div class="line"><a name="l00193"></a><span class="lineno">  193</span>       m_taps[j].resize(dimX);</div>
+<div class="line"><a name="l00194"></a><span class="lineno">  194</span>       <span class="keywordflow">for</span>(<span class="keywordtype">int</span> i=0;i<dimX;++i)</div>
+<div class="line"><a name="l00195"></a><span class="lineno">  195</span>     m_taps[j][i]=1.0/dimX/dimY;</div>
+<div class="line"><a name="l00196"></a><span class="lineno">  196</span>     }</div>
+<div class="line"><a name="l00197"></a><span class="lineno">  197</span>     filter(inputVector,outputVector);</div>
+<div class="line"><a name="l00198"></a><span class="lineno">  198</span>   }</div>
+<div class="line"><a name="l00199"></a><span class="lineno">  199</span>   </div>
+<div class="line"><a name="l00200"></a><span class="lineno">  200</span>   <span class="keyword">template</span><<span class="keyword">class</span> T1, <span class="keyword">class</span> T2> <span class="keywordtype">void</span> Filter2d::filter(<span class="keyword">const</span> <a class="code" href="classVector2d.html">Vector2d<T1></a>& inputVector, <a class="code" href="classVector2d.html">Vector2d<T2></a>& outputVector)</div>
+<div class="line"><a name="l00201"></a><span class="lineno">  201</span>   {</div>
+<div class="line"><a name="l00202"></a><span class="lineno">  202</span>     outputVector.resize(inputVector.size());</div>
+<div class="line"><a name="l00203"></a><span class="lineno">  203</span>     <span class="keywordtype">int</span> dimX=m_taps[0].size();<span class="comment">//horizontal!!!</span></div>
+<div class="line"><a name="l00204"></a><span class="lineno">  204</span>     <span class="keywordtype">int</span> dimY=m_taps.size();<span class="comment">//vertical!!!</span></div>
+<div class="line"><a name="l00205"></a><span class="lineno">  205</span>     <a class="code" href="classVector2d.html">Vector2d<T1></a> inBuffer(dimY);</div>
+<div class="line"><a name="l00206"></a><span class="lineno">  206</span>     std::vector<T2> outBuffer(inputVector[0].size());</div>
+<div class="line"><a name="l00207"></a><span class="lineno">  207</span>     <span class="comment">//initialize last half of inBuffer</span></div>
+<div class="line"><a name="l00208"></a><span class="lineno">  208</span>     <span class="keywordtype">int</span> indexI=0;</div>
+<div class="line"><a name="l00209"></a><span class="lineno">  209</span>     <span class="keywordtype">int</span> indexJ=0;</div>
+<div class="line"><a name="l00210"></a><span class="lineno">  210</span>     <span class="comment">//initialize last half of inBuffer</span></div>
+<div class="line"><a name="l00211"></a><span class="lineno">  211</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> j=-(dimY-1)/2;j<=dimY/2;++j){</div>
+<div class="line"><a name="l00212"></a><span class="lineno">  212</span>       inBuffer[indexJ]=inputVector[abs(j)];</div>
+<div class="line"><a name="l00213"></a><span class="lineno">  213</span>       ++indexJ;</div>
+<div class="line"><a name="l00214"></a><span class="lineno">  214</span>     }</div>
+<div class="line"><a name="l00215"></a><span class="lineno">  215</span> </div>
+<div class="line"><a name="l00216"></a><span class="lineno">  216</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> y=0;y<inputVector.size();++y){</div>
+<div class="line"><a name="l00217"></a><span class="lineno">  217</span>       <span class="keywordflow">if</span>(y){<span class="comment">//inBuffer already initialized for y=0</span></div>
+<div class="line"><a name="l00218"></a><span class="lineno">  218</span>         <span class="comment">//erase first line from inBuffer</span></div>
+<div class="line"><a name="l00219"></a><span class="lineno">  219</span>         inBuffer.erase(inBuffer.begin());</div>
+<div class="line"><a name="l00220"></a><span class="lineno">  220</span>         <span class="comment">//read extra line and push back to inBuffer if not out of bounds</span></div>
+<div class="line"><a name="l00221"></a><span class="lineno">  221</span>         <span class="keywordflow">if</span>(y+dimY/2<inputVector.size()){</div>
+<div class="line"><a name="l00222"></a><span class="lineno">  222</span>       <span class="comment">//allocate buffer</span></div>
+<div class="line"><a name="l00223"></a><span class="lineno">  223</span>           inBuffer.push_back(inputVector[y+dimY/2]);</div>
+<div class="line"><a name="l00224"></a><span class="lineno">  224</span>         }</div>
+<div class="line"><a name="l00225"></a><span class="lineno">  225</span>         <span class="keywordflow">else</span>{</div>
+<div class="line"><a name="l00226"></a><span class="lineno">  226</span>           <span class="keywordtype">int</span> over=y+dimY/2-inputVector.nRows();</div>
+<div class="line"><a name="l00227"></a><span class="lineno">  227</span>           <span class="keywordtype">int</span> index=(inBuffer.size()-1)-over;</div>
+<div class="line"><a name="l00228"></a><span class="lineno">  228</span>           assert(index>=0);</div>
+<div class="line"><a name="l00229"></a><span class="lineno">  229</span>           assert(index<inBuffer.size());</div>
+<div class="line"><a name="l00230"></a><span class="lineno">  230</span>           inBuffer.push_back(inBuffer[index]);</div>
+<div class="line"><a name="l00231"></a><span class="lineno">  231</span>         }</div>
+<div class="line"><a name="l00232"></a><span class="lineno">  232</span>       }</div>
+<div class="line"><a name="l00233"></a><span class="lineno">  233</span>       <span class="keywordflow">for</span>(<span class="keywordtype">int</span> x=0;x<inputVector.nCols();++x){</div>
+<div class="line"><a name="l00234"></a><span class="lineno">  234</span>         outBuffer[x]=0;</div>
+<div class="line"><a name="l00235"></a><span class="lineno">  235</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> j=-(dimY-1)/2;j<=dimY/2;++j){</div>
+<div class="line"><a name="l00236"></a><span class="lineno">  236</span>       <span class="keywordflow">for</span>(<span class="keywordtype">int</span> i=-(dimX-1)/2;i<=dimX/2;++i){</div>
+<div class="line"><a name="l00237"></a><span class="lineno">  237</span>         indexI=x+i;</div>
+<div class="line"><a name="l00238"></a><span class="lineno">  238</span>         indexJ=(dimY-1)/2+j;</div>
+<div class="line"><a name="l00239"></a><span class="lineno">  239</span>         <span class="comment">//check if out of bounds</span></div>
+<div class="line"><a name="l00240"></a><span class="lineno">  240</span>         <span class="keywordflow">if</span>(x<(dimX-1)/2)</div>
+<div class="line"><a name="l00241"></a><span class="lineno">  241</span>           indexI=x+abs(i);</div>
+<div class="line"><a name="l00242"></a><span class="lineno">  242</span>         <span class="keywordflow">else</span> <span class="keywordflow">if</span>(x>=inputVector.nCols()-(dimX-1)/2)</div>
+<div class="line"><a name="l00243"></a><span class="lineno">  243</span>           indexI=x-abs(i);</div>
+<div class="line"><a name="l00244"></a><span class="lineno">  244</span>         <span class="keywordflow">if</span>(y<(dimY-1)/2)</div>
+<div class="line"><a name="l00245"></a><span class="lineno">  245</span>           indexJ=(dimY-1)/2+abs(j);</div>
+<div class="line"><a name="l00246"></a><span class="lineno">  246</span>         <span class="keywordflow">else</span> <span class="keywordflow">if</span>(y>=inputVector.nRows()-(dimY-1)/2)</div>
+<div class="line"><a name="l00247"></a><span class="lineno">  247</span>           indexJ=(dimY-1)/2-abs(j);</div>
+<div class="line"><a name="l00248"></a><span class="lineno">  248</span>             outBuffer[x]+=(m_taps[(dimY-1)/2+j][(dimX-1)/2+i]*inBuffer[indexJ][indexI]);</div>
+<div class="line"><a name="l00249"></a><span class="lineno">  249</span>           }</div>
+<div class="line"><a name="l00250"></a><span class="lineno">  250</span>         }</div>
+<div class="line"><a name="l00251"></a><span class="lineno">  251</span>       }</div>
+<div class="line"><a name="l00252"></a><span class="lineno">  252</span>       <span class="comment">//copy outBuffer to outputVector</span></div>
+<div class="line"><a name="l00253"></a><span class="lineno">  253</span>       outputVector[y]=outBuffer;</div>
+<div class="line"><a name="l00254"></a><span class="lineno">  254</span>     }</div>
+<div class="line"><a name="l00255"></a><span class="lineno">  255</span>   }</div>
+<div class="line"><a name="l00256"></a><span class="lineno">  256</span> </div>
+<div class="line"><a name="l00257"></a><span class="lineno">  257</span> <span class="keyword">template</span><<span class="keyword">class</span> T1, <span class="keyword">class</span> T2> <span class="keywordtype">void</span> Filter2d::doit(<span class="keyword">const</span> <a class="code" href="classVector2d.html">Vector2d<T1></a>& inputVector, <a class="code" href="classVector2d.html">Vector2d<T2></a>& outputVector, <span class="keyword">const</span> st [...]
+<div class="line"><a name="l00258"></a><span class="lineno">  258</span> {</div>
+<div class="line"><a name="l00259"></a><span class="lineno">  259</span>   <span class="keyword">const</span> <span class="keywordtype">char</span>* pszMessage;</div>
+<div class="line"><a name="l00260"></a><span class="lineno">  260</span>   <span class="keywordtype">void</span>* pProgressArg=NULL;</div>
+<div class="line"><a name="l00261"></a><span class="lineno">  261</span>   GDALProgressFunc pfnProgress=GDALTermProgress;</div>
+<div class="line"><a name="l00262"></a><span class="lineno">  262</span>   <span class="keywordtype">double</span> progress=0;</div>
+<div class="line"><a name="l00263"></a><span class="lineno">  263</span>   pfnProgress(progress,pszMessage,pProgressArg);</div>
+<div class="line"><a name="l00264"></a><span class="lineno">  264</span> </div>
+<div class="line"><a name="l00265"></a><span class="lineno">  265</span>   <span class="keywordtype">double</span> noDataValue=0;</div>
+<div class="line"><a name="l00266"></a><span class="lineno">  266</span>   <span class="keywordflow">if</span>(m_noDataValues.size())</div>
+<div class="line"><a name="l00267"></a><span class="lineno">  267</span>     noDataValue=m_noDataValues[0];</div>
+<div class="line"><a name="l00268"></a><span class="lineno">  268</span> </div>
+<div class="line"><a name="l00269"></a><span class="lineno">  269</span>   assert(dimX);</div>
+<div class="line"><a name="l00270"></a><span class="lineno">  270</span>   assert(dimY);</div>
+<div class="line"><a name="l00271"></a><span class="lineno">  271</span> </div>
+<div class="line"><a name="l00272"></a><span class="lineno">  272</span>   <a class="code" href="classstatfactory_1_1StatFactory.html">statfactory::StatFactory</a> stat;</div>
+<div class="line"><a name="l00273"></a><span class="lineno">  273</span>   outputVector.resize((inputVector.size()+down-1)/down);</div>
+<div class="line"><a name="l00274"></a><span class="lineno">  274</span>   <a class="code" href="classVector2d.html">Vector2d<T1></a> inBuffer(dimY);</div>
+<div class="line"><a name="l00275"></a><span class="lineno">  275</span>   std::vector<T2> outBuffer((inputVector[0].size()+down-1)/down);</div>
+<div class="line"><a name="l00276"></a><span class="lineno">  276</span>   <span class="keywordtype">int</span> indexI=0;</div>
+<div class="line"><a name="l00277"></a><span class="lineno">  277</span>   <span class="keywordtype">int</span> indexJ=0;</div>
+<div class="line"><a name="l00278"></a><span class="lineno">  278</span>   <span class="comment">//initialize last half of inBuffer</span></div>
+<div class="line"><a name="l00279"></a><span class="lineno">  279</span>   <span class="keywordflow">for</span>(<span class="keywordtype">int</span> j=-(dimY-1)/2;j<=dimY/2;++j){</div>
+<div class="line"><a name="l00280"></a><span class="lineno">  280</span>     inBuffer[indexJ]=inputVector[abs(j)];</div>
+<div class="line"><a name="l00281"></a><span class="lineno">  281</span>     ++indexJ;</div>
+<div class="line"><a name="l00282"></a><span class="lineno">  282</span>   }</div>
+<div class="line"><a name="l00283"></a><span class="lineno">  283</span>   <span class="keywordflow">for</span>(<span class="keywordtype">int</span> y=0;y<inputVector.size();++y){</div>
+<div class="line"><a name="l00284"></a><span class="lineno">  284</span>     <span class="keywordflow">if</span>(y){<span class="comment">//inBuffer already initialized for y=0</span></div>
+<div class="line"><a name="l00285"></a><span class="lineno">  285</span>       <span class="comment">//erase first line from inBuffer</span></div>
+<div class="line"><a name="l00286"></a><span class="lineno">  286</span>       inBuffer.erase(inBuffer.begin());</div>
+<div class="line"><a name="l00287"></a><span class="lineno">  287</span>       <span class="comment">//read extra line and push back to inBuffer if not out of bounds</span></div>
+<div class="line"><a name="l00288"></a><span class="lineno">  288</span>       <span class="keywordflow">if</span>(y+dimY/2<inputVector.size())</div>
+<div class="line"><a name="l00289"></a><span class="lineno">  289</span>     inBuffer.push_back(inputVector[y+dimY/2]);</div>
+<div class="line"><a name="l00290"></a><span class="lineno">  290</span>       <span class="keywordflow">else</span>{</div>
+<div class="line"><a name="l00291"></a><span class="lineno">  291</span>         <span class="keywordtype">int</span> over=y+dimY/2-inputVector.size();</div>
+<div class="line"><a name="l00292"></a><span class="lineno">  292</span>         <span class="keywordtype">int</span> index=(inBuffer.size()-1)-over;</div>
+<div class="line"><a name="l00293"></a><span class="lineno">  293</span>         assert(index>=0);</div>
+<div class="line"><a name="l00294"></a><span class="lineno">  294</span>         assert(index<inBuffer.size());</div>
+<div class="line"><a name="l00295"></a><span class="lineno">  295</span>         inBuffer.push_back(inBuffer[index]);</div>
+<div class="line"><a name="l00296"></a><span class="lineno">  296</span>       }</div>
+<div class="line"><a name="l00297"></a><span class="lineno">  297</span>     }</div>
+<div class="line"><a name="l00298"></a><span class="lineno">  298</span>     <span class="keywordflow">if</span>((y+1+down/2)%down)</div>
+<div class="line"><a name="l00299"></a><span class="lineno">  299</span>       <span class="keywordflow">continue</span>;</div>
+<div class="line"><a name="l00300"></a><span class="lineno">  300</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> x=0;x<inputVector[0].size();++x){</div>
+<div class="line"><a name="l00301"></a><span class="lineno">  301</span>       <span class="keywordflow">if</span>((x+1+down/2)%down)</div>
+<div class="line"><a name="l00302"></a><span class="lineno">  302</span>         <span class="keywordflow">continue</span>;</div>
+<div class="line"><a name="l00303"></a><span class="lineno">  303</span>       outBuffer[x/down]=0;</div>
+<div class="line"><a name="l00304"></a><span class="lineno">  304</span>       std::vector<double> windowBuffer;</div>
+<div class="line"><a name="l00305"></a><span class="lineno">  305</span>       std::map<int,int> occurrence;</div>
+<div class="line"><a name="l00306"></a><span class="lineno">  306</span>       <span class="keywordtype">int</span> centre=dimX*(dimY-1)/2+(dimX-1)/2;</div>
+<div class="line"><a name="l00307"></a><span class="lineno">  307</span>       <span class="keywordflow">for</span>(<span class="keywordtype">int</span> j=-(dimY-1)/2;j<=dimY/2;++j){</div>
+<div class="line"><a name="l00308"></a><span class="lineno">  308</span>         <span class="keywordflow">for</span>(<span class="keywordtype">int</span> i=-(dimX-1)/2;i<=dimX/2;++i){</div>
+<div class="line"><a name="l00309"></a><span class="lineno">  309</span>       indexI=x+i;</div>
+<div class="line"><a name="l00310"></a><span class="lineno">  310</span>       <span class="comment">//check if out of bounds</span></div>
+<div class="line"><a name="l00311"></a><span class="lineno">  311</span>           <span class="keywordflow">if</span>(indexI<0)</div>
+<div class="line"><a name="l00312"></a><span class="lineno">  312</span>             indexI=-indexI;</div>
+<div class="line"><a name="l00313"></a><span class="lineno">  313</span>           <span class="keywordflow">else</span> <span class="keywordflow">if</span>(indexI>=inputVector[0].size())</div>
+<div class="line"><a name="l00314"></a><span class="lineno">  314</span>             indexI=inputVector[0].size()-i;</div>
+<div class="line"><a name="l00315"></a><span class="lineno">  315</span>           <span class="keywordflow">if</span>(y+j<0)</div>
+<div class="line"><a name="l00316"></a><span class="lineno">  316</span>             indexJ=-j;</div>
+<div class="line"><a name="l00317"></a><span class="lineno">  317</span>           <span class="keywordflow">else</span> <span class="keywordflow">if</span>(y+j>=inputVector.size())</div>
+<div class="line"><a name="l00318"></a><span class="lineno">  318</span>             indexJ=(dimY>2) ? (dimY-1)/2-j : 0;</div>
+<div class="line"><a name="l00319"></a><span class="lineno">  319</span>           <span class="keywordflow">else</span></div>
+<div class="line"><a name="l00320"></a><span class="lineno">  320</span>             indexJ=(dimY-1)/2+j;</div>
+<div class="line"><a name="l00321"></a><span class="lineno">  321</span>           <span class="keywordtype">bool</span> masked=<span class="keyword">false</span>;</div>
+<div class="line"><a name="l00322"></a><span class="lineno">  322</span>           <span class="keywordflow">for</span>(<span class="keywordtype">int</span> imask=0;imask<m_noDataValues.size();++imask){</div>
+<div class="line"><a name="l00323"></a><span class="lineno">  323</span>             <span class="keywordflow">if</span>(inBuffer[indexJ][indexI]==m_noDataValues[imask]){</div>
+<div class="line"><a name="l00324"></a><span class="lineno">  324</span>               masked=<span class="keyword">true</span>;</div>
+<div class="line"><a name="l00325"></a><span class="lineno">  325</span>               <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l00326"></a><span class="lineno">  326</span>             }</div>
+<div class="line"><a name="l00327"></a><span class="lineno">  327</span>           }</div>
+<div class="line"><a name="l00328"></a><span class="lineno">  328</span>           <span class="keywordflow">if</span>(!masked){</div>
+<div class="line"><a name="l00329"></a><span class="lineno">  329</span>             std::vector<short>::const_iterator vit=m_class.begin();</div>
+<div class="line"><a name="l00330"></a><span class="lineno">  330</span>             <span class="comment">//todo: test if this works (only add occurrence if within defined classes)!</span></div>
+<div class="line"><a name="l00331"></a><span class="lineno">  331</span>             <span class="keywordflow">if</span>(!m_class.size())</div>
+<div class="line"><a name="l00332"></a><span class="lineno">  332</span>               ++occurrence[inBuffer[indexJ][indexI]];</div>
+<div class="line"><a name="l00333"></a><span class="lineno">  333</span>             <span class="keywordflow">else</span>{</div>
+<div class="line"><a name="l00334"></a><span class="lineno">  334</span>               <span class="keywordflow">while</span>(vit!=m_class.end()){</div>
+<div class="line"><a name="l00335"></a><span class="lineno">  335</span>                 <span class="keywordflow">if</span>(inBuffer[indexJ][indexI]==*(vit++))</div>
+<div class="line"><a name="l00336"></a><span class="lineno">  336</span>                   ++occurrence[inBuffer[indexJ][indexI]];</div>
+<div class="line"><a name="l00337"></a><span class="lineno">  337</span>               }</div>
+<div class="line"><a name="l00338"></a><span class="lineno">  338</span>             }</div>
+<div class="line"><a name="l00339"></a><span class="lineno">  339</span>             windowBuffer.push_back(inBuffer[indexJ][indexI]);</div>
+<div class="line"><a name="l00340"></a><span class="lineno">  340</span>           }</div>
+<div class="line"><a name="l00341"></a><span class="lineno">  341</span>         }</div>
+<div class="line"><a name="l00342"></a><span class="lineno">  342</span>       }</div>
+<div class="line"><a name="l00343"></a><span class="lineno">  343</span>       <span class="keywordflow">switch</span>(getFilterType(method)){</div>
+<div class="line"><a name="l00344"></a><span class="lineno">  344</span>       <span class="keywordflow">case</span>(filter2d::median):</div>
+<div class="line"><a name="l00345"></a><span class="lineno">  345</span>         <span class="keywordflow">if</span>(windowBuffer.empty())</div>
+<div class="line"><a name="l00346"></a><span class="lineno">  346</span>           outBuffer[x/down]=noDataValue;</div>
+<div class="line"><a name="l00347"></a><span class="lineno">  347</span>         <span class="keywordflow">else</span></div>
+<div class="line"><a name="l00348"></a><span class="lineno">  348</span>           outBuffer[x/down]=stat.median(windowBuffer);</div>
+<div class="line"><a name="l00349"></a><span class="lineno">  349</span>         <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l00350"></a><span class="lineno">  350</span>       <span class="keywordflow">case</span>(filter2d::var):{</div>
+<div class="line"><a name="l00351"></a><span class="lineno">  351</span>         <span class="keywordflow">if</span>(windowBuffer.empty())</div>
+<div class="line"><a name="l00352"></a><span class="lineno">  352</span>           outBuffer[x/down]=noDataValue;</div>
+<div class="line"><a name="l00353"></a><span class="lineno">  353</span>         <span class="keywordflow">else</span></div>
+<div class="line"><a name="l00354"></a><span class="lineno">  354</span>           outBuffer[x/down]=stat.var(windowBuffer);</div>
+<div class="line"><a name="l00355"></a><span class="lineno">  355</span>         <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l00356"></a><span class="lineno">  356</span>       }</div>
+<div class="line"><a name="l00357"></a><span class="lineno">  357</span>       <span class="keywordflow">case</span>(filter2d::stdev):{</div>
+<div class="line"><a name="l00358"></a><span class="lineno">  358</span>         <span class="keywordflow">if</span>(windowBuffer.empty())</div>
+<div class="line"><a name="l00359"></a><span class="lineno">  359</span>           outBuffer[x/down]=noDataValue;</div>
+<div class="line"><a name="l00360"></a><span class="lineno">  360</span>         <span class="keywordflow">else</span></div>
+<div class="line"><a name="l00361"></a><span class="lineno">  361</span>           outBuffer[x/down]=sqrt(stat.var(windowBuffer));</div>
+<div class="line"><a name="l00362"></a><span class="lineno">  362</span>         <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l00363"></a><span class="lineno">  363</span>       }</div>
+<div class="line"><a name="l00364"></a><span class="lineno">  364</span>       <span class="keywordflow">case</span>(filter2d::mean):{</div>
+<div class="line"><a name="l00365"></a><span class="lineno">  365</span>         <span class="keywordflow">if</span>(windowBuffer.empty())</div>
+<div class="line"><a name="l00366"></a><span class="lineno">  366</span>           outBuffer[x/down]=noDataValue;</div>
+<div class="line"><a name="l00367"></a><span class="lineno">  367</span>         <span class="keywordflow">else</span></div>
+<div class="line"><a name="l00368"></a><span class="lineno">  368</span>           outBuffer[x/down]=stat.mean(windowBuffer);</div>
+<div class="line"><a name="l00369"></a><span class="lineno">  369</span>         <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l00370"></a><span class="lineno">  370</span>       }</div>
+<div class="line"><a name="l00371"></a><span class="lineno">  371</span>       <span class="keywordflow">case</span>(filter2d::min):{</div>
+<div class="line"><a name="l00372"></a><span class="lineno">  372</span>         <span class="keywordflow">if</span>(windowBuffer.empty())</div>
+<div class="line"><a name="l00373"></a><span class="lineno">  373</span>           outBuffer[x/down]=noDataValue;</div>
+<div class="line"><a name="l00374"></a><span class="lineno">  374</span>         <span class="keywordflow">else</span></div>
+<div class="line"><a name="l00375"></a><span class="lineno">  375</span>           outBuffer[x/down]=stat.mymin(windowBuffer);</div>
+<div class="line"><a name="l00376"></a><span class="lineno">  376</span>         <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l00377"></a><span class="lineno">  377</span>       }</div>
+<div class="line"><a name="l00378"></a><span class="lineno">  378</span>       <span class="keywordflow">case</span>(filter2d::ismin):{</div>
+<div class="line"><a name="l00379"></a><span class="lineno">  379</span>         <span class="keywordflow">if</span>(windowBuffer.empty())</div>
+<div class="line"><a name="l00380"></a><span class="lineno">  380</span>           outBuffer[x/down]=noDataValue;</div>
+<div class="line"><a name="l00381"></a><span class="lineno">  381</span>         <span class="keywordflow">else</span></div>
+<div class="line"><a name="l00382"></a><span class="lineno">  382</span>           outBuffer[x/down]=(stat.mymin(windowBuffer)==windowBuffer[centre])? 1:0;</div>
+<div class="line"><a name="l00383"></a><span class="lineno">  383</span>         <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l00384"></a><span class="lineno">  384</span>       }</div>
+<div class="line"><a name="l00385"></a><span class="lineno">  385</span>       <span class="keywordflow">case</span>(filter2d::minmax):{</div>
+<div class="line"><a name="l00386"></a><span class="lineno">  386</span>         <span class="keywordtype">double</span> min=0;</div>
+<div class="line"><a name="l00387"></a><span class="lineno">  387</span>         <span class="keywordtype">double</span> max=0;</div>
+<div class="line"><a name="l00388"></a><span class="lineno">  388</span>         <span class="keywordflow">if</span>(windowBuffer.empty())</div>
+<div class="line"><a name="l00389"></a><span class="lineno">  389</span>           outBuffer[x/down]=noDataValue;</div>
+<div class="line"><a name="l00390"></a><span class="lineno">  390</span>         <span class="keywordflow">else</span>{</div>
+<div class="line"><a name="l00391"></a><span class="lineno">  391</span>           stat.minmax(windowBuffer,windowBuffer.begin(),windowBuffer.end(),min,max);</div>
+<div class="line"><a name="l00392"></a><span class="lineno">  392</span>           <span class="keywordflow">if</span>(min!=max)</div>
+<div class="line"><a name="l00393"></a><span class="lineno">  393</span>             outBuffer[x/down]=0;</div>
+<div class="line"><a name="l00394"></a><span class="lineno">  394</span>           <span class="keywordflow">else</span></div>
+<div class="line"><a name="l00395"></a><span class="lineno">  395</span>             outBuffer[x/down]=windowBuffer[centre];<span class="comment">//centre pixels</span></div>
+<div class="line"><a name="l00396"></a><span class="lineno">  396</span>         }</div>
+<div class="line"><a name="l00397"></a><span class="lineno">  397</span>         <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l00398"></a><span class="lineno">  398</span>       }</div>
+<div class="line"><a name="l00399"></a><span class="lineno">  399</span>       <span class="keywordflow">case</span>(filter2d::max):{</div>
+<div class="line"><a name="l00400"></a><span class="lineno">  400</span>         <span class="keywordflow">if</span>(windowBuffer.empty())</div>
+<div class="line"><a name="l00401"></a><span class="lineno">  401</span>           outBuffer[x/down]=noDataValue;</div>
+<div class="line"><a name="l00402"></a><span class="lineno">  402</span>         <span class="keywordflow">else</span></div>
+<div class="line"><a name="l00403"></a><span class="lineno">  403</span>           outBuffer[x/down]=stat.mymax(windowBuffer);</div>
+<div class="line"><a name="l00404"></a><span class="lineno">  404</span>         <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l00405"></a><span class="lineno">  405</span>       }</div>
+<div class="line"><a name="l00406"></a><span class="lineno">  406</span>       <span class="keywordflow">case</span>(filter2d::ismax):{</div>
+<div class="line"><a name="l00407"></a><span class="lineno">  407</span>         <span class="keywordflow">if</span>(windowBuffer.empty())</div>
+<div class="line"><a name="l00408"></a><span class="lineno">  408</span>           outBuffer[x/down]=noDataValue;</div>
+<div class="line"><a name="l00409"></a><span class="lineno">  409</span>         <span class="keywordflow">else</span></div>
+<div class="line"><a name="l00410"></a><span class="lineno">  410</span>           outBuffer[x/down]=(stat.mymax(windowBuffer)==windowBuffer[centre])? 1:0;</div>
+<div class="line"><a name="l00411"></a><span class="lineno">  411</span>         <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l00412"></a><span class="lineno">  412</span>       }</div>
+<div class="line"><a name="l00413"></a><span class="lineno">  413</span>       <span class="keywordflow">case</span>(filter2d::order):{</div>
+<div class="line"><a name="l00414"></a><span class="lineno">  414</span>         <span class="keywordflow">if</span>(windowBuffer.empty())</div>
+<div class="line"><a name="l00415"></a><span class="lineno">  415</span>           outBuffer[x/down]=noDataValue;</div>
+<div class="line"><a name="l00416"></a><span class="lineno">  416</span>         <span class="keywordflow">else</span>{</div>
+<div class="line"><a name="l00417"></a><span class="lineno">  417</span>           <span class="keywordtype">double</span> lbound=0;</div>
+<div class="line"><a name="l00418"></a><span class="lineno">  418</span>           <span class="keywordtype">double</span> ubound=dimX*dimY;</div>
+<div class="line"><a name="l00419"></a><span class="lineno">  419</span>           <span class="keywordtype">double</span> theMin=stat.mymin(windowBuffer);</div>
+<div class="line"><a name="l00420"></a><span class="lineno">  420</span>           <span class="keywordtype">double</span> theMax=stat.mymax(windowBuffer);</div>
+<div class="line"><a name="l00421"></a><span class="lineno">  421</span>           <span class="keywordtype">double</span> scale=(ubound-lbound)/(theMax-theMin);</div>
+<div class="line"><a name="l00422"></a><span class="lineno">  422</span>           outBuffer[x/down]=<span class="keyword">static_cast<</span><span class="keywordtype">short</span><span class="keyword">></span>(scale*(windowBuffer[centre]-theMin)+lbound);</div>
+<div class="line"><a name="l00423"></a><span class="lineno">  423</span>         }</div>
+<div class="line"><a name="l00424"></a><span class="lineno">  424</span>         <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l00425"></a><span class="lineno">  425</span>       }</div>
+<div class="line"><a name="l00426"></a><span class="lineno">  426</span>       <span class="keywordflow">case</span>(filter2d::sum):{</div>
+<div class="line"><a name="l00427"></a><span class="lineno">  427</span>         outBuffer[x/down]=stat.sum(windowBuffer);</div>
+<div class="line"><a name="l00428"></a><span class="lineno">  428</span>         <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l00429"></a><span class="lineno">  429</span>       }</div>
+<div class="line"><a name="l00430"></a><span class="lineno">  430</span>       <span class="keywordflow">case</span>(filter2d::percentile):{</div>
+<div class="line"><a name="l00431"></a><span class="lineno">  431</span>     assert(m_threshold.size());</div>
+<div class="line"><a name="l00432"></a><span class="lineno">  432</span>         outBuffer[x/down]=stat.percentile(windowBuffer,windowBuffer.begin(),windowBuffer.end(),m_threshold[0]);</div>
+<div class="line"><a name="l00433"></a><span class="lineno">  433</span>         <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l00434"></a><span class="lineno">  434</span>       }</div>
+<div class="line"><a name="l00435"></a><span class="lineno">  435</span>       <span class="keywordflow">case</span>(filter2d::proportion):{</div>
+<div class="line"><a name="l00436"></a><span class="lineno">  436</span>     assert(m_threshold.size());</div>
+<div class="line"><a name="l00437"></a><span class="lineno">  437</span>     <span class="keywordtype">double</span> sum=stat.sum(windowBuffer);</div>
+<div class="line"><a name="l00438"></a><span class="lineno">  438</span>     <span class="keywordflow">if</span>(sum)</div>
+<div class="line"><a name="l00439"></a><span class="lineno">  439</span>       outBuffer[x/down]=windowBuffer[centre]/sum;</div>
+<div class="line"><a name="l00440"></a><span class="lineno">  440</span>     <span class="keywordflow">else</span></div>
+<div class="line"><a name="l00441"></a><span class="lineno">  441</span>       outBuffer[x/down]=noDataValue;</div>
+<div class="line"><a name="l00442"></a><span class="lineno">  442</span>         <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l00443"></a><span class="lineno">  443</span>       }</div>
+<div class="line"><a name="l00444"></a><span class="lineno">  444</span>       <span class="keywordflow">case</span>(filter2d::homog):</div>
+<div class="line"><a name="l00445"></a><span class="lineno">  445</span>         <span class="keywordflow">if</span>(occurrence.size()==1)<span class="comment">//all values in window must be the same</span></div>
+<div class="line"><a name="l00446"></a><span class="lineno">  446</span>           outBuffer[x/down]=inBuffer[(dimY-1)/2][x];</div>
+<div class="line"><a name="l00447"></a><span class="lineno">  447</span>         <span class="keywordflow">else</span><span class="comment">//favorize original value in case of ties</span></div>
+<div class="line"><a name="l00448"></a><span class="lineno">  448</span>           outBuffer[x/down]=noDataValue;</div>
+<div class="line"><a name="l00449"></a><span class="lineno">  449</span>         <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l00450"></a><span class="lineno">  450</span>       <span class="keywordflow">case</span>(filter2d::heterog):{</div>
+<div class="line"><a name="l00451"></a><span class="lineno">  451</span>         <span class="keywordflow">for</span>(std::vector<double>::const_iterator wit=windowBuffer.begin();wit!=windowBuffer.end();++wit){</div>
+<div class="line"><a name="l00452"></a><span class="lineno">  452</span>           <span class="keywordflow">if</span>(wit==windowBuffer.begin()+windowBuffer.size()/2)</div>
+<div class="line"><a name="l00453"></a><span class="lineno">  453</span>             <span class="keywordflow">continue</span>;</div>
+<div class="line"><a name="l00454"></a><span class="lineno">  454</span>           <span class="keywordflow">else</span> <span class="keywordflow">if</span>(*wit!=inBuffer[(dimY-1)/2][x])</div>
+<div class="line"><a name="l00455"></a><span class="lineno">  455</span>             outBuffer[x/down]=1;</div>
+<div class="line"><a name="l00456"></a><span class="lineno">  456</span>           <span class="keywordflow">else</span> <span class="keywordflow">if</span>(*wit==inBuffer[(dimY-1)/2][x]){<span class="comment">//todo:wit mag niet central pixel zijn</span></div>
+<div class="line"><a name="l00457"></a><span class="lineno">  457</span>             outBuffer[x/down]=noDataValue;</div>
+<div class="line"><a name="l00458"></a><span class="lineno">  458</span>             <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l00459"></a><span class="lineno">  459</span>           }</div>
+<div class="line"><a name="l00460"></a><span class="lineno">  460</span>         }</div>
 <div class="line"><a name="l00461"></a><span class="lineno">  461</span>         <span class="keywordflow">break</span>;</div>
 <div class="line"><a name="l00462"></a><span class="lineno">  462</span>       }</div>
-<div class="line"><a name="l00463"></a><span class="lineno">  463</span>       <span class="keywordflow">case</span>(filter2d::countid):{</div>
-<div class="line"><a name="l00464"></a><span class="lineno">  464</span>     <span class="keywordflow">if</span>(windowBuffer.size())</div>
-<div class="line"><a name="l00465"></a><span class="lineno">  465</span>       outBuffer[x/down]=occurrence.size();</div>
-<div class="line"><a name="l00466"></a><span class="lineno">  466</span>     <span class="keywordflow">else</span></div>
-<div class="line"><a name="l00467"></a><span class="lineno">  467</span>       outBuffer[x/down]=noDataValue;</div>
-<div class="line"><a name="l00468"></a><span class="lineno">  468</span>     <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l00469"></a><span class="lineno">  469</span>       }</div>
-<div class="line"><a name="l00470"></a><span class="lineno">  470</span>       <span class="keywordflow">case</span>(filter2d::mode):{</div>
-<div class="line"><a name="l00471"></a><span class="lineno">  471</span>         <span class="keywordflow">if</span>(occurrence.size()){</div>
-<div class="line"><a name="l00472"></a><span class="lineno">  472</span>           std::map<int,int>::const_iterator maxit=occurrence.begin();</div>
-<div class="line"><a name="l00473"></a><span class="lineno">  473</span>           <span class="keywordflow">for</span>(std::map<int,int>::const_iterator mit=occurrence.begin();mit!=occurrence.end();++mit){</div>
-<div class="line"><a name="l00474"></a><span class="lineno">  474</span>             <span class="keywordflow">if</span>(mit->second>maxit->second)</div>
-<div class="line"><a name="l00475"></a><span class="lineno">  475</span>               maxit=mit;</div>
-<div class="line"><a name="l00476"></a><span class="lineno">  476</span>           }</div>
-<div class="line"><a name="l00477"></a><span class="lineno">  477</span>           <span class="keywordflow">if</span>(occurrence[inBuffer[(dimY-1)/2][x]]<maxit->second)<span class="comment">//</span></div>
-<div class="line"><a name="l00478"></a><span class="lineno">  478</span>             outBuffer[x/down]=maxit->first;</div>
-<div class="line"><a name="l00479"></a><span class="lineno">  479</span>           <span class="keywordflow">else</span><span class="comment">//favorize original value in case of ties</span></div>
-<div class="line"><a name="l00480"></a><span class="lineno">  480</span>             outBuffer[x/down]=inBuffer[(dimY-1)/2][x];</div>
-<div class="line"><a name="l00481"></a><span class="lineno">  481</span>         }</div>
-<div class="line"><a name="l00482"></a><span class="lineno">  482</span>         <span class="keywordflow">else</span></div>
-<div class="line"><a name="l00483"></a><span class="lineno">  483</span>           outBuffer[x/down]=noDataValue;</div>
-<div class="line"><a name="l00484"></a><span class="lineno">  484</span>         <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l00485"></a><span class="lineno">  485</span>       }</div>
-<div class="line"><a name="l00486"></a><span class="lineno">  486</span>       <span class="keywordflow">case</span>(filter2d::threshold):{</div>
-<div class="line"><a name="l00487"></a><span class="lineno">  487</span>         assert(m_class.size()==m_threshold.size());</div>
-<div class="line"><a name="l00488"></a><span class="lineno">  488</span>         <span class="keywordflow">if</span>(windowBuffer.size()){</div>
-<div class="line"><a name="l00489"></a><span class="lineno">  489</span>           outBuffer[x/down]=inBuffer[(dimY-1)/2][x];<span class="comment">//initialize with original value (in case thresholds not met)</span></div>
-<div class="line"><a name="l00490"></a><span class="lineno">  490</span>           <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iclass=0;iclass<m_class.size();++iclass){</div>
-<div class="line"><a name="l00491"></a><span class="lineno">  491</span>             <span class="keywordflow">if</span>(100.0*(occurrence[m_class[iclass]])/windowBuffer.size()>m_threshold[iclass])</div>
-<div class="line"><a name="l00492"></a><span class="lineno">  492</span>               outBuffer[x/down]=m_class[iclass];</div>
-<div class="line"><a name="l00493"></a><span class="lineno">  493</span>           }</div>
-<div class="line"><a name="l00494"></a><span class="lineno">  494</span>         }</div>
-<div class="line"><a name="l00495"></a><span class="lineno">  495</span>         <span class="keywordflow">else</span></div>
-<div class="line"><a name="l00496"></a><span class="lineno">  496</span>           outBuffer[x/down]=noDataValue;</div>
-<div class="line"><a name="l00497"></a><span class="lineno">  497</span>         <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l00498"></a><span class="lineno">  498</span>       }</div>
-<div class="line"><a name="l00499"></a><span class="lineno">  499</span>       <span class="keywordflow">case</span>(filter2d::scramble):{<span class="comment">//could be done more efficiently window by window with random shuffling entire buffer and assigning entire buffer at once to output image...</span></div>
-<div class="line"><a name="l00500"></a><span class="lineno">  500</span>     <span class="keywordflow">if</span>(windowBuffer.size()){</div>
-<div class="line"><a name="l00501"></a><span class="lineno">  501</span>       <span class="keywordtype">int</span> randomIndex=std::rand()%windowBuffer.size();</div>
-<div class="line"><a name="l00502"></a><span class="lineno">  502</span>       <span class="keywordflow">if</span>(randomIndex>=windowBuffer.size())</div>
-<div class="line"><a name="l00503"></a><span class="lineno">  503</span>         outBuffer[x/down]=windowBuffer.back();</div>
-<div class="line"><a name="l00504"></a><span class="lineno">  504</span>       <span class="keywordflow">else</span> <span class="keywordflow">if</span>(randomIndex<0)</div>
-<div class="line"><a name="l00505"></a><span class="lineno">  505</span>         outBuffer[x/down]=windowBuffer[0];</div>
-<div class="line"><a name="l00506"></a><span class="lineno">  506</span>       <span class="keywordflow">else</span></div>
-<div class="line"><a name="l00507"></a><span class="lineno">  507</span>         outBuffer[x/down]=windowBuffer[randomIndex];</div>
-<div class="line"><a name="l00508"></a><span class="lineno">  508</span>     }</div>
-<div class="line"><a name="l00509"></a><span class="lineno">  509</span>     <span class="keywordflow">else</span></div>
-<div class="line"><a name="l00510"></a><span class="lineno">  510</span>       outBuffer[x/down]=noDataValue;</div>
-<div class="line"><a name="l00511"></a><span class="lineno">  511</span>     <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l00512"></a><span class="lineno">  512</span>       }</div>
-<div class="line"><a name="l00513"></a><span class="lineno">  513</span>       <span class="keywordflow">case</span>(filter2d::mixed):{</div>
-<div class="line"><a name="l00514"></a><span class="lineno">  514</span>         <span class="keyword">enum</span> MixType { BF=11, CF=12, MF=13, NF=20, W=30 };</div>
-<div class="line"><a name="l00515"></a><span class="lineno">  515</span>         <span class="keywordtype">double</span> nBF=occurrence[BF];</div>
-<div class="line"><a name="l00516"></a><span class="lineno">  516</span>         <span class="keywordtype">double</span> nCF=occurrence[CF];</div>
-<div class="line"><a name="l00517"></a><span class="lineno">  517</span>         <span class="keywordtype">double</span> nMF=occurrence[MF];</div>
-<div class="line"><a name="l00518"></a><span class="lineno">  518</span>         <span class="keywordtype">double</span> nNF=occurrence[NF];</div>
-<div class="line"><a name="l00519"></a><span class="lineno">  519</span>         <span class="keywordtype">double</span> nW=occurrence[W];</div>
-<div class="line"><a name="l00520"></a><span class="lineno">  520</span>         <span class="keywordflow">if</span>(windowBuffer.size()){</div>
-<div class="line"><a name="l00521"></a><span class="lineno">  521</span>           <span class="keywordflow">if</span>((nBF+nCF+nMF)&&(nBF+nCF+nMF>=nNF+nW)){<span class="comment">//forest</span></div>
-<div class="line"><a name="l00522"></a><span class="lineno">  522</span>             <span class="keywordflow">if</span>(nBF/(nBF+nCF)>=0.75)</div>
-<div class="line"><a name="l00523"></a><span class="lineno">  523</span>               outBuffer[x/down]=BF;</div>
-<div class="line"><a name="l00524"></a><span class="lineno">  524</span>             <span class="keywordflow">else</span> <span class="keywordflow">if</span>(nCF/(nBF+nCF)>=0.75)</div>
-<div class="line"><a name="l00525"></a><span class="lineno">  525</span>               outBuffer[x/down]=CF;</div>
-<div class="line"><a name="l00526"></a><span class="lineno">  526</span>             <span class="keywordflow">else</span></div>
-<div class="line"><a name="l00527"></a><span class="lineno">  527</span>               outBuffer[x/down]=MF;</div>
-<div class="line"><a name="l00528"></a><span class="lineno">  528</span>           }</div>
-<div class="line"><a name="l00529"></a><span class="lineno">  529</span>           <span class="keywordflow">else</span>{<span class="comment">//non-forest</span></div>
-<div class="line"><a name="l00530"></a><span class="lineno">  530</span>             <span class="keywordflow">if</span>(nW&&(nW>=nNF))</div>
-<div class="line"><a name="l00531"></a><span class="lineno">  531</span>               outBuffer[x/down]=W;</div>
-<div class="line"><a name="l00532"></a><span class="lineno">  532</span>             <span class="keywordflow">else</span></div>
-<div class="line"><a name="l00533"></a><span class="lineno">  533</span>               outBuffer[x/down]=NF;</div>
-<div class="line"><a name="l00534"></a><span class="lineno">  534</span>           }</div>
-<div class="line"><a name="l00535"></a><span class="lineno">  535</span>         }</div>
-<div class="line"><a name="l00536"></a><span class="lineno">  536</span>         <span class="keywordflow">else</span></div>
-<div class="line"><a name="l00537"></a><span class="lineno">  537</span>           outBuffer[x/down]=inBuffer[indexJ][indexI];</div>
-<div class="line"><a name="l00538"></a><span class="lineno">  538</span>         <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l00539"></a><span class="lineno">  539</span>       }</div>
-<div class="line"><a name="l00540"></a><span class="lineno">  540</span>       <span class="keywordflow">default</span>:</div>
-<div class="line"><a name="l00541"></a><span class="lineno">  541</span>         <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l00542"></a><span class="lineno">  542</span>       }</div>
-<div class="line"><a name="l00543"></a><span class="lineno">  543</span>     }</div>
-<div class="line"><a name="l00544"></a><span class="lineno">  544</span>     progress=(1.0+y/down);</div>
-<div class="line"><a name="l00545"></a><span class="lineno">  545</span>     progress+=(outputVector.size());</div>
-<div class="line"><a name="l00546"></a><span class="lineno">  546</span>     progress/=outputVector.size();</div>
-<div class="line"><a name="l00547"></a><span class="lineno">  547</span>     pfnProgress(progress,pszMessage,pProgressArg);</div>
-<div class="line"><a name="l00548"></a><span class="lineno">  548</span>     <span class="comment">//copy outBuffer to outputVector</span></div>
-<div class="line"><a name="l00549"></a><span class="lineno">  549</span>     outputVector[y/down]=outBuffer;</div>
-<div class="line"><a name="l00550"></a><span class="lineno">  550</span>   }</div>
-<div class="line"><a name="l00551"></a><span class="lineno">  551</span> }</div>
-<div class="line"><a name="l00552"></a><span class="lineno">  552</span> </div>
-<div class="line"><a name="l00553"></a><span class="lineno">  553</span> <span class="comment">// class Compare_mapValue{</span></div>
-<div class="line"><a name="l00554"></a><span class="lineno">  554</span> <span class="comment">// public:</span></div>
-<div class="line"><a name="l00555"></a><span class="lineno">  555</span> <span class="comment">//   int operator() (const map<int,int>::value_type& v1, const map<int, int>::value_type& v2) const{</span></div>
-<div class="line"><a name="l00556"></a><span class="lineno">  556</span> <span class="comment">//     return (v1.second)>(v2.second);</span></div>
-<div class="line"><a name="l00557"></a><span class="lineno">  557</span> <span class="comment">//   }</span></div>
-<div class="line"><a name="l00558"></a><span class="lineno">  558</span> <span class="comment">// };</span></div>
-<div class="line"><a name="l00559"></a><span class="lineno">  559</span> </div>
-<div class="line"><a name="l00560"></a><span class="lineno">  560</span> <span class="keyword">template</span><<span class="keyword">class</span> T> <span class="keywordtype">void</span> Filter2d::shift(<span class="keyword">const</span> <a class="code" href="classVector2d.html">Vector2d<T></a>& input, <a class="code" href="classVector2d.html">Vector2d<T></a>& output, <span class="keywordtype">double</span> offsetX, <span class="keywordtype">double</span> o [...]
-<div class="line"><a name="l00561"></a><span class="lineno">  561</span>   output.resize(input.nRows(),input.nCols());</div>
-<div class="line"><a name="l00562"></a><span class="lineno">  562</span>   <span class="keyword">const</span> gsl_rng_type *rangenType;</div>
-<div class="line"><a name="l00563"></a><span class="lineno">  563</span>   gsl_rng *rangen;</div>
-<div class="line"><a name="l00564"></a><span class="lineno">  564</span>   gsl_rng_env_setup();</div>
-<div class="line"><a name="l00565"></a><span class="lineno">  565</span>   rangenType=gsl_rng_default;</div>
-<div class="line"><a name="l00566"></a><span class="lineno">  566</span>   rangen=gsl_rng_alloc(rangenType);</div>
-<div class="line"><a name="l00567"></a><span class="lineno">  567</span>   <span class="keywordtype">long</span> seed=time(NULL)*getpid();</div>
-<div class="line"><a name="l00568"></a><span class="lineno">  568</span>   gsl_rng_set(rangen,seed);</div>
-<div class="line"><a name="l00569"></a><span class="lineno">  569</span>   <span class="keyword">const</span> <span class="keywordtype">char</span>* pszMessage;</div>
-<div class="line"><a name="l00570"></a><span class="lineno">  570</span>   <span class="keywordtype">void</span>* pProgressArg=NULL;</div>
-<div class="line"><a name="l00571"></a><span class="lineno">  571</span>   GDALProgressFunc pfnProgress=GDALTermProgress;</div>
-<div class="line"><a name="l00572"></a><span class="lineno">  572</span>   <span class="keywordtype">double</span> progress=0;</div>
-<div class="line"><a name="l00573"></a><span class="lineno">  573</span>   pfnProgress(progress,pszMessage,pProgressArg);</div>
-<div class="line"><a name="l00574"></a><span class="lineno">  574</span>   <span class="keywordflow">for</span>(<span class="keywordtype">int</span> j=0;j<input.nRows();++j){</div>
-<div class="line"><a name="l00575"></a><span class="lineno">  575</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> i=0;i<input.nCols();++i){</div>
-<div class="line"><a name="l00576"></a><span class="lineno">  576</span>       T theValue=0;</div>
-<div class="line"><a name="l00577"></a><span class="lineno">  577</span>       <span class="keywordtype">double</span> randomX=0;</div>
-<div class="line"><a name="l00578"></a><span class="lineno">  578</span>       <span class="keywordtype">double</span> randomY=0;</div>
-<div class="line"><a name="l00579"></a><span class="lineno">  579</span>       <span class="keywordflow">if</span>(randomSigma>0){</div>
-<div class="line"><a name="l00580"></a><span class="lineno">  580</span>         randomX=gsl_ran_gaussian(rangen,randomSigma);</div>
-<div class="line"><a name="l00581"></a><span class="lineno">  581</span>         randomY=gsl_ran_gaussian(rangen,randomSigma);</div>
-<div class="line"><a name="l00582"></a><span class="lineno">  582</span>       }</div>
-<div class="line"><a name="l00583"></a><span class="lineno">  583</span>       <span class="keywordtype">double</span> readCol=i+offsetX+randomX;</div>
-<div class="line"><a name="l00584"></a><span class="lineno">  584</span>       <span class="keywordtype">double</span> readRow=j+offsetY+randomY;</div>
-<div class="line"><a name="l00585"></a><span class="lineno">  585</span>       <span class="keywordflow">if</span>(readRow<0)</div>
-<div class="line"><a name="l00586"></a><span class="lineno">  586</span>         readRow=0;</div>
-<div class="line"><a name="l00587"></a><span class="lineno">  587</span>       <span class="keywordflow">if</span>(readRow>input.nRows()-1)</div>
-<div class="line"><a name="l00588"></a><span class="lineno">  588</span>         readRow=input.nRows()-1;</div>
-<div class="line"><a name="l00589"></a><span class="lineno">  589</span>       <span class="keywordflow">if</span>(readCol<0)</div>
-<div class="line"><a name="l00590"></a><span class="lineno">  590</span>         readCol=0;</div>
-<div class="line"><a name="l00591"></a><span class="lineno">  591</span>       <span class="keywordflow">if</span>(readCol>input.nCols()-1)</div>
-<div class="line"><a name="l00592"></a><span class="lineno">  592</span>         readCol=input.nCols()-1;</div>
-<div class="line"><a name="l00593"></a><span class="lineno">  593</span>       <span class="keywordflow">switch</span>(resample){</div>
-<div class="line"><a name="l00594"></a><span class="lineno">  594</span>       <span class="keywordflow">case</span>(BILINEAR):{</div>
-<div class="line"><a name="l00595"></a><span class="lineno">  595</span>         <span class="keywordtype">double</span> lowerRow=readRow-0.5;</div>
-<div class="line"><a name="l00596"></a><span class="lineno">  596</span>         <span class="keywordtype">double</span> upperRow=readRow+0.5;</div>
-<div class="line"><a name="l00597"></a><span class="lineno">  597</span>         lowerRow=<span class="keyword">static_cast<</span><span class="keywordtype">int</span><span class="keyword">></span>(lowerRow);</div>
-<div class="line"><a name="l00598"></a><span class="lineno">  598</span>         upperRow=<span class="keyword">static_cast<</span><span class="keywordtype">int</span><span class="keyword">></span>(upperRow);</div>
-<div class="line"><a name="l00599"></a><span class="lineno">  599</span>         <span class="keywordtype">double</span> lowerCol=readCol-0.5;</div>
-<div class="line"><a name="l00600"></a><span class="lineno">  600</span>         <span class="keywordtype">double</span> upperCol=readCol+0.5;</div>
-<div class="line"><a name="l00601"></a><span class="lineno">  601</span>         lowerCol=<span class="keyword">static_cast<</span><span class="keywordtype">int</span><span class="keyword">></span>(lowerCol);</div>
-<div class="line"><a name="l00602"></a><span class="lineno">  602</span>         upperCol=<span class="keyword">static_cast<</span><span class="keywordtype">int</span><span class="keyword">></span>(upperCol);</div>
-<div class="line"><a name="l00603"></a><span class="lineno">  603</span>         assert(lowerRow>=0);</div>
-<div class="line"><a name="l00604"></a><span class="lineno">  604</span>         assert(lowerRow<input.nRows());</div>
-<div class="line"><a name="l00605"></a><span class="lineno">  605</span>         assert(lowerCol>=0);</div>
-<div class="line"><a name="l00606"></a><span class="lineno">  606</span>         assert(lowerCol<input.nCols());</div>
-<div class="line"><a name="l00607"></a><span class="lineno">  607</span>         assert(upperRow>=0);</div>
-<div class="line"><a name="l00608"></a><span class="lineno">  608</span>         assert(upperRow<input.nRows());</div>
-<div class="line"><a name="l00609"></a><span class="lineno">  609</span>         assert(upperCol>=0);</div>
-<div class="line"><a name="l00610"></a><span class="lineno">  610</span>         <span class="keywordflow">if</span>(upperCol>=input.nCols()){</div>
-<div class="line"><a name="l00611"></a><span class="lineno">  611</span>           std::cout << <span class="stringliteral">"upperCol: "</span> << upperCol << std::endl;</div>
-<div class="line"><a name="l00612"></a><span class="lineno">  612</span>           std::cout << <span class="stringliteral">"readCol: "</span> << readCol << std::endl;</div>
-<div class="line"><a name="l00613"></a><span class="lineno">  613</span>           std::cout << <span class="stringliteral">"readCol+0.5: "</span> << readCol+0.5 << std::endl;</div>
-<div class="line"><a name="l00614"></a><span class="lineno">  614</span>           std::cout << <span class="stringliteral">"static_cast<int>(readCol+0.5): "</span> << <span class="keyword">static_cast<</span><span class="keywordtype">int</span><span class="keyword">></span>(readCol+0.5) << std::endl;</div>
-<div class="line"><a name="l00615"></a><span class="lineno">  615</span>         }</div>
-<div class="line"><a name="l00616"></a><span class="lineno">  616</span>         assert(upperCol<input.nCols());</div>
-<div class="line"><a name="l00617"></a><span class="lineno">  617</span>         <span class="keywordtype">double</span> c00=input[lowerRow][lowerCol];</div>
-<div class="line"><a name="l00618"></a><span class="lineno">  618</span>         <span class="keywordtype">double</span> c11=input[upperRow][upperCol];</div>
-<div class="line"><a name="l00619"></a><span class="lineno">  619</span>         <span class="keywordtype">double</span> c01=input[lowerRow][upperCol];</div>
-<div class="line"><a name="l00620"></a><span class="lineno">  620</span>         <span class="keywordtype">double</span> c10=input[upperRow][lowerCol];</div>
-<div class="line"><a name="l00621"></a><span class="lineno">  621</span>         <span class="keywordtype">double</span> a=(upperCol-readCol)*c00+(readCol-lowerCol)*c01;</div>
-<div class="line"><a name="l00622"></a><span class="lineno">  622</span>         <span class="keywordtype">double</span> b=(upperCol-readCol)*c10+(readCol-lowerCol)*c11;</div>
-<div class="line"><a name="l00623"></a><span class="lineno">  623</span>         theValue=(upperRow-readRow)*a+(readRow-lowerRow)*b;</div>
-<div class="line"><a name="l00624"></a><span class="lineno">  624</span>         <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l00625"></a><span class="lineno">  625</span>       }</div>
-<div class="line"><a name="l00626"></a><span class="lineno">  626</span>       <span class="keywordflow">default</span>:</div>
-<div class="line"><a name="l00627"></a><span class="lineno">  627</span>         theValue=input[<span class="keyword">static_cast<</span><span class="keywordtype">int</span><span class="keyword">></span>(readRow)][static_cast<int>(readCol)];</div>
-<div class="line"><a name="l00628"></a><span class="lineno">  628</span>         <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l00629"></a><span class="lineno">  629</span>       }</div>
-<div class="line"><a name="l00630"></a><span class="lineno">  630</span>       assert(j>=0);</div>
-<div class="line"><a name="l00631"></a><span class="lineno">  631</span>       assert(j<output.nRows());</div>
-<div class="line"><a name="l00632"></a><span class="lineno">  632</span>       assert(i>=0);</div>
-<div class="line"><a name="l00633"></a><span class="lineno">  633</span>       assert(i<output.nCols());</div>
-<div class="line"><a name="l00634"></a><span class="lineno">  634</span>       output[j][i]=theValue;</div>
-<div class="line"><a name="l00635"></a><span class="lineno">  635</span>     }</div>
-<div class="line"><a name="l00636"></a><span class="lineno">  636</span>     progress=(1.0+j);</div>
-<div class="line"><a name="l00637"></a><span class="lineno">  637</span>     progress/=output.nRows();</div>
-<div class="line"><a name="l00638"></a><span class="lineno">  638</span>     pfnProgress(progress,pszMessage,pProgressArg);</div>
-<div class="line"><a name="l00639"></a><span class="lineno">  639</span>   }</div>
-<div class="line"><a name="l00640"></a><span class="lineno">  640</span>   gsl_rng_free(rangen);</div>
-<div class="line"><a name="l00641"></a><span class="lineno">  641</span> }</div>
-<div class="line"><a name="l00642"></a><span class="lineno">  642</span> </div>
-<div class="line"><a name="l00643"></a><span class="lineno">  643</span> <span class="keyword">template</span><<span class="keyword">class</span> T> <span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> Filter2d::morphology(<span class="keyword">const</span> <a class="code" href="classVector2d.html">Vector2d<T></a>& input, <a class="code" href="classVector2d.html">Vector2d<T></a>& output, <span  [...]
-<div class="line"><a name="l00644"></a><span class="lineno">  644</span> {</div>
-<div class="line"><a name="l00645"></a><span class="lineno">  645</span>   <span class="keyword">const</span> <span class="keywordtype">char</span>* pszMessage;</div>
-<div class="line"><a name="l00646"></a><span class="lineno">  646</span>   <span class="keywordtype">void</span>* pProgressArg=NULL;</div>
-<div class="line"><a name="l00647"></a><span class="lineno">  647</span>   GDALProgressFunc pfnProgress=GDALTermProgress;</div>
-<div class="line"><a name="l00648"></a><span class="lineno">  648</span>   <span class="keywordtype">double</span> progress=0;</div>
-<div class="line"><a name="l00649"></a><span class="lineno">  649</span>   pfnProgress(progress,pszMessage,pProgressArg);</div>
-<div class="line"><a name="l00650"></a><span class="lineno">  650</span> </div>
-<div class="line"><a name="l00651"></a><span class="lineno">  651</span>   <span class="keywordtype">double</span> noDataValue=0;</div>
-<div class="line"><a name="l00652"></a><span class="lineno">  652</span>   <span class="keywordflow">if</span>(m_noDataValues.size())</div>
-<div class="line"><a name="l00653"></a><span class="lineno">  653</span>     noDataValue=m_noDataValues[0];</div>
-<div class="line"><a name="l00654"></a><span class="lineno">  654</span> </div>
-<div class="line"><a name="l00655"></a><span class="lineno">  655</span>   <span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> nchange=0;</div>
-<div class="line"><a name="l00656"></a><span class="lineno">  656</span>   assert(dimX);</div>
-<div class="line"><a name="l00657"></a><span class="lineno">  657</span>   assert(dimY);</div>
-<div class="line"><a name="l00658"></a><span class="lineno">  658</span>   <a class="code" href="classstatfactory_1_1StatFactory.html">statfactory::StatFactory</a> stat;</div>
-<div class="line"><a name="l00659"></a><span class="lineno">  659</span>   <a class="code" href="classVector2d.html">Vector2d<T></a> inBuffer(dimY,input.nCols());</div>
-<div class="line"><a name="l00660"></a><span class="lineno">  660</span>   output.clear();</div>
-<div class="line"><a name="l00661"></a><span class="lineno">  661</span>   output.resize(input.nRows(),input.nCols());</div>
-<div class="line"><a name="l00662"></a><span class="lineno">  662</span>   <span class="keywordtype">int</span> indexI=0;</div>
-<div class="line"><a name="l00663"></a><span class="lineno">  663</span>   <span class="keywordtype">int</span> indexJ=0;</div>
-<div class="line"><a name="l00664"></a><span class="lineno">  664</span>   <span class="comment">//initialize last half of inBuffer</span></div>
-<div class="line"><a name="l00665"></a><span class="lineno">  665</span>   <span class="keywordflow">for</span>(<span class="keywordtype">int</span> j=-(dimY-1)/2;j<=dimY/2;++j){</div>
-<div class="line"><a name="l00666"></a><span class="lineno">  666</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> i=0;i<input.nCols();++i)</div>
-<div class="line"><a name="l00667"></a><span class="lineno">  667</span>       inBuffer[indexJ][i]=input[abs(j)][i];</div>
-<div class="line"><a name="l00668"></a><span class="lineno">  668</span>     ++indexJ;</div>
-<div class="line"><a name="l00669"></a><span class="lineno">  669</span>   }</div>
-<div class="line"><a name="l00670"></a><span class="lineno">  670</span>   <span class="keywordflow">for</span>(<span class="keywordtype">int</span> y=0;y<input.nRows();++y){</div>
-<div class="line"><a name="l00671"></a><span class="lineno">  671</span>     <span class="keywordflow">if</span>(y){<span class="comment">//inBuffer already initialized for y=0</span></div>
-<div class="line"><a name="l00672"></a><span class="lineno">  672</span>       <span class="comment">//erase first line from inBuffer</span></div>
-<div class="line"><a name="l00673"></a><span class="lineno">  673</span>       inBuffer.erase(inBuffer.begin());</div>
-<div class="line"><a name="l00674"></a><span class="lineno">  674</span>       <span class="comment">//read extra line and push back to inBuffer if not out of bounds</span></div>
-<div class="line"><a name="l00675"></a><span class="lineno">  675</span>       <span class="keywordflow">if</span>(y+dimY/2<input.nRows()){</div>
-<div class="line"><a name="l00676"></a><span class="lineno">  676</span>         <span class="comment">//allocate buffer</span></div>
-<div class="line"><a name="l00677"></a><span class="lineno">  677</span>         inBuffer.push_back(inBuffer.back());</div>
-<div class="line"><a name="l00678"></a><span class="lineno">  678</span>         <span class="keywordflow">for</span>(<span class="keywordtype">int</span> i=0;i<input.nCols();++i)</div>
-<div class="line"><a name="l00679"></a><span class="lineno">  679</span>           inBuffer[inBuffer.size()-1][i]=input[y+dimY/2][i];</div>
-<div class="line"><a name="l00680"></a><span class="lineno">  680</span>       }</div>
-<div class="line"><a name="l00681"></a><span class="lineno">  681</span>       <span class="keywordflow">else</span>{</div>
-<div class="line"><a name="l00682"></a><span class="lineno">  682</span>         <span class="keywordtype">int</span> over=y+dimY/2-input.nRows();</div>
-<div class="line"><a name="l00683"></a><span class="lineno">  683</span>         <span class="keywordtype">int</span> index=(inBuffer.size()-1)-over;</div>
-<div class="line"><a name="l00684"></a><span class="lineno">  684</span>         assert(index>=0);</div>
-<div class="line"><a name="l00685"></a><span class="lineno">  685</span>         assert(index<inBuffer.size());</div>
-<div class="line"><a name="l00686"></a><span class="lineno">  686</span>         inBuffer.push_back(inBuffer[index]);</div>
-<div class="line"><a name="l00687"></a><span class="lineno">  687</span>       }</div>
-<div class="line"><a name="l00688"></a><span class="lineno">  688</span>     }</div>
-<div class="line"><a name="l00689"></a><span class="lineno">  689</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> x=0;x<input.nCols();++x){</div>
-<div class="line"><a name="l00690"></a><span class="lineno">  690</span>       output[y][x]=0;</div>
-<div class="line"><a name="l00691"></a><span class="lineno">  691</span>       <span class="keywordtype">double</span> currentValue=inBuffer[(dimY-1)/2][x];</div>
-<div class="line"><a name="l00692"></a><span class="lineno">  692</span>       std::vector<double> statBuffer;</div>
-<div class="line"><a name="l00693"></a><span class="lineno">  693</span>       <span class="keywordtype">bool</span> currentMasked=<span class="keyword">false</span>;</div>
-<div class="line"><a name="l00694"></a><span class="lineno">  694</span>       <span class="keywordflow">for</span>(<span class="keywordtype">int</span> imask=0;imask<m_noDataValues.size();++imask){</div>
-<div class="line"><a name="l00695"></a><span class="lineno">  695</span>         <span class="keywordflow">if</span>(currentValue==m_noDataValues[imask]){</div>
-<div class="line"><a name="l00696"></a><span class="lineno">  696</span>           currentMasked=<span class="keyword">true</span>;</div>
-<div class="line"><a name="l00697"></a><span class="lineno">  697</span>           <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l00698"></a><span class="lineno">  698</span>         }</div>
-<div class="line"><a name="l00699"></a><span class="lineno">  699</span>       }</div>
-<div class="line"><a name="l00700"></a><span class="lineno">  700</span>       output[y][x]=currentValue;<span class="comment">//introduced due to hThreshold</span></div>
-<div class="line"><a name="l00701"></a><span class="lineno">  701</span>       <span class="keywordflow">if</span>(currentMasked){</div>
-<div class="line"><a name="l00702"></a><span class="lineno">  702</span>         output[y][x]=currentValue;</div>
-<div class="line"><a name="l00703"></a><span class="lineno">  703</span>       }</div>
-<div class="line"><a name="l00704"></a><span class="lineno">  704</span>       <span class="keywordflow">else</span>{</div>
-<div class="line"><a name="l00705"></a><span class="lineno">  705</span>         <span class="keywordflow">for</span>(<span class="keywordtype">int</span> j=-(dimY-1)/2;j<=dimY/2;++j){</div>
-<div class="line"><a name="l00706"></a><span class="lineno">  706</span>           <span class="keywordflow">for</span>(<span class="keywordtype">int</span> i=-(dimX-1)/2;i<=dimX/2;++i){</div>
-<div class="line"><a name="l00707"></a><span class="lineno">  707</span>             <span class="keywordtype">double</span> d2=i*i+j*j;<span class="comment">//square distance</span></div>
-<div class="line"><a name="l00708"></a><span class="lineno">  708</span>             <span class="keywordflow">if</span>(disc&&(d2>(dimX/2)*(dimY/2)))</div>
-<div class="line"><a name="l00709"></a><span class="lineno">  709</span>               <span class="keywordflow">continue</span>;</div>
-<div class="line"><a name="l00710"></a><span class="lineno">  710</span>             indexI=x+i;</div>
-<div class="line"><a name="l00711"></a><span class="lineno">  711</span>             <span class="comment">//check if out of bounds</span></div>
-<div class="line"><a name="l00712"></a><span class="lineno">  712</span>             <span class="keywordflow">if</span>(indexI<0)</div>
-<div class="line"><a name="l00713"></a><span class="lineno">  713</span>               indexI=-indexI;</div>
-<div class="line"><a name="l00714"></a><span class="lineno">  714</span>             <span class="keywordflow">else</span> <span class="keywordflow">if</span>(indexI>=input.nCols())</div>
-<div class="line"><a name="l00715"></a><span class="lineno">  715</span>               indexI=input.nCols()-i;</div>
-<div class="line"><a name="l00716"></a><span class="lineno">  716</span>             <span class="keywordflow">if</span>(y+j<0)</div>
-<div class="line"><a name="l00717"></a><span class="lineno">  717</span>               indexJ=-j;</div>
-<div class="line"><a name="l00718"></a><span class="lineno">  718</span>             <span class="keywordflow">else</span> <span class="keywordflow">if</span>(y+j>=input.nRows())</div>
-<div class="line"><a name="l00719"></a><span class="lineno">  719</span>                 indexJ=(dimY>2) ? (dimY-1)/2-j : 0;</div>
-<div class="line"><a name="l00720"></a><span class="lineno">  720</span>               <span class="keywordflow">else</span></div>
-<div class="line"><a name="l00721"></a><span class="lineno">  721</span>                 indexJ=(dimY-1)/2+j;</div>
-<div class="line"><a name="l00722"></a><span class="lineno">  722</span>             <span class="keywordflow">if</span>(inBuffer[indexJ][indexI]==noDataValue)</div>
-<div class="line"><a name="l00723"></a><span class="lineno">  723</span>               <span class="keywordflow">continue</span>;</div>
-<div class="line"><a name="l00724"></a><span class="lineno">  724</span>             <span class="keywordtype">bool</span> masked=<span class="keyword">false</span>;</div>
-<div class="line"><a name="l00725"></a><span class="lineno">  725</span>             <span class="keywordflow">for</span>(<span class="keywordtype">int</span> imask=0;imask<m_noDataValues.size();++imask){</div>
-<div class="line"><a name="l00726"></a><span class="lineno">  726</span>               <span class="keywordflow">if</span>(inBuffer[indexJ][indexI]==m_noDataValues[imask]){</div>
-<div class="line"><a name="l00727"></a><span class="lineno">  727</span>                 masked=<span class="keyword">true</span>;</div>
-<div class="line"><a name="l00728"></a><span class="lineno">  728</span>                 <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l00729"></a><span class="lineno">  729</span>               }</div>
-<div class="line"><a name="l00730"></a><span class="lineno">  730</span>             }</div>
-<div class="line"><a name="l00731"></a><span class="lineno">  731</span>             <span class="keywordflow">if</span>(!masked){</div>
-<div class="line"><a name="l00732"></a><span class="lineno">  732</span>               <span class="keywordtype">short</span> binValue=0;</div>
-<div class="line"><a name="l00733"></a><span class="lineno">  733</span>               <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iclass=0;iclass<m_class.size();++iclass){</div>
-<div class="line"><a name="l00734"></a><span class="lineno">  734</span>                 <span class="keywordflow">if</span>(inBuffer[indexJ][indexI]==m_class[iclass]){</div>
-<div class="line"><a name="l00735"></a><span class="lineno">  735</span>                   binValue=1;</div>
-<div class="line"><a name="l00736"></a><span class="lineno">  736</span>                   <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l00737"></a><span class="lineno">  737</span>                 }</div>
-<div class="line"><a name="l00738"></a><span class="lineno">  738</span>               }</div>
-<div class="line"><a name="l00739"></a><span class="lineno">  739</span>               <span class="keywordflow">if</span>(m_class.size())</div>
-<div class="line"><a name="l00740"></a><span class="lineno">  740</span>                 statBuffer.push_back(binValue);</div>
-<div class="line"><a name="l00741"></a><span class="lineno">  741</span>               <span class="keywordflow">else</span></div>
-<div class="line"><a name="l00742"></a><span class="lineno">  742</span>                 statBuffer.push_back(inBuffer[indexJ][indexI]);</div>
-<div class="line"><a name="l00743"></a><span class="lineno">  743</span>             }</div>
-<div class="line"><a name="l00744"></a><span class="lineno">  744</span>           }</div>
-<div class="line"><a name="l00745"></a><span class="lineno">  745</span>         }</div>
-<div class="line"><a name="l00746"></a><span class="lineno">  746</span>         <span class="keywordflow">if</span>(statBuffer.size()){</div>
-<div class="line"><a name="l00747"></a><span class="lineno">  747</span>           <span class="keywordflow">switch</span>(getFilterType(method)){</div>
-<div class="line"><a name="l00748"></a><span class="lineno">  748</span>           <span class="keywordflow">case</span>(filter2d::dilate):</div>
-<div class="line"><a name="l00749"></a><span class="lineno">  749</span>             <span class="keywordflow">if</span>(output[y][x]<stat.mymax(statBuffer)-hThreshold){</div>
-<div class="line"><a name="l00750"></a><span class="lineno">  750</span>               output[y][x]=stat.mymax(statBuffer);</div>
-<div class="line"><a name="l00751"></a><span class="lineno">  751</span>               ++nchange;</div>
-<div class="line"><a name="l00752"></a><span class="lineno">  752</span>             }</div>
-<div class="line"><a name="l00753"></a><span class="lineno">  753</span>             <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l00754"></a><span class="lineno">  754</span>           <span class="keywordflow">case</span>(filter2d::erode):</div>
-<div class="line"><a name="l00755"></a><span class="lineno">  755</span>             <span class="keywordflow">if</span>(output[y][x]>stat.mymin(statBuffer)+hThreshold){</div>
-<div class="line"><a name="l00756"></a><span class="lineno">  756</span>               output[y][x]=stat.mymin(statBuffer);</div>
-<div class="line"><a name="l00757"></a><span class="lineno">  757</span>               ++nchange;</div>
-<div class="line"><a name="l00758"></a><span class="lineno">  758</span>             }</div>
-<div class="line"><a name="l00759"></a><span class="lineno">  759</span>             <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l00760"></a><span class="lineno">  760</span>           <span class="keywordflow">default</span>:</div>
-<div class="line"><a name="l00761"></a><span class="lineno">  761</span>             std::ostringstream ess;</div>
-<div class="line"><a name="l00762"></a><span class="lineno">  762</span>             ess << <span class="stringliteral">"Error:  morphology method "</span> << method << <span class="stringliteral">" not supported, choose "</span> << filter2d::dilate << <span class="stringliteral">" (dilate) or "</span> << filter2d::erode << <span class="stringliteral">" (erode)"</span> << std::endl;</div>
-<div class="line"><a name="l00763"></a><span class="lineno">  763</span>             <span class="keywordflow">throw</span>(ess.str());</div>
-<div class="line"><a name="l00764"></a><span class="lineno">  764</span>             <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l00765"></a><span class="lineno">  765</span>           }</div>
-<div class="line"><a name="l00766"></a><span class="lineno">  766</span>           <span class="keywordflow">if</span>(output[y][x]&&m_class.size())</div>
-<div class="line"><a name="l00767"></a><span class="lineno">  767</span>             output[y][x]=m_class[0];</div>
-<div class="line"><a name="l00768"></a><span class="lineno">  768</span>           <span class="comment">// else{</span></div>
-<div class="line"><a name="l00769"></a><span class="lineno">  769</span>           <span class="comment">//   assert(m_noDataValues.size());</span></div>
-<div class="line"><a name="l00770"></a><span class="lineno">  770</span>           <span class="comment">//   output[x]=m_noDataValues[0];</span></div>
-<div class="line"><a name="l00771"></a><span class="lineno">  771</span>           <span class="comment">// }</span></div>
-<div class="line"><a name="l00772"></a><span class="lineno">  772</span>         }</div>
-<div class="line"><a name="l00773"></a><span class="lineno">  773</span>         <span class="keywordflow">else</span></div>
-<div class="line"><a name="l00774"></a><span class="lineno">  774</span>           output[y][x]=noDataValue;</div>
-<div class="line"><a name="l00775"></a><span class="lineno">  775</span>       }</div>
-<div class="line"><a name="l00776"></a><span class="lineno">  776</span>     }</div>
-<div class="line"><a name="l00777"></a><span class="lineno">  777</span>     progress=(1.0+y);</div>
-<div class="line"><a name="l00778"></a><span class="lineno">  778</span>     progress/=output.nRows();</div>
-<div class="line"><a name="l00779"></a><span class="lineno">  779</span>     pfnProgress(progress,pszMessage,pProgressArg);</div>
-<div class="line"><a name="l00780"></a><span class="lineno">  780</span>   }</div>
-<div class="line"><a name="l00781"></a><span class="lineno">  781</span>   <span class="keywordflow">return</span> nchange;</div>
-<div class="line"><a name="l00782"></a><span class="lineno">  782</span> }</div>
-<div class="line"><a name="l00783"></a><span class="lineno">  783</span> </div>
-<div class="line"><a name="l00784"></a><span class="lineno">  784</span>  <span class="keyword">template</span><<span class="keyword">class</span> T> <span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> Filter2d::dsm2dtm_nwse(<span class="keyword">const</span> <a class="code" href="classVector2d.html">Vector2d<T></a>& inputDSM, <a class="code" href="classVector2d.html">Vector2d<T></a>& outputMa [...]
-<div class="line"><a name="l00785"></a><span class="lineno">  785</span> {</div>
-<div class="line"><a name="l00786"></a><span class="lineno">  786</span>   <span class="keyword">const</span> <span class="keywordtype">char</span>* pszMessage;</div>
-<div class="line"><a name="l00787"></a><span class="lineno">  787</span>   <span class="keywordtype">void</span>* pProgressArg=NULL;</div>
-<div class="line"><a name="l00788"></a><span class="lineno">  788</span>   GDALProgressFunc pfnProgress=GDALTermProgress;</div>
-<div class="line"><a name="l00789"></a><span class="lineno">  789</span>   <span class="keywordtype">double</span> progress=0;</div>
-<div class="line"><a name="l00790"></a><span class="lineno">  790</span>   pfnProgress(progress,pszMessage,pProgressArg);</div>
-<div class="line"><a name="l00791"></a><span class="lineno">  791</span> </div>
-<div class="line"><a name="l00792"></a><span class="lineno">  792</span>   <a class="code" href="classVector2d.html">Vector2d<T></a> tmpDSM(inputDSM);</div>
-<div class="line"><a name="l00793"></a><span class="lineno">  793</span>   <span class="keywordtype">double</span> noDataValue=0;</div>
-<div class="line"><a name="l00794"></a><span class="lineno">  794</span>   <span class="keywordflow">if</span>(m_noDataValues.size())</div>
-<div class="line"><a name="l00795"></a><span class="lineno">  795</span>     noDataValue=m_noDataValues[0];</div>
-<div class="line"><a name="l00796"></a><span class="lineno">  796</span> </div>
-<div class="line"><a name="l00797"></a><span class="lineno">  797</span>   <span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> nchange=0;</div>
-<div class="line"><a name="l00798"></a><span class="lineno">  798</span>   <span class="keywordtype">int</span> dimX=dim;</div>
-<div class="line"><a name="l00799"></a><span class="lineno">  799</span>   <span class="keywordtype">int</span> dimY=dim;</div>
-<div class="line"><a name="l00800"></a><span class="lineno">  800</span>   assert(dimX);</div>
-<div class="line"><a name="l00801"></a><span class="lineno">  801</span>   assert(dimY);</div>
-<div class="line"><a name="l00802"></a><span class="lineno">  802</span>   <a class="code" href="classstatfactory_1_1StatFactory.html">statfactory::StatFactory</a> stat;</div>
-<div class="line"><a name="l00803"></a><span class="lineno">  803</span>   <a class="code" href="classVector2d.html">Vector2d<T></a> inBuffer(dimY,inputDSM.nCols());</div>
-<div class="line"><a name="l00804"></a><span class="lineno">  804</span>   <span class="keywordflow">if</span>(outputMask.size()!=inputDSM.nRows())</div>
-<div class="line"><a name="l00805"></a><span class="lineno">  805</span>     outputMask.resize(inputDSM.nRows());</div>
-<div class="line"><a name="l00806"></a><span class="lineno">  806</span>   <span class="keywordtype">int</span> indexI=0;</div>
-<div class="line"><a name="l00807"></a><span class="lineno">  807</span>   <span class="keywordtype">int</span> indexJ=0;</div>
-<div class="line"><a name="l00808"></a><span class="lineno">  808</span>   <span class="comment">//initialize last half of inBuffer</span></div>
-<div class="line"><a name="l00809"></a><span class="lineno">  809</span>   <span class="keywordflow">for</span>(<span class="keywordtype">int</span> j=-(dimY-1)/2;j<=dimY/2;++j){</div>
-<div class="line"><a name="l00810"></a><span class="lineno">  810</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> i=0;i<inputDSM.nCols();++i)</div>
-<div class="line"><a name="l00811"></a><span class="lineno">  811</span>       inBuffer[indexJ][i]=tmpDSM[abs(j)][i];</div>
-<div class="line"><a name="l00812"></a><span class="lineno">  812</span>     ++indexJ;</div>
-<div class="line"><a name="l00813"></a><span class="lineno">  813</span>   }</div>
-<div class="line"><a name="l00814"></a><span class="lineno">  814</span>   <span class="keywordflow">for</span>(<span class="keywordtype">int</span> y=0;y<tmpDSM.nRows();++y){</div>
-<div class="line"><a name="l00815"></a><span class="lineno">  815</span>     <span class="keywordflow">if</span>(y){<span class="comment">//inBuffer already initialized for y=0</span></div>
-<div class="line"><a name="l00816"></a><span class="lineno">  816</span>       <span class="comment">//erase first line from inBuffer</span></div>
-<div class="line"><a name="l00817"></a><span class="lineno">  817</span>       inBuffer.erase(inBuffer.begin());</div>
-<div class="line"><a name="l00818"></a><span class="lineno">  818</span>       <span class="comment">//read extra line and push back to inBuffer if not out of bounds</span></div>
-<div class="line"><a name="l00819"></a><span class="lineno">  819</span>       <span class="keywordflow">if</span>(y+dimY/2<tmpDSM.nRows()){</div>
-<div class="line"><a name="l00820"></a><span class="lineno">  820</span>         <span class="comment">//allocate buffer</span></div>
-<div class="line"><a name="l00821"></a><span class="lineno">  821</span>         inBuffer.push_back(inBuffer.back());</div>
-<div class="line"><a name="l00822"></a><span class="lineno">  822</span>         <span class="keywordflow">for</span>(<span class="keywordtype">int</span> i=0;i<tmpDSM.nCols();++i)</div>
-<div class="line"><a name="l00823"></a><span class="lineno">  823</span>           inBuffer[inBuffer.size()-1][i]=tmpDSM[y+dimY/2][i];</div>
-<div class="line"><a name="l00824"></a><span class="lineno">  824</span>       }</div>
-<div class="line"><a name="l00825"></a><span class="lineno">  825</span>       <span class="keywordflow">else</span>{</div>
-<div class="line"><a name="l00826"></a><span class="lineno">  826</span>         <span class="keywordtype">int</span> over=y+dimY/2-tmpDSM.nRows();</div>
-<div class="line"><a name="l00827"></a><span class="lineno">  827</span>         <span class="keywordtype">int</span> index=(inBuffer.size()-1)-over;</div>
-<div class="line"><a name="l00828"></a><span class="lineno">  828</span>         assert(index>=0);</div>
-<div class="line"><a name="l00829"></a><span class="lineno">  829</span>         assert(index<inBuffer.size());</div>
-<div class="line"><a name="l00830"></a><span class="lineno">  830</span>         inBuffer.push_back(inBuffer[index]);</div>
-<div class="line"><a name="l00831"></a><span class="lineno">  831</span>       }</div>
-<div class="line"><a name="l00832"></a><span class="lineno">  832</span>     }</div>
-<div class="line"><a name="l00833"></a><span class="lineno">  833</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> x=0;x<tmpDSM.nCols();++x){</div>
-<div class="line"><a name="l00834"></a><span class="lineno">  834</span>       <span class="keywordtype">double</span> centerValue=inBuffer[(dimY-1)/2][x];</div>
-<div class="line"><a name="l00835"></a><span class="lineno">  835</span>       <span class="keywordtype">short</span> nmasked=0;</div>
-<div class="line"><a name="l00836"></a><span class="lineno">  836</span>       std::vector<T> neighbors;</div>
-<div class="line"><a name="l00837"></a><span class="lineno">  837</span>       <span class="keywordflow">for</span>(<span class="keywordtype">int</span> j=-(dimY-1)/2;j<=dimY/2;++j){</div>
-<div class="line"><a name="l00838"></a><span class="lineno">  838</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> i=-(dimX-1)/2;i<=dimX/2;++i){</div>
-<div class="line"><a name="l00839"></a><span class="lineno">  839</span>       indexI=x+i;</div>
-<div class="line"><a name="l00840"></a><span class="lineno">  840</span>       <span class="comment">//check if out of bounds</span></div>
-<div class="line"><a name="l00841"></a><span class="lineno">  841</span>       <span class="keywordflow">if</span>(indexI<0)</div>
-<div class="line"><a name="l00842"></a><span class="lineno">  842</span>         indexI=-indexI;</div>
-<div class="line"><a name="l00843"></a><span class="lineno">  843</span>       <span class="keywordflow">else</span> <span class="keywordflow">if</span>(indexI>=tmpDSM.nCols())</div>
-<div class="line"><a name="l00844"></a><span class="lineno">  844</span>         indexI=tmpDSM.nCols()-i;</div>
-<div class="line"><a name="l00845"></a><span class="lineno">  845</span>       <span class="keywordflow">if</span>(y+j<0)</div>
-<div class="line"><a name="l00846"></a><span class="lineno">  846</span>         indexJ=-j;</div>
-<div class="line"><a name="l00847"></a><span class="lineno">  847</span>       <span class="keywordflow">else</span> <span class="keywordflow">if</span>(y+j>=tmpDSM.nRows())</div>
-<div class="line"><a name="l00848"></a><span class="lineno">  848</span>         indexJ=(dimY>2) ? (dimY-1)/2-j : 0;</div>
-<div class="line"><a name="l00849"></a><span class="lineno">  849</span>       <span class="keywordflow">else</span></div>
-<div class="line"><a name="l00850"></a><span class="lineno">  850</span>         indexJ=(dimY-1)/2+j;</div>
-<div class="line"><a name="l00851"></a><span class="lineno">  851</span>       <span class="keywordtype">double</span> difference=(centerValue-inBuffer[indexJ][indexI]);</div>
-<div class="line"><a name="l00852"></a><span class="lineno">  852</span>       <span class="keywordflow">if</span>(i||j)<span class="comment">//skip centerValue</span></div>
-<div class="line"><a name="l00853"></a><span class="lineno">  853</span>         neighbors.push_back(inBuffer[indexJ][indexI]);</div>
-<div class="line"><a name="l00854"></a><span class="lineno">  854</span>       <span class="keywordflow">if</span>(difference>hThreshold)</div>
-<div class="line"><a name="l00855"></a><span class="lineno">  855</span>         ++nmasked;</div>
-<div class="line"><a name="l00856"></a><span class="lineno">  856</span>     }</div>
-<div class="line"><a name="l00857"></a><span class="lineno">  857</span>       }</div>
-<div class="line"><a name="l00858"></a><span class="lineno">  858</span>       <span class="keywordflow">if</span>(nmasked<=nlimit){</div>
-<div class="line"><a name="l00859"></a><span class="lineno">  859</span>     ++nchange;</div>
-<div class="line"><a name="l00860"></a><span class="lineno">  860</span>     <span class="comment">//reset pixel in outputMask</span></div>
-<div class="line"><a name="l00861"></a><span class="lineno">  861</span>     outputMask[y][x]=0;</div>
-<div class="line"><a name="l00862"></a><span class="lineno">  862</span>       }</div>
-<div class="line"><a name="l00863"></a><span class="lineno">  863</span>       <span class="keywordflow">else</span>{</div>
-<div class="line"><a name="l00864"></a><span class="lineno">  864</span>     <span class="comment">//reset pixel height in tmpDSM</span></div>
-<div class="line"><a name="l00865"></a><span class="lineno">  865</span>     sort(neighbors.begin(),neighbors.end());</div>
-<div class="line"><a name="l00866"></a><span class="lineno">  866</span>     assert(neighbors.size()>1);</div>
-<div class="line"><a name="l00867"></a><span class="lineno">  867</span>     inBuffer[(dimY-1)/2][x]=neighbors[1];</div>
-<div class="line"><a name="l00868"></a><span class="lineno">  868</span>     <span class="comment">/* inBuffer[(dimY-1)/2][x]=stat.mymin(neighbors); */</span></div>
-<div class="line"><a name="l00869"></a><span class="lineno">  869</span>       }</div>
-<div class="line"><a name="l00870"></a><span class="lineno">  870</span>     }</div>
-<div class="line"><a name="l00871"></a><span class="lineno">  871</span>     progress=(1.0+y);</div>
-<div class="line"><a name="l00872"></a><span class="lineno">  872</span>     progress/=outputMask.nRows();</div>
-<div class="line"><a name="l00873"></a><span class="lineno">  873</span>     pfnProgress(progress,pszMessage,pProgressArg);</div>
-<div class="line"><a name="l00874"></a><span class="lineno">  874</span>   }</div>
-<div class="line"><a name="l00875"></a><span class="lineno">  875</span>   <span class="keywordflow">return</span> nchange;</div>
-<div class="line"><a name="l00876"></a><span class="lineno">  876</span> }</div>
-<div class="line"><a name="l00877"></a><span class="lineno">  877</span> </div>
-<div class="line"><a name="l00878"></a><span class="lineno">  878</span>  <span class="keyword">template</span><<span class="keyword">class</span> T> <span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> Filter2d::dsm2dtm_nesw(<span class="keyword">const</span> <a class="code" href="classVector2d.html">Vector2d<T></a>& inputDSM, <a class="code" href="classVector2d.html">Vector2d<T></a>& outputMa [...]
-<div class="line"><a name="l00879"></a><span class="lineno">  879</span> {</div>
-<div class="line"><a name="l00880"></a><span class="lineno">  880</span>   <span class="keyword">const</span> <span class="keywordtype">char</span>* pszMessage;</div>
-<div class="line"><a name="l00881"></a><span class="lineno">  881</span>   <span class="keywordtype">void</span>* pProgressArg=NULL;</div>
-<div class="line"><a name="l00882"></a><span class="lineno">  882</span>   GDALProgressFunc pfnProgress=GDALTermProgress;</div>
-<div class="line"><a name="l00883"></a><span class="lineno">  883</span>   <span class="keywordtype">double</span> progress=0;</div>
-<div class="line"><a name="l00884"></a><span class="lineno">  884</span>   pfnProgress(progress,pszMessage,pProgressArg);</div>
-<div class="line"><a name="l00885"></a><span class="lineno">  885</span> </div>
-<div class="line"><a name="l00886"></a><span class="lineno">  886</span>   <a class="code" href="classVector2d.html">Vector2d<T></a> tmpDSM(inputDSM);</div>
-<div class="line"><a name="l00887"></a><span class="lineno">  887</span>   <span class="keywordtype">double</span> noDataValue=0;</div>
-<div class="line"><a name="l00888"></a><span class="lineno">  888</span>   <span class="keywordflow">if</span>(m_noDataValues.size())</div>
-<div class="line"><a name="l00889"></a><span class="lineno">  889</span>     noDataValue=m_noDataValues[0];</div>
-<div class="line"><a name="l00890"></a><span class="lineno">  890</span> </div>
-<div class="line"><a name="l00891"></a><span class="lineno">  891</span>   <span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> nchange=0;</div>
-<div class="line"><a name="l00892"></a><span class="lineno">  892</span>   <span class="keywordtype">int</span> dimX=dim;</div>
-<div class="line"><a name="l00893"></a><span class="lineno">  893</span>   <span class="keywordtype">int</span> dimY=dim;</div>
-<div class="line"><a name="l00894"></a><span class="lineno">  894</span>   assert(dimX);</div>
-<div class="line"><a name="l00895"></a><span class="lineno">  895</span>   assert(dimY);</div>
-<div class="line"><a name="l00896"></a><span class="lineno">  896</span>   <a class="code" href="classstatfactory_1_1StatFactory.html">statfactory::StatFactory</a> stat;</div>
-<div class="line"><a name="l00897"></a><span class="lineno">  897</span>   <a class="code" href="classVector2d.html">Vector2d<T></a> inBuffer(dimY,inputDSM.nCols());</div>
-<div class="line"><a name="l00898"></a><span class="lineno">  898</span>   <span class="keywordflow">if</span>(outputMask.size()!=inputDSM.nRows())</div>
-<div class="line"><a name="l00899"></a><span class="lineno">  899</span>     outputMask.resize(inputDSM.nRows());</div>
-<div class="line"><a name="l00900"></a><span class="lineno">  900</span>   <span class="keywordtype">int</span> indexI=0;</div>
-<div class="line"><a name="l00901"></a><span class="lineno">  901</span>   <span class="keywordtype">int</span> indexJ=0;</div>
-<div class="line"><a name="l00902"></a><span class="lineno">  902</span>   <span class="comment">//initialize last half of inBuffer</span></div>
-<div class="line"><a name="l00903"></a><span class="lineno">  903</span>   <span class="keywordflow">for</span>(<span class="keywordtype">int</span> j=-(dimY-1)/2;j<=dimY/2;++j){</div>
-<div class="line"><a name="l00904"></a><span class="lineno">  904</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> i=0;i<inputDSM.nCols();++i)</div>
-<div class="line"><a name="l00905"></a><span class="lineno">  905</span>       inBuffer[indexJ][i]=tmpDSM[abs(j)][i];</div>
-<div class="line"><a name="l00906"></a><span class="lineno">  906</span>     ++indexJ;</div>
-<div class="line"><a name="l00907"></a><span class="lineno">  907</span>   }</div>
-<div class="line"><a name="l00908"></a><span class="lineno">  908</span>   <span class="keywordflow">for</span>(<span class="keywordtype">int</span> y=0;y<tmpDSM.nRows();++y){</div>
-<div class="line"><a name="l00909"></a><span class="lineno">  909</span>     <span class="keywordflow">if</span>(y){<span class="comment">//inBuffer already initialized for y=0</span></div>
-<div class="line"><a name="l00910"></a><span class="lineno">  910</span>       <span class="comment">//erase first line from inBuffer</span></div>
-<div class="line"><a name="l00911"></a><span class="lineno">  911</span>       inBuffer.erase(inBuffer.begin());</div>
-<div class="line"><a name="l00912"></a><span class="lineno">  912</span>       <span class="comment">//read extra line and push back to inBuffer if not out of bounds</span></div>
-<div class="line"><a name="l00913"></a><span class="lineno">  913</span>       <span class="keywordflow">if</span>(y+dimY/2<tmpDSM.nRows()){</div>
-<div class="line"><a name="l00914"></a><span class="lineno">  914</span>         <span class="comment">//allocate buffer</span></div>
-<div class="line"><a name="l00915"></a><span class="lineno">  915</span>         inBuffer.push_back(inBuffer.back());</div>
-<div class="line"><a name="l00916"></a><span class="lineno">  916</span>         <span class="keywordflow">for</span>(<span class="keywordtype">int</span> i=0;i<tmpDSM.nCols();++i)</div>
-<div class="line"><a name="l00917"></a><span class="lineno">  917</span>           inBuffer[inBuffer.size()-1][i]=tmpDSM[y+dimY/2][i];</div>
-<div class="line"><a name="l00918"></a><span class="lineno">  918</span>       }</div>
-<div class="line"><a name="l00919"></a><span class="lineno">  919</span>       <span class="keywordflow">else</span>{</div>
-<div class="line"><a name="l00920"></a><span class="lineno">  920</span>         <span class="keywordtype">int</span> over=y+dimY/2-tmpDSM.nRows();</div>
-<div class="line"><a name="l00921"></a><span class="lineno">  921</span>         <span class="keywordtype">int</span> index=(inBuffer.size()-1)-over;</div>
-<div class="line"><a name="l00922"></a><span class="lineno">  922</span>         assert(index>=0);</div>
-<div class="line"><a name="l00923"></a><span class="lineno">  923</span>         assert(index<inBuffer.size());</div>
-<div class="line"><a name="l00924"></a><span class="lineno">  924</span>         inBuffer.push_back(inBuffer[index]);</div>
-<div class="line"><a name="l00925"></a><span class="lineno">  925</span>       }</div>
-<div class="line"><a name="l00926"></a><span class="lineno">  926</span>     }</div>
-<div class="line"><a name="l00927"></a><span class="lineno">  927</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> x=tmpDSM.nCols()-1;x>=0;--x){</div>
-<div class="line"><a name="l00928"></a><span class="lineno">  928</span>       <span class="keywordtype">double</span> centerValue=inBuffer[(dimY-1)/2][x];</div>
-<div class="line"><a name="l00929"></a><span class="lineno">  929</span>       <span class="keywordtype">short</span> nmasked=0;</div>
-<div class="line"><a name="l00930"></a><span class="lineno">  930</span>       std::vector<T> neighbors;</div>
-<div class="line"><a name="l00931"></a><span class="lineno">  931</span>       <span class="keywordflow">for</span>(<span class="keywordtype">int</span> j=-(dimY-1)/2;j<=dimY/2;++j){</div>
-<div class="line"><a name="l00932"></a><span class="lineno">  932</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> i=-(dimX-1)/2;i<=dimX/2;++i){</div>
-<div class="line"><a name="l00933"></a><span class="lineno">  933</span>       indexI=x+i;</div>
-<div class="line"><a name="l00934"></a><span class="lineno">  934</span>       <span class="comment">//check if out of bounds</span></div>
-<div class="line"><a name="l00935"></a><span class="lineno">  935</span>       <span class="keywordflow">if</span>(indexI<0)</div>
-<div class="line"><a name="l00936"></a><span class="lineno">  936</span>         indexI=-indexI;</div>
-<div class="line"><a name="l00937"></a><span class="lineno">  937</span>       <span class="keywordflow">else</span> <span class="keywordflow">if</span>(indexI>=tmpDSM.nCols())</div>
-<div class="line"><a name="l00938"></a><span class="lineno">  938</span>         indexI=tmpDSM.nCols()-i;</div>
-<div class="line"><a name="l00939"></a><span class="lineno">  939</span>       <span class="keywordflow">if</span>(y+j<0)</div>
-<div class="line"><a name="l00940"></a><span class="lineno">  940</span>         indexJ=-j;</div>
-<div class="line"><a name="l00941"></a><span class="lineno">  941</span>       <span class="keywordflow">else</span> <span class="keywordflow">if</span>(y+j>=tmpDSM.nRows())</div>
-<div class="line"><a name="l00942"></a><span class="lineno">  942</span>         indexJ=(dimY>2) ? (dimY-1)/2-j : 0;</div>
-<div class="line"><a name="l00943"></a><span class="lineno">  943</span>       <span class="keywordflow">else</span></div>
-<div class="line"><a name="l00944"></a><span class="lineno">  944</span>         indexJ=(dimY-1)/2+j;</div>
-<div class="line"><a name="l00945"></a><span class="lineno">  945</span>       <span class="keywordtype">double</span> difference=(centerValue-inBuffer[indexJ][indexI]);</div>
-<div class="line"><a name="l00946"></a><span class="lineno">  946</span>       <span class="keywordflow">if</span>(i||j)<span class="comment">//skip centerValue</span></div>
-<div class="line"><a name="l00947"></a><span class="lineno">  947</span>         neighbors.push_back(inBuffer[indexJ][indexI]);</div>
-<div class="line"><a name="l00948"></a><span class="lineno">  948</span>       <span class="keywordflow">if</span>(difference>hThreshold)</div>
-<div class="line"><a name="l00949"></a><span class="lineno">  949</span>         ++nmasked;</div>
-<div class="line"><a name="l00950"></a><span class="lineno">  950</span>     }</div>
-<div class="line"><a name="l00951"></a><span class="lineno">  951</span>       }</div>
-<div class="line"><a name="l00952"></a><span class="lineno">  952</span>       <span class="keywordflow">if</span>(nmasked<=nlimit){</div>
-<div class="line"><a name="l00953"></a><span class="lineno">  953</span>     ++nchange;</div>
-<div class="line"><a name="l00954"></a><span class="lineno">  954</span>     <span class="comment">//reset pixel in outputMask</span></div>
-<div class="line"><a name="l00955"></a><span class="lineno">  955</span>     outputMask[y][x]=0;</div>
-<div class="line"><a name="l00956"></a><span class="lineno">  956</span>       }</div>
-<div class="line"><a name="l00957"></a><span class="lineno">  957</span>       <span class="keywordflow">else</span>{</div>
-<div class="line"><a name="l00958"></a><span class="lineno">  958</span>     <span class="comment">//reset pixel height in tmpDSM</span></div>
-<div class="line"><a name="l00959"></a><span class="lineno">  959</span>     sort(neighbors.begin(),neighbors.end());</div>
-<div class="line"><a name="l00960"></a><span class="lineno">  960</span>     assert(neighbors.size()>1);</div>
-<div class="line"><a name="l00961"></a><span class="lineno">  961</span>     inBuffer[(dimY-1)/2][x]=neighbors[1];</div>
-<div class="line"><a name="l00962"></a><span class="lineno">  962</span>     <span class="comment">/* inBuffer[(dimY-1)/2][x]=stat.mymin(neighbors); */</span></div>
-<div class="line"><a name="l00963"></a><span class="lineno">  963</span>       }</div>
-<div class="line"><a name="l00964"></a><span class="lineno">  964</span>     }</div>
-<div class="line"><a name="l00965"></a><span class="lineno">  965</span>     progress=(1.0+y);</div>
-<div class="line"><a name="l00966"></a><span class="lineno">  966</span>     progress/=outputMask.nRows();</div>
-<div class="line"><a name="l00967"></a><span class="lineno">  967</span>     pfnProgress(progress,pszMessage,pProgressArg);</div>
-<div class="line"><a name="l00968"></a><span class="lineno">  968</span>   }</div>
-<div class="line"><a name="l00969"></a><span class="lineno">  969</span>   <span class="keywordflow">return</span> nchange;</div>
-<div class="line"><a name="l00970"></a><span class="lineno">  970</span> }</div>
-<div class="line"><a name="l00971"></a><span class="lineno">  971</span> </div>
-<div class="line"><a name="l00972"></a><span class="lineno">  972</span>  <span class="keyword">template</span><<span class="keyword">class</span> T> <span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> Filter2d::dsm2dtm_senw(<span class="keyword">const</span> <a class="code" href="classVector2d.html">Vector2d<T></a>& inputDSM, <a class="code" href="classVector2d.html">Vector2d<T></a>& outputMa [...]
-<div class="line"><a name="l00973"></a><span class="lineno">  973</span> {</div>
-<div class="line"><a name="l00974"></a><span class="lineno">  974</span>   <span class="keyword">const</span> <span class="keywordtype">char</span>* pszMessage;</div>
-<div class="line"><a name="l00975"></a><span class="lineno">  975</span>   <span class="keywordtype">void</span>* pProgressArg=NULL;</div>
-<div class="line"><a name="l00976"></a><span class="lineno">  976</span>   GDALProgressFunc pfnProgress=GDALTermProgress;</div>
-<div class="line"><a name="l00977"></a><span class="lineno">  977</span>   <span class="keywordtype">double</span> progress=0;</div>
-<div class="line"><a name="l00978"></a><span class="lineno">  978</span>   pfnProgress(progress,pszMessage,pProgressArg);</div>
-<div class="line"><a name="l00979"></a><span class="lineno">  979</span> </div>
-<div class="line"><a name="l00980"></a><span class="lineno">  980</span>   <a class="code" href="classVector2d.html">Vector2d<T></a> tmpDSM(inputDSM);</div>
-<div class="line"><a name="l00981"></a><span class="lineno">  981</span>   <span class="keywordtype">double</span> noDataValue=0;</div>
-<div class="line"><a name="l00982"></a><span class="lineno">  982</span>   <span class="keywordflow">if</span>(m_noDataValues.size())</div>
-<div class="line"><a name="l00983"></a><span class="lineno">  983</span>     noDataValue=m_noDataValues[0];</div>
-<div class="line"><a name="l00984"></a><span class="lineno">  984</span> </div>
-<div class="line"><a name="l00985"></a><span class="lineno">  985</span>   <span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> nchange=0;</div>
-<div class="line"><a name="l00986"></a><span class="lineno">  986</span>   <span class="keywordtype">int</span> dimX=dim;</div>
-<div class="line"><a name="l00987"></a><span class="lineno">  987</span>   <span class="keywordtype">int</span> dimY=dim;</div>
-<div class="line"><a name="l00988"></a><span class="lineno">  988</span>   assert(dimX);</div>
-<div class="line"><a name="l00989"></a><span class="lineno">  989</span>   assert(dimY);</div>
-<div class="line"><a name="l00990"></a><span class="lineno">  990</span>   <a class="code" href="classstatfactory_1_1StatFactory.html">statfactory::StatFactory</a> stat;</div>
-<div class="line"><a name="l00991"></a><span class="lineno">  991</span>   <a class="code" href="classVector2d.html">Vector2d<T></a> inBuffer(dimY,inputDSM.nCols());</div>
-<div class="line"><a name="l00992"></a><span class="lineno">  992</span>   <span class="keywordflow">if</span>(outputMask.size()!=inputDSM.nRows())</div>
-<div class="line"><a name="l00993"></a><span class="lineno">  993</span>     outputMask.resize(inputDSM.nRows());</div>
-<div class="line"><a name="l00994"></a><span class="lineno">  994</span>   <span class="keywordtype">int</span> indexI=0;</div>
-<div class="line"><a name="l00995"></a><span class="lineno">  995</span>   <span class="keywordtype">int</span> indexJ=inputDSM.nRows()-1;</div>
-<div class="line"><a name="l00996"></a><span class="lineno">  996</span>   <span class="comment">//initialize first half of inBuffer</span></div>
-<div class="line"><a name="l00997"></a><span class="lineno">  997</span>   <span class="keywordflow">for</span>(<span class="keywordtype">int</span> j=inputDSM.nRows()-dimY/2;j<inputDSM.nRows();--j){</div>
-<div class="line"><a name="l00998"></a><span class="lineno">  998</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> i=0;i<inputDSM.nCols();++i)</div>
-<div class="line"><a name="l00999"></a><span class="lineno">  999</span>       inBuffer[indexJ][i]=tmpDSM[abs(j)][i];</div>
-<div class="line"><a name="l01000"></a><span class="lineno"> 1000</span>     ++indexJ;</div>
-<div class="line"><a name="l01001"></a><span class="lineno"> 1001</span>   }</div>
-<div class="line"><a name="l01002"></a><span class="lineno"> 1002</span>   <span class="keywordflow">for</span>(<span class="keywordtype">int</span> y=tmpDSM.nRows()-1;y>=0;--y){</div>
-<div class="line"><a name="l01003"></a><span class="lineno"> 1003</span>     <span class="keywordflow">if</span>(y<tmpDSM.nRows()-1){<span class="comment">//inBuffer already initialized for y=tmpDSM.nRows()-1</span></div>
-<div class="line"><a name="l01004"></a><span class="lineno"> 1004</span>       <span class="comment">//erase last line from inBuffer</span></div>
-<div class="line"><a name="l01005"></a><span class="lineno"> 1005</span>       inBuffer.erase(inBuffer.end()-1);</div>
-<div class="line"><a name="l01006"></a><span class="lineno"> 1006</span>       <span class="comment">//read extra line and insert to inBuffer if not out of bounds</span></div>
-<div class="line"><a name="l01007"></a><span class="lineno"> 1007</span>       <span class="keywordflow">if</span>(y-dimY/2>0){</div>
-<div class="line"><a name="l01008"></a><span class="lineno"> 1008</span>         <span class="comment">//allocate buffer</span></div>
-<div class="line"><a name="l01009"></a><span class="lineno"> 1009</span>         inBuffer.insert(inBuffer.begin(),inBuffer.back());</div>
-<div class="line"><a name="l01010"></a><span class="lineno"> 1010</span>         <span class="keywordflow">for</span>(<span class="keywordtype">int</span> i=0;i<tmpDSM.nCols();++i)</div>
-<div class="line"><a name="l01011"></a><span class="lineno"> 1011</span>           inBuffer[0][i]=tmpDSM[y-dimY/2][i];</div>
-<div class="line"><a name="l01012"></a><span class="lineno"> 1012</span>       }</div>
-<div class="line"><a name="l01013"></a><span class="lineno"> 1013</span>       <span class="keywordflow">else</span>{</div>
-<div class="line"><a name="l01014"></a><span class="lineno"> 1014</span>         inBuffer.insert(inBuffer.begin(),inBuffer[abs(y-dimY/2)]);</div>
-<div class="line"><a name="l01015"></a><span class="lineno"> 1015</span>       }</div>
-<div class="line"><a name="l01016"></a><span class="lineno"> 1016</span>     }</div>
-<div class="line"><a name="l01017"></a><span class="lineno"> 1017</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> x=tmpDSM.nCols()-1;x>=0;--x){</div>
-<div class="line"><a name="l01018"></a><span class="lineno"> 1018</span>       <span class="keywordtype">double</span> centerValue=inBuffer[(dimY-1)/2][x];</div>
-<div class="line"><a name="l01019"></a><span class="lineno"> 1019</span>       <span class="keywordtype">short</span> nmasked=0;</div>
-<div class="line"><a name="l01020"></a><span class="lineno"> 1020</span>       std::vector<T> neighbors;</div>
-<div class="line"><a name="l01021"></a><span class="lineno"> 1021</span>       <span class="keywordflow">for</span>(<span class="keywordtype">int</span> j=-(dimY-1)/2;j<=dimY/2;++j){</div>
-<div class="line"><a name="l01022"></a><span class="lineno"> 1022</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> i=-(dimX-1)/2;i<=dimX/2;++i){</div>
-<div class="line"><a name="l01023"></a><span class="lineno"> 1023</span>       indexI=x+i;</div>
-<div class="line"><a name="l01024"></a><span class="lineno"> 1024</span>       <span class="comment">//check if out of bounds</span></div>
-<div class="line"><a name="l01025"></a><span class="lineno"> 1025</span>       <span class="keywordflow">if</span>(indexI<0)</div>
-<div class="line"><a name="l01026"></a><span class="lineno"> 1026</span>         indexI=-indexI;</div>
-<div class="line"><a name="l01027"></a><span class="lineno"> 1027</span>       <span class="keywordflow">else</span> <span class="keywordflow">if</span>(indexI>=tmpDSM.nCols())</div>
-<div class="line"><a name="l01028"></a><span class="lineno"> 1028</span>         indexI=tmpDSM.nCols()-i;</div>
-<div class="line"><a name="l01029"></a><span class="lineno"> 1029</span>       <span class="keywordflow">if</span>(y+j<0)</div>
-<div class="line"><a name="l01030"></a><span class="lineno"> 1030</span>         indexJ=-j;</div>
-<div class="line"><a name="l01031"></a><span class="lineno"> 1031</span>       <span class="keywordflow">else</span> <span class="keywordflow">if</span>(y+j>=tmpDSM.nRows())</div>
-<div class="line"><a name="l01032"></a><span class="lineno"> 1032</span>         indexJ=(dimY>2) ? (dimY-1)/2-j : 0;</div>
-<div class="line"><a name="l01033"></a><span class="lineno"> 1033</span>       <span class="keywordflow">else</span></div>
-<div class="line"><a name="l01034"></a><span class="lineno"> 1034</span>         indexJ=(dimY-1)/2+j;</div>
-<div class="line"><a name="l01035"></a><span class="lineno"> 1035</span>       <span class="keywordtype">double</span> difference=(centerValue-inBuffer[indexJ][indexI]);</div>
-<div class="line"><a name="l01036"></a><span class="lineno"> 1036</span>       <span class="keywordflow">if</span>(i||j)<span class="comment">//skip centerValue</span></div>
-<div class="line"><a name="l01037"></a><span class="lineno"> 1037</span>         neighbors.push_back(inBuffer[indexJ][indexI]);</div>
-<div class="line"><a name="l01038"></a><span class="lineno"> 1038</span>       <span class="keywordflow">if</span>(difference>hThreshold)</div>
-<div class="line"><a name="l01039"></a><span class="lineno"> 1039</span>         ++nmasked;</div>
-<div class="line"><a name="l01040"></a><span class="lineno"> 1040</span>     }</div>
-<div class="line"><a name="l01041"></a><span class="lineno"> 1041</span>       }</div>
-<div class="line"><a name="l01042"></a><span class="lineno"> 1042</span>       <span class="keywordflow">if</span>(nmasked<=nlimit){</div>
-<div class="line"><a name="l01043"></a><span class="lineno"> 1043</span>     ++nchange;</div>
-<div class="line"><a name="l01044"></a><span class="lineno"> 1044</span>     <span class="comment">//reset pixel in outputMask</span></div>
-<div class="line"><a name="l01045"></a><span class="lineno"> 1045</span>     outputMask[y][x]=0;</div>
-<div class="line"><a name="l01046"></a><span class="lineno"> 1046</span>       }</div>
-<div class="line"><a name="l01047"></a><span class="lineno"> 1047</span>       <span class="keywordflow">else</span>{</div>
-<div class="line"><a name="l01048"></a><span class="lineno"> 1048</span>     <span class="comment">//reset pixel height in tmpDSM</span></div>
-<div class="line"><a name="l01049"></a><span class="lineno"> 1049</span>     sort(neighbors.begin(),neighbors.end());</div>
-<div class="line"><a name="l01050"></a><span class="lineno"> 1050</span>     assert(neighbors.size()>1);</div>
-<div class="line"><a name="l01051"></a><span class="lineno"> 1051</span>     inBuffer[(dimY-1)/2][x]=neighbors[1];</div>
-<div class="line"><a name="l01052"></a><span class="lineno"> 1052</span>     <span class="comment">/* inBuffer[(dimY-1)/2][x]=stat.mymin(neighbors); */</span></div>
-<div class="line"><a name="l01053"></a><span class="lineno"> 1053</span>       }</div>
-<div class="line"><a name="l01054"></a><span class="lineno"> 1054</span>     }</div>
-<div class="line"><a name="l01055"></a><span class="lineno"> 1055</span>     progress=(1.0+y);</div>
-<div class="line"><a name="l01056"></a><span class="lineno"> 1056</span>     progress/=outputMask.nRows();</div>
-<div class="line"><a name="l01057"></a><span class="lineno"> 1057</span>     pfnProgress(progress,pszMessage,pProgressArg);</div>
-<div class="line"><a name="l01058"></a><span class="lineno"> 1058</span>   }</div>
-<div class="line"><a name="l01059"></a><span class="lineno"> 1059</span>   <span class="keywordflow">return</span> nchange;</div>
-<div class="line"><a name="l01060"></a><span class="lineno"> 1060</span> }</div>
-<div class="line"><a name="l01061"></a><span class="lineno"> 1061</span> </div>
-<div class="line"><a name="l01062"></a><span class="lineno"> 1062</span>  <span class="keyword">template</span><<span class="keyword">class</span> T> <span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> Filter2d::dsm2dtm_swne(<span class="keyword">const</span> <a class="code" href="classVector2d.html">Vector2d<T></a>& inputDSM, <a class="code" href="classVector2d.html">Vector2d<T></a>& outputMa [...]
-<div class="line"><a name="l01063"></a><span class="lineno"> 1063</span> {</div>
-<div class="line"><a name="l01064"></a><span class="lineno"> 1064</span>   <span class="keyword">const</span> <span class="keywordtype">char</span>* pszMessage;</div>
-<div class="line"><a name="l01065"></a><span class="lineno"> 1065</span>   <span class="keywordtype">void</span>* pProgressArg=NULL;</div>
-<div class="line"><a name="l01066"></a><span class="lineno"> 1066</span>   GDALProgressFunc pfnProgress=GDALTermProgress;</div>
-<div class="line"><a name="l01067"></a><span class="lineno"> 1067</span>   <span class="keywordtype">double</span> progress=0;</div>
-<div class="line"><a name="l01068"></a><span class="lineno"> 1068</span>   pfnProgress(progress,pszMessage,pProgressArg);</div>
-<div class="line"><a name="l01069"></a><span class="lineno"> 1069</span> </div>
-<div class="line"><a name="l01070"></a><span class="lineno"> 1070</span>   <a class="code" href="classVector2d.html">Vector2d<T></a> tmpDSM(inputDSM);</div>
-<div class="line"><a name="l01071"></a><span class="lineno"> 1071</span>   <span class="keywordtype">double</span> noDataValue=0;</div>
-<div class="line"><a name="l01072"></a><span class="lineno"> 1072</span>   <span class="keywordflow">if</span>(m_noDataValues.size())</div>
-<div class="line"><a name="l01073"></a><span class="lineno"> 1073</span>     noDataValue=m_noDataValues[0];</div>
-<div class="line"><a name="l01074"></a><span class="lineno"> 1074</span> </div>
-<div class="line"><a name="l01075"></a><span class="lineno"> 1075</span>   <span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> nchange=0;</div>
-<div class="line"><a name="l01076"></a><span class="lineno"> 1076</span>   <span class="keywordtype">int</span> dimX=dim;</div>
-<div class="line"><a name="l01077"></a><span class="lineno"> 1077</span>   <span class="keywordtype">int</span> dimY=dim;</div>
-<div class="line"><a name="l01078"></a><span class="lineno"> 1078</span>   assert(dimX);</div>
-<div class="line"><a name="l01079"></a><span class="lineno"> 1079</span>   assert(dimY);</div>
-<div class="line"><a name="l01080"></a><span class="lineno"> 1080</span>   <a class="code" href="classstatfactory_1_1StatFactory.html">statfactory::StatFactory</a> stat;</div>
-<div class="line"><a name="l01081"></a><span class="lineno"> 1081</span>   <a class="code" href="classVector2d.html">Vector2d<T></a> inBuffer(dimY,inputDSM.nCols());</div>
-<div class="line"><a name="l01082"></a><span class="lineno"> 1082</span>   <span class="keywordflow">if</span>(outputMask.size()!=inputDSM.nRows())</div>
-<div class="line"><a name="l01083"></a><span class="lineno"> 1083</span>     outputMask.resize(inputDSM.nRows());</div>
-<div class="line"><a name="l01084"></a><span class="lineno"> 1084</span>   <span class="keywordtype">int</span> indexI=0;</div>
-<div class="line"><a name="l01085"></a><span class="lineno"> 1085</span>   <span class="keywordtype">int</span> indexJ=0;</div>
-<div class="line"><a name="l01086"></a><span class="lineno"> 1086</span>   <span class="comment">//initialize first half of inBuffer</span></div>
-<div class="line"><a name="l01087"></a><span class="lineno"> 1087</span>   <span class="keywordflow">for</span>(<span class="keywordtype">int</span> j=inputDSM.nRows()-dimY/2;j<inputDSM.nRows();--j){</div>
-<div class="line"><a name="l01088"></a><span class="lineno"> 1088</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> i=0;i<inputDSM.nCols();++i)</div>
-<div class="line"><a name="l01089"></a><span class="lineno"> 1089</span>       inBuffer[indexJ][i]=tmpDSM[abs(j)][i];</div>
-<div class="line"><a name="l01090"></a><span class="lineno"> 1090</span>     ++indexJ;</div>
-<div class="line"><a name="l01091"></a><span class="lineno"> 1091</span>   }</div>
-<div class="line"><a name="l01092"></a><span class="lineno"> 1092</span>   <span class="keywordflow">for</span>(<span class="keywordtype">int</span> y=tmpDSM.nRows()-1;y>=0;--y){</div>
-<div class="line"><a name="l01093"></a><span class="lineno"> 1093</span>     <span class="keywordflow">if</span>(y<tmpDSM.nRows()-1){<span class="comment">//inBuffer already initialized for y=0</span></div>
-<div class="line"><a name="l01094"></a><span class="lineno"> 1094</span>       <span class="comment">//erase last line from inBuffer</span></div>
-<div class="line"><a name="l01095"></a><span class="lineno"> 1095</span>       inBuffer.erase(inBuffer.end()-1);</div>
-<div class="line"><a name="l01096"></a><span class="lineno"> 1096</span>       <span class="comment">//read extra line and insert to inBuffer if not out of bounds</span></div>
-<div class="line"><a name="l01097"></a><span class="lineno"> 1097</span>       <span class="keywordflow">if</span>(y-dimY/2>0){</div>
-<div class="line"><a name="l01098"></a><span class="lineno"> 1098</span>         <span class="comment">//allocate buffer</span></div>
-<div class="line"><a name="l01099"></a><span class="lineno"> 1099</span>         inBuffer.insert(inBuffer.begin(),inBuffer.back());</div>
-<div class="line"><a name="l01100"></a><span class="lineno"> 1100</span>         <span class="keywordflow">for</span>(<span class="keywordtype">int</span> i=0;i<tmpDSM.nCols();++i)</div>
-<div class="line"><a name="l01101"></a><span class="lineno"> 1101</span>           inBuffer[0][i]=tmpDSM[y-dimY/2][i];</div>
-<div class="line"><a name="l01102"></a><span class="lineno"> 1102</span>       }</div>
-<div class="line"><a name="l01103"></a><span class="lineno"> 1103</span>       <span class="keywordflow">else</span>{</div>
-<div class="line"><a name="l01104"></a><span class="lineno"> 1104</span>         inBuffer.insert(inBuffer.begin(),inBuffer[abs(y-dimY/2)]);</div>
-<div class="line"><a name="l01105"></a><span class="lineno"> 1105</span>       }</div>
-<div class="line"><a name="l01106"></a><span class="lineno"> 1106</span>     }</div>
-<div class="line"><a name="l01107"></a><span class="lineno"> 1107</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> x=0;x<tmpDSM.nCols();++x){</div>
-<div class="line"><a name="l01108"></a><span class="lineno"> 1108</span>       <span class="keywordtype">double</span> centerValue=inBuffer[(dimY-1)/2][x];</div>
-<div class="line"><a name="l01109"></a><span class="lineno"> 1109</span>       <span class="keywordtype">short</span> nmasked=0;</div>
-<div class="line"><a name="l01110"></a><span class="lineno"> 1110</span>       std::vector<T> neighbors;</div>
-<div class="line"><a name="l01111"></a><span class="lineno"> 1111</span>       <span class="keywordflow">for</span>(<span class="keywordtype">int</span> j=-(dimY-1)/2;j<=dimY/2;++j){</div>
-<div class="line"><a name="l01112"></a><span class="lineno"> 1112</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> i=-(dimX-1)/2;i<=dimX/2;++i){</div>
-<div class="line"><a name="l01113"></a><span class="lineno"> 1113</span>       indexI=x+i;</div>
-<div class="line"><a name="l01114"></a><span class="lineno"> 1114</span>       <span class="comment">//check if out of bounds</span></div>
-<div class="line"><a name="l01115"></a><span class="lineno"> 1115</span>       <span class="keywordflow">if</span>(indexI<0)</div>
-<div class="line"><a name="l01116"></a><span class="lineno"> 1116</span>         indexI=-indexI;</div>
-<div class="line"><a name="l01117"></a><span class="lineno"> 1117</span>       <span class="keywordflow">else</span> <span class="keywordflow">if</span>(indexI>=tmpDSM.nCols())</div>
-<div class="line"><a name="l01118"></a><span class="lineno"> 1118</span>         indexI=tmpDSM.nCols()-i;</div>
-<div class="line"><a name="l01119"></a><span class="lineno"> 1119</span>       <span class="keywordflow">if</span>(y+j<0)</div>
-<div class="line"><a name="l01120"></a><span class="lineno"> 1120</span>         indexJ=-j;</div>
-<div class="line"><a name="l01121"></a><span class="lineno"> 1121</span>       <span class="keywordflow">else</span> <span class="keywordflow">if</span>(y+j>=tmpDSM.nRows())</div>
-<div class="line"><a name="l01122"></a><span class="lineno"> 1122</span>         indexJ=(dimY>2) ? (dimY-1)/2-j : 0;</div>
-<div class="line"><a name="l01123"></a><span class="lineno"> 1123</span>       <span class="keywordflow">else</span></div>
-<div class="line"><a name="l01124"></a><span class="lineno"> 1124</span>         indexJ=(dimY-1)/2+j;</div>
-<div class="line"><a name="l01125"></a><span class="lineno"> 1125</span>       <span class="keywordtype">double</span> difference=(centerValue-inBuffer[indexJ][indexI]);</div>
-<div class="line"><a name="l01126"></a><span class="lineno"> 1126</span>       <span class="keywordflow">if</span>(i||j)<span class="comment">//skip centerValue</span></div>
-<div class="line"><a name="l01127"></a><span class="lineno"> 1127</span>         neighbors.push_back(inBuffer[indexJ][indexI]);</div>
-<div class="line"><a name="l01128"></a><span class="lineno"> 1128</span>       <span class="keywordflow">if</span>(difference>hThreshold)</div>
-<div class="line"><a name="l01129"></a><span class="lineno"> 1129</span>         ++nmasked;</div>
-<div class="line"><a name="l01130"></a><span class="lineno"> 1130</span>     }</div>
-<div class="line"><a name="l01131"></a><span class="lineno"> 1131</span>       }</div>
-<div class="line"><a name="l01132"></a><span class="lineno"> 1132</span>       <span class="keywordflow">if</span>(nmasked<=nlimit){</div>
-<div class="line"><a name="l01133"></a><span class="lineno"> 1133</span>     ++nchange;</div>
-<div class="line"><a name="l01134"></a><span class="lineno"> 1134</span>     <span class="comment">//reset pixel in outputMask</span></div>
-<div class="line"><a name="l01135"></a><span class="lineno"> 1135</span>     outputMask[y][x]=0;</div>
-<div class="line"><a name="l01136"></a><span class="lineno"> 1136</span>       }</div>
-<div class="line"><a name="l01137"></a><span class="lineno"> 1137</span>       <span class="keywordflow">else</span>{</div>
-<div class="line"><a name="l01138"></a><span class="lineno"> 1138</span>     <span class="comment">//reset pixel height in tmpDSM</span></div>
-<div class="line"><a name="l01139"></a><span class="lineno"> 1139</span>     sort(neighbors.begin(),neighbors.end());</div>
-<div class="line"><a name="l01140"></a><span class="lineno"> 1140</span>     assert(neighbors.size()>1);</div>
-<div class="line"><a name="l01141"></a><span class="lineno"> 1141</span>     inBuffer[(dimY-1)/2][x]=neighbors[1];</div>
-<div class="line"><a name="l01142"></a><span class="lineno"> 1142</span>     <span class="comment">/* inBuffer[(dimY-1)/2][x]=stat.mymin(neighbors); */</span></div>
-<div class="line"><a name="l01143"></a><span class="lineno"> 1143</span>       }</div>
-<div class="line"><a name="l01144"></a><span class="lineno"> 1144</span>     }</div>
-<div class="line"><a name="l01145"></a><span class="lineno"> 1145</span>     progress=(1.0+y);</div>
-<div class="line"><a name="l01146"></a><span class="lineno"> 1146</span>     progress/=outputMask.nRows();</div>
-<div class="line"><a name="l01147"></a><span class="lineno"> 1147</span>     pfnProgress(progress,pszMessage,pProgressArg);</div>
-<div class="line"><a name="l01148"></a><span class="lineno"> 1148</span>   }</div>
-<div class="line"><a name="l01149"></a><span class="lineno"> 1149</span>   <span class="keywordflow">return</span> nchange;</div>
-<div class="line"><a name="l01150"></a><span class="lineno"> 1150</span> }</div>
-<div class="line"><a name="l01151"></a><span class="lineno"> 1151</span> </div>
-<div class="line"><a name="l01152"></a><span class="lineno"> 1152</span>   <span class="keyword">template</span><<span class="keyword">class</span> T> <span class="keywordtype">void</span> Filter2d::shadowDsm(<span class="keyword">const</span> <a class="code" href="classVector2d.html">Vector2d<T></a>& input, <a class="code" href="classVector2d.html">Vector2d<T></a>& output, <span class="keywordtype">double</span> sza, <span class="keywordtype">double</span> [...]
-<div class="line"><a name="l01153"></a><span class="lineno"> 1153</span> {</div>
-<div class="line"><a name="l01154"></a><span class="lineno"> 1154</span>   <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> ncols=input.nCols();</div>
-<div class="line"><a name="l01155"></a><span class="lineno"> 1155</span>   output.clear();</div>
-<div class="line"><a name="l01156"></a><span class="lineno"> 1156</span>   output.resize(input.nRows(),ncols);</div>
-<div class="line"><a name="l01157"></a><span class="lineno"> 1157</span>   <span class="comment">//do we need to initialize output?</span></div>
-<div class="line"><a name="l01158"></a><span class="lineno"> 1158</span>   <span class="comment">// for(int y=0;y<output.nRows();++y)</span></div>
-<div class="line"><a name="l01159"></a><span class="lineno"> 1159</span>   <span class="comment">//   for(int x=0;x<output.nCols();++x)</span></div>
-<div class="line"><a name="l01160"></a><span class="lineno"> 1160</span>   <span class="comment">//     output[y][x]=0;</span></div>
-<div class="line"><a name="l01161"></a><span class="lineno"> 1161</span>   <span class="keywordtype">int</span> indexI=0;</div>
-<div class="line"><a name="l01162"></a><span class="lineno"> 1162</span>   <span class="keywordtype">int</span> indexJ=0;</div>
-<div class="line"><a name="l01163"></a><span class="lineno"> 1163</span>   <span class="keyword">const</span> <span class="keywordtype">char</span>* pszMessage;</div>
-<div class="line"><a name="l01164"></a><span class="lineno"> 1164</span>   <span class="keywordtype">void</span>* pProgressArg=NULL;</div>
-<div class="line"><a name="l01165"></a><span class="lineno"> 1165</span>   GDALProgressFunc pfnProgress=GDALTermProgress;</div>
-<div class="line"><a name="l01166"></a><span class="lineno"> 1166</span>   <span class="keywordtype">double</span> progress=0;</div>
-<div class="line"><a name="l01167"></a><span class="lineno"> 1167</span>   pfnProgress(progress,pszMessage,pProgressArg);</div>
-<div class="line"><a name="l01168"></a><span class="lineno"> 1168</span>   <span class="keywordflow">for</span>(<span class="keywordtype">int</span> y=0;y<input.nRows();++y){</div>
-<div class="line"><a name="l01169"></a><span class="lineno"> 1169</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> x=0;x<input.nCols();++x){</div>
-<div class="line"><a name="l01170"></a><span class="lineno"> 1170</span>       <span class="keywordtype">double</span> currentValue=input[y][x];</div>
-<div class="line"><a name="l01171"></a><span class="lineno"> 1171</span>       <span class="keywordtype">int</span> theDist=<span class="keyword">static_cast<</span><span class="keywordtype">int</span><span class="keyword">></span>(sqrt((currentValue*tan(DEG2RAD(sza))/pixelSize)*(currentValue*tan(DEG2RAD(sza))/pixelSize)));<span class="comment">//in pixels</span></div>
-<div class="line"><a name="l01172"></a><span class="lineno"> 1172</span>       <span class="keywordtype">double</span> theDir=DEG2RAD(saa)+PI/2.0;</div>
-<div class="line"><a name="l01173"></a><span class="lineno"> 1173</span>       <span class="keywordflow">if</span>(theDir<0)</div>
-<div class="line"><a name="l01174"></a><span class="lineno"> 1174</span>         theDir+=2*PI;</div>
-<div class="line"><a name="l01175"></a><span class="lineno"> 1175</span>       <span class="keywordflow">for</span>(<span class="keywordtype">int</span> d=0;d<theDist;++d){<span class="comment">//d in pixels</span></div>
-<div class="line"><a name="l01176"></a><span class="lineno"> 1176</span>         indexI=x+d*cos(theDir);<span class="comment">//in pixels</span></div>
-<div class="line"><a name="l01177"></a><span class="lineno"> 1177</span>         indexJ=y+d*sin(theDir);<span class="comment">//in pixels</span></div>
-<div class="line"><a name="l01178"></a><span class="lineno"> 1178</span>         <span class="keywordflow">if</span>(indexJ<0||indexJ>=input.size())</div>
-<div class="line"><a name="l01179"></a><span class="lineno"> 1179</span>           <span class="keywordflow">continue</span>;</div>
-<div class="line"><a name="l01180"></a><span class="lineno"> 1180</span>         <span class="keywordflow">if</span>(indexI<0||indexI>=input[indexJ].size())</div>
-<div class="line"><a name="l01181"></a><span class="lineno"> 1181</span>           <span class="keywordflow">continue</span>;</div>
-<div class="line"><a name="l01182"></a><span class="lineno"> 1182</span>         <span class="keywordflow">if</span>(input[indexJ][indexI]<currentValue-d*pixelSize/tan(DEG2RAD(sza))){<span class="comment">//in m</span></div>
-<div class="line"><a name="l01183"></a><span class="lineno"> 1183</span>           output[indexJ][indexI]=shadowFlag;</div>
-<div class="line"><a name="l01184"></a><span class="lineno"> 1184</span>         }</div>
-<div class="line"><a name="l01185"></a><span class="lineno"> 1185</span>       }</div>
-<div class="line"><a name="l01186"></a><span class="lineno"> 1186</span>     }</div>
-<div class="line"><a name="l01187"></a><span class="lineno"> 1187</span>     progress=(1.0+y);</div>
-<div class="line"><a name="l01188"></a><span class="lineno"> 1188</span>     progress/=output.nRows();</div>
-<div class="line"><a name="l01189"></a><span class="lineno"> 1189</span>     pfnProgress(progress,pszMessage,pProgressArg);</div>
-<div class="line"><a name="l01190"></a><span class="lineno"> 1190</span>   }</div>
-<div class="line"><a name="l01191"></a><span class="lineno"> 1191</span> }</div>
-<div class="line"><a name="l01192"></a><span class="lineno"> 1192</span> </div>
-<div class="line"><a name="l01193"></a><span class="lineno"> 1193</span> <span class="keyword">template</span><<span class="keyword">class</span> T> <span class="keywordtype">void</span> Filter2d::dwtForward(<a class="code" href="classVector2d.html">Vector2d<T></a>& theBuffer, <span class="keyword">const</span> std::string& wavelet_type, <span class="keywordtype">int</span> family){</div>
-<div class="line"><a name="l01194"></a><span class="lineno"> 1194</span>   <span class="keyword">const</span> <span class="keywordtype">char</span>* pszMessage;</div>
-<div class="line"><a name="l01195"></a><span class="lineno"> 1195</span>   <span class="keywordtype">void</span>* pProgressArg=NULL;</div>
-<div class="line"><a name="l01196"></a><span class="lineno"> 1196</span>   GDALProgressFunc pfnProgress=GDALTermProgress;</div>
-<div class="line"><a name="l01197"></a><span class="lineno"> 1197</span>   <span class="keywordtype">double</span> progress=0;</div>
-<div class="line"><a name="l01198"></a><span class="lineno"> 1198</span>   pfnProgress(progress,pszMessage,pProgressArg);</div>
-<div class="line"><a name="l01199"></a><span class="lineno"> 1199</span> </div>
-<div class="line"><a name="l01200"></a><span class="lineno"> 1200</span>   <span class="keywordtype">int</span> nRow=theBuffer.size();</div>
-<div class="line"><a name="l01201"></a><span class="lineno"> 1201</span>   assert(nRow);</div>
-<div class="line"><a name="l01202"></a><span class="lineno"> 1202</span>   <span class="keywordtype">int</span> nCol=theBuffer[0].size();</div>
-<div class="line"><a name="l01203"></a><span class="lineno"> 1203</span>   assert(nCol);</div>
-<div class="line"><a name="l01204"></a><span class="lineno"> 1204</span>   <span class="comment">//make sure data size if power of 2</span></div>
-<div class="line"><a name="l01205"></a><span class="lineno"> 1205</span>   <span class="keywordflow">while</span>(theBuffer.size()&(theBuffer.size()-1))</div>
-<div class="line"><a name="l01206"></a><span class="lineno"> 1206</span>     theBuffer.push_back(theBuffer.back());</div>
-<div class="line"><a name="l01207"></a><span class="lineno"> 1207</span>   <span class="keywordflow">for</span>(<span class="keywordtype">int</span> irow=0;irow<theBuffer.size();++irow)</div>
-<div class="line"><a name="l01208"></a><span class="lineno"> 1208</span>     <span class="keywordflow">while</span>(theBuffer[irow].size()&(theBuffer[irow].size()-1))</div>
-<div class="line"><a name="l01209"></a><span class="lineno"> 1209</span>       theBuffer[irow].push_back(theBuffer[irow].back());</div>
-<div class="line"><a name="l01210"></a><span class="lineno"> 1210</span>   std::vector<double> vdata(theBuffer.size()*theBuffer[0].size());</div>
-<div class="line"><a name="l01211"></a><span class="lineno"> 1211</span>   <span class="keywordtype">double</span>* data=&(vdata[0]);</div>
-<div class="line"><a name="l01212"></a><span class="lineno"> 1212</span>   <span class="keywordflow">for</span>(<span class="keywordtype">int</span> irow=0;irow<theBuffer.size();++irow){</div>
-<div class="line"><a name="l01213"></a><span class="lineno"> 1213</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> icol=0;icol<theBuffer[0].size();++icol){</div>
-<div class="line"><a name="l01214"></a><span class="lineno"> 1214</span>       <span class="keywordtype">int</span> index=irow*theBuffer[0].size()+icol;</div>
-<div class="line"><a name="l01215"></a><span class="lineno"> 1215</span>       data[index]=theBuffer[irow][icol];</div>
-<div class="line"><a name="l01216"></a><span class="lineno"> 1216</span>     }</div>
-<div class="line"><a name="l01217"></a><span class="lineno"> 1217</span>   }</div>
-<div class="line"><a name="l01218"></a><span class="lineno"> 1218</span>   <span class="keywordtype">int</span> nsize=theBuffer.size()*theBuffer[0].size();</div>
-<div class="line"><a name="l01219"></a><span class="lineno"> 1219</span>   gsl_wavelet *w;</div>
-<div class="line"><a name="l01220"></a><span class="lineno"> 1220</span>   gsl_wavelet_workspace *work;</div>
-<div class="line"><a name="l01221"></a><span class="lineno"> 1221</span>   assert(nsize);</div>
-<div class="line"><a name="l01222"></a><span class="lineno"> 1222</span>   w=gsl_wavelet_alloc(filter::Filter::getWaveletType(wavelet_type),family);</div>
-<div class="line"><a name="l01223"></a><span class="lineno"> 1223</span>   work=gsl_wavelet_workspace_alloc(nsize);</div>
-<div class="line"><a name="l01224"></a><span class="lineno"> 1224</span>   gsl_wavelet2d_nstransform_forward (w, data, theBuffer.size(), theBuffer.size(),theBuffer[0].size(), work);</div>
-<div class="line"><a name="l01225"></a><span class="lineno"> 1225</span>   theBuffer.erase(theBuffer.begin()+nRow,theBuffer.end());</div>
-<div class="line"><a name="l01226"></a><span class="lineno"> 1226</span>   <span class="keywordflow">for</span>(<span class="keywordtype">int</span> irow=0;irow<theBuffer.size();++irow){</div>
-<div class="line"><a name="l01227"></a><span class="lineno"> 1227</span>     theBuffer[irow].erase(theBuffer[irow].begin()+nCol,theBuffer[irow].end());</div>
-<div class="line"><a name="l01228"></a><span class="lineno"> 1228</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> icol=0;icol<theBuffer[irow].size();++icol){</div>
-<div class="line"><a name="l01229"></a><span class="lineno"> 1229</span>       <span class="keywordtype">int</span> index=irow*theBuffer[irow].size()+icol;</div>
-<div class="line"><a name="l01230"></a><span class="lineno"> 1230</span>       theBuffer[irow][icol]=data[index];</div>
-<div class="line"><a name="l01231"></a><span class="lineno"> 1231</span>     }</div>
-<div class="line"><a name="l01232"></a><span class="lineno"> 1232</span>     progress=(1.0+irow);</div>
-<div class="line"><a name="l01233"></a><span class="lineno"> 1233</span>     progress/=theBuffer.nRows();</div>
-<div class="line"><a name="l01234"></a><span class="lineno"> 1234</span>     pfnProgress(progress,pszMessage,pProgressArg);</div>
-<div class="line"><a name="l01235"></a><span class="lineno"> 1235</span>   }</div>
-<div class="line"><a name="l01236"></a><span class="lineno"> 1236</span>   gsl_wavelet_free (w);</div>
-<div class="line"><a name="l01237"></a><span class="lineno"> 1237</span>   gsl_wavelet_workspace_free (work);</div>
-<div class="line"><a name="l01238"></a><span class="lineno"> 1238</span> }</div>
-<div class="line"><a name="l01239"></a><span class="lineno"> 1239</span> </div>
-<div class="line"><a name="l01240"></a><span class="lineno"> 1240</span> <span class="keyword">template</span><<span class="keyword">class</span> T> <span class="keywordtype">void</span> Filter2d::dwtInverse(<a class="code" href="classVector2d.html">Vector2d<T></a>& theBuffer, <span class="keyword">const</span> std::string& wavelet_type, <span class="keywordtype">int</span> family){</div>
-<div class="line"><a name="l01241"></a><span class="lineno"> 1241</span>   <span class="keyword">const</span> <span class="keywordtype">char</span>* pszMessage;</div>
-<div class="line"><a name="l01242"></a><span class="lineno"> 1242</span>   <span class="keywordtype">void</span>* pProgressArg=NULL;</div>
-<div class="line"><a name="l01243"></a><span class="lineno"> 1243</span>   GDALProgressFunc pfnProgress=GDALTermProgress;</div>
-<div class="line"><a name="l01244"></a><span class="lineno"> 1244</span>   <span class="keywordtype">double</span> progress=0;</div>
-<div class="line"><a name="l01245"></a><span class="lineno"> 1245</span>   pfnProgress(progress,pszMessage,pProgressArg);</div>
-<div class="line"><a name="l01246"></a><span class="lineno"> 1246</span> </div>
-<div class="line"><a name="l01247"></a><span class="lineno"> 1247</span>   <span class="keywordtype">int</span> nRow=theBuffer.size();</div>
-<div class="line"><a name="l01248"></a><span class="lineno"> 1248</span>   assert(nRow);</div>
-<div class="line"><a name="l01249"></a><span class="lineno"> 1249</span>   <span class="keywordtype">int</span> nCol=theBuffer[0].size();</div>
-<div class="line"><a name="l01250"></a><span class="lineno"> 1250</span>   assert(nCol);</div>
-<div class="line"><a name="l01251"></a><span class="lineno"> 1251</span>   <span class="comment">//make sure data size if power of 2</span></div>
-<div class="line"><a name="l01252"></a><span class="lineno"> 1252</span>   <span class="keywordflow">while</span>(theBuffer.size()&(theBuffer.size()-1))</div>
-<div class="line"><a name="l01253"></a><span class="lineno"> 1253</span>     theBuffer.push_back(theBuffer.back());</div>
-<div class="line"><a name="l01254"></a><span class="lineno"> 1254</span>   <span class="keywordflow">for</span>(<span class="keywordtype">int</span> irow=0;irow<theBuffer.size();++irow)</div>
-<div class="line"><a name="l01255"></a><span class="lineno"> 1255</span>     <span class="keywordflow">while</span>(theBuffer[irow].size()&(theBuffer[irow].size()-1))</div>
-<div class="line"><a name="l01256"></a><span class="lineno"> 1256</span>       theBuffer[irow].push_back(theBuffer[irow].back());</div>
-<div class="line"><a name="l01257"></a><span class="lineno"> 1257</span>   std::vector<double> vdata(theBuffer.size()*theBuffer[0].size());</div>
-<div class="line"><a name="l01258"></a><span class="lineno"> 1258</span>   <span class="keywordtype">double</span>* data=&(vdata[0]);</div>
-<div class="line"><a name="l01259"></a><span class="lineno"> 1259</span>   <span class="comment">//double data[theBuffer.size()*theBuffer[0].size()];</span></div>
-<div class="line"><a name="l01260"></a><span class="lineno"> 1260</span>   <span class="keywordflow">for</span>(<span class="keywordtype">int</span> irow=0;irow<theBuffer.size();++irow){</div>
-<div class="line"><a name="l01261"></a><span class="lineno"> 1261</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> icol=0;icol<theBuffer[0].size();++icol){</div>
-<div class="line"><a name="l01262"></a><span class="lineno"> 1262</span>       <span class="keywordtype">int</span> index=irow*theBuffer[0].size()+icol;</div>
-<div class="line"><a name="l01263"></a><span class="lineno"> 1263</span>       data[index]=theBuffer[irow][icol];</div>
-<div class="line"><a name="l01264"></a><span class="lineno"> 1264</span>     }</div>
-<div class="line"><a name="l01265"></a><span class="lineno"> 1265</span>   }</div>
-<div class="line"><a name="l01266"></a><span class="lineno"> 1266</span>   <span class="keywordtype">int</span> nsize=theBuffer.size()*theBuffer[0].size();</div>
-<div class="line"><a name="l01267"></a><span class="lineno"> 1267</span>   gsl_wavelet *w;</div>
-<div class="line"><a name="l01268"></a><span class="lineno"> 1268</span>   gsl_wavelet_workspace *work;</div>
-<div class="line"><a name="l01269"></a><span class="lineno"> 1269</span>   assert(nsize);</div>
-<div class="line"><a name="l01270"></a><span class="lineno"> 1270</span>   w=gsl_wavelet_alloc(filter::Filter::getWaveletType(wavelet_type),family);</div>
-<div class="line"><a name="l01271"></a><span class="lineno"> 1271</span>   work=gsl_wavelet_workspace_alloc(nsize);</div>
-<div class="line"><a name="l01272"></a><span class="lineno"> 1272</span>   gsl_wavelet2d_nstransform_inverse (w, data, theBuffer.size(), theBuffer.size(),theBuffer[0].size(), work);</div>
-<div class="line"><a name="l01273"></a><span class="lineno"> 1273</span>   theBuffer.erase(theBuffer.begin()+nRow,theBuffer.end());</div>
-<div class="line"><a name="l01274"></a><span class="lineno"> 1274</span>   <span class="keywordflow">for</span>(<span class="keywordtype">int</span> irow=0;irow<theBuffer.size();++irow){</div>
-<div class="line"><a name="l01275"></a><span class="lineno"> 1275</span>     theBuffer[irow].erase(theBuffer[irow].begin()+nCol,theBuffer[irow].end());</div>
-<div class="line"><a name="l01276"></a><span class="lineno"> 1276</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> icol=0;icol<theBuffer[irow].size();++icol){</div>
-<div class="line"><a name="l01277"></a><span class="lineno"> 1277</span>       <span class="keywordtype">int</span> index=irow*theBuffer[irow].size()+icol;</div>
-<div class="line"><a name="l01278"></a><span class="lineno"> 1278</span>       theBuffer[irow][icol]=data[index];</div>
-<div class="line"><a name="l01279"></a><span class="lineno"> 1279</span>     }</div>
-<div class="line"><a name="l01280"></a><span class="lineno"> 1280</span>     progress=(1.0+irow);</div>
-<div class="line"><a name="l01281"></a><span class="lineno"> 1281</span>     progress/=theBuffer.nRows();</div>
-<div class="line"><a name="l01282"></a><span class="lineno"> 1282</span>     pfnProgress(progress,pszMessage,pProgressArg);</div>
-<div class="line"><a name="l01283"></a><span class="lineno"> 1283</span>   }</div>
-<div class="line"><a name="l01284"></a><span class="lineno"> 1284</span>   gsl_wavelet_free (w);</div>
-<div class="line"><a name="l01285"></a><span class="lineno"> 1285</span>   gsl_wavelet_workspace_free (work);</div>
-<div class="line"><a name="l01286"></a><span class="lineno"> 1286</span> }</div>
-<div class="line"><a name="l01287"></a><span class="lineno"> 1287</span> </div>
-<div class="line"><a name="l01288"></a><span class="lineno"> 1288</span> <span class="keyword">template</span><<span class="keyword">class</span> T> <span class="keywordtype">void</span> Filter2d::dwtCut(<a class="code" href="classVector2d.html">Vector2d<T></a>& theBuffer, <span class="keyword">const</span> std::string& wavelet_type, <span class="keywordtype">int</span> family, <span class="keywordtype">double</span> cut){</div>
-<div class="line"><a name="l01289"></a><span class="lineno"> 1289</span>   <span class="keyword">const</span> <span class="keywordtype">char</span>* pszMessage;</div>
-<div class="line"><a name="l01290"></a><span class="lineno"> 1290</span>   <span class="keywordtype">void</span>* pProgressArg=NULL;</div>
-<div class="line"><a name="l01291"></a><span class="lineno"> 1291</span>   GDALProgressFunc pfnProgress=GDALTermProgress;</div>
-<div class="line"><a name="l01292"></a><span class="lineno"> 1292</span>   <span class="keywordtype">double</span> progress=0;</div>
-<div class="line"><a name="l01293"></a><span class="lineno"> 1293</span>   pfnProgress(progress,pszMessage,pProgressArg);</div>
-<div class="line"><a name="l01294"></a><span class="lineno"> 1294</span> </div>
-<div class="line"><a name="l01295"></a><span class="lineno"> 1295</span>   <span class="keywordtype">int</span> nRow=theBuffer.size();</div>
-<div class="line"><a name="l01296"></a><span class="lineno"> 1296</span>   assert(nRow);</div>
-<div class="line"><a name="l01297"></a><span class="lineno"> 1297</span>   <span class="keywordtype">int</span> nCol=theBuffer[0].size();</div>
-<div class="line"><a name="l01298"></a><span class="lineno"> 1298</span>   assert(nCol);</div>
-<div class="line"><a name="l01299"></a><span class="lineno"> 1299</span>   <span class="comment">//make sure data size if power of 2</span></div>
-<div class="line"><a name="l01300"></a><span class="lineno"> 1300</span>   <span class="keywordflow">while</span>(theBuffer.size()&(theBuffer.size()-1))</div>
-<div class="line"><a name="l01301"></a><span class="lineno"> 1301</span>     theBuffer.push_back(theBuffer.back());</div>
-<div class="line"><a name="l01302"></a><span class="lineno"> 1302</span>   <span class="keywordflow">for</span>(<span class="keywordtype">int</span> irow=0;irow<theBuffer.size();++irow)</div>
-<div class="line"><a name="l01303"></a><span class="lineno"> 1303</span>     <span class="keywordflow">while</span>(theBuffer[irow].size()&(theBuffer[irow].size()-1))</div>
-<div class="line"><a name="l01304"></a><span class="lineno"> 1304</span>       theBuffer[irow].push_back(theBuffer[irow].back());</div>
-<div class="line"><a name="l01305"></a><span class="lineno"> 1305</span>   <span class="keywordtype">double</span>* data=<span class="keyword">new</span> <span class="keywordtype">double</span>[theBuffer.size()*theBuffer[0].size()];</div>
-<div class="line"><a name="l01306"></a><span class="lineno"> 1306</span>   <span class="keywordtype">double</span>* abscoeff=<span class="keyword">new</span> <span class="keywordtype">double</span>[theBuffer.size()*theBuffer[0].size()];</div>
-<div class="line"><a name="l01307"></a><span class="lineno"> 1307</span>   <span class="keywordtype">size_t</span>* p=<span class="keyword">new</span> <span class="keywordtype">size_t</span>[theBuffer.size()*theBuffer[0].size()];</div>
-<div class="line"><a name="l01308"></a><span class="lineno"> 1308</span>   <span class="keywordflow">for</span>(<span class="keywordtype">int</span> irow=0;irow<theBuffer.size();++irow){</div>
-<div class="line"><a name="l01309"></a><span class="lineno"> 1309</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> icol=0;icol<theBuffer[0].size();++icol){</div>
-<div class="line"><a name="l01310"></a><span class="lineno"> 1310</span>       <span class="keywordtype">int</span> index=irow*theBuffer[0].size()+icol;</div>
-<div class="line"><a name="l01311"></a><span class="lineno"> 1311</span>       assert(index<theBuffer.size()*theBuffer[0].size());</div>
-<div class="line"><a name="l01312"></a><span class="lineno"> 1312</span>       data[index]=theBuffer[irow][icol];</div>
-<div class="line"><a name="l01313"></a><span class="lineno"> 1313</span>     }</div>
-<div class="line"><a name="l01314"></a><span class="lineno"> 1314</span>   }</div>
-<div class="line"><a name="l01315"></a><span class="lineno"> 1315</span>   <span class="keywordtype">int</span> nsize=theBuffer.size()*theBuffer[0].size();</div>
-<div class="line"><a name="l01316"></a><span class="lineno"> 1316</span>   gsl_wavelet *w;</div>
-<div class="line"><a name="l01317"></a><span class="lineno"> 1317</span>   gsl_wavelet_workspace *work;</div>
-<div class="line"><a name="l01318"></a><span class="lineno"> 1318</span>   assert(nsize);</div>
-<div class="line"><a name="l01319"></a><span class="lineno"> 1319</span>   w=gsl_wavelet_alloc(filter::Filter::getWaveletType(wavelet_type),family);</div>
-<div class="line"><a name="l01320"></a><span class="lineno"> 1320</span>   work=gsl_wavelet_workspace_alloc(nsize);</div>
-<div class="line"><a name="l01321"></a><span class="lineno"> 1321</span>   gsl_wavelet2d_nstransform_forward (w, data, theBuffer.size(), theBuffer[0].size(),theBuffer[0].size(), work);</div>
-<div class="line"><a name="l01322"></a><span class="lineno"> 1322</span>   <span class="keywordflow">for</span>(<span class="keywordtype">int</span> irow=0;irow<theBuffer.size();++irow){</div>
-<div class="line"><a name="l01323"></a><span class="lineno"> 1323</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> icol=0;icol<theBuffer[0].size();++icol){</div>
-<div class="line"><a name="l01324"></a><span class="lineno"> 1324</span>       <span class="keywordtype">int</span> index=irow*theBuffer[0].size()+icol;</div>
-<div class="line"><a name="l01325"></a><span class="lineno"> 1325</span>       abscoeff[index]=fabs(data[index]);</div>
-<div class="line"><a name="l01326"></a><span class="lineno"> 1326</span>     }</div>
-<div class="line"><a name="l01327"></a><span class="lineno"> 1327</span>   }</div>
-<div class="line"><a name="l01328"></a><span class="lineno"> 1328</span>   <span class="keywordtype">int</span> nc=(100-cut)/100.0*nsize;</div>
-<div class="line"><a name="l01329"></a><span class="lineno"> 1329</span>   gsl_sort_index(p,abscoeff,1,nsize);</div>
-<div class="line"><a name="l01330"></a><span class="lineno"> 1330</span>   <span class="keywordflow">for</span>(<span class="keywordtype">int</span> i=0;(i+nc)<nsize;i++)</div>
-<div class="line"><a name="l01331"></a><span class="lineno"> 1331</span>    data[p[i]]=0;</div>
-<div class="line"><a name="l01332"></a><span class="lineno"> 1332</span>   gsl_wavelet2d_nstransform_inverse (w, data, theBuffer.size(), theBuffer[0].size(),theBuffer[0].size(), work);</div>
-<div class="line"><a name="l01333"></a><span class="lineno"> 1333</span>   <span class="keywordflow">for</span>(<span class="keywordtype">int</span> irow=0;irow<theBuffer.size();++irow){</div>
-<div class="line"><a name="l01334"></a><span class="lineno"> 1334</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> icol=0;icol<theBuffer[irow].size();++icol){</div>
-<div class="line"><a name="l01335"></a><span class="lineno"> 1335</span>       <span class="keywordtype">int</span> index=irow*theBuffer[irow].size()+icol;</div>
-<div class="line"><a name="l01336"></a><span class="lineno"> 1336</span>       theBuffer[irow][icol]=data[index];</div>
-<div class="line"><a name="l01337"></a><span class="lineno"> 1337</span>     }</div>
-<div class="line"><a name="l01338"></a><span class="lineno"> 1338</span>     progress=(1.0+irow);</div>
-<div class="line"><a name="l01339"></a><span class="lineno"> 1339</span>     progress/=theBuffer.nRows();</div>
-<div class="line"><a name="l01340"></a><span class="lineno"> 1340</span>     pfnProgress(progress,pszMessage,pProgressArg);</div>
-<div class="line"><a name="l01341"></a><span class="lineno"> 1341</span>   }</div>
-<div class="line"><a name="l01342"></a><span class="lineno"> 1342</span>   theBuffer.erase(theBuffer.begin()+nRow,theBuffer.end());</div>
-<div class="line"><a name="l01343"></a><span class="lineno"> 1343</span>   <span class="keywordflow">for</span>(<span class="keywordtype">int</span> irow=0;irow<theBuffer.size();++irow)</div>
-<div class="line"><a name="l01344"></a><span class="lineno"> 1344</span>     theBuffer[irow].erase(theBuffer[irow].begin()+nCol,theBuffer[irow].end());</div>
-<div class="line"><a name="l01345"></a><span class="lineno"> 1345</span>   <span class="keyword">delete</span>[] data;</div>
-<div class="line"><a name="l01346"></a><span class="lineno"> 1346</span>   <span class="keyword">delete</span>[] abscoeff;</div>
-<div class="line"><a name="l01347"></a><span class="lineno"> 1347</span>   <span class="keyword">delete</span>[] p;</div>
-<div class="line"><a name="l01348"></a><span class="lineno"> 1348</span>   gsl_wavelet_free (w);</div>
-<div class="line"><a name="l01349"></a><span class="lineno"> 1349</span>   gsl_wavelet_workspace_free (work);</div>
-<div class="line"><a name="l01350"></a><span class="lineno"> 1350</span> </div>
-<div class="line"><a name="l01351"></a><span class="lineno"> 1351</span> }</div>
-<div class="line"><a name="l01352"></a><span class="lineno"> 1352</span> </div>
-<div class="line"><a name="l01353"></a><span class="lineno"> 1353</span> }</div>
-<div class="line"><a name="l01354"></a><span class="lineno"> 1354</span> </div>
-<div class="line"><a name="l01355"></a><span class="lineno"> 1355</span> <span class="preprocessor">#endif </span><span class="comment">/* _MYFILTER_H_ */</span><span class="preprocessor"></span></div>
+<div class="line"><a name="l00463"></a><span class="lineno">  463</span>       <span class="keywordflow">case</span>(filter2d::density):{</div>
+<div class="line"><a name="l00464"></a><span class="lineno">  464</span>         <span class="keywordflow">if</span>(windowBuffer.size()){</div>
+<div class="line"><a name="l00465"></a><span class="lineno">  465</span>           std::vector<short>::const_iterator vit=m_class.begin();</div>
+<div class="line"><a name="l00466"></a><span class="lineno">  466</span>           <span class="keywordflow">while</span>(vit!=m_class.end())</div>
+<div class="line"><a name="l00467"></a><span class="lineno">  467</span>             outBuffer[x/down]+=100.0*occurrence[*(vit++)]/windowBuffer.size();</div>
+<div class="line"><a name="l00468"></a><span class="lineno">  468</span>         }</div>
+<div class="line"><a name="l00469"></a><span class="lineno">  469</span>         <span class="keywordflow">else</span></div>
+<div class="line"><a name="l00470"></a><span class="lineno">  470</span>           outBuffer[x/down]=noDataValue;</div>
+<div class="line"><a name="l00471"></a><span class="lineno">  471</span>         <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l00472"></a><span class="lineno">  472</span>       }</div>
+<div class="line"><a name="l00473"></a><span class="lineno">  473</span>       <span class="keywordflow">case</span>(filter2d::countid):{</div>
+<div class="line"><a name="l00474"></a><span class="lineno">  474</span>     <span class="keywordflow">if</span>(windowBuffer.size())</div>
+<div class="line"><a name="l00475"></a><span class="lineno">  475</span>       outBuffer[x/down]=occurrence.size();</div>
+<div class="line"><a name="l00476"></a><span class="lineno">  476</span>     <span class="keywordflow">else</span></div>
+<div class="line"><a name="l00477"></a><span class="lineno">  477</span>       outBuffer[x/down]=noDataValue;</div>
+<div class="line"><a name="l00478"></a><span class="lineno">  478</span>     <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l00479"></a><span class="lineno">  479</span>       }</div>
+<div class="line"><a name="l00480"></a><span class="lineno">  480</span>       <span class="keywordflow">case</span>(filter2d::mode):{</div>
+<div class="line"><a name="l00481"></a><span class="lineno">  481</span>         <span class="keywordflow">if</span>(occurrence.size()){</div>
+<div class="line"><a name="l00482"></a><span class="lineno">  482</span>           std::map<int,int>::const_iterator maxit=occurrence.begin();</div>
+<div class="line"><a name="l00483"></a><span class="lineno">  483</span>           <span class="keywordflow">for</span>(std::map<int,int>::const_iterator mit=occurrence.begin();mit!=occurrence.end();++mit){</div>
+<div class="line"><a name="l00484"></a><span class="lineno">  484</span>             <span class="keywordflow">if</span>(mit->second>maxit->second)</div>
+<div class="line"><a name="l00485"></a><span class="lineno">  485</span>               maxit=mit;</div>
+<div class="line"><a name="l00486"></a><span class="lineno">  486</span>           }</div>
+<div class="line"><a name="l00487"></a><span class="lineno">  487</span>           <span class="keywordflow">if</span>(occurrence[inBuffer[(dimY-1)/2][x]]<maxit->second)<span class="comment">//</span></div>
+<div class="line"><a name="l00488"></a><span class="lineno">  488</span>             outBuffer[x/down]=maxit->first;</div>
+<div class="line"><a name="l00489"></a><span class="lineno">  489</span>           <span class="keywordflow">else</span><span class="comment">//favorize original value in case of ties</span></div>
+<div class="line"><a name="l00490"></a><span class="lineno">  490</span>             outBuffer[x/down]=inBuffer[(dimY-1)/2][x];</div>
+<div class="line"><a name="l00491"></a><span class="lineno">  491</span>         }</div>
+<div class="line"><a name="l00492"></a><span class="lineno">  492</span>         <span class="keywordflow">else</span></div>
+<div class="line"><a name="l00493"></a><span class="lineno">  493</span>           outBuffer[x/down]=noDataValue;</div>
+<div class="line"><a name="l00494"></a><span class="lineno">  494</span>         <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l00495"></a><span class="lineno">  495</span>       }</div>
+<div class="line"><a name="l00496"></a><span class="lineno">  496</span>       <span class="keywordflow">case</span>(filter2d::threshold):{</div>
+<div class="line"><a name="l00497"></a><span class="lineno">  497</span>         assert(m_class.size()==m_threshold.size());</div>
+<div class="line"><a name="l00498"></a><span class="lineno">  498</span>         <span class="keywordflow">if</span>(windowBuffer.size()){</div>
+<div class="line"><a name="l00499"></a><span class="lineno">  499</span>           outBuffer[x/down]=inBuffer[(dimY-1)/2][x];<span class="comment">//initialize with original value (in case thresholds not met)</span></div>
+<div class="line"><a name="l00500"></a><span class="lineno">  500</span>           <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iclass=0;iclass<m_class.size();++iclass){</div>
+<div class="line"><a name="l00501"></a><span class="lineno">  501</span>             <span class="keywordflow">if</span>(100.0*(occurrence[m_class[iclass]])/windowBuffer.size()>m_threshold[iclass])</div>
+<div class="line"><a name="l00502"></a><span class="lineno">  502</span>               outBuffer[x/down]=m_class[iclass];</div>
+<div class="line"><a name="l00503"></a><span class="lineno">  503</span>           }</div>
+<div class="line"><a name="l00504"></a><span class="lineno">  504</span>         }</div>
+<div class="line"><a name="l00505"></a><span class="lineno">  505</span>         <span class="keywordflow">else</span></div>
+<div class="line"><a name="l00506"></a><span class="lineno">  506</span>           outBuffer[x/down]=noDataValue;</div>
+<div class="line"><a name="l00507"></a><span class="lineno">  507</span>         <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l00508"></a><span class="lineno">  508</span>       }</div>
+<div class="line"><a name="l00509"></a><span class="lineno">  509</span>       <span class="keywordflow">case</span>(filter2d::scramble):{<span class="comment">//could be done more efficiently window by window with random shuffling entire buffer and assigning entire buffer at once to output image...</span></div>
+<div class="line"><a name="l00510"></a><span class="lineno">  510</span>     <span class="keywordflow">if</span>(windowBuffer.size()){</div>
+<div class="line"><a name="l00511"></a><span class="lineno">  511</span>       <span class="keywordtype">int</span> randomIndex=std::rand()%windowBuffer.size();</div>
+<div class="line"><a name="l00512"></a><span class="lineno">  512</span>       <span class="keywordflow">if</span>(randomIndex>=windowBuffer.size())</div>
+<div class="line"><a name="l00513"></a><span class="lineno">  513</span>         outBuffer[x/down]=windowBuffer.back();</div>
+<div class="line"><a name="l00514"></a><span class="lineno">  514</span>       <span class="keywordflow">else</span> <span class="keywordflow">if</span>(randomIndex<0)</div>
+<div class="line"><a name="l00515"></a><span class="lineno">  515</span>         outBuffer[x/down]=windowBuffer[0];</div>
+<div class="line"><a name="l00516"></a><span class="lineno">  516</span>       <span class="keywordflow">else</span></div>
+<div class="line"><a name="l00517"></a><span class="lineno">  517</span>         outBuffer[x/down]=windowBuffer[randomIndex];</div>
+<div class="line"><a name="l00518"></a><span class="lineno">  518</span>     }</div>
+<div class="line"><a name="l00519"></a><span class="lineno">  519</span>     <span class="keywordflow">else</span></div>
+<div class="line"><a name="l00520"></a><span class="lineno">  520</span>       outBuffer[x/down]=noDataValue;</div>
+<div class="line"><a name="l00521"></a><span class="lineno">  521</span>     <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l00522"></a><span class="lineno">  522</span>       }</div>
+<div class="line"><a name="l00523"></a><span class="lineno">  523</span>       <span class="keywordflow">case</span>(filter2d::mixed):{</div>
+<div class="line"><a name="l00524"></a><span class="lineno">  524</span>         <span class="keyword">enum</span> MixType { BF=11, CF=12, MF=13, NF=20, W=30 };</div>
+<div class="line"><a name="l00525"></a><span class="lineno">  525</span>         <span class="keywordtype">double</span> nBF=occurrence[BF];</div>
+<div class="line"><a name="l00526"></a><span class="lineno">  526</span>         <span class="keywordtype">double</span> nCF=occurrence[CF];</div>
+<div class="line"><a name="l00527"></a><span class="lineno">  527</span>         <span class="keywordtype">double</span> nMF=occurrence[MF];</div>
+<div class="line"><a name="l00528"></a><span class="lineno">  528</span>         <span class="keywordtype">double</span> nNF=occurrence[NF];</div>
+<div class="line"><a name="l00529"></a><span class="lineno">  529</span>         <span class="keywordtype">double</span> nW=occurrence[W];</div>
+<div class="line"><a name="l00530"></a><span class="lineno">  530</span>         <span class="keywordflow">if</span>(windowBuffer.size()){</div>
+<div class="line"><a name="l00531"></a><span class="lineno">  531</span>           <span class="keywordflow">if</span>((nBF+nCF+nMF)&&(nBF+nCF+nMF>=nNF+nW)){<span class="comment">//forest</span></div>
+<div class="line"><a name="l00532"></a><span class="lineno">  532</span>             <span class="keywordflow">if</span>(nBF/(nBF+nCF)>=0.75)</div>
+<div class="line"><a name="l00533"></a><span class="lineno">  533</span>               outBuffer[x/down]=BF;</div>
+<div class="line"><a name="l00534"></a><span class="lineno">  534</span>             <span class="keywordflow">else</span> <span class="keywordflow">if</span>(nCF/(nBF+nCF)>=0.75)</div>
+<div class="line"><a name="l00535"></a><span class="lineno">  535</span>               outBuffer[x/down]=CF;</div>
+<div class="line"><a name="l00536"></a><span class="lineno">  536</span>             <span class="keywordflow">else</span></div>
+<div class="line"><a name="l00537"></a><span class="lineno">  537</span>               outBuffer[x/down]=MF;</div>
+<div class="line"><a name="l00538"></a><span class="lineno">  538</span>           }</div>
+<div class="line"><a name="l00539"></a><span class="lineno">  539</span>           <span class="keywordflow">else</span>{<span class="comment">//non-forest</span></div>
+<div class="line"><a name="l00540"></a><span class="lineno">  540</span>             <span class="keywordflow">if</span>(nW&&(nW>=nNF))</div>
+<div class="line"><a name="l00541"></a><span class="lineno">  541</span>               outBuffer[x/down]=W;</div>
+<div class="line"><a name="l00542"></a><span class="lineno">  542</span>             <span class="keywordflow">else</span></div>
+<div class="line"><a name="l00543"></a><span class="lineno">  543</span>               outBuffer[x/down]=NF;</div>
+<div class="line"><a name="l00544"></a><span class="lineno">  544</span>           }</div>
+<div class="line"><a name="l00545"></a><span class="lineno">  545</span>         }</div>
+<div class="line"><a name="l00546"></a><span class="lineno">  546</span>         <span class="keywordflow">else</span></div>
+<div class="line"><a name="l00547"></a><span class="lineno">  547</span>           outBuffer[x/down]=inBuffer[indexJ][indexI];</div>
+<div class="line"><a name="l00548"></a><span class="lineno">  548</span>         <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l00549"></a><span class="lineno">  549</span>       }</div>
+<div class="line"><a name="l00550"></a><span class="lineno">  550</span>       <span class="keywordflow">default</span>:</div>
+<div class="line"><a name="l00551"></a><span class="lineno">  551</span>         <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l00552"></a><span class="lineno">  552</span>       }</div>
+<div class="line"><a name="l00553"></a><span class="lineno">  553</span>     }</div>
+<div class="line"><a name="l00554"></a><span class="lineno">  554</span>     progress=(1.0+y/down);</div>
+<div class="line"><a name="l00555"></a><span class="lineno">  555</span>     progress+=(outputVector.size());</div>
+<div class="line"><a name="l00556"></a><span class="lineno">  556</span>     progress/=outputVector.size();</div>
+<div class="line"><a name="l00557"></a><span class="lineno">  557</span>     pfnProgress(progress,pszMessage,pProgressArg);</div>
+<div class="line"><a name="l00558"></a><span class="lineno">  558</span>     <span class="comment">//copy outBuffer to outputVector</span></div>
+<div class="line"><a name="l00559"></a><span class="lineno">  559</span>     outputVector[y/down]=outBuffer;</div>
+<div class="line"><a name="l00560"></a><span class="lineno">  560</span>   }</div>
+<div class="line"><a name="l00561"></a><span class="lineno">  561</span> }</div>
+<div class="line"><a name="l00562"></a><span class="lineno">  562</span> </div>
+<div class="line"><a name="l00563"></a><span class="lineno">  563</span> <span class="comment">// class Compare_mapValue{</span></div>
+<div class="line"><a name="l00564"></a><span class="lineno">  564</span> <span class="comment">// public:</span></div>
+<div class="line"><a name="l00565"></a><span class="lineno">  565</span> <span class="comment">//   int operator() (const map<int,int>::value_type& v1, const map<int, int>::value_type& v2) const{</span></div>
+<div class="line"><a name="l00566"></a><span class="lineno">  566</span> <span class="comment">//     return (v1.second)>(v2.second);</span></div>
+<div class="line"><a name="l00567"></a><span class="lineno">  567</span> <span class="comment">//   }</span></div>
+<div class="line"><a name="l00568"></a><span class="lineno">  568</span> <span class="comment">// };</span></div>
+<div class="line"><a name="l00569"></a><span class="lineno">  569</span> </div>
+<div class="line"><a name="l00570"></a><span class="lineno">  570</span> <span class="keyword">template</span><<span class="keyword">class</span> T> <span class="keywordtype">void</span> Filter2d::shift(<span class="keyword">const</span> <a class="code" href="classVector2d.html">Vector2d<T></a>& input, <a class="code" href="classVector2d.html">Vector2d<T></a>& output, <span class="keywordtype">double</span> offsetX, <span class="keywordtype">double</span> o [...]
+<div class="line"><a name="l00571"></a><span class="lineno">  571</span>   output.resize(input.nRows(),input.nCols());</div>
+<div class="line"><a name="l00572"></a><span class="lineno">  572</span>   <span class="keyword">const</span> gsl_rng_type *rangenType;</div>
+<div class="line"><a name="l00573"></a><span class="lineno">  573</span>   gsl_rng *rangen;</div>
+<div class="line"><a name="l00574"></a><span class="lineno">  574</span>   gsl_rng_env_setup();</div>
+<div class="line"><a name="l00575"></a><span class="lineno">  575</span>   rangenType=gsl_rng_default;</div>
+<div class="line"><a name="l00576"></a><span class="lineno">  576</span>   rangen=gsl_rng_alloc(rangenType);</div>
+<div class="line"><a name="l00577"></a><span class="lineno">  577</span>   <span class="keywordtype">long</span> seed=time(NULL)*getpid();</div>
+<div class="line"><a name="l00578"></a><span class="lineno">  578</span>   gsl_rng_set(rangen,seed);</div>
+<div class="line"><a name="l00579"></a><span class="lineno">  579</span>   <span class="keyword">const</span> <span class="keywordtype">char</span>* pszMessage;</div>
+<div class="line"><a name="l00580"></a><span class="lineno">  580</span>   <span class="keywordtype">void</span>* pProgressArg=NULL;</div>
+<div class="line"><a name="l00581"></a><span class="lineno">  581</span>   GDALProgressFunc pfnProgress=GDALTermProgress;</div>
+<div class="line"><a name="l00582"></a><span class="lineno">  582</span>   <span class="keywordtype">double</span> progress=0;</div>
+<div class="line"><a name="l00583"></a><span class="lineno">  583</span>   pfnProgress(progress,pszMessage,pProgressArg);</div>
+<div class="line"><a name="l00584"></a><span class="lineno">  584</span>   <span class="keywordflow">for</span>(<span class="keywordtype">int</span> j=0;j<input.nRows();++j){</div>
+<div class="line"><a name="l00585"></a><span class="lineno">  585</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> i=0;i<input.nCols();++i){</div>
+<div class="line"><a name="l00586"></a><span class="lineno">  586</span>       T theValue=0;</div>
+<div class="line"><a name="l00587"></a><span class="lineno">  587</span>       <span class="keywordtype">double</span> randomX=0;</div>
+<div class="line"><a name="l00588"></a><span class="lineno">  588</span>       <span class="keywordtype">double</span> randomY=0;</div>
+<div class="line"><a name="l00589"></a><span class="lineno">  589</span>       <span class="keywordflow">if</span>(randomSigma>0){</div>
+<div class="line"><a name="l00590"></a><span class="lineno">  590</span>         randomX=gsl_ran_gaussian(rangen,randomSigma);</div>
+<div class="line"><a name="l00591"></a><span class="lineno">  591</span>         randomY=gsl_ran_gaussian(rangen,randomSigma);</div>
+<div class="line"><a name="l00592"></a><span class="lineno">  592</span>       }</div>
+<div class="line"><a name="l00593"></a><span class="lineno">  593</span>       <span class="keywordtype">double</span> readCol=i+offsetX+randomX;</div>
+<div class="line"><a name="l00594"></a><span class="lineno">  594</span>       <span class="keywordtype">double</span> readRow=j+offsetY+randomY;</div>
+<div class="line"><a name="l00595"></a><span class="lineno">  595</span>       <span class="keywordflow">if</span>(readRow<0)</div>
+<div class="line"><a name="l00596"></a><span class="lineno">  596</span>         readRow=0;</div>
+<div class="line"><a name="l00597"></a><span class="lineno">  597</span>       <span class="keywordflow">if</span>(readRow>input.nRows()-1)</div>
+<div class="line"><a name="l00598"></a><span class="lineno">  598</span>         readRow=input.nRows()-1;</div>
+<div class="line"><a name="l00599"></a><span class="lineno">  599</span>       <span class="keywordflow">if</span>(readCol<0)</div>
+<div class="line"><a name="l00600"></a><span class="lineno">  600</span>         readCol=0;</div>
+<div class="line"><a name="l00601"></a><span class="lineno">  601</span>       <span class="keywordflow">if</span>(readCol>input.nCols()-1)</div>
+<div class="line"><a name="l00602"></a><span class="lineno">  602</span>         readCol=input.nCols()-1;</div>
+<div class="line"><a name="l00603"></a><span class="lineno">  603</span>       <span class="keywordflow">switch</span>(resample){</div>
+<div class="line"><a name="l00604"></a><span class="lineno">  604</span>       <span class="keywordflow">case</span>(BILINEAR):{</div>
+<div class="line"><a name="l00605"></a><span class="lineno">  605</span>         <span class="keywordtype">double</span> lowerRow=readRow-0.5;</div>
+<div class="line"><a name="l00606"></a><span class="lineno">  606</span>         <span class="keywordtype">double</span> upperRow=readRow+0.5;</div>
+<div class="line"><a name="l00607"></a><span class="lineno">  607</span>         lowerRow=<span class="keyword">static_cast<</span><span class="keywordtype">int</span><span class="keyword">></span>(lowerRow);</div>
+<div class="line"><a name="l00608"></a><span class="lineno">  608</span>         upperRow=<span class="keyword">static_cast<</span><span class="keywordtype">int</span><span class="keyword">></span>(upperRow);</div>
+<div class="line"><a name="l00609"></a><span class="lineno">  609</span>         <span class="keywordtype">double</span> lowerCol=readCol-0.5;</div>
+<div class="line"><a name="l00610"></a><span class="lineno">  610</span>         <span class="keywordtype">double</span> upperCol=readCol+0.5;</div>
+<div class="line"><a name="l00611"></a><span class="lineno">  611</span>         lowerCol=<span class="keyword">static_cast<</span><span class="keywordtype">int</span><span class="keyword">></span>(lowerCol);</div>
+<div class="line"><a name="l00612"></a><span class="lineno">  612</span>         upperCol=<span class="keyword">static_cast<</span><span class="keywordtype">int</span><span class="keyword">></span>(upperCol);</div>
+<div class="line"><a name="l00613"></a><span class="lineno">  613</span>         assert(lowerRow>=0);</div>
+<div class="line"><a name="l00614"></a><span class="lineno">  614</span>         assert(lowerRow<input.nRows());</div>
+<div class="line"><a name="l00615"></a><span class="lineno">  615</span>         assert(lowerCol>=0);</div>
+<div class="line"><a name="l00616"></a><span class="lineno">  616</span>         assert(lowerCol<input.nCols());</div>
+<div class="line"><a name="l00617"></a><span class="lineno">  617</span>         assert(upperRow>=0);</div>
+<div class="line"><a name="l00618"></a><span class="lineno">  618</span>         assert(upperRow<input.nRows());</div>
+<div class="line"><a name="l00619"></a><span class="lineno">  619</span>         assert(upperCol>=0);</div>
+<div class="line"><a name="l00620"></a><span class="lineno">  620</span>         <span class="keywordflow">if</span>(upperCol>=input.nCols()){</div>
+<div class="line"><a name="l00621"></a><span class="lineno">  621</span>           std::cout << <span class="stringliteral">"upperCol: "</span> << upperCol << std::endl;</div>
+<div class="line"><a name="l00622"></a><span class="lineno">  622</span>           std::cout << <span class="stringliteral">"readCol: "</span> << readCol << std::endl;</div>
+<div class="line"><a name="l00623"></a><span class="lineno">  623</span>           std::cout << <span class="stringliteral">"readCol+0.5: "</span> << readCol+0.5 << std::endl;</div>
+<div class="line"><a name="l00624"></a><span class="lineno">  624</span>           std::cout << <span class="stringliteral">"static_cast<int>(readCol+0.5): "</span> << <span class="keyword">static_cast<</span><span class="keywordtype">int</span><span class="keyword">></span>(readCol+0.5) << std::endl;</div>
+<div class="line"><a name="l00625"></a><span class="lineno">  625</span>         }</div>
+<div class="line"><a name="l00626"></a><span class="lineno">  626</span>         assert(upperCol<input.nCols());</div>
+<div class="line"><a name="l00627"></a><span class="lineno">  627</span>         <span class="keywordtype">double</span> c00=input[lowerRow][lowerCol];</div>
+<div class="line"><a name="l00628"></a><span class="lineno">  628</span>         <span class="keywordtype">double</span> c11=input[upperRow][upperCol];</div>
+<div class="line"><a name="l00629"></a><span class="lineno">  629</span>         <span class="keywordtype">double</span> c01=input[lowerRow][upperCol];</div>
+<div class="line"><a name="l00630"></a><span class="lineno">  630</span>         <span class="keywordtype">double</span> c10=input[upperRow][lowerCol];</div>
+<div class="line"><a name="l00631"></a><span class="lineno">  631</span>         <span class="keywordtype">double</span> a=(upperCol-readCol)*c00+(readCol-lowerCol)*c01;</div>
+<div class="line"><a name="l00632"></a><span class="lineno">  632</span>         <span class="keywordtype">double</span> b=(upperCol-readCol)*c10+(readCol-lowerCol)*c11;</div>
+<div class="line"><a name="l00633"></a><span class="lineno">  633</span>         theValue=(upperRow-readRow)*a+(readRow-lowerRow)*b;</div>
+<div class="line"><a name="l00634"></a><span class="lineno">  634</span>         <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l00635"></a><span class="lineno">  635</span>       }</div>
+<div class="line"><a name="l00636"></a><span class="lineno">  636</span>       <span class="keywordflow">default</span>:</div>
+<div class="line"><a name="l00637"></a><span class="lineno">  637</span>         theValue=input[<span class="keyword">static_cast<</span><span class="keywordtype">int</span><span class="keyword">></span>(readRow)][static_cast<int>(readCol)];</div>
+<div class="line"><a name="l00638"></a><span class="lineno">  638</span>         <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l00639"></a><span class="lineno">  639</span>       }</div>
+<div class="line"><a name="l00640"></a><span class="lineno">  640</span>       assert(j>=0);</div>
+<div class="line"><a name="l00641"></a><span class="lineno">  641</span>       assert(j<output.nRows());</div>
+<div class="line"><a name="l00642"></a><span class="lineno">  642</span>       assert(i>=0);</div>
+<div class="line"><a name="l00643"></a><span class="lineno">  643</span>       assert(i<output.nCols());</div>
+<div class="line"><a name="l00644"></a><span class="lineno">  644</span>       output[j][i]=theValue;</div>
+<div class="line"><a name="l00645"></a><span class="lineno">  645</span>     }</div>
+<div class="line"><a name="l00646"></a><span class="lineno">  646</span>     progress=(1.0+j);</div>
+<div class="line"><a name="l00647"></a><span class="lineno">  647</span>     progress/=output.nRows();</div>
+<div class="line"><a name="l00648"></a><span class="lineno">  648</span>     pfnProgress(progress,pszMessage,pProgressArg);</div>
+<div class="line"><a name="l00649"></a><span class="lineno">  649</span>   }</div>
+<div class="line"><a name="l00650"></a><span class="lineno">  650</span>   gsl_rng_free(rangen);</div>
+<div class="line"><a name="l00651"></a><span class="lineno">  651</span> }</div>
+<div class="line"><a name="l00652"></a><span class="lineno">  652</span> </div>
+<div class="line"><a name="l00653"></a><span class="lineno">  653</span> <span class="keyword">template</span><<span class="keyword">class</span> T> <span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> Filter2d::morphology(<span class="keyword">const</span> <a class="code" href="classVector2d.html">Vector2d<T></a>& input, <a class="code" href="classVector2d.html">Vector2d<T></a>& output, <span  [...]
+<div class="line"><a name="l00654"></a><span class="lineno">  654</span> {</div>
+<div class="line"><a name="l00655"></a><span class="lineno">  655</span>   <span class="keyword">const</span> <span class="keywordtype">char</span>* pszMessage;</div>
+<div class="line"><a name="l00656"></a><span class="lineno">  656</span>   <span class="keywordtype">void</span>* pProgressArg=NULL;</div>
+<div class="line"><a name="l00657"></a><span class="lineno">  657</span>   GDALProgressFunc pfnProgress=GDALTermProgress;</div>
+<div class="line"><a name="l00658"></a><span class="lineno">  658</span>   <span class="keywordtype">double</span> progress=0;</div>
+<div class="line"><a name="l00659"></a><span class="lineno">  659</span>   pfnProgress(progress,pszMessage,pProgressArg);</div>
+<div class="line"><a name="l00660"></a><span class="lineno">  660</span> </div>
+<div class="line"><a name="l00661"></a><span class="lineno">  661</span>   <span class="keywordtype">double</span> noDataValue=0;</div>
+<div class="line"><a name="l00662"></a><span class="lineno">  662</span>   <span class="keywordflow">if</span>(m_noDataValues.size())</div>
+<div class="line"><a name="l00663"></a><span class="lineno">  663</span>     noDataValue=m_noDataValues[0];</div>
+<div class="line"><a name="l00664"></a><span class="lineno">  664</span> </div>
+<div class="line"><a name="l00665"></a><span class="lineno">  665</span>   <span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> nchange=0;</div>
+<div class="line"><a name="l00666"></a><span class="lineno">  666</span>   assert(dimX);</div>
+<div class="line"><a name="l00667"></a><span class="lineno">  667</span>   assert(dimY);</div>
+<div class="line"><a name="l00668"></a><span class="lineno">  668</span>   <a class="code" href="classstatfactory_1_1StatFactory.html">statfactory::StatFactory</a> stat;</div>
+<div class="line"><a name="l00669"></a><span class="lineno">  669</span>   <a class="code" href="classVector2d.html">Vector2d<T></a> inBuffer(dimY,input.nCols());</div>
+<div class="line"><a name="l00670"></a><span class="lineno">  670</span>   output.clear();</div>
+<div class="line"><a name="l00671"></a><span class="lineno">  671</span>   output.resize(input.nRows(),input.nCols());</div>
+<div class="line"><a name="l00672"></a><span class="lineno">  672</span>   <span class="keywordtype">int</span> indexI=0;</div>
+<div class="line"><a name="l00673"></a><span class="lineno">  673</span>   <span class="keywordtype">int</span> indexJ=0;</div>
+<div class="line"><a name="l00674"></a><span class="lineno">  674</span>   <span class="comment">//initialize last half of inBuffer</span></div>
+<div class="line"><a name="l00675"></a><span class="lineno">  675</span>   <span class="keywordflow">for</span>(<span class="keywordtype">int</span> j=-(dimY-1)/2;j<=dimY/2;++j){</div>
+<div class="line"><a name="l00676"></a><span class="lineno">  676</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> i=0;i<input.nCols();++i)</div>
+<div class="line"><a name="l00677"></a><span class="lineno">  677</span>       inBuffer[indexJ][i]=input[abs(j)][i];</div>
+<div class="line"><a name="l00678"></a><span class="lineno">  678</span>     ++indexJ;</div>
+<div class="line"><a name="l00679"></a><span class="lineno">  679</span>   }</div>
+<div class="line"><a name="l00680"></a><span class="lineno">  680</span>   <span class="keywordflow">for</span>(<span class="keywordtype">int</span> y=0;y<input.nRows();++y){</div>
+<div class="line"><a name="l00681"></a><span class="lineno">  681</span>     <span class="keywordflow">if</span>(y){<span class="comment">//inBuffer already initialized for y=0</span></div>
+<div class="line"><a name="l00682"></a><span class="lineno">  682</span>       <span class="comment">//erase first line from inBuffer</span></div>
+<div class="line"><a name="l00683"></a><span class="lineno">  683</span>       inBuffer.erase(inBuffer.begin());</div>
+<div class="line"><a name="l00684"></a><span class="lineno">  684</span>       <span class="comment">//read extra line and push back to inBuffer if not out of bounds</span></div>
+<div class="line"><a name="l00685"></a><span class="lineno">  685</span>       <span class="keywordflow">if</span>(y+dimY/2<input.nRows()){</div>
+<div class="line"><a name="l00686"></a><span class="lineno">  686</span>         <span class="comment">//allocate buffer</span></div>
+<div class="line"><a name="l00687"></a><span class="lineno">  687</span>         inBuffer.push_back(inBuffer.back());</div>
+<div class="line"><a name="l00688"></a><span class="lineno">  688</span>         <span class="keywordflow">for</span>(<span class="keywordtype">int</span> i=0;i<input.nCols();++i)</div>
+<div class="line"><a name="l00689"></a><span class="lineno">  689</span>           inBuffer[inBuffer.size()-1][i]=input[y+dimY/2][i];</div>
+<div class="line"><a name="l00690"></a><span class="lineno">  690</span>       }</div>
+<div class="line"><a name="l00691"></a><span class="lineno">  691</span>       <span class="keywordflow">else</span>{</div>
+<div class="line"><a name="l00692"></a><span class="lineno">  692</span>         <span class="keywordtype">int</span> over=y+dimY/2-input.nRows();</div>
+<div class="line"><a name="l00693"></a><span class="lineno">  693</span>         <span class="keywordtype">int</span> index=(inBuffer.size()-1)-over;</div>
+<div class="line"><a name="l00694"></a><span class="lineno">  694</span>         assert(index>=0);</div>
+<div class="line"><a name="l00695"></a><span class="lineno">  695</span>         assert(index<inBuffer.size());</div>
+<div class="line"><a name="l00696"></a><span class="lineno">  696</span>         inBuffer.push_back(inBuffer[index]);</div>
+<div class="line"><a name="l00697"></a><span class="lineno">  697</span>       }</div>
+<div class="line"><a name="l00698"></a><span class="lineno">  698</span>     }</div>
+<div class="line"><a name="l00699"></a><span class="lineno">  699</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> x=0;x<input.nCols();++x){</div>
+<div class="line"><a name="l00700"></a><span class="lineno">  700</span>       output[y][x]=0;</div>
+<div class="line"><a name="l00701"></a><span class="lineno">  701</span>       <span class="keywordtype">double</span> currentValue=inBuffer[(dimY-1)/2][x];</div>
+<div class="line"><a name="l00702"></a><span class="lineno">  702</span>       std::vector<double> statBuffer;</div>
+<div class="line"><a name="l00703"></a><span class="lineno">  703</span>       <span class="keywordtype">bool</span> currentMasked=<span class="keyword">false</span>;</div>
+<div class="line"><a name="l00704"></a><span class="lineno">  704</span>       <span class="keywordflow">for</span>(<span class="keywordtype">int</span> imask=0;imask<m_noDataValues.size();++imask){</div>
+<div class="line"><a name="l00705"></a><span class="lineno">  705</span>         <span class="keywordflow">if</span>(currentValue==m_noDataValues[imask]){</div>
+<div class="line"><a name="l00706"></a><span class="lineno">  706</span>           currentMasked=<span class="keyword">true</span>;</div>
+<div class="line"><a name="l00707"></a><span class="lineno">  707</span>           <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l00708"></a><span class="lineno">  708</span>         }</div>
+<div class="line"><a name="l00709"></a><span class="lineno">  709</span>       }</div>
+<div class="line"><a name="l00710"></a><span class="lineno">  710</span>       output[y][x]=currentValue;<span class="comment">//introduced due to hThreshold</span></div>
+<div class="line"><a name="l00711"></a><span class="lineno">  711</span>       <span class="keywordflow">if</span>(currentMasked){</div>
+<div class="line"><a name="l00712"></a><span class="lineno">  712</span>         output[y][x]=currentValue;</div>
+<div class="line"><a name="l00713"></a><span class="lineno">  713</span>       }</div>
+<div class="line"><a name="l00714"></a><span class="lineno">  714</span>       <span class="keywordflow">else</span>{</div>
+<div class="line"><a name="l00715"></a><span class="lineno">  715</span>         <span class="keywordflow">for</span>(<span class="keywordtype">int</span> j=-(dimY-1)/2;j<=dimY/2;++j){</div>
+<div class="line"><a name="l00716"></a><span class="lineno">  716</span>           <span class="keywordflow">for</span>(<span class="keywordtype">int</span> i=-(dimX-1)/2;i<=dimX/2;++i){</div>
+<div class="line"><a name="l00717"></a><span class="lineno">  717</span>             <span class="keywordtype">double</span> d2=i*i+j*j;<span class="comment">//square distance</span></div>
+<div class="line"><a name="l00718"></a><span class="lineno">  718</span>             <span class="keywordflow">if</span>(disc&&(d2>(dimX/2)*(dimY/2)))</div>
+<div class="line"><a name="l00719"></a><span class="lineno">  719</span>               <span class="keywordflow">continue</span>;</div>
+<div class="line"><a name="l00720"></a><span class="lineno">  720</span>             indexI=x+i;</div>
+<div class="line"><a name="l00721"></a><span class="lineno">  721</span>             <span class="comment">//check if out of bounds</span></div>
+<div class="line"><a name="l00722"></a><span class="lineno">  722</span>             <span class="keywordflow">if</span>(indexI<0)</div>
+<div class="line"><a name="l00723"></a><span class="lineno">  723</span>               indexI=-indexI;</div>
+<div class="line"><a name="l00724"></a><span class="lineno">  724</span>             <span class="keywordflow">else</span> <span class="keywordflow">if</span>(indexI>=input.nCols())</div>
+<div class="line"><a name="l00725"></a><span class="lineno">  725</span>               indexI=input.nCols()-i;</div>
+<div class="line"><a name="l00726"></a><span class="lineno">  726</span>             <span class="keywordflow">if</span>(y+j<0)</div>
+<div class="line"><a name="l00727"></a><span class="lineno">  727</span>               indexJ=-j;</div>
+<div class="line"><a name="l00728"></a><span class="lineno">  728</span>             <span class="keywordflow">else</span> <span class="keywordflow">if</span>(y+j>=input.nRows())</div>
+<div class="line"><a name="l00729"></a><span class="lineno">  729</span>                 indexJ=(dimY>2) ? (dimY-1)/2-j : 0;</div>
+<div class="line"><a name="l00730"></a><span class="lineno">  730</span>               <span class="keywordflow">else</span></div>
+<div class="line"><a name="l00731"></a><span class="lineno">  731</span>                 indexJ=(dimY-1)/2+j;</div>
+<div class="line"><a name="l00732"></a><span class="lineno">  732</span>             <span class="keywordflow">if</span>(inBuffer[indexJ][indexI]==noDataValue)</div>
+<div class="line"><a name="l00733"></a><span class="lineno">  733</span>               <span class="keywordflow">continue</span>;</div>
+<div class="line"><a name="l00734"></a><span class="lineno">  734</span>             <span class="keywordtype">bool</span> masked=<span class="keyword">false</span>;</div>
+<div class="line"><a name="l00735"></a><span class="lineno">  735</span>             <span class="keywordflow">for</span>(<span class="keywordtype">int</span> imask=0;imask<m_noDataValues.size();++imask){</div>
+<div class="line"><a name="l00736"></a><span class="lineno">  736</span>               <span class="keywordflow">if</span>(inBuffer[indexJ][indexI]==m_noDataValues[imask]){</div>
+<div class="line"><a name="l00737"></a><span class="lineno">  737</span>                 masked=<span class="keyword">true</span>;</div>
+<div class="line"><a name="l00738"></a><span class="lineno">  738</span>                 <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l00739"></a><span class="lineno">  739</span>               }</div>
+<div class="line"><a name="l00740"></a><span class="lineno">  740</span>             }</div>
+<div class="line"><a name="l00741"></a><span class="lineno">  741</span>             <span class="keywordflow">if</span>(!masked){</div>
+<div class="line"><a name="l00742"></a><span class="lineno">  742</span>               <span class="keywordtype">short</span> binValue=0;</div>
+<div class="line"><a name="l00743"></a><span class="lineno">  743</span>               <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iclass=0;iclass<m_class.size();++iclass){</div>
+<div class="line"><a name="l00744"></a><span class="lineno">  744</span>                 <span class="keywordflow">if</span>(inBuffer[indexJ][indexI]==m_class[iclass]){</div>
+<div class="line"><a name="l00745"></a><span class="lineno">  745</span>                   binValue=1;</div>
+<div class="line"><a name="l00746"></a><span class="lineno">  746</span>                   <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l00747"></a><span class="lineno">  747</span>                 }</div>
+<div class="line"><a name="l00748"></a><span class="lineno">  748</span>               }</div>
+<div class="line"><a name="l00749"></a><span class="lineno">  749</span>               <span class="keywordflow">if</span>(m_class.size())</div>
+<div class="line"><a name="l00750"></a><span class="lineno">  750</span>                 statBuffer.push_back(binValue);</div>
+<div class="line"><a name="l00751"></a><span class="lineno">  751</span>               <span class="keywordflow">else</span></div>
+<div class="line"><a name="l00752"></a><span class="lineno">  752</span>                 statBuffer.push_back(inBuffer[indexJ][indexI]);</div>
+<div class="line"><a name="l00753"></a><span class="lineno">  753</span>             }</div>
+<div class="line"><a name="l00754"></a><span class="lineno">  754</span>           }</div>
+<div class="line"><a name="l00755"></a><span class="lineno">  755</span>         }</div>
+<div class="line"><a name="l00756"></a><span class="lineno">  756</span>         <span class="keywordflow">if</span>(statBuffer.size()){</div>
+<div class="line"><a name="l00757"></a><span class="lineno">  757</span>           <span class="keywordflow">switch</span>(getFilterType(method)){</div>
+<div class="line"><a name="l00758"></a><span class="lineno">  758</span>           <span class="keywordflow">case</span>(filter2d::dilate):</div>
+<div class="line"><a name="l00759"></a><span class="lineno">  759</span>             <span class="keywordflow">if</span>(output[y][x]<stat.mymax(statBuffer)-hThreshold){</div>
+<div class="line"><a name="l00760"></a><span class="lineno">  760</span>               output[y][x]=stat.mymax(statBuffer);</div>
+<div class="line"><a name="l00761"></a><span class="lineno">  761</span>               ++nchange;</div>
+<div class="line"><a name="l00762"></a><span class="lineno">  762</span>             }</div>
+<div class="line"><a name="l00763"></a><span class="lineno">  763</span>             <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l00764"></a><span class="lineno">  764</span>           <span class="keywordflow">case</span>(filter2d::erode):</div>
+<div class="line"><a name="l00765"></a><span class="lineno">  765</span>             <span class="keywordflow">if</span>(output[y][x]>stat.mymin(statBuffer)+hThreshold){</div>
+<div class="line"><a name="l00766"></a><span class="lineno">  766</span>               output[y][x]=stat.mymin(statBuffer);</div>
+<div class="line"><a name="l00767"></a><span class="lineno">  767</span>               ++nchange;</div>
+<div class="line"><a name="l00768"></a><span class="lineno">  768</span>             }</div>
+<div class="line"><a name="l00769"></a><span class="lineno">  769</span>             <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l00770"></a><span class="lineno">  770</span>           <span class="keywordflow">default</span>:</div>
+<div class="line"><a name="l00771"></a><span class="lineno">  771</span>             std::ostringstream ess;</div>
+<div class="line"><a name="l00772"></a><span class="lineno">  772</span>             ess << <span class="stringliteral">"Error:  morphology method "</span> << method << <span class="stringliteral">" not supported, choose "</span> << filter2d::dilate << <span class="stringliteral">" (dilate) or "</span> << filter2d::erode << <span class="stringliteral">" (erode)"</span> << std::endl;</div>
+<div class="line"><a name="l00773"></a><span class="lineno">  773</span>             <span class="keywordflow">throw</span>(ess.str());</div>
+<div class="line"><a name="l00774"></a><span class="lineno">  774</span>             <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l00775"></a><span class="lineno">  775</span>           }</div>
+<div class="line"><a name="l00776"></a><span class="lineno">  776</span>           <span class="keywordflow">if</span>(output[y][x]&&m_class.size())</div>
+<div class="line"><a name="l00777"></a><span class="lineno">  777</span>             output[y][x]=m_class[0];</div>
+<div class="line"><a name="l00778"></a><span class="lineno">  778</span>           <span class="comment">// else{</span></div>
+<div class="line"><a name="l00779"></a><span class="lineno">  779</span>           <span class="comment">//   assert(m_noDataValues.size());</span></div>
+<div class="line"><a name="l00780"></a><span class="lineno">  780</span>           <span class="comment">//   output[x]=m_noDataValues[0];</span></div>
+<div class="line"><a name="l00781"></a><span class="lineno">  781</span>           <span class="comment">// }</span></div>
+<div class="line"><a name="l00782"></a><span class="lineno">  782</span>         }</div>
+<div class="line"><a name="l00783"></a><span class="lineno">  783</span>         <span class="keywordflow">else</span></div>
+<div class="line"><a name="l00784"></a><span class="lineno">  784</span>           output[y][x]=noDataValue;</div>
+<div class="line"><a name="l00785"></a><span class="lineno">  785</span>       }</div>
+<div class="line"><a name="l00786"></a><span class="lineno">  786</span>     }</div>
+<div class="line"><a name="l00787"></a><span class="lineno">  787</span>     progress=(1.0+y);</div>
+<div class="line"><a name="l00788"></a><span class="lineno">  788</span>     progress/=output.nRows();</div>
+<div class="line"><a name="l00789"></a><span class="lineno">  789</span>     pfnProgress(progress,pszMessage,pProgressArg);</div>
+<div class="line"><a name="l00790"></a><span class="lineno">  790</span>   }</div>
+<div class="line"><a name="l00791"></a><span class="lineno">  791</span>   <span class="keywordflow">return</span> nchange;</div>
+<div class="line"><a name="l00792"></a><span class="lineno">  792</span> }</div>
+<div class="line"><a name="l00793"></a><span class="lineno">  793</span> </div>
+<div class="line"><a name="l00794"></a><span class="lineno">  794</span>  <span class="keyword">template</span><<span class="keyword">class</span> T> <span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> Filter2d::dsm2dtm_nwse(<span class="keyword">const</span> <a class="code" href="classVector2d.html">Vector2d<T></a>& inputDSM, <a class="code" href="classVector2d.html">Vector2d<T></a>& outputMa [...]
+<div class="line"><a name="l00795"></a><span class="lineno">  795</span> {</div>
+<div class="line"><a name="l00796"></a><span class="lineno">  796</span>   <span class="keyword">const</span> <span class="keywordtype">char</span>* pszMessage;</div>
+<div class="line"><a name="l00797"></a><span class="lineno">  797</span>   <span class="keywordtype">void</span>* pProgressArg=NULL;</div>
+<div class="line"><a name="l00798"></a><span class="lineno">  798</span>   GDALProgressFunc pfnProgress=GDALTermProgress;</div>
+<div class="line"><a name="l00799"></a><span class="lineno">  799</span>   <span class="keywordtype">double</span> progress=0;</div>
+<div class="line"><a name="l00800"></a><span class="lineno">  800</span>   pfnProgress(progress,pszMessage,pProgressArg);</div>
+<div class="line"><a name="l00801"></a><span class="lineno">  801</span> </div>
+<div class="line"><a name="l00802"></a><span class="lineno">  802</span>   <a class="code" href="classVector2d.html">Vector2d<T></a> tmpDSM(inputDSM);</div>
+<div class="line"><a name="l00803"></a><span class="lineno">  803</span>   <span class="keywordtype">double</span> noDataValue=0;</div>
+<div class="line"><a name="l00804"></a><span class="lineno">  804</span>   <span class="keywordflow">if</span>(m_noDataValues.size())</div>
+<div class="line"><a name="l00805"></a><span class="lineno">  805</span>     noDataValue=m_noDataValues[0];</div>
+<div class="line"><a name="l00806"></a><span class="lineno">  806</span> </div>
+<div class="line"><a name="l00807"></a><span class="lineno">  807</span>   <span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> nchange=0;</div>
+<div class="line"><a name="l00808"></a><span class="lineno">  808</span>   <span class="keywordtype">int</span> dimX=dim;</div>
+<div class="line"><a name="l00809"></a><span class="lineno">  809</span>   <span class="keywordtype">int</span> dimY=dim;</div>
+<div class="line"><a name="l00810"></a><span class="lineno">  810</span>   assert(dimX);</div>
+<div class="line"><a name="l00811"></a><span class="lineno">  811</span>   assert(dimY);</div>
+<div class="line"><a name="l00812"></a><span class="lineno">  812</span>   <a class="code" href="classstatfactory_1_1StatFactory.html">statfactory::StatFactory</a> stat;</div>
+<div class="line"><a name="l00813"></a><span class="lineno">  813</span>   <a class="code" href="classVector2d.html">Vector2d<T></a> inBuffer(dimY,inputDSM.nCols());</div>
+<div class="line"><a name="l00814"></a><span class="lineno">  814</span>   <span class="keywordflow">if</span>(outputMask.size()!=inputDSM.nRows())</div>
+<div class="line"><a name="l00815"></a><span class="lineno">  815</span>     outputMask.resize(inputDSM.nRows());</div>
+<div class="line"><a name="l00816"></a><span class="lineno">  816</span>   <span class="keywordtype">int</span> indexI=0;</div>
+<div class="line"><a name="l00817"></a><span class="lineno">  817</span>   <span class="keywordtype">int</span> indexJ=0;</div>
+<div class="line"><a name="l00818"></a><span class="lineno">  818</span>   <span class="comment">//initialize last half of inBuffer</span></div>
+<div class="line"><a name="l00819"></a><span class="lineno">  819</span>   <span class="keywordflow">for</span>(<span class="keywordtype">int</span> j=-(dimY-1)/2;j<=dimY/2;++j){</div>
+<div class="line"><a name="l00820"></a><span class="lineno">  820</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> i=0;i<inputDSM.nCols();++i)</div>
+<div class="line"><a name="l00821"></a><span class="lineno">  821</span>       inBuffer[indexJ][i]=tmpDSM[abs(j)][i];</div>
+<div class="line"><a name="l00822"></a><span class="lineno">  822</span>     ++indexJ;</div>
+<div class="line"><a name="l00823"></a><span class="lineno">  823</span>   }</div>
+<div class="line"><a name="l00824"></a><span class="lineno">  824</span>   <span class="keywordflow">for</span>(<span class="keywordtype">int</span> y=0;y<tmpDSM.nRows();++y){</div>
+<div class="line"><a name="l00825"></a><span class="lineno">  825</span>     <span class="keywordflow">if</span>(y){<span class="comment">//inBuffer already initialized for y=0</span></div>
+<div class="line"><a name="l00826"></a><span class="lineno">  826</span>       <span class="comment">//erase first line from inBuffer</span></div>
+<div class="line"><a name="l00827"></a><span class="lineno">  827</span>       inBuffer.erase(inBuffer.begin());</div>
+<div class="line"><a name="l00828"></a><span class="lineno">  828</span>       <span class="comment">//read extra line and push back to inBuffer if not out of bounds</span></div>
+<div class="line"><a name="l00829"></a><span class="lineno">  829</span>       <span class="keywordflow">if</span>(y+dimY/2<tmpDSM.nRows()){</div>
+<div class="line"><a name="l00830"></a><span class="lineno">  830</span>         <span class="comment">//allocate buffer</span></div>
+<div class="line"><a name="l00831"></a><span class="lineno">  831</span>         inBuffer.push_back(inBuffer.back());</div>
+<div class="line"><a name="l00832"></a><span class="lineno">  832</span>         <span class="keywordflow">for</span>(<span class="keywordtype">int</span> i=0;i<tmpDSM.nCols();++i)</div>
+<div class="line"><a name="l00833"></a><span class="lineno">  833</span>           inBuffer[inBuffer.size()-1][i]=tmpDSM[y+dimY/2][i];</div>
+<div class="line"><a name="l00834"></a><span class="lineno">  834</span>       }</div>
+<div class="line"><a name="l00835"></a><span class="lineno">  835</span>       <span class="keywordflow">else</span>{</div>
+<div class="line"><a name="l00836"></a><span class="lineno">  836</span>         <span class="keywordtype">int</span> over=y+dimY/2-tmpDSM.nRows();</div>
+<div class="line"><a name="l00837"></a><span class="lineno">  837</span>         <span class="keywordtype">int</span> index=(inBuffer.size()-1)-over;</div>
+<div class="line"><a name="l00838"></a><span class="lineno">  838</span>         assert(index>=0);</div>
+<div class="line"><a name="l00839"></a><span class="lineno">  839</span>         assert(index<inBuffer.size());</div>
+<div class="line"><a name="l00840"></a><span class="lineno">  840</span>         inBuffer.push_back(inBuffer[index]);</div>
+<div class="line"><a name="l00841"></a><span class="lineno">  841</span>       }</div>
+<div class="line"><a name="l00842"></a><span class="lineno">  842</span>     }</div>
+<div class="line"><a name="l00843"></a><span class="lineno">  843</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> x=0;x<tmpDSM.nCols();++x){</div>
+<div class="line"><a name="l00844"></a><span class="lineno">  844</span>       <span class="keywordtype">double</span> centerValue=inBuffer[(dimY-1)/2][x];</div>
+<div class="line"><a name="l00845"></a><span class="lineno">  845</span>       <span class="keywordtype">short</span> nmasked=0;</div>
+<div class="line"><a name="l00846"></a><span class="lineno">  846</span>       std::vector<T> neighbors;</div>
+<div class="line"><a name="l00847"></a><span class="lineno">  847</span>       <span class="keywordflow">for</span>(<span class="keywordtype">int</span> j=-(dimY-1)/2;j<=dimY/2;++j){</div>
+<div class="line"><a name="l00848"></a><span class="lineno">  848</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> i=-(dimX-1)/2;i<=dimX/2;++i){</div>
+<div class="line"><a name="l00849"></a><span class="lineno">  849</span>       indexI=x+i;</div>
+<div class="line"><a name="l00850"></a><span class="lineno">  850</span>       <span class="comment">//check if out of bounds</span></div>
+<div class="line"><a name="l00851"></a><span class="lineno">  851</span>       <span class="keywordflow">if</span>(indexI<0)</div>
+<div class="line"><a name="l00852"></a><span class="lineno">  852</span>         indexI=-indexI;</div>
+<div class="line"><a name="l00853"></a><span class="lineno">  853</span>       <span class="keywordflow">else</span> <span class="keywordflow">if</span>(indexI>=tmpDSM.nCols())</div>
+<div class="line"><a name="l00854"></a><span class="lineno">  854</span>         indexI=tmpDSM.nCols()-i;</div>
+<div class="line"><a name="l00855"></a><span class="lineno">  855</span>       <span class="keywordflow">if</span>(y+j<0)</div>
+<div class="line"><a name="l00856"></a><span class="lineno">  856</span>         indexJ=-j;</div>
+<div class="line"><a name="l00857"></a><span class="lineno">  857</span>       <span class="keywordflow">else</span> <span class="keywordflow">if</span>(y+j>=tmpDSM.nRows())</div>
+<div class="line"><a name="l00858"></a><span class="lineno">  858</span>         indexJ=(dimY>2) ? (dimY-1)/2-j : 0;</div>
+<div class="line"><a name="l00859"></a><span class="lineno">  859</span>       <span class="keywordflow">else</span></div>
+<div class="line"><a name="l00860"></a><span class="lineno">  860</span>         indexJ=(dimY-1)/2+j;</div>
+<div class="line"><a name="l00861"></a><span class="lineno">  861</span>       <span class="keywordtype">double</span> difference=(centerValue-inBuffer[indexJ][indexI]);</div>
+<div class="line"><a name="l00862"></a><span class="lineno">  862</span>       <span class="keywordflow">if</span>(i||j)<span class="comment">//skip centerValue</span></div>
+<div class="line"><a name="l00863"></a><span class="lineno">  863</span>         neighbors.push_back(inBuffer[indexJ][indexI]);</div>
+<div class="line"><a name="l00864"></a><span class="lineno">  864</span>       <span class="keywordflow">if</span>(difference>hThreshold)</div>
+<div class="line"><a name="l00865"></a><span class="lineno">  865</span>         ++nmasked;</div>
+<div class="line"><a name="l00866"></a><span class="lineno">  866</span>     }</div>
+<div class="line"><a name="l00867"></a><span class="lineno">  867</span>       }</div>
+<div class="line"><a name="l00868"></a><span class="lineno">  868</span>       <span class="keywordflow">if</span>(nmasked<=nlimit){</div>
+<div class="line"><a name="l00869"></a><span class="lineno">  869</span>     ++nchange;</div>
+<div class="line"><a name="l00870"></a><span class="lineno">  870</span>     <span class="comment">//reset pixel in outputMask</span></div>
+<div class="line"><a name="l00871"></a><span class="lineno">  871</span>     outputMask[y][x]=0;</div>
+<div class="line"><a name="l00872"></a><span class="lineno">  872</span>       }</div>
+<div class="line"><a name="l00873"></a><span class="lineno">  873</span>       <span class="keywordflow">else</span>{</div>
+<div class="line"><a name="l00874"></a><span class="lineno">  874</span>     <span class="comment">//reset pixel height in tmpDSM</span></div>
+<div class="line"><a name="l00875"></a><span class="lineno">  875</span>     sort(neighbors.begin(),neighbors.end());</div>
+<div class="line"><a name="l00876"></a><span class="lineno">  876</span>     assert(neighbors.size()>1);</div>
+<div class="line"><a name="l00877"></a><span class="lineno">  877</span>     inBuffer[(dimY-1)/2][x]=neighbors[1];</div>
+<div class="line"><a name="l00878"></a><span class="lineno">  878</span>     <span class="comment">/* inBuffer[(dimY-1)/2][x]=stat.mymin(neighbors); */</span></div>
+<div class="line"><a name="l00879"></a><span class="lineno">  879</span>       }</div>
+<div class="line"><a name="l00880"></a><span class="lineno">  880</span>     }</div>
+<div class="line"><a name="l00881"></a><span class="lineno">  881</span>     progress=(1.0+y);</div>
+<div class="line"><a name="l00882"></a><span class="lineno">  882</span>     progress/=outputMask.nRows();</div>
+<div class="line"><a name="l00883"></a><span class="lineno">  883</span>     pfnProgress(progress,pszMessage,pProgressArg);</div>
+<div class="line"><a name="l00884"></a><span class="lineno">  884</span>   }</div>
+<div class="line"><a name="l00885"></a><span class="lineno">  885</span>   <span class="keywordflow">return</span> nchange;</div>
+<div class="line"><a name="l00886"></a><span class="lineno">  886</span> }</div>
+<div class="line"><a name="l00887"></a><span class="lineno">  887</span> </div>
+<div class="line"><a name="l00888"></a><span class="lineno">  888</span>  <span class="keyword">template</span><<span class="keyword">class</span> T> <span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> Filter2d::dsm2dtm_nesw(<span class="keyword">const</span> <a class="code" href="classVector2d.html">Vector2d<T></a>& inputDSM, <a class="code" href="classVector2d.html">Vector2d<T></a>& outputMa [...]
+<div class="line"><a name="l00889"></a><span class="lineno">  889</span> {</div>
+<div class="line"><a name="l00890"></a><span class="lineno">  890</span>   <span class="keyword">const</span> <span class="keywordtype">char</span>* pszMessage;</div>
+<div class="line"><a name="l00891"></a><span class="lineno">  891</span>   <span class="keywordtype">void</span>* pProgressArg=NULL;</div>
+<div class="line"><a name="l00892"></a><span class="lineno">  892</span>   GDALProgressFunc pfnProgress=GDALTermProgress;</div>
+<div class="line"><a name="l00893"></a><span class="lineno">  893</span>   <span class="keywordtype">double</span> progress=0;</div>
+<div class="line"><a name="l00894"></a><span class="lineno">  894</span>   pfnProgress(progress,pszMessage,pProgressArg);</div>
+<div class="line"><a name="l00895"></a><span class="lineno">  895</span> </div>
+<div class="line"><a name="l00896"></a><span class="lineno">  896</span>   <a class="code" href="classVector2d.html">Vector2d<T></a> tmpDSM(inputDSM);</div>
+<div class="line"><a name="l00897"></a><span class="lineno">  897</span>   <span class="keywordtype">double</span> noDataValue=0;</div>
+<div class="line"><a name="l00898"></a><span class="lineno">  898</span>   <span class="keywordflow">if</span>(m_noDataValues.size())</div>
+<div class="line"><a name="l00899"></a><span class="lineno">  899</span>     noDataValue=m_noDataValues[0];</div>
+<div class="line"><a name="l00900"></a><span class="lineno">  900</span> </div>
+<div class="line"><a name="l00901"></a><span class="lineno">  901</span>   <span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> nchange=0;</div>
+<div class="line"><a name="l00902"></a><span class="lineno">  902</span>   <span class="keywordtype">int</span> dimX=dim;</div>
+<div class="line"><a name="l00903"></a><span class="lineno">  903</span>   <span class="keywordtype">int</span> dimY=dim;</div>
+<div class="line"><a name="l00904"></a><span class="lineno">  904</span>   assert(dimX);</div>
+<div class="line"><a name="l00905"></a><span class="lineno">  905</span>   assert(dimY);</div>
+<div class="line"><a name="l00906"></a><span class="lineno">  906</span>   <a class="code" href="classstatfactory_1_1StatFactory.html">statfactory::StatFactory</a> stat;</div>
+<div class="line"><a name="l00907"></a><span class="lineno">  907</span>   <a class="code" href="classVector2d.html">Vector2d<T></a> inBuffer(dimY,inputDSM.nCols());</div>
+<div class="line"><a name="l00908"></a><span class="lineno">  908</span>   <span class="keywordflow">if</span>(outputMask.size()!=inputDSM.nRows())</div>
+<div class="line"><a name="l00909"></a><span class="lineno">  909</span>     outputMask.resize(inputDSM.nRows());</div>
+<div class="line"><a name="l00910"></a><span class="lineno">  910</span>   <span class="keywordtype">int</span> indexI=0;</div>
+<div class="line"><a name="l00911"></a><span class="lineno">  911</span>   <span class="keywordtype">int</span> indexJ=0;</div>
+<div class="line"><a name="l00912"></a><span class="lineno">  912</span>   <span class="comment">//initialize last half of inBuffer</span></div>
+<div class="line"><a name="l00913"></a><span class="lineno">  913</span>   <span class="keywordflow">for</span>(<span class="keywordtype">int</span> j=-(dimY-1)/2;j<=dimY/2;++j){</div>
+<div class="line"><a name="l00914"></a><span class="lineno">  914</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> i=0;i<inputDSM.nCols();++i)</div>
+<div class="line"><a name="l00915"></a><span class="lineno">  915</span>       inBuffer[indexJ][i]=tmpDSM[abs(j)][i];</div>
+<div class="line"><a name="l00916"></a><span class="lineno">  916</span>     ++indexJ;</div>
+<div class="line"><a name="l00917"></a><span class="lineno">  917</span>   }</div>
+<div class="line"><a name="l00918"></a><span class="lineno">  918</span>   <span class="keywordflow">for</span>(<span class="keywordtype">int</span> y=0;y<tmpDSM.nRows();++y){</div>
+<div class="line"><a name="l00919"></a><span class="lineno">  919</span>     <span class="keywordflow">if</span>(y){<span class="comment">//inBuffer already initialized for y=0</span></div>
+<div class="line"><a name="l00920"></a><span class="lineno">  920</span>       <span class="comment">//erase first line from inBuffer</span></div>
+<div class="line"><a name="l00921"></a><span class="lineno">  921</span>       inBuffer.erase(inBuffer.begin());</div>
+<div class="line"><a name="l00922"></a><span class="lineno">  922</span>       <span class="comment">//read extra line and push back to inBuffer if not out of bounds</span></div>
+<div class="line"><a name="l00923"></a><span class="lineno">  923</span>       <span class="keywordflow">if</span>(y+dimY/2<tmpDSM.nRows()){</div>
+<div class="line"><a name="l00924"></a><span class="lineno">  924</span>         <span class="comment">//allocate buffer</span></div>
+<div class="line"><a name="l00925"></a><span class="lineno">  925</span>         inBuffer.push_back(inBuffer.back());</div>
+<div class="line"><a name="l00926"></a><span class="lineno">  926</span>         <span class="keywordflow">for</span>(<span class="keywordtype">int</span> i=0;i<tmpDSM.nCols();++i)</div>
+<div class="line"><a name="l00927"></a><span class="lineno">  927</span>           inBuffer[inBuffer.size()-1][i]=tmpDSM[y+dimY/2][i];</div>
+<div class="line"><a name="l00928"></a><span class="lineno">  928</span>       }</div>
+<div class="line"><a name="l00929"></a><span class="lineno">  929</span>       <span class="keywordflow">else</span>{</div>
+<div class="line"><a name="l00930"></a><span class="lineno">  930</span>         <span class="keywordtype">int</span> over=y+dimY/2-tmpDSM.nRows();</div>
+<div class="line"><a name="l00931"></a><span class="lineno">  931</span>         <span class="keywordtype">int</span> index=(inBuffer.size()-1)-over;</div>
+<div class="line"><a name="l00932"></a><span class="lineno">  932</span>         assert(index>=0);</div>
+<div class="line"><a name="l00933"></a><span class="lineno">  933</span>         assert(index<inBuffer.size());</div>
+<div class="line"><a name="l00934"></a><span class="lineno">  934</span>         inBuffer.push_back(inBuffer[index]);</div>
+<div class="line"><a name="l00935"></a><span class="lineno">  935</span>       }</div>
+<div class="line"><a name="l00936"></a><span class="lineno">  936</span>     }</div>
+<div class="line"><a name="l00937"></a><span class="lineno">  937</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> x=tmpDSM.nCols()-1;x>=0;--x){</div>
+<div class="line"><a name="l00938"></a><span class="lineno">  938</span>       <span class="keywordtype">double</span> centerValue=inBuffer[(dimY-1)/2][x];</div>
+<div class="line"><a name="l00939"></a><span class="lineno">  939</span>       <span class="keywordtype">short</span> nmasked=0;</div>
+<div class="line"><a name="l00940"></a><span class="lineno">  940</span>       std::vector<T> neighbors;</div>
+<div class="line"><a name="l00941"></a><span class="lineno">  941</span>       <span class="keywordflow">for</span>(<span class="keywordtype">int</span> j=-(dimY-1)/2;j<=dimY/2;++j){</div>
+<div class="line"><a name="l00942"></a><span class="lineno">  942</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> i=-(dimX-1)/2;i<=dimX/2;++i){</div>
+<div class="line"><a name="l00943"></a><span class="lineno">  943</span>       indexI=x+i;</div>
+<div class="line"><a name="l00944"></a><span class="lineno">  944</span>       <span class="comment">//check if out of bounds</span></div>
+<div class="line"><a name="l00945"></a><span class="lineno">  945</span>       <span class="keywordflow">if</span>(indexI<0)</div>
+<div class="line"><a name="l00946"></a><span class="lineno">  946</span>         indexI=-indexI;</div>
+<div class="line"><a name="l00947"></a><span class="lineno">  947</span>       <span class="keywordflow">else</span> <span class="keywordflow">if</span>(indexI>=tmpDSM.nCols())</div>
+<div class="line"><a name="l00948"></a><span class="lineno">  948</span>         indexI=tmpDSM.nCols()-i;</div>
+<div class="line"><a name="l00949"></a><span class="lineno">  949</span>       <span class="keywordflow">if</span>(y+j<0)</div>
+<div class="line"><a name="l00950"></a><span class="lineno">  950</span>         indexJ=-j;</div>
+<div class="line"><a name="l00951"></a><span class="lineno">  951</span>       <span class="keywordflow">else</span> <span class="keywordflow">if</span>(y+j>=tmpDSM.nRows())</div>
+<div class="line"><a name="l00952"></a><span class="lineno">  952</span>         indexJ=(dimY>2) ? (dimY-1)/2-j : 0;</div>
+<div class="line"><a name="l00953"></a><span class="lineno">  953</span>       <span class="keywordflow">else</span></div>
+<div class="line"><a name="l00954"></a><span class="lineno">  954</span>         indexJ=(dimY-1)/2+j;</div>
+<div class="line"><a name="l00955"></a><span class="lineno">  955</span>       <span class="keywordtype">double</span> difference=(centerValue-inBuffer[indexJ][indexI]);</div>
+<div class="line"><a name="l00956"></a><span class="lineno">  956</span>       <span class="keywordflow">if</span>(i||j)<span class="comment">//skip centerValue</span></div>
+<div class="line"><a name="l00957"></a><span class="lineno">  957</span>         neighbors.push_back(inBuffer[indexJ][indexI]);</div>
+<div class="line"><a name="l00958"></a><span class="lineno">  958</span>       <span class="keywordflow">if</span>(difference>hThreshold)</div>
+<div class="line"><a name="l00959"></a><span class="lineno">  959</span>         ++nmasked;</div>
+<div class="line"><a name="l00960"></a><span class="lineno">  960</span>     }</div>
+<div class="line"><a name="l00961"></a><span class="lineno">  961</span>       }</div>
+<div class="line"><a name="l00962"></a><span class="lineno">  962</span>       <span class="keywordflow">if</span>(nmasked<=nlimit){</div>
+<div class="line"><a name="l00963"></a><span class="lineno">  963</span>     ++nchange;</div>
+<div class="line"><a name="l00964"></a><span class="lineno">  964</span>     <span class="comment">//reset pixel in outputMask</span></div>
+<div class="line"><a name="l00965"></a><span class="lineno">  965</span>     outputMask[y][x]=0;</div>
+<div class="line"><a name="l00966"></a><span class="lineno">  966</span>       }</div>
+<div class="line"><a name="l00967"></a><span class="lineno">  967</span>       <span class="keywordflow">else</span>{</div>
+<div class="line"><a name="l00968"></a><span class="lineno">  968</span>     <span class="comment">//reset pixel height in tmpDSM</span></div>
+<div class="line"><a name="l00969"></a><span class="lineno">  969</span>     sort(neighbors.begin(),neighbors.end());</div>
+<div class="line"><a name="l00970"></a><span class="lineno">  970</span>     assert(neighbors.size()>1);</div>
+<div class="line"><a name="l00971"></a><span class="lineno">  971</span>     inBuffer[(dimY-1)/2][x]=neighbors[1];</div>
+<div class="line"><a name="l00972"></a><span class="lineno">  972</span>     <span class="comment">/* inBuffer[(dimY-1)/2][x]=stat.mymin(neighbors); */</span></div>
+<div class="line"><a name="l00973"></a><span class="lineno">  973</span>       }</div>
+<div class="line"><a name="l00974"></a><span class="lineno">  974</span>     }</div>
+<div class="line"><a name="l00975"></a><span class="lineno">  975</span>     progress=(1.0+y);</div>
+<div class="line"><a name="l00976"></a><span class="lineno">  976</span>     progress/=outputMask.nRows();</div>
+<div class="line"><a name="l00977"></a><span class="lineno">  977</span>     pfnProgress(progress,pszMessage,pProgressArg);</div>
+<div class="line"><a name="l00978"></a><span class="lineno">  978</span>   }</div>
+<div class="line"><a name="l00979"></a><span class="lineno">  979</span>   <span class="keywordflow">return</span> nchange;</div>
+<div class="line"><a name="l00980"></a><span class="lineno">  980</span> }</div>
+<div class="line"><a name="l00981"></a><span class="lineno">  981</span> </div>
+<div class="line"><a name="l00982"></a><span class="lineno">  982</span>  <span class="keyword">template</span><<span class="keyword">class</span> T> <span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> Filter2d::dsm2dtm_senw(<span class="keyword">const</span> <a class="code" href="classVector2d.html">Vector2d<T></a>& inputDSM, <a class="code" href="classVector2d.html">Vector2d<T></a>& outputMa [...]
+<div class="line"><a name="l00983"></a><span class="lineno">  983</span> {</div>
+<div class="line"><a name="l00984"></a><span class="lineno">  984</span>   <span class="keyword">const</span> <span class="keywordtype">char</span>* pszMessage;</div>
+<div class="line"><a name="l00985"></a><span class="lineno">  985</span>   <span class="keywordtype">void</span>* pProgressArg=NULL;</div>
+<div class="line"><a name="l00986"></a><span class="lineno">  986</span>   GDALProgressFunc pfnProgress=GDALTermProgress;</div>
+<div class="line"><a name="l00987"></a><span class="lineno">  987</span>   <span class="keywordtype">double</span> progress=0;</div>
+<div class="line"><a name="l00988"></a><span class="lineno">  988</span>   pfnProgress(progress,pszMessage,pProgressArg);</div>
+<div class="line"><a name="l00989"></a><span class="lineno">  989</span> </div>
+<div class="line"><a name="l00990"></a><span class="lineno">  990</span>   <a class="code" href="classVector2d.html">Vector2d<T></a> tmpDSM(inputDSM);</div>
+<div class="line"><a name="l00991"></a><span class="lineno">  991</span>   <span class="keywordtype">double</span> noDataValue=0;</div>
+<div class="line"><a name="l00992"></a><span class="lineno">  992</span>   <span class="keywordflow">if</span>(m_noDataValues.size())</div>
+<div class="line"><a name="l00993"></a><span class="lineno">  993</span>     noDataValue=m_noDataValues[0];</div>
+<div class="line"><a name="l00994"></a><span class="lineno">  994</span> </div>
+<div class="line"><a name="l00995"></a><span class="lineno">  995</span>   <span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> nchange=0;</div>
+<div class="line"><a name="l00996"></a><span class="lineno">  996</span>   <span class="keywordtype">int</span> dimX=dim;</div>
+<div class="line"><a name="l00997"></a><span class="lineno">  997</span>   <span class="keywordtype">int</span> dimY=dim;</div>
+<div class="line"><a name="l00998"></a><span class="lineno">  998</span>   assert(dimX);</div>
+<div class="line"><a name="l00999"></a><span class="lineno">  999</span>   assert(dimY);</div>
+<div class="line"><a name="l01000"></a><span class="lineno"> 1000</span>   <a class="code" href="classstatfactory_1_1StatFactory.html">statfactory::StatFactory</a> stat;</div>
+<div class="line"><a name="l01001"></a><span class="lineno"> 1001</span>   <a class="code" href="classVector2d.html">Vector2d<T></a> inBuffer(dimY,inputDSM.nCols());</div>
+<div class="line"><a name="l01002"></a><span class="lineno"> 1002</span>   <span class="keywordflow">if</span>(outputMask.size()!=inputDSM.nRows())</div>
+<div class="line"><a name="l01003"></a><span class="lineno"> 1003</span>     outputMask.resize(inputDSM.nRows());</div>
+<div class="line"><a name="l01004"></a><span class="lineno"> 1004</span>   <span class="keywordtype">int</span> indexI=0;</div>
+<div class="line"><a name="l01005"></a><span class="lineno"> 1005</span>   <span class="keywordtype">int</span> indexJ=inputDSM.nRows()-1;</div>
+<div class="line"><a name="l01006"></a><span class="lineno"> 1006</span>   <span class="comment">//initialize first half of inBuffer</span></div>
+<div class="line"><a name="l01007"></a><span class="lineno"> 1007</span>   <span class="keywordflow">for</span>(<span class="keywordtype">int</span> j=inputDSM.nRows()-dimY/2;j<inputDSM.nRows();--j){</div>
+<div class="line"><a name="l01008"></a><span class="lineno"> 1008</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> i=0;i<inputDSM.nCols();++i)</div>
+<div class="line"><a name="l01009"></a><span class="lineno"> 1009</span>       inBuffer[indexJ][i]=tmpDSM[abs(j)][i];</div>
+<div class="line"><a name="l01010"></a><span class="lineno"> 1010</span>     ++indexJ;</div>
+<div class="line"><a name="l01011"></a><span class="lineno"> 1011</span>   }</div>
+<div class="line"><a name="l01012"></a><span class="lineno"> 1012</span>   <span class="keywordflow">for</span>(<span class="keywordtype">int</span> y=tmpDSM.nRows()-1;y>=0;--y){</div>
+<div class="line"><a name="l01013"></a><span class="lineno"> 1013</span>     <span class="keywordflow">if</span>(y<tmpDSM.nRows()-1){<span class="comment">//inBuffer already initialized for y=tmpDSM.nRows()-1</span></div>
+<div class="line"><a name="l01014"></a><span class="lineno"> 1014</span>       <span class="comment">//erase last line from inBuffer</span></div>
+<div class="line"><a name="l01015"></a><span class="lineno"> 1015</span>       inBuffer.erase(inBuffer.end()-1);</div>
+<div class="line"><a name="l01016"></a><span class="lineno"> 1016</span>       <span class="comment">//read extra line and insert to inBuffer if not out of bounds</span></div>
+<div class="line"><a name="l01017"></a><span class="lineno"> 1017</span>       <span class="keywordflow">if</span>(y-dimY/2>0){</div>
+<div class="line"><a name="l01018"></a><span class="lineno"> 1018</span>         <span class="comment">//allocate buffer</span></div>
+<div class="line"><a name="l01019"></a><span class="lineno"> 1019</span>         inBuffer.insert(inBuffer.begin(),inBuffer.back());</div>
+<div class="line"><a name="l01020"></a><span class="lineno"> 1020</span>         <span class="keywordflow">for</span>(<span class="keywordtype">int</span> i=0;i<tmpDSM.nCols();++i)</div>
+<div class="line"><a name="l01021"></a><span class="lineno"> 1021</span>           inBuffer[0][i]=tmpDSM[y-dimY/2][i];</div>
+<div class="line"><a name="l01022"></a><span class="lineno"> 1022</span>       }</div>
+<div class="line"><a name="l01023"></a><span class="lineno"> 1023</span>       <span class="keywordflow">else</span>{</div>
+<div class="line"><a name="l01024"></a><span class="lineno"> 1024</span>         inBuffer.insert(inBuffer.begin(),inBuffer[abs(y-dimY/2)]);</div>
+<div class="line"><a name="l01025"></a><span class="lineno"> 1025</span>       }</div>
+<div class="line"><a name="l01026"></a><span class="lineno"> 1026</span>     }</div>
+<div class="line"><a name="l01027"></a><span class="lineno"> 1027</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> x=tmpDSM.nCols()-1;x>=0;--x){</div>
+<div class="line"><a name="l01028"></a><span class="lineno"> 1028</span>       <span class="keywordtype">double</span> centerValue=inBuffer[(dimY-1)/2][x];</div>
+<div class="line"><a name="l01029"></a><span class="lineno"> 1029</span>       <span class="keywordtype">short</span> nmasked=0;</div>
+<div class="line"><a name="l01030"></a><span class="lineno"> 1030</span>       std::vector<T> neighbors;</div>
+<div class="line"><a name="l01031"></a><span class="lineno"> 1031</span>       <span class="keywordflow">for</span>(<span class="keywordtype">int</span> j=-(dimY-1)/2;j<=dimY/2;++j){</div>
+<div class="line"><a name="l01032"></a><span class="lineno"> 1032</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> i=-(dimX-1)/2;i<=dimX/2;++i){</div>
+<div class="line"><a name="l01033"></a><span class="lineno"> 1033</span>       indexI=x+i;</div>
+<div class="line"><a name="l01034"></a><span class="lineno"> 1034</span>       <span class="comment">//check if out of bounds</span></div>
+<div class="line"><a name="l01035"></a><span class="lineno"> 1035</span>       <span class="keywordflow">if</span>(indexI<0)</div>
+<div class="line"><a name="l01036"></a><span class="lineno"> 1036</span>         indexI=-indexI;</div>
+<div class="line"><a name="l01037"></a><span class="lineno"> 1037</span>       <span class="keywordflow">else</span> <span class="keywordflow">if</span>(indexI>=tmpDSM.nCols())</div>
+<div class="line"><a name="l01038"></a><span class="lineno"> 1038</span>         indexI=tmpDSM.nCols()-i;</div>
+<div class="line"><a name="l01039"></a><span class="lineno"> 1039</span>       <span class="keywordflow">if</span>(y+j<0)</div>
+<div class="line"><a name="l01040"></a><span class="lineno"> 1040</span>         indexJ=-j;</div>
+<div class="line"><a name="l01041"></a><span class="lineno"> 1041</span>       <span class="keywordflow">else</span> <span class="keywordflow">if</span>(y+j>=tmpDSM.nRows())</div>
+<div class="line"><a name="l01042"></a><span class="lineno"> 1042</span>         indexJ=(dimY>2) ? (dimY-1)/2-j : 0;</div>
+<div class="line"><a name="l01043"></a><span class="lineno"> 1043</span>       <span class="keywordflow">else</span></div>
+<div class="line"><a name="l01044"></a><span class="lineno"> 1044</span>         indexJ=(dimY-1)/2+j;</div>
+<div class="line"><a name="l01045"></a><span class="lineno"> 1045</span>       <span class="keywordtype">double</span> difference=(centerValue-inBuffer[indexJ][indexI]);</div>
+<div class="line"><a name="l01046"></a><span class="lineno"> 1046</span>       <span class="keywordflow">if</span>(i||j)<span class="comment">//skip centerValue</span></div>
+<div class="line"><a name="l01047"></a><span class="lineno"> 1047</span>         neighbors.push_back(inBuffer[indexJ][indexI]);</div>
+<div class="line"><a name="l01048"></a><span class="lineno"> 1048</span>       <span class="keywordflow">if</span>(difference>hThreshold)</div>
+<div class="line"><a name="l01049"></a><span class="lineno"> 1049</span>         ++nmasked;</div>
+<div class="line"><a name="l01050"></a><span class="lineno"> 1050</span>     }</div>
+<div class="line"><a name="l01051"></a><span class="lineno"> 1051</span>       }</div>
+<div class="line"><a name="l01052"></a><span class="lineno"> 1052</span>       <span class="keywordflow">if</span>(nmasked<=nlimit){</div>
+<div class="line"><a name="l01053"></a><span class="lineno"> 1053</span>     ++nchange;</div>
+<div class="line"><a name="l01054"></a><span class="lineno"> 1054</span>     <span class="comment">//reset pixel in outputMask</span></div>
+<div class="line"><a name="l01055"></a><span class="lineno"> 1055</span>     outputMask[y][x]=0;</div>
+<div class="line"><a name="l01056"></a><span class="lineno"> 1056</span>       }</div>
+<div class="line"><a name="l01057"></a><span class="lineno"> 1057</span>       <span class="keywordflow">else</span>{</div>
+<div class="line"><a name="l01058"></a><span class="lineno"> 1058</span>     <span class="comment">//reset pixel height in tmpDSM</span></div>
+<div class="line"><a name="l01059"></a><span class="lineno"> 1059</span>     sort(neighbors.begin(),neighbors.end());</div>
+<div class="line"><a name="l01060"></a><span class="lineno"> 1060</span>     assert(neighbors.size()>1);</div>
+<div class="line"><a name="l01061"></a><span class="lineno"> 1061</span>     inBuffer[(dimY-1)/2][x]=neighbors[1];</div>
+<div class="line"><a name="l01062"></a><span class="lineno"> 1062</span>     <span class="comment">/* inBuffer[(dimY-1)/2][x]=stat.mymin(neighbors); */</span></div>
+<div class="line"><a name="l01063"></a><span class="lineno"> 1063</span>       }</div>
+<div class="line"><a name="l01064"></a><span class="lineno"> 1064</span>     }</div>
+<div class="line"><a name="l01065"></a><span class="lineno"> 1065</span>     progress=(1.0+y);</div>
+<div class="line"><a name="l01066"></a><span class="lineno"> 1066</span>     progress/=outputMask.nRows();</div>
+<div class="line"><a name="l01067"></a><span class="lineno"> 1067</span>     pfnProgress(progress,pszMessage,pProgressArg);</div>
+<div class="line"><a name="l01068"></a><span class="lineno"> 1068</span>   }</div>
+<div class="line"><a name="l01069"></a><span class="lineno"> 1069</span>   <span class="keywordflow">return</span> nchange;</div>
+<div class="line"><a name="l01070"></a><span class="lineno"> 1070</span> }</div>
+<div class="line"><a name="l01071"></a><span class="lineno"> 1071</span> </div>
+<div class="line"><a name="l01072"></a><span class="lineno"> 1072</span>  <span class="keyword">template</span><<span class="keyword">class</span> T> <span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> Filter2d::dsm2dtm_swne(<span class="keyword">const</span> <a class="code" href="classVector2d.html">Vector2d<T></a>& inputDSM, <a class="code" href="classVector2d.html">Vector2d<T></a>& outputMa [...]
+<div class="line"><a name="l01073"></a><span class="lineno"> 1073</span> {</div>
+<div class="line"><a name="l01074"></a><span class="lineno"> 1074</span>   <span class="keyword">const</span> <span class="keywordtype">char</span>* pszMessage;</div>
+<div class="line"><a name="l01075"></a><span class="lineno"> 1075</span>   <span class="keywordtype">void</span>* pProgressArg=NULL;</div>
+<div class="line"><a name="l01076"></a><span class="lineno"> 1076</span>   GDALProgressFunc pfnProgress=GDALTermProgress;</div>
+<div class="line"><a name="l01077"></a><span class="lineno"> 1077</span>   <span class="keywordtype">double</span> progress=0;</div>
+<div class="line"><a name="l01078"></a><span class="lineno"> 1078</span>   pfnProgress(progress,pszMessage,pProgressArg);</div>
+<div class="line"><a name="l01079"></a><span class="lineno"> 1079</span> </div>
+<div class="line"><a name="l01080"></a><span class="lineno"> 1080</span>   <a class="code" href="classVector2d.html">Vector2d<T></a> tmpDSM(inputDSM);</div>
+<div class="line"><a name="l01081"></a><span class="lineno"> 1081</span>   <span class="keywordtype">double</span> noDataValue=0;</div>
+<div class="line"><a name="l01082"></a><span class="lineno"> 1082</span>   <span class="keywordflow">if</span>(m_noDataValues.size())</div>
+<div class="line"><a name="l01083"></a><span class="lineno"> 1083</span>     noDataValue=m_noDataValues[0];</div>
+<div class="line"><a name="l01084"></a><span class="lineno"> 1084</span> </div>
+<div class="line"><a name="l01085"></a><span class="lineno"> 1085</span>   <span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> nchange=0;</div>
+<div class="line"><a name="l01086"></a><span class="lineno"> 1086</span>   <span class="keywordtype">int</span> dimX=dim;</div>
+<div class="line"><a name="l01087"></a><span class="lineno"> 1087</span>   <span class="keywordtype">int</span> dimY=dim;</div>
+<div class="line"><a name="l01088"></a><span class="lineno"> 1088</span>   assert(dimX);</div>
+<div class="line"><a name="l01089"></a><span class="lineno"> 1089</span>   assert(dimY);</div>
+<div class="line"><a name="l01090"></a><span class="lineno"> 1090</span>   <a class="code" href="classstatfactory_1_1StatFactory.html">statfactory::StatFactory</a> stat;</div>
+<div class="line"><a name="l01091"></a><span class="lineno"> 1091</span>   <a class="code" href="classVector2d.html">Vector2d<T></a> inBuffer(dimY,inputDSM.nCols());</div>
+<div class="line"><a name="l01092"></a><span class="lineno"> 1092</span>   <span class="keywordflow">if</span>(outputMask.size()!=inputDSM.nRows())</div>
+<div class="line"><a name="l01093"></a><span class="lineno"> 1093</span>     outputMask.resize(inputDSM.nRows());</div>
+<div class="line"><a name="l01094"></a><span class="lineno"> 1094</span>   <span class="keywordtype">int</span> indexI=0;</div>
+<div class="line"><a name="l01095"></a><span class="lineno"> 1095</span>   <span class="keywordtype">int</span> indexJ=0;</div>
+<div class="line"><a name="l01096"></a><span class="lineno"> 1096</span>   <span class="comment">//initialize first half of inBuffer</span></div>
+<div class="line"><a name="l01097"></a><span class="lineno"> 1097</span>   <span class="keywordflow">for</span>(<span class="keywordtype">int</span> j=inputDSM.nRows()-dimY/2;j<inputDSM.nRows();--j){</div>
+<div class="line"><a name="l01098"></a><span class="lineno"> 1098</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> i=0;i<inputDSM.nCols();++i)</div>
+<div class="line"><a name="l01099"></a><span class="lineno"> 1099</span>       inBuffer[indexJ][i]=tmpDSM[abs(j)][i];</div>
+<div class="line"><a name="l01100"></a><span class="lineno"> 1100</span>     ++indexJ;</div>
+<div class="line"><a name="l01101"></a><span class="lineno"> 1101</span>   }</div>
+<div class="line"><a name="l01102"></a><span class="lineno"> 1102</span>   <span class="keywordflow">for</span>(<span class="keywordtype">int</span> y=tmpDSM.nRows()-1;y>=0;--y){</div>
+<div class="line"><a name="l01103"></a><span class="lineno"> 1103</span>     <span class="keywordflow">if</span>(y<tmpDSM.nRows()-1){<span class="comment">//inBuffer already initialized for y=0</span></div>
+<div class="line"><a name="l01104"></a><span class="lineno"> 1104</span>       <span class="comment">//erase last line from inBuffer</span></div>
+<div class="line"><a name="l01105"></a><span class="lineno"> 1105</span>       inBuffer.erase(inBuffer.end()-1);</div>
+<div class="line"><a name="l01106"></a><span class="lineno"> 1106</span>       <span class="comment">//read extra line and insert to inBuffer if not out of bounds</span></div>
+<div class="line"><a name="l01107"></a><span class="lineno"> 1107</span>       <span class="keywordflow">if</span>(y-dimY/2>0){</div>
+<div class="line"><a name="l01108"></a><span class="lineno"> 1108</span>         <span class="comment">//allocate buffer</span></div>
+<div class="line"><a name="l01109"></a><span class="lineno"> 1109</span>         inBuffer.insert(inBuffer.begin(),inBuffer.back());</div>
+<div class="line"><a name="l01110"></a><span class="lineno"> 1110</span>         <span class="keywordflow">for</span>(<span class="keywordtype">int</span> i=0;i<tmpDSM.nCols();++i)</div>
+<div class="line"><a name="l01111"></a><span class="lineno"> 1111</span>           inBuffer[0][i]=tmpDSM[y-dimY/2][i];</div>
+<div class="line"><a name="l01112"></a><span class="lineno"> 1112</span>       }</div>
+<div class="line"><a name="l01113"></a><span class="lineno"> 1113</span>       <span class="keywordflow">else</span>{</div>
+<div class="line"><a name="l01114"></a><span class="lineno"> 1114</span>         inBuffer.insert(inBuffer.begin(),inBuffer[abs(y-dimY/2)]);</div>
+<div class="line"><a name="l01115"></a><span class="lineno"> 1115</span>       }</div>
+<div class="line"><a name="l01116"></a><span class="lineno"> 1116</span>     }</div>
+<div class="line"><a name="l01117"></a><span class="lineno"> 1117</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> x=0;x<tmpDSM.nCols();++x){</div>
+<div class="line"><a name="l01118"></a><span class="lineno"> 1118</span>       <span class="keywordtype">double</span> centerValue=inBuffer[(dimY-1)/2][x];</div>
+<div class="line"><a name="l01119"></a><span class="lineno"> 1119</span>       <span class="keywordtype">short</span> nmasked=0;</div>
+<div class="line"><a name="l01120"></a><span class="lineno"> 1120</span>       std::vector<T> neighbors;</div>
+<div class="line"><a name="l01121"></a><span class="lineno"> 1121</span>       <span class="keywordflow">for</span>(<span class="keywordtype">int</span> j=-(dimY-1)/2;j<=dimY/2;++j){</div>
+<div class="line"><a name="l01122"></a><span class="lineno"> 1122</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> i=-(dimX-1)/2;i<=dimX/2;++i){</div>
+<div class="line"><a name="l01123"></a><span class="lineno"> 1123</span>       indexI=x+i;</div>
+<div class="line"><a name="l01124"></a><span class="lineno"> 1124</span>       <span class="comment">//check if out of bounds</span></div>
+<div class="line"><a name="l01125"></a><span class="lineno"> 1125</span>       <span class="keywordflow">if</span>(indexI<0)</div>
+<div class="line"><a name="l01126"></a><span class="lineno"> 1126</span>         indexI=-indexI;</div>
+<div class="line"><a name="l01127"></a><span class="lineno"> 1127</span>       <span class="keywordflow">else</span> <span class="keywordflow">if</span>(indexI>=tmpDSM.nCols())</div>
+<div class="line"><a name="l01128"></a><span class="lineno"> 1128</span>         indexI=tmpDSM.nCols()-i;</div>
+<div class="line"><a name="l01129"></a><span class="lineno"> 1129</span>       <span class="keywordflow">if</span>(y+j<0)</div>
+<div class="line"><a name="l01130"></a><span class="lineno"> 1130</span>         indexJ=-j;</div>
+<div class="line"><a name="l01131"></a><span class="lineno"> 1131</span>       <span class="keywordflow">else</span> <span class="keywordflow">if</span>(y+j>=tmpDSM.nRows())</div>
+<div class="line"><a name="l01132"></a><span class="lineno"> 1132</span>         indexJ=(dimY>2) ? (dimY-1)/2-j : 0;</div>
+<div class="line"><a name="l01133"></a><span class="lineno"> 1133</span>       <span class="keywordflow">else</span></div>
+<div class="line"><a name="l01134"></a><span class="lineno"> 1134</span>         indexJ=(dimY-1)/2+j;</div>
+<div class="line"><a name="l01135"></a><span class="lineno"> 1135</span>       <span class="keywordtype">double</span> difference=(centerValue-inBuffer[indexJ][indexI]);</div>
+<div class="line"><a name="l01136"></a><span class="lineno"> 1136</span>       <span class="keywordflow">if</span>(i||j)<span class="comment">//skip centerValue</span></div>
+<div class="line"><a name="l01137"></a><span class="lineno"> 1137</span>         neighbors.push_back(inBuffer[indexJ][indexI]);</div>
+<div class="line"><a name="l01138"></a><span class="lineno"> 1138</span>       <span class="keywordflow">if</span>(difference>hThreshold)</div>
+<div class="line"><a name="l01139"></a><span class="lineno"> 1139</span>         ++nmasked;</div>
+<div class="line"><a name="l01140"></a><span class="lineno"> 1140</span>     }</div>
+<div class="line"><a name="l01141"></a><span class="lineno"> 1141</span>       }</div>
+<div class="line"><a name="l01142"></a><span class="lineno"> 1142</span>       <span class="keywordflow">if</span>(nmasked<=nlimit){</div>
+<div class="line"><a name="l01143"></a><span class="lineno"> 1143</span>     ++nchange;</div>
+<div class="line"><a name="l01144"></a><span class="lineno"> 1144</span>     <span class="comment">//reset pixel in outputMask</span></div>
+<div class="line"><a name="l01145"></a><span class="lineno"> 1145</span>     outputMask[y][x]=0;</div>
+<div class="line"><a name="l01146"></a><span class="lineno"> 1146</span>       }</div>
+<div class="line"><a name="l01147"></a><span class="lineno"> 1147</span>       <span class="keywordflow">else</span>{</div>
+<div class="line"><a name="l01148"></a><span class="lineno"> 1148</span>     <span class="comment">//reset pixel height in tmpDSM</span></div>
+<div class="line"><a name="l01149"></a><span class="lineno"> 1149</span>     sort(neighbors.begin(),neighbors.end());</div>
+<div class="line"><a name="l01150"></a><span class="lineno"> 1150</span>     assert(neighbors.size()>1);</div>
+<div class="line"><a name="l01151"></a><span class="lineno"> 1151</span>     inBuffer[(dimY-1)/2][x]=neighbors[1];</div>
+<div class="line"><a name="l01152"></a><span class="lineno"> 1152</span>     <span class="comment">/* inBuffer[(dimY-1)/2][x]=stat.mymin(neighbors); */</span></div>
+<div class="line"><a name="l01153"></a><span class="lineno"> 1153</span>       }</div>
+<div class="line"><a name="l01154"></a><span class="lineno"> 1154</span>     }</div>
+<div class="line"><a name="l01155"></a><span class="lineno"> 1155</span>     progress=(1.0+y);</div>
+<div class="line"><a name="l01156"></a><span class="lineno"> 1156</span>     progress/=outputMask.nRows();</div>
+<div class="line"><a name="l01157"></a><span class="lineno"> 1157</span>     pfnProgress(progress,pszMessage,pProgressArg);</div>
+<div class="line"><a name="l01158"></a><span class="lineno"> 1158</span>   }</div>
+<div class="line"><a name="l01159"></a><span class="lineno"> 1159</span>   <span class="keywordflow">return</span> nchange;</div>
+<div class="line"><a name="l01160"></a><span class="lineno"> 1160</span> }</div>
+<div class="line"><a name="l01161"></a><span class="lineno"> 1161</span> </div>
+<div class="line"><a name="l01162"></a><span class="lineno"> 1162</span>   <span class="keyword">template</span><<span class="keyword">class</span> T> <span class="keywordtype">void</span> Filter2d::shadowDsm(<span class="keyword">const</span> <a class="code" href="classVector2d.html">Vector2d<T></a>& input, <a class="code" href="classVector2d.html">Vector2d<T></a>& output, <span class="keywordtype">double</span> sza, <span class="keywordtype">double</span> [...]
+<div class="line"><a name="l01163"></a><span class="lineno"> 1163</span> {</div>
+<div class="line"><a name="l01164"></a><span class="lineno"> 1164</span>   <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> ncols=input.nCols();</div>
+<div class="line"><a name="l01165"></a><span class="lineno"> 1165</span>   output.clear();</div>
+<div class="line"><a name="l01166"></a><span class="lineno"> 1166</span>   output.resize(input.nRows(),ncols);</div>
+<div class="line"><a name="l01167"></a><span class="lineno"> 1167</span>   <span class="comment">//do we need to initialize output?</span></div>
+<div class="line"><a name="l01168"></a><span class="lineno"> 1168</span>   <span class="comment">// for(int y=0;y<output.nRows();++y)</span></div>
+<div class="line"><a name="l01169"></a><span class="lineno"> 1169</span>   <span class="comment">//   for(int x=0;x<output.nCols();++x)</span></div>
+<div class="line"><a name="l01170"></a><span class="lineno"> 1170</span>   <span class="comment">//     output[y][x]=0;</span></div>
+<div class="line"><a name="l01171"></a><span class="lineno"> 1171</span>   <span class="keywordtype">int</span> indexI=0;</div>
+<div class="line"><a name="l01172"></a><span class="lineno"> 1172</span>   <span class="keywordtype">int</span> indexJ=0;</div>
+<div class="line"><a name="l01173"></a><span class="lineno"> 1173</span>   <span class="keyword">const</span> <span class="keywordtype">char</span>* pszMessage;</div>
+<div class="line"><a name="l01174"></a><span class="lineno"> 1174</span>   <span class="keywordtype">void</span>* pProgressArg=NULL;</div>
+<div class="line"><a name="l01175"></a><span class="lineno"> 1175</span>   GDALProgressFunc pfnProgress=GDALTermProgress;</div>
+<div class="line"><a name="l01176"></a><span class="lineno"> 1176</span>   <span class="keywordtype">double</span> progress=0;</div>
+<div class="line"><a name="l01177"></a><span class="lineno"> 1177</span>   pfnProgress(progress,pszMessage,pProgressArg);</div>
+<div class="line"><a name="l01178"></a><span class="lineno"> 1178</span>   <span class="keywordflow">for</span>(<span class="keywordtype">int</span> y=0;y<input.nRows();++y){</div>
+<div class="line"><a name="l01179"></a><span class="lineno"> 1179</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> x=0;x<input.nCols();++x){</div>
+<div class="line"><a name="l01180"></a><span class="lineno"> 1180</span>       <span class="keywordtype">double</span> currentValue=input[y][x];</div>
+<div class="line"><a name="l01181"></a><span class="lineno"> 1181</span>       <span class="keywordtype">int</span> theDist=<span class="keyword">static_cast<</span><span class="keywordtype">int</span><span class="keyword">></span>(sqrt((currentValue*tan(DEG2RAD(sza))/pixelSize)*(currentValue*tan(DEG2RAD(sza))/pixelSize)));<span class="comment">//in pixels</span></div>
+<div class="line"><a name="l01182"></a><span class="lineno"> 1182</span>       <span class="keywordtype">double</span> theDir=DEG2RAD(saa)+PI/2.0;</div>
+<div class="line"><a name="l01183"></a><span class="lineno"> 1183</span>       <span class="keywordflow">if</span>(theDir<0)</div>
+<div class="line"><a name="l01184"></a><span class="lineno"> 1184</span>         theDir+=2*PI;</div>
+<div class="line"><a name="l01185"></a><span class="lineno"> 1185</span>       <span class="keywordflow">for</span>(<span class="keywordtype">int</span> d=0;d<theDist;++d){<span class="comment">//d in pixels</span></div>
+<div class="line"><a name="l01186"></a><span class="lineno"> 1186</span>         indexI=x+d*cos(theDir);<span class="comment">//in pixels</span></div>
+<div class="line"><a name="l01187"></a><span class="lineno"> 1187</span>         indexJ=y+d*sin(theDir);<span class="comment">//in pixels</span></div>
+<div class="line"><a name="l01188"></a><span class="lineno"> 1188</span>         <span class="keywordflow">if</span>(indexJ<0||indexJ>=input.size())</div>
+<div class="line"><a name="l01189"></a><span class="lineno"> 1189</span>           <span class="keywordflow">continue</span>;</div>
+<div class="line"><a name="l01190"></a><span class="lineno"> 1190</span>         <span class="keywordflow">if</span>(indexI<0||indexI>=input[indexJ].size())</div>
+<div class="line"><a name="l01191"></a><span class="lineno"> 1191</span>           <span class="keywordflow">continue</span>;</div>
+<div class="line"><a name="l01192"></a><span class="lineno"> 1192</span>         <span class="keywordflow">if</span>(input[indexJ][indexI]<currentValue-d*pixelSize/tan(DEG2RAD(sza))){<span class="comment">//in m</span></div>
+<div class="line"><a name="l01193"></a><span class="lineno"> 1193</span>           output[indexJ][indexI]=shadowFlag;</div>
+<div class="line"><a name="l01194"></a><span class="lineno"> 1194</span>         }</div>
+<div class="line"><a name="l01195"></a><span class="lineno"> 1195</span>       }</div>
+<div class="line"><a name="l01196"></a><span class="lineno"> 1196</span>     }</div>
+<div class="line"><a name="l01197"></a><span class="lineno"> 1197</span>     progress=(1.0+y);</div>
+<div class="line"><a name="l01198"></a><span class="lineno"> 1198</span>     progress/=output.nRows();</div>
+<div class="line"><a name="l01199"></a><span class="lineno"> 1199</span>     pfnProgress(progress,pszMessage,pProgressArg);</div>
+<div class="line"><a name="l01200"></a><span class="lineno"> 1200</span>   }</div>
+<div class="line"><a name="l01201"></a><span class="lineno"> 1201</span> }</div>
+<div class="line"><a name="l01202"></a><span class="lineno"> 1202</span> </div>
+<div class="line"><a name="l01203"></a><span class="lineno"> 1203</span> <span class="keyword">template</span><<span class="keyword">class</span> T> <span class="keywordtype">void</span> Filter2d::dwtForward(<a class="code" href="classVector2d.html">Vector2d<T></a>& theBuffer, <span class="keyword">const</span> std::string& wavelet_type, <span class="keywordtype">int</span> family){</div>
+<div class="line"><a name="l01204"></a><span class="lineno"> 1204</span>   <span class="keyword">const</span> <span class="keywordtype">char</span>* pszMessage;</div>
+<div class="line"><a name="l01205"></a><span class="lineno"> 1205</span>   <span class="keywordtype">void</span>* pProgressArg=NULL;</div>
+<div class="line"><a name="l01206"></a><span class="lineno"> 1206</span>   GDALProgressFunc pfnProgress=GDALTermProgress;</div>
+<div class="line"><a name="l01207"></a><span class="lineno"> 1207</span>   <span class="keywordtype">double</span> progress=0;</div>
+<div class="line"><a name="l01208"></a><span class="lineno"> 1208</span>   pfnProgress(progress,pszMessage,pProgressArg);</div>
+<div class="line"><a name="l01209"></a><span class="lineno"> 1209</span> </div>
+<div class="line"><a name="l01210"></a><span class="lineno"> 1210</span>   <span class="keywordtype">int</span> nRow=theBuffer.size();</div>
+<div class="line"><a name="l01211"></a><span class="lineno"> 1211</span>   assert(nRow);</div>
+<div class="line"><a name="l01212"></a><span class="lineno"> 1212</span>   <span class="keywordtype">int</span> nCol=theBuffer[0].size();</div>
+<div class="line"><a name="l01213"></a><span class="lineno"> 1213</span>   assert(nCol);</div>
+<div class="line"><a name="l01214"></a><span class="lineno"> 1214</span>   <span class="comment">//make sure data size if power of 2</span></div>
+<div class="line"><a name="l01215"></a><span class="lineno"> 1215</span>   <span class="keywordflow">while</span>(theBuffer.size()&(theBuffer.size()-1))</div>
+<div class="line"><a name="l01216"></a><span class="lineno"> 1216</span>     theBuffer.push_back(theBuffer.back());</div>
+<div class="line"><a name="l01217"></a><span class="lineno"> 1217</span>   <span class="keywordflow">for</span>(<span class="keywordtype">int</span> irow=0;irow<theBuffer.size();++irow)</div>
+<div class="line"><a name="l01218"></a><span class="lineno"> 1218</span>     <span class="keywordflow">while</span>(theBuffer[irow].size()&(theBuffer[irow].size()-1))</div>
+<div class="line"><a name="l01219"></a><span class="lineno"> 1219</span>       theBuffer[irow].push_back(theBuffer[irow].back());</div>
+<div class="line"><a name="l01220"></a><span class="lineno"> 1220</span>   std::vector<double> vdata(theBuffer.size()*theBuffer[0].size());</div>
+<div class="line"><a name="l01221"></a><span class="lineno"> 1221</span>   <span class="keywordtype">double</span>* data=&(vdata[0]);</div>
+<div class="line"><a name="l01222"></a><span class="lineno"> 1222</span>   <span class="keywordflow">for</span>(<span class="keywordtype">int</span> irow=0;irow<theBuffer.size();++irow){</div>
+<div class="line"><a name="l01223"></a><span class="lineno"> 1223</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> icol=0;icol<theBuffer[0].size();++icol){</div>
+<div class="line"><a name="l01224"></a><span class="lineno"> 1224</span>       <span class="keywordtype">int</span> index=irow*theBuffer[0].size()+icol;</div>
+<div class="line"><a name="l01225"></a><span class="lineno"> 1225</span>       data[index]=theBuffer[irow][icol];</div>
+<div class="line"><a name="l01226"></a><span class="lineno"> 1226</span>     }</div>
+<div class="line"><a name="l01227"></a><span class="lineno"> 1227</span>   }</div>
+<div class="line"><a name="l01228"></a><span class="lineno"> 1228</span>   <span class="keywordtype">int</span> nsize=theBuffer.size()*theBuffer[0].size();</div>
+<div class="line"><a name="l01229"></a><span class="lineno"> 1229</span>   gsl_wavelet *w;</div>
+<div class="line"><a name="l01230"></a><span class="lineno"> 1230</span>   gsl_wavelet_workspace *work;</div>
+<div class="line"><a name="l01231"></a><span class="lineno"> 1231</span>   assert(nsize);</div>
+<div class="line"><a name="l01232"></a><span class="lineno"> 1232</span>   w=gsl_wavelet_alloc(filter::Filter::getWaveletType(wavelet_type),family);</div>
+<div class="line"><a name="l01233"></a><span class="lineno"> 1233</span>   work=gsl_wavelet_workspace_alloc(nsize);</div>
+<div class="line"><a name="l01234"></a><span class="lineno"> 1234</span>   gsl_wavelet2d_nstransform_forward (w, data, theBuffer.size(), theBuffer.size(),theBuffer[0].size(), work);</div>
+<div class="line"><a name="l01235"></a><span class="lineno"> 1235</span>   theBuffer.erase(theBuffer.begin()+nRow,theBuffer.end());</div>
+<div class="line"><a name="l01236"></a><span class="lineno"> 1236</span>   <span class="keywordflow">for</span>(<span class="keywordtype">int</span> irow=0;irow<theBuffer.size();++irow){</div>
+<div class="line"><a name="l01237"></a><span class="lineno"> 1237</span>     theBuffer[irow].erase(theBuffer[irow].begin()+nCol,theBuffer[irow].end());</div>
+<div class="line"><a name="l01238"></a><span class="lineno"> 1238</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> icol=0;icol<theBuffer[irow].size();++icol){</div>
+<div class="line"><a name="l01239"></a><span class="lineno"> 1239</span>       <span class="keywordtype">int</span> index=irow*theBuffer[irow].size()+icol;</div>
+<div class="line"><a name="l01240"></a><span class="lineno"> 1240</span>       theBuffer[irow][icol]=data[index];</div>
+<div class="line"><a name="l01241"></a><span class="lineno"> 1241</span>     }</div>
+<div class="line"><a name="l01242"></a><span class="lineno"> 1242</span>     progress=(1.0+irow);</div>
+<div class="line"><a name="l01243"></a><span class="lineno"> 1243</span>     progress/=theBuffer.nRows();</div>
+<div class="line"><a name="l01244"></a><span class="lineno"> 1244</span>     pfnProgress(progress,pszMessage,pProgressArg);</div>
+<div class="line"><a name="l01245"></a><span class="lineno"> 1245</span>   }</div>
+<div class="line"><a name="l01246"></a><span class="lineno"> 1246</span>   gsl_wavelet_free (w);</div>
+<div class="line"><a name="l01247"></a><span class="lineno"> 1247</span>   gsl_wavelet_workspace_free (work);</div>
+<div class="line"><a name="l01248"></a><span class="lineno"> 1248</span> }</div>
+<div class="line"><a name="l01249"></a><span class="lineno"> 1249</span> </div>
+<div class="line"><a name="l01250"></a><span class="lineno"> 1250</span> <span class="keyword">template</span><<span class="keyword">class</span> T> <span class="keywordtype">void</span> Filter2d::dwtInverse(<a class="code" href="classVector2d.html">Vector2d<T></a>& theBuffer, <span class="keyword">const</span> std::string& wavelet_type, <span class="keywordtype">int</span> family){</div>
+<div class="line"><a name="l01251"></a><span class="lineno"> 1251</span>   <span class="keyword">const</span> <span class="keywordtype">char</span>* pszMessage;</div>
+<div class="line"><a name="l01252"></a><span class="lineno"> 1252</span>   <span class="keywordtype">void</span>* pProgressArg=NULL;</div>
+<div class="line"><a name="l01253"></a><span class="lineno"> 1253</span>   GDALProgressFunc pfnProgress=GDALTermProgress;</div>
+<div class="line"><a name="l01254"></a><span class="lineno"> 1254</span>   <span class="keywordtype">double</span> progress=0;</div>
+<div class="line"><a name="l01255"></a><span class="lineno"> 1255</span>   pfnProgress(progress,pszMessage,pProgressArg);</div>
+<div class="line"><a name="l01256"></a><span class="lineno"> 1256</span> </div>
+<div class="line"><a name="l01257"></a><span class="lineno"> 1257</span>   <span class="keywordtype">int</span> nRow=theBuffer.size();</div>
+<div class="line"><a name="l01258"></a><span class="lineno"> 1258</span>   assert(nRow);</div>
+<div class="line"><a name="l01259"></a><span class="lineno"> 1259</span>   <span class="keywordtype">int</span> nCol=theBuffer[0].size();</div>
+<div class="line"><a name="l01260"></a><span class="lineno"> 1260</span>   assert(nCol);</div>
+<div class="line"><a name="l01261"></a><span class="lineno"> 1261</span>   <span class="comment">//make sure data size if power of 2</span></div>
+<div class="line"><a name="l01262"></a><span class="lineno"> 1262</span>   <span class="keywordflow">while</span>(theBuffer.size()&(theBuffer.size()-1))</div>
+<div class="line"><a name="l01263"></a><span class="lineno"> 1263</span>     theBuffer.push_back(theBuffer.back());</div>
+<div class="line"><a name="l01264"></a><span class="lineno"> 1264</span>   <span class="keywordflow">for</span>(<span class="keywordtype">int</span> irow=0;irow<theBuffer.size();++irow)</div>
+<div class="line"><a name="l01265"></a><span class="lineno"> 1265</span>     <span class="keywordflow">while</span>(theBuffer[irow].size()&(theBuffer[irow].size()-1))</div>
+<div class="line"><a name="l01266"></a><span class="lineno"> 1266</span>       theBuffer[irow].push_back(theBuffer[irow].back());</div>
+<div class="line"><a name="l01267"></a><span class="lineno"> 1267</span>   std::vector<double> vdata(theBuffer.size()*theBuffer[0].size());</div>
+<div class="line"><a name="l01268"></a><span class="lineno"> 1268</span>   <span class="keywordtype">double</span>* data=&(vdata[0]);</div>
+<div class="line"><a name="l01269"></a><span class="lineno"> 1269</span>   <span class="comment">//double data[theBuffer.size()*theBuffer[0].size()];</span></div>
+<div class="line"><a name="l01270"></a><span class="lineno"> 1270</span>   <span class="keywordflow">for</span>(<span class="keywordtype">int</span> irow=0;irow<theBuffer.size();++irow){</div>
+<div class="line"><a name="l01271"></a><span class="lineno"> 1271</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> icol=0;icol<theBuffer[0].size();++icol){</div>
+<div class="line"><a name="l01272"></a><span class="lineno"> 1272</span>       <span class="keywordtype">int</span> index=irow*theBuffer[0].size()+icol;</div>
+<div class="line"><a name="l01273"></a><span class="lineno"> 1273</span>       data[index]=theBuffer[irow][icol];</div>
+<div class="line"><a name="l01274"></a><span class="lineno"> 1274</span>     }</div>
+<div class="line"><a name="l01275"></a><span class="lineno"> 1275</span>   }</div>
+<div class="line"><a name="l01276"></a><span class="lineno"> 1276</span>   <span class="keywordtype">int</span> nsize=theBuffer.size()*theBuffer[0].size();</div>
+<div class="line"><a name="l01277"></a><span class="lineno"> 1277</span>   gsl_wavelet *w;</div>
+<div class="line"><a name="l01278"></a><span class="lineno"> 1278</span>   gsl_wavelet_workspace *work;</div>
+<div class="line"><a name="l01279"></a><span class="lineno"> 1279</span>   assert(nsize);</div>
+<div class="line"><a name="l01280"></a><span class="lineno"> 1280</span>   w=gsl_wavelet_alloc(filter::Filter::getWaveletType(wavelet_type),family);</div>
+<div class="line"><a name="l01281"></a><span class="lineno"> 1281</span>   work=gsl_wavelet_workspace_alloc(nsize);</div>
+<div class="line"><a name="l01282"></a><span class="lineno"> 1282</span>   gsl_wavelet2d_nstransform_inverse (w, data, theBuffer.size(), theBuffer.size(),theBuffer[0].size(), work);</div>
+<div class="line"><a name="l01283"></a><span class="lineno"> 1283</span>   theBuffer.erase(theBuffer.begin()+nRow,theBuffer.end());</div>
+<div class="line"><a name="l01284"></a><span class="lineno"> 1284</span>   <span class="keywordflow">for</span>(<span class="keywordtype">int</span> irow=0;irow<theBuffer.size();++irow){</div>
+<div class="line"><a name="l01285"></a><span class="lineno"> 1285</span>     theBuffer[irow].erase(theBuffer[irow].begin()+nCol,theBuffer[irow].end());</div>
+<div class="line"><a name="l01286"></a><span class="lineno"> 1286</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> icol=0;icol<theBuffer[irow].size();++icol){</div>
+<div class="line"><a name="l01287"></a><span class="lineno"> 1287</span>       <span class="keywordtype">int</span> index=irow*theBuffer[irow].size()+icol;</div>
+<div class="line"><a name="l01288"></a><span class="lineno"> 1288</span>       theBuffer[irow][icol]=data[index];</div>
+<div class="line"><a name="l01289"></a><span class="lineno"> 1289</span>     }</div>
+<div class="line"><a name="l01290"></a><span class="lineno"> 1290</span>     progress=(1.0+irow);</div>
+<div class="line"><a name="l01291"></a><span class="lineno"> 1291</span>     progress/=theBuffer.nRows();</div>
+<div class="line"><a name="l01292"></a><span class="lineno"> 1292</span>     pfnProgress(progress,pszMessage,pProgressArg);</div>
+<div class="line"><a name="l01293"></a><span class="lineno"> 1293</span>   }</div>
+<div class="line"><a name="l01294"></a><span class="lineno"> 1294</span>   gsl_wavelet_free (w);</div>
+<div class="line"><a name="l01295"></a><span class="lineno"> 1295</span>   gsl_wavelet_workspace_free (work);</div>
+<div class="line"><a name="l01296"></a><span class="lineno"> 1296</span> }</div>
+<div class="line"><a name="l01297"></a><span class="lineno"> 1297</span> </div>
+<div class="line"><a name="l01298"></a><span class="lineno"> 1298</span> <span class="keyword">template</span><<span class="keyword">class</span> T> <span class="keywordtype">void</span> Filter2d::dwtCut(<a class="code" href="classVector2d.html">Vector2d<T></a>& theBuffer, <span class="keyword">const</span> std::string& wavelet_type, <span class="keywordtype">int</span> family, <span class="keywordtype">double</span> cut){</div>
+<div class="line"><a name="l01299"></a><span class="lineno"> 1299</span>   <span class="keyword">const</span> <span class="keywordtype">char</span>* pszMessage;</div>
+<div class="line"><a name="l01300"></a><span class="lineno"> 1300</span>   <span class="keywordtype">void</span>* pProgressArg=NULL;</div>
+<div class="line"><a name="l01301"></a><span class="lineno"> 1301</span>   GDALProgressFunc pfnProgress=GDALTermProgress;</div>
+<div class="line"><a name="l01302"></a><span class="lineno"> 1302</span>   <span class="keywordtype">double</span> progress=0;</div>
+<div class="line"><a name="l01303"></a><span class="lineno"> 1303</span>   pfnProgress(progress,pszMessage,pProgressArg);</div>
+<div class="line"><a name="l01304"></a><span class="lineno"> 1304</span> </div>
+<div class="line"><a name="l01305"></a><span class="lineno"> 1305</span>   <span class="keywordtype">int</span> nRow=theBuffer.size();</div>
+<div class="line"><a name="l01306"></a><span class="lineno"> 1306</span>   assert(nRow);</div>
+<div class="line"><a name="l01307"></a><span class="lineno"> 1307</span>   <span class="keywordtype">int</span> nCol=theBuffer[0].size();</div>
+<div class="line"><a name="l01308"></a><span class="lineno"> 1308</span>   assert(nCol);</div>
+<div class="line"><a name="l01309"></a><span class="lineno"> 1309</span>   <span class="comment">//make sure data size if power of 2</span></div>
+<div class="line"><a name="l01310"></a><span class="lineno"> 1310</span>   <span class="keywordflow">while</span>(theBuffer.size()&(theBuffer.size()-1))</div>
+<div class="line"><a name="l01311"></a><span class="lineno"> 1311</span>     theBuffer.push_back(theBuffer.back());</div>
+<div class="line"><a name="l01312"></a><span class="lineno"> 1312</span>   <span class="keywordflow">for</span>(<span class="keywordtype">int</span> irow=0;irow<theBuffer.size();++irow)</div>
+<div class="line"><a name="l01313"></a><span class="lineno"> 1313</span>     <span class="keywordflow">while</span>(theBuffer[irow].size()&(theBuffer[irow].size()-1))</div>
+<div class="line"><a name="l01314"></a><span class="lineno"> 1314</span>       theBuffer[irow].push_back(theBuffer[irow].back());</div>
+<div class="line"><a name="l01315"></a><span class="lineno"> 1315</span>   <span class="keywordtype">double</span>* data=<span class="keyword">new</span> <span class="keywordtype">double</span>[theBuffer.size()*theBuffer[0].size()];</div>
+<div class="line"><a name="l01316"></a><span class="lineno"> 1316</span>   <span class="keywordtype">double</span>* abscoeff=<span class="keyword">new</span> <span class="keywordtype">double</span>[theBuffer.size()*theBuffer[0].size()];</div>
+<div class="line"><a name="l01317"></a><span class="lineno"> 1317</span>   <span class="keywordtype">size_t</span>* p=<span class="keyword">new</span> <span class="keywordtype">size_t</span>[theBuffer.size()*theBuffer[0].size()];</div>
+<div class="line"><a name="l01318"></a><span class="lineno"> 1318</span>   <span class="keywordflow">for</span>(<span class="keywordtype">int</span> irow=0;irow<theBuffer.size();++irow){</div>
+<div class="line"><a name="l01319"></a><span class="lineno"> 1319</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> icol=0;icol<theBuffer[0].size();++icol){</div>
+<div class="line"><a name="l01320"></a><span class="lineno"> 1320</span>       <span class="keywordtype">int</span> index=irow*theBuffer[0].size()+icol;</div>
+<div class="line"><a name="l01321"></a><span class="lineno"> 1321</span>       assert(index<theBuffer.size()*theBuffer[0].size());</div>
+<div class="line"><a name="l01322"></a><span class="lineno"> 1322</span>       data[index]=theBuffer[irow][icol];</div>
+<div class="line"><a name="l01323"></a><span class="lineno"> 1323</span>     }</div>
+<div class="line"><a name="l01324"></a><span class="lineno"> 1324</span>   }</div>
+<div class="line"><a name="l01325"></a><span class="lineno"> 1325</span>   <span class="keywordtype">int</span> nsize=theBuffer.size()*theBuffer[0].size();</div>
+<div class="line"><a name="l01326"></a><span class="lineno"> 1326</span>   gsl_wavelet *w;</div>
+<div class="line"><a name="l01327"></a><span class="lineno"> 1327</span>   gsl_wavelet_workspace *work;</div>
+<div class="line"><a name="l01328"></a><span class="lineno"> 1328</span>   assert(nsize);</div>
+<div class="line"><a name="l01329"></a><span class="lineno"> 1329</span>   w=gsl_wavelet_alloc(filter::Filter::getWaveletType(wavelet_type),family);</div>
+<div class="line"><a name="l01330"></a><span class="lineno"> 1330</span>   work=gsl_wavelet_workspace_alloc(nsize);</div>
+<div class="line"><a name="l01331"></a><span class="lineno"> 1331</span>   gsl_wavelet2d_nstransform_forward (w, data, theBuffer.size(), theBuffer[0].size(),theBuffer[0].size(), work);</div>
+<div class="line"><a name="l01332"></a><span class="lineno"> 1332</span>   <span class="keywordflow">for</span>(<span class="keywordtype">int</span> irow=0;irow<theBuffer.size();++irow){</div>
+<div class="line"><a name="l01333"></a><span class="lineno"> 1333</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> icol=0;icol<theBuffer[0].size();++icol){</div>
+<div class="line"><a name="l01334"></a><span class="lineno"> 1334</span>       <span class="keywordtype">int</span> index=irow*theBuffer[0].size()+icol;</div>
+<div class="line"><a name="l01335"></a><span class="lineno"> 1335</span>       abscoeff[index]=fabs(data[index]);</div>
+<div class="line"><a name="l01336"></a><span class="lineno"> 1336</span>     }</div>
+<div class="line"><a name="l01337"></a><span class="lineno"> 1337</span>   }</div>
+<div class="line"><a name="l01338"></a><span class="lineno"> 1338</span>   <span class="keywordtype">int</span> nc=(100-cut)/100.0*nsize;</div>
+<div class="line"><a name="l01339"></a><span class="lineno"> 1339</span>   gsl_sort_index(p,abscoeff,1,nsize);</div>
+<div class="line"><a name="l01340"></a><span class="lineno"> 1340</span>   <span class="keywordflow">for</span>(<span class="keywordtype">int</span> i=0;(i+nc)<nsize;i++)</div>
+<div class="line"><a name="l01341"></a><span class="lineno"> 1341</span>    data[p[i]]=0;</div>
+<div class="line"><a name="l01342"></a><span class="lineno"> 1342</span>   gsl_wavelet2d_nstransform_inverse (w, data, theBuffer.size(), theBuffer[0].size(),theBuffer[0].size(), work);</div>
+<div class="line"><a name="l01343"></a><span class="lineno"> 1343</span>   <span class="keywordflow">for</span>(<span class="keywordtype">int</span> irow=0;irow<theBuffer.size();++irow){</div>
+<div class="line"><a name="l01344"></a><span class="lineno"> 1344</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> icol=0;icol<theBuffer[irow].size();++icol){</div>
+<div class="line"><a name="l01345"></a><span class="lineno"> 1345</span>       <span class="keywordtype">int</span> index=irow*theBuffer[irow].size()+icol;</div>
+<div class="line"><a name="l01346"></a><span class="lineno"> 1346</span>       theBuffer[irow][icol]=data[index];</div>
+<div class="line"><a name="l01347"></a><span class="lineno"> 1347</span>     }</div>
+<div class="line"><a name="l01348"></a><span class="lineno"> 1348</span>     progress=(1.0+irow);</div>
+<div class="line"><a name="l01349"></a><span class="lineno"> 1349</span>     progress/=theBuffer.nRows();</div>
+<div class="line"><a name="l01350"></a><span class="lineno"> 1350</span>     pfnProgress(progress,pszMessage,pProgressArg);</div>
+<div class="line"><a name="l01351"></a><span class="lineno"> 1351</span>   }</div>
+<div class="line"><a name="l01352"></a><span class="lineno"> 1352</span>   theBuffer.erase(theBuffer.begin()+nRow,theBuffer.end());</div>
+<div class="line"><a name="l01353"></a><span class="lineno"> 1353</span>   <span class="keywordflow">for</span>(<span class="keywordtype">int</span> irow=0;irow<theBuffer.size();++irow)</div>
+<div class="line"><a name="l01354"></a><span class="lineno"> 1354</span>     theBuffer[irow].erase(theBuffer[irow].begin()+nCol,theBuffer[irow].end());</div>
+<div class="line"><a name="l01355"></a><span class="lineno"> 1355</span>   <span class="keyword">delete</span>[] data;</div>
+<div class="line"><a name="l01356"></a><span class="lineno"> 1356</span>   <span class="keyword">delete</span>[] abscoeff;</div>
+<div class="line"><a name="l01357"></a><span class="lineno"> 1357</span>   <span class="keyword">delete</span>[] p;</div>
+<div class="line"><a name="l01358"></a><span class="lineno"> 1358</span>   gsl_wavelet_free (w);</div>
+<div class="line"><a name="l01359"></a><span class="lineno"> 1359</span>   gsl_wavelet_workspace_free (work);</div>
+<div class="line"><a name="l01360"></a><span class="lineno"> 1360</span> </div>
+<div class="line"><a name="l01361"></a><span class="lineno"> 1361</span> }</div>
+<div class="line"><a name="l01362"></a><span class="lineno"> 1362</span> </div>
+<div class="line"><a name="l01363"></a><span class="lineno"> 1363</span> }</div>
+<div class="line"><a name="l01364"></a><span class="lineno"> 1364</span> </div>
+<div class="line"><a name="l01365"></a><span class="lineno"> 1365</span> <span class="preprocessor">#endif </span><span class="comment">/* _MYFILTER_H_ */</span><span class="preprocessor"></span></div>
 <div class="ttc" id="classImgReaderGdal_html"><div class="ttname"><a href="classImgReaderGdal.html">ImgReaderGdal</a></div><div class="ttdef"><b>Definition:</b> <a href="ImgReaderGdal_8h_source.html#l00033">ImgReaderGdal.h:33</a></div></div>
 <div class="ttc" id="classImgWriterGdal_html"><div class="ttname"><a href="classImgWriterGdal.html">ImgWriterGdal</a></div><div class="ttdef"><b>Definition:</b> <a href="ImgWriterGdal_8h_source.html#l00032">ImgWriterGdal.h:32</a></div></div>
 <div class="ttc" id="classfilter2d_1_1Filter2d_html"><div class="ttname"><a href="classfilter2d_1_1Filter2d.html">filter2d::Filter2d</a></div><div class="ttdef"><b>Definition:</b> <a href="Filter2d_8h_source.html#l00065">Filter2d.h:65</a></div></div>
@@ -1416,7 +1426,7 @@
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Jun 23 2015 17:09:36 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Tue Nov 3 2015 15:58:26 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/Filter_8cc_source.html b/doc/html/Filter_8cc_source.html
index d6059a1..574b21e 100644
--- a/doc/html/Filter_8cc_source.html
+++ b/doc/html/Filter_8cc_source.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.3</span>
+    <span id="projectnumber">2.6.4</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -769,7 +769,7 @@
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Jun 23 2015 17:09:36 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Tue Nov 3 2015 15:58:26 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/Filter_8h_source.html b/doc/html/Filter_8h_source.html
index 149cb6c..7acf974 100644
--- a/doc/html/Filter_8h_source.html
+++ b/doc/html/Filter_8h_source.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.3</span>
+    <span id="projectnumber">2.6.4</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -903,7 +903,7 @@
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Jun 23 2015 17:09:36 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Tue Nov 3 2015 15:58:26 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/Filter__old_8h_source.html b/doc/html/Filter__old_8h_source.html
index c0f4bf5..53f6055 100644
--- a/doc/html/Filter__old_8h_source.html
+++ b/doc/html/Filter__old_8h_source.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.3</span>
+    <span id="projectnumber">2.6.4</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -966,7 +966,7 @@
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Jun 23 2015 17:09:36 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Tue Nov 3 2015 15:58:26 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/ImgReaderGdal_8cc_source.html b/doc/html/ImgReaderGdal_8cc_source.html
index f943d6a..f56b603 100644
--- a/doc/html/ImgReaderGdal_8cc_source.html
+++ b/doc/html/ImgReaderGdal_8cc_source.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.3</span>
+    <span id="projectnumber">2.6.4</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -769,7 +769,7 @@
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Jun 23 2015 17:09:36 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/ImgReaderGdal_8h_source.html b/doc/html/ImgReaderGdal_8h_source.html
index 999dc61..f127a54 100644
--- a/doc/html/ImgReaderGdal_8h_source.html
+++ b/doc/html/ImgReaderGdal_8h_source.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.3</span>
+    <span id="projectnumber">2.6.4</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -368,7 +368,7 @@
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Jun 23 2015 17:09:37 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/ImgReaderOgr_8cc_source.html b/doc/html/ImgReaderOgr_8cc_source.html
index 5842bb5..0229fb2 100644
--- a/doc/html/ImgReaderOgr_8cc_source.html
+++ b/doc/html/ImgReaderOgr_8cc_source.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.3</span>
+    <span id="projectnumber">2.6.4</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -306,7 +306,7 @@
 <div class="line"><a name="l00252"></a><span class="lineno">  252</span> </div>
 <div class="line"><a name="l00253"></a><span class="lineno">  253</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> ImgReaderOgr::readDataImageOgr(std::map<std::string,<a class="code" href="classVector2d.html">Vector2d<float></a> > &mapPixels, <span class="comment">//[classNr][pixelNr][bandNr],</span></div>
 <div class="line"><a name="l00254"></a><span class="lineno">  254</span>                         std::vector<std::string>& fields,</div>
-<div class="line"><a name="l00255"></a><span class="lineno">  255</span>                         <span class="keyword">const</span> std::vector<short>& bands,</div>
+<div class="line"><a name="l00255"></a><span class="lineno">  255</span>                         <span class="keyword">const</span> std::vector<unsigned short>& bands,</div>
 <div class="line"><a name="l00256"></a><span class="lineno">  256</span>                         <span class="keyword">const</span> std::string& label,</div>
 <div class="line"><a name="l00257"></a><span class="lineno">  257</span>                         <span class="keyword">const</span> std::vector<std::string>& layers,</div>
 <div class="line"><a name="l00258"></a><span class="lineno">  258</span>                         <span class="keywordtype">int</span> verbose)</div>
@@ -469,7 +469,7 @@
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Jun 23 2015 17:09:37 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/ImgReaderOgr_8h_source.html b/doc/html/ImgReaderOgr_8h_source.html
index 229a9c9..fcc48ee 100644
--- a/doc/html/ImgReaderOgr_8h_source.html
+++ b/doc/html/ImgReaderOgr_8h_source.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.3</span>
+    <span id="projectnumber">2.6.4</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -104,7 +104,7 @@
 <div class="line"><a name="l00050"></a><span class="lineno">   50</span>   <span class="keyword">template</span> <<span class="keyword">typename</span> T> <span class="keywordtype">int</span> readData(std::map<std::string,<a class="code" href="classVector2d.html">Vector2d<T></a> >& data, <span class="keyword">const</span> OGRFieldType& fieldType, std::vector<std::string>& fields, <span class="keyword">const</span> std::string& label, <span cla [...]
 <div class="line"><a name="l00051"></a><span class="lineno">   51</span>   <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> readDataImageOgr(std::map<std::string,<a class="code" href="classVector2d.html">Vector2d<float></a> > &mapPixels, <span class="comment">//[classNr][pixelNr][bandNr],</span></div>
 <div class="line"><a name="l00052"></a><span class="lineno">   52</span>                 std::vector<std::string>& fields,</div>
-<div class="line"><a name="l00053"></a><span class="lineno">   53</span>                 <span class="keyword">const</span> std::vector<short>& bands,</div>
+<div class="line"><a name="l00053"></a><span class="lineno">   53</span>                 <span class="keyword">const</span> std::vector<unsigned short>& bands,</div>
 <div class="line"><a name="l00054"></a><span class="lineno">   54</span>                 <span class="keyword">const</span> std::string& label,</div>
 <div class="line"><a name="l00055"></a><span class="lineno">   55</span>                 <span class="keyword">const</span> std::vector<std::string>& layers,</div>
 <div class="line"><a name="l00056"></a><span class="lineno">   56</span>                 <span class="keywordtype">int</span> verbose=<span class="keyword">false</span>);</div>
@@ -1010,7 +1010,7 @@
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Jun 23 2015 17:09:37 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/ImgRegression_8cc_source.html b/doc/html/ImgRegression_8cc_source.html
index 988a640..2914049 100644
--- a/doc/html/ImgRegression_8cc_source.html
+++ b/doc/html/ImgRegression_8cc_source.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.3</span>
+    <span id="projectnumber">2.6.4</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -452,7 +452,7 @@
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Jun 23 2015 17:09:36 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Tue Nov 3 2015 15:58:26 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/ImgRegression_8h_source.html b/doc/html/ImgRegression_8h_source.html
index d203855..a308496 100644
--- a/doc/html/ImgRegression_8h_source.html
+++ b/doc/html/ImgRegression_8h_source.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.3</span>
+    <span id="projectnumber">2.6.4</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -106,7 +106,7 @@
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Jun 23 2015 17:09:36 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Tue Nov 3 2015 15:58:26 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/ImgWriterGdal_8cc_source.html b/doc/html/ImgWriterGdal_8cc_source.html
index 0500069..2cc2900 100644
--- a/doc/html/ImgWriterGdal_8cc_source.html
+++ b/doc/html/ImgWriterGdal_8cc_source.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.3</span>
+    <span id="projectnumber">2.6.4</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -711,7 +711,7 @@
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Jun 23 2015 17:09:37 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/ImgWriterGdal_8h_source.html b/doc/html/ImgWriterGdal_8h_source.html
index cf7f5d7..c2b09b2 100644
--- a/doc/html/ImgWriterGdal_8h_source.html
+++ b/doc/html/ImgWriterGdal_8h_source.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.3</span>
+    <span id="projectnumber">2.6.4</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -293,7 +293,7 @@
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Jun 23 2015 17:09:37 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/ImgWriterOgr_8cc_source.html b/doc/html/ImgWriterOgr_8cc_source.html
index 59b929b..7c1c6c6 100644
--- a/doc/html/ImgWriterOgr_8cc_source.html
+++ b/doc/html/ImgWriterOgr_8cc_source.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.3</span>
+    <span id="projectnumber">2.6.4</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -563,13 +563,13 @@
 <div class="line"><a name="l00509"></a><span class="lineno">  509</span>             <span class="keywordflow">if</span>(eGType==wkbPoint)</div>
 <div class="line"><a name="l00510"></a><span class="lineno">  510</span>               pointFeature->SetField(fieldId,atoi(value.c_str()));</div>
 <div class="line"><a name="l00511"></a><span class="lineno">  511</span>             <span class="keywordflow">else</span> <span class="keywordflow">if</span>(firstPoint.IsEmpty())</div>
-<div class="line"><a name="l00512"></a><span class="lineno">  512</span>               polyFeature->SetField(fieldId,atof(value.c_str()));</div>
+<div class="line"><a name="l00512"></a><span class="lineno">  512</span>               polyFeature->SetField(fieldId,atoi(value.c_str()));</div>
 <div class="line"><a name="l00513"></a><span class="lineno">  513</span>             <span class="keywordflow">break</span>;</div>
 <div class="line"><a name="l00514"></a><span class="lineno">  514</span>           <span class="keywordflow">case</span>(OFTString):</div>
 <div class="line"><a name="l00515"></a><span class="lineno">  515</span>             <span class="keywordflow">if</span>(eGType==wkbPoint)</div>
 <div class="line"><a name="l00516"></a><span class="lineno">  516</span>               pointFeature->SetField(fieldId,value.c_str());</div>
 <div class="line"><a name="l00517"></a><span class="lineno">  517</span>             <span class="keywordflow">else</span> <span class="keywordflow">if</span>(firstPoint.IsEmpty())</div>
-<div class="line"><a name="l00518"></a><span class="lineno">  518</span>               polyFeature->SetField(fieldId,atof(value.c_str()));</div>
+<div class="line"><a name="l00518"></a><span class="lineno">  518</span>               polyFeature->SetField(fieldId,value.c_str());</div>
 <div class="line"><a name="l00519"></a><span class="lineno">  519</span>             <span class="keywordflow">break</span>;</div>
 <div class="line"><a name="l00520"></a><span class="lineno">  520</span>           <span class="keywordflow">default</span>:</div>
 <div class="line"><a name="l00521"></a><span class="lineno">  521</span>             <span class="keywordflow">break</span>;</div>
@@ -627,13 +627,13 @@
 <div class="line"><a name="l00573"></a><span class="lineno">  573</span>             <span class="keywordflow">if</span>(eGType==wkbPoint)</div>
 <div class="line"><a name="l00574"></a><span class="lineno">  574</span>               pointFeature->SetField(fieldId,atoi(value.c_str()));</div>
 <div class="line"><a name="l00575"></a><span class="lineno">  575</span>             <span class="keywordflow">else</span> <span class="keywordflow">if</span>(firstPoint.IsEmpty())</div>
-<div class="line"><a name="l00576"></a><span class="lineno">  576</span>               polyFeature->SetField(fieldId,atof(value.c_str()));</div>
+<div class="line"><a name="l00576"></a><span class="lineno">  576</span>               polyFeature->SetField(fieldId,atoi(value.c_str()));</div>
 <div class="line"><a name="l00577"></a><span class="lineno">  577</span>             <span class="keywordflow">break</span>;</div>
 <div class="line"><a name="l00578"></a><span class="lineno">  578</span>           <span class="keywordflow">case</span>(OFTString):</div>
 <div class="line"><a name="l00579"></a><span class="lineno">  579</span>             <span class="keywordflow">if</span>(eGType==wkbPoint)</div>
 <div class="line"><a name="l00580"></a><span class="lineno">  580</span>               pointFeature->SetField(fieldId,value.c_str());</div>
 <div class="line"><a name="l00581"></a><span class="lineno">  581</span>             <span class="keywordflow">else</span> <span class="keywordflow">if</span>(firstPoint.IsEmpty())</div>
-<div class="line"><a name="l00582"></a><span class="lineno">  582</span>               polyFeature->SetField(fieldId,atof(value.c_str()));</div>
+<div class="line"><a name="l00582"></a><span class="lineno">  582</span>               polyFeature->SetField(fieldId,value.c_str());</div>
 <div class="line"><a name="l00583"></a><span class="lineno">  583</span>             <span class="keywordflow">break</span>;</div>
 <div class="line"><a name="l00584"></a><span class="lineno">  584</span>           <span class="keywordflow">default</span>:</div>
 <div class="line"><a name="l00585"></a><span class="lineno">  585</span>             <span class="keywordflow">break</span>;</div>
@@ -726,7 +726,7 @@
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Jun 23 2015 17:09:37 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/ImgWriterOgr_8h_source.html b/doc/html/ImgWriterOgr_8h_source.html
index 4ed7058..049f70b 100644
--- a/doc/html/ImgWriterOgr_8h_source.html
+++ b/doc/html/ImgWriterOgr_8h_source.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.3</span>
+    <span id="projectnumber">2.6.4</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -138,7 +138,7 @@
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Jun 23 2015 17:09:37 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/IndexValue_8h_source.html b/doc/html/IndexValue_8h_source.html
index 778b3b5..f10f23d 100644
--- a/doc/html/IndexValue_8h_source.html
+++ b/doc/html/IndexValue_8h_source.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.3</span>
+    <span id="projectnumber">2.6.4</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -105,7 +105,7 @@
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Jun 23 2015 17:09:36 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/OptFactory_8h_source.html b/doc/html/OptFactory_8h_source.html
index d2007be..308b851 100644
--- a/doc/html/OptFactory_8h_source.html
+++ b/doc/html/OptFactory_8h_source.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.3</span>
+    <span id="projectnumber">2.6.4</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -272,7 +272,7 @@
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Jun 23 2015 17:09:36 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Tue Nov 3 2015 15:58:26 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/Optionpk_8cc_source.html b/doc/html/Optionpk_8cc_source.html
index fe177e6..69b7aed 100644
--- a/doc/html/Optionpk_8cc_source.html
+++ b/doc/html/Optionpk_8cc_source.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.3</span>
+    <span id="projectnumber">2.6.4</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -167,7 +167,7 @@
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Jun 23 2015 17:09:37 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/Optionpk_8h_source.html b/doc/html/Optionpk_8h_source.html
index 713ce23..2c37885 100644
--- a/doc/html/Optionpk_8h_source.html
+++ b/doc/html/Optionpk_8h_source.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.3</span>
+    <span id="projectnumber">2.6.4</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -474,7 +474,7 @@
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Jun 23 2015 17:09:36 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/PosValue_8h_source.html b/doc/html/PosValue_8h_source.html
index 424b5e4..eace62d 100644
--- a/doc/html/PosValue_8h_source.html
+++ b/doc/html/PosValue_8h_source.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.3</span>
+    <span id="projectnumber">2.6.4</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -106,7 +106,7 @@
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Jun 23 2015 17:09:36 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/ProcessingPktoolsPlugin_8py_source.html b/doc/html/ProcessingPktoolsPlugin_8py_source.html
index 1f855d7..ee42273 100644
--- a/doc/html/ProcessingPktoolsPlugin_8py_source.html
+++ b/doc/html/ProcessingPktoolsPlugin_8py_source.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.3</span>
+    <span id="projectnumber">2.6.4</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -107,7 +107,7 @@
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Jun 23 2015 17:09:36 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Tue Nov 3 2015 15:58:26 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/StatFactory_8h_source.html b/doc/html/StatFactory_8h_source.html
index 1b50f46..31af71b 100644
--- a/doc/html/StatFactory_8h_source.html
+++ b/doc/html/StatFactory_8h_source.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.3</span>
+    <span id="projectnumber">2.6.4</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -270,1283 +270,1351 @@
 <div class="line"><a name="l00216"></a><span class="lineno">  216</span> <span class="keyword">template</span><<span class="keyword">class</span> T> <span class="keyword">inline</span> <span class="keyword">typename</span> std::vector<T>::const_iterator StatFactory::mymin(<span class="keyword">const</span> std::vector<T>& v, <span class="keyword">typename</span> std::vector<T>::const_iterator begin, <span class="keyword">typename</span> std::vector<T&g [...]
 <div class="line"><a name="l00217"></a><span class="lineno">  217</span> <span class="keyword"></span>{</div>
 <div class="line"><a name="l00218"></a><span class="lineno">  218</span>   <span class="keywordtype">bool</span> isValid=<span class="keyword">false</span>;</div>
-<div class="line"><a name="l00219"></a><span class="lineno">  219</span>   <span class="keyword">typename</span> std::vector<T>::const_iterator tmpIt=begin;</div>
+<div class="line"><a name="l00219"></a><span class="lineno">  219</span>   <span class="keyword">typename</span> std::vector<T>::const_iterator tmpIt;</div>
 <div class="line"><a name="l00220"></a><span class="lineno">  220</span>   <span class="keywordflow">for</span>(<span class="keyword">typename</span> std::vector<T>::const_iterator it = begin; it!=end; ++it){</div>
 <div class="line"><a name="l00221"></a><span class="lineno">  221</span>     <span class="keywordflow">if</span>(!isNoData(*it)){</div>
-<div class="line"><a name="l00222"></a><span class="lineno">  222</span>       isValid=<span class="keyword">true</span>;</div>
-<div class="line"><a name="l00223"></a><span class="lineno">  223</span>       <span class="keywordflow">if</span>(*tmpIt>*it)</div>
-<div class="line"><a name="l00224"></a><span class="lineno">  224</span>     tmpIt=it;</div>
-<div class="line"><a name="l00225"></a><span class="lineno">  225</span>     }</div>
-<div class="line"><a name="l00226"></a><span class="lineno">  226</span>   }</div>
-<div class="line"><a name="l00227"></a><span class="lineno">  227</span>   <span class="keywordflow">if</span>(isValid)</div>
-<div class="line"><a name="l00228"></a><span class="lineno">  228</span>     <span class="keywordflow">return</span> tmpIt;</div>
-<div class="line"><a name="l00229"></a><span class="lineno">  229</span>   <span class="keywordflow">else</span> <span class="keywordflow">if</span>(m_noDataValues.size())</div>
-<div class="line"><a name="l00230"></a><span class="lineno">  230</span>     <span class="keywordflow">return</span> m_noDataValues[0];</div>
-<div class="line"><a name="l00231"></a><span class="lineno">  231</span>   <span class="keywordflow">else</span>{</div>
-<div class="line"><a name="l00232"></a><span class="lineno">  232</span>     std::string errorString=<span class="stringliteral">"Error: no valid data found"</span>;</div>
-<div class="line"><a name="l00233"></a><span class="lineno">  233</span>     <span class="keywordflow">throw</span>(errorString);</div>
-<div class="line"><a name="l00234"></a><span class="lineno">  234</span>   }</div>
-<div class="line"><a name="l00235"></a><span class="lineno">  235</span> }</div>
-<div class="line"><a name="l00236"></a><span class="lineno">  236</span> </div>
-<div class="line"><a name="l00237"></a><span class="lineno">  237</span> <span class="keyword">template</span><<span class="keyword">class</span> T> <span class="keyword">inline</span> <span class="keyword">typename</span> std::vector<T>::iterator StatFactory::mymin(<span class="keyword">const</span> std::vector<T>& v, <span class="keyword">typename</span> std::vector<T>::iterator begin, <span class="keyword">typename</span> std::vector<T>::iterator [...]
-<div class="line"><a name="l00238"></a><span class="lineno">  238</span> <span class="keyword"></span>{</div>
-<div class="line"><a name="l00239"></a><span class="lineno">  239</span>   <span class="keywordtype">bool</span> isValid=<span class="keyword">false</span>;</div>
-<div class="line"><a name="l00240"></a><span class="lineno">  240</span>   <span class="keyword">typename</span> std::vector<T>::iterator tmpIt=begin;</div>
-<div class="line"><a name="l00241"></a><span class="lineno">  241</span>   <span class="keywordflow">for</span> (<span class="keyword">typename</span> std::vector<T>::const_iterator it = begin; it!=end; ++it){</div>
-<div class="line"><a name="l00242"></a><span class="lineno">  242</span>     <span class="keywordflow">if</span>(!isNoData(*it)){</div>
-<div class="line"><a name="l00243"></a><span class="lineno">  243</span>       isValid=<span class="keyword">true</span>;</div>
-<div class="line"><a name="l00244"></a><span class="lineno">  244</span>       <span class="keywordflow">if</span>(*tmpIt>*it)</div>
-<div class="line"><a name="l00245"></a><span class="lineno">  245</span>     tmpIt=it;</div>
-<div class="line"><a name="l00246"></a><span class="lineno">  246</span>     }</div>
-<div class="line"><a name="l00247"></a><span class="lineno">  247</span>   }</div>
-<div class="line"><a name="l00248"></a><span class="lineno">  248</span>   <span class="keywordflow">if</span>(isValid)</div>
-<div class="line"><a name="l00249"></a><span class="lineno">  249</span>     <span class="keywordflow">return</span> tmpIt;</div>
-<div class="line"><a name="l00250"></a><span class="lineno">  250</span>   <span class="keywordflow">else</span> <span class="keywordflow">if</span>(m_noDataValues.size())</div>
-<div class="line"><a name="l00251"></a><span class="lineno">  251</span>     <span class="keywordflow">return</span> m_noDataValues[0];</div>
-<div class="line"><a name="l00252"></a><span class="lineno">  252</span>   <span class="keywordflow">else</span>{</div>
-<div class="line"><a name="l00253"></a><span class="lineno">  253</span>     std::string errorString=<span class="stringliteral">"Error: no valid data found"</span>;</div>
-<div class="line"><a name="l00254"></a><span class="lineno">  254</span>     <span class="keywordflow">throw</span>(errorString);</div>
-<div class="line"><a name="l00255"></a><span class="lineno">  255</span>   }</div>
-<div class="line"><a name="l00256"></a><span class="lineno">  256</span> }</div>
-<div class="line"><a name="l00257"></a><span class="lineno">  257</span> </div>
-<div class="line"><a name="l00258"></a><span class="lineno">  258</span> <span class="keyword">template</span><<span class="keyword">class</span> T> <span class="keyword">inline</span>  <span class="keyword">typename</span> std::vector<T>::const_iterator StatFactory::mymin(<span class="keyword">const</span> std::vector<T>& v, <span class="keyword">typename</span> std::vector<T>::const_iterator begin, <span class="keyword">typename</span> std::vector<T& [...]
-<div class="line"><a name="l00259"></a><span class="lineno">  259</span> <span class="keyword"></span>{</div>
-<div class="line"><a name="l00260"></a><span class="lineno">  260</span>   <span class="keywordtype">bool</span> isValid=<span class="keyword">false</span>;</div>
-<div class="line"><a name="l00261"></a><span class="lineno">  261</span>   <span class="keyword">typename</span> std::vector<T>::const_iterator tmpIt=v.end();</div>
-<div class="line"><a name="l00262"></a><span class="lineno">  262</span>   T minValue=minConstraint;</div>
-<div class="line"><a name="l00263"></a><span class="lineno">  263</span>   <span class="keywordflow">for</span> (<span class="keyword">typename</span> std::vector<T>::const_iterator it = begin; it!=end; ++it){</div>
-<div class="line"><a name="l00264"></a><span class="lineno">  264</span>     <span class="keywordflow">if</span>(isNoData(*it))</div>
-<div class="line"><a name="l00265"></a><span class="lineno">  265</span>       <span class="keywordflow">continue</span>;</div>
-<div class="line"><a name="l00266"></a><span class="lineno">  266</span>     isValid=<span class="keyword">true</span>;</div>
-<div class="line"><a name="l00267"></a><span class="lineno">  267</span>     <span class="keywordflow">if</span>((minConstraint<=*it)&&(*it<=minValue)){</div>
-<div class="line"><a name="l00268"></a><span class="lineno">  268</span>       tmpIt=it;</div>
-<div class="line"><a name="l00269"></a><span class="lineno">  269</span>       minValue=*it;</div>
-<div class="line"><a name="l00270"></a><span class="lineno">  270</span>     }</div>
-<div class="line"><a name="l00271"></a><span class="lineno">  271</span>   }</div>
-<div class="line"><a name="l00272"></a><span class="lineno">  272</span>   <span class="keywordflow">if</span>(isValid)</div>
-<div class="line"><a name="l00273"></a><span class="lineno">  273</span>     <span class="keywordflow">return</span> tmpIt;</div>
-<div class="line"><a name="l00274"></a><span class="lineno">  274</span>   <span class="keywordflow">else</span> <span class="keywordflow">if</span>(m_noDataValues.size())</div>
-<div class="line"><a name="l00275"></a><span class="lineno">  275</span>     <span class="keywordflow">return</span> m_noDataValues[0];</div>
-<div class="line"><a name="l00276"></a><span class="lineno">  276</span>   <span class="keywordflow">else</span>{</div>
-<div class="line"><a name="l00277"></a><span class="lineno">  277</span>     std::string errorString=<span class="stringliteral">"Error: no valid data found"</span>;</div>
-<div class="line"><a name="l00278"></a><span class="lineno">  278</span>     <span class="keywordflow">throw</span>(errorString);</div>
-<div class="line"><a name="l00279"></a><span class="lineno">  279</span>   }</div>
-<div class="line"><a name="l00280"></a><span class="lineno">  280</span> }</div>
-<div class="line"><a name="l00281"></a><span class="lineno">  281</span> </div>
-<div class="line"><a name="l00282"></a><span class="lineno">  282</span> <span class="keyword">template</span><<span class="keyword">class</span> T> <span class="keyword">inline</span> <span class="keyword">typename</span> std::vector<T>::iterator StatFactory::mymin(<span class="keyword">const</span> std::vector<T>& v, <span class="keyword">typename</span> std::vector<T>::iterator begin, <span class="keyword">typename</span> std::vector<T>::iterator [...]
-<div class="line"><a name="l00283"></a><span class="lineno">  283</span> <span class="keyword"></span>{</div>
-<div class="line"><a name="l00284"></a><span class="lineno">  284</span>   <span class="keywordtype">bool</span> isValid=<span class="keyword">false</span>;</div>
-<div class="line"><a name="l00285"></a><span class="lineno">  285</span>   <span class="keyword">typename</span> std::vector<T>::iterator tmpIt=v.end();</div>
-<div class="line"><a name="l00286"></a><span class="lineno">  286</span>   T minValue=minConstraint;</div>
-<div class="line"><a name="l00287"></a><span class="lineno">  287</span>   <span class="keywordflow">for</span> (<span class="keyword">typename</span> std::vector<T>::const_iterator it = begin; it!=end; ++it){</div>
-<div class="line"><a name="l00288"></a><span class="lineno">  288</span>     <span class="keywordflow">if</span>(isNoData(*it))</div>
-<div class="line"><a name="l00289"></a><span class="lineno">  289</span>       <span class="keywordflow">continue</span>;</div>
-<div class="line"><a name="l00290"></a><span class="lineno">  290</span>     isValid=<span class="keyword">true</span>;</div>
-<div class="line"><a name="l00291"></a><span class="lineno">  291</span>     <span class="keywordflow">if</span>((minConstraint<=*it)&&(*it<=minValue)){</div>
-<div class="line"><a name="l00292"></a><span class="lineno">  292</span>       tmpIt=it;</div>
-<div class="line"><a name="l00293"></a><span class="lineno">  293</span>       minValue=*it;</div>
-<div class="line"><a name="l00294"></a><span class="lineno">  294</span>     }</div>
+<div class="line"><a name="l00222"></a><span class="lineno">  222</span>       <span class="keywordflow">if</span>(isValid){</div>
+<div class="line"><a name="l00223"></a><span class="lineno">  223</span>     <span class="keywordflow">if</span>(*tmpIt>*it)</div>
+<div class="line"><a name="l00224"></a><span class="lineno">  224</span>       tmpIt=it;</div>
+<div class="line"><a name="l00225"></a><span class="lineno">  225</span>       }</div>
+<div class="line"><a name="l00226"></a><span class="lineno">  226</span>       <span class="keywordflow">else</span>{</div>
+<div class="line"><a name="l00227"></a><span class="lineno">  227</span>     tmpIt=it;</div>
+<div class="line"><a name="l00228"></a><span class="lineno">  228</span>     isValid=<span class="keyword">true</span>;</div>
+<div class="line"><a name="l00229"></a><span class="lineno">  229</span>       }</div>
+<div class="line"><a name="l00230"></a><span class="lineno">  230</span>     }</div>
+<div class="line"><a name="l00231"></a><span class="lineno">  231</span>   }</div>
+<div class="line"><a name="l00232"></a><span class="lineno">  232</span>   <span class="keywordflow">if</span>(isValid)</div>
+<div class="line"><a name="l00233"></a><span class="lineno">  233</span>     <span class="keywordflow">return</span> tmpIt;</div>
+<div class="line"><a name="l00234"></a><span class="lineno">  234</span>   <span class="keywordflow">else</span> <span class="keywordflow">if</span>(m_noDataValues.size())</div>
+<div class="line"><a name="l00235"></a><span class="lineno">  235</span>     <span class="keywordflow">return</span> m_noDataValues[0];</div>
+<div class="line"><a name="l00236"></a><span class="lineno">  236</span>   <span class="keywordflow">else</span>{</div>
+<div class="line"><a name="l00237"></a><span class="lineno">  237</span>     std::string errorString=<span class="stringliteral">"Error: no valid data found"</span>;</div>
+<div class="line"><a name="l00238"></a><span class="lineno">  238</span>     <span class="keywordflow">throw</span>(errorString);</div>
+<div class="line"><a name="l00239"></a><span class="lineno">  239</span>   }</div>
+<div class="line"><a name="l00240"></a><span class="lineno">  240</span> }</div>
+<div class="line"><a name="l00241"></a><span class="lineno">  241</span> </div>
+<div class="line"><a name="l00242"></a><span class="lineno">  242</span> <span class="keyword">template</span><<span class="keyword">class</span> T> <span class="keyword">inline</span> <span class="keyword">typename</span> std::vector<T>::iterator StatFactory::mymin(<span class="keyword">const</span> std::vector<T>& v, <span class="keyword">typename</span> std::vector<T>::iterator begin, <span class="keyword">typename</span> std::vector<T>::iterator [...]
+<div class="line"><a name="l00243"></a><span class="lineno">  243</span> <span class="keyword"></span>{</div>
+<div class="line"><a name="l00244"></a><span class="lineno">  244</span>   <span class="keywordtype">bool</span> isValid=<span class="keyword">false</span>;</div>
+<div class="line"><a name="l00245"></a><span class="lineno">  245</span>   <span class="keyword">typename</span> std::vector<T>::iterator tmpIt;</div>
+<div class="line"><a name="l00246"></a><span class="lineno">  246</span>   <span class="keywordflow">for</span> (<span class="keyword">typename</span> std::vector<T>::const_iterator it = begin; it!=end; ++it){</div>
+<div class="line"><a name="l00247"></a><span class="lineno">  247</span>     <span class="keywordflow">if</span>(!isNoData(*it)){</div>
+<div class="line"><a name="l00248"></a><span class="lineno">  248</span>       <span class="keywordflow">if</span>(isValid){</div>
+<div class="line"><a name="l00249"></a><span class="lineno">  249</span>     <span class="keywordflow">if</span>(*tmpIt>*it)</div>
+<div class="line"><a name="l00250"></a><span class="lineno">  250</span>       tmpIt=it;</div>
+<div class="line"><a name="l00251"></a><span class="lineno">  251</span>       }</div>
+<div class="line"><a name="l00252"></a><span class="lineno">  252</span>       <span class="keywordflow">else</span>{</div>
+<div class="line"><a name="l00253"></a><span class="lineno">  253</span>     tmpIt=it;</div>
+<div class="line"><a name="l00254"></a><span class="lineno">  254</span>     isValid=<span class="keyword">true</span>;</div>
+<div class="line"><a name="l00255"></a><span class="lineno">  255</span>       }</div>
+<div class="line"><a name="l00256"></a><span class="lineno">  256</span>     }</div>
+<div class="line"><a name="l00257"></a><span class="lineno">  257</span>   }</div>
+<div class="line"><a name="l00258"></a><span class="lineno">  258</span>   <span class="keywordflow">if</span>(isValid)</div>
+<div class="line"><a name="l00259"></a><span class="lineno">  259</span>     <span class="keywordflow">return</span> tmpIt;</div>
+<div class="line"><a name="l00260"></a><span class="lineno">  260</span>   <span class="keywordflow">else</span> <span class="keywordflow">if</span>(m_noDataValues.size())</div>
+<div class="line"><a name="l00261"></a><span class="lineno">  261</span>     <span class="keywordflow">return</span> m_noDataValues[0];</div>
+<div class="line"><a name="l00262"></a><span class="lineno">  262</span>   <span class="keywordflow">else</span>{</div>
+<div class="line"><a name="l00263"></a><span class="lineno">  263</span>     std::string errorString=<span class="stringliteral">"Error: no valid data found"</span>;</div>
+<div class="line"><a name="l00264"></a><span class="lineno">  264</span>     <span class="keywordflow">throw</span>(errorString);</div>
+<div class="line"><a name="l00265"></a><span class="lineno">  265</span>   }</div>
+<div class="line"><a name="l00266"></a><span class="lineno">  266</span> }</div>
+<div class="line"><a name="l00267"></a><span class="lineno">  267</span> </div>
+<div class="line"><a name="l00268"></a><span class="lineno">  268</span> <span class="keyword">template</span><<span class="keyword">class</span> T> <span class="keyword">inline</span>  <span class="keyword">typename</span> std::vector<T>::const_iterator StatFactory::mymin(<span class="keyword">const</span> std::vector<T>& v, <span class="keyword">typename</span> std::vector<T>::const_iterator begin, <span class="keyword">typename</span> std::vector<T& [...]
+<div class="line"><a name="l00269"></a><span class="lineno">  269</span> <span class="keyword"></span>{</div>
+<div class="line"><a name="l00270"></a><span class="lineno">  270</span>   <span class="keywordtype">bool</span> isValid=<span class="keyword">false</span>;</div>
+<div class="line"><a name="l00271"></a><span class="lineno">  271</span>   <span class="keyword">typename</span> std::vector<T>::const_iterator tmpIt;</div>
+<div class="line"><a name="l00272"></a><span class="lineno">  272</span>   T minValue=minConstraint;</div>
+<div class="line"><a name="l00273"></a><span class="lineno">  273</span>   <span class="keywordflow">for</span> (<span class="keyword">typename</span> std::vector<T>::const_iterator it = begin; it!=end; ++it){</div>
+<div class="line"><a name="l00274"></a><span class="lineno">  274</span>     <span class="keywordflow">if</span>(isNoData(*it))</div>
+<div class="line"><a name="l00275"></a><span class="lineno">  275</span>       <span class="keywordflow">continue</span>;</div>
+<div class="line"><a name="l00276"></a><span class="lineno">  276</span>     <span class="keywordflow">if</span>(isValid){</div>
+<div class="line"><a name="l00277"></a><span class="lineno">  277</span>       <span class="keywordflow">if</span>((minConstraint<=*it)&&(*it<=minValue)){</div>
+<div class="line"><a name="l00278"></a><span class="lineno">  278</span>     tmpIt=it;</div>
+<div class="line"><a name="l00279"></a><span class="lineno">  279</span>     minValue=*it;</div>
+<div class="line"><a name="l00280"></a><span class="lineno">  280</span>       }</div>
+<div class="line"><a name="l00281"></a><span class="lineno">  281</span>     }</div>
+<div class="line"><a name="l00282"></a><span class="lineno">  282</span>     <span class="keywordflow">else</span>{</div>
+<div class="line"><a name="l00283"></a><span class="lineno">  283</span>       isValid=<span class="keyword">true</span>;</div>
+<div class="line"><a name="l00284"></a><span class="lineno">  284</span>       tmpIt=it;</div>
+<div class="line"><a name="l00285"></a><span class="lineno">  285</span>       minValue=*it;</div>
+<div class="line"><a name="l00286"></a><span class="lineno">  286</span>     }    </div>
+<div class="line"><a name="l00287"></a><span class="lineno">  287</span>   }</div>
+<div class="line"><a name="l00288"></a><span class="lineno">  288</span>   <span class="keywordflow">if</span>(isValid)</div>
+<div class="line"><a name="l00289"></a><span class="lineno">  289</span>     <span class="keywordflow">return</span> tmpIt;</div>
+<div class="line"><a name="l00290"></a><span class="lineno">  290</span>   <span class="keywordflow">else</span> <span class="keywordflow">if</span>(m_noDataValues.size())</div>
+<div class="line"><a name="l00291"></a><span class="lineno">  291</span>     <span class="keywordflow">return</span> m_noDataValues[0];</div>
+<div class="line"><a name="l00292"></a><span class="lineno">  292</span>   <span class="keywordflow">else</span>{</div>
+<div class="line"><a name="l00293"></a><span class="lineno">  293</span>     std::string errorString=<span class="stringliteral">"Error: no valid data found"</span>;</div>
+<div class="line"><a name="l00294"></a><span class="lineno">  294</span>     <span class="keywordflow">throw</span>(errorString);</div>
 <div class="line"><a name="l00295"></a><span class="lineno">  295</span>   }</div>
-<div class="line"><a name="l00296"></a><span class="lineno">  296</span>   <span class="keywordflow">if</span>(isValid)</div>
-<div class="line"><a name="l00297"></a><span class="lineno">  297</span>     <span class="keywordflow">return</span> tmpIt;</div>
-<div class="line"><a name="l00298"></a><span class="lineno">  298</span>   <span class="keywordflow">else</span> <span class="keywordflow">if</span>(m_noDataValues.size())</div>
-<div class="line"><a name="l00299"></a><span class="lineno">  299</span>     <span class="keywordflow">return</span> m_noDataValues[0];</div>
-<div class="line"><a name="l00300"></a><span class="lineno">  300</span>   <span class="keywordflow">else</span>{</div>
-<div class="line"><a name="l00301"></a><span class="lineno">  301</span>     std::string errorString=<span class="stringliteral">"Error: no valid data found"</span>;</div>
-<div class="line"><a name="l00302"></a><span class="lineno">  302</span>     <span class="keywordflow">throw</span>(errorString);</div>
-<div class="line"><a name="l00303"></a><span class="lineno">  303</span>   }</div>
-<div class="line"><a name="l00304"></a><span class="lineno">  304</span> }</div>
-<div class="line"><a name="l00305"></a><span class="lineno">  305</span> </div>
-<div class="line"><a name="l00306"></a><span class="lineno">  306</span> <span class="keyword">template</span><<span class="keyword">class</span> T> <span class="keyword">inline</span> <span class="keyword">typename</span> std::vector<T>::const_iterator StatFactory::mymax(<span class="keyword">const</span> std::vector<T>& v, <span class="keyword">typename</span> std::vector<T>::const_iterator begin, <span class="keyword">typename</span> std::vector<T&g [...]
-<div class="line"><a name="l00307"></a><span class="lineno">  307</span> <span class="keyword"></span>{</div>
-<div class="line"><a name="l00308"></a><span class="lineno">  308</span>   <span class="keywordtype">bool</span> isValid=<span class="keyword">false</span>;</div>
-<div class="line"><a name="l00309"></a><span class="lineno">  309</span>   <span class="keyword">typename</span> std::vector<T>::const_iterator tmpIt=begin;</div>
-<div class="line"><a name="l00310"></a><span class="lineno">  310</span>   <span class="keywordflow">for</span> (<span class="keyword">typename</span> std::vector<T>::iterator it = begin; it!=end; ++it){</div>
-<div class="line"><a name="l00311"></a><span class="lineno">  311</span>     <span class="keywordflow">if</span>(isNoData(*it))</div>
-<div class="line"><a name="l00312"></a><span class="lineno">  312</span>       <span class="keywordflow">continue</span>;</div>
-<div class="line"><a name="l00313"></a><span class="lineno">  313</span>     isValid=<span class="keyword">true</span>;</div>
-<div class="line"><a name="l00314"></a><span class="lineno">  314</span>     <span class="keywordflow">if</span>(*tmpIt<*it)</div>
-<div class="line"><a name="l00315"></a><span class="lineno">  315</span>       tmpIt=it;</div>
-<div class="line"><a name="l00316"></a><span class="lineno">  316</span>   }</div>
-<div class="line"><a name="l00317"></a><span class="lineno">  317</span>   <span class="keywordflow">if</span>(isValid)</div>
-<div class="line"><a name="l00318"></a><span class="lineno">  318</span>     <span class="keywordflow">return</span> tmpIt;</div>
-<div class="line"><a name="l00319"></a><span class="lineno">  319</span>   <span class="keywordflow">else</span> <span class="keywordflow">if</span>(m_noDataValues.size())</div>
-<div class="line"><a name="l00320"></a><span class="lineno">  320</span>     <span class="keywordflow">return</span> m_noDataValues[0];</div>
-<div class="line"><a name="l00321"></a><span class="lineno">  321</span>   <span class="keywordflow">else</span>{</div>
-<div class="line"><a name="l00322"></a><span class="lineno">  322</span>     std::string errorString=<span class="stringliteral">"Error: no valid data found"</span>;</div>
-<div class="line"><a name="l00323"></a><span class="lineno">  323</span>     <span class="keywordflow">throw</span>(errorString);</div>
-<div class="line"><a name="l00324"></a><span class="lineno">  324</span>   }</div>
-<div class="line"><a name="l00325"></a><span class="lineno">  325</span> }</div>
-<div class="line"><a name="l00326"></a><span class="lineno">  326</span> </div>
-<div class="line"><a name="l00327"></a><span class="lineno">  327</span> <span class="keyword">template</span><<span class="keyword">class</span> T> <span class="keyword">inline</span> <span class="keyword">typename</span> std::vector<T>::iterator StatFactory::mymax(<span class="keyword">const</span> std::vector<T>& v, <span class="keyword">typename</span> std::vector<T>::iterator begin, <span class="keyword">typename</span> std::vector<T>::iterator [...]
-<div class="line"><a name="l00328"></a><span class="lineno">  328</span> <span class="keyword"></span>{</div>
-<div class="line"><a name="l00329"></a><span class="lineno">  329</span>   <span class="keywordtype">bool</span> isValid=<span class="keyword">false</span>;</div>
-<div class="line"><a name="l00330"></a><span class="lineno">  330</span>   <span class="keyword">typename</span> std::vector<T>::iterator tmpIt=begin;</div>
-<div class="line"><a name="l00331"></a><span class="lineno">  331</span>   <span class="keywordflow">for</span> (<span class="keyword">typename</span> std::vector<T>::iterator it = begin; it!=end; ++it){</div>
-<div class="line"><a name="l00332"></a><span class="lineno">  332</span>     <span class="keywordflow">if</span>(isNoData(*it))</div>
-<div class="line"><a name="l00333"></a><span class="lineno">  333</span>       <span class="keywordflow">continue</span>;</div>
-<div class="line"><a name="l00334"></a><span class="lineno">  334</span>     isValid=<span class="keyword">true</span>;</div>
-<div class="line"><a name="l00335"></a><span class="lineno">  335</span>     <span class="keywordflow">if</span>(*tmpIt<*it)</div>
-<div class="line"><a name="l00336"></a><span class="lineno">  336</span>       tmpIt=it;</div>
-<div class="line"><a name="l00337"></a><span class="lineno">  337</span>   }</div>
-<div class="line"><a name="l00338"></a><span class="lineno">  338</span>   <span class="keywordflow">if</span>(isValid)</div>
-<div class="line"><a name="l00339"></a><span class="lineno">  339</span>     <span class="keywordflow">return</span> tmpIt;</div>
-<div class="line"><a name="l00340"></a><span class="lineno">  340</span>   <span class="keywordflow">else</span></div>
-<div class="line"><a name="l00341"></a><span class="lineno">  341</span>     <span class="keywordflow">return</span> end;</div>
-<div class="line"><a name="l00342"></a><span class="lineno">  342</span> }</div>
-<div class="line"><a name="l00343"></a><span class="lineno">  343</span> </div>
-<div class="line"><a name="l00344"></a><span class="lineno">  344</span> <span class="keyword">template</span><<span class="keyword">class</span> T> <span class="keyword">inline</span> <span class="keyword">typename</span> std::vector<T>::const_iterator StatFactory::mymax(<span class="keyword">const</span> std::vector<T>& v, <span class="keyword">typename</span> std::vector<T>::const_iterator begin, <span class="keyword">typename</span> std::vector<T&g [...]
-<div class="line"><a name="l00345"></a><span class="lineno">  345</span> <span class="keyword"></span>{</div>
-<div class="line"><a name="l00346"></a><span class="lineno">  346</span>   <span class="keywordtype">bool</span> isValid=<span class="keyword">false</span>;</div>
-<div class="line"><a name="l00347"></a><span class="lineno">  347</span>   <span class="keyword">typename</span> std::vector<T>::const_iterator tmpIt=v.end();</div>
-<div class="line"><a name="l00348"></a><span class="lineno">  348</span>   T maxValue=maxConstraint;</div>
-<div class="line"><a name="l00349"></a><span class="lineno">  349</span>   <span class="keywordflow">for</span> (<span class="keyword">typename</span> std::vector<T>::const_iterator it = begin; it!=end; ++it){</div>
-<div class="line"><a name="l00350"></a><span class="lineno">  350</span>     <span class="keywordflow">if</span>(isNoData(*it))</div>
-<div class="line"><a name="l00351"></a><span class="lineno">  351</span>       <span class="keywordflow">continue</span>;</div>
-<div class="line"><a name="l00352"></a><span class="lineno">  352</span>     isValid=<span class="keyword">true</span>;</div>
-<div class="line"><a name="l00353"></a><span class="lineno">  353</span>     <span class="keywordflow">if</span>((maxValue<=*it)&&(*it<=maxConstraint)){</div>
-<div class="line"><a name="l00354"></a><span class="lineno">  354</span>       tmpIt=it;</div>
-<div class="line"><a name="l00355"></a><span class="lineno">  355</span>       maxValue=*it;</div>
-<div class="line"><a name="l00356"></a><span class="lineno">  356</span>     }</div>
-<div class="line"><a name="l00357"></a><span class="lineno">  357</span>   }</div>
-<div class="line"><a name="l00358"></a><span class="lineno">  358</span>   <span class="keywordflow">if</span>(isValid)</div>
-<div class="line"><a name="l00359"></a><span class="lineno">  359</span>     <span class="keywordflow">return</span> tmpIt;</div>
-<div class="line"><a name="l00360"></a><span class="lineno">  360</span>   <span class="keywordflow">else</span>  </div>
-<div class="line"><a name="l00361"></a><span class="lineno">  361</span>     <span class="keywordflow">return</span> end;</div>
-<div class="line"><a name="l00362"></a><span class="lineno">  362</span> }</div>
-<div class="line"><a name="l00363"></a><span class="lineno">  363</span> </div>
-<div class="line"><a name="l00364"></a><span class="lineno">  364</span> <span class="keyword">template</span><<span class="keyword">class</span> T> <span class="keyword">inline</span> <span class="keyword">typename</span> std::vector<T>::iterator StatFactory::mymax(<span class="keyword">const</span> std::vector<T>& v, <span class="keyword">typename</span> std::vector<T>::iterator begin, <span class="keyword">typename</span> std::vector<T>::iterator [...]
-<div class="line"><a name="l00365"></a><span class="lineno">  365</span> <span class="keyword"></span>{</div>
-<div class="line"><a name="l00366"></a><span class="lineno">  366</span>   <span class="keywordtype">bool</span> isValid=<span class="keyword">false</span>;</div>
-<div class="line"><a name="l00367"></a><span class="lineno">  367</span>   <span class="keyword">typename</span> std::vector<T>::iterator tmpIt=v.end();</div>
-<div class="line"><a name="l00368"></a><span class="lineno">  368</span>   T maxValue=maxConstraint;</div>
-<div class="line"><a name="l00369"></a><span class="lineno">  369</span>   <span class="keywordflow">for</span> (<span class="keyword">typename</span> std::vector<T>::const_iterator it = begin; it!=end; ++it){</div>
-<div class="line"><a name="l00370"></a><span class="lineno">  370</span>     <span class="keywordflow">if</span>(isNoData(*it))</div>
-<div class="line"><a name="l00371"></a><span class="lineno">  371</span>       <span class="keywordflow">continue</span>;</div>
-<div class="line"><a name="l00372"></a><span class="lineno">  372</span>     isValid=<span class="keyword">true</span>;</div>
-<div class="line"><a name="l00373"></a><span class="lineno">  373</span>     <span class="keywordflow">if</span>((maxValue<=*it)&&(*it<=maxConstraint)){</div>
-<div class="line"><a name="l00374"></a><span class="lineno">  374</span>       tmpIt=it;</div>
-<div class="line"><a name="l00375"></a><span class="lineno">  375</span>       maxValue=*it;</div>
-<div class="line"><a name="l00376"></a><span class="lineno">  376</span>     }</div>
-<div class="line"><a name="l00377"></a><span class="lineno">  377</span>   }</div>
-<div class="line"><a name="l00378"></a><span class="lineno">  378</span>   <span class="keywordflow">if</span>(isValid)</div>
-<div class="line"><a name="l00379"></a><span class="lineno">  379</span>     <span class="keywordflow">return</span> tmpIt;</div>
-<div class="line"><a name="l00380"></a><span class="lineno">  380</span>   <span class="keywordflow">else</span>  </div>
-<div class="line"><a name="l00381"></a><span class="lineno">  381</span>     <span class="keywordflow">return</span> end;</div>
-<div class="line"><a name="l00382"></a><span class="lineno">  382</span> }</div>
-<div class="line"><a name="l00383"></a><span class="lineno">  383</span> </div>
-<div class="line"><a name="l00384"></a><span class="lineno">  384</span> <span class="keyword">template</span><<span class="keyword">class</span> T> <span class="keyword">inline</span> T StatFactory::mymin(<span class="keyword">const</span> std::vector<T>& v)<span class="keyword"> const</span></div>
-<div class="line"><a name="l00385"></a><span class="lineno">  385</span> <span class="keyword"></span>{</div>
-<div class="line"><a name="l00386"></a><span class="lineno">  386</span>   <span class="keywordtype">bool</span> isValid=<span class="keyword">false</span>;</div>
-<div class="line"><a name="l00387"></a><span class="lineno">  387</span>   <span class="keywordflow">if</span>(v.empty()){</div>
-<div class="line"><a name="l00388"></a><span class="lineno">  388</span>     std::string errorString=<span class="stringliteral">"Error: vector is empty"</span>;</div>
-<div class="line"><a name="l00389"></a><span class="lineno">  389</span>     <span class="keywordflow">throw</span>(errorString);</div>
-<div class="line"><a name="l00390"></a><span class="lineno">  390</span>   }</div>
-<div class="line"><a name="l00391"></a><span class="lineno">  391</span>   T minValue=*(v.begin());</div>
-<div class="line"><a name="l00392"></a><span class="lineno">  392</span>   <span class="keywordflow">for</span> (<span class="keyword">typename</span> std::vector<T>::const_iterator it = v.begin(); it!=v.end(); ++it){</div>
-<div class="line"><a name="l00393"></a><span class="lineno">  393</span>     <span class="keywordflow">if</span>(isNoData(*it))</div>
-<div class="line"><a name="l00394"></a><span class="lineno">  394</span>       <span class="keywordflow">continue</span>;</div>
-<div class="line"><a name="l00395"></a><span class="lineno">  395</span>     isValid=<span class="keyword">true</span>;</div>
-<div class="line"><a name="l00396"></a><span class="lineno">  396</span>     <span class="keywordflow">if</span>(minValue>*it)</div>
-<div class="line"><a name="l00397"></a><span class="lineno">  397</span>       minValue=*it;</div>
-<div class="line"><a name="l00398"></a><span class="lineno">  398</span>   }</div>
-<div class="line"><a name="l00399"></a><span class="lineno">  399</span>   <span class="keywordflow">if</span>(isValid)</div>
-<div class="line"><a name="l00400"></a><span class="lineno">  400</span>     <span class="keywordflow">return</span> minValue;</div>
-<div class="line"><a name="l00401"></a><span class="lineno">  401</span>   <span class="keywordflow">else</span> <span class="keywordflow">if</span>(m_noDataValues.size())</div>
-<div class="line"><a name="l00402"></a><span class="lineno">  402</span>     <span class="keywordflow">return</span> m_noDataValues[0];</div>
-<div class="line"><a name="l00403"></a><span class="lineno">  403</span>   <span class="keywordflow">else</span>{</div>
-<div class="line"><a name="l00404"></a><span class="lineno">  404</span>     std::string errorString=<span class="stringliteral">"Error: no valid data found"</span>;</div>
-<div class="line"><a name="l00405"></a><span class="lineno">  405</span>     <span class="keywordflow">throw</span>(errorString);</div>
-<div class="line"><a name="l00406"></a><span class="lineno">  406</span>   }</div>
-<div class="line"><a name="l00407"></a><span class="lineno">  407</span> }</div>
-<div class="line"><a name="l00408"></a><span class="lineno">  408</span> </div>
-<div class="line"><a name="l00409"></a><span class="lineno">  409</span>  <span class="keyword">template</span><<span class="keyword">class</span> T> <span class="keyword">inline</span> T StatFactory::mymin(<span class="keyword">const</span> std::vector<T>& v, T minConstraint)<span class="keyword"> const</span></div>
-<div class="line"><a name="l00410"></a><span class="lineno">  410</span> <span class="keyword"></span>{</div>
-<div class="line"><a name="l00411"></a><span class="lineno">  411</span>   <span class="keywordtype">bool</span> isValid=<span class="keyword">false</span>;</div>
-<div class="line"><a name="l00412"></a><span class="lineno">  412</span>   T minValue=minConstraint;</div>
-<div class="line"><a name="l00413"></a><span class="lineno">  413</span>   <span class="keywordflow">for</span> (<span class="keyword">typename</span> std::vector<T>::const_iterator it = v.begin(); it!=v.end(); ++it){</div>
-<div class="line"><a name="l00414"></a><span class="lineno">  414</span>     <span class="keywordflow">if</span>(isNoData(*it))</div>
-<div class="line"><a name="l00415"></a><span class="lineno">  415</span>       <span class="keywordflow">continue</span>;</div>
-<div class="line"><a name="l00416"></a><span class="lineno">  416</span>     isValid=<span class="keyword">true</span>;</div>
-<div class="line"><a name="l00417"></a><span class="lineno">  417</span>     <span class="keywordflow">if</span>((minConstraint<=*it)&&(*it<=minValue))</div>
-<div class="line"><a name="l00418"></a><span class="lineno">  418</span>       minValue=*it;</div>
-<div class="line"><a name="l00419"></a><span class="lineno">  419</span>   }</div>
-<div class="line"><a name="l00420"></a><span class="lineno">  420</span>   <span class="keywordflow">if</span>(isValid)</div>
-<div class="line"><a name="l00421"></a><span class="lineno">  421</span>     <span class="keywordflow">return</span> minValue;</div>
-<div class="line"><a name="l00422"></a><span class="lineno">  422</span>   <span class="keywordflow">else</span> <span class="keywordflow">if</span>(m_noDataValues.size())</div>
-<div class="line"><a name="l00423"></a><span class="lineno">  423</span>     <span class="keywordflow">return</span> m_noDataValues[0];</div>
-<div class="line"><a name="l00424"></a><span class="lineno">  424</span>   <span class="keywordflow">else</span>{</div>
-<div class="line"><a name="l00425"></a><span class="lineno">  425</span>     std::string errorString=<span class="stringliteral">"Error: no valid data found"</span>;</div>
-<div class="line"><a name="l00426"></a><span class="lineno">  426</span>     <span class="keywordflow">throw</span>(errorString);</div>
-<div class="line"><a name="l00427"></a><span class="lineno">  427</span>   }</div>
-<div class="line"><a name="l00428"></a><span class="lineno">  428</span> }</div>
-<div class="line"><a name="l00429"></a><span class="lineno">  429</span> </div>
-<div class="line"><a name="l00430"></a><span class="lineno">  430</span> <span class="keyword">template</span><<span class="keyword">class</span> T> <span class="keyword">inline</span> T StatFactory::mymax(<span class="keyword">const</span> std::vector<T>& v)<span class="keyword"> const</span></div>
-<div class="line"><a name="l00431"></a><span class="lineno">  431</span> <span class="keyword"></span>{</div>
-<div class="line"><a name="l00432"></a><span class="lineno">  432</span>   <span class="keywordtype">bool</span> isValid=<span class="keyword">false</span>;</div>
-<div class="line"><a name="l00433"></a><span class="lineno">  433</span>   <span class="keywordflow">if</span>(v.empty()){</div>
-<div class="line"><a name="l00434"></a><span class="lineno">  434</span>     std::string errorString=<span class="stringliteral">"Error: vector is empty"</span>;</div>
-<div class="line"><a name="l00435"></a><span class="lineno">  435</span>     <span class="keywordflow">throw</span>(errorString);</div>
-<div class="line"><a name="l00436"></a><span class="lineno">  436</span>   }</div>
-<div class="line"><a name="l00437"></a><span class="lineno">  437</span>   T maxValue=*(v.begin());</div>
-<div class="line"><a name="l00438"></a><span class="lineno">  438</span>   <span class="keywordflow">for</span> (<span class="keyword">typename</span> std::vector<T>::const_iterator it = v.begin(); it!=v.end(); ++it){</div>
-<div class="line"><a name="l00439"></a><span class="lineno">  439</span>     <span class="keywordflow">if</span>(isNoData(*it))</div>
-<div class="line"><a name="l00440"></a><span class="lineno">  440</span>       <span class="keywordflow">continue</span>;</div>
-<div class="line"><a name="l00441"></a><span class="lineno">  441</span>     isValid=<span class="keyword">true</span>;</div>
-<div class="line"><a name="l00442"></a><span class="lineno">  442</span>     <span class="keywordflow">if</span>(maxValue<*it)</div>
-<div class="line"><a name="l00443"></a><span class="lineno">  443</span>       maxValue=*it;</div>
-<div class="line"><a name="l00444"></a><span class="lineno">  444</span>   }</div>
-<div class="line"><a name="l00445"></a><span class="lineno">  445</span>   <span class="keywordflow">if</span>(isValid)</div>
-<div class="line"><a name="l00446"></a><span class="lineno">  446</span>     <span class="keywordflow">return</span> maxValue;</div>
-<div class="line"><a name="l00447"></a><span class="lineno">  447</span>   <span class="keywordflow">else</span> <span class="keywordflow">if</span>(m_noDataValues.size())</div>
-<div class="line"><a name="l00448"></a><span class="lineno">  448</span>     <span class="keywordflow">return</span> m_noDataValues[0];</div>
-<div class="line"><a name="l00449"></a><span class="lineno">  449</span>   <span class="keywordflow">else</span>{</div>
-<div class="line"><a name="l00450"></a><span class="lineno">  450</span>     std::string errorString=<span class="stringliteral">"Error: no valid data found"</span>;</div>
-<div class="line"><a name="l00451"></a><span class="lineno">  451</span>     <span class="keywordflow">throw</span>(errorString);</div>
-<div class="line"><a name="l00452"></a><span class="lineno">  452</span>   }</div>
-<div class="line"><a name="l00453"></a><span class="lineno">  453</span> }</div>
-<div class="line"><a name="l00454"></a><span class="lineno">  454</span> </div>
-<div class="line"><a name="l00455"></a><span class="lineno">  455</span> <span class="keyword">template</span><<span class="keyword">class</span> T> <span class="keyword">inline</span> T StatFactory::mymax(<span class="keyword">const</span> std::vector<T>& v, T maxConstraint)<span class="keyword"> const</span></div>
-<div class="line"><a name="l00456"></a><span class="lineno">  456</span> <span class="keyword"></span>{</div>
-<div class="line"><a name="l00457"></a><span class="lineno">  457</span>   <span class="keywordtype">bool</span> isValid=<span class="keyword">false</span>;</div>
-<div class="line"><a name="l00458"></a><span class="lineno">  458</span>   T maxValue=maxConstraint;</div>
-<div class="line"><a name="l00459"></a><span class="lineno">  459</span>   <span class="keywordflow">for</span> (<span class="keyword">typename</span> std::vector<T>::const_iterator it = v.begin(); it!=v.end(); ++it){</div>
-<div class="line"><a name="l00460"></a><span class="lineno">  460</span>     <span class="keywordflow">if</span>(isNoData(*it))</div>
-<div class="line"><a name="l00461"></a><span class="lineno">  461</span>       <span class="keywordflow">continue</span>;</div>
-<div class="line"><a name="l00462"></a><span class="lineno">  462</span>     <span class="keywordflow">if</span>((maxValue<=*it)&&(*it<=maxConstraint))</div>
-<div class="line"><a name="l00463"></a><span class="lineno">  463</span>       maxValue=*it;</div>
-<div class="line"><a name="l00464"></a><span class="lineno">  464</span>   }</div>
-<div class="line"><a name="l00465"></a><span class="lineno">  465</span>   <span class="keywordflow">if</span>(isValid)</div>
-<div class="line"><a name="l00466"></a><span class="lineno">  466</span>     <span class="keywordflow">return</span> maxValue;</div>
-<div class="line"><a name="l00467"></a><span class="lineno">  467</span>   <span class="keywordflow">else</span> <span class="keywordflow">if</span>(m_noDataValues.size())</div>
-<div class="line"><a name="l00468"></a><span class="lineno">  468</span>     <span class="keywordflow">return</span> m_noDataValues[0];</div>
-<div class="line"><a name="l00469"></a><span class="lineno">  469</span>   <span class="keywordflow">else</span>{</div>
-<div class="line"><a name="l00470"></a><span class="lineno">  470</span>     std::string errorString=<span class="stringliteral">"Error: no valid data found"</span>;</div>
-<div class="line"><a name="l00471"></a><span class="lineno">  471</span>     <span class="keywordflow">throw</span>(errorString);</div>
-<div class="line"><a name="l00472"></a><span class="lineno">  472</span>   }</div>
-<div class="line"><a name="l00473"></a><span class="lineno">  473</span> }</div>
-<div class="line"><a name="l00474"></a><span class="lineno">  474</span> </div>
-<div class="line"><a name="l00475"></a><span class="lineno">  475</span> <span class="keyword">template</span><<span class="keyword">class</span> T> <span class="keyword">inline</span> <span class="keyword">typename</span> std::vector<T>::const_iterator StatFactory::absmax(<span class="keyword">const</span> std::vector<T>& v, <span class="keyword">typename</span> std::vector<T>::const_iterator begin, <span class="keyword">typename</span> std::vector<T& [...]
-<div class="line"><a name="l00476"></a><span class="lineno">  476</span> <span class="keyword"></span>{</div>
-<div class="line"><a name="l00477"></a><span class="lineno">  477</span>   <span class="keywordtype">bool</span> isValid=<span class="keyword">false</span>;</div>
-<div class="line"><a name="l00478"></a><span class="lineno">  478</span>   <span class="keyword">typename</span> std::vector<T>::const_iterator tmpIt=begin;</div>
-<div class="line"><a name="l00479"></a><span class="lineno">  479</span>   <span class="keywordflow">for</span> (<span class="keyword">typename</span> std::vector<T>::const_iterator it = begin; it!=end; ++it){</div>
-<div class="line"><a name="l00480"></a><span class="lineno">  480</span>     <span class="keywordflow">if</span>(isNoData(*it))</div>
-<div class="line"><a name="l00481"></a><span class="lineno">  481</span>       <span class="keywordflow">continue</span>;</div>
-<div class="line"><a name="l00482"></a><span class="lineno">  482</span>     isValid=<span class="keyword">true</span>;</div>
-<div class="line"><a name="l00483"></a><span class="lineno">  483</span>     <span class="keywordflow">if</span>(abs(*tmpIt)<abs(*it))</div>
-<div class="line"><a name="l00484"></a><span class="lineno">  484</span>       tmpIt=it;</div>
+<div class="line"><a name="l00296"></a><span class="lineno">  296</span> }</div>
+<div class="line"><a name="l00297"></a><span class="lineno">  297</span> </div>
+<div class="line"><a name="l00298"></a><span class="lineno">  298</span> <span class="keyword">template</span><<span class="keyword">class</span> T> <span class="keyword">inline</span> <span class="keyword">typename</span> std::vector<T>::iterator StatFactory::mymin(<span class="keyword">const</span> std::vector<T>& v, <span class="keyword">typename</span> std::vector<T>::iterator begin, <span class="keyword">typename</span> std::vector<T>::iterator [...]
+<div class="line"><a name="l00299"></a><span class="lineno">  299</span> <span class="keyword"></span>{</div>
+<div class="line"><a name="l00300"></a><span class="lineno">  300</span>   <span class="keywordtype">bool</span> isValid=<span class="keyword">false</span>;</div>
+<div class="line"><a name="l00301"></a><span class="lineno">  301</span>   <span class="keyword">typename</span> std::vector<T>::iterator tmpIt;</div>
+<div class="line"><a name="l00302"></a><span class="lineno">  302</span>   T minValue=minConstraint;</div>
+<div class="line"><a name="l00303"></a><span class="lineno">  303</span>   <span class="keywordflow">for</span> (<span class="keyword">typename</span> std::vector<T>::const_iterator it = begin; it!=end; ++it){</div>
+<div class="line"><a name="l00304"></a><span class="lineno">  304</span>     <span class="keywordflow">if</span>(isNoData(*it))</div>
+<div class="line"><a name="l00305"></a><span class="lineno">  305</span>       <span class="keywordflow">continue</span>;</div>
+<div class="line"><a name="l00306"></a><span class="lineno">  306</span>     <span class="keywordflow">if</span>(isValid){</div>
+<div class="line"><a name="l00307"></a><span class="lineno">  307</span>       <span class="keywordflow">if</span>((minConstraint<=*it)&&(*it<=minValue)){</div>
+<div class="line"><a name="l00308"></a><span class="lineno">  308</span>     tmpIt=it;</div>
+<div class="line"><a name="l00309"></a><span class="lineno">  309</span>     minValue=*it;</div>
+<div class="line"><a name="l00310"></a><span class="lineno">  310</span>       }</div>
+<div class="line"><a name="l00311"></a><span class="lineno">  311</span>     }</div>
+<div class="line"><a name="l00312"></a><span class="lineno">  312</span>     <span class="keywordflow">else</span>{</div>
+<div class="line"><a name="l00313"></a><span class="lineno">  313</span>       isValid=<span class="keyword">true</span>;</div>
+<div class="line"><a name="l00314"></a><span class="lineno">  314</span>       tmpIt=it;</div>
+<div class="line"><a name="l00315"></a><span class="lineno">  315</span>       minValue=*it;</div>
+<div class="line"><a name="l00316"></a><span class="lineno">  316</span>     }    </div>
+<div class="line"><a name="l00317"></a><span class="lineno">  317</span>   }</div>
+<div class="line"><a name="l00318"></a><span class="lineno">  318</span>   <span class="keywordflow">if</span>(isValid)</div>
+<div class="line"><a name="l00319"></a><span class="lineno">  319</span>     <span class="keywordflow">return</span> tmpIt;</div>
+<div class="line"><a name="l00320"></a><span class="lineno">  320</span>   <span class="keywordflow">else</span> <span class="keywordflow">if</span>(m_noDataValues.size())</div>
+<div class="line"><a name="l00321"></a><span class="lineno">  321</span>     <span class="keywordflow">return</span> m_noDataValues[0];</div>
+<div class="line"><a name="l00322"></a><span class="lineno">  322</span>   <span class="keywordflow">else</span>{</div>
+<div class="line"><a name="l00323"></a><span class="lineno">  323</span>     std::string errorString=<span class="stringliteral">"Error: no valid data found"</span>;</div>
+<div class="line"><a name="l00324"></a><span class="lineno">  324</span>     <span class="keywordflow">throw</span>(errorString);</div>
+<div class="line"><a name="l00325"></a><span class="lineno">  325</span>   }</div>
+<div class="line"><a name="l00326"></a><span class="lineno">  326</span> }</div>
+<div class="line"><a name="l00327"></a><span class="lineno">  327</span> </div>
+<div class="line"><a name="l00328"></a><span class="lineno">  328</span> <span class="keyword">template</span><<span class="keyword">class</span> T> <span class="keyword">inline</span> <span class="keyword">typename</span> std::vector<T>::const_iterator StatFactory::mymax(<span class="keyword">const</span> std::vector<T>& v, <span class="keyword">typename</span> std::vector<T>::const_iterator begin, <span class="keyword">typename</span> std::vector<T&g [...]
+<div class="line"><a name="l00329"></a><span class="lineno">  329</span> <span class="keyword"></span>{</div>
+<div class="line"><a name="l00330"></a><span class="lineno">  330</span>   <span class="keywordtype">bool</span> isValid=<span class="keyword">false</span>;</div>
+<div class="line"><a name="l00331"></a><span class="lineno">  331</span>   <span class="keyword">typename</span> std::vector<T>::const_iterator tmpIt;</div>
+<div class="line"><a name="l00332"></a><span class="lineno">  332</span>   <span class="keywordflow">for</span> (<span class="keyword">typename</span> std::vector<T>::iterator it = begin; it!=end; ++it){</div>
+<div class="line"><a name="l00333"></a><span class="lineno">  333</span>     <span class="keywordflow">if</span>(isNoData(*it))</div>
+<div class="line"><a name="l00334"></a><span class="lineno">  334</span>       <span class="keywordflow">continue</span>;</div>
+<div class="line"><a name="l00335"></a><span class="lineno">  335</span>     <span class="keywordflow">if</span>(isValid){</div>
+<div class="line"><a name="l00336"></a><span class="lineno">  336</span>       <span class="keywordflow">if</span>(*tmpIt<*it)</div>
+<div class="line"><a name="l00337"></a><span class="lineno">  337</span>     tmpIt=it;</div>
+<div class="line"><a name="l00338"></a><span class="lineno">  338</span>     }</div>
+<div class="line"><a name="l00339"></a><span class="lineno">  339</span>     <span class="keywordflow">else</span>{</div>
+<div class="line"><a name="l00340"></a><span class="lineno">  340</span>       tmpIt=it;</div>
+<div class="line"><a name="l00341"></a><span class="lineno">  341</span>       isValid=<span class="keyword">true</span>;</div>
+<div class="line"><a name="l00342"></a><span class="lineno">  342</span>     }</div>
+<div class="line"><a name="l00343"></a><span class="lineno">  343</span>   }</div>
+<div class="line"><a name="l00344"></a><span class="lineno">  344</span>   <span class="keywordflow">if</span>(isValid)</div>
+<div class="line"><a name="l00345"></a><span class="lineno">  345</span>     <span class="keywordflow">return</span> tmpIt;</div>
+<div class="line"><a name="l00346"></a><span class="lineno">  346</span>   <span class="keywordflow">else</span> <span class="keywordflow">if</span>(m_noDataValues.size())</div>
+<div class="line"><a name="l00347"></a><span class="lineno">  347</span>     <span class="keywordflow">return</span> m_noDataValues[0];</div>
+<div class="line"><a name="l00348"></a><span class="lineno">  348</span>   <span class="keywordflow">else</span>{</div>
+<div class="line"><a name="l00349"></a><span class="lineno">  349</span>     std::string errorString=<span class="stringliteral">"Error: no valid data found"</span>;</div>
+<div class="line"><a name="l00350"></a><span class="lineno">  350</span>     <span class="keywordflow">throw</span>(errorString);</div>
+<div class="line"><a name="l00351"></a><span class="lineno">  351</span>   }</div>
+<div class="line"><a name="l00352"></a><span class="lineno">  352</span> }</div>
+<div class="line"><a name="l00353"></a><span class="lineno">  353</span> </div>
+<div class="line"><a name="l00354"></a><span class="lineno">  354</span> <span class="keyword">template</span><<span class="keyword">class</span> T> <span class="keyword">inline</span> <span class="keyword">typename</span> std::vector<T>::iterator StatFactory::mymax(<span class="keyword">const</span> std::vector<T>& v, <span class="keyword">typename</span> std::vector<T>::iterator begin, <span class="keyword">typename</span> std::vector<T>::iterator [...]
+<div class="line"><a name="l00355"></a><span class="lineno">  355</span> <span class="keyword"></span>{</div>
+<div class="line"><a name="l00356"></a><span class="lineno">  356</span>   <span class="keywordtype">bool</span> isValid=<span class="keyword">false</span>;</div>
+<div class="line"><a name="l00357"></a><span class="lineno">  357</span>   <span class="keyword">typename</span> std::vector<T>::iterator tmpIt;</div>
+<div class="line"><a name="l00358"></a><span class="lineno">  358</span>   <span class="keywordflow">for</span> (<span class="keyword">typename</span> std::vector<T>::iterator it = begin; it!=end; ++it){</div>
+<div class="line"><a name="l00359"></a><span class="lineno">  359</span>     <span class="keywordflow">if</span>(isNoData(*it))</div>
+<div class="line"><a name="l00360"></a><span class="lineno">  360</span>       <span class="keywordflow">continue</span>;</div>
+<div class="line"><a name="l00361"></a><span class="lineno">  361</span>     <span class="keywordflow">if</span>(isValid){</div>
+<div class="line"><a name="l00362"></a><span class="lineno">  362</span>       <span class="keywordflow">if</span>(*tmpIt<*it)</div>
+<div class="line"><a name="l00363"></a><span class="lineno">  363</span>     tmpIt=it;</div>
+<div class="line"><a name="l00364"></a><span class="lineno">  364</span>     }</div>
+<div class="line"><a name="l00365"></a><span class="lineno">  365</span>     <span class="keywordflow">else</span>{</div>
+<div class="line"><a name="l00366"></a><span class="lineno">  366</span>       tmpIt=it;</div>
+<div class="line"><a name="l00367"></a><span class="lineno">  367</span>       isValid=<span class="keyword">true</span>;</div>
+<div class="line"><a name="l00368"></a><span class="lineno">  368</span>     }</div>
+<div class="line"><a name="l00369"></a><span class="lineno">  369</span>   }</div>
+<div class="line"><a name="l00370"></a><span class="lineno">  370</span>   <span class="keywordflow">if</span>(isValid)</div>
+<div class="line"><a name="l00371"></a><span class="lineno">  371</span>     <span class="keywordflow">return</span> tmpIt;</div>
+<div class="line"><a name="l00372"></a><span class="lineno">  372</span>   <span class="keywordflow">else</span></div>
+<div class="line"><a name="l00373"></a><span class="lineno">  373</span>     <span class="keywordflow">return</span> end;</div>
+<div class="line"><a name="l00374"></a><span class="lineno">  374</span> }</div>
+<div class="line"><a name="l00375"></a><span class="lineno">  375</span> </div>
+<div class="line"><a name="l00376"></a><span class="lineno">  376</span> <span class="keyword">template</span><<span class="keyword">class</span> T> <span class="keyword">inline</span> <span class="keyword">typename</span> std::vector<T>::const_iterator StatFactory::mymax(<span class="keyword">const</span> std::vector<T>& v, <span class="keyword">typename</span> std::vector<T>::const_iterator begin, <span class="keyword">typename</span> std::vector<T&g [...]
+<div class="line"><a name="l00377"></a><span class="lineno">  377</span> <span class="keyword"></span>{</div>
+<div class="line"><a name="l00378"></a><span class="lineno">  378</span>   <span class="keywordtype">bool</span> isValid=<span class="keyword">false</span>;</div>
+<div class="line"><a name="l00379"></a><span class="lineno">  379</span>   <span class="keyword">typename</span> std::vector<T>::const_iterator tmpIt;</div>
+<div class="line"><a name="l00380"></a><span class="lineno">  380</span>   T maxValue=maxConstraint;</div>
+<div class="line"><a name="l00381"></a><span class="lineno">  381</span>   <span class="keywordflow">for</span> (<span class="keyword">typename</span> std::vector<T>::const_iterator it = begin; it!=end; ++it){</div>
+<div class="line"><a name="l00382"></a><span class="lineno">  382</span>     <span class="keywordflow">if</span>(isNoData(*it))</div>
+<div class="line"><a name="l00383"></a><span class="lineno">  383</span>       <span class="keywordflow">continue</span>;</div>
+<div class="line"><a name="l00384"></a><span class="lineno">  384</span>     <span class="keywordflow">if</span>(isValid){</div>
+<div class="line"><a name="l00385"></a><span class="lineno">  385</span>       <span class="keywordflow">if</span>((maxConstraint>=*it)&&(*it>=maxValue)){</div>
+<div class="line"><a name="l00386"></a><span class="lineno">  386</span>     tmpIt=it;</div>
+<div class="line"><a name="l00387"></a><span class="lineno">  387</span>     maxValue=*it;</div>
+<div class="line"><a name="l00388"></a><span class="lineno">  388</span>       }</div>
+<div class="line"><a name="l00389"></a><span class="lineno">  389</span>     }</div>
+<div class="line"><a name="l00390"></a><span class="lineno">  390</span>     <span class="keywordflow">else</span>{</div>
+<div class="line"><a name="l00391"></a><span class="lineno">  391</span>       isValid=<span class="keyword">true</span>;</div>
+<div class="line"><a name="l00392"></a><span class="lineno">  392</span>       tmpIt=it;</div>
+<div class="line"><a name="l00393"></a><span class="lineno">  393</span>       maxValue=*it;</div>
+<div class="line"><a name="l00394"></a><span class="lineno">  394</span>     }    </div>
+<div class="line"><a name="l00395"></a><span class="lineno">  395</span>   }</div>
+<div class="line"><a name="l00396"></a><span class="lineno">  396</span>   <span class="keywordflow">if</span>(isValid)</div>
+<div class="line"><a name="l00397"></a><span class="lineno">  397</span>     <span class="keywordflow">return</span> tmpIt;</div>
+<div class="line"><a name="l00398"></a><span class="lineno">  398</span>   <span class="keywordflow">else</span>  </div>
+<div class="line"><a name="l00399"></a><span class="lineno">  399</span>     <span class="keywordflow">return</span> end;</div>
+<div class="line"><a name="l00400"></a><span class="lineno">  400</span> }</div>
+<div class="line"><a name="l00401"></a><span class="lineno">  401</span> </div>
+<div class="line"><a name="l00402"></a><span class="lineno">  402</span> <span class="keyword">template</span><<span class="keyword">class</span> T> <span class="keyword">inline</span> <span class="keyword">typename</span> std::vector<T>::iterator StatFactory::mymax(<span class="keyword">const</span> std::vector<T>& v, <span class="keyword">typename</span> std::vector<T>::iterator begin, <span class="keyword">typename</span> std::vector<T>::iterator [...]
+<div class="line"><a name="l00403"></a><span class="lineno">  403</span> <span class="keyword"></span>{</div>
+<div class="line"><a name="l00404"></a><span class="lineno">  404</span>   <span class="keywordtype">bool</span> isValid=<span class="keyword">false</span>;</div>
+<div class="line"><a name="l00405"></a><span class="lineno">  405</span>   <span class="keyword">typename</span> std::vector<T>::iterator tmpIt=v.end();</div>
+<div class="line"><a name="l00406"></a><span class="lineno">  406</span>   T maxValue=maxConstraint;</div>
+<div class="line"><a name="l00407"></a><span class="lineno">  407</span>   <span class="keywordflow">for</span> (<span class="keyword">typename</span> std::vector<T>::const_iterator it = begin; it!=end; ++it){</div>
+<div class="line"><a name="l00408"></a><span class="lineno">  408</span>     <span class="keywordflow">if</span>(isNoData(*it))</div>
+<div class="line"><a name="l00409"></a><span class="lineno">  409</span>       <span class="keywordflow">continue</span>;</div>
+<div class="line"><a name="l00410"></a><span class="lineno">  410</span>     <span class="keywordflow">if</span>(isValid){</div>
+<div class="line"><a name="l00411"></a><span class="lineno">  411</span>       <span class="keywordflow">if</span>((maxConstraint>=*it)&&(*it>=maxValue)){</div>
+<div class="line"><a name="l00412"></a><span class="lineno">  412</span>     tmpIt=it;</div>
+<div class="line"><a name="l00413"></a><span class="lineno">  413</span>     maxValue=*it;</div>
+<div class="line"><a name="l00414"></a><span class="lineno">  414</span>       }</div>
+<div class="line"><a name="l00415"></a><span class="lineno">  415</span>     }</div>
+<div class="line"><a name="l00416"></a><span class="lineno">  416</span>     <span class="keywordflow">else</span>{</div>
+<div class="line"><a name="l00417"></a><span class="lineno">  417</span>       isValid=<span class="keyword">true</span>;</div>
+<div class="line"><a name="l00418"></a><span class="lineno">  418</span>       tmpIt=it;</div>
+<div class="line"><a name="l00419"></a><span class="lineno">  419</span>       maxValue=*it;</div>
+<div class="line"><a name="l00420"></a><span class="lineno">  420</span>     }    </div>
+<div class="line"><a name="l00421"></a><span class="lineno">  421</span>   }</div>
+<div class="line"><a name="l00422"></a><span class="lineno">  422</span>   <span class="keywordflow">if</span>(isValid)</div>
+<div class="line"><a name="l00423"></a><span class="lineno">  423</span>     <span class="keywordflow">return</span> tmpIt;</div>
+<div class="line"><a name="l00424"></a><span class="lineno">  424</span>   <span class="keywordflow">else</span>  </div>
+<div class="line"><a name="l00425"></a><span class="lineno">  425</span>     <span class="keywordflow">return</span> end;</div>
+<div class="line"><a name="l00426"></a><span class="lineno">  426</span> }</div>
+<div class="line"><a name="l00427"></a><span class="lineno">  427</span> </div>
+<div class="line"><a name="l00428"></a><span class="lineno">  428</span> <span class="keyword">template</span><<span class="keyword">class</span> T> <span class="keyword">inline</span> T StatFactory::mymin(<span class="keyword">const</span> std::vector<T>& v)<span class="keyword"> const</span></div>
+<div class="line"><a name="l00429"></a><span class="lineno">  429</span> <span class="keyword"></span>{</div>
+<div class="line"><a name="l00430"></a><span class="lineno">  430</span>   <span class="keywordtype">bool</span> isValid=<span class="keyword">false</span>;</div>
+<div class="line"><a name="l00431"></a><span class="lineno">  431</span>   <span class="keywordflow">if</span>(v.empty()){</div>
+<div class="line"><a name="l00432"></a><span class="lineno">  432</span>     std::string errorString=<span class="stringliteral">"Error: vector is empty"</span>;</div>
+<div class="line"><a name="l00433"></a><span class="lineno">  433</span>     <span class="keywordflow">throw</span>(errorString);</div>
+<div class="line"><a name="l00434"></a><span class="lineno">  434</span>   }</div>
+<div class="line"><a name="l00435"></a><span class="lineno">  435</span>   T minValue;</div>
+<div class="line"><a name="l00436"></a><span class="lineno">  436</span>   <span class="keywordflow">for</span> (<span class="keyword">typename</span> std::vector<T>::const_iterator it = v.begin(); it!=v.end(); ++it){</div>
+<div class="line"><a name="l00437"></a><span class="lineno">  437</span>     <span class="keywordflow">if</span>(isNoData(*it))</div>
+<div class="line"><a name="l00438"></a><span class="lineno">  438</span>       <span class="keywordflow">continue</span>;</div>
+<div class="line"><a name="l00439"></a><span class="lineno">  439</span>     <span class="keywordflow">if</span>(isValid){</div>
+<div class="line"><a name="l00440"></a><span class="lineno">  440</span>       <span class="keywordflow">if</span>(minValue>*it)</div>
+<div class="line"><a name="l00441"></a><span class="lineno">  441</span>       minValue=*it;</div>
+<div class="line"><a name="l00442"></a><span class="lineno">  442</span>     }</div>
+<div class="line"><a name="l00443"></a><span class="lineno">  443</span>     <span class="keywordflow">else</span>{</div>
+<div class="line"><a name="l00444"></a><span class="lineno">  444</span>       minValue=*it;</div>
+<div class="line"><a name="l00445"></a><span class="lineno">  445</span>       isValid=<span class="keyword">true</span>;</div>
+<div class="line"><a name="l00446"></a><span class="lineno">  446</span>     }</div>
+<div class="line"><a name="l00447"></a><span class="lineno">  447</span>   }</div>
+<div class="line"><a name="l00448"></a><span class="lineno">  448</span>   <span class="keywordflow">if</span>(isValid)</div>
+<div class="line"><a name="l00449"></a><span class="lineno">  449</span>     <span class="keywordflow">return</span> minValue;</div>
+<div class="line"><a name="l00450"></a><span class="lineno">  450</span>   <span class="keywordflow">else</span> <span class="keywordflow">if</span>(m_noDataValues.size())</div>
+<div class="line"><a name="l00451"></a><span class="lineno">  451</span>     <span class="keywordflow">return</span> m_noDataValues[0];</div>
+<div class="line"><a name="l00452"></a><span class="lineno">  452</span>   <span class="keywordflow">else</span>{</div>
+<div class="line"><a name="l00453"></a><span class="lineno">  453</span>     std::string errorString=<span class="stringliteral">"Error: no valid data found"</span>;</div>
+<div class="line"><a name="l00454"></a><span class="lineno">  454</span>     <span class="keywordflow">throw</span>(errorString);</div>
+<div class="line"><a name="l00455"></a><span class="lineno">  455</span>   }</div>
+<div class="line"><a name="l00456"></a><span class="lineno">  456</span> }</div>
+<div class="line"><a name="l00457"></a><span class="lineno">  457</span> </div>
+<div class="line"><a name="l00458"></a><span class="lineno">  458</span>  <span class="keyword">template</span><<span class="keyword">class</span> T> <span class="keyword">inline</span> T StatFactory::mymin(<span class="keyword">const</span> std::vector<T>& v, T minConstraint)<span class="keyword"> const</span></div>
+<div class="line"><a name="l00459"></a><span class="lineno">  459</span> <span class="keyword"></span>{</div>
+<div class="line"><a name="l00460"></a><span class="lineno">  460</span>   <span class="keywordtype">bool</span> isValid=<span class="keyword">false</span>;</div>
+<div class="line"><a name="l00461"></a><span class="lineno">  461</span>   T minValue=minConstraint;</div>
+<div class="line"><a name="l00462"></a><span class="lineno">  462</span>   <span class="keywordflow">for</span> (<span class="keyword">typename</span> std::vector<T>::const_iterator it = v.begin(); it!=v.end(); ++it){</div>
+<div class="line"><a name="l00463"></a><span class="lineno">  463</span>     <span class="keywordflow">if</span>(isNoData(*it))</div>
+<div class="line"><a name="l00464"></a><span class="lineno">  464</span>       <span class="keywordflow">continue</span>;</div>
+<div class="line"><a name="l00465"></a><span class="lineno">  465</span>     isValid=<span class="keyword">true</span>;</div>
+<div class="line"><a name="l00466"></a><span class="lineno">  466</span>     <span class="keywordflow">if</span>((minConstraint<=*it)&&(*it<=minValue))</div>
+<div class="line"><a name="l00467"></a><span class="lineno">  467</span>       minValue=*it;</div>
+<div class="line"><a name="l00468"></a><span class="lineno">  468</span>   }</div>
+<div class="line"><a name="l00469"></a><span class="lineno">  469</span>   <span class="keywordflow">if</span>(isValid)</div>
+<div class="line"><a name="l00470"></a><span class="lineno">  470</span>     <span class="keywordflow">return</span> minValue;</div>
+<div class="line"><a name="l00471"></a><span class="lineno">  471</span>   <span class="keywordflow">else</span> <span class="keywordflow">if</span>(m_noDataValues.size())</div>
+<div class="line"><a name="l00472"></a><span class="lineno">  472</span>     <span class="keywordflow">return</span> m_noDataValues[0];</div>
+<div class="line"><a name="l00473"></a><span class="lineno">  473</span>   <span class="keywordflow">else</span>{</div>
+<div class="line"><a name="l00474"></a><span class="lineno">  474</span>     std::string errorString=<span class="stringliteral">"Error: no valid data found"</span>;</div>
+<div class="line"><a name="l00475"></a><span class="lineno">  475</span>     <span class="keywordflow">throw</span>(errorString);</div>
+<div class="line"><a name="l00476"></a><span class="lineno">  476</span>   }</div>
+<div class="line"><a name="l00477"></a><span class="lineno">  477</span> }</div>
+<div class="line"><a name="l00478"></a><span class="lineno">  478</span> </div>
+<div class="line"><a name="l00479"></a><span class="lineno">  479</span> <span class="keyword">template</span><<span class="keyword">class</span> T> <span class="keyword">inline</span> T StatFactory::mymax(<span class="keyword">const</span> std::vector<T>& v)<span class="keyword"> const</span></div>
+<div class="line"><a name="l00480"></a><span class="lineno">  480</span> <span class="keyword"></span>{</div>
+<div class="line"><a name="l00481"></a><span class="lineno">  481</span>   <span class="keywordtype">bool</span> isValid=<span class="keyword">false</span>;</div>
+<div class="line"><a name="l00482"></a><span class="lineno">  482</span>   <span class="keywordflow">if</span>(v.empty()){</div>
+<div class="line"><a name="l00483"></a><span class="lineno">  483</span>     std::string errorString=<span class="stringliteral">"Error: vector is empty"</span>;</div>
+<div class="line"><a name="l00484"></a><span class="lineno">  484</span>     <span class="keywordflow">throw</span>(errorString);</div>
 <div class="line"><a name="l00485"></a><span class="lineno">  485</span>   }</div>
-<div class="line"><a name="l00486"></a><span class="lineno">  486</span>   <span class="keywordflow">if</span>(isValid)</div>
-<div class="line"><a name="l00487"></a><span class="lineno">  487</span>     <span class="keywordflow">return</span> tmpIt;</div>
-<div class="line"><a name="l00488"></a><span class="lineno">  488</span>   <span class="keywordflow">else</span></div>
-<div class="line"><a name="l00489"></a><span class="lineno">  489</span>     <span class="keywordflow">return</span> end;</div>
-<div class="line"><a name="l00490"></a><span class="lineno">  490</span> }</div>
-<div class="line"><a name="l00491"></a><span class="lineno">  491</span> </div>
-<div class="line"><a name="l00492"></a><span class="lineno">  492</span> <span class="keyword">template</span><<span class="keyword">class</span> T> <span class="keyword">inline</span> <span class="keyword">typename</span> std::vector<T>::const_iterator StatFactory::absmin(<span class="keyword">const</span> std::vector<T>& v, <span class="keyword">typename</span> std::vector<T>::const_iterator begin, <span class="keyword">typename</span> std::vector<T& [...]
-<div class="line"><a name="l00493"></a><span class="lineno">  493</span> <span class="keyword"></span>{</div>
-<div class="line"><a name="l00494"></a><span class="lineno">  494</span>   <span class="keywordtype">bool</span> isValid=<span class="keyword">false</span>;</div>
-<div class="line"><a name="l00495"></a><span class="lineno">  495</span>   <span class="keyword">typename</span> std::vector<T>::const_iterator tmpIt=begin;</div>
-<div class="line"><a name="l00496"></a><span class="lineno">  496</span>   <span class="keywordflow">for</span> (<span class="keyword">typename</span> std::vector<T>::const_iterator it = begin; it!=end; ++it){</div>
-<div class="line"><a name="l00497"></a><span class="lineno">  497</span>     <span class="keywordflow">if</span>(isNoData(*it))</div>
-<div class="line"><a name="l00498"></a><span class="lineno">  498</span>       <span class="keywordflow">continue</span>;</div>
-<div class="line"><a name="l00499"></a><span class="lineno">  499</span>     isValid=<span class="keyword">true</span>;</div>
-<div class="line"><a name="l00500"></a><span class="lineno">  500</span>     <span class="keywordflow">if</span>(abs(*tmpIt)>abs(*it))</div>
-<div class="line"><a name="l00501"></a><span class="lineno">  501</span>       tmpIt=it;</div>
-<div class="line"><a name="l00502"></a><span class="lineno">  502</span>   }</div>
-<div class="line"><a name="l00503"></a><span class="lineno">  503</span>   <span class="keywordflow">if</span>(isValid)</div>
-<div class="line"><a name="l00504"></a><span class="lineno">  504</span>     <span class="keywordflow">return</span> tmpIt;</div>
-<div class="line"><a name="l00505"></a><span class="lineno">  505</span>   <span class="keywordflow">else</span></div>
-<div class="line"><a name="l00506"></a><span class="lineno">  506</span>     <span class="keywordflow">return</span> end;</div>
+<div class="line"><a name="l00486"></a><span class="lineno">  486</span>   T maxValue;</div>
+<div class="line"><a name="l00487"></a><span class="lineno">  487</span>   <span class="keywordflow">for</span> (<span class="keyword">typename</span> std::vector<T>::const_iterator it = v.begin(); it!=v.end(); ++it){</div>
+<div class="line"><a name="l00488"></a><span class="lineno">  488</span>     <span class="keywordflow">if</span>(isNoData(*it))</div>
+<div class="line"><a name="l00489"></a><span class="lineno">  489</span>       <span class="keywordflow">continue</span>;</div>
+<div class="line"><a name="l00490"></a><span class="lineno">  490</span>     <span class="keywordflow">if</span>(isValid){</div>
+<div class="line"><a name="l00491"></a><span class="lineno">  491</span>       <span class="keywordflow">if</span>(maxValue<*it)</div>
+<div class="line"><a name="l00492"></a><span class="lineno">  492</span>       maxValue=*it;</div>
+<div class="line"><a name="l00493"></a><span class="lineno">  493</span>     }</div>
+<div class="line"><a name="l00494"></a><span class="lineno">  494</span>     <span class="keywordflow">else</span>{</div>
+<div class="line"><a name="l00495"></a><span class="lineno">  495</span>       maxValue=*it;</div>
+<div class="line"><a name="l00496"></a><span class="lineno">  496</span>       isValid=<span class="keyword">true</span>;</div>
+<div class="line"><a name="l00497"></a><span class="lineno">  497</span>     }</div>
+<div class="line"><a name="l00498"></a><span class="lineno">  498</span>   }</div>
+<div class="line"><a name="l00499"></a><span class="lineno">  499</span>   <span class="keywordflow">if</span>(isValid)</div>
+<div class="line"><a name="l00500"></a><span class="lineno">  500</span>     <span class="keywordflow">return</span> maxValue;</div>
+<div class="line"><a name="l00501"></a><span class="lineno">  501</span>   <span class="keywordflow">else</span> <span class="keywordflow">if</span>(m_noDataValues.size())</div>
+<div class="line"><a name="l00502"></a><span class="lineno">  502</span>     <span class="keywordflow">return</span> m_noDataValues[0];</div>
+<div class="line"><a name="l00503"></a><span class="lineno">  503</span>   <span class="keywordflow">else</span>{</div>
+<div class="line"><a name="l00504"></a><span class="lineno">  504</span>     std::string errorString=<span class="stringliteral">"Error: no valid data found"</span>;</div>
+<div class="line"><a name="l00505"></a><span class="lineno">  505</span>     <span class="keywordflow">throw</span>(errorString);</div>
+<div class="line"><a name="l00506"></a><span class="lineno">  506</span>   }</div>
 <div class="line"><a name="l00507"></a><span class="lineno">  507</span> }</div>
 <div class="line"><a name="l00508"></a><span class="lineno">  508</span> </div>
-<div class="line"><a name="l00509"></a><span class="lineno">  509</span> <span class="keyword">template</span><<span class="keyword">class</span> T> <span class="keyword">inline</span> <span class="keywordtype">void</span> StatFactory::minmax(<span class="keyword">const</span> std::vector<T>& v, <span class="keyword">typename</span> std::vector<T>::const_iterator begin, <span class="keyword">typename</span> std::vector<T>::const_iterator end, T& theMi [...]
+<div class="line"><a name="l00509"></a><span class="lineno">  509</span> <span class="keyword">template</span><<span class="keyword">class</span> T> <span class="keyword">inline</span> T StatFactory::mymax(<span class="keyword">const</span> std::vector<T>& v, T maxConstraint)<span class="keyword"> const</span></div>
 <div class="line"><a name="l00510"></a><span class="lineno">  510</span> <span class="keyword"></span>{</div>
 <div class="line"><a name="l00511"></a><span class="lineno">  511</span>   <span class="keywordtype">bool</span> isValid=<span class="keyword">false</span>;</div>
-<div class="line"><a name="l00512"></a><span class="lineno">  512</span>   theMin=*begin;</div>
-<div class="line"><a name="l00513"></a><span class="lineno">  513</span>   theMax=*begin;</div>
-<div class="line"><a name="l00514"></a><span class="lineno">  514</span>   <span class="keywordflow">for</span> (<span class="keyword">typename</span> std::vector<T>::const_iterator it = begin; it!=end; ++it){</div>
-<div class="line"><a name="l00515"></a><span class="lineno">  515</span>     <span class="keywordflow">if</span>(isNoData(*it))</div>
-<div class="line"><a name="l00516"></a><span class="lineno">  516</span>       <span class="keywordflow">continue</span>;</div>
-<div class="line"><a name="l00517"></a><span class="lineno">  517</span>     isValid=<span class="keyword">true</span>;</div>
-<div class="line"><a name="l00518"></a><span class="lineno">  518</span>     <span class="keywordflow">if</span>(theMin>*it)</div>
-<div class="line"><a name="l00519"></a><span class="lineno">  519</span>       theMin=*it;</div>
-<div class="line"><a name="l00520"></a><span class="lineno">  520</span>     <span class="keywordflow">if</span>(theMax<*it)</div>
-<div class="line"><a name="l00521"></a><span class="lineno">  521</span>       theMax=*it;</div>
-<div class="line"><a name="l00522"></a><span class="lineno">  522</span>   }</div>
-<div class="line"><a name="l00523"></a><span class="lineno">  523</span>   <span class="keywordflow">if</span>(!isValid){</div>
-<div class="line"><a name="l00524"></a><span class="lineno">  524</span>     <span class="keywordflow">if</span>(m_noDataValues.size()){</div>
-<div class="line"><a name="l00525"></a><span class="lineno">  525</span>       theMin=m_noDataValues[0];</div>
-<div class="line"><a name="l00526"></a><span class="lineno">  526</span>       theMax=m_noDataValues[0];</div>
-<div class="line"><a name="l00527"></a><span class="lineno">  527</span>     }</div>
-<div class="line"><a name="l00528"></a><span class="lineno">  528</span>     <span class="keywordflow">else</span>{</div>
-<div class="line"><a name="l00529"></a><span class="lineno">  529</span>       std::string errorString=<span class="stringliteral">"Error: no valid data found"</span>;</div>
-<div class="line"><a name="l00530"></a><span class="lineno">  530</span>       <span class="keywordflow">throw</span>(errorString);</div>
-<div class="line"><a name="l00531"></a><span class="lineno">  531</span>     }</div>
-<div class="line"><a name="l00532"></a><span class="lineno">  532</span>   }</div>
-<div class="line"><a name="l00533"></a><span class="lineno">  533</span> }</div>
-<div class="line"><a name="l00534"></a><span class="lineno">  534</span> </div>
-<div class="line"><a name="l00535"></a><span class="lineno">  535</span> <span class="keyword">template</span><<span class="keyword">class</span> T> <span class="keyword">inline</span> T StatFactory::sum(<span class="keyword">const</span> std::vector<T>& v)<span class="keyword"> const</span></div>
-<div class="line"><a name="l00536"></a><span class="lineno">  536</span> <span class="keyword"></span>{</div>
-<div class="line"><a name="l00537"></a><span class="lineno">  537</span>   <span class="keywordtype">bool</span> isValid=<span class="keyword">false</span>;</div>
-<div class="line"><a name="l00538"></a><span class="lineno">  538</span>   <span class="keyword">typename</span> std::vector<T>::const_iterator it;</div>
-<div class="line"><a name="l00539"></a><span class="lineno">  539</span>   T tmpSum=0;</div>
-<div class="line"><a name="l00540"></a><span class="lineno">  540</span>   <span class="keywordflow">for</span> (it = v.begin(); it!= v.end(); ++it){</div>
-<div class="line"><a name="l00541"></a><span class="lineno">  541</span>     <span class="keywordflow">if</span>(isNoData(*it))</div>
-<div class="line"><a name="l00542"></a><span class="lineno">  542</span>       <span class="keywordflow">continue</span>;</div>
-<div class="line"><a name="l00543"></a><span class="lineno">  543</span>     isValid=<span class="keyword">true</span>;</div>
-<div class="line"><a name="l00544"></a><span class="lineno">  544</span>     tmpSum+=*it;</div>
-<div class="line"><a name="l00545"></a><span class="lineno">  545</span>   }</div>
-<div class="line"><a name="l00546"></a><span class="lineno">  546</span>   <span class="keywordflow">if</span>(isValid)</div>
-<div class="line"><a name="l00547"></a><span class="lineno">  547</span>     <span class="keywordflow">return</span> tmpSum;</div>
-<div class="line"><a name="l00548"></a><span class="lineno">  548</span>   <span class="keywordflow">else</span> <span class="keywordflow">if</span>(m_noDataValues.size())</div>
-<div class="line"><a name="l00549"></a><span class="lineno">  549</span>     <span class="keywordflow">return</span> m_noDataValues[0];</div>
-<div class="line"><a name="l00550"></a><span class="lineno">  550</span>   <span class="keywordflow">else</span>{</div>
-<div class="line"><a name="l00551"></a><span class="lineno">  551</span>     std::string errorString=<span class="stringliteral">"Error: no valid data found"</span>;</div>
-<div class="line"><a name="l00552"></a><span class="lineno">  552</span>     <span class="keywordflow">throw</span>(errorString);</div>
-<div class="line"><a name="l00553"></a><span class="lineno">  553</span>   }</div>
-<div class="line"><a name="l00554"></a><span class="lineno">  554</span> }</div>
-<div class="line"><a name="l00555"></a><span class="lineno">  555</span> </div>
-<div class="line"><a name="l00556"></a><span class="lineno">  556</span> <span class="keyword">template</span><<span class="keyword">class</span> T> <span class="keyword">inline</span> <span class="keywordtype">double</span> StatFactory::mean(<span class="keyword">const</span> std::vector<T>& v)<span class="keyword"> const</span></div>
-<div class="line"><a name="l00557"></a><span class="lineno">  557</span> <span class="keyword"></span>{</div>
-<div class="line"><a name="l00558"></a><span class="lineno">  558</span>   <span class="keyword">typename</span> std::vector<T>::const_iterator it;</div>
-<div class="line"><a name="l00559"></a><span class="lineno">  559</span>   T tmpSum=0;</div>
-<div class="line"><a name="l00560"></a><span class="lineno">  560</span>   <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> validSize=0;</div>
-<div class="line"><a name="l00561"></a><span class="lineno">  561</span>   <span class="keywordflow">for</span> (it = v.begin(); it!= v.end(); ++it){</div>
-<div class="line"><a name="l00562"></a><span class="lineno">  562</span>     <span class="keywordflow">if</span>(isNoData(*it))</div>
-<div class="line"><a name="l00563"></a><span class="lineno">  563</span>       <span class="keywordflow">continue</span>;</div>
-<div class="line"><a name="l00564"></a><span class="lineno">  564</span>     ++validSize;</div>
-<div class="line"><a name="l00565"></a><span class="lineno">  565</span>     tmpSum+=*it;</div>
+<div class="line"><a name="l00512"></a><span class="lineno">  512</span>   T maxValue=maxConstraint;</div>
+<div class="line"><a name="l00513"></a><span class="lineno">  513</span>   <span class="keywordflow">for</span> (<span class="keyword">typename</span> std::vector<T>::const_iterator it = v.begin(); it!=v.end(); ++it){</div>
+<div class="line"><a name="l00514"></a><span class="lineno">  514</span>     <span class="keywordflow">if</span>(isNoData(*it))</div>
+<div class="line"><a name="l00515"></a><span class="lineno">  515</span>       <span class="keywordflow">continue</span>;</div>
+<div class="line"><a name="l00516"></a><span class="lineno">  516</span>     <span class="keywordflow">if</span>((maxValue<=*it)&&(*it<=maxConstraint))</div>
+<div class="line"><a name="l00517"></a><span class="lineno">  517</span>       maxValue=*it;</div>
+<div class="line"><a name="l00518"></a><span class="lineno">  518</span>   }</div>
+<div class="line"><a name="l00519"></a><span class="lineno">  519</span>   <span class="keywordflow">if</span>(isValid)</div>
+<div class="line"><a name="l00520"></a><span class="lineno">  520</span>     <span class="keywordflow">return</span> maxValue;</div>
+<div class="line"><a name="l00521"></a><span class="lineno">  521</span>   <span class="keywordflow">else</span> <span class="keywordflow">if</span>(m_noDataValues.size())</div>
+<div class="line"><a name="l00522"></a><span class="lineno">  522</span>     <span class="keywordflow">return</span> m_noDataValues[0];</div>
+<div class="line"><a name="l00523"></a><span class="lineno">  523</span>   <span class="keywordflow">else</span>{</div>
+<div class="line"><a name="l00524"></a><span class="lineno">  524</span>     std::string errorString=<span class="stringliteral">"Error: no valid data found"</span>;</div>
+<div class="line"><a name="l00525"></a><span class="lineno">  525</span>     <span class="keywordflow">throw</span>(errorString);</div>
+<div class="line"><a name="l00526"></a><span class="lineno">  526</span>   }</div>
+<div class="line"><a name="l00527"></a><span class="lineno">  527</span> }</div>
+<div class="line"><a name="l00528"></a><span class="lineno">  528</span> </div>
+<div class="line"><a name="l00529"></a><span class="lineno">  529</span> <span class="keyword">template</span><<span class="keyword">class</span> T> <span class="keyword">inline</span> <span class="keyword">typename</span> std::vector<T>::const_iterator StatFactory::absmax(<span class="keyword">const</span> std::vector<T>& v, <span class="keyword">typename</span> std::vector<T>::const_iterator begin, <span class="keyword">typename</span> std::vector<T& [...]
+<div class="line"><a name="l00530"></a><span class="lineno">  530</span> <span class="keyword"></span>{</div>
+<div class="line"><a name="l00531"></a><span class="lineno">  531</span>   <span class="keywordtype">bool</span> isValid=<span class="keyword">false</span>;</div>
+<div class="line"><a name="l00532"></a><span class="lineno">  532</span>   <span class="keyword">typename</span> std::vector<T>::const_iterator tmpIt;</div>
+<div class="line"><a name="l00533"></a><span class="lineno">  533</span>   <span class="keywordflow">for</span> (<span class="keyword">typename</span> std::vector<T>::const_iterator it = begin; it!=end; ++it){</div>
+<div class="line"><a name="l00534"></a><span class="lineno">  534</span>     <span class="keywordflow">if</span>(isNoData(*it))</div>
+<div class="line"><a name="l00535"></a><span class="lineno">  535</span>       <span class="keywordflow">continue</span>;</div>
+<div class="line"><a name="l00536"></a><span class="lineno">  536</span>     <span class="keywordflow">if</span>(isValid){</div>
+<div class="line"><a name="l00537"></a><span class="lineno">  537</span>       <span class="keywordflow">if</span>(abs(*tmpIt)<abs(*it))</div>
+<div class="line"><a name="l00538"></a><span class="lineno">  538</span>     tmpIt=it;</div>
+<div class="line"><a name="l00539"></a><span class="lineno">  539</span>     }</div>
+<div class="line"><a name="l00540"></a><span class="lineno">  540</span>     <span class="keywordflow">else</span>{</div>
+<div class="line"><a name="l00541"></a><span class="lineno">  541</span>       tmpIt=it;</div>
+<div class="line"><a name="l00542"></a><span class="lineno">  542</span>       isValid=<span class="keyword">true</span>;</div>
+<div class="line"><a name="l00543"></a><span class="lineno">  543</span>     }</div>
+<div class="line"><a name="l00544"></a><span class="lineno">  544</span>   }</div>
+<div class="line"><a name="l00545"></a><span class="lineno">  545</span>   <span class="keywordflow">if</span>(isValid)</div>
+<div class="line"><a name="l00546"></a><span class="lineno">  546</span>     <span class="keywordflow">return</span> tmpIt;</div>
+<div class="line"><a name="l00547"></a><span class="lineno">  547</span>   <span class="keywordflow">else</span></div>
+<div class="line"><a name="l00548"></a><span class="lineno">  548</span>     <span class="keywordflow">return</span> end;</div>
+<div class="line"><a name="l00549"></a><span class="lineno">  549</span> }</div>
+<div class="line"><a name="l00550"></a><span class="lineno">  550</span> </div>
+<div class="line"><a name="l00551"></a><span class="lineno">  551</span> <span class="keyword">template</span><<span class="keyword">class</span> T> <span class="keyword">inline</span> <span class="keyword">typename</span> std::vector<T>::const_iterator StatFactory::absmin(<span class="keyword">const</span> std::vector<T>& v, <span class="keyword">typename</span> std::vector<T>::const_iterator begin, <span class="keyword">typename</span> std::vector<T& [...]
+<div class="line"><a name="l00552"></a><span class="lineno">  552</span> <span class="keyword"></span>{</div>
+<div class="line"><a name="l00553"></a><span class="lineno">  553</span>   <span class="keywordtype">bool</span> isValid=<span class="keyword">false</span>;</div>
+<div class="line"><a name="l00554"></a><span class="lineno">  554</span>   <span class="keyword">typename</span> std::vector<T>::const_iterator tmpIt;</div>
+<div class="line"><a name="l00555"></a><span class="lineno">  555</span>   <span class="keywordflow">for</span> (<span class="keyword">typename</span> std::vector<T>::const_iterator it = begin; it!=end; ++it){</div>
+<div class="line"><a name="l00556"></a><span class="lineno">  556</span>     <span class="keywordflow">if</span>(isNoData(*it))</div>
+<div class="line"><a name="l00557"></a><span class="lineno">  557</span>       <span class="keywordflow">continue</span>;</div>
+<div class="line"><a name="l00558"></a><span class="lineno">  558</span>     <span class="keywordflow">if</span>(isValid){</div>
+<div class="line"><a name="l00559"></a><span class="lineno">  559</span>       <span class="keywordflow">if</span>(abs(*tmpIt)>abs(*it))</div>
+<div class="line"><a name="l00560"></a><span class="lineno">  560</span>     tmpIt=it;</div>
+<div class="line"><a name="l00561"></a><span class="lineno">  561</span>     }</div>
+<div class="line"><a name="l00562"></a><span class="lineno">  562</span>     <span class="keywordflow">else</span>{</div>
+<div class="line"><a name="l00563"></a><span class="lineno">  563</span>       tmpIt=it;</div>
+<div class="line"><a name="l00564"></a><span class="lineno">  564</span>       isValid=<span class="keyword">true</span>;</div>
+<div class="line"><a name="l00565"></a><span class="lineno">  565</span>     }</div>
 <div class="line"><a name="l00566"></a><span class="lineno">  566</span>   }</div>
-<div class="line"><a name="l00567"></a><span class="lineno">  567</span>   <span class="keywordflow">if</span>(validSize)</div>
-<div class="line"><a name="l00568"></a><span class="lineno">  568</span>     <span class="keywordflow">return</span> <span class="keyword">static_cast<</span><span class="keywordtype">double</span><span class="keyword">></span>(tmpSum)/validSize;</div>
-<div class="line"><a name="l00569"></a><span class="lineno">  569</span>   <span class="keywordflow">else</span> <span class="keywordflow">if</span>(m_noDataValues.size())</div>
-<div class="line"><a name="l00570"></a><span class="lineno">  570</span>     <span class="keywordflow">return</span> m_noDataValues[0];</div>
-<div class="line"><a name="l00571"></a><span class="lineno">  571</span>   <span class="keywordflow">else</span>{</div>
-<div class="line"><a name="l00572"></a><span class="lineno">  572</span>     std::string errorString=<span class="stringliteral">"Error: no valid data found"</span>;</div>
-<div class="line"><a name="l00573"></a><span class="lineno">  573</span>     <span class="keywordflow">throw</span>(errorString);</div>
-<div class="line"><a name="l00574"></a><span class="lineno">  574</span>   }</div>
-<div class="line"><a name="l00575"></a><span class="lineno">  575</span> }</div>
-<div class="line"><a name="l00576"></a><span class="lineno">  576</span> </div>
-<div class="line"><a name="l00577"></a><span class="lineno">  577</span> <span class="keyword">template</span><<span class="keyword">class</span> T> <span class="keyword">inline</span> <span class="keywordtype">void</span> StatFactory::eraseNoData(std::vector<T>& v)<span class="keyword"> const</span></div>
-<div class="line"><a name="l00578"></a><span class="lineno">  578</span> <span class="keyword"></span>{</div>
-<div class="line"><a name="l00579"></a><span class="lineno">  579</span>   <span class="keywordflow">if</span>(m_noDataValues.size()){</div>
-<div class="line"><a name="l00580"></a><span class="lineno">  580</span>     <span class="keyword">typename</span> std::vector<T>::iterator it=v.begin();</div>
-<div class="line"><a name="l00581"></a><span class="lineno">  581</span>     <span class="keywordflow">while</span>(it!=v.end()){</div>
-<div class="line"><a name="l00582"></a><span class="lineno">  582</span>       <span class="keywordflow">if</span>(isNoData(*it))</div>
-<div class="line"><a name="l00583"></a><span class="lineno">  583</span>     v.erase(it);</div>
-<div class="line"><a name="l00584"></a><span class="lineno">  584</span>       <span class="keywordflow">else</span></div>
-<div class="line"><a name="l00585"></a><span class="lineno">  585</span>     ++it;</div>
-<div class="line"><a name="l00586"></a><span class="lineno">  586</span>     }</div>
-<div class="line"><a name="l00587"></a><span class="lineno">  587</span>   }</div>
-<div class="line"><a name="l00588"></a><span class="lineno">  588</span> }</div>
-<div class="line"><a name="l00589"></a><span class="lineno">  589</span> </div>
-<div class="line"><a name="l00590"></a><span class="lineno">  590</span> <span class="keyword">template</span><<span class="keyword">class</span> T> T StatFactory::median(<span class="keyword">const</span> std::vector<T>& v)<span class="keyword"> const</span></div>
-<div class="line"><a name="l00591"></a><span class="lineno">  591</span> <span class="keyword"></span>{</div>
-<div class="line"><a name="l00592"></a><span class="lineno">  592</span>   std::vector<T> tmpV=v;</div>
-<div class="line"><a name="l00593"></a><span class="lineno">  593</span>   eraseNoData(tmpV);</div>
-<div class="line"><a name="l00594"></a><span class="lineno">  594</span>   <span class="keywordflow">if</span>(tmpV.size()){</div>
-<div class="line"><a name="l00595"></a><span class="lineno">  595</span>     sort(tmpV.begin(),tmpV.end());</div>
-<div class="line"><a name="l00596"></a><span class="lineno">  596</span>     <span class="keywordflow">if</span>(tmpV.size()%2)</div>
-<div class="line"><a name="l00597"></a><span class="lineno">  597</span>       <span class="keywordflow">return</span> tmpV[tmpV.size()/2];</div>
-<div class="line"><a name="l00598"></a><span class="lineno">  598</span>     <span class="keywordflow">else</span></div>
-<div class="line"><a name="l00599"></a><span class="lineno">  599</span>       <span class="keywordflow">return</span> 0.5*(tmpV[tmpV.size()/2-1]+tmpV[tmpV.size()/2]);</div>
+<div class="line"><a name="l00567"></a><span class="lineno">  567</span>   <span class="keywordflow">if</span>(isValid)</div>
+<div class="line"><a name="l00568"></a><span class="lineno">  568</span>     <span class="keywordflow">return</span> tmpIt;</div>
+<div class="line"><a name="l00569"></a><span class="lineno">  569</span>   <span class="keywordflow">else</span></div>
+<div class="line"><a name="l00570"></a><span class="lineno">  570</span>     <span class="keywordflow">return</span> end;</div>
+<div class="line"><a name="l00571"></a><span class="lineno">  571</span> }</div>
+<div class="line"><a name="l00572"></a><span class="lineno">  572</span> </div>
+<div class="line"><a name="l00573"></a><span class="lineno">  573</span> <span class="keyword">template</span><<span class="keyword">class</span> T> <span class="keyword">inline</span> <span class="keywordtype">void</span> StatFactory::minmax(<span class="keyword">const</span> std::vector<T>& v, <span class="keyword">typename</span> std::vector<T>::const_iterator begin, <span class="keyword">typename</span> std::vector<T>::const_iterator end, T& theMi [...]
+<div class="line"><a name="l00574"></a><span class="lineno">  574</span> <span class="keyword"></span>{</div>
+<div class="line"><a name="l00575"></a><span class="lineno">  575</span>   <span class="keywordtype">bool</span> isValid=<span class="keyword">false</span>;</div>
+<div class="line"><a name="l00576"></a><span class="lineno">  576</span>   <span class="keywordflow">for</span> (<span class="keyword">typename</span> std::vector<T>::const_iterator it = begin; it!=end; ++it){</div>
+<div class="line"><a name="l00577"></a><span class="lineno">  577</span>     <span class="keywordflow">if</span>(isNoData(*it))</div>
+<div class="line"><a name="l00578"></a><span class="lineno">  578</span>       <span class="keywordflow">continue</span>;</div>
+<div class="line"><a name="l00579"></a><span class="lineno">  579</span>     <span class="keywordflow">if</span>(isValid){</div>
+<div class="line"><a name="l00580"></a><span class="lineno">  580</span>       <span class="keywordflow">if</span>(theMin>*it)</div>
+<div class="line"><a name="l00581"></a><span class="lineno">  581</span>     theMin=*it;</div>
+<div class="line"><a name="l00582"></a><span class="lineno">  582</span>       <span class="keywordflow">if</span>(theMax<*it)</div>
+<div class="line"><a name="l00583"></a><span class="lineno">  583</span>     theMax=*it;</div>
+<div class="line"><a name="l00584"></a><span class="lineno">  584</span>     }</div>
+<div class="line"><a name="l00585"></a><span class="lineno">  585</span>     <span class="keywordflow">else</span>{</div>
+<div class="line"><a name="l00586"></a><span class="lineno">  586</span>       theMin=*it;</div>
+<div class="line"><a name="l00587"></a><span class="lineno">  587</span>       theMax=*it;</div>
+<div class="line"><a name="l00588"></a><span class="lineno">  588</span>       isValid=<span class="keyword">true</span>;</div>
+<div class="line"><a name="l00589"></a><span class="lineno">  589</span>     }</div>
+<div class="line"><a name="l00590"></a><span class="lineno">  590</span>   }</div>
+<div class="line"><a name="l00591"></a><span class="lineno">  591</span>   <span class="keywordflow">if</span>(!isValid){</div>
+<div class="line"><a name="l00592"></a><span class="lineno">  592</span>     <span class="keywordflow">if</span>(m_noDataValues.size()){</div>
+<div class="line"><a name="l00593"></a><span class="lineno">  593</span>       theMin=m_noDataValues[0];</div>
+<div class="line"><a name="l00594"></a><span class="lineno">  594</span>       theMax=m_noDataValues[0];</div>
+<div class="line"><a name="l00595"></a><span class="lineno">  595</span>     }</div>
+<div class="line"><a name="l00596"></a><span class="lineno">  596</span>     <span class="keywordflow">else</span>{</div>
+<div class="line"><a name="l00597"></a><span class="lineno">  597</span>       std::string errorString=<span class="stringliteral">"Error: no valid data found"</span>;</div>
+<div class="line"><a name="l00598"></a><span class="lineno">  598</span>       <span class="keywordflow">throw</span>(errorString);</div>
+<div class="line"><a name="l00599"></a><span class="lineno">  599</span>     }</div>
 <div class="line"><a name="l00600"></a><span class="lineno">  600</span>   }</div>
-<div class="line"><a name="l00601"></a><span class="lineno">  601</span>   <span class="keywordflow">else</span> <span class="keywordflow">if</span>(m_noDataValues.size())</div>
-<div class="line"><a name="l00602"></a><span class="lineno">  602</span>     <span class="keywordflow">return</span> m_noDataValues[0];</div>
-<div class="line"><a name="l00603"></a><span class="lineno">  603</span>   <span class="keywordflow">else</span>{</div>
-<div class="line"><a name="l00604"></a><span class="lineno">  604</span>     std::string errorString=<span class="stringliteral">"Error: no valid data found"</span>;</div>
-<div class="line"><a name="l00605"></a><span class="lineno">  605</span>     <span class="keywordflow">throw</span>(errorString);</div>
-<div class="line"><a name="l00606"></a><span class="lineno">  606</span>   }</div>
-<div class="line"><a name="l00607"></a><span class="lineno">  607</span> }</div>
-<div class="line"><a name="l00608"></a><span class="lineno">  608</span> </div>
-<div class="line"><a name="l00609"></a><span class="lineno">  609</span> <span class="keyword">template</span><<span class="keyword">class</span> T> <span class="keywordtype">double</span> StatFactory::var(<span class="keyword">const</span> std::vector<T>& v)<span class="keyword"> const</span></div>
-<div class="line"><a name="l00610"></a><span class="lineno">  610</span> <span class="keyword"></span>{</div>
-<div class="line"><a name="l00611"></a><span class="lineno">  611</span>   <span class="keyword">typename</span> std::vector<T>::const_iterator it;</div>
-<div class="line"><a name="l00612"></a><span class="lineno">  612</span>   <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> validSize=0;</div>
-<div class="line"><a name="l00613"></a><span class="lineno">  613</span>   <span class="keywordtype">double</span> m1=0;</div>
-<div class="line"><a name="l00614"></a><span class="lineno">  614</span>   <span class="keywordtype">double</span> m2=0;</div>
-<div class="line"><a name="l00615"></a><span class="lineno">  615</span>   <span class="keywordflow">for</span> (it = v.begin(); it!= v.end(); ++it){</div>
-<div class="line"><a name="l00616"></a><span class="lineno">  616</span>     <span class="keywordflow">if</span>(isNoData(*it))</div>
-<div class="line"><a name="l00617"></a><span class="lineno">  617</span>       <span class="keywordflow">continue</span>;</div>
-<div class="line"><a name="l00618"></a><span class="lineno">  618</span>     m1+=*it;</div>
-<div class="line"><a name="l00619"></a><span class="lineno">  619</span>     m2+=(*it)*(*it);</div>
-<div class="line"><a name="l00620"></a><span class="lineno">  620</span>     ++validSize;</div>
+<div class="line"><a name="l00601"></a><span class="lineno">  601</span> }</div>
+<div class="line"><a name="l00602"></a><span class="lineno">  602</span> </div>
+<div class="line"><a name="l00603"></a><span class="lineno">  603</span> <span class="keyword">template</span><<span class="keyword">class</span> T> <span class="keyword">inline</span> T StatFactory::sum(<span class="keyword">const</span> std::vector<T>& v)<span class="keyword"> const</span></div>
+<div class="line"><a name="l00604"></a><span class="lineno">  604</span> <span class="keyword"></span>{</div>
+<div class="line"><a name="l00605"></a><span class="lineno">  605</span>   <span class="keywordtype">bool</span> isValid=<span class="keyword">false</span>;</div>
+<div class="line"><a name="l00606"></a><span class="lineno">  606</span>   <span class="keyword">typename</span> std::vector<T>::const_iterator it;</div>
+<div class="line"><a name="l00607"></a><span class="lineno">  607</span>   T tmpSum=0;</div>
+<div class="line"><a name="l00608"></a><span class="lineno">  608</span>   <span class="keywordflow">for</span> (it = v.begin(); it!= v.end(); ++it){</div>
+<div class="line"><a name="l00609"></a><span class="lineno">  609</span>     <span class="keywordflow">if</span>(isNoData(*it))</div>
+<div class="line"><a name="l00610"></a><span class="lineno">  610</span>       <span class="keywordflow">continue</span>;</div>
+<div class="line"><a name="l00611"></a><span class="lineno">  611</span>     isValid=<span class="keyword">true</span>;</div>
+<div class="line"><a name="l00612"></a><span class="lineno">  612</span>     tmpSum+=*it;</div>
+<div class="line"><a name="l00613"></a><span class="lineno">  613</span>   }</div>
+<div class="line"><a name="l00614"></a><span class="lineno">  614</span>   <span class="keywordflow">if</span>(isValid)</div>
+<div class="line"><a name="l00615"></a><span class="lineno">  615</span>     <span class="keywordflow">return</span> tmpSum;</div>
+<div class="line"><a name="l00616"></a><span class="lineno">  616</span>   <span class="keywordflow">else</span> <span class="keywordflow">if</span>(m_noDataValues.size())</div>
+<div class="line"><a name="l00617"></a><span class="lineno">  617</span>     <span class="keywordflow">return</span> m_noDataValues[0];</div>
+<div class="line"><a name="l00618"></a><span class="lineno">  618</span>   <span class="keywordflow">else</span>{</div>
+<div class="line"><a name="l00619"></a><span class="lineno">  619</span>     std::string errorString=<span class="stringliteral">"Error: no valid data found"</span>;</div>
+<div class="line"><a name="l00620"></a><span class="lineno">  620</span>     <span class="keywordflow">throw</span>(errorString);</div>
 <div class="line"><a name="l00621"></a><span class="lineno">  621</span>   }</div>
-<div class="line"><a name="l00622"></a><span class="lineno">  622</span>   <span class="keywordflow">if</span>(validSize){</div>
-<div class="line"><a name="l00623"></a><span class="lineno">  623</span>     m2/=validSize;</div>
-<div class="line"><a name="l00624"></a><span class="lineno">  624</span>     m1/=validSize;</div>
-<div class="line"><a name="l00625"></a><span class="lineno">  625</span>     <span class="keywordflow">return</span> m2-m1*m1;</div>
-<div class="line"><a name="l00626"></a><span class="lineno">  626</span>   }</div>
-<div class="line"><a name="l00627"></a><span class="lineno">  627</span>   <span class="keywordflow">else</span> <span class="keywordflow">if</span>(m_noDataValues.size())</div>
-<div class="line"><a name="l00628"></a><span class="lineno">  628</span>     <span class="keywordflow">return</span> m_noDataValues[0];</div>
-<div class="line"><a name="l00629"></a><span class="lineno">  629</span>   <span class="keywordflow">else</span>{</div>
-<div class="line"><a name="l00630"></a><span class="lineno">  630</span>     std::string errorString=<span class="stringliteral">"Error: no valid data found"</span>;</div>
-<div class="line"><a name="l00631"></a><span class="lineno">  631</span>     <span class="keywordflow">throw</span>(errorString);</div>
-<div class="line"><a name="l00632"></a><span class="lineno">  632</span>   }</div>
-<div class="line"><a name="l00633"></a><span class="lineno">  633</span> }</div>
-<div class="line"><a name="l00634"></a><span class="lineno">  634</span> </div>
-<div class="line"><a name="l00635"></a><span class="lineno">  635</span> <span class="keyword">template</span><<span class="keyword">class</span> T> <span class="keywordtype">double</span> StatFactory::moment(<span class="keyword">const</span> std::vector<T>& v, <span class="keywordtype">int</span> n)<span class="keyword"> const</span></div>
-<div class="line"><a name="l00636"></a><span class="lineno">  636</span> <span class="keyword"></span>{</div>
-<div class="line"><a name="l00637"></a><span class="lineno">  637</span>   <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> validSize=0;</div>
-<div class="line"><a name="l00638"></a><span class="lineno">  638</span>   <span class="keyword">typename</span> std::vector<T>::const_iterator it;</div>
-<div class="line"><a name="l00639"></a><span class="lineno">  639</span>   <span class="keywordtype">double</span> m=0;</div>
-<div class="line"><a name="l00640"></a><span class="lineno">  640</span> <span class="comment">//   double m1=mean(v);</span></div>
-<div class="line"><a name="l00641"></a><span class="lineno">  641</span>   <span class="keywordflow">for</span>(it = v.begin(); it!= v.end(); ++it){</div>
-<div class="line"><a name="l00642"></a><span class="lineno">  642</span>     <span class="keywordflow">if</span>(isNoData(*it))</div>
-<div class="line"><a name="l00643"></a><span class="lineno">  643</span>       <span class="keywordflow">continue</span>;</div>
-<div class="line"><a name="l00644"></a><span class="lineno">  644</span>     m+=pow((*it),n);</div>
-<div class="line"><a name="l00645"></a><span class="lineno">  645</span>     ++validSize;</div>
-<div class="line"><a name="l00646"></a><span class="lineno">  646</span>   }</div>
-<div class="line"><a name="l00647"></a><span class="lineno">  647</span>   <span class="keywordflow">if</span>(validSize)</div>
-<div class="line"><a name="l00648"></a><span class="lineno">  648</span>     <span class="keywordflow">return</span> m/validSize;</div>
-<div class="line"><a name="l00649"></a><span class="lineno">  649</span>   <span class="keywordflow">else</span> <span class="keywordflow">if</span>(m_noDataValues.size())</div>
-<div class="line"><a name="l00650"></a><span class="lineno">  650</span>     <span class="keywordflow">return</span> m_noDataValues[0];</div>
-<div class="line"><a name="l00651"></a><span class="lineno">  651</span>   <span class="keywordflow">else</span>{</div>
-<div class="line"><a name="l00652"></a><span class="lineno">  652</span>     std::string errorString=<span class="stringliteral">"Error: no valid data found"</span>;</div>
-<div class="line"><a name="l00653"></a><span class="lineno">  653</span>     <span class="keywordflow">throw</span>(errorString);</div>
-<div class="line"><a name="l00654"></a><span class="lineno">  654</span>   }</div>
-<div class="line"><a name="l00655"></a><span class="lineno">  655</span> }</div>
-<div class="line"><a name="l00656"></a><span class="lineno">  656</span> </div>
-<div class="line"><a name="l00657"></a><span class="lineno">  657</span>   <span class="comment">//central moment</span></div>
-<div class="line"><a name="l00658"></a><span class="lineno">  658</span> <span class="keyword">template</span><<span class="keyword">class</span> T> <span class="keywordtype">double</span> StatFactory::cmoment(<span class="keyword">const</span> std::vector<T>& v, <span class="keywordtype">int</span> n)<span class="keyword"> const</span></div>
+<div class="line"><a name="l00622"></a><span class="lineno">  622</span> }</div>
+<div class="line"><a name="l00623"></a><span class="lineno">  623</span> </div>
+<div class="line"><a name="l00624"></a><span class="lineno">  624</span> <span class="keyword">template</span><<span class="keyword">class</span> T> <span class="keyword">inline</span> <span class="keywordtype">double</span> StatFactory::mean(<span class="keyword">const</span> std::vector<T>& v)<span class="keyword"> const</span></div>
+<div class="line"><a name="l00625"></a><span class="lineno">  625</span> <span class="keyword"></span>{</div>
+<div class="line"><a name="l00626"></a><span class="lineno">  626</span>   <span class="keyword">typename</span> std::vector<T>::const_iterator it;</div>
+<div class="line"><a name="l00627"></a><span class="lineno">  627</span>   T tmpSum=0;</div>
+<div class="line"><a name="l00628"></a><span class="lineno">  628</span>   <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> validSize=0;</div>
+<div class="line"><a name="l00629"></a><span class="lineno">  629</span>   <span class="keywordflow">for</span> (it = v.begin(); it!= v.end(); ++it){</div>
+<div class="line"><a name="l00630"></a><span class="lineno">  630</span>     <span class="keywordflow">if</span>(isNoData(*it))</div>
+<div class="line"><a name="l00631"></a><span class="lineno">  631</span>       <span class="keywordflow">continue</span>;</div>
+<div class="line"><a name="l00632"></a><span class="lineno">  632</span>     ++validSize;</div>
+<div class="line"><a name="l00633"></a><span class="lineno">  633</span>     tmpSum+=*it;</div>
+<div class="line"><a name="l00634"></a><span class="lineno">  634</span>   }</div>
+<div class="line"><a name="l00635"></a><span class="lineno">  635</span>   <span class="keywordflow">if</span>(validSize)</div>
+<div class="line"><a name="l00636"></a><span class="lineno">  636</span>     <span class="keywordflow">return</span> <span class="keyword">static_cast<</span><span class="keywordtype">double</span><span class="keyword">></span>(tmpSum)/validSize;</div>
+<div class="line"><a name="l00637"></a><span class="lineno">  637</span>   <span class="keywordflow">else</span> <span class="keywordflow">if</span>(m_noDataValues.size())</div>
+<div class="line"><a name="l00638"></a><span class="lineno">  638</span>     <span class="keywordflow">return</span> m_noDataValues[0];</div>
+<div class="line"><a name="l00639"></a><span class="lineno">  639</span>   <span class="keywordflow">else</span>{</div>
+<div class="line"><a name="l00640"></a><span class="lineno">  640</span>     std::string errorString=<span class="stringliteral">"Error: no valid data found"</span>;</div>
+<div class="line"><a name="l00641"></a><span class="lineno">  641</span>     <span class="keywordflow">throw</span>(errorString);</div>
+<div class="line"><a name="l00642"></a><span class="lineno">  642</span>   }</div>
+<div class="line"><a name="l00643"></a><span class="lineno">  643</span> }</div>
+<div class="line"><a name="l00644"></a><span class="lineno">  644</span> </div>
+<div class="line"><a name="l00645"></a><span class="lineno">  645</span> <span class="keyword">template</span><<span class="keyword">class</span> T> <span class="keyword">inline</span> <span class="keywordtype">void</span> StatFactory::eraseNoData(std::vector<T>& v)<span class="keyword"> const</span></div>
+<div class="line"><a name="l00646"></a><span class="lineno">  646</span> <span class="keyword"></span>{</div>
+<div class="line"><a name="l00647"></a><span class="lineno">  647</span>   <span class="keywordflow">if</span>(m_noDataValues.size()){</div>
+<div class="line"><a name="l00648"></a><span class="lineno">  648</span>     <span class="keyword">typename</span> std::vector<T>::iterator it=v.begin();</div>
+<div class="line"><a name="l00649"></a><span class="lineno">  649</span>     <span class="keywordflow">while</span>(it!=v.end()){</div>
+<div class="line"><a name="l00650"></a><span class="lineno">  650</span>       <span class="keywordflow">if</span>(isNoData(*it))</div>
+<div class="line"><a name="l00651"></a><span class="lineno">  651</span>     v.erase(it);</div>
+<div class="line"><a name="l00652"></a><span class="lineno">  652</span>       <span class="keywordflow">else</span></div>
+<div class="line"><a name="l00653"></a><span class="lineno">  653</span>     ++it;</div>
+<div class="line"><a name="l00654"></a><span class="lineno">  654</span>     }</div>
+<div class="line"><a name="l00655"></a><span class="lineno">  655</span>   }</div>
+<div class="line"><a name="l00656"></a><span class="lineno">  656</span> }</div>
+<div class="line"><a name="l00657"></a><span class="lineno">  657</span> </div>
+<div class="line"><a name="l00658"></a><span class="lineno">  658</span> <span class="keyword">template</span><<span class="keyword">class</span> T> T StatFactory::median(<span class="keyword">const</span> std::vector<T>& v)<span class="keyword"> const</span></div>
 <div class="line"><a name="l00659"></a><span class="lineno">  659</span> <span class="keyword"></span>{</div>
-<div class="line"><a name="l00660"></a><span class="lineno">  660</span>   <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> validSize=0;</div>
-<div class="line"><a name="l00661"></a><span class="lineno">  661</span>   <span class="keyword">typename</span> std::vector<T>::const_iterator it;</div>
-<div class="line"><a name="l00662"></a><span class="lineno">  662</span>   <span class="keywordtype">double</span> m=0;</div>
-<div class="line"><a name="l00663"></a><span class="lineno">  663</span>   <span class="keywordtype">double</span> m1=mean(v);</div>
-<div class="line"><a name="l00664"></a><span class="lineno">  664</span>   <span class="keywordflow">for</span>(it = v.begin(); it!= v.end(); ++it){</div>
-<div class="line"><a name="l00665"></a><span class="lineno">  665</span>     <span class="keywordflow">if</span>(isNoData(*it))</div>
-<div class="line"><a name="l00666"></a><span class="lineno">  666</span>       <span class="keywordflow">continue</span>;</div>
-<div class="line"><a name="l00667"></a><span class="lineno">  667</span>     m+=pow((*it-m1),n);</div>
-<div class="line"><a name="l00668"></a><span class="lineno">  668</span>     ++validSize;</div>
-<div class="line"><a name="l00669"></a><span class="lineno">  669</span>   }</div>
-<div class="line"><a name="l00670"></a><span class="lineno">  670</span>   <span class="keywordflow">if</span>(validSize)</div>
-<div class="line"><a name="l00671"></a><span class="lineno">  671</span>     <span class="keywordflow">return</span> m/validSize;</div>
-<div class="line"><a name="l00672"></a><span class="lineno">  672</span>   <span class="keywordflow">else</span> <span class="keywordflow">if</span>(m_noDataValues.size())</div>
-<div class="line"><a name="l00673"></a><span class="lineno">  673</span>     <span class="keywordflow">return</span> m_noDataValues[0];</div>
-<div class="line"><a name="l00674"></a><span class="lineno">  674</span>   <span class="keywordflow">else</span>{</div>
-<div class="line"><a name="l00675"></a><span class="lineno">  675</span>     std::string errorString=<span class="stringliteral">"Error: no valid data found"</span>;</div>
-<div class="line"><a name="l00676"></a><span class="lineno">  676</span>     <span class="keywordflow">throw</span>(errorString);</div>
-<div class="line"><a name="l00677"></a><span class="lineno">  677</span>   }</div>
-<div class="line"><a name="l00678"></a><span class="lineno">  678</span> }</div>
-<div class="line"><a name="l00679"></a><span class="lineno">  679</span> </div>
-<div class="line"><a name="l00680"></a><span class="lineno">  680</span> <span class="keyword">template</span><<span class="keyword">class</span> T> <span class="keywordtype">double</span> StatFactory::skewness(<span class="keyword">const</span> std::vector<T>& v)<span class="keyword"> const</span></div>
-<div class="line"><a name="l00681"></a><span class="lineno">  681</span> <span class="keyword"></span>{</div>
-<div class="line"><a name="l00682"></a><span class="lineno">  682</span>   <span class="comment">//todo: what if nodata value?</span></div>
-<div class="line"><a name="l00683"></a><span class="lineno">  683</span>   <span class="keywordflow">return</span> cmoment(v,3)/pow(var(v),1.5);</div>
-<div class="line"><a name="l00684"></a><span class="lineno">  684</span> }</div>
-<div class="line"><a name="l00685"></a><span class="lineno">  685</span> </div>
-<div class="line"><a name="l00686"></a><span class="lineno">  686</span> <span class="keyword">template</span><<span class="keyword">class</span> T> <span class="keywordtype">double</span> StatFactory::kurtosis(<span class="keyword">const</span> std::vector<T>& v)<span class="keyword"> const</span></div>
-<div class="line"><a name="l00687"></a><span class="lineno">  687</span> <span class="keyword"></span>{</div>
-<div class="line"><a name="l00688"></a><span class="lineno">  688</span>   <span class="comment">//todo: what if nodata value?</span></div>
-<div class="line"><a name="l00689"></a><span class="lineno">  689</span>   <span class="keywordtype">double</span> m2=cmoment(v,2);</div>
-<div class="line"><a name="l00690"></a><span class="lineno">  690</span>   <span class="keywordtype">double</span> m4=cmoment(v,4);</div>
-<div class="line"><a name="l00691"></a><span class="lineno">  691</span>   <span class="keywordflow">return</span> m4/m2/m2-3.0;</div>
-<div class="line"><a name="l00692"></a><span class="lineno">  692</span> }</div>
-<div class="line"><a name="l00693"></a><span class="lineno">  693</span> </div>
-<div class="line"><a name="l00694"></a><span class="lineno">  694</span> <span class="keyword">template</span><<span class="keyword">class</span> T> <span class="keywordtype">void</span> StatFactory::meanVar(<span class="keyword">const</span> std::vector<T>& v, <span class="keywordtype">double</span>& m1, <span class="keywordtype">double</span>& v1)<span class="keyword"> const</span></div>
-<div class="line"><a name="l00695"></a><span class="lineno">  695</span> <span class="keyword"></span>{</div>
-<div class="line"><a name="l00696"></a><span class="lineno">  696</span>   <span class="keyword">typename</span> std::vector<T>::const_iterator it;</div>
-<div class="line"><a name="l00697"></a><span class="lineno">  697</span>   <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> validSize=0;</div>
-<div class="line"><a name="l00698"></a><span class="lineno">  698</span>   m1=0;</div>
-<div class="line"><a name="l00699"></a><span class="lineno">  699</span>   v1=0;</div>
-<div class="line"><a name="l00700"></a><span class="lineno">  700</span>   <span class="keywordtype">double</span> m2=0;</div>
-<div class="line"><a name="l00701"></a><span class="lineno">  701</span>   <span class="keywordflow">for</span> (it = v.begin(); it!= v.end(); ++it){</div>
-<div class="line"><a name="l00702"></a><span class="lineno">  702</span>     <span class="keywordflow">if</span>(isNoData(*it))</div>
-<div class="line"><a name="l00703"></a><span class="lineno">  703</span>       <span class="keywordflow">continue</span>;</div>
-<div class="line"><a name="l00704"></a><span class="lineno">  704</span>     m1+=*it;</div>
-<div class="line"><a name="l00705"></a><span class="lineno">  705</span>     m2+=(*it)*(*it);</div>
-<div class="line"><a name="l00706"></a><span class="lineno">  706</span>     ++validSize;</div>
-<div class="line"><a name="l00707"></a><span class="lineno">  707</span>   }</div>
-<div class="line"><a name="l00708"></a><span class="lineno">  708</span>   <span class="keywordflow">if</span>(validSize){</div>
-<div class="line"><a name="l00709"></a><span class="lineno">  709</span>     m2/=validSize;</div>
-<div class="line"><a name="l00710"></a><span class="lineno">  710</span>     m1/=validSize;</div>
-<div class="line"><a name="l00711"></a><span class="lineno">  711</span>     v1=m2-m1*m1;</div>
-<div class="line"><a name="l00712"></a><span class="lineno">  712</span>   }</div>
-<div class="line"><a name="l00713"></a><span class="lineno">  713</span>   <span class="keywordflow">else</span> <span class="keywordflow">if</span>(m_noDataValues.size()){</div>
-<div class="line"><a name="l00714"></a><span class="lineno">  714</span>     m1=m_noDataValues[0];</div>
-<div class="line"><a name="l00715"></a><span class="lineno">  715</span>     v1=m_noDataValues[0];</div>
-<div class="line"><a name="l00716"></a><span class="lineno">  716</span>   }</div>
-<div class="line"><a name="l00717"></a><span class="lineno">  717</span>   <span class="keywordflow">else</span>{</div>
-<div class="line"><a name="l00718"></a><span class="lineno">  718</span>     std::string errorString=<span class="stringliteral">"Error: no valid data found"</span>;</div>
-<div class="line"><a name="l00719"></a><span class="lineno">  719</span>     <span class="keywordflow">throw</span>(errorString);</div>
-<div class="line"><a name="l00720"></a><span class="lineno">  720</span>   }</div>
-<div class="line"><a name="l00721"></a><span class="lineno">  721</span> }</div>
-<div class="line"><a name="l00722"></a><span class="lineno">  722</span> </div>
-<div class="line"><a name="l00723"></a><span class="lineno">  723</span> <span class="keyword">template</span><<span class="keyword">class</span> T1, <span class="keyword">class</span> T2> <span class="keywordtype">void</span> StatFactory::scale2byte(<span class="keyword">const</span> std::vector<T1>& input, std::vector<T2>& output, <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> lbound,  <span class="keywordtype">unsigned</s [...]
-<div class="line"><a name="l00724"></a><span class="lineno">  724</span> <span class="keyword"></span>{</div>
-<div class="line"><a name="l00725"></a><span class="lineno">  725</span>   output.resize(input.size());</div>
-<div class="line"><a name="l00726"></a><span class="lineno">  726</span>   T1 minimum=mymin(input);</div>
-<div class="line"><a name="l00727"></a><span class="lineno">  727</span>   T1 maximum=mymax(input);</div>
-<div class="line"><a name="l00728"></a><span class="lineno">  728</span>   <span class="keywordflow">if</span>(minimum>=maximum){</div>
-<div class="line"><a name="l00729"></a><span class="lineno">  729</span>     std::string errorString=<span class="stringliteral">"Error: no valid data found"</span>;</div>
-<div class="line"><a name="l00730"></a><span class="lineno">  730</span>     <span class="keywordflow">throw</span>(errorString);</div>
-<div class="line"><a name="l00731"></a><span class="lineno">  731</span>   }</div>
-<div class="line"><a name="l00732"></a><span class="lineno">  732</span>   <span class="keywordtype">double</span> scale=(ubound-lbound)/(maximum-minimum);</div>
-<div class="line"><a name="l00733"></a><span class="lineno">  733</span>   <span class="comment">//todo: what if nodata value?</span></div>
-<div class="line"><a name="l00734"></a><span class="lineno">  734</span>   <span class="keywordflow">for</span> (<span class="keywordtype">int</span> i=0;i<input.size();++i){</div>
-<div class="line"><a name="l00735"></a><span class="lineno">  735</span>     output[i]=scale*(input[i]-(minimum))+lbound;</div>
-<div class="line"><a name="l00736"></a><span class="lineno">  736</span>   }</div>
-<div class="line"><a name="l00737"></a><span class="lineno">  737</span> }</div>
-<div class="line"><a name="l00738"></a><span class="lineno">  738</span> </div>
-<div class="line"><a name="l00739"></a><span class="lineno">  739</span> <span class="keyword">template</span><<span class="keyword">class</span> T> <span class="keywordtype">void</span>  StatFactory::distribution(<span class="keyword">const</span> std::vector<T>& input, <span class="keyword">typename</span> std::vector<T>::const_iterator begin, <span class="keyword">typename</span> std::vector<T>::const_iterator end, std::vector<double>& output [...]
-<div class="line"><a name="l00740"></a><span class="lineno">  740</span> <span class="keyword"></span>{</div>
-<div class="line"><a name="l00741"></a><span class="lineno">  741</span>   <span class="keywordtype">double</span> minValue=0;</div>
-<div class="line"><a name="l00742"></a><span class="lineno">  742</span>   <span class="keywordtype">double</span> maxValue=0;</div>
-<div class="line"><a name="l00743"></a><span class="lineno">  743</span>   minmax(input,begin,end,minValue,maxValue);</div>
-<div class="line"><a name="l00744"></a><span class="lineno">  744</span>   <span class="keywordflow">if</span>(minimum<maximum&&minimum>minValue)</div>
-<div class="line"><a name="l00745"></a><span class="lineno">  745</span>     minValue=minimum;</div>
-<div class="line"><a name="l00746"></a><span class="lineno">  746</span>   <span class="keywordflow">if</span>(minimum<maximum&&maximum<maxValue)</div>
-<div class="line"><a name="l00747"></a><span class="lineno">  747</span>     maxValue=maximum;</div>
-<div class="line"><a name="l00748"></a><span class="lineno">  748</span> </div>
-<div class="line"><a name="l00749"></a><span class="lineno">  749</span>   <span class="comment">//todo: check...</span></div>
-<div class="line"><a name="l00750"></a><span class="lineno">  750</span>   minimum=minValue;</div>
-<div class="line"><a name="l00751"></a><span class="lineno">  751</span>   maximum=maxValue;</div>
-<div class="line"><a name="l00752"></a><span class="lineno">  752</span> </div>
-<div class="line"><a name="l00753"></a><span class="lineno">  753</span>   <span class="keywordflow">if</span>(maximum<=minimum){</div>
-<div class="line"><a name="l00754"></a><span class="lineno">  754</span>     std::ostringstream s;</div>
-<div class="line"><a name="l00755"></a><span class="lineno">  755</span>     s<<<span class="stringliteral">"Error: could not calculate distribution (min>=max)"</span>;</div>
-<div class="line"><a name="l00756"></a><span class="lineno">  756</span>     <span class="keywordflow">throw</span>(s.str());</div>
-<div class="line"><a name="l00757"></a><span class="lineno">  757</span>   }</div>
-<div class="line"><a name="l00758"></a><span class="lineno">  758</span>   <span class="keywordflow">if</span>(!nbin){</div>
-<div class="line"><a name="l00759"></a><span class="lineno">  759</span>     std::string errorString=<span class="stringliteral">"Error: nbin not defined"</span>;</div>
-<div class="line"><a name="l00760"></a><span class="lineno">  760</span>     <span class="keywordflow">throw</span>(errorString);</div>
-<div class="line"><a name="l00761"></a><span class="lineno">  761</span>   }</div>
-<div class="line"><a name="l00762"></a><span class="lineno">  762</span>   <span class="keywordflow">if</span>(!input.size()){</div>
-<div class="line"><a name="l00763"></a><span class="lineno">  763</span>     std::string errorString=<span class="stringliteral">"Error: no valid data found"</span>;</div>
-<div class="line"><a name="l00764"></a><span class="lineno">  764</span>     <span class="keywordflow">throw</span>(errorString);</div>
-<div class="line"><a name="l00765"></a><span class="lineno">  765</span>   }</div>
-<div class="line"><a name="l00766"></a><span class="lineno">  766</span>   <span class="keywordflow">if</span>(output.size()!=nbin){</div>
-<div class="line"><a name="l00767"></a><span class="lineno">  767</span>     output.resize(nbin);</div>
-<div class="line"><a name="l00768"></a><span class="lineno">  768</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> i=0;i<nbin;output[i++]=0);</div>
-<div class="line"><a name="l00769"></a><span class="lineno">  769</span>   }</div>
-<div class="line"><a name="l00770"></a><span class="lineno">  770</span>   <span class="keywordtype">bool</span> isValid=<span class="keyword">false</span>;</div>
-<div class="line"><a name="l00771"></a><span class="lineno">  771</span>   <span class="keyword">typename</span> std::vector<T>::const_iterator it;</div>
-<div class="line"><a name="l00772"></a><span class="lineno">  772</span>   <span class="keywordflow">for</span>(it=begin;it!=end;++it){</div>
-<div class="line"><a name="l00773"></a><span class="lineno">  773</span>     <span class="keywordflow">if</span>(*it<minimum)</div>
-<div class="line"><a name="l00774"></a><span class="lineno">  774</span>       <span class="keywordflow">continue</span>;</div>
-<div class="line"><a name="l00775"></a><span class="lineno">  775</span>     <span class="keywordflow">if</span>(*it>maximum)</div>
-<div class="line"><a name="l00776"></a><span class="lineno">  776</span>       <span class="keywordflow">continue</span>;</div>
-<div class="line"><a name="l00777"></a><span class="lineno">  777</span>     <span class="keywordflow">if</span>(isNoData(*it))</div>
-<div class="line"><a name="l00778"></a><span class="lineno">  778</span>       <span class="keywordflow">continue</span>;</div>
-<div class="line"><a name="l00779"></a><span class="lineno">  779</span>     isValid=<span class="keyword">true</span>;</div>
-<div class="line"><a name="l00780"></a><span class="lineno">  780</span>     <span class="keywordflow">if</span>(sigma>0){</div>
-<div class="line"><a name="l00781"></a><span class="lineno">  781</span>       <span class="comment">// minimum-=2*sigma;</span></div>
-<div class="line"><a name="l00782"></a><span class="lineno">  782</span>       <span class="comment">// maximum+=2*sigma;</span></div>
-<div class="line"><a name="l00783"></a><span class="lineno">  783</span>       <span class="comment">//create kde for Gaussian basis function</span></div>
-<div class="line"><a name="l00784"></a><span class="lineno">  784</span>       <span class="comment">//todo: speed up by calculating first and last bin with non-zero contriubtion...</span></div>
-<div class="line"><a name="l00785"></a><span class="lineno">  785</span>       <span class="comment">//todo: calculate real surface below pdf by using gsl_cdf_gaussian_P(x-mean+binsize,sigma)-gsl_cdf_gaussian_P(x-mean,sigma)</span></div>
-<div class="line"><a name="l00786"></a><span class="lineno">  786</span>       <span class="keywordflow">for</span>(<span class="keywordtype">int</span> ibin=0;ibin<nbin;++ibin){</div>
-<div class="line"><a name="l00787"></a><span class="lineno">  787</span>         <span class="keywordtype">double</span> icenter=minimum+<span class="keyword">static_cast<</span><span class="keywordtype">double</span><span class="keyword">></span>(maximum-minimum)*(ibin+0.5)/nbin;</div>
-<div class="line"><a name="l00788"></a><span class="lineno">  788</span>         <span class="keywordtype">double</span> thePdf=gsl_ran_gaussian_pdf(*it-icenter, sigma);</div>
-<div class="line"><a name="l00789"></a><span class="lineno">  789</span>         output[ibin]+=thePdf;</div>
-<div class="line"><a name="l00790"></a><span class="lineno">  790</span>       }</div>
-<div class="line"><a name="l00791"></a><span class="lineno">  791</span>     }</div>
-<div class="line"><a name="l00792"></a><span class="lineno">  792</span>     <span class="keywordflow">else</span>{</div>
-<div class="line"><a name="l00793"></a><span class="lineno">  793</span>       <span class="keywordtype">int</span> theBin=0;</div>
-<div class="line"><a name="l00794"></a><span class="lineno">  794</span>       <span class="keywordflow">if</span>(*it==maximum)</div>
-<div class="line"><a name="l00795"></a><span class="lineno">  795</span>         theBin=nbin-1;</div>
-<div class="line"><a name="l00796"></a><span class="lineno">  796</span>       <span class="keywordflow">else</span> <span class="keywordflow">if</span>(*it>minimum && *it<maximum)</div>
-<div class="line"><a name="l00797"></a><span class="lineno">  797</span>         theBin=<span class="keyword">static_cast<</span><span class="keywordtype">int</span><span class="keyword">></span>(<span class="keyword">static_cast<</span><span class="keywordtype">double</span><span class="keyword">></span>((nbin-1)*(*it)-minimum)/(maximum-minimum));</div>
-<div class="line"><a name="l00798"></a><span class="lineno">  798</span>       ++output[theBin];</div>
-<div class="line"><a name="l00799"></a><span class="lineno">  799</span>       <span class="comment">// if(*it==maximum)</span></div>
-<div class="line"><a name="l00800"></a><span class="lineno">  800</span>       <span class="comment">//   ++output[nbin-1];</span></div>
-<div class="line"><a name="l00801"></a><span class="lineno">  801</span>       <span class="comment">// else if(*it>=minimum && *it<maximum)</span></div>
-<div class="line"><a name="l00802"></a><span class="lineno">  802</span>       <span class="comment">//   ++output[static_cast<int>(static_cast<double>((*it)-minimum)/(maximum-minimum)*nbin)];</span></div>
-<div class="line"><a name="l00803"></a><span class="lineno">  803</span>     }</div>
+<div class="line"><a name="l00660"></a><span class="lineno">  660</span>   std::vector<T> tmpV=v;</div>
+<div class="line"><a name="l00661"></a><span class="lineno">  661</span>   eraseNoData(tmpV);</div>
+<div class="line"><a name="l00662"></a><span class="lineno">  662</span>   <span class="keywordflow">if</span>(tmpV.size()){</div>
+<div class="line"><a name="l00663"></a><span class="lineno">  663</span>     sort(tmpV.begin(),tmpV.end());</div>
+<div class="line"><a name="l00664"></a><span class="lineno">  664</span>     <span class="keywordflow">if</span>(tmpV.size()%2)</div>
+<div class="line"><a name="l00665"></a><span class="lineno">  665</span>       <span class="keywordflow">return</span> tmpV[tmpV.size()/2];</div>
+<div class="line"><a name="l00666"></a><span class="lineno">  666</span>     <span class="keywordflow">else</span></div>
+<div class="line"><a name="l00667"></a><span class="lineno">  667</span>       <span class="keywordflow">return</span> 0.5*(tmpV[tmpV.size()/2-1]+tmpV[tmpV.size()/2]);</div>
+<div class="line"><a name="l00668"></a><span class="lineno">  668</span>   }</div>
+<div class="line"><a name="l00669"></a><span class="lineno">  669</span>   <span class="keywordflow">else</span> <span class="keywordflow">if</span>(m_noDataValues.size())</div>
+<div class="line"><a name="l00670"></a><span class="lineno">  670</span>     <span class="keywordflow">return</span> m_noDataValues[0];</div>
+<div class="line"><a name="l00671"></a><span class="lineno">  671</span>   <span class="keywordflow">else</span>{</div>
+<div class="line"><a name="l00672"></a><span class="lineno">  672</span>     std::string errorString=<span class="stringliteral">"Error: no valid data found"</span>;</div>
+<div class="line"><a name="l00673"></a><span class="lineno">  673</span>     <span class="keywordflow">throw</span>(errorString);</div>
+<div class="line"><a name="l00674"></a><span class="lineno">  674</span>   }</div>
+<div class="line"><a name="l00675"></a><span class="lineno">  675</span> }</div>
+<div class="line"><a name="l00676"></a><span class="lineno">  676</span> </div>
+<div class="line"><a name="l00677"></a><span class="lineno">  677</span> <span class="keyword">template</span><<span class="keyword">class</span> T> <span class="keywordtype">double</span> StatFactory::var(<span class="keyword">const</span> std::vector<T>& v)<span class="keyword"> const</span></div>
+<div class="line"><a name="l00678"></a><span class="lineno">  678</span> <span class="keyword"></span>{</div>
+<div class="line"><a name="l00679"></a><span class="lineno">  679</span>   <span class="keyword">typename</span> std::vector<T>::const_iterator it;</div>
+<div class="line"><a name="l00680"></a><span class="lineno">  680</span>   <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> validSize=0;</div>
+<div class="line"><a name="l00681"></a><span class="lineno">  681</span>   <span class="keywordtype">double</span> m1=0;</div>
+<div class="line"><a name="l00682"></a><span class="lineno">  682</span>   <span class="keywordtype">double</span> m2=0;</div>
+<div class="line"><a name="l00683"></a><span class="lineno">  683</span>   <span class="keywordflow">for</span> (it = v.begin(); it!= v.end(); ++it){</div>
+<div class="line"><a name="l00684"></a><span class="lineno">  684</span>     <span class="keywordflow">if</span>(isNoData(*it))</div>
+<div class="line"><a name="l00685"></a><span class="lineno">  685</span>       <span class="keywordflow">continue</span>;</div>
+<div class="line"><a name="l00686"></a><span class="lineno">  686</span>     m1+=*it;</div>
+<div class="line"><a name="l00687"></a><span class="lineno">  687</span>     m2+=(*it)*(*it);</div>
+<div class="line"><a name="l00688"></a><span class="lineno">  688</span>     ++validSize;</div>
+<div class="line"><a name="l00689"></a><span class="lineno">  689</span>   }</div>
+<div class="line"><a name="l00690"></a><span class="lineno">  690</span>   <span class="keywordflow">if</span>(validSize){</div>
+<div class="line"><a name="l00691"></a><span class="lineno">  691</span>     m2/=validSize;</div>
+<div class="line"><a name="l00692"></a><span class="lineno">  692</span>     m1/=validSize;</div>
+<div class="line"><a name="l00693"></a><span class="lineno">  693</span>     <span class="keywordflow">return</span> m2-m1*m1;</div>
+<div class="line"><a name="l00694"></a><span class="lineno">  694</span>   }</div>
+<div class="line"><a name="l00695"></a><span class="lineno">  695</span>   <span class="keywordflow">else</span> <span class="keywordflow">if</span>(m_noDataValues.size())</div>
+<div class="line"><a name="l00696"></a><span class="lineno">  696</span>     <span class="keywordflow">return</span> m_noDataValues[0];</div>
+<div class="line"><a name="l00697"></a><span class="lineno">  697</span>   <span class="keywordflow">else</span>{</div>
+<div class="line"><a name="l00698"></a><span class="lineno">  698</span>     std::string errorString=<span class="stringliteral">"Error: no valid data found"</span>;</div>
+<div class="line"><a name="l00699"></a><span class="lineno">  699</span>     <span class="keywordflow">throw</span>(errorString);</div>
+<div class="line"><a name="l00700"></a><span class="lineno">  700</span>   }</div>
+<div class="line"><a name="l00701"></a><span class="lineno">  701</span> }</div>
+<div class="line"><a name="l00702"></a><span class="lineno">  702</span> </div>
+<div class="line"><a name="l00703"></a><span class="lineno">  703</span> <span class="keyword">template</span><<span class="keyword">class</span> T> <span class="keywordtype">double</span> StatFactory::moment(<span class="keyword">const</span> std::vector<T>& v, <span class="keywordtype">int</span> n)<span class="keyword"> const</span></div>
+<div class="line"><a name="l00704"></a><span class="lineno">  704</span> <span class="keyword"></span>{</div>
+<div class="line"><a name="l00705"></a><span class="lineno">  705</span>   <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> validSize=0;</div>
+<div class="line"><a name="l00706"></a><span class="lineno">  706</span>   <span class="keyword">typename</span> std::vector<T>::const_iterator it;</div>
+<div class="line"><a name="l00707"></a><span class="lineno">  707</span>   <span class="keywordtype">double</span> m=0;</div>
+<div class="line"><a name="l00708"></a><span class="lineno">  708</span> <span class="comment">//   double m1=mean(v);</span></div>
+<div class="line"><a name="l00709"></a><span class="lineno">  709</span>   <span class="keywordflow">for</span>(it = v.begin(); it!= v.end(); ++it){</div>
+<div class="line"><a name="l00710"></a><span class="lineno">  710</span>     <span class="keywordflow">if</span>(isNoData(*it))</div>
+<div class="line"><a name="l00711"></a><span class="lineno">  711</span>       <span class="keywordflow">continue</span>;</div>
+<div class="line"><a name="l00712"></a><span class="lineno">  712</span>     m+=pow((*it),n);</div>
+<div class="line"><a name="l00713"></a><span class="lineno">  713</span>     ++validSize;</div>
+<div class="line"><a name="l00714"></a><span class="lineno">  714</span>   }</div>
+<div class="line"><a name="l00715"></a><span class="lineno">  715</span>   <span class="keywordflow">if</span>(validSize)</div>
+<div class="line"><a name="l00716"></a><span class="lineno">  716</span>     <span class="keywordflow">return</span> m/validSize;</div>
+<div class="line"><a name="l00717"></a><span class="lineno">  717</span>   <span class="keywordflow">else</span> <span class="keywordflow">if</span>(m_noDataValues.size())</div>
+<div class="line"><a name="l00718"></a><span class="lineno">  718</span>     <span class="keywordflow">return</span> m_noDataValues[0];</div>
+<div class="line"><a name="l00719"></a><span class="lineno">  719</span>   <span class="keywordflow">else</span>{</div>
+<div class="line"><a name="l00720"></a><span class="lineno">  720</span>     std::string errorString=<span class="stringliteral">"Error: no valid data found"</span>;</div>
+<div class="line"><a name="l00721"></a><span class="lineno">  721</span>     <span class="keywordflow">throw</span>(errorString);</div>
+<div class="line"><a name="l00722"></a><span class="lineno">  722</span>   }</div>
+<div class="line"><a name="l00723"></a><span class="lineno">  723</span> }</div>
+<div class="line"><a name="l00724"></a><span class="lineno">  724</span> </div>
+<div class="line"><a name="l00725"></a><span class="lineno">  725</span>   <span class="comment">//central moment</span></div>
+<div class="line"><a name="l00726"></a><span class="lineno">  726</span> <span class="keyword">template</span><<span class="keyword">class</span> T> <span class="keywordtype">double</span> StatFactory::cmoment(<span class="keyword">const</span> std::vector<T>& v, <span class="keywordtype">int</span> n)<span class="keyword"> const</span></div>
+<div class="line"><a name="l00727"></a><span class="lineno">  727</span> <span class="keyword"></span>{</div>
+<div class="line"><a name="l00728"></a><span class="lineno">  728</span>   <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> validSize=0;</div>
+<div class="line"><a name="l00729"></a><span class="lineno">  729</span>   <span class="keyword">typename</span> std::vector<T>::const_iterator it;</div>
+<div class="line"><a name="l00730"></a><span class="lineno">  730</span>   <span class="keywordtype">double</span> m=0;</div>
+<div class="line"><a name="l00731"></a><span class="lineno">  731</span>   <span class="keywordtype">double</span> m1=mean(v);</div>
+<div class="line"><a name="l00732"></a><span class="lineno">  732</span>   <span class="keywordflow">for</span>(it = v.begin(); it!= v.end(); ++it){</div>
+<div class="line"><a name="l00733"></a><span class="lineno">  733</span>     <span class="keywordflow">if</span>(isNoData(*it))</div>
+<div class="line"><a name="l00734"></a><span class="lineno">  734</span>       <span class="keywordflow">continue</span>;</div>
+<div class="line"><a name="l00735"></a><span class="lineno">  735</span>     m+=pow((*it-m1),n);</div>
+<div class="line"><a name="l00736"></a><span class="lineno">  736</span>     ++validSize;</div>
+<div class="line"><a name="l00737"></a><span class="lineno">  737</span>   }</div>
+<div class="line"><a name="l00738"></a><span class="lineno">  738</span>   <span class="keywordflow">if</span>(validSize)</div>
+<div class="line"><a name="l00739"></a><span class="lineno">  739</span>     <span class="keywordflow">return</span> m/validSize;</div>
+<div class="line"><a name="l00740"></a><span class="lineno">  740</span>   <span class="keywordflow">else</span> <span class="keywordflow">if</span>(m_noDataValues.size())</div>
+<div class="line"><a name="l00741"></a><span class="lineno">  741</span>     <span class="keywordflow">return</span> m_noDataValues[0];</div>
+<div class="line"><a name="l00742"></a><span class="lineno">  742</span>   <span class="keywordflow">else</span>{</div>
+<div class="line"><a name="l00743"></a><span class="lineno">  743</span>     std::string errorString=<span class="stringliteral">"Error: no valid data found"</span>;</div>
+<div class="line"><a name="l00744"></a><span class="lineno">  744</span>     <span class="keywordflow">throw</span>(errorString);</div>
+<div class="line"><a name="l00745"></a><span class="lineno">  745</span>   }</div>
+<div class="line"><a name="l00746"></a><span class="lineno">  746</span> }</div>
+<div class="line"><a name="l00747"></a><span class="lineno">  747</span> </div>
+<div class="line"><a name="l00748"></a><span class="lineno">  748</span> <span class="keyword">template</span><<span class="keyword">class</span> T> <span class="keywordtype">double</span> StatFactory::skewness(<span class="keyword">const</span> std::vector<T>& v)<span class="keyword"> const</span></div>
+<div class="line"><a name="l00749"></a><span class="lineno">  749</span> <span class="keyword"></span>{</div>
+<div class="line"><a name="l00750"></a><span class="lineno">  750</span>   <span class="comment">//todo: what if nodata value?</span></div>
+<div class="line"><a name="l00751"></a><span class="lineno">  751</span>   <span class="keywordflow">return</span> cmoment(v,3)/pow(var(v),1.5);</div>
+<div class="line"><a name="l00752"></a><span class="lineno">  752</span> }</div>
+<div class="line"><a name="l00753"></a><span class="lineno">  753</span> </div>
+<div class="line"><a name="l00754"></a><span class="lineno">  754</span> <span class="keyword">template</span><<span class="keyword">class</span> T> <span class="keywordtype">double</span> StatFactory::kurtosis(<span class="keyword">const</span> std::vector<T>& v)<span class="keyword"> const</span></div>
+<div class="line"><a name="l00755"></a><span class="lineno">  755</span> <span class="keyword"></span>{</div>
+<div class="line"><a name="l00756"></a><span class="lineno">  756</span>   <span class="comment">//todo: what if nodata value?</span></div>
+<div class="line"><a name="l00757"></a><span class="lineno">  757</span>   <span class="keywordtype">double</span> m2=cmoment(v,2);</div>
+<div class="line"><a name="l00758"></a><span class="lineno">  758</span>   <span class="keywordtype">double</span> m4=cmoment(v,4);</div>
+<div class="line"><a name="l00759"></a><span class="lineno">  759</span>   <span class="keywordflow">return</span> m4/m2/m2-3.0;</div>
+<div class="line"><a name="l00760"></a><span class="lineno">  760</span> }</div>
+<div class="line"><a name="l00761"></a><span class="lineno">  761</span> </div>
+<div class="line"><a name="l00762"></a><span class="lineno">  762</span> <span class="keyword">template</span><<span class="keyword">class</span> T> <span class="keywordtype">void</span> StatFactory::meanVar(<span class="keyword">const</span> std::vector<T>& v, <span class="keywordtype">double</span>& m1, <span class="keywordtype">double</span>& v1)<span class="keyword"> const</span></div>
+<div class="line"><a name="l00763"></a><span class="lineno">  763</span> <span class="keyword"></span>{</div>
+<div class="line"><a name="l00764"></a><span class="lineno">  764</span>   <span class="keyword">typename</span> std::vector<T>::const_iterator it;</div>
+<div class="line"><a name="l00765"></a><span class="lineno">  765</span>   <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> validSize=0;</div>
+<div class="line"><a name="l00766"></a><span class="lineno">  766</span>   m1=0;</div>
+<div class="line"><a name="l00767"></a><span class="lineno">  767</span>   v1=0;</div>
+<div class="line"><a name="l00768"></a><span class="lineno">  768</span>   <span class="keywordtype">double</span> m2=0;</div>
+<div class="line"><a name="l00769"></a><span class="lineno">  769</span>   <span class="keywordflow">for</span> (it = v.begin(); it!= v.end(); ++it){</div>
+<div class="line"><a name="l00770"></a><span class="lineno">  770</span>     <span class="keywordflow">if</span>(isNoData(*it))</div>
+<div class="line"><a name="l00771"></a><span class="lineno">  771</span>       <span class="keywordflow">continue</span>;</div>
+<div class="line"><a name="l00772"></a><span class="lineno">  772</span>     m1+=*it;</div>
+<div class="line"><a name="l00773"></a><span class="lineno">  773</span>     m2+=(*it)*(*it);</div>
+<div class="line"><a name="l00774"></a><span class="lineno">  774</span>     ++validSize;</div>
+<div class="line"><a name="l00775"></a><span class="lineno">  775</span>   }</div>
+<div class="line"><a name="l00776"></a><span class="lineno">  776</span>   <span class="keywordflow">if</span>(validSize){</div>
+<div class="line"><a name="l00777"></a><span class="lineno">  777</span>     m2/=validSize;</div>
+<div class="line"><a name="l00778"></a><span class="lineno">  778</span>     m1/=validSize;</div>
+<div class="line"><a name="l00779"></a><span class="lineno">  779</span>     v1=m2-m1*m1;</div>
+<div class="line"><a name="l00780"></a><span class="lineno">  780</span>   }</div>
+<div class="line"><a name="l00781"></a><span class="lineno">  781</span>   <span class="keywordflow">else</span> <span class="keywordflow">if</span>(m_noDataValues.size()){</div>
+<div class="line"><a name="l00782"></a><span class="lineno">  782</span>     m1=m_noDataValues[0];</div>
+<div class="line"><a name="l00783"></a><span class="lineno">  783</span>     v1=m_noDataValues[0];</div>
+<div class="line"><a name="l00784"></a><span class="lineno">  784</span>   }</div>
+<div class="line"><a name="l00785"></a><span class="lineno">  785</span>   <span class="keywordflow">else</span>{</div>
+<div class="line"><a name="l00786"></a><span class="lineno">  786</span>     std::string errorString=<span class="stringliteral">"Error: no valid data found"</span>;</div>
+<div class="line"><a name="l00787"></a><span class="lineno">  787</span>     <span class="keywordflow">throw</span>(errorString);</div>
+<div class="line"><a name="l00788"></a><span class="lineno">  788</span>   }</div>
+<div class="line"><a name="l00789"></a><span class="lineno">  789</span> }</div>
+<div class="line"><a name="l00790"></a><span class="lineno">  790</span> </div>
+<div class="line"><a name="l00791"></a><span class="lineno">  791</span> <span class="keyword">template</span><<span class="keyword">class</span> T1, <span class="keyword">class</span> T2> <span class="keywordtype">void</span> StatFactory::scale2byte(<span class="keyword">const</span> std::vector<T1>& input, std::vector<T2>& output, <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> lbound,  <span class="keywordtype">unsigned</s [...]
+<div class="line"><a name="l00792"></a><span class="lineno">  792</span> <span class="keyword"></span>{</div>
+<div class="line"><a name="l00793"></a><span class="lineno">  793</span>   output.resize(input.size());</div>
+<div class="line"><a name="l00794"></a><span class="lineno">  794</span>   T1 minimum=mymin(input);</div>
+<div class="line"><a name="l00795"></a><span class="lineno">  795</span>   T1 maximum=mymax(input);</div>
+<div class="line"><a name="l00796"></a><span class="lineno">  796</span>   <span class="keywordflow">if</span>(minimum>=maximum){</div>
+<div class="line"><a name="l00797"></a><span class="lineno">  797</span>     std::string errorString=<span class="stringliteral">"Error: no valid data found"</span>;</div>
+<div class="line"><a name="l00798"></a><span class="lineno">  798</span>     <span class="keywordflow">throw</span>(errorString);</div>
+<div class="line"><a name="l00799"></a><span class="lineno">  799</span>   }</div>
+<div class="line"><a name="l00800"></a><span class="lineno">  800</span>   <span class="keywordtype">double</span> scale=(ubound-lbound)/(maximum-minimum);</div>
+<div class="line"><a name="l00801"></a><span class="lineno">  801</span>   <span class="comment">//todo: what if nodata value?</span></div>
+<div class="line"><a name="l00802"></a><span class="lineno">  802</span>   <span class="keywordflow">for</span> (<span class="keywordtype">int</span> i=0;i<input.size();++i){</div>
+<div class="line"><a name="l00803"></a><span class="lineno">  803</span>     output[i]=scale*(input[i]-(minimum))+lbound;</div>
 <div class="line"><a name="l00804"></a><span class="lineno">  804</span>   }</div>
-<div class="line"><a name="l00805"></a><span class="lineno">  805</span>   <span class="keywordflow">if</span>(!isValid){</div>
-<div class="line"><a name="l00806"></a><span class="lineno">  806</span>     std::string errorString=<span class="stringliteral">"Error: no valid data found"</span>;</div>
-<div class="line"><a name="l00807"></a><span class="lineno">  807</span>     <span class="keywordflow">throw</span>(errorString);</div>
-<div class="line"><a name="l00808"></a><span class="lineno">  808</span>   }</div>
-<div class="line"><a name="l00809"></a><span class="lineno">  809</span>   <span class="keywordflow">else</span> <span class="keywordflow">if</span>(!filename.empty()){</div>
-<div class="line"><a name="l00810"></a><span class="lineno">  810</span>     std::ofstream outputfile;</div>
-<div class="line"><a name="l00811"></a><span class="lineno">  811</span>     outputfile.open(filename.c_str());</div>
-<div class="line"><a name="l00812"></a><span class="lineno">  812</span>     <span class="keywordflow">if</span>(!outputfile){</div>
-<div class="line"><a name="l00813"></a><span class="lineno">  813</span>       std::ostringstream s;</div>
-<div class="line"><a name="l00814"></a><span class="lineno">  814</span>       s<<<span class="stringliteral">"Error opening distribution file , "</span> << filename;</div>
-<div class="line"><a name="l00815"></a><span class="lineno">  815</span>       <span class="keywordflow">throw</span>(s.str());</div>
-<div class="line"><a name="l00816"></a><span class="lineno">  816</span>     }</div>
-<div class="line"><a name="l00817"></a><span class="lineno">  817</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> ibin=0;ibin<nbin;++ibin)</div>
-<div class="line"><a name="l00818"></a><span class="lineno">  818</span>       outputfile << minimum+static_cast<double>(maximum-minimum)*(ibin+0.5)/nbin << <span class="stringliteral">" "</span> << <span class="keyword">static_cast<</span><span class="keywordtype">double</span><span class="keyword">></span>(output[ibin])/input.size() << std::endl;</div>
-<div class="line"><a name="l00819"></a><span class="lineno">  819</span>     outputfile.close();</div>
-<div class="line"><a name="l00820"></a><span class="lineno">  820</span>   }</div>
-<div class="line"><a name="l00821"></a><span class="lineno">  821</span> }</div>
-<div class="line"><a name="l00822"></a><span class="lineno">  822</span> </div>
-<div class="line"><a name="l00823"></a><span class="lineno">  823</span> <span class="keyword">template</span><<span class="keyword">class</span> T> <span class="keywordtype">void</span>  StatFactory::distribution2d(<span class="keyword">const</span> std::vector<T>& inputX, <span class="keyword">const</span> std::vector<T>& inputY, std::vector< std::vector<double> >& output, <span class="keywordtype">int</span> nbin, T& minX, T& maxX [...]
-<div class="line"><a name="l00824"></a><span class="lineno">  824</span> <span class="keyword"></span>{</div>
-<div class="line"><a name="l00825"></a><span class="lineno">  825</span>   <span class="keywordflow">if</span>(inputX.empty()){</div>
-<div class="line"><a name="l00826"></a><span class="lineno">  826</span>     std::ostringstream s;</div>
-<div class="line"><a name="l00827"></a><span class="lineno">  827</span>     s<<<span class="stringliteral">"Error: inputX is empty"</span>;</div>
-<div class="line"><a name="l00828"></a><span class="lineno">  828</span>     <span class="keywordflow">throw</span>(s.str());</div>
+<div class="line"><a name="l00805"></a><span class="lineno">  805</span> }</div>
+<div class="line"><a name="l00806"></a><span class="lineno">  806</span> </div>
+<div class="line"><a name="l00807"></a><span class="lineno">  807</span> <span class="keyword">template</span><<span class="keyword">class</span> T> <span class="keywordtype">void</span>  StatFactory::distribution(<span class="keyword">const</span> std::vector<T>& input, <span class="keyword">typename</span> std::vector<T>::const_iterator begin, <span class="keyword">typename</span> std::vector<T>::const_iterator end, std::vector<double>& output [...]
+<div class="line"><a name="l00808"></a><span class="lineno">  808</span> <span class="keyword"></span>{</div>
+<div class="line"><a name="l00809"></a><span class="lineno">  809</span>   <span class="keywordtype">double</span> minValue=0;</div>
+<div class="line"><a name="l00810"></a><span class="lineno">  810</span>   <span class="keywordtype">double</span> maxValue=0;</div>
+<div class="line"><a name="l00811"></a><span class="lineno">  811</span>   minmax(input,begin,end,minValue,maxValue);</div>
+<div class="line"><a name="l00812"></a><span class="lineno">  812</span>   <span class="keywordflow">if</span>(minimum<maximum&&minimum>minValue)</div>
+<div class="line"><a name="l00813"></a><span class="lineno">  813</span>     minValue=minimum;</div>
+<div class="line"><a name="l00814"></a><span class="lineno">  814</span>   <span class="keywordflow">if</span>(minimum<maximum&&maximum<maxValue)</div>
+<div class="line"><a name="l00815"></a><span class="lineno">  815</span>     maxValue=maximum;</div>
+<div class="line"><a name="l00816"></a><span class="lineno">  816</span> </div>
+<div class="line"><a name="l00817"></a><span class="lineno">  817</span>   <span class="comment">//todo: check...</span></div>
+<div class="line"><a name="l00818"></a><span class="lineno">  818</span>   minimum=minValue;</div>
+<div class="line"><a name="l00819"></a><span class="lineno">  819</span>   maximum=maxValue;</div>
+<div class="line"><a name="l00820"></a><span class="lineno">  820</span> </div>
+<div class="line"><a name="l00821"></a><span class="lineno">  821</span>   <span class="keywordflow">if</span>(maximum<=minimum){</div>
+<div class="line"><a name="l00822"></a><span class="lineno">  822</span>     std::ostringstream s;</div>
+<div class="line"><a name="l00823"></a><span class="lineno">  823</span>     s<<<span class="stringliteral">"Error: could not calculate distribution (min>=max)"</span>;</div>
+<div class="line"><a name="l00824"></a><span class="lineno">  824</span>     <span class="keywordflow">throw</span>(s.str());</div>
+<div class="line"><a name="l00825"></a><span class="lineno">  825</span>   }</div>
+<div class="line"><a name="l00826"></a><span class="lineno">  826</span>   <span class="keywordflow">if</span>(!nbin){</div>
+<div class="line"><a name="l00827"></a><span class="lineno">  827</span>     std::string errorString=<span class="stringliteral">"Error: nbin not defined"</span>;</div>
+<div class="line"><a name="l00828"></a><span class="lineno">  828</span>     <span class="keywordflow">throw</span>(errorString);</div>
 <div class="line"><a name="l00829"></a><span class="lineno">  829</span>   }</div>
-<div class="line"><a name="l00830"></a><span class="lineno">  830</span>   <span class="keywordflow">if</span>(inputX.size()!=inputY.size()){</div>
-<div class="line"><a name="l00831"></a><span class="lineno">  831</span>     std::ostringstream s;</div>
-<div class="line"><a name="l00832"></a><span class="lineno">  832</span>     s<<<span class="stringliteral">"Error: inputX is empty"</span>;</div>
-<div class="line"><a name="l00833"></a><span class="lineno">  833</span>     <span class="keywordflow">throw</span>(s.str());</div>
-<div class="line"><a name="l00834"></a><span class="lineno">  834</span>   }</div>
-<div class="line"><a name="l00835"></a><span class="lineno">  835</span>   <span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> npoint=inputX.size();</div>
-<div class="line"><a name="l00836"></a><span class="lineno">  836</span>   <span class="keywordflow">if</span>(maxX<=minX)</div>
-<div class="line"><a name="l00837"></a><span class="lineno">  837</span>     minmax(inputX,inputX.begin(),inputX.end(),minX,maxX);</div>
-<div class="line"><a name="l00838"></a><span class="lineno">  838</span>   <span class="keywordflow">if</span>(maxX<=minX){</div>
-<div class="line"><a name="l00839"></a><span class="lineno">  839</span>     std::ostringstream s;</div>
-<div class="line"><a name="l00840"></a><span class="lineno">  840</span>     s<<<span class="stringliteral">"Error: could not calculate distribution (minX>=maxX)"</span>;</div>
-<div class="line"><a name="l00841"></a><span class="lineno">  841</span>     <span class="keywordflow">throw</span>(s.str());</div>
-<div class="line"><a name="l00842"></a><span class="lineno">  842</span>   }</div>
-<div class="line"><a name="l00843"></a><span class="lineno">  843</span>   <span class="keywordflow">if</span>(maxY<=minY)</div>
-<div class="line"><a name="l00844"></a><span class="lineno">  844</span>     minmax(inputY,inputY.begin(),inputY.end(),minY,maxY);</div>
-<div class="line"><a name="l00845"></a><span class="lineno">  845</span>   <span class="keywordflow">if</span>(maxY<=minY){</div>
-<div class="line"><a name="l00846"></a><span class="lineno">  846</span>     std::ostringstream s;</div>
-<div class="line"><a name="l00847"></a><span class="lineno">  847</span>     s<<<span class="stringliteral">"Error: could not calculate distribution (minY>=maxY)"</span>;</div>
-<div class="line"><a name="l00848"></a><span class="lineno">  848</span>     <span class="keywordflow">throw</span>(s.str());</div>
-<div class="line"><a name="l00849"></a><span class="lineno">  849</span>   }</div>
-<div class="line"><a name="l00850"></a><span class="lineno">  850</span>   <span class="keywordflow">if</span>(nbin<=1){</div>
-<div class="line"><a name="l00851"></a><span class="lineno">  851</span>     std::ostringstream s;</div>
-<div class="line"><a name="l00852"></a><span class="lineno">  852</span>     s<<<span class="stringliteral">"Error: nbin must be larger than 1"</span>;</div>
-<div class="line"><a name="l00853"></a><span class="lineno">  853</span>     <span class="keywordflow">throw</span>(s.str());</div>
-<div class="line"><a name="l00854"></a><span class="lineno">  854</span>   }</div>
-<div class="line"><a name="l00855"></a><span class="lineno">  855</span>   output.resize(nbin);</div>
-<div class="line"><a name="l00856"></a><span class="lineno">  856</span>   <span class="keywordflow">for</span>(<span class="keywordtype">int</span> i=0;i<nbin;++i){</div>
-<div class="line"><a name="l00857"></a><span class="lineno">  857</span>     output[i].resize(nbin);</div>
-<div class="line"><a name="l00858"></a><span class="lineno">  858</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> j=0;j<nbin;++j)</div>
-<div class="line"><a name="l00859"></a><span class="lineno">  859</span>       output[i][j]=0;</div>
-<div class="line"><a name="l00860"></a><span class="lineno">  860</span>   }</div>
-<div class="line"><a name="l00861"></a><span class="lineno">  861</span>   <span class="keywordtype">int</span> binX=0;</div>
-<div class="line"><a name="l00862"></a><span class="lineno">  862</span>   <span class="keywordtype">int</span> binY=0;</div>
-<div class="line"><a name="l00863"></a><span class="lineno">  863</span>   <span class="keywordflow">for</span>(<span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> ipoint=0;ipoint<npoint;++ipoint){</div>
-<div class="line"><a name="l00864"></a><span class="lineno">  864</span>     <span class="keywordflow">if</span>(inputX[ipoint]==maxX)</div>
-<div class="line"><a name="l00865"></a><span class="lineno">  865</span>        binX=nbin-1;</div>
-<div class="line"><a name="l00866"></a><span class="lineno">  866</span>     <span class="keywordflow">else</span></div>
-<div class="line"><a name="l00867"></a><span class="lineno">  867</span>       binX=<span class="keyword">static_cast<</span><span class="keywordtype">int</span><span class="keyword">></span>(<span class="keyword">static_cast<</span><span class="keywordtype">double</span><span class="keyword">></span>(inputX[ipoint]-minX)/(maxX-minX)*nbin);</div>
-<div class="line"><a name="l00868"></a><span class="lineno">  868</span>     <span class="keywordflow">if</span>(inputY[ipoint]==maxY)</div>
-<div class="line"><a name="l00869"></a><span class="lineno">  869</span>        binY=nbin-1;</div>
-<div class="line"><a name="l00870"></a><span class="lineno">  870</span>     <span class="keywordflow">else</span></div>
-<div class="line"><a name="l00871"></a><span class="lineno">  871</span>       binY=<span class="keyword">static_cast<</span><span class="keywordtype">int</span><span class="keyword">></span>(<span class="keyword">static_cast<</span><span class="keywordtype">double</span><span class="keyword">></span>(inputY[ipoint]-minY)/(maxY-minY)*nbin);</div>
-<div class="line"><a name="l00872"></a><span class="lineno">  872</span>     <span class="keywordflow">if</span>(binX<0){</div>
-<div class="line"><a name="l00873"></a><span class="lineno">  873</span>       std::ostringstream s;</div>
-<div class="line"><a name="l00874"></a><span class="lineno">  874</span>       s<<<span class="stringliteral">"Error: binX is smaller than 0"</span>;</div>
-<div class="line"><a name="l00875"></a><span class="lineno">  875</span>       <span class="keywordflow">throw</span>(s.str());</div>
-<div class="line"><a name="l00876"></a><span class="lineno">  876</span>     }</div>
-<div class="line"><a name="l00877"></a><span class="lineno">  877</span>     <span class="keywordflow">if</span>(output.size()<=binX){</div>
-<div class="line"><a name="l00878"></a><span class="lineno">  878</span>       std::ostringstream s;</div>
-<div class="line"><a name="l00879"></a><span class="lineno">  879</span>       s<<<span class="stringliteral">"Error: output size must be larger than binX"</span>;</div>
-<div class="line"><a name="l00880"></a><span class="lineno">  880</span>       <span class="keywordflow">throw</span>(s.str());</div>
-<div class="line"><a name="l00881"></a><span class="lineno">  881</span>     }</div>
-<div class="line"><a name="l00882"></a><span class="lineno">  882</span>     <span class="keywordflow">if</span>(binY<0){</div>
-<div class="line"><a name="l00883"></a><span class="lineno">  883</span>       std::ostringstream s;</div>
-<div class="line"><a name="l00884"></a><span class="lineno">  884</span>       s<<<span class="stringliteral">"Error: binY is smaller than 0"</span>;</div>
-<div class="line"><a name="l00885"></a><span class="lineno">  885</span>       <span class="keywordflow">throw</span>(s.str());</div>
-<div class="line"><a name="l00886"></a><span class="lineno">  886</span>     }</div>
-<div class="line"><a name="l00887"></a><span class="lineno">  887</span>     <span class="keywordflow">if</span>(output.size()<=binY){</div>
-<div class="line"><a name="l00888"></a><span class="lineno">  888</span>       std::ostringstream s;</div>
-<div class="line"><a name="l00889"></a><span class="lineno">  889</span>       s<<<span class="stringliteral">"Error: output size must be larger than binY"</span>;</div>
-<div class="line"><a name="l00890"></a><span class="lineno">  890</span>       <span class="keywordflow">throw</span>(s.str());</div>
-<div class="line"><a name="l00891"></a><span class="lineno">  891</span>     }</div>
-<div class="line"><a name="l00892"></a><span class="lineno">  892</span>     <span class="keywordflow">if</span>(sigma>0){</div>
-<div class="line"><a name="l00893"></a><span class="lineno">  893</span>       <span class="comment">// minX-=2*sigma;</span></div>
-<div class="line"><a name="l00894"></a><span class="lineno">  894</span>       <span class="comment">// maxX+=2*sigma;</span></div>
-<div class="line"><a name="l00895"></a><span class="lineno">  895</span>       <span class="comment">// minY-=2*sigma;</span></div>
-<div class="line"><a name="l00896"></a><span class="lineno">  896</span>       <span class="comment">// maxY+=2*sigma;</span></div>
-<div class="line"><a name="l00897"></a><span class="lineno">  897</span>       <span class="comment">//create kde for Gaussian basis function</span></div>
-<div class="line"><a name="l00898"></a><span class="lineno">  898</span>       <span class="comment">//todo: speed up by calculating first and last bin with non-zero contriubtion...</span></div>
-<div class="line"><a name="l00899"></a><span class="lineno">  899</span>       <span class="keywordflow">for</span>(<span class="keywordtype">int</span> ibinX=0;ibinX<nbin;++ibinX){</div>
-<div class="line"><a name="l00900"></a><span class="lineno">  900</span>         <span class="keywordtype">double</span> centerX=minX+<span class="keyword">static_cast<</span><span class="keywordtype">double</span><span class="keyword">></span>(maxX-minX)*ibinX/nbin;</div>
-<div class="line"><a name="l00901"></a><span class="lineno">  901</span>         <span class="keywordtype">double</span> pdfX=gsl_ran_gaussian_pdf(inputX[ipoint]-centerX, sigma);</div>
-<div class="line"><a name="l00902"></a><span class="lineno">  902</span>         <span class="keywordflow">for</span>(<span class="keywordtype">int</span> ibinY=0;ibinY<nbin;++ibinY){</div>
-<div class="line"><a name="l00903"></a><span class="lineno">  903</span>           <span class="comment">//calculate  \integral_ibinX^(ibinX+1)</span></div>
-<div class="line"><a name="l00904"></a><span class="lineno">  904</span>           <span class="keywordtype">double</span> centerY=minY+<span class="keyword">static_cast<</span><span class="keywordtype">double</span><span class="keyword">></span>(maxY-minY)*ibinY/nbin;</div>
-<div class="line"><a name="l00905"></a><span class="lineno">  905</span>           <span class="keywordtype">double</span> pdfY=gsl_ran_gaussian_pdf(inputY[ipoint]-centerY, sigma);</div>
-<div class="line"><a name="l00906"></a><span class="lineno">  906</span>           output[ibinX][binY]+=pdfX*pdfY;</div>
-<div class="line"><a name="l00907"></a><span class="lineno">  907</span>         }</div>
-<div class="line"><a name="l00908"></a><span class="lineno">  908</span>       }</div>
-<div class="line"><a name="l00909"></a><span class="lineno">  909</span>     }</div>
-<div class="line"><a name="l00910"></a><span class="lineno">  910</span>     <span class="keywordflow">else</span></div>
-<div class="line"><a name="l00911"></a><span class="lineno">  911</span>       ++output[binX][binY];</div>
-<div class="line"><a name="l00912"></a><span class="lineno">  912</span>   }</div>
-<div class="line"><a name="l00913"></a><span class="lineno">  913</span>   <span class="keywordflow">if</span>(!filename.empty()){</div>
-<div class="line"><a name="l00914"></a><span class="lineno">  914</span>     std::ofstream outputfile;</div>
-<div class="line"><a name="l00915"></a><span class="lineno">  915</span>     outputfile.open(filename.c_str());</div>
-<div class="line"><a name="l00916"></a><span class="lineno">  916</span>     <span class="keywordflow">if</span>(!outputfile){</div>
-<div class="line"><a name="l00917"></a><span class="lineno">  917</span>       std::ostringstream s;</div>
-<div class="line"><a name="l00918"></a><span class="lineno">  918</span>       s<<<span class="stringliteral">"Error opening distribution file , "</span> << filename;</div>
-<div class="line"><a name="l00919"></a><span class="lineno">  919</span>       <span class="keywordflow">throw</span>(s.str());</div>
-<div class="line"><a name="l00920"></a><span class="lineno">  920</span>     }</div>
-<div class="line"><a name="l00921"></a><span class="lineno">  921</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> binX=0;binX<nbin;++binX){</div>
-<div class="line"><a name="l00922"></a><span class="lineno">  922</span>       outputfile << std::endl;</div>
-<div class="line"><a name="l00923"></a><span class="lineno">  923</span>       <span class="keywordflow">for</span>(<span class="keywordtype">int</span> binY=0;binY<nbin;++binY){</div>
-<div class="line"><a name="l00924"></a><span class="lineno">  924</span>     <span class="keywordtype">double</span> binValueX=0;</div>
-<div class="line"><a name="l00925"></a><span class="lineno">  925</span>     <span class="keywordflow">if</span>(nbin==maxX-minX+1)</div>
-<div class="line"><a name="l00926"></a><span class="lineno">  926</span>       binValueX=minX+binX;</div>
-<div class="line"><a name="l00927"></a><span class="lineno">  927</span>     <span class="keywordflow">else</span></div>
-<div class="line"><a name="l00928"></a><span class="lineno">  928</span>       binValueX=minX+<span class="keyword">static_cast<</span><span class="keywordtype">double</span><span class="keyword">></span>(maxX-minX)*(binX+0.5)/nbin;</div>
-<div class="line"><a name="l00929"></a><span class="lineno">  929</span>     <span class="keywordtype">double</span> binValueY=0;</div>
-<div class="line"><a name="l00930"></a><span class="lineno">  930</span>     <span class="keywordflow">if</span>(nbin==maxY-minY+1)</div>
-<div class="line"><a name="l00931"></a><span class="lineno">  931</span>       binValueY=minY+binY;</div>
-<div class="line"><a name="l00932"></a><span class="lineno">  932</span>     <span class="keywordflow">else</span></div>
-<div class="line"><a name="l00933"></a><span class="lineno">  933</span>       binValueY=minY+<span class="keyword">static_cast<</span><span class="keywordtype">double</span><span class="keyword">></span>(maxY-minY)*(binY+0.5)/nbin;</div>
-<div class="line"><a name="l00934"></a><span class="lineno">  934</span>         <span class="keywordtype">double</span> value=0;</div>
-<div class="line"><a name="l00935"></a><span class="lineno">  935</span>         value=<span class="keyword">static_cast<</span><span class="keywordtype">double</span><span class="keyword">></span>(output[binX][binY])/npoint;</div>
-<div class="line"><a name="l00936"></a><span class="lineno">  936</span>     outputfile << binValueX << <span class="stringliteral">" "</span> << binValueY << <span class="stringliteral">" "</span> << value << std::endl;</div>
-<div class="line"><a name="l00937"></a><span class="lineno">  937</span>         <span class="comment">/* double value=static_cast<double>(output[binX][binY])/npoint; */</span></div>
-<div class="line"><a name="l00938"></a><span class="lineno">  938</span>         <span class="comment">/* outputfile << (maxX-minX)*bin/(nbin-1)+minX << " " << (maxY-minY)*bin/(nbin-1)+minY << " " << value << std::endl; */</span></div>
-<div class="line"><a name="l00939"></a><span class="lineno">  939</span>       }</div>
-<div class="line"><a name="l00940"></a><span class="lineno">  940</span>     }</div>
-<div class="line"><a name="l00941"></a><span class="lineno">  941</span>     outputfile.close();</div>
-<div class="line"><a name="l00942"></a><span class="lineno">  942</span>   }</div>
-<div class="line"><a name="l00943"></a><span class="lineno">  943</span> }</div>
-<div class="line"><a name="l00944"></a><span class="lineno">  944</span> </div>
-<div class="line"><a name="l00945"></a><span class="lineno">  945</span> <span class="comment">//todo: what with nodata values?</span></div>
-<div class="line"><a name="l00946"></a><span class="lineno">  946</span> <span class="keyword">template</span><<span class="keyword">class</span> T> <span class="keywordtype">void</span>  StatFactory::percentiles (<span class="keyword">const</span> std::vector<T>& input, <span class="keyword">typename</span> std::vector<T>::const_iterator begin, <span class="keyword">typename</span> std::vector<T>::const_iterator end, std::vector<T>& output, <sp [...]
-<div class="line"><a name="l00947"></a><span class="lineno">  947</span> <span class="keyword"></span>{</div>
-<div class="line"><a name="l00948"></a><span class="lineno">  948</span>   <span class="keywordflow">if</span>(maximum<=minimum)</div>
-<div class="line"><a name="l00949"></a><span class="lineno">  949</span>     minmax(input,begin,end,minimum,maximum);</div>
-<div class="line"><a name="l00950"></a><span class="lineno">  950</span>   <span class="keywordflow">if</span>(maximum<=minimum){</div>
-<div class="line"><a name="l00951"></a><span class="lineno">  951</span>     std::ostringstream s;</div>
-<div class="line"><a name="l00952"></a><span class="lineno">  952</span>     s<<<span class="stringliteral">"Error: maximum must be at least minimum"</span>;</div>
-<div class="line"><a name="l00953"></a><span class="lineno">  953</span>     <span class="keywordflow">throw</span>(s.str());</div>
-<div class="line"><a name="l00954"></a><span class="lineno">  954</span>   }</div>
-<div class="line"><a name="l00955"></a><span class="lineno">  955</span>   <span class="keywordflow">if</span>(nbin<=1){</div>
-<div class="line"><a name="l00956"></a><span class="lineno">  956</span>     std::ostringstream s;</div>
-<div class="line"><a name="l00957"></a><span class="lineno">  957</span>     s<<<span class="stringliteral">"Error: nbin must be larger than 1"</span>;</div>
-<div class="line"><a name="l00958"></a><span class="lineno">  958</span>     <span class="keywordflow">throw</span>(s.str());</div>
-<div class="line"><a name="l00959"></a><span class="lineno">  959</span>   }</div>
-<div class="line"><a name="l00960"></a><span class="lineno">  960</span>   <span class="keywordflow">if</span>(input.empty()){</div>
-<div class="line"><a name="l00961"></a><span class="lineno">  961</span>     std::ostringstream s;</div>
-<div class="line"><a name="l00962"></a><span class="lineno">  962</span>     s<<<span class="stringliteral">"Error: input is empty"</span>;</div>
-<div class="line"><a name="l00963"></a><span class="lineno">  963</span>     <span class="keywordflow">throw</span>(s.str());</div>
-<div class="line"><a name="l00964"></a><span class="lineno">  964</span>   }</div>
-<div class="line"><a name="l00965"></a><span class="lineno">  965</span>   output.resize(nbin);</div>
-<div class="line"><a name="l00966"></a><span class="lineno">  966</span>   std::vector<T> inputSort;</div>
-<div class="line"><a name="l00967"></a><span class="lineno">  967</span>   inputSort.assign(begin,end);</div>
-<div class="line"><a name="l00968"></a><span class="lineno">  968</span>   <span class="keyword">typename</span> std::vector<T>::iterator vit=inputSort.begin();</div>
-<div class="line"><a name="l00969"></a><span class="lineno">  969</span>   <span class="keywordflow">while</span>(vit!=inputSort.end()){</div>
-<div class="line"><a name="l00970"></a><span class="lineno">  970</span>     <span class="keywordflow">if</span>(*vit<minimum||*vit>maximum)</div>
-<div class="line"><a name="l00971"></a><span class="lineno">  971</span>       inputSort.erase(vit);</div>
-<div class="line"><a name="l00972"></a><span class="lineno">  972</span>     <span class="keywordflow">else</span></div>
-<div class="line"><a name="l00973"></a><span class="lineno">  973</span>       ++vit;</div>
-<div class="line"><a name="l00974"></a><span class="lineno">  974</span>   }</div>
-<div class="line"><a name="l00975"></a><span class="lineno">  975</span>   std::sort(inputSort.begin(),inputSort.end());</div>
-<div class="line"><a name="l00976"></a><span class="lineno">  976</span>   vit=inputSort.begin();</div>
-<div class="line"><a name="l00977"></a><span class="lineno">  977</span>   std::vector<T> inputBin;</div>
-<div class="line"><a name="l00978"></a><span class="lineno">  978</span>   <span class="keywordflow">for</span>(<span class="keywordtype">int</span> ibin=0;ibin<nbin;++ibin){</div>
-<div class="line"><a name="l00979"></a><span class="lineno">  979</span>     inputBin.clear();</div>
-<div class="line"><a name="l00980"></a><span class="lineno">  980</span>     <span class="keywordflow">while</span>(inputBin.size()<inputSort.size()/nbin&&vit!=inputSort.end()){</div>
-<div class="line"><a name="l00981"></a><span class="lineno">  981</span>       inputBin.push_back(*vit);</div>
-<div class="line"><a name="l00982"></a><span class="lineno">  982</span>       ++vit;</div>
-<div class="line"><a name="l00983"></a><span class="lineno">  983</span>     }</div>
-<div class="line"><a name="l00984"></a><span class="lineno">  984</span>     <span class="keywordflow">if</span>(inputBin.size()){</div>
-<div class="line"><a name="l00985"></a><span class="lineno">  985</span>       output[ibin]=mymax(inputBin);</div>
-<div class="line"><a name="l00986"></a><span class="lineno">  986</span>     }</div>
-<div class="line"><a name="l00987"></a><span class="lineno">  987</span>   }</div>
-<div class="line"><a name="l00988"></a><span class="lineno">  988</span>   <span class="keywordflow">if</span>(!filename.empty()){</div>
-<div class="line"><a name="l00989"></a><span class="lineno">  989</span>     std::ofstream outputfile;</div>
-<div class="line"><a name="l00990"></a><span class="lineno">  990</span>     outputfile.open(filename.c_str());</div>
-<div class="line"><a name="l00991"></a><span class="lineno">  991</span>     <span class="keywordflow">if</span>(!outputfile){</div>
-<div class="line"><a name="l00992"></a><span class="lineno">  992</span>       std::ostringstream s;</div>
-<div class="line"><a name="l00993"></a><span class="lineno">  993</span>       s<<<span class="stringliteral">"error opening distribution file , "</span> << filename;</div>
-<div class="line"><a name="l00994"></a><span class="lineno">  994</span>       <span class="keywordflow">throw</span>(s.str());</div>
-<div class="line"><a name="l00995"></a><span class="lineno">  995</span>     }</div>
-<div class="line"><a name="l00996"></a><span class="lineno">  996</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> ibin=0;ibin<nbin;++ibin)</div>
-<div class="line"><a name="l00997"></a><span class="lineno">  997</span>       outputfile << ibin*100.0/nbin << <span class="stringliteral">" "</span> << static_cast<double>(output[ibin])/input.size() << std::endl;</div>
-<div class="line"><a name="l00998"></a><span class="lineno">  998</span>     outputfile.close();</div>
-<div class="line"><a name="l00999"></a><span class="lineno">  999</span>   }</div>
-<div class="line"><a name="l01000"></a><span class="lineno"> 1000</span> }</div>
-<div class="line"><a name="l01001"></a><span class="lineno"> 1001</span> </div>
-<div class="line"><a name="l01002"></a><span class="lineno"> 1002</span> <span class="comment">//todo: what with nodata values?</span></div>
-<div class="line"><a name="l01003"></a><span class="lineno"> 1003</span> <span class="keyword">template</span><<span class="keyword">class</span> T> T  StatFactory::percentile(<span class="keyword">const</span> std::vector<T>& input, <span class="keyword">typename</span> std::vector<T>::const_iterator begin, <span class="keyword">typename</span> std::vector<T>::const_iterator end, <span class="keywordtype">double</span> percent, T minimum, T maximum)<span [...]
-<div class="line"><a name="l01004"></a><span class="lineno"> 1004</span> <span class="keyword"></span>{</div>
-<div class="line"><a name="l01005"></a><span class="lineno"> 1005</span>   <span class="keywordflow">if</span>(input.empty()){</div>
-<div class="line"><a name="l01006"></a><span class="lineno"> 1006</span>     std::ostringstream s;</div>
-<div class="line"><a name="l01007"></a><span class="lineno"> 1007</span>     s<<<span class="stringliteral">"Error: input is empty"</span>;</div>
-<div class="line"><a name="l01008"></a><span class="lineno"> 1008</span>     <span class="keywordflow">throw</span>(s.str());</div>
-<div class="line"><a name="l01009"></a><span class="lineno"> 1009</span>   }</div>
-<div class="line"><a name="l01010"></a><span class="lineno"> 1010</span>   std::vector<T> inputSort;</div>
-<div class="line"><a name="l01011"></a><span class="lineno"> 1011</span>   inputSort.assign(begin,end);</div>
-<div class="line"><a name="l01012"></a><span class="lineno"> 1012</span>   <span class="keyword">typename</span> std::vector<T>::iterator vit=inputSort.begin();</div>
-<div class="line"><a name="l01013"></a><span class="lineno"> 1013</span>   <span class="keywordflow">while</span>(vit!=inputSort.end()){</div>
-<div class="line"><a name="l01014"></a><span class="lineno"> 1014</span>     <span class="keywordflow">if</span>(maximum>minimum){</div>
-<div class="line"><a name="l01015"></a><span class="lineno"> 1015</span>       <span class="keywordflow">if</span>(*vit<minimum||*vit>maximum)</div>
-<div class="line"><a name="l01016"></a><span class="lineno"> 1016</span>     inputSort.erase(vit);</div>
-<div class="line"><a name="l01017"></a><span class="lineno"> 1017</span>     }</div>
-<div class="line"><a name="l01018"></a><span class="lineno"> 1018</span>     <span class="keywordflow">else</span></div>
-<div class="line"><a name="l01019"></a><span class="lineno"> 1019</span>       ++vit;</div>
-<div class="line"><a name="l01020"></a><span class="lineno"> 1020</span>   }</div>
-<div class="line"><a name="l01021"></a><span class="lineno"> 1021</span>   std::sort(inputSort.begin(),inputSort.end());</div>
-<div class="line"><a name="l01022"></a><span class="lineno"> 1022</span>   <span class="keywordflow">return</span> gsl_stats_quantile_from_sorted_data(&(inputSort[0]),1,inputSort.size(),percent/100.0);</div>
-<div class="line"><a name="l01023"></a><span class="lineno"> 1023</span> }</div>
-<div class="line"><a name="l01024"></a><span class="lineno"> 1024</span> </div>
-<div class="line"><a name="l01025"></a><span class="lineno"> 1025</span> <span class="keyword">template</span><<span class="keyword">class</span> T> <span class="keywordtype">void</span> StatFactory::signature(<span class="keyword">const</span> std::vector<T>& input, <span class="keywordtype">double</span>&k, <span class="keywordtype">double</span>& alpha, <span class="keywordtype">double</span>& beta, <span class="keywordtype">double</span> e)<span class [...]
-<div class="line"><a name="l01026"></a><span class="lineno"> 1026</span> <span class="keyword"></span>{</div>
-<div class="line"><a name="l01027"></a><span class="lineno"> 1027</span>   <span class="keywordtype">double</span> m1=moment(input,1);</div>
-<div class="line"><a name="l01028"></a><span class="lineno"> 1028</span>   <span class="keywordtype">double</span> m2=moment(input,2);</div>
-<div class="line"><a name="l01029"></a><span class="lineno"> 1029</span>   signature(m1,m2,k,alpha,beta,e);</div>
-<div class="line"><a name="l01030"></a><span class="lineno"> 1030</span> }</div>
-<div class="line"><a name="l01031"></a><span class="lineno"> 1031</span> </div>
-<div class="line"><a name="l01032"></a><span class="lineno"> 1032</span> <span class="comment">//todo: what with nodata values?</span></div>
-<div class="line"><a name="l01033"></a><span class="lineno"> 1033</span> <span class="keyword">template</span><<span class="keyword">class</span> T> <span class="keywordtype">void</span> StatFactory::normalize(<span class="keyword">const</span> std::vector<T>& input, std::vector<double>& output)<span class="keyword"> const</span>{</div>
-<div class="line"><a name="l01034"></a><span class="lineno"> 1034</span>   <span class="keywordtype">double</span> total=sum(input);</div>
-<div class="line"><a name="l01035"></a><span class="lineno"> 1035</span>   <span class="keywordflow">if</span>(total){</div>
-<div class="line"><a name="l01036"></a><span class="lineno"> 1036</span>     output.resize(input.size());</div>
-<div class="line"><a name="l01037"></a><span class="lineno"> 1037</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> index=0;index<input.size();++index)</div>
-<div class="line"><a name="l01038"></a><span class="lineno"> 1038</span>       output[index]=input[index]/total;</div>
-<div class="line"><a name="l01039"></a><span class="lineno"> 1039</span>   }</div>
-<div class="line"><a name="l01040"></a><span class="lineno"> 1040</span>   <span class="keywordflow">else</span></div>
-<div class="line"><a name="l01041"></a><span class="lineno"> 1041</span>     output=input;</div>
-<div class="line"><a name="l01042"></a><span class="lineno"> 1042</span> }</div>
-<div class="line"><a name="l01043"></a><span class="lineno"> 1043</span> </div>
-<div class="line"><a name="l01044"></a><span class="lineno"> 1044</span> <span class="comment">//todo: what with nodata values?</span></div>
-<div class="line"><a name="l01045"></a><span class="lineno"> 1045</span> <span class="keyword">template</span><<span class="keyword">class</span> T> <span class="keywordtype">void</span> StatFactory::normalize_pct(std::vector<T>& input)<span class="keyword"> const</span>{</div>
-<div class="line"><a name="l01046"></a><span class="lineno"> 1046</span>   <span class="keywordtype">double</span> total=sum(input);</div>
-<div class="line"><a name="l01047"></a><span class="lineno"> 1047</span>   <span class="keywordflow">if</span>(total){</div>
-<div class="line"><a name="l01048"></a><span class="lineno"> 1048</span>     <span class="keyword">typename</span> std::vector<T>::iterator it;</div>
-<div class="line"><a name="l01049"></a><span class="lineno"> 1049</span>     <span class="keywordflow">for</span>(it=input.begin();it!=input.end();++it)</div>
-<div class="line"><a name="l01050"></a><span class="lineno"> 1050</span>       *it=100.0*(*it)/total;</div>
-<div class="line"><a name="l01051"></a><span class="lineno"> 1051</span>   }</div>
-<div class="line"><a name="l01052"></a><span class="lineno"> 1052</span> }</div>
-<div class="line"><a name="l01053"></a><span class="lineno"> 1053</span>  </div>
-<div class="line"><a name="l01054"></a><span class="lineno"> 1054</span> <span class="keyword">template</span><<span class="keyword">class</span> T> <span class="keywordtype">double</span> StatFactory::rmse(<span class="keyword">const</span> std::vector<T>& x, <span class="keyword">const</span> std::vector<T>& y)<span class="keyword"> const</span>{</div>
-<div class="line"><a name="l01055"></a><span class="lineno"> 1055</span>   <span class="keywordflow">if</span>(x.size()!=y.size()){</div>
-<div class="line"><a name="l01056"></a><span class="lineno"> 1056</span>     std::ostringstream s;</div>
-<div class="line"><a name="l01057"></a><span class="lineno"> 1057</span>     s<<<span class="stringliteral">"Error: x and y not equal in size"</span>;</div>
-<div class="line"><a name="l01058"></a><span class="lineno"> 1058</span>     <span class="keywordflow">throw</span>(s.str());</div>
-<div class="line"><a name="l01059"></a><span class="lineno"> 1059</span>   }</div>
-<div class="line"><a name="l01060"></a><span class="lineno"> 1060</span>   <span class="keywordflow">if</span>(x.empty()){</div>
-<div class="line"><a name="l01061"></a><span class="lineno"> 1061</span>     std::ostringstream s;</div>
-<div class="line"><a name="l01062"></a><span class="lineno"> 1062</span>     s<<<span class="stringliteral">"Error: x is empty"</span>;</div>
-<div class="line"><a name="l01063"></a><span class="lineno"> 1063</span>     <span class="keywordflow">throw</span>(s.str());</div>
-<div class="line"><a name="l01064"></a><span class="lineno"> 1064</span>   }</div>
-<div class="line"><a name="l01065"></a><span class="lineno"> 1065</span>   <span class="keywordtype">double</span> mse=0;</div>
-<div class="line"><a name="l01066"></a><span class="lineno"> 1066</span>   <span class="keywordflow">for</span>(<span class="keywordtype">int</span> isample=0;isample<x.size();++isample){</div>
-<div class="line"><a name="l01067"></a><span class="lineno"> 1067</span>     <span class="keywordflow">if</span>(isNoData(x[isample])||isNoData(y[isample]))</div>
-<div class="line"><a name="l01068"></a><span class="lineno"> 1068</span>        <span class="keywordflow">continue</span>;</div>
-<div class="line"><a name="l01069"></a><span class="lineno"> 1069</span>     <span class="keywordtype">double</span> e=x[isample]-y[isample];</div>
-<div class="line"><a name="l01070"></a><span class="lineno"> 1070</span>     mse+=e*e/x.size();</div>
-<div class="line"><a name="l01071"></a><span class="lineno"> 1071</span>   }</div>
-<div class="line"><a name="l01072"></a><span class="lineno"> 1072</span>   <span class="keywordflow">return</span> sqrt(mse);</div>
-<div class="line"><a name="l01073"></a><span class="lineno"> 1073</span> }</div>
-<div class="line"><a name="l01074"></a><span class="lineno"> 1074</span> </div>
-<div class="line"><a name="l01075"></a><span class="lineno"> 1075</span> <span class="comment">// template<class T> double StatFactory::gsl_correlation(const std::vector<T>& x, const std::vector<T>& y) const{</span></div>
-<div class="line"><a name="l01076"></a><span class="lineno"> 1076</span> <span class="comment">//  return(gsl_stats_correlation(&(x[0]),1,&(y[0]),1,x.size()));</span></div>
-<div class="line"><a name="l01077"></a><span class="lineno"> 1077</span> <span class="comment">// }</span></div>
-<div class="line"><a name="l01078"></a><span class="lineno"> 1078</span> </div>
-<div class="line"><a name="l01079"></a><span class="lineno"> 1079</span>  <span class="keyword">template</span><<span class="keyword">class</span> T> <span class="keywordtype">double</span> StatFactory::gsl_covariance(<span class="keyword">const</span> std::vector<T>& x, <span class="keyword">const</span> std::vector<T>& y)<span class="keyword"> const</span>{</div>
-<div class="line"><a name="l01080"></a><span class="lineno"> 1080</span>    <span class="keywordflow">return</span>(gsl_stats_covariance(&(x[0]),1,&(y[0]),1,x.size()));</div>
-<div class="line"><a name="l01081"></a><span class="lineno"> 1081</span>  }</div>
-<div class="line"><a name="l01082"></a><span class="lineno"> 1082</span> </div>
-<div class="line"><a name="l01083"></a><span class="lineno"> 1083</span> </div>
-<div class="line"><a name="l01084"></a><span class="lineno"> 1084</span> <span class="keyword">template</span><<span class="keyword">class</span> T> <span class="keywordtype">double</span> StatFactory::correlation(<span class="keyword">const</span> std::vector<T>& x, <span class="keyword">const</span> std::vector<T>& y, <span class="keywordtype">int</span> delay)<span class="keyword"> const</span>{</div>
-<div class="line"><a name="l01085"></a><span class="lineno"> 1085</span>   <span class="keywordtype">double</span> meanX=0;</div>
-<div class="line"><a name="l01086"></a><span class="lineno"> 1086</span>   <span class="keywordtype">double</span> meanY=0;</div>
-<div class="line"><a name="l01087"></a><span class="lineno"> 1087</span>   <span class="keywordtype">double</span> varX=0;</div>
-<div class="line"><a name="l01088"></a><span class="lineno"> 1088</span>   <span class="keywordtype">double</span> varY=0;</div>
-<div class="line"><a name="l01089"></a><span class="lineno"> 1089</span>   <span class="keywordtype">double</span> sXY=0;</div>
-<div class="line"><a name="l01090"></a><span class="lineno"> 1090</span>   meanVar(x,meanX,varX);</div>
-<div class="line"><a name="l01091"></a><span class="lineno"> 1091</span>   meanVar(y,meanY,varY);</div>
-<div class="line"><a name="l01092"></a><span class="lineno"> 1092</span>   <span class="keywordtype">double</span> denom = sqrt(varX*varY);</div>
-<div class="line"><a name="l01093"></a><span class="lineno"> 1093</span>   <span class="keywordtype">bool</span> isValid=<span class="keyword">false</span>;</div>
-<div class="line"><a name="l01094"></a><span class="lineno"> 1094</span>   <span class="keywordflow">if</span>(denom){</div>
-<div class="line"><a name="l01095"></a><span class="lineno"> 1095</span>     <span class="comment">//Calculate the correlation series</span></div>
-<div class="line"><a name="l01096"></a><span class="lineno"> 1096</span>     sXY = 0;</div>
-<div class="line"><a name="l01097"></a><span class="lineno"> 1097</span>     <span class="keywordflow">for</span> (<span class="keywordtype">int</span> i=0;i<x.size();++i) {</div>
-<div class="line"><a name="l01098"></a><span class="lineno"> 1098</span>       <span class="keywordtype">int</span> j = i + delay;</div>
-<div class="line"><a name="l01099"></a><span class="lineno"> 1099</span>       <span class="keywordflow">if</span> (j < 0 || j >= y.size())</div>
-<div class="line"><a name="l01100"></a><span class="lineno"> 1100</span>         <span class="keywordflow">continue</span>;</div>
-<div class="line"><a name="l01101"></a><span class="lineno"> 1101</span>       <span class="keywordflow">else</span> <span class="keywordflow">if</span>(isNoData(x[i])||isNoData(y[j]))</div>
-<div class="line"><a name="l01102"></a><span class="lineno"> 1102</span>     <span class="keywordflow">continue</span>;</div>
-<div class="line"><a name="l01103"></a><span class="lineno"> 1103</span>       <span class="keywordflow">else</span>{</div>
-<div class="line"><a name="l01104"></a><span class="lineno"> 1104</span>     isValid=<span class="keyword">true</span>;</div>
-<div class="line"><a name="l01105"></a><span class="lineno"> 1105</span>     <span class="keywordflow">if</span>(i<0){</div>
-<div class="line"><a name="l01106"></a><span class="lineno"> 1106</span>       std::ostringstream s;</div>
-<div class="line"><a name="l01107"></a><span class="lineno"> 1107</span>       s<<<span class="stringliteral">"Error: i must be positive"</span>;</div>
-<div class="line"><a name="l01108"></a><span class="lineno"> 1108</span>       <span class="keywordflow">throw</span>(s.str());</div>
-<div class="line"><a name="l01109"></a><span class="lineno"> 1109</span>     }</div>
-<div class="line"><a name="l01110"></a><span class="lineno"> 1110</span>     <span class="keywordflow">if</span>(i>=x.size()){</div>
-<div class="line"><a name="l01111"></a><span class="lineno"> 1111</span>       std::ostringstream s;</div>
-<div class="line"><a name="l01112"></a><span class="lineno"> 1112</span>       s<<<span class="stringliteral">"Error: i must be smaller than x.size()"</span>;</div>
-<div class="line"><a name="l01113"></a><span class="lineno"> 1113</span>       <span class="keywordflow">throw</span>(s.str());</div>
-<div class="line"><a name="l01114"></a><span class="lineno"> 1114</span>     }</div>
-<div class="line"><a name="l01115"></a><span class="lineno"> 1115</span>     <span class="keywordflow">if</span>(j<0){</div>
-<div class="line"><a name="l01116"></a><span class="lineno"> 1116</span>       std::ostringstream s;</div>
-<div class="line"><a name="l01117"></a><span class="lineno"> 1117</span>       s<<<span class="stringliteral">"Error: j must be positive"</span>;</div>
-<div class="line"><a name="l01118"></a><span class="lineno"> 1118</span>       <span class="keywordflow">throw</span>(s.str());</div>
-<div class="line"><a name="l01119"></a><span class="lineno"> 1119</span>     }</div>
-<div class="line"><a name="l01120"></a><span class="lineno"> 1120</span>     <span class="keywordflow">if</span>(j>=y.size()){</div>
-<div class="line"><a name="l01121"></a><span class="lineno"> 1121</span>       std::ostringstream s;</div>
-<div class="line"><a name="l01122"></a><span class="lineno"> 1122</span>       s<<<span class="stringliteral">"Error: j must be smaller than y.size()"</span>;</div>
-<div class="line"><a name="l01123"></a><span class="lineno"> 1123</span>       <span class="keywordflow">throw</span>(s.str());</div>
-<div class="line"><a name="l01124"></a><span class="lineno"> 1124</span>     }</div>
-<div class="line"><a name="l01125"></a><span class="lineno"> 1125</span>         sXY += (x[i] - meanX) * (y[j] - meanY);</div>
-<div class="line"><a name="l01126"></a><span class="lineno"> 1126</span>       }</div>
-<div class="line"><a name="l01127"></a><span class="lineno"> 1127</span>     }</div>
-<div class="line"><a name="l01128"></a><span class="lineno"> 1128</span>     <span class="keywordflow">if</span>(isValid){</div>
-<div class="line"><a name="l01129"></a><span class="lineno"> 1129</span>       <span class="keywordtype">double</span> minSize=(x.size()<y.size())?x.size():y.size();</div>
-<div class="line"><a name="l01130"></a><span class="lineno"> 1130</span>       <span class="keywordflow">return</span>(sXY / denom / (minSize-1));</div>
-<div class="line"><a name="l01131"></a><span class="lineno"> 1131</span>     }</div>
-<div class="line"><a name="l01132"></a><span class="lineno"> 1132</span>     <span class="keywordflow">else</span> <span class="keywordflow">if</span>(m_noDataValues.size())</div>
-<div class="line"><a name="l01133"></a><span class="lineno"> 1133</span>       <span class="keywordflow">return</span> m_noDataValues[0];</div>
-<div class="line"><a name="l01134"></a><span class="lineno"> 1134</span>     <span class="keywordflow">else</span>{</div>
-<div class="line"><a name="l01135"></a><span class="lineno"> 1135</span>       std::string errorString=<span class="stringliteral">"Error: no valid data found"</span>;</div>
-<div class="line"><a name="l01136"></a><span class="lineno"> 1136</span>       <span class="keywordflow">throw</span>(errorString);</div>
-<div class="line"><a name="l01137"></a><span class="lineno"> 1137</span>     }</div>
-<div class="line"><a name="l01138"></a><span class="lineno"> 1138</span>   }</div>
-<div class="line"><a name="l01139"></a><span class="lineno"> 1139</span>   <span class="keywordflow">else</span></div>
-<div class="line"><a name="l01140"></a><span class="lineno"> 1140</span>     <span class="keywordflow">return</span> 0;</div>
+<div class="line"><a name="l00830"></a><span class="lineno">  830</span>   <span class="keywordflow">if</span>(!input.size()){</div>
+<div class="line"><a name="l00831"></a><span class="lineno">  831</span>     std::string errorString=<span class="stringliteral">"Error: no valid data found"</span>;</div>
+<div class="line"><a name="l00832"></a><span class="lineno">  832</span>     <span class="keywordflow">throw</span>(errorString);</div>
+<div class="line"><a name="l00833"></a><span class="lineno">  833</span>   }</div>
+<div class="line"><a name="l00834"></a><span class="lineno">  834</span>   <span class="keywordflow">if</span>(output.size()!=nbin){</div>
+<div class="line"><a name="l00835"></a><span class="lineno">  835</span>     output.resize(nbin);</div>
+<div class="line"><a name="l00836"></a><span class="lineno">  836</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> i=0;i<nbin;output[i++]=0);</div>
+<div class="line"><a name="l00837"></a><span class="lineno">  837</span>   }</div>
+<div class="line"><a name="l00838"></a><span class="lineno">  838</span>   <span class="keywordtype">bool</span> isValid=<span class="keyword">false</span>;</div>
+<div class="line"><a name="l00839"></a><span class="lineno">  839</span>   <span class="keyword">typename</span> std::vector<T>::const_iterator it;</div>
+<div class="line"><a name="l00840"></a><span class="lineno">  840</span>   <span class="keywordflow">for</span>(it=begin;it!=end;++it){</div>
+<div class="line"><a name="l00841"></a><span class="lineno">  841</span>     <span class="keywordflow">if</span>(*it<minimum)</div>
+<div class="line"><a name="l00842"></a><span class="lineno">  842</span>       <span class="keywordflow">continue</span>;</div>
+<div class="line"><a name="l00843"></a><span class="lineno">  843</span>     <span class="keywordflow">if</span>(*it>maximum)</div>
+<div class="line"><a name="l00844"></a><span class="lineno">  844</span>       <span class="keywordflow">continue</span>;</div>
+<div class="line"><a name="l00845"></a><span class="lineno">  845</span>     <span class="keywordflow">if</span>(isNoData(*it))</div>
+<div class="line"><a name="l00846"></a><span class="lineno">  846</span>       <span class="keywordflow">continue</span>;</div>
+<div class="line"><a name="l00847"></a><span class="lineno">  847</span>     isValid=<span class="keyword">true</span>;</div>
+<div class="line"><a name="l00848"></a><span class="lineno">  848</span>     <span class="keywordflow">if</span>(sigma>0){</div>
+<div class="line"><a name="l00849"></a><span class="lineno">  849</span>       <span class="comment">// minimum-=2*sigma;</span></div>
+<div class="line"><a name="l00850"></a><span class="lineno">  850</span>       <span class="comment">// maximum+=2*sigma;</span></div>
+<div class="line"><a name="l00851"></a><span class="lineno">  851</span>       <span class="comment">//create kde for Gaussian basis function</span></div>
+<div class="line"><a name="l00852"></a><span class="lineno">  852</span>       <span class="comment">//todo: speed up by calculating first and last bin with non-zero contriubtion...</span></div>
+<div class="line"><a name="l00853"></a><span class="lineno">  853</span>       <span class="comment">//todo: calculate real surface below pdf by using gsl_cdf_gaussian_P(x-mean+binsize,sigma)-gsl_cdf_gaussian_P(x-mean,sigma)</span></div>
+<div class="line"><a name="l00854"></a><span class="lineno">  854</span>       <span class="keywordflow">for</span>(<span class="keywordtype">int</span> ibin=0;ibin<nbin;++ibin){</div>
+<div class="line"><a name="l00855"></a><span class="lineno">  855</span>         <span class="keywordtype">double</span> icenter=minimum+<span class="keyword">static_cast<</span><span class="keywordtype">double</span><span class="keyword">></span>(maximum-minimum)*(ibin+0.5)/nbin;</div>
+<div class="line"><a name="l00856"></a><span class="lineno">  856</span>         <span class="keywordtype">double</span> thePdf=gsl_ran_gaussian_pdf(*it-icenter, sigma);</div>
+<div class="line"><a name="l00857"></a><span class="lineno">  857</span>         output[ibin]+=thePdf;</div>
+<div class="line"><a name="l00858"></a><span class="lineno">  858</span>       }</div>
+<div class="line"><a name="l00859"></a><span class="lineno">  859</span>     }</div>
+<div class="line"><a name="l00860"></a><span class="lineno">  860</span>     <span class="keywordflow">else</span>{</div>
+<div class="line"><a name="l00861"></a><span class="lineno">  861</span>       <span class="keywordtype">int</span> theBin=0;</div>
+<div class="line"><a name="l00862"></a><span class="lineno">  862</span>       <span class="keywordflow">if</span>(*it==maximum)</div>
+<div class="line"><a name="l00863"></a><span class="lineno">  863</span>         theBin=nbin-1;</div>
+<div class="line"><a name="l00864"></a><span class="lineno">  864</span>       <span class="keywordflow">else</span> <span class="keywordflow">if</span>(*it>minimum && *it<maximum)</div>
+<div class="line"><a name="l00865"></a><span class="lineno">  865</span>         theBin=<span class="keyword">static_cast<</span><span class="keywordtype">int</span><span class="keyword">></span>(<span class="keyword">static_cast<</span><span class="keywordtype">double</span><span class="keyword">></span>((nbin-1)*(*it)-minimum)/(maximum-minimum));</div>
+<div class="line"><a name="l00866"></a><span class="lineno">  866</span>       ++output[theBin];</div>
+<div class="line"><a name="l00867"></a><span class="lineno">  867</span>       <span class="comment">// if(*it==maximum)</span></div>
+<div class="line"><a name="l00868"></a><span class="lineno">  868</span>       <span class="comment">//   ++output[nbin-1];</span></div>
+<div class="line"><a name="l00869"></a><span class="lineno">  869</span>       <span class="comment">// else if(*it>=minimum && *it<maximum)</span></div>
+<div class="line"><a name="l00870"></a><span class="lineno">  870</span>       <span class="comment">//   ++output[static_cast<int>(static_cast<double>((*it)-minimum)/(maximum-minimum)*nbin)];</span></div>
+<div class="line"><a name="l00871"></a><span class="lineno">  871</span>     }</div>
+<div class="line"><a name="l00872"></a><span class="lineno">  872</span>   }</div>
+<div class="line"><a name="l00873"></a><span class="lineno">  873</span>   <span class="keywordflow">if</span>(!isValid){</div>
+<div class="line"><a name="l00874"></a><span class="lineno">  874</span>     std::string errorString=<span class="stringliteral">"Error: no valid data found"</span>;</div>
+<div class="line"><a name="l00875"></a><span class="lineno">  875</span>     <span class="keywordflow">throw</span>(errorString);</div>
+<div class="line"><a name="l00876"></a><span class="lineno">  876</span>   }</div>
+<div class="line"><a name="l00877"></a><span class="lineno">  877</span>   <span class="keywordflow">else</span> <span class="keywordflow">if</span>(!filename.empty()){</div>
+<div class="line"><a name="l00878"></a><span class="lineno">  878</span>     std::ofstream outputfile;</div>
+<div class="line"><a name="l00879"></a><span class="lineno">  879</span>     outputfile.open(filename.c_str());</div>
+<div class="line"><a name="l00880"></a><span class="lineno">  880</span>     <span class="keywordflow">if</span>(!outputfile){</div>
+<div class="line"><a name="l00881"></a><span class="lineno">  881</span>       std::ostringstream s;</div>
+<div class="line"><a name="l00882"></a><span class="lineno">  882</span>       s<<<span class="stringliteral">"Error opening distribution file , "</span> << filename;</div>
+<div class="line"><a name="l00883"></a><span class="lineno">  883</span>       <span class="keywordflow">throw</span>(s.str());</div>
+<div class="line"><a name="l00884"></a><span class="lineno">  884</span>     }</div>
+<div class="line"><a name="l00885"></a><span class="lineno">  885</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> ibin=0;ibin<nbin;++ibin)</div>
+<div class="line"><a name="l00886"></a><span class="lineno">  886</span>       outputfile << minimum+static_cast<double>(maximum-minimum)*(ibin+0.5)/nbin << <span class="stringliteral">" "</span> << <span class="keyword">static_cast<</span><span class="keywordtype">double</span><span class="keyword">></span>(output[ibin])/input.size() << std::endl;</div>
+<div class="line"><a name="l00887"></a><span class="lineno">  887</span>     outputfile.close();</div>
+<div class="line"><a name="l00888"></a><span class="lineno">  888</span>   }</div>
+<div class="line"><a name="l00889"></a><span class="lineno">  889</span> }</div>
+<div class="line"><a name="l00890"></a><span class="lineno">  890</span> </div>
+<div class="line"><a name="l00891"></a><span class="lineno">  891</span> <span class="keyword">template</span><<span class="keyword">class</span> T> <span class="keywordtype">void</span>  StatFactory::distribution2d(<span class="keyword">const</span> std::vector<T>& inputX, <span class="keyword">const</span> std::vector<T>& inputY, std::vector< std::vector<double> >& output, <span class="keywordtype">int</span> nbin, T& minX, T& maxX [...]
+<div class="line"><a name="l00892"></a><span class="lineno">  892</span> <span class="keyword"></span>{</div>
+<div class="line"><a name="l00893"></a><span class="lineno">  893</span>   <span class="keywordflow">if</span>(inputX.empty()){</div>
+<div class="line"><a name="l00894"></a><span class="lineno">  894</span>     std::ostringstream s;</div>
+<div class="line"><a name="l00895"></a><span class="lineno">  895</span>     s<<<span class="stringliteral">"Error: inputX is empty"</span>;</div>
+<div class="line"><a name="l00896"></a><span class="lineno">  896</span>     <span class="keywordflow">throw</span>(s.str());</div>
+<div class="line"><a name="l00897"></a><span class="lineno">  897</span>   }</div>
+<div class="line"><a name="l00898"></a><span class="lineno">  898</span>   <span class="keywordflow">if</span>(inputX.size()!=inputY.size()){</div>
+<div class="line"><a name="l00899"></a><span class="lineno">  899</span>     std::ostringstream s;</div>
+<div class="line"><a name="l00900"></a><span class="lineno">  900</span>     s<<<span class="stringliteral">"Error: inputX is empty"</span>;</div>
+<div class="line"><a name="l00901"></a><span class="lineno">  901</span>     <span class="keywordflow">throw</span>(s.str());</div>
+<div class="line"><a name="l00902"></a><span class="lineno">  902</span>   }</div>
+<div class="line"><a name="l00903"></a><span class="lineno">  903</span>   <span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> npoint=inputX.size();</div>
+<div class="line"><a name="l00904"></a><span class="lineno">  904</span>   <span class="keywordflow">if</span>(maxX<=minX)</div>
+<div class="line"><a name="l00905"></a><span class="lineno">  905</span>     minmax(inputX,inputX.begin(),inputX.end(),minX,maxX);</div>
+<div class="line"><a name="l00906"></a><span class="lineno">  906</span>   <span class="keywordflow">if</span>(maxX<=minX){</div>
+<div class="line"><a name="l00907"></a><span class="lineno">  907</span>     std::ostringstream s;</div>
+<div class="line"><a name="l00908"></a><span class="lineno">  908</span>     s<<<span class="stringliteral">"Error: could not calculate distribution (minX>=maxX)"</span>;</div>
+<div class="line"><a name="l00909"></a><span class="lineno">  909</span>     <span class="keywordflow">throw</span>(s.str());</div>
+<div class="line"><a name="l00910"></a><span class="lineno">  910</span>   }</div>
+<div class="line"><a name="l00911"></a><span class="lineno">  911</span>   <span class="keywordflow">if</span>(maxY<=minY)</div>
+<div class="line"><a name="l00912"></a><span class="lineno">  912</span>     minmax(inputY,inputY.begin(),inputY.end(),minY,maxY);</div>
+<div class="line"><a name="l00913"></a><span class="lineno">  913</span>   <span class="keywordflow">if</span>(maxY<=minY){</div>
+<div class="line"><a name="l00914"></a><span class="lineno">  914</span>     std::ostringstream s;</div>
+<div class="line"><a name="l00915"></a><span class="lineno">  915</span>     s<<<span class="stringliteral">"Error: could not calculate distribution (minY>=maxY)"</span>;</div>
+<div class="line"><a name="l00916"></a><span class="lineno">  916</span>     <span class="keywordflow">throw</span>(s.str());</div>
+<div class="line"><a name="l00917"></a><span class="lineno">  917</span>   }</div>
+<div class="line"><a name="l00918"></a><span class="lineno">  918</span>   <span class="keywordflow">if</span>(nbin<=1){</div>
+<div class="line"><a name="l00919"></a><span class="lineno">  919</span>     std::ostringstream s;</div>
+<div class="line"><a name="l00920"></a><span class="lineno">  920</span>     s<<<span class="stringliteral">"Error: nbin must be larger than 1"</span>;</div>
+<div class="line"><a name="l00921"></a><span class="lineno">  921</span>     <span class="keywordflow">throw</span>(s.str());</div>
+<div class="line"><a name="l00922"></a><span class="lineno">  922</span>   }</div>
+<div class="line"><a name="l00923"></a><span class="lineno">  923</span>   output.resize(nbin);</div>
+<div class="line"><a name="l00924"></a><span class="lineno">  924</span>   <span class="keywordflow">for</span>(<span class="keywordtype">int</span> i=0;i<nbin;++i){</div>
+<div class="line"><a name="l00925"></a><span class="lineno">  925</span>     output[i].resize(nbin);</div>
+<div class="line"><a name="l00926"></a><span class="lineno">  926</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> j=0;j<nbin;++j)</div>
+<div class="line"><a name="l00927"></a><span class="lineno">  927</span>       output[i][j]=0;</div>
+<div class="line"><a name="l00928"></a><span class="lineno">  928</span>   }</div>
+<div class="line"><a name="l00929"></a><span class="lineno">  929</span>   <span class="keywordtype">int</span> binX=0;</div>
+<div class="line"><a name="l00930"></a><span class="lineno">  930</span>   <span class="keywordtype">int</span> binY=0;</div>
+<div class="line"><a name="l00931"></a><span class="lineno">  931</span>   <span class="keywordflow">for</span>(<span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> ipoint=0;ipoint<npoint;++ipoint){</div>
+<div class="line"><a name="l00932"></a><span class="lineno">  932</span>     <span class="keywordflow">if</span>(inputX[ipoint]==maxX)</div>
+<div class="line"><a name="l00933"></a><span class="lineno">  933</span>        binX=nbin-1;</div>
+<div class="line"><a name="l00934"></a><span class="lineno">  934</span>     <span class="keywordflow">else</span></div>
+<div class="line"><a name="l00935"></a><span class="lineno">  935</span>       binX=<span class="keyword">static_cast<</span><span class="keywordtype">int</span><span class="keyword">></span>(<span class="keyword">static_cast<</span><span class="keywordtype">double</span><span class="keyword">></span>(inputX[ipoint]-minX)/(maxX-minX)*nbin);</div>
+<div class="line"><a name="l00936"></a><span class="lineno">  936</span>     <span class="keywordflow">if</span>(inputY[ipoint]==maxY)</div>
+<div class="line"><a name="l00937"></a><span class="lineno">  937</span>        binY=nbin-1;</div>
+<div class="line"><a name="l00938"></a><span class="lineno">  938</span>     <span class="keywordflow">else</span></div>
+<div class="line"><a name="l00939"></a><span class="lineno">  939</span>       binY=<span class="keyword">static_cast<</span><span class="keywordtype">int</span><span class="keyword">></span>(<span class="keyword">static_cast<</span><span class="keywordtype">double</span><span class="keyword">></span>(inputY[ipoint]-minY)/(maxY-minY)*nbin);</div>
+<div class="line"><a name="l00940"></a><span class="lineno">  940</span>     <span class="keywordflow">if</span>(binX<0){</div>
+<div class="line"><a name="l00941"></a><span class="lineno">  941</span>       std::ostringstream s;</div>
+<div class="line"><a name="l00942"></a><span class="lineno">  942</span>       s<<<span class="stringliteral">"Error: binX is smaller than 0"</span>;</div>
+<div class="line"><a name="l00943"></a><span class="lineno">  943</span>       <span class="keywordflow">throw</span>(s.str());</div>
+<div class="line"><a name="l00944"></a><span class="lineno">  944</span>     }</div>
+<div class="line"><a name="l00945"></a><span class="lineno">  945</span>     <span class="keywordflow">if</span>(output.size()<=binX){</div>
+<div class="line"><a name="l00946"></a><span class="lineno">  946</span>       std::ostringstream s;</div>
+<div class="line"><a name="l00947"></a><span class="lineno">  947</span>       s<<<span class="stringliteral">"Error: output size must be larger than binX"</span>;</div>
+<div class="line"><a name="l00948"></a><span class="lineno">  948</span>       <span class="keywordflow">throw</span>(s.str());</div>
+<div class="line"><a name="l00949"></a><span class="lineno">  949</span>     }</div>
+<div class="line"><a name="l00950"></a><span class="lineno">  950</span>     <span class="keywordflow">if</span>(binY<0){</div>
+<div class="line"><a name="l00951"></a><span class="lineno">  951</span>       std::ostringstream s;</div>
+<div class="line"><a name="l00952"></a><span class="lineno">  952</span>       s<<<span class="stringliteral">"Error: binY is smaller than 0"</span>;</div>
+<div class="line"><a name="l00953"></a><span class="lineno">  953</span>       <span class="keywordflow">throw</span>(s.str());</div>
+<div class="line"><a name="l00954"></a><span class="lineno">  954</span>     }</div>
+<div class="line"><a name="l00955"></a><span class="lineno">  955</span>     <span class="keywordflow">if</span>(output.size()<=binY){</div>
+<div class="line"><a name="l00956"></a><span class="lineno">  956</span>       std::ostringstream s;</div>
+<div class="line"><a name="l00957"></a><span class="lineno">  957</span>       s<<<span class="stringliteral">"Error: output size must be larger than binY"</span>;</div>
+<div class="line"><a name="l00958"></a><span class="lineno">  958</span>       <span class="keywordflow">throw</span>(s.str());</div>
+<div class="line"><a name="l00959"></a><span class="lineno">  959</span>     }</div>
+<div class="line"><a name="l00960"></a><span class="lineno">  960</span>     <span class="keywordflow">if</span>(sigma>0){</div>
+<div class="line"><a name="l00961"></a><span class="lineno">  961</span>       <span class="comment">// minX-=2*sigma;</span></div>
+<div class="line"><a name="l00962"></a><span class="lineno">  962</span>       <span class="comment">// maxX+=2*sigma;</span></div>
+<div class="line"><a name="l00963"></a><span class="lineno">  963</span>       <span class="comment">// minY-=2*sigma;</span></div>
+<div class="line"><a name="l00964"></a><span class="lineno">  964</span>       <span class="comment">// maxY+=2*sigma;</span></div>
+<div class="line"><a name="l00965"></a><span class="lineno">  965</span>       <span class="comment">//create kde for Gaussian basis function</span></div>
+<div class="line"><a name="l00966"></a><span class="lineno">  966</span>       <span class="comment">//todo: speed up by calculating first and last bin with non-zero contriubtion...</span></div>
+<div class="line"><a name="l00967"></a><span class="lineno">  967</span>       <span class="keywordflow">for</span>(<span class="keywordtype">int</span> ibinX=0;ibinX<nbin;++ibinX){</div>
+<div class="line"><a name="l00968"></a><span class="lineno">  968</span>         <span class="keywordtype">double</span> centerX=minX+<span class="keyword">static_cast<</span><span class="keywordtype">double</span><span class="keyword">></span>(maxX-minX)*ibinX/nbin;</div>
+<div class="line"><a name="l00969"></a><span class="lineno">  969</span>         <span class="keywordtype">double</span> pdfX=gsl_ran_gaussian_pdf(inputX[ipoint]-centerX, sigma);</div>
+<div class="line"><a name="l00970"></a><span class="lineno">  970</span>         <span class="keywordflow">for</span>(<span class="keywordtype">int</span> ibinY=0;ibinY<nbin;++ibinY){</div>
+<div class="line"><a name="l00971"></a><span class="lineno">  971</span>           <span class="comment">//calculate  \integral_ibinX^(ibinX+1)</span></div>
+<div class="line"><a name="l00972"></a><span class="lineno">  972</span>           <span class="keywordtype">double</span> centerY=minY+<span class="keyword">static_cast<</span><span class="keywordtype">double</span><span class="keyword">></span>(maxY-minY)*ibinY/nbin;</div>
+<div class="line"><a name="l00973"></a><span class="lineno">  973</span>           <span class="keywordtype">double</span> pdfY=gsl_ran_gaussian_pdf(inputY[ipoint]-centerY, sigma);</div>
+<div class="line"><a name="l00974"></a><span class="lineno">  974</span>           output[ibinX][binY]+=pdfX*pdfY;</div>
+<div class="line"><a name="l00975"></a><span class="lineno">  975</span>         }</div>
+<div class="line"><a name="l00976"></a><span class="lineno">  976</span>       }</div>
+<div class="line"><a name="l00977"></a><span class="lineno">  977</span>     }</div>
+<div class="line"><a name="l00978"></a><span class="lineno">  978</span>     <span class="keywordflow">else</span></div>
+<div class="line"><a name="l00979"></a><span class="lineno">  979</span>       ++output[binX][binY];</div>
+<div class="line"><a name="l00980"></a><span class="lineno">  980</span>   }</div>
+<div class="line"><a name="l00981"></a><span class="lineno">  981</span>   <span class="keywordflow">if</span>(!filename.empty()){</div>
+<div class="line"><a name="l00982"></a><span class="lineno">  982</span>     std::ofstream outputfile;</div>
+<div class="line"><a name="l00983"></a><span class="lineno">  983</span>     outputfile.open(filename.c_str());</div>
+<div class="line"><a name="l00984"></a><span class="lineno">  984</span>     <span class="keywordflow">if</span>(!outputfile){</div>
+<div class="line"><a name="l00985"></a><span class="lineno">  985</span>       std::ostringstream s;</div>
+<div class="line"><a name="l00986"></a><span class="lineno">  986</span>       s<<<span class="stringliteral">"Error opening distribution file , "</span> << filename;</div>
+<div class="line"><a name="l00987"></a><span class="lineno">  987</span>       <span class="keywordflow">throw</span>(s.str());</div>
+<div class="line"><a name="l00988"></a><span class="lineno">  988</span>     }</div>
+<div class="line"><a name="l00989"></a><span class="lineno">  989</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> binX=0;binX<nbin;++binX){</div>
+<div class="line"><a name="l00990"></a><span class="lineno">  990</span>       outputfile << std::endl;</div>
+<div class="line"><a name="l00991"></a><span class="lineno">  991</span>       <span class="keywordflow">for</span>(<span class="keywordtype">int</span> binY=0;binY<nbin;++binY){</div>
+<div class="line"><a name="l00992"></a><span class="lineno">  992</span>     <span class="keywordtype">double</span> binValueX=0;</div>
+<div class="line"><a name="l00993"></a><span class="lineno">  993</span>     <span class="keywordflow">if</span>(nbin==maxX-minX+1)</div>
+<div class="line"><a name="l00994"></a><span class="lineno">  994</span>       binValueX=minX+binX;</div>
+<div class="line"><a name="l00995"></a><span class="lineno">  995</span>     <span class="keywordflow">else</span></div>
+<div class="line"><a name="l00996"></a><span class="lineno">  996</span>       binValueX=minX+<span class="keyword">static_cast<</span><span class="keywordtype">double</span><span class="keyword">></span>(maxX-minX)*(binX+0.5)/nbin;</div>
+<div class="line"><a name="l00997"></a><span class="lineno">  997</span>     <span class="keywordtype">double</span> binValueY=0;</div>
+<div class="line"><a name="l00998"></a><span class="lineno">  998</span>     <span class="keywordflow">if</span>(nbin==maxY-minY+1)</div>
+<div class="line"><a name="l00999"></a><span class="lineno">  999</span>       binValueY=minY+binY;</div>
+<div class="line"><a name="l01000"></a><span class="lineno"> 1000</span>     <span class="keywordflow">else</span></div>
+<div class="line"><a name="l01001"></a><span class="lineno"> 1001</span>       binValueY=minY+<span class="keyword">static_cast<</span><span class="keywordtype">double</span><span class="keyword">></span>(maxY-minY)*(binY+0.5)/nbin;</div>
+<div class="line"><a name="l01002"></a><span class="lineno"> 1002</span>         <span class="keywordtype">double</span> value=0;</div>
+<div class="line"><a name="l01003"></a><span class="lineno"> 1003</span>         value=<span class="keyword">static_cast<</span><span class="keywordtype">double</span><span class="keyword">></span>(output[binX][binY])/npoint;</div>
+<div class="line"><a name="l01004"></a><span class="lineno"> 1004</span>     outputfile << binValueX << <span class="stringliteral">" "</span> << binValueY << <span class="stringliteral">" "</span> << value << std::endl;</div>
+<div class="line"><a name="l01005"></a><span class="lineno"> 1005</span>         <span class="comment">/* double value=static_cast<double>(output[binX][binY])/npoint; */</span></div>
+<div class="line"><a name="l01006"></a><span class="lineno"> 1006</span>         <span class="comment">/* outputfile << (maxX-minX)*bin/(nbin-1)+minX << " " << (maxY-minY)*bin/(nbin-1)+minY << " " << value << std::endl; */</span></div>
+<div class="line"><a name="l01007"></a><span class="lineno"> 1007</span>       }</div>
+<div class="line"><a name="l01008"></a><span class="lineno"> 1008</span>     }</div>
+<div class="line"><a name="l01009"></a><span class="lineno"> 1009</span>     outputfile.close();</div>
+<div class="line"><a name="l01010"></a><span class="lineno"> 1010</span>   }</div>
+<div class="line"><a name="l01011"></a><span class="lineno"> 1011</span> }</div>
+<div class="line"><a name="l01012"></a><span class="lineno"> 1012</span> </div>
+<div class="line"><a name="l01013"></a><span class="lineno"> 1013</span> <span class="comment">//todo: what with nodata values?</span></div>
+<div class="line"><a name="l01014"></a><span class="lineno"> 1014</span> <span class="keyword">template</span><<span class="keyword">class</span> T> <span class="keywordtype">void</span>  StatFactory::percentiles (<span class="keyword">const</span> std::vector<T>& input, <span class="keyword">typename</span> std::vector<T>::const_iterator begin, <span class="keyword">typename</span> std::vector<T>::const_iterator end, std::vector<T>& output, <sp [...]
+<div class="line"><a name="l01015"></a><span class="lineno"> 1015</span> <span class="keyword"></span>{</div>
+<div class="line"><a name="l01016"></a><span class="lineno"> 1016</span>   <span class="keywordflow">if</span>(maximum<=minimum)</div>
+<div class="line"><a name="l01017"></a><span class="lineno"> 1017</span>     minmax(input,begin,end,minimum,maximum);</div>
+<div class="line"><a name="l01018"></a><span class="lineno"> 1018</span>   <span class="keywordflow">if</span>(maximum<=minimum){</div>
+<div class="line"><a name="l01019"></a><span class="lineno"> 1019</span>     std::ostringstream s;</div>
+<div class="line"><a name="l01020"></a><span class="lineno"> 1020</span>     s<<<span class="stringliteral">"Error: maximum must be at least minimum"</span>;</div>
+<div class="line"><a name="l01021"></a><span class="lineno"> 1021</span>     <span class="keywordflow">throw</span>(s.str());</div>
+<div class="line"><a name="l01022"></a><span class="lineno"> 1022</span>   }</div>
+<div class="line"><a name="l01023"></a><span class="lineno"> 1023</span>   <span class="keywordflow">if</span>(nbin<=1){</div>
+<div class="line"><a name="l01024"></a><span class="lineno"> 1024</span>     std::ostringstream s;</div>
+<div class="line"><a name="l01025"></a><span class="lineno"> 1025</span>     s<<<span class="stringliteral">"Error: nbin must be larger than 1"</span>;</div>
+<div class="line"><a name="l01026"></a><span class="lineno"> 1026</span>     <span class="keywordflow">throw</span>(s.str());</div>
+<div class="line"><a name="l01027"></a><span class="lineno"> 1027</span>   }</div>
+<div class="line"><a name="l01028"></a><span class="lineno"> 1028</span>   <span class="keywordflow">if</span>(input.empty()){</div>
+<div class="line"><a name="l01029"></a><span class="lineno"> 1029</span>     std::ostringstream s;</div>
+<div class="line"><a name="l01030"></a><span class="lineno"> 1030</span>     s<<<span class="stringliteral">"Error: input is empty"</span>;</div>
+<div class="line"><a name="l01031"></a><span class="lineno"> 1031</span>     <span class="keywordflow">throw</span>(s.str());</div>
+<div class="line"><a name="l01032"></a><span class="lineno"> 1032</span>   }</div>
+<div class="line"><a name="l01033"></a><span class="lineno"> 1033</span>   output.resize(nbin);</div>
+<div class="line"><a name="l01034"></a><span class="lineno"> 1034</span>   std::vector<T> inputSort;</div>
+<div class="line"><a name="l01035"></a><span class="lineno"> 1035</span>   inputSort.assign(begin,end);</div>
+<div class="line"><a name="l01036"></a><span class="lineno"> 1036</span>   <span class="keyword">typename</span> std::vector<T>::iterator vit=inputSort.begin();</div>
+<div class="line"><a name="l01037"></a><span class="lineno"> 1037</span>   <span class="keywordflow">while</span>(vit!=inputSort.end()){</div>
+<div class="line"><a name="l01038"></a><span class="lineno"> 1038</span>     <span class="keywordflow">if</span>(*vit<minimum||*vit>maximum)</div>
+<div class="line"><a name="l01039"></a><span class="lineno"> 1039</span>       inputSort.erase(vit);</div>
+<div class="line"><a name="l01040"></a><span class="lineno"> 1040</span>     <span class="keywordflow">else</span></div>
+<div class="line"><a name="l01041"></a><span class="lineno"> 1041</span>       ++vit;</div>
+<div class="line"><a name="l01042"></a><span class="lineno"> 1042</span>   }</div>
+<div class="line"><a name="l01043"></a><span class="lineno"> 1043</span>   std::sort(inputSort.begin(),inputSort.end());</div>
+<div class="line"><a name="l01044"></a><span class="lineno"> 1044</span>   vit=inputSort.begin();</div>
+<div class="line"><a name="l01045"></a><span class="lineno"> 1045</span>   std::vector<T> inputBin;</div>
+<div class="line"><a name="l01046"></a><span class="lineno"> 1046</span>   <span class="keywordflow">for</span>(<span class="keywordtype">int</span> ibin=0;ibin<nbin;++ibin){</div>
+<div class="line"><a name="l01047"></a><span class="lineno"> 1047</span>     inputBin.clear();</div>
+<div class="line"><a name="l01048"></a><span class="lineno"> 1048</span>     <span class="keywordflow">while</span>(inputBin.size()<inputSort.size()/nbin&&vit!=inputSort.end()){</div>
+<div class="line"><a name="l01049"></a><span class="lineno"> 1049</span>       inputBin.push_back(*vit);</div>
+<div class="line"><a name="l01050"></a><span class="lineno"> 1050</span>       ++vit;</div>
+<div class="line"><a name="l01051"></a><span class="lineno"> 1051</span>     }</div>
+<div class="line"><a name="l01052"></a><span class="lineno"> 1052</span>     <span class="keywordflow">if</span>(inputBin.size()){</div>
+<div class="line"><a name="l01053"></a><span class="lineno"> 1053</span>       output[ibin]=mymax(inputBin);</div>
+<div class="line"><a name="l01054"></a><span class="lineno"> 1054</span>     }</div>
+<div class="line"><a name="l01055"></a><span class="lineno"> 1055</span>   }</div>
+<div class="line"><a name="l01056"></a><span class="lineno"> 1056</span>   <span class="keywordflow">if</span>(!filename.empty()){</div>
+<div class="line"><a name="l01057"></a><span class="lineno"> 1057</span>     std::ofstream outputfile;</div>
+<div class="line"><a name="l01058"></a><span class="lineno"> 1058</span>     outputfile.open(filename.c_str());</div>
+<div class="line"><a name="l01059"></a><span class="lineno"> 1059</span>     <span class="keywordflow">if</span>(!outputfile){</div>
+<div class="line"><a name="l01060"></a><span class="lineno"> 1060</span>       std::ostringstream s;</div>
+<div class="line"><a name="l01061"></a><span class="lineno"> 1061</span>       s<<<span class="stringliteral">"error opening distribution file , "</span> << filename;</div>
+<div class="line"><a name="l01062"></a><span class="lineno"> 1062</span>       <span class="keywordflow">throw</span>(s.str());</div>
+<div class="line"><a name="l01063"></a><span class="lineno"> 1063</span>     }</div>
+<div class="line"><a name="l01064"></a><span class="lineno"> 1064</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> ibin=0;ibin<nbin;++ibin)</div>
+<div class="line"><a name="l01065"></a><span class="lineno"> 1065</span>       outputfile << ibin*100.0/nbin << <span class="stringliteral">" "</span> << static_cast<double>(output[ibin])/input.size() << std::endl;</div>
+<div class="line"><a name="l01066"></a><span class="lineno"> 1066</span>     outputfile.close();</div>
+<div class="line"><a name="l01067"></a><span class="lineno"> 1067</span>   }</div>
+<div class="line"><a name="l01068"></a><span class="lineno"> 1068</span> }</div>
+<div class="line"><a name="l01069"></a><span class="lineno"> 1069</span> </div>
+<div class="line"><a name="l01070"></a><span class="lineno"> 1070</span> <span class="comment">//todo: what with nodata values?</span></div>
+<div class="line"><a name="l01071"></a><span class="lineno"> 1071</span> <span class="keyword">template</span><<span class="keyword">class</span> T> T  StatFactory::percentile(<span class="keyword">const</span> std::vector<T>& input, <span class="keyword">typename</span> std::vector<T>::const_iterator begin, <span class="keyword">typename</span> std::vector<T>::const_iterator end, <span class="keywordtype">double</span> percent, T minimum, T maximum)<span [...]
+<div class="line"><a name="l01072"></a><span class="lineno"> 1072</span> <span class="keyword"></span>{</div>
+<div class="line"><a name="l01073"></a><span class="lineno"> 1073</span>   <span class="keywordflow">if</span>(input.empty()){</div>
+<div class="line"><a name="l01074"></a><span class="lineno"> 1074</span>     std::ostringstream s;</div>
+<div class="line"><a name="l01075"></a><span class="lineno"> 1075</span>     s<<<span class="stringliteral">"Error: input is empty"</span>;</div>
+<div class="line"><a name="l01076"></a><span class="lineno"> 1076</span>     <span class="keywordflow">throw</span>(s.str());</div>
+<div class="line"><a name="l01077"></a><span class="lineno"> 1077</span>   }</div>
+<div class="line"><a name="l01078"></a><span class="lineno"> 1078</span>   std::vector<T> inputSort;</div>
+<div class="line"><a name="l01079"></a><span class="lineno"> 1079</span>   inputSort.assign(begin,end);</div>
+<div class="line"><a name="l01080"></a><span class="lineno"> 1080</span>   <span class="keyword">typename</span> std::vector<T>::iterator vit=inputSort.begin();</div>
+<div class="line"><a name="l01081"></a><span class="lineno"> 1081</span>   <span class="keywordflow">while</span>(vit!=inputSort.end()){</div>
+<div class="line"><a name="l01082"></a><span class="lineno"> 1082</span>     <span class="keywordflow">if</span>(maximum>minimum){</div>
+<div class="line"><a name="l01083"></a><span class="lineno"> 1083</span>       <span class="keywordflow">if</span>(*vit<minimum||*vit>maximum)</div>
+<div class="line"><a name="l01084"></a><span class="lineno"> 1084</span>     inputSort.erase(vit);</div>
+<div class="line"><a name="l01085"></a><span class="lineno"> 1085</span>     }</div>
+<div class="line"><a name="l01086"></a><span class="lineno"> 1086</span>     <span class="keywordflow">else</span></div>
+<div class="line"><a name="l01087"></a><span class="lineno"> 1087</span>       ++vit;</div>
+<div class="line"><a name="l01088"></a><span class="lineno"> 1088</span>   }</div>
+<div class="line"><a name="l01089"></a><span class="lineno"> 1089</span>   std::sort(inputSort.begin(),inputSort.end());</div>
+<div class="line"><a name="l01090"></a><span class="lineno"> 1090</span>   <span class="keywordflow">return</span> gsl_stats_quantile_from_sorted_data(&(inputSort[0]),1,inputSort.size(),percent/100.0);</div>
+<div class="line"><a name="l01091"></a><span class="lineno"> 1091</span> }</div>
+<div class="line"><a name="l01092"></a><span class="lineno"> 1092</span> </div>
+<div class="line"><a name="l01093"></a><span class="lineno"> 1093</span> <span class="keyword">template</span><<span class="keyword">class</span> T> <span class="keywordtype">void</span> StatFactory::signature(<span class="keyword">const</span> std::vector<T>& input, <span class="keywordtype">double</span>&k, <span class="keywordtype">double</span>& alpha, <span class="keywordtype">double</span>& beta, <span class="keywordtype">double</span> e)<span class [...]
+<div class="line"><a name="l01094"></a><span class="lineno"> 1094</span> <span class="keyword"></span>{</div>
+<div class="line"><a name="l01095"></a><span class="lineno"> 1095</span>   <span class="keywordtype">double</span> m1=moment(input,1);</div>
+<div class="line"><a name="l01096"></a><span class="lineno"> 1096</span>   <span class="keywordtype">double</span> m2=moment(input,2);</div>
+<div class="line"><a name="l01097"></a><span class="lineno"> 1097</span>   signature(m1,m2,k,alpha,beta,e);</div>
+<div class="line"><a name="l01098"></a><span class="lineno"> 1098</span> }</div>
+<div class="line"><a name="l01099"></a><span class="lineno"> 1099</span> </div>
+<div class="line"><a name="l01100"></a><span class="lineno"> 1100</span> <span class="comment">//todo: what with nodata values?</span></div>
+<div class="line"><a name="l01101"></a><span class="lineno"> 1101</span> <span class="keyword">template</span><<span class="keyword">class</span> T> <span class="keywordtype">void</span> StatFactory::normalize(<span class="keyword">const</span> std::vector<T>& input, std::vector<double>& output)<span class="keyword"> const</span>{</div>
+<div class="line"><a name="l01102"></a><span class="lineno"> 1102</span>   <span class="keywordtype">double</span> total=sum(input);</div>
+<div class="line"><a name="l01103"></a><span class="lineno"> 1103</span>   <span class="keywordflow">if</span>(total){</div>
+<div class="line"><a name="l01104"></a><span class="lineno"> 1104</span>     output.resize(input.size());</div>
+<div class="line"><a name="l01105"></a><span class="lineno"> 1105</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> index=0;index<input.size();++index)</div>
+<div class="line"><a name="l01106"></a><span class="lineno"> 1106</span>       output[index]=input[index]/total;</div>
+<div class="line"><a name="l01107"></a><span class="lineno"> 1107</span>   }</div>
+<div class="line"><a name="l01108"></a><span class="lineno"> 1108</span>   <span class="keywordflow">else</span></div>
+<div class="line"><a name="l01109"></a><span class="lineno"> 1109</span>     output=input;</div>
+<div class="line"><a name="l01110"></a><span class="lineno"> 1110</span> }</div>
+<div class="line"><a name="l01111"></a><span class="lineno"> 1111</span> </div>
+<div class="line"><a name="l01112"></a><span class="lineno"> 1112</span> <span class="comment">//todo: what with nodata values?</span></div>
+<div class="line"><a name="l01113"></a><span class="lineno"> 1113</span> <span class="keyword">template</span><<span class="keyword">class</span> T> <span class="keywordtype">void</span> StatFactory::normalize_pct(std::vector<T>& input)<span class="keyword"> const</span>{</div>
+<div class="line"><a name="l01114"></a><span class="lineno"> 1114</span>   <span class="keywordtype">double</span> total=sum(input);</div>
+<div class="line"><a name="l01115"></a><span class="lineno"> 1115</span>   <span class="keywordflow">if</span>(total){</div>
+<div class="line"><a name="l01116"></a><span class="lineno"> 1116</span>     <span class="keyword">typename</span> std::vector<T>::iterator it;</div>
+<div class="line"><a name="l01117"></a><span class="lineno"> 1117</span>     <span class="keywordflow">for</span>(it=input.begin();it!=input.end();++it)</div>
+<div class="line"><a name="l01118"></a><span class="lineno"> 1118</span>       *it=100.0*(*it)/total;</div>
+<div class="line"><a name="l01119"></a><span class="lineno"> 1119</span>   }</div>
+<div class="line"><a name="l01120"></a><span class="lineno"> 1120</span> }</div>
+<div class="line"><a name="l01121"></a><span class="lineno"> 1121</span>  </div>
+<div class="line"><a name="l01122"></a><span class="lineno"> 1122</span> <span class="keyword">template</span><<span class="keyword">class</span> T> <span class="keywordtype">double</span> StatFactory::rmse(<span class="keyword">const</span> std::vector<T>& x, <span class="keyword">const</span> std::vector<T>& y)<span class="keyword"> const</span>{</div>
+<div class="line"><a name="l01123"></a><span class="lineno"> 1123</span>   <span class="keywordflow">if</span>(x.size()!=y.size()){</div>
+<div class="line"><a name="l01124"></a><span class="lineno"> 1124</span>     std::ostringstream s;</div>
+<div class="line"><a name="l01125"></a><span class="lineno"> 1125</span>     s<<<span class="stringliteral">"Error: x and y not equal in size"</span>;</div>
+<div class="line"><a name="l01126"></a><span class="lineno"> 1126</span>     <span class="keywordflow">throw</span>(s.str());</div>
+<div class="line"><a name="l01127"></a><span class="lineno"> 1127</span>   }</div>
+<div class="line"><a name="l01128"></a><span class="lineno"> 1128</span>   <span class="keywordflow">if</span>(x.empty()){</div>
+<div class="line"><a name="l01129"></a><span class="lineno"> 1129</span>     std::ostringstream s;</div>
+<div class="line"><a name="l01130"></a><span class="lineno"> 1130</span>     s<<<span class="stringliteral">"Error: x is empty"</span>;</div>
+<div class="line"><a name="l01131"></a><span class="lineno"> 1131</span>     <span class="keywordflow">throw</span>(s.str());</div>
+<div class="line"><a name="l01132"></a><span class="lineno"> 1132</span>   }</div>
+<div class="line"><a name="l01133"></a><span class="lineno"> 1133</span>   <span class="keywordtype">double</span> mse=0;</div>
+<div class="line"><a name="l01134"></a><span class="lineno"> 1134</span>   <span class="keywordflow">for</span>(<span class="keywordtype">int</span> isample=0;isample<x.size();++isample){</div>
+<div class="line"><a name="l01135"></a><span class="lineno"> 1135</span>     <span class="keywordflow">if</span>(isNoData(x[isample])||isNoData(y[isample]))</div>
+<div class="line"><a name="l01136"></a><span class="lineno"> 1136</span>        <span class="keywordflow">continue</span>;</div>
+<div class="line"><a name="l01137"></a><span class="lineno"> 1137</span>     <span class="keywordtype">double</span> e=x[isample]-y[isample];</div>
+<div class="line"><a name="l01138"></a><span class="lineno"> 1138</span>     mse+=e*e/x.size();</div>
+<div class="line"><a name="l01139"></a><span class="lineno"> 1139</span>   }</div>
+<div class="line"><a name="l01140"></a><span class="lineno"> 1140</span>   <span class="keywordflow">return</span> sqrt(mse);</div>
 <div class="line"><a name="l01141"></a><span class="lineno"> 1141</span> }</div>
 <div class="line"><a name="l01142"></a><span class="lineno"> 1142</span> </div>
-<div class="line"><a name="l01143"></a><span class="lineno"> 1143</span> <span class="comment">//todo: what if no valid data?</span></div>
-<div class="line"><a name="l01144"></a><span class="lineno"> 1144</span> <span class="keyword">template</span><<span class="keyword">class</span> T> <span class="keywordtype">double</span> StatFactory::cross_correlation(<span class="keyword">const</span> std::vector<T>& x, <span class="keyword">const</span> std::vector<T>& y, <span class="keywordtype">int</span> maxdelay, std::vector<T>& z)<span class="keyword"> const</span>{</div>
-<div class="line"><a name="l01145"></a><span class="lineno"> 1145</span>   z.clear();</div>
-<div class="line"><a name="l01146"></a><span class="lineno"> 1146</span>   <span class="keywordtype">double</span> sumCorrelation=0;</div>
-<div class="line"><a name="l01147"></a><span class="lineno"> 1147</span>   <span class="keywordflow">for</span> (<span class="keywordtype">int</span> delay=-maxdelay;delay<maxdelay;delay++) {</div>
-<div class="line"><a name="l01148"></a><span class="lineno"> 1148</span>     z.push_back(correlation(x,y,delay));</div>
-<div class="line"><a name="l01149"></a><span class="lineno"> 1149</span>     sumCorrelation+=z.back();</div>
-<div class="line"><a name="l01150"></a><span class="lineno"> 1150</span>   }</div>
-<div class="line"><a name="l01151"></a><span class="lineno"> 1151</span>   <span class="keywordflow">return</span> sumCorrelation;</div>
-<div class="line"><a name="l01152"></a><span class="lineno"> 1152</span> }</div>
-<div class="line"><a name="l01153"></a><span class="lineno"> 1153</span> </div>
-<div class="line"><a name="l01154"></a><span class="lineno"> 1154</span> <span class="comment">//todo: nodata?</span></div>
-<div class="line"><a name="l01155"></a><span class="lineno"> 1155</span> <span class="keyword">template</span><<span class="keyword">class</span> T> <span class="keywordtype">double</span> StatFactory::linear_regression(<span class="keyword">const</span> std::vector<T>& x, <span class="keyword">const</span> std::vector<T>& y, <span class="keywordtype">double</span> &c0, <span class="keywordtype">double</span> &c1)<span class="keyword"> const</span>{</div>
-<div class="line"><a name="l01156"></a><span class="lineno"> 1156</span>   <span class="keywordflow">if</span>(x.size()!=y.size()){</div>
-<div class="line"><a name="l01157"></a><span class="lineno"> 1157</span>     std::ostringstream s;</div>
-<div class="line"><a name="l01158"></a><span class="lineno"> 1158</span>     s<<<span class="stringliteral">"Error: x and y not equal in size"</span>;</div>
-<div class="line"><a name="l01159"></a><span class="lineno"> 1159</span>     <span class="keywordflow">throw</span>(s.str());</div>
-<div class="line"><a name="l01160"></a><span class="lineno"> 1160</span>   }</div>
-<div class="line"><a name="l01161"></a><span class="lineno"> 1161</span>   <span class="keywordflow">if</span>(x.empty()){</div>
-<div class="line"><a name="l01162"></a><span class="lineno"> 1162</span>     std::ostringstream s;</div>
-<div class="line"><a name="l01163"></a><span class="lineno"> 1163</span>     s<<<span class="stringliteral">"Error: x is empty"</span>;</div>
-<div class="line"><a name="l01164"></a><span class="lineno"> 1164</span>     <span class="keywordflow">throw</span>(s.str());</div>
-<div class="line"><a name="l01165"></a><span class="lineno"> 1165</span>   }</div>
-<div class="line"><a name="l01166"></a><span class="lineno"> 1166</span>   <span class="keywordtype">double</span> cov00;</div>
-<div class="line"><a name="l01167"></a><span class="lineno"> 1167</span>   <span class="keywordtype">double</span> cov01;</div>
-<div class="line"><a name="l01168"></a><span class="lineno"> 1168</span>   <span class="keywordtype">double</span>  cov11;</div>
-<div class="line"><a name="l01169"></a><span class="lineno"> 1169</span>   <span class="keywordtype">double</span> sumsq;</div>
-<div class="line"><a name="l01170"></a><span class="lineno"> 1170</span>   gsl_fit_linear(&(x[0]),1,&(y[0]),1,x.size(),&c0,&c1,&cov00,&cov01,&cov11,&sumsq);</div>
-<div class="line"><a name="l01171"></a><span class="lineno"> 1171</span>   <span class="keywordflow">return</span> (1-sumsq/var(y)/(y.size()-1));</div>
-<div class="line"><a name="l01172"></a><span class="lineno"> 1172</span> }</div>
-<div class="line"><a name="l01173"></a><span class="lineno"> 1173</span> </div>
-<div class="line"><a name="l01174"></a><span class="lineno"> 1174</span> <span class="comment">//todo: nodata?</span></div>
-<div class="line"><a name="l01175"></a><span class="lineno"> 1175</span> <span class="keyword">template</span><<span class="keyword">class</span> T> <span class="keywordtype">double</span> StatFactory::linear_regression_err(<span class="keyword">const</span> std::vector<T>& x, <span class="keyword">const</span> std::vector<T>& y, <span class="keywordtype">double</span> &c0, <span class="keywordtype">double</span> &c1)<span class="keyword"> const</sp [...]
-<div class="line"><a name="l01176"></a><span class="lineno"> 1176</span>   <span class="keywordflow">if</span>(x.size()!=y.size()){</div>
-<div class="line"><a name="l01177"></a><span class="lineno"> 1177</span>     std::ostringstream s;</div>
-<div class="line"><a name="l01178"></a><span class="lineno"> 1178</span>     s<<<span class="stringliteral">"Error: x and y not equal in size"</span>;</div>
-<div class="line"><a name="l01179"></a><span class="lineno"> 1179</span>     <span class="keywordflow">throw</span>(s.str());</div>
-<div class="line"><a name="l01180"></a><span class="lineno"> 1180</span>   }</div>
-<div class="line"><a name="l01181"></a><span class="lineno"> 1181</span>   <span class="keywordflow">if</span>(x.empty()){</div>
-<div class="line"><a name="l01182"></a><span class="lineno"> 1182</span>     std::ostringstream s;</div>
-<div class="line"><a name="l01183"></a><span class="lineno"> 1183</span>     s<<<span class="stringliteral">"Error: x is empty"</span>;</div>
-<div class="line"><a name="l01184"></a><span class="lineno"> 1184</span>     <span class="keywordflow">throw</span>(s.str());</div>
-<div class="line"><a name="l01185"></a><span class="lineno"> 1185</span>   }</div>
-<div class="line"><a name="l01186"></a><span class="lineno"> 1186</span>   <span class="keywordtype">double</span> cov00;</div>
-<div class="line"><a name="l01187"></a><span class="lineno"> 1187</span>   <span class="keywordtype">double</span> cov01;</div>
-<div class="line"><a name="l01188"></a><span class="lineno"> 1188</span>   <span class="keywordtype">double</span>  cov11;</div>
-<div class="line"><a name="l01189"></a><span class="lineno"> 1189</span>   <span class="keywordtype">double</span> sumsq;</div>
-<div class="line"><a name="l01190"></a><span class="lineno"> 1190</span>   gsl_fit_linear(&(x[0]),1,&(y[0]),1,x.size(),&c0,&c1,&cov00,&cov01,&cov11,&sumsq);</div>
-<div class="line"><a name="l01191"></a><span class="lineno"> 1191</span>   <span class="keywordflow">return</span> sqrt((sumsq)/(y.size()));</div>
-<div class="line"><a name="l01192"></a><span class="lineno"> 1192</span> }</div>
-<div class="line"><a name="l01193"></a><span class="lineno"> 1193</span> </div>
-<div class="line"><a name="l01194"></a><span class="lineno"> 1194</span> <span class="comment">//alternatively: use GNU scientific library:</span></div>
-<div class="line"><a name="l01195"></a><span class="lineno"> 1195</span> <span class="comment">// gsl_stats_correlation (const double data1[], const size_t stride1, const double data2[], const size_t stride2, const size_t n)</span></div>
-<div class="line"><a name="l01196"></a><span class="lineno"> 1196</span> </div>
-<div class="line"><a name="l01197"></a><span class="lineno"> 1197</span> <span class="keyword">template</span><<span class="keyword">class</span> T> <span class="keywordtype">void</span> StatFactory::interpolateNoData(<span class="keyword">const</span> std::vector<double>& wavelengthIn, <span class="keyword">const</span> std::vector<T>& input, <span class="keyword">const</span> std::string& type, std::vector<T>& output, <span class="keywordtyp [...]
-<div class="line"><a name="l01198"></a><span class="lineno"> 1198</span>   <span class="keywordflow">if</span>(wavelengthIn.empty()){</div>
-<div class="line"><a name="l01199"></a><span class="lineno"> 1199</span>     std::ostringstream s;</div>
-<div class="line"><a name="l01200"></a><span class="lineno"> 1200</span>     s<<<span class="stringliteral">"Error: wavelengthIn is empty"</span>;</div>
-<div class="line"><a name="l01201"></a><span class="lineno"> 1201</span>     <span class="keywordflow">throw</span>(s.str());</div>
-<div class="line"><a name="l01202"></a><span class="lineno"> 1202</span>   }</div>
-<div class="line"><a name="l01203"></a><span class="lineno"> 1203</span>   std::vector<double> wavelengthOut=wavelengthIn;</div>
-<div class="line"><a name="l01204"></a><span class="lineno"> 1204</span>   std::vector<T> validIn=input;</div>
-<div class="line"><a name="l01205"></a><span class="lineno"> 1205</span>   <span class="keywordflow">if</span>(input.size()!=wavelengthIn.size()){</div>
-<div class="line"><a name="l01206"></a><span class="lineno"> 1206</span>     std::ostringstream s;</div>
-<div class="line"><a name="l01207"></a><span class="lineno"> 1207</span>     s<<<span class="stringliteral">"Error: x and y not equal in size"</span>;</div>
-<div class="line"><a name="l01208"></a><span class="lineno"> 1208</span>     <span class="keywordflow">throw</span>(s.str());</div>
-<div class="line"><a name="l01209"></a><span class="lineno"> 1209</span>   }</div>
-<div class="line"><a name="l01210"></a><span class="lineno"> 1210</span>   <span class="keywordtype">int</span> nband=wavelengthIn.size();</div>
-<div class="line"><a name="l01211"></a><span class="lineno"> 1211</span>   output.clear();</div>
-<div class="line"><a name="l01212"></a><span class="lineno"> 1212</span>   <span class="comment">//remove nodata from input and corresponding wavelengthIn</span></div>
-<div class="line"><a name="l01213"></a><span class="lineno"> 1213</span>   <span class="keywordflow">if</span>(m_noDataValues.size()){</div>
-<div class="line"><a name="l01214"></a><span class="lineno"> 1214</span>     <span class="keyword">typename</span> std::vector<T>::iterator itValue=validIn.begin();</div>
-<div class="line"><a name="l01215"></a><span class="lineno"> 1215</span>     <span class="keyword">typename</span> std::vector<T>::iterator itWavelength=wavelengthOut.begin();</div>
-<div class="line"><a name="l01216"></a><span class="lineno"> 1216</span>     <span class="keywordflow">while</span>(itValue!=validIn.end()&&itWavelength!=wavelengthOut.end()){</div>
-<div class="line"><a name="l01217"></a><span class="lineno"> 1217</span>       <span class="keywordflow">if</span>(isNoData(*itValue)){</div>
-<div class="line"><a name="l01218"></a><span class="lineno"> 1218</span>     validIn.erase(itValue);</div>
-<div class="line"><a name="l01219"></a><span class="lineno"> 1219</span>     wavelengthOut.erase(itWavelength);</div>
-<div class="line"><a name="l01220"></a><span class="lineno"> 1220</span>       }</div>
-<div class="line"><a name="l01221"></a><span class="lineno"> 1221</span>       <span class="keywordflow">else</span>{</div>
-<div class="line"><a name="l01222"></a><span class="lineno"> 1222</span>     ++itValue;</div>
-<div class="line"><a name="l01223"></a><span class="lineno"> 1223</span>     ++itWavelength;</div>
-<div class="line"><a name="l01224"></a><span class="lineno"> 1224</span>       }</div>
-<div class="line"><a name="l01225"></a><span class="lineno"> 1225</span>     }</div>
-<div class="line"><a name="l01226"></a><span class="lineno"> 1226</span>     <span class="keywordflow">if</span>(validIn.size()>1){</div>
-<div class="line"><a name="l01227"></a><span class="lineno"> 1227</span>       <span class="keywordflow">try</span>{</div>
-<div class="line"><a name="l01228"></a><span class="lineno"> 1228</span>     interpolateUp(wavelengthOut, validIn, wavelengthIn, type, output, verbose);</div>
-<div class="line"><a name="l01229"></a><span class="lineno"> 1229</span>       }</div>
-<div class="line"><a name="l01230"></a><span class="lineno"> 1230</span>       <span class="keywordflow">catch</span>(...){</div>
-<div class="line"><a name="l01231"></a><span class="lineno"> 1231</span>     output=input;</div>
-<div class="line"><a name="l01232"></a><span class="lineno"> 1232</span>       }</div>
-<div class="line"><a name="l01233"></a><span class="lineno"> 1233</span>     }</div>
-<div class="line"><a name="l01234"></a><span class="lineno"> 1234</span>     <span class="keywordflow">else</span><span class="comment">//we can not interpolate if no valid data</span></div>
-<div class="line"><a name="l01235"></a><span class="lineno"> 1235</span>       output=input;</div>
-<div class="line"><a name="l01236"></a><span class="lineno"> 1236</span>   }</div>
-<div class="line"><a name="l01237"></a><span class="lineno"> 1237</span>   <span class="keywordflow">else</span><span class="comment">//no nodata values to interpolate</span></div>
-<div class="line"><a name="l01238"></a><span class="lineno"> 1238</span>     output=input;</div>
-<div class="line"><a name="l01239"></a><span class="lineno"> 1239</span> }</div>
-<div class="line"><a name="l01240"></a><span class="lineno"> 1240</span> </div>
-<div class="line"><a name="l01241"></a><span class="lineno"> 1241</span> <span class="keyword">template</span><<span class="keyword">class</span> T> <span class="keywordtype">void</span> StatFactory::interpolateUp(<span class="keyword">const</span> std::vector<double>& wavelengthIn, <span class="keyword">const</span> std::vector<T>& input, <span class="keyword">const</span> std::vector<double>& wavelengthOut, <span class="keyword">const</span> std [...]
-<div class="line"><a name="l01242"></a><span class="lineno"> 1242</span>   <span class="keywordflow">if</span>(wavelengthIn.empty()){</div>
-<div class="line"><a name="l01243"></a><span class="lineno"> 1243</span>     std::ostringstream s;</div>
-<div class="line"><a name="l01244"></a><span class="lineno"> 1244</span>     s<<<span class="stringliteral">"Error: wavelengthIn is empty"</span>;</div>
-<div class="line"><a name="l01245"></a><span class="lineno"> 1245</span>     <span class="keywordflow">throw</span>(s.str());</div>
-<div class="line"><a name="l01246"></a><span class="lineno"> 1246</span>   }</div>
-<div class="line"><a name="l01247"></a><span class="lineno"> 1247</span>   <span class="keywordflow">if</span>(input.size()!=wavelengthIn.size()){</div>
-<div class="line"><a name="l01248"></a><span class="lineno"> 1248</span>     std::ostringstream s;</div>
-<div class="line"><a name="l01249"></a><span class="lineno"> 1249</span>     s<<<span class="stringliteral">"Error: input and wavelengthIn not equal in size"</span>;</div>
-<div class="line"><a name="l01250"></a><span class="lineno"> 1250</span>     <span class="keywordflow">throw</span>(s.str());</div>
-<div class="line"><a name="l01251"></a><span class="lineno"> 1251</span>   }</div>
-<div class="line"><a name="l01252"></a><span class="lineno"> 1252</span>   <span class="keywordflow">if</span>(wavelengthOut.empty()){</div>
-<div class="line"><a name="l01253"></a><span class="lineno"> 1253</span>     std::ostringstream s;</div>
-<div class="line"><a name="l01254"></a><span class="lineno"> 1254</span>     s<<<span class="stringliteral">"Error: wavelengthOut is empty"</span>;</div>
-<div class="line"><a name="l01255"></a><span class="lineno"> 1255</span>     <span class="keywordflow">throw</span>(s.str());</div>
-<div class="line"><a name="l01256"></a><span class="lineno"> 1256</span>   }</div>
-<div class="line"><a name="l01257"></a><span class="lineno"> 1257</span>   <span class="keywordtype">int</span> nband=wavelengthIn.size();</div>
-<div class="line"><a name="l01258"></a><span class="lineno"> 1258</span>   output.clear();</div>
-<div class="line"><a name="l01259"></a><span class="lineno"> 1259</span>   gsl_interp_accel *acc;</div>
-<div class="line"><a name="l01260"></a><span class="lineno"> 1260</span>   allocAcc(acc);</div>
-<div class="line"><a name="l01261"></a><span class="lineno"> 1261</span>   gsl_spline *spline;</div>
-<div class="line"><a name="l01262"></a><span class="lineno"> 1262</span>   getSpline(type,nband,spline);</div>
-<div class="line"><a name="l01263"></a><span class="lineno"> 1263</span>   assert(spline);</div>
-<div class="line"><a name="l01264"></a><span class="lineno"> 1264</span>   assert(&(wavelengthIn[0]));</div>
-<div class="line"><a name="l01265"></a><span class="lineno"> 1265</span>   assert(&(input[0]));</div>
-<div class="line"><a name="l01266"></a><span class="lineno"> 1266</span>   <span class="keywordtype">int</span> status=initSpline(spline,&(wavelengthIn[0]),&(input[0]),nband);</div>
-<div class="line"><a name="l01267"></a><span class="lineno"> 1267</span>   <span class="keywordflow">if</span>(status){</div>
-<div class="line"><a name="l01268"></a><span class="lineno"> 1268</span>     std::string errorString=<span class="stringliteral">"Could not initialize spline"</span>;</div>
-<div class="line"><a name="l01269"></a><span class="lineno"> 1269</span>     <span class="keywordflow">throw</span>(errorString);</div>
+<div class="line"><a name="l01143"></a><span class="lineno"> 1143</span> <span class="comment">// template<class T> double StatFactory::gsl_correlation(const std::vector<T>& x, const std::vector<T>& y) const{</span></div>
+<div class="line"><a name="l01144"></a><span class="lineno"> 1144</span> <span class="comment">//  return(gsl_stats_correlation(&(x[0]),1,&(y[0]),1,x.size()));</span></div>
+<div class="line"><a name="l01145"></a><span class="lineno"> 1145</span> <span class="comment">// }</span></div>
+<div class="line"><a name="l01146"></a><span class="lineno"> 1146</span> </div>
+<div class="line"><a name="l01147"></a><span class="lineno"> 1147</span>  <span class="keyword">template</span><<span class="keyword">class</span> T> <span class="keywordtype">double</span> StatFactory::gsl_covariance(<span class="keyword">const</span> std::vector<T>& x, <span class="keyword">const</span> std::vector<T>& y)<span class="keyword"> const</span>{</div>
+<div class="line"><a name="l01148"></a><span class="lineno"> 1148</span>    <span class="keywordflow">return</span>(gsl_stats_covariance(&(x[0]),1,&(y[0]),1,x.size()));</div>
+<div class="line"><a name="l01149"></a><span class="lineno"> 1149</span>  }</div>
+<div class="line"><a name="l01150"></a><span class="lineno"> 1150</span> </div>
+<div class="line"><a name="l01151"></a><span class="lineno"> 1151</span> </div>
+<div class="line"><a name="l01152"></a><span class="lineno"> 1152</span> <span class="keyword">template</span><<span class="keyword">class</span> T> <span class="keywordtype">double</span> StatFactory::correlation(<span class="keyword">const</span> std::vector<T>& x, <span class="keyword">const</span> std::vector<T>& y, <span class="keywordtype">int</span> delay)<span class="keyword"> const</span>{</div>
+<div class="line"><a name="l01153"></a><span class="lineno"> 1153</span>   <span class="keywordtype">double</span> meanX=0;</div>
+<div class="line"><a name="l01154"></a><span class="lineno"> 1154</span>   <span class="keywordtype">double</span> meanY=0;</div>
+<div class="line"><a name="l01155"></a><span class="lineno"> 1155</span>   <span class="keywordtype">double</span> varX=0;</div>
+<div class="line"><a name="l01156"></a><span class="lineno"> 1156</span>   <span class="keywordtype">double</span> varY=0;</div>
+<div class="line"><a name="l01157"></a><span class="lineno"> 1157</span>   <span class="keywordtype">double</span> sXY=0;</div>
+<div class="line"><a name="l01158"></a><span class="lineno"> 1158</span>   meanVar(x,meanX,varX);</div>
+<div class="line"><a name="l01159"></a><span class="lineno"> 1159</span>   meanVar(y,meanY,varY);</div>
+<div class="line"><a name="l01160"></a><span class="lineno"> 1160</span>   <span class="keywordtype">double</span> denom = sqrt(varX*varY);</div>
+<div class="line"><a name="l01161"></a><span class="lineno"> 1161</span>   <span class="keywordtype">bool</span> isValid=<span class="keyword">false</span>;</div>
+<div class="line"><a name="l01162"></a><span class="lineno"> 1162</span>   <span class="keywordflow">if</span>(denom){</div>
+<div class="line"><a name="l01163"></a><span class="lineno"> 1163</span>     <span class="comment">//Calculate the correlation series</span></div>
+<div class="line"><a name="l01164"></a><span class="lineno"> 1164</span>     sXY = 0;</div>
+<div class="line"><a name="l01165"></a><span class="lineno"> 1165</span>     <span class="keywordflow">for</span> (<span class="keywordtype">int</span> i=0;i<x.size();++i) {</div>
+<div class="line"><a name="l01166"></a><span class="lineno"> 1166</span>       <span class="keywordtype">int</span> j = i + delay;</div>
+<div class="line"><a name="l01167"></a><span class="lineno"> 1167</span>       <span class="keywordflow">if</span> (j < 0 || j >= y.size())</div>
+<div class="line"><a name="l01168"></a><span class="lineno"> 1168</span>         <span class="keywordflow">continue</span>;</div>
+<div class="line"><a name="l01169"></a><span class="lineno"> 1169</span>       <span class="keywordflow">else</span> <span class="keywordflow">if</span>(isNoData(x[i])||isNoData(y[j]))</div>
+<div class="line"><a name="l01170"></a><span class="lineno"> 1170</span>     <span class="keywordflow">continue</span>;</div>
+<div class="line"><a name="l01171"></a><span class="lineno"> 1171</span>       <span class="keywordflow">else</span>{</div>
+<div class="line"><a name="l01172"></a><span class="lineno"> 1172</span>     isValid=<span class="keyword">true</span>;</div>
+<div class="line"><a name="l01173"></a><span class="lineno"> 1173</span>     <span class="keywordflow">if</span>(i<0){</div>
+<div class="line"><a name="l01174"></a><span class="lineno"> 1174</span>       std::ostringstream s;</div>
+<div class="line"><a name="l01175"></a><span class="lineno"> 1175</span>       s<<<span class="stringliteral">"Error: i must be positive"</span>;</div>
+<div class="line"><a name="l01176"></a><span class="lineno"> 1176</span>       <span class="keywordflow">throw</span>(s.str());</div>
+<div class="line"><a name="l01177"></a><span class="lineno"> 1177</span>     }</div>
+<div class="line"><a name="l01178"></a><span class="lineno"> 1178</span>     <span class="keywordflow">if</span>(i>=x.size()){</div>
+<div class="line"><a name="l01179"></a><span class="lineno"> 1179</span>       std::ostringstream s;</div>
+<div class="line"><a name="l01180"></a><span class="lineno"> 1180</span>       s<<<span class="stringliteral">"Error: i must be smaller than x.size()"</span>;</div>
+<div class="line"><a name="l01181"></a><span class="lineno"> 1181</span>       <span class="keywordflow">throw</span>(s.str());</div>
+<div class="line"><a name="l01182"></a><span class="lineno"> 1182</span>     }</div>
+<div class="line"><a name="l01183"></a><span class="lineno"> 1183</span>     <span class="keywordflow">if</span>(j<0){</div>
+<div class="line"><a name="l01184"></a><span class="lineno"> 1184</span>       std::ostringstream s;</div>
+<div class="line"><a name="l01185"></a><span class="lineno"> 1185</span>       s<<<span class="stringliteral">"Error: j must be positive"</span>;</div>
+<div class="line"><a name="l01186"></a><span class="lineno"> 1186</span>       <span class="keywordflow">throw</span>(s.str());</div>
+<div class="line"><a name="l01187"></a><span class="lineno"> 1187</span>     }</div>
+<div class="line"><a name="l01188"></a><span class="lineno"> 1188</span>     <span class="keywordflow">if</span>(j>=y.size()){</div>
+<div class="line"><a name="l01189"></a><span class="lineno"> 1189</span>       std::ostringstream s;</div>
+<div class="line"><a name="l01190"></a><span class="lineno"> 1190</span>       s<<<span class="stringliteral">"Error: j must be smaller than y.size()"</span>;</div>
+<div class="line"><a name="l01191"></a><span class="lineno"> 1191</span>       <span class="keywordflow">throw</span>(s.str());</div>
+<div class="line"><a name="l01192"></a><span class="lineno"> 1192</span>     }</div>
+<div class="line"><a name="l01193"></a><span class="lineno"> 1193</span>         sXY += (x[i] - meanX) * (y[j] - meanY);</div>
+<div class="line"><a name="l01194"></a><span class="lineno"> 1194</span>       }</div>
+<div class="line"><a name="l01195"></a><span class="lineno"> 1195</span>     }</div>
+<div class="line"><a name="l01196"></a><span class="lineno"> 1196</span>     <span class="keywordflow">if</span>(isValid){</div>
+<div class="line"><a name="l01197"></a><span class="lineno"> 1197</span>       <span class="keywordtype">double</span> minSize=(x.size()<y.size())?x.size():y.size();</div>
+<div class="line"><a name="l01198"></a><span class="lineno"> 1198</span>       <span class="keywordflow">return</span>(sXY / denom / (minSize-1));</div>
+<div class="line"><a name="l01199"></a><span class="lineno"> 1199</span>     }</div>
+<div class="line"><a name="l01200"></a><span class="lineno"> 1200</span>     <span class="keywordflow">else</span> <span class="keywordflow">if</span>(m_noDataValues.size())</div>
+<div class="line"><a name="l01201"></a><span class="lineno"> 1201</span>       <span class="keywordflow">return</span> m_noDataValues[0];</div>
+<div class="line"><a name="l01202"></a><span class="lineno"> 1202</span>     <span class="keywordflow">else</span>{</div>
+<div class="line"><a name="l01203"></a><span class="lineno"> 1203</span>       std::string errorString=<span class="stringliteral">"Error: no valid data found"</span>;</div>
+<div class="line"><a name="l01204"></a><span class="lineno"> 1204</span>       <span class="keywordflow">throw</span>(errorString);</div>
+<div class="line"><a name="l01205"></a><span class="lineno"> 1205</span>     }</div>
+<div class="line"><a name="l01206"></a><span class="lineno"> 1206</span>   }</div>
+<div class="line"><a name="l01207"></a><span class="lineno"> 1207</span>   <span class="keywordflow">else</span></div>
+<div class="line"><a name="l01208"></a><span class="lineno"> 1208</span>     <span class="keywordflow">return</span> 0;</div>
+<div class="line"><a name="l01209"></a><span class="lineno"> 1209</span> }</div>
+<div class="line"><a name="l01210"></a><span class="lineno"> 1210</span> </div>
+<div class="line"><a name="l01211"></a><span class="lineno"> 1211</span> <span class="comment">//todo: what if no valid data?</span></div>
+<div class="line"><a name="l01212"></a><span class="lineno"> 1212</span> <span class="keyword">template</span><<span class="keyword">class</span> T> <span class="keywordtype">double</span> StatFactory::cross_correlation(<span class="keyword">const</span> std::vector<T>& x, <span class="keyword">const</span> std::vector<T>& y, <span class="keywordtype">int</span> maxdelay, std::vector<T>& z)<span class="keyword"> const</span>{</div>
+<div class="line"><a name="l01213"></a><span class="lineno"> 1213</span>   z.clear();</div>
+<div class="line"><a name="l01214"></a><span class="lineno"> 1214</span>   <span class="keywordtype">double</span> sumCorrelation=0;</div>
+<div class="line"><a name="l01215"></a><span class="lineno"> 1215</span>   <span class="keywordflow">for</span> (<span class="keywordtype">int</span> delay=-maxdelay;delay<maxdelay;delay++) {</div>
+<div class="line"><a name="l01216"></a><span class="lineno"> 1216</span>     z.push_back(correlation(x,y,delay));</div>
+<div class="line"><a name="l01217"></a><span class="lineno"> 1217</span>     sumCorrelation+=z.back();</div>
+<div class="line"><a name="l01218"></a><span class="lineno"> 1218</span>   }</div>
+<div class="line"><a name="l01219"></a><span class="lineno"> 1219</span>   <span class="keywordflow">return</span> sumCorrelation;</div>
+<div class="line"><a name="l01220"></a><span class="lineno"> 1220</span> }</div>
+<div class="line"><a name="l01221"></a><span class="lineno"> 1221</span> </div>
+<div class="line"><a name="l01222"></a><span class="lineno"> 1222</span> <span class="comment">//todo: nodata?</span></div>
+<div class="line"><a name="l01223"></a><span class="lineno"> 1223</span> <span class="keyword">template</span><<span class="keyword">class</span> T> <span class="keywordtype">double</span> StatFactory::linear_regression(<span class="keyword">const</span> std::vector<T>& x, <span class="keyword">const</span> std::vector<T>& y, <span class="keywordtype">double</span> &c0, <span class="keywordtype">double</span> &c1)<span class="keyword"> const</span>{</div>
+<div class="line"><a name="l01224"></a><span class="lineno"> 1224</span>   <span class="keywordflow">if</span>(x.size()!=y.size()){</div>
+<div class="line"><a name="l01225"></a><span class="lineno"> 1225</span>     std::ostringstream s;</div>
+<div class="line"><a name="l01226"></a><span class="lineno"> 1226</span>     s<<<span class="stringliteral">"Error: x and y not equal in size"</span>;</div>
+<div class="line"><a name="l01227"></a><span class="lineno"> 1227</span>     <span class="keywordflow">throw</span>(s.str());</div>
+<div class="line"><a name="l01228"></a><span class="lineno"> 1228</span>   }</div>
+<div class="line"><a name="l01229"></a><span class="lineno"> 1229</span>   <span class="keywordflow">if</span>(x.empty()){</div>
+<div class="line"><a name="l01230"></a><span class="lineno"> 1230</span>     std::ostringstream s;</div>
+<div class="line"><a name="l01231"></a><span class="lineno"> 1231</span>     s<<<span class="stringliteral">"Error: x is empty"</span>;</div>
+<div class="line"><a name="l01232"></a><span class="lineno"> 1232</span>     <span class="keywordflow">throw</span>(s.str());</div>
+<div class="line"><a name="l01233"></a><span class="lineno"> 1233</span>   }</div>
+<div class="line"><a name="l01234"></a><span class="lineno"> 1234</span>   <span class="keywordtype">double</span> cov00;</div>
+<div class="line"><a name="l01235"></a><span class="lineno"> 1235</span>   <span class="keywordtype">double</span> cov01;</div>
+<div class="line"><a name="l01236"></a><span class="lineno"> 1236</span>   <span class="keywordtype">double</span>  cov11;</div>
+<div class="line"><a name="l01237"></a><span class="lineno"> 1237</span>   <span class="keywordtype">double</span> sumsq;</div>
+<div class="line"><a name="l01238"></a><span class="lineno"> 1238</span>   gsl_fit_linear(&(x[0]),1,&(y[0]),1,x.size(),&c0,&c1,&cov00,&cov01,&cov11,&sumsq);</div>
+<div class="line"><a name="l01239"></a><span class="lineno"> 1239</span>   <span class="keywordflow">return</span> (1-sumsq/var(y)/(y.size()-1));</div>
+<div class="line"><a name="l01240"></a><span class="lineno"> 1240</span> }</div>
+<div class="line"><a name="l01241"></a><span class="lineno"> 1241</span> </div>
+<div class="line"><a name="l01242"></a><span class="lineno"> 1242</span> <span class="comment">//todo: nodata?</span></div>
+<div class="line"><a name="l01243"></a><span class="lineno"> 1243</span> <span class="keyword">template</span><<span class="keyword">class</span> T> <span class="keywordtype">double</span> StatFactory::linear_regression_err(<span class="keyword">const</span> std::vector<T>& x, <span class="keyword">const</span> std::vector<T>& y, <span class="keywordtype">double</span> &c0, <span class="keywordtype">double</span> &c1)<span class="keyword"> const</sp [...]
+<div class="line"><a name="l01244"></a><span class="lineno"> 1244</span>   <span class="keywordflow">if</span>(x.size()!=y.size()){</div>
+<div class="line"><a name="l01245"></a><span class="lineno"> 1245</span>     std::ostringstream s;</div>
+<div class="line"><a name="l01246"></a><span class="lineno"> 1246</span>     s<<<span class="stringliteral">"Error: x and y not equal in size"</span>;</div>
+<div class="line"><a name="l01247"></a><span class="lineno"> 1247</span>     <span class="keywordflow">throw</span>(s.str());</div>
+<div class="line"><a name="l01248"></a><span class="lineno"> 1248</span>   }</div>
+<div class="line"><a name="l01249"></a><span class="lineno"> 1249</span>   <span class="keywordflow">if</span>(x.empty()){</div>
+<div class="line"><a name="l01250"></a><span class="lineno"> 1250</span>     std::ostringstream s;</div>
+<div class="line"><a name="l01251"></a><span class="lineno"> 1251</span>     s<<<span class="stringliteral">"Error: x is empty"</span>;</div>
+<div class="line"><a name="l01252"></a><span class="lineno"> 1252</span>     <span class="keywordflow">throw</span>(s.str());</div>
+<div class="line"><a name="l01253"></a><span class="lineno"> 1253</span>   }</div>
+<div class="line"><a name="l01254"></a><span class="lineno"> 1254</span>   <span class="keywordtype">double</span> cov00;</div>
+<div class="line"><a name="l01255"></a><span class="lineno"> 1255</span>   <span class="keywordtype">double</span> cov01;</div>
+<div class="line"><a name="l01256"></a><span class="lineno"> 1256</span>   <span class="keywordtype">double</span>  cov11;</div>
+<div class="line"><a name="l01257"></a><span class="lineno"> 1257</span>   <span class="keywordtype">double</span> sumsq;</div>
+<div class="line"><a name="l01258"></a><span class="lineno"> 1258</span>   gsl_fit_linear(&(x[0]),1,&(y[0]),1,x.size(),&c0,&c1,&cov00,&cov01,&cov11,&sumsq);</div>
+<div class="line"><a name="l01259"></a><span class="lineno"> 1259</span>   <span class="keywordflow">return</span> sqrt((sumsq)/(y.size()));</div>
+<div class="line"><a name="l01260"></a><span class="lineno"> 1260</span> }</div>
+<div class="line"><a name="l01261"></a><span class="lineno"> 1261</span> </div>
+<div class="line"><a name="l01262"></a><span class="lineno"> 1262</span> <span class="comment">//alternatively: use GNU scientific library:</span></div>
+<div class="line"><a name="l01263"></a><span class="lineno"> 1263</span> <span class="comment">// gsl_stats_correlation (const double data1[], const size_t stride1, const double data2[], const size_t stride2, const size_t n)</span></div>
+<div class="line"><a name="l01264"></a><span class="lineno"> 1264</span> </div>
+<div class="line"><a name="l01265"></a><span class="lineno"> 1265</span> <span class="keyword">template</span><<span class="keyword">class</span> T> <span class="keywordtype">void</span> StatFactory::interpolateNoData(<span class="keyword">const</span> std::vector<double>& wavelengthIn, <span class="keyword">const</span> std::vector<T>& input, <span class="keyword">const</span> std::string& type, std::vector<T>& output, <span class="keywordtyp [...]
+<div class="line"><a name="l01266"></a><span class="lineno"> 1266</span>   <span class="keywordflow">if</span>(wavelengthIn.empty()){</div>
+<div class="line"><a name="l01267"></a><span class="lineno"> 1267</span>     std::ostringstream s;</div>
+<div class="line"><a name="l01268"></a><span class="lineno"> 1268</span>     s<<<span class="stringliteral">"Error: wavelengthIn is empty"</span>;</div>
+<div class="line"><a name="l01269"></a><span class="lineno"> 1269</span>     <span class="keywordflow">throw</span>(s.str());</div>
 <div class="line"><a name="l01270"></a><span class="lineno"> 1270</span>   }</div>
-<div class="line"><a name="l01271"></a><span class="lineno"> 1271</span>   <span class="keywordflow">for</span>(<span class="keywordtype">int</span> index=0;index<wavelengthOut.size();++index){</div>
-<div class="line"><a name="l01272"></a><span class="lineno"> 1272</span>     <span class="keywordflow">if</span>(wavelengthOut[index]<*wavelengthIn.begin()){</div>
-<div class="line"><a name="l01273"></a><span class="lineno"> 1273</span>       output.push_back(*(input.begin()));</div>
-<div class="line"><a name="l01274"></a><span class="lineno"> 1274</span>       <span class="keywordflow">continue</span>;</div>
-<div class="line"><a name="l01275"></a><span class="lineno"> 1275</span>     }</div>
-<div class="line"><a name="l01276"></a><span class="lineno"> 1276</span>     <span class="keywordflow">else</span> <span class="keywordflow">if</span>(wavelengthOut[index]>wavelengthIn.back()){</div>
-<div class="line"><a name="l01277"></a><span class="lineno"> 1277</span>       output.push_back(input.back());</div>
-<div class="line"><a name="l01278"></a><span class="lineno"> 1278</span>       <span class="keywordflow">continue</span>;</div>
-<div class="line"><a name="l01279"></a><span class="lineno"> 1279</span>     }</div>
-<div class="line"><a name="l01280"></a><span class="lineno"> 1280</span>     <span class="keywordtype">double</span> dout=evalSpline(spline,wavelengthOut[index],acc);</div>
-<div class="line"><a name="l01281"></a><span class="lineno"> 1281</span>     output.push_back(dout);</div>
-<div class="line"><a name="l01282"></a><span class="lineno"> 1282</span>   }</div>
-<div class="line"><a name="l01283"></a><span class="lineno"> 1283</span>   gsl_spline_free(spline);</div>
-<div class="line"><a name="l01284"></a><span class="lineno"> 1284</span>   gsl_interp_accel_free(acc);</div>
-<div class="line"><a name="l01285"></a><span class="lineno"> 1285</span> }</div>
-<div class="line"><a name="l01286"></a><span class="lineno"> 1286</span> </div>
-<div class="line"><a name="l01287"></a><span class="lineno"> 1287</span> <span class="comment">// template<class T> void StatFactory::interpolateUp(const std::vector<double>& wavelengthIn, const std::vector< std::vector<T> >& input, const std::vector<double>& wavelengthOut, const std::string& type, std::vector< std::vector<T> >& output, bool verbose){</span></div>
-<div class="line"><a name="l01288"></a><span class="lineno"> 1288</span> <span class="comment">//   assert(wavelengthIn.size());</span></div>
-<div class="line"><a name="l01289"></a><span class="lineno"> 1289</span> <span class="comment">//   assert(wavelengthOut.size());</span></div>
-<div class="line"><a name="l01290"></a><span class="lineno"> 1290</span> <span class="comment">//   int nsample=input.size();  </span></div>
-<div class="line"><a name="l01291"></a><span class="lineno"> 1291</span> <span class="comment">//   int nband=wavelengthIn.size();</span></div>
-<div class="line"><a name="l01292"></a><span class="lineno"> 1292</span> <span class="comment">//   output.clear();</span></div>
-<div class="line"><a name="l01293"></a><span class="lineno"> 1293</span> <span class="comment">//   output.resize(nsample);</span></div>
-<div class="line"><a name="l01294"></a><span class="lineno"> 1294</span> <span class="comment">//   gsl_interp_accel *acc;</span></div>
-<div class="line"><a name="l01295"></a><span class="lineno"> 1295</span> <span class="comment">//   allocAcc(acc);</span></div>
-<div class="line"><a name="l01296"></a><span class="lineno"> 1296</span> <span class="comment">//   gsl_spline *spline;</span></div>
-<div class="line"><a name="l01297"></a><span class="lineno"> 1297</span> <span class="comment">//   getSpline(type,nband,spline);</span></div>
-<div class="line"><a name="l01298"></a><span class="lineno"> 1298</span> <span class="comment">//   for(int isample=0;isample<nsample;++isample){</span></div>
-<div class="line"><a name="l01299"></a><span class="lineno"> 1299</span> <span class="comment">//     assert(input[isample].size()==wavelengthIn.size());</span></div>
-<div class="line"><a name="l01300"></a><span class="lineno"> 1300</span> <span class="comment">//     initSpline(spline,&(wavelengthIn[0]),&(input[isample][0]),nband);      </span></div>
-<div class="line"><a name="l01301"></a><span class="lineno"> 1301</span> <span class="comment">//     for(int index=0;index<wavelengthOut.size();++index){</span></div>
-<div class="line"><a name="l01302"></a><span class="lineno"> 1302</span> <span class="comment">//       if(type=="linear"){</span></div>
-<div class="line"><a name="l01303"></a><span class="lineno"> 1303</span> <span class="comment">//         if(wavelengthOut[index]<wavelengthIn.back())</span></div>
-<div class="line"><a name="l01304"></a><span class="lineno"> 1304</span> <span class="comment">//           output[isample].push_back(*(input.begin()));</span></div>
-<div class="line"><a name="l01305"></a><span class="lineno"> 1305</span> <span class="comment">//         else if(wavelengthOut[index]>wavelengthIn.back())</span></div>
-<div class="line"><a name="l01306"></a><span class="lineno"> 1306</span> <span class="comment">//           output[isample].push_back(input.back());</span></div>
-<div class="line"><a name="l01307"></a><span class="lineno"> 1307</span> <span class="comment">//       }</span></div>
-<div class="line"><a name="l01308"></a><span class="lineno"> 1308</span> <span class="comment">//       else{</span></div>
-<div class="line"><a name="l01309"></a><span class="lineno"> 1309</span> <span class="comment">//         double dout=evalSpline(spline,wavelengthOut[index],acc);</span></div>
-<div class="line"><a name="l01310"></a><span class="lineno"> 1310</span> <span class="comment">//         output[isample].push_back(dout);</span></div>
-<div class="line"><a name="l01311"></a><span class="lineno"> 1311</span> <span class="comment">//       }</span></div>
-<div class="line"><a name="l01312"></a><span class="lineno"> 1312</span> <span class="comment">//     }</span></div>
-<div class="line"><a name="l01313"></a><span class="lineno"> 1313</span> <span class="comment">//   }</span></div>
-<div class="line"><a name="l01314"></a><span class="lineno"> 1314</span> <span class="comment">//   gsl_spline_free(spline);</span></div>
-<div class="line"><a name="l01315"></a><span class="lineno"> 1315</span> <span class="comment">//   gsl_interp_accel_free(acc);</span></div>
-<div class="line"><a name="l01316"></a><span class="lineno"> 1316</span> <span class="comment">// }</span></div>
-<div class="line"><a name="l01317"></a><span class="lineno"> 1317</span> </div>
-<div class="line"><a name="l01318"></a><span class="lineno"> 1318</span> <span class="comment">//todo: nodata?</span></div>
-<div class="line"><a name="l01319"></a><span class="lineno"> 1319</span> <span class="keyword">template</span><<span class="keyword">class</span> T> <span class="keywordtype">void</span> StatFactory::interpolateUp(<span class="keyword">const</span> std::vector<T>& input, std::vector<T>& output, <span class="keywordtype">int</span> nbin)<span class="keyword"> const</span></div>
-<div class="line"><a name="l01320"></a><span class="lineno"> 1320</span> <span class="keyword"></span>{</div>
-<div class="line"><a name="l01321"></a><span class="lineno"> 1321</span>   <span class="keywordflow">if</span>(input.empty()){</div>
-<div class="line"><a name="l01322"></a><span class="lineno"> 1322</span>     std::ostringstream s;</div>
-<div class="line"><a name="l01323"></a><span class="lineno"> 1323</span>     s<<<span class="stringliteral">"Error: input is empty"</span>;</div>
-<div class="line"><a name="l01324"></a><span class="lineno"> 1324</span>     <span class="keywordflow">throw</span>(s.str());</div>
-<div class="line"><a name="l01325"></a><span class="lineno"> 1325</span>   }</div>
-<div class="line"><a name="l01326"></a><span class="lineno"> 1326</span>   <span class="keywordflow">if</span>(!nbin){</div>
-<div class="line"><a name="l01327"></a><span class="lineno"> 1327</span>     std::ostringstream s;</div>
-<div class="line"><a name="l01328"></a><span class="lineno"> 1328</span>     s<<<span class="stringliteral">"Error: nbin must be larger than 0"</span>;</div>
-<div class="line"><a name="l01329"></a><span class="lineno"> 1329</span>     <span class="keywordflow">throw</span>(s.str());</div>
-<div class="line"><a name="l01330"></a><span class="lineno"> 1330</span>   }</div>
-<div class="line"><a name="l01331"></a><span class="lineno"> 1331</span>   output.clear();</div>
-<div class="line"><a name="l01332"></a><span class="lineno"> 1332</span>   <span class="keywordtype">int</span> dim=input.size();</div>
-<div class="line"><a name="l01333"></a><span class="lineno"> 1333</span>   <span class="keywordflow">for</span>(<span class="keywordtype">int</span> i=0;i<dim;++i){</div>
-<div class="line"><a name="l01334"></a><span class="lineno"> 1334</span>     <span class="keywordtype">double</span> deltaX=0;</div>
-<div class="line"><a name="l01335"></a><span class="lineno"> 1335</span>     <span class="keywordtype">double</span> left=input[i];</div>
-<div class="line"><a name="l01336"></a><span class="lineno"> 1336</span>     <span class="keywordflow">if</span>(i<dim-1){</div>
-<div class="line"><a name="l01337"></a><span class="lineno"> 1337</span>       <span class="keywordtype">double</span> right=(i<dim-1)? input[i+1]:input[i];</div>
-<div class="line"><a name="l01338"></a><span class="lineno"> 1338</span>       deltaX=(right-left)/static_cast<double>(nbin);</div>
-<div class="line"><a name="l01339"></a><span class="lineno"> 1339</span>       <span class="keywordflow">for</span>(<span class="keywordtype">int</span> x=0;x<nbin;++x){</div>
-<div class="line"><a name="l01340"></a><span class="lineno"> 1340</span>         output.push_back(left+x*deltaX);</div>
-<div class="line"><a name="l01341"></a><span class="lineno"> 1341</span>       }</div>
-<div class="line"><a name="l01342"></a><span class="lineno"> 1342</span>     }</div>
-<div class="line"><a name="l01343"></a><span class="lineno"> 1343</span>     <span class="keywordflow">else</span></div>
-<div class="line"><a name="l01344"></a><span class="lineno"> 1344</span>       output.push_back(input.back());</div>
-<div class="line"><a name="l01345"></a><span class="lineno"> 1345</span>   }</div>
-<div class="line"><a name="l01346"></a><span class="lineno"> 1346</span> }</div>
-<div class="line"><a name="l01347"></a><span class="lineno"> 1347</span> </div>
-<div class="line"><a name="l01348"></a><span class="lineno"> 1348</span> <span class="comment">//todo: nodata?</span></div>
-<div class="line"><a name="l01349"></a><span class="lineno"> 1349</span> <span class="keyword">template</span><<span class="keyword">class</span> T> <span class="keywordtype">void</span> StatFactory::nearUp(<span class="keyword">const</span> std::vector<T>& input, std::vector<T>& output)<span class="keyword"> const</span></div>
-<div class="line"><a name="l01350"></a><span class="lineno"> 1350</span> <span class="keyword"></span>{</div>
-<div class="line"><a name="l01351"></a><span class="lineno"> 1351</span>   <span class="keywordflow">if</span>(input.empty()){</div>
-<div class="line"><a name="l01352"></a><span class="lineno"> 1352</span>     std::ostringstream s;</div>
-<div class="line"><a name="l01353"></a><span class="lineno"> 1353</span>     s<<<span class="stringliteral">"Error: input is empty"</span>;</div>
-<div class="line"><a name="l01354"></a><span class="lineno"> 1354</span>     <span class="keywordflow">throw</span>(s.str());</div>
-<div class="line"><a name="l01355"></a><span class="lineno"> 1355</span>   }</div>
-<div class="line"><a name="l01356"></a><span class="lineno"> 1356</span>   <span class="keywordflow">if</span>(output.size()<input.size()){</div>
-<div class="line"><a name="l01357"></a><span class="lineno"> 1357</span>     std::ostringstream s;</div>
-<div class="line"><a name="l01358"></a><span class="lineno"> 1358</span>     s<<<span class="stringliteral">"Error: output size is smaller than input size"</span>;</div>
-<div class="line"><a name="l01359"></a><span class="lineno"> 1359</span>     <span class="keywordflow">throw</span>(s.str());</div>
-<div class="line"><a name="l01360"></a><span class="lineno"> 1360</span>   }</div>
-<div class="line"><a name="l01361"></a><span class="lineno"> 1361</span>   <span class="keywordtype">int</span> dimInput=input.size();</div>
-<div class="line"><a name="l01362"></a><span class="lineno"> 1362</span>   <span class="keywordtype">int</span> dimOutput=output.size();</div>
-<div class="line"><a name="l01363"></a><span class="lineno"> 1363</span>   </div>
-<div class="line"><a name="l01364"></a><span class="lineno"> 1364</span>   <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iin=0;iin<dimInput;++iin){</div>
-<div class="line"><a name="l01365"></a><span class="lineno"> 1365</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iout=0;iout<dimOutput/dimInput;++iout){</div>
-<div class="line"><a name="l01366"></a><span class="lineno"> 1366</span>       <span class="keywordtype">int</span> indexOutput=iin*dimOutput/dimInput+iout;</div>
-<div class="line"><a name="l01367"></a><span class="lineno"> 1367</span>       <span class="keywordflow">if</span>(indexOutput>=output.size()){</div>
-<div class="line"><a name="l01368"></a><span class="lineno"> 1368</span>     std::ostringstream s;</div>
-<div class="line"><a name="l01369"></a><span class="lineno"> 1369</span>     s<<<span class="stringliteral">"Error: indexOutput must be smaller than output.size()"</span>;</div>
-<div class="line"><a name="l01370"></a><span class="lineno"> 1370</span>     <span class="keywordflow">throw</span>(s.str());</div>
-<div class="line"><a name="l01371"></a><span class="lineno"> 1371</span>       }</div>
-<div class="line"><a name="l01372"></a><span class="lineno"> 1372</span>       output[indexOutput]=input[iin];</div>
-<div class="line"><a name="l01373"></a><span class="lineno"> 1373</span>     }</div>
-<div class="line"><a name="l01374"></a><span class="lineno"> 1374</span>   }</div>
-<div class="line"><a name="l01375"></a><span class="lineno"> 1375</span> }</div>
-<div class="line"><a name="l01376"></a><span class="lineno"> 1376</span> </div>
-<div class="line"><a name="l01377"></a><span class="lineno"> 1377</span> <span class="comment">//todo: nodata?</span></div>
-<div class="line"><a name="l01378"></a><span class="lineno"> 1378</span> <span class="keyword">template</span><<span class="keyword">class</span> T> <span class="keywordtype">void</span> StatFactory::interpolateUp(<span class="keywordtype">double</span>* input, <span class="keywordtype">int</span> dim, std::vector<T>& output, <span class="keywordtype">int</span> nbin)</div>
-<div class="line"><a name="l01379"></a><span class="lineno"> 1379</span> {</div>
-<div class="line"><a name="l01380"></a><span class="lineno"> 1380</span>   <span class="keywordflow">if</span>(!nbin){</div>
-<div class="line"><a name="l01381"></a><span class="lineno"> 1381</span>     std::ostringstream s;</div>
-<div class="line"><a name="l01382"></a><span class="lineno"> 1382</span>     s<<<span class="stringliteral">"Error: nbin must be larger than 0"</span>;</div>
-<div class="line"><a name="l01383"></a><span class="lineno"> 1383</span>     <span class="keywordflow">throw</span>(s.str());</div>
-<div class="line"><a name="l01384"></a><span class="lineno"> 1384</span>   }</div>
-<div class="line"><a name="l01385"></a><span class="lineno"> 1385</span>   output.clear();</div>
-<div class="line"><a name="l01386"></a><span class="lineno"> 1386</span>   <span class="keywordflow">for</span>(<span class="keywordtype">int</span> i=0;i<dim;++i){</div>
-<div class="line"><a name="l01387"></a><span class="lineno"> 1387</span>     <span class="keywordtype">double</span> deltaX=0;</div>
-<div class="line"><a name="l01388"></a><span class="lineno"> 1388</span>     <span class="keywordtype">double</span> left=input[i];</div>
-<div class="line"><a name="l01389"></a><span class="lineno"> 1389</span>     <span class="keywordflow">if</span>(i<dim-1){</div>
-<div class="line"><a name="l01390"></a><span class="lineno"> 1390</span>       <span class="keywordtype">double</span> right=(i<dim-1)? input[i+1]:input[i];</div>
-<div class="line"><a name="l01391"></a><span class="lineno"> 1391</span>       deltaX=(right-left)/static_cast<double>(nbin);</div>
-<div class="line"><a name="l01392"></a><span class="lineno"> 1392</span>       <span class="keywordflow">for</span>(<span class="keywordtype">int</span> x=0;x<nbin;++x){</div>
-<div class="line"><a name="l01393"></a><span class="lineno"> 1393</span>         output.push_back(left+x*deltaX);</div>
-<div class="line"><a name="l01394"></a><span class="lineno"> 1394</span>       }</div>
-<div class="line"><a name="l01395"></a><span class="lineno"> 1395</span>     }</div>
-<div class="line"><a name="l01396"></a><span class="lineno"> 1396</span>     <span class="keywordflow">else</span></div>
-<div class="line"><a name="l01397"></a><span class="lineno"> 1397</span>       output.push_back(input[dim-1]);</div>
+<div class="line"><a name="l01271"></a><span class="lineno"> 1271</span>   std::vector<double> wavelengthOut=wavelengthIn;</div>
+<div class="line"><a name="l01272"></a><span class="lineno"> 1272</span>   std::vector<T> validIn=input;</div>
+<div class="line"><a name="l01273"></a><span class="lineno"> 1273</span>   <span class="keywordflow">if</span>(input.size()!=wavelengthIn.size()){</div>
+<div class="line"><a name="l01274"></a><span class="lineno"> 1274</span>     std::ostringstream s;</div>
+<div class="line"><a name="l01275"></a><span class="lineno"> 1275</span>     s<<<span class="stringliteral">"Error: x and y not equal in size"</span>;</div>
+<div class="line"><a name="l01276"></a><span class="lineno"> 1276</span>     <span class="keywordflow">throw</span>(s.str());</div>
+<div class="line"><a name="l01277"></a><span class="lineno"> 1277</span>   }</div>
+<div class="line"><a name="l01278"></a><span class="lineno"> 1278</span>   <span class="keywordtype">int</span> nband=wavelengthIn.size();</div>
+<div class="line"><a name="l01279"></a><span class="lineno"> 1279</span>   output.clear();</div>
+<div class="line"><a name="l01280"></a><span class="lineno"> 1280</span>   <span class="comment">//remove nodata from input and corresponding wavelengthIn</span></div>
+<div class="line"><a name="l01281"></a><span class="lineno"> 1281</span>   <span class="keywordflow">if</span>(m_noDataValues.size()){</div>
+<div class="line"><a name="l01282"></a><span class="lineno"> 1282</span>     <span class="keyword">typename</span> std::vector<T>::iterator itValue=validIn.begin();</div>
+<div class="line"><a name="l01283"></a><span class="lineno"> 1283</span>     <span class="keyword">typename</span> std::vector<T>::iterator itWavelength=wavelengthOut.begin();</div>
+<div class="line"><a name="l01284"></a><span class="lineno"> 1284</span>     <span class="keywordflow">while</span>(itValue!=validIn.end()&&itWavelength!=wavelengthOut.end()){</div>
+<div class="line"><a name="l01285"></a><span class="lineno"> 1285</span>       <span class="keywordflow">if</span>(isNoData(*itValue)){</div>
+<div class="line"><a name="l01286"></a><span class="lineno"> 1286</span>     validIn.erase(itValue);</div>
+<div class="line"><a name="l01287"></a><span class="lineno"> 1287</span>     wavelengthOut.erase(itWavelength);</div>
+<div class="line"><a name="l01288"></a><span class="lineno"> 1288</span>       }</div>
+<div class="line"><a name="l01289"></a><span class="lineno"> 1289</span>       <span class="keywordflow">else</span>{</div>
+<div class="line"><a name="l01290"></a><span class="lineno"> 1290</span>     ++itValue;</div>
+<div class="line"><a name="l01291"></a><span class="lineno"> 1291</span>     ++itWavelength;</div>
+<div class="line"><a name="l01292"></a><span class="lineno"> 1292</span>       }</div>
+<div class="line"><a name="l01293"></a><span class="lineno"> 1293</span>     }</div>
+<div class="line"><a name="l01294"></a><span class="lineno"> 1294</span>     <span class="keywordflow">if</span>(validIn.size()>1){</div>
+<div class="line"><a name="l01295"></a><span class="lineno"> 1295</span>       <span class="keywordflow">try</span>{</div>
+<div class="line"><a name="l01296"></a><span class="lineno"> 1296</span>     interpolateUp(wavelengthOut, validIn, wavelengthIn, type, output, verbose);</div>
+<div class="line"><a name="l01297"></a><span class="lineno"> 1297</span>       }</div>
+<div class="line"><a name="l01298"></a><span class="lineno"> 1298</span>       <span class="keywordflow">catch</span>(...){</div>
+<div class="line"><a name="l01299"></a><span class="lineno"> 1299</span>     output=input;</div>
+<div class="line"><a name="l01300"></a><span class="lineno"> 1300</span>       }</div>
+<div class="line"><a name="l01301"></a><span class="lineno"> 1301</span>     }</div>
+<div class="line"><a name="l01302"></a><span class="lineno"> 1302</span>     <span class="keywordflow">else</span><span class="comment">//we can not interpolate if no valid data</span></div>
+<div class="line"><a name="l01303"></a><span class="lineno"> 1303</span>       output=input;</div>
+<div class="line"><a name="l01304"></a><span class="lineno"> 1304</span>   }</div>
+<div class="line"><a name="l01305"></a><span class="lineno"> 1305</span>   <span class="keywordflow">else</span><span class="comment">//no nodata values to interpolate</span></div>
+<div class="line"><a name="l01306"></a><span class="lineno"> 1306</span>     output=input;</div>
+<div class="line"><a name="l01307"></a><span class="lineno"> 1307</span> }</div>
+<div class="line"><a name="l01308"></a><span class="lineno"> 1308</span> </div>
+<div class="line"><a name="l01309"></a><span class="lineno"> 1309</span> <span class="keyword">template</span><<span class="keyword">class</span> T> <span class="keywordtype">void</span> StatFactory::interpolateUp(<span class="keyword">const</span> std::vector<double>& wavelengthIn, <span class="keyword">const</span> std::vector<T>& input, <span class="keyword">const</span> std::vector<double>& wavelengthOut, <span class="keyword">const</span> std [...]
+<div class="line"><a name="l01310"></a><span class="lineno"> 1310</span>   <span class="keywordflow">if</span>(wavelengthIn.empty()){</div>
+<div class="line"><a name="l01311"></a><span class="lineno"> 1311</span>     std::ostringstream s;</div>
+<div class="line"><a name="l01312"></a><span class="lineno"> 1312</span>     s<<<span class="stringliteral">"Error: wavelengthIn is empty"</span>;</div>
+<div class="line"><a name="l01313"></a><span class="lineno"> 1313</span>     <span class="keywordflow">throw</span>(s.str());</div>
+<div class="line"><a name="l01314"></a><span class="lineno"> 1314</span>   }</div>
+<div class="line"><a name="l01315"></a><span class="lineno"> 1315</span>   <span class="keywordflow">if</span>(input.size()!=wavelengthIn.size()){</div>
+<div class="line"><a name="l01316"></a><span class="lineno"> 1316</span>     std::ostringstream s;</div>
+<div class="line"><a name="l01317"></a><span class="lineno"> 1317</span>     s<<<span class="stringliteral">"Error: input and wavelengthIn not equal in size"</span>;</div>
+<div class="line"><a name="l01318"></a><span class="lineno"> 1318</span>     <span class="keywordflow">throw</span>(s.str());</div>
+<div class="line"><a name="l01319"></a><span class="lineno"> 1319</span>   }</div>
+<div class="line"><a name="l01320"></a><span class="lineno"> 1320</span>   <span class="keywordflow">if</span>(wavelengthOut.empty()){</div>
+<div class="line"><a name="l01321"></a><span class="lineno"> 1321</span>     std::ostringstream s;</div>
+<div class="line"><a name="l01322"></a><span class="lineno"> 1322</span>     s<<<span class="stringliteral">"Error: wavelengthOut is empty"</span>;</div>
+<div class="line"><a name="l01323"></a><span class="lineno"> 1323</span>     <span class="keywordflow">throw</span>(s.str());</div>
+<div class="line"><a name="l01324"></a><span class="lineno"> 1324</span>   }</div>
+<div class="line"><a name="l01325"></a><span class="lineno"> 1325</span>   <span class="keywordtype">int</span> nband=wavelengthIn.size();</div>
+<div class="line"><a name="l01326"></a><span class="lineno"> 1326</span>   output.clear();</div>
+<div class="line"><a name="l01327"></a><span class="lineno"> 1327</span>   gsl_interp_accel *acc;</div>
+<div class="line"><a name="l01328"></a><span class="lineno"> 1328</span>   allocAcc(acc);</div>
+<div class="line"><a name="l01329"></a><span class="lineno"> 1329</span>   gsl_spline *spline;</div>
+<div class="line"><a name="l01330"></a><span class="lineno"> 1330</span>   getSpline(type,nband,spline);</div>
+<div class="line"><a name="l01331"></a><span class="lineno"> 1331</span>   assert(spline);</div>
+<div class="line"><a name="l01332"></a><span class="lineno"> 1332</span>   assert(&(wavelengthIn[0]));</div>
+<div class="line"><a name="l01333"></a><span class="lineno"> 1333</span>   assert(&(input[0]));</div>
+<div class="line"><a name="l01334"></a><span class="lineno"> 1334</span>   <span class="keywordtype">int</span> status=initSpline(spline,&(wavelengthIn[0]),&(input[0]),nband);</div>
+<div class="line"><a name="l01335"></a><span class="lineno"> 1335</span>   <span class="keywordflow">if</span>(status){</div>
+<div class="line"><a name="l01336"></a><span class="lineno"> 1336</span>     std::string errorString=<span class="stringliteral">"Could not initialize spline"</span>;</div>
+<div class="line"><a name="l01337"></a><span class="lineno"> 1337</span>     <span class="keywordflow">throw</span>(errorString);</div>
+<div class="line"><a name="l01338"></a><span class="lineno"> 1338</span>   }</div>
+<div class="line"><a name="l01339"></a><span class="lineno"> 1339</span>   <span class="keywordflow">for</span>(<span class="keywordtype">int</span> index=0;index<wavelengthOut.size();++index){</div>
+<div class="line"><a name="l01340"></a><span class="lineno"> 1340</span>     <span class="keywordflow">if</span>(wavelengthOut[index]<*wavelengthIn.begin()){</div>
+<div class="line"><a name="l01341"></a><span class="lineno"> 1341</span>       output.push_back(*(input.begin()));</div>
+<div class="line"><a name="l01342"></a><span class="lineno"> 1342</span>       <span class="keywordflow">continue</span>;</div>
+<div class="line"><a name="l01343"></a><span class="lineno"> 1343</span>     }</div>
+<div class="line"><a name="l01344"></a><span class="lineno"> 1344</span>     <span class="keywordflow">else</span> <span class="keywordflow">if</span>(wavelengthOut[index]>wavelengthIn.back()){</div>
+<div class="line"><a name="l01345"></a><span class="lineno"> 1345</span>       output.push_back(input.back());</div>
+<div class="line"><a name="l01346"></a><span class="lineno"> 1346</span>       <span class="keywordflow">continue</span>;</div>
+<div class="line"><a name="l01347"></a><span class="lineno"> 1347</span>     }</div>
+<div class="line"><a name="l01348"></a><span class="lineno"> 1348</span>     <span class="keywordtype">double</span> dout=evalSpline(spline,wavelengthOut[index],acc);</div>
+<div class="line"><a name="l01349"></a><span class="lineno"> 1349</span>     output.push_back(dout);</div>
+<div class="line"><a name="l01350"></a><span class="lineno"> 1350</span>   }</div>
+<div class="line"><a name="l01351"></a><span class="lineno"> 1351</span>   gsl_spline_free(spline);</div>
+<div class="line"><a name="l01352"></a><span class="lineno"> 1352</span>   gsl_interp_accel_free(acc);</div>
+<div class="line"><a name="l01353"></a><span class="lineno"> 1353</span> }</div>
+<div class="line"><a name="l01354"></a><span class="lineno"> 1354</span> </div>
+<div class="line"><a name="l01355"></a><span class="lineno"> 1355</span> <span class="comment">// template<class T> void StatFactory::interpolateUp(const std::vector<double>& wavelengthIn, const std::vector< std::vector<T> >& input, const std::vector<double>& wavelengthOut, const std::string& type, std::vector< std::vector<T> >& output, bool verbose){</span></div>
+<div class="line"><a name="l01356"></a><span class="lineno"> 1356</span> <span class="comment">//   assert(wavelengthIn.size());</span></div>
+<div class="line"><a name="l01357"></a><span class="lineno"> 1357</span> <span class="comment">//   assert(wavelengthOut.size());</span></div>
+<div class="line"><a name="l01358"></a><span class="lineno"> 1358</span> <span class="comment">//   int nsample=input.size();  </span></div>
+<div class="line"><a name="l01359"></a><span class="lineno"> 1359</span> <span class="comment">//   int nband=wavelengthIn.size();</span></div>
+<div class="line"><a name="l01360"></a><span class="lineno"> 1360</span> <span class="comment">//   output.clear();</span></div>
+<div class="line"><a name="l01361"></a><span class="lineno"> 1361</span> <span class="comment">//   output.resize(nsample);</span></div>
+<div class="line"><a name="l01362"></a><span class="lineno"> 1362</span> <span class="comment">//   gsl_interp_accel *acc;</span></div>
+<div class="line"><a name="l01363"></a><span class="lineno"> 1363</span> <span class="comment">//   allocAcc(acc);</span></div>
+<div class="line"><a name="l01364"></a><span class="lineno"> 1364</span> <span class="comment">//   gsl_spline *spline;</span></div>
+<div class="line"><a name="l01365"></a><span class="lineno"> 1365</span> <span class="comment">//   getSpline(type,nband,spline);</span></div>
+<div class="line"><a name="l01366"></a><span class="lineno"> 1366</span> <span class="comment">//   for(int isample=0;isample<nsample;++isample){</span></div>
+<div class="line"><a name="l01367"></a><span class="lineno"> 1367</span> <span class="comment">//     assert(input[isample].size()==wavelengthIn.size());</span></div>
+<div class="line"><a name="l01368"></a><span class="lineno"> 1368</span> <span class="comment">//     initSpline(spline,&(wavelengthIn[0]),&(input[isample][0]),nband);      </span></div>
+<div class="line"><a name="l01369"></a><span class="lineno"> 1369</span> <span class="comment">//     for(int index=0;index<wavelengthOut.size();++index){</span></div>
+<div class="line"><a name="l01370"></a><span class="lineno"> 1370</span> <span class="comment">//       if(type=="linear"){</span></div>
+<div class="line"><a name="l01371"></a><span class="lineno"> 1371</span> <span class="comment">//         if(wavelengthOut[index]<wavelengthIn.back())</span></div>
+<div class="line"><a name="l01372"></a><span class="lineno"> 1372</span> <span class="comment">//           output[isample].push_back(*(input.begin()));</span></div>
+<div class="line"><a name="l01373"></a><span class="lineno"> 1373</span> <span class="comment">//         else if(wavelengthOut[index]>wavelengthIn.back())</span></div>
+<div class="line"><a name="l01374"></a><span class="lineno"> 1374</span> <span class="comment">//           output[isample].push_back(input.back());</span></div>
+<div class="line"><a name="l01375"></a><span class="lineno"> 1375</span> <span class="comment">//       }</span></div>
+<div class="line"><a name="l01376"></a><span class="lineno"> 1376</span> <span class="comment">//       else{</span></div>
+<div class="line"><a name="l01377"></a><span class="lineno"> 1377</span> <span class="comment">//         double dout=evalSpline(spline,wavelengthOut[index],acc);</span></div>
+<div class="line"><a name="l01378"></a><span class="lineno"> 1378</span> <span class="comment">//         output[isample].push_back(dout);</span></div>
+<div class="line"><a name="l01379"></a><span class="lineno"> 1379</span> <span class="comment">//       }</span></div>
+<div class="line"><a name="l01380"></a><span class="lineno"> 1380</span> <span class="comment">//     }</span></div>
+<div class="line"><a name="l01381"></a><span class="lineno"> 1381</span> <span class="comment">//   }</span></div>
+<div class="line"><a name="l01382"></a><span class="lineno"> 1382</span> <span class="comment">//   gsl_spline_free(spline);</span></div>
+<div class="line"><a name="l01383"></a><span class="lineno"> 1383</span> <span class="comment">//   gsl_interp_accel_free(acc);</span></div>
+<div class="line"><a name="l01384"></a><span class="lineno"> 1384</span> <span class="comment">// }</span></div>
+<div class="line"><a name="l01385"></a><span class="lineno"> 1385</span> </div>
+<div class="line"><a name="l01386"></a><span class="lineno"> 1386</span> <span class="comment">//todo: nodata?</span></div>
+<div class="line"><a name="l01387"></a><span class="lineno"> 1387</span> <span class="keyword">template</span><<span class="keyword">class</span> T> <span class="keywordtype">void</span> StatFactory::interpolateUp(<span class="keyword">const</span> std::vector<T>& input, std::vector<T>& output, <span class="keywordtype">int</span> nbin)<span class="keyword"> const</span></div>
+<div class="line"><a name="l01388"></a><span class="lineno"> 1388</span> <span class="keyword"></span>{</div>
+<div class="line"><a name="l01389"></a><span class="lineno"> 1389</span>   <span class="keywordflow">if</span>(input.empty()){</div>
+<div class="line"><a name="l01390"></a><span class="lineno"> 1390</span>     std::ostringstream s;</div>
+<div class="line"><a name="l01391"></a><span class="lineno"> 1391</span>     s<<<span class="stringliteral">"Error: input is empty"</span>;</div>
+<div class="line"><a name="l01392"></a><span class="lineno"> 1392</span>     <span class="keywordflow">throw</span>(s.str());</div>
+<div class="line"><a name="l01393"></a><span class="lineno"> 1393</span>   }</div>
+<div class="line"><a name="l01394"></a><span class="lineno"> 1394</span>   <span class="keywordflow">if</span>(!nbin){</div>
+<div class="line"><a name="l01395"></a><span class="lineno"> 1395</span>     std::ostringstream s;</div>
+<div class="line"><a name="l01396"></a><span class="lineno"> 1396</span>     s<<<span class="stringliteral">"Error: nbin must be larger than 0"</span>;</div>
+<div class="line"><a name="l01397"></a><span class="lineno"> 1397</span>     <span class="keywordflow">throw</span>(s.str());</div>
 <div class="line"><a name="l01398"></a><span class="lineno"> 1398</span>   }</div>
-<div class="line"><a name="l01399"></a><span class="lineno"> 1399</span> }</div>
-<div class="line"><a name="l01400"></a><span class="lineno"> 1400</span> </div>
-<div class="line"><a name="l01401"></a><span class="lineno"> 1401</span> <span class="comment">//todo: nodata?</span></div>
-<div class="line"><a name="l01402"></a><span class="lineno"> 1402</span> <span class="keyword">template</span><<span class="keyword">class</span> T> <span class="keywordtype">void</span> StatFactory::interpolateDown(<span class="keyword">const</span> std::vector<T>& input, std::vector<T>& output, <span class="keywordtype">int</span> nbin)<span class="keyword"> const</span></div>
-<div class="line"><a name="l01403"></a><span class="lineno"> 1403</span> <span class="keyword"></span>{</div>
-<div class="line"><a name="l01404"></a><span class="lineno"> 1404</span>   <span class="keywordflow">if</span>(input.empty()){</div>
-<div class="line"><a name="l01405"></a><span class="lineno"> 1405</span>     std::ostringstream s;</div>
-<div class="line"><a name="l01406"></a><span class="lineno"> 1406</span>     s<<<span class="stringliteral">"Error: input is empty"</span>;</div>
-<div class="line"><a name="l01407"></a><span class="lineno"> 1407</span>     <span class="keywordflow">throw</span>(s.str());</div>
-<div class="line"><a name="l01408"></a><span class="lineno"> 1408</span>   }</div>
-<div class="line"><a name="l01409"></a><span class="lineno"> 1409</span>   <span class="keywordflow">if</span>(!nbin){</div>
-<div class="line"><a name="l01410"></a><span class="lineno"> 1410</span>     std::ostringstream s;</div>
-<div class="line"><a name="l01411"></a><span class="lineno"> 1411</span>     s<<<span class="stringliteral">"Error: nbin must be larger than 0"</span>;</div>
-<div class="line"><a name="l01412"></a><span class="lineno"> 1412</span>     <span class="keywordflow">throw</span>(s.str());</div>
+<div class="line"><a name="l01399"></a><span class="lineno"> 1399</span>   output.clear();</div>
+<div class="line"><a name="l01400"></a><span class="lineno"> 1400</span>   <span class="keywordtype">int</span> dim=input.size();</div>
+<div class="line"><a name="l01401"></a><span class="lineno"> 1401</span>   <span class="keywordflow">for</span>(<span class="keywordtype">int</span> i=0;i<dim;++i){</div>
+<div class="line"><a name="l01402"></a><span class="lineno"> 1402</span>     <span class="keywordtype">double</span> deltaX=0;</div>
+<div class="line"><a name="l01403"></a><span class="lineno"> 1403</span>     <span class="keywordtype">double</span> left=input[i];</div>
+<div class="line"><a name="l01404"></a><span class="lineno"> 1404</span>     <span class="keywordflow">if</span>(i<dim-1){</div>
+<div class="line"><a name="l01405"></a><span class="lineno"> 1405</span>       <span class="keywordtype">double</span> right=(i<dim-1)? input[i+1]:input[i];</div>
+<div class="line"><a name="l01406"></a><span class="lineno"> 1406</span>       deltaX=(right-left)/static_cast<double>(nbin);</div>
+<div class="line"><a name="l01407"></a><span class="lineno"> 1407</span>       <span class="keywordflow">for</span>(<span class="keywordtype">int</span> x=0;x<nbin;++x){</div>
+<div class="line"><a name="l01408"></a><span class="lineno"> 1408</span>         output.push_back(left+x*deltaX);</div>
+<div class="line"><a name="l01409"></a><span class="lineno"> 1409</span>       }</div>
+<div class="line"><a name="l01410"></a><span class="lineno"> 1410</span>     }</div>
+<div class="line"><a name="l01411"></a><span class="lineno"> 1411</span>     <span class="keywordflow">else</span></div>
+<div class="line"><a name="l01412"></a><span class="lineno"> 1412</span>       output.push_back(input.back());</div>
 <div class="line"><a name="l01413"></a><span class="lineno"> 1413</span>   }</div>
-<div class="line"><a name="l01414"></a><span class="lineno"> 1414</span>   output.clear();</div>
-<div class="line"><a name="l01415"></a><span class="lineno"> 1415</span>   <span class="keywordtype">int</span> dim=input.size();</div>
-<div class="line"><a name="l01416"></a><span class="lineno"> 1416</span>   <span class="keywordtype">int</span> x=0;</div>
-<div class="line"><a name="l01417"></a><span class="lineno"> 1417</span>   output.push_back(input[0]);</div>
-<div class="line"><a name="l01418"></a><span class="lineno"> 1418</span>   <span class="keywordflow">for</span>(<span class="keywordtype">int</span> i=1;i<dim;++i){</div>
-<div class="line"><a name="l01419"></a><span class="lineno"> 1419</span>     <span class="keywordflow">if</span>(i%nbin)</div>
-<div class="line"><a name="l01420"></a><span class="lineno"> 1420</span>       <span class="keywordflow">continue</span>;</div>
-<div class="line"><a name="l01421"></a><span class="lineno"> 1421</span>     <span class="keywordflow">else</span>{</div>
-<div class="line"><a name="l01422"></a><span class="lineno"> 1422</span>       x=(i-1)/nbin+1;</div>
-<div class="line"><a name="l01423"></a><span class="lineno"> 1423</span>       output.push_back(input[i]);</div>
-<div class="line"><a name="l01424"></a><span class="lineno"> 1424</span>     }</div>
-<div class="line"><a name="l01425"></a><span class="lineno"> 1425</span>   }</div>
-<div class="line"><a name="l01426"></a><span class="lineno"> 1426</span> }</div>
-<div class="line"><a name="l01427"></a><span class="lineno"> 1427</span> </div>
-<div class="line"><a name="l01428"></a><span class="lineno"> 1428</span> <span class="comment">//todo: nodata?</span></div>
-<div class="line"><a name="l01429"></a><span class="lineno"> 1429</span> <span class="keyword">template</span><<span class="keyword">class</span> T> <span class="keywordtype">void</span> StatFactory::interpolateDown(<span class="keywordtype">double</span>* input, <span class="keywordtype">int</span> dim, std::vector<T>& output, <span class="keywordtype">int</span> nbin)</div>
-<div class="line"><a name="l01430"></a><span class="lineno"> 1430</span> {</div>
-<div class="line"><a name="l01431"></a><span class="lineno"> 1431</span>   <span class="keywordflow">if</span>(!nbin){</div>
-<div class="line"><a name="l01432"></a><span class="lineno"> 1432</span>     std::ostringstream s;</div>
-<div class="line"><a name="l01433"></a><span class="lineno"> 1433</span>     s<<<span class="stringliteral">"Error: nbin must be larger than 0"</span>;</div>
-<div class="line"><a name="l01434"></a><span class="lineno"> 1434</span>     <span class="keywordflow">throw</span>(s.str());</div>
-<div class="line"><a name="l01435"></a><span class="lineno"> 1435</span>   }</div>
-<div class="line"><a name="l01436"></a><span class="lineno"> 1436</span>   output.clear();</div>
-<div class="line"><a name="l01437"></a><span class="lineno"> 1437</span>   <span class="keywordtype">int</span> x=0;</div>
-<div class="line"><a name="l01438"></a><span class="lineno"> 1438</span>   output.push_back(input[0]);</div>
-<div class="line"><a name="l01439"></a><span class="lineno"> 1439</span>   <span class="keywordflow">for</span>(<span class="keywordtype">int</span> i=1;i<dim;++i){</div>
-<div class="line"><a name="l01440"></a><span class="lineno"> 1440</span>     <span class="keywordflow">if</span>(i%nbin)</div>
-<div class="line"><a name="l01441"></a><span class="lineno"> 1441</span>       <span class="keywordflow">continue</span>;</div>
-<div class="line"><a name="l01442"></a><span class="lineno"> 1442</span>     <span class="keywordflow">else</span>{</div>
-<div class="line"><a name="l01443"></a><span class="lineno"> 1443</span>       x=(i-1)/nbin+1;</div>
-<div class="line"><a name="l01444"></a><span class="lineno"> 1444</span>       output.push_back(input[i]);</div>
-<div class="line"><a name="l01445"></a><span class="lineno"> 1445</span>     }</div>
-<div class="line"><a name="l01446"></a><span class="lineno"> 1446</span>   }</div>
-<div class="line"><a name="l01447"></a><span class="lineno"> 1447</span> }</div>
-<div class="line"><a name="l01448"></a><span class="lineno"> 1448</span> }</div>
-<div class="line"><a name="l01449"></a><span class="lineno"> 1449</span> </div>
-<div class="line"><a name="l01450"></a><span class="lineno"> 1450</span> <span class="preprocessor">#endif </span><span class="comment">/* _STATFACTORY_H_ */</span><span class="preprocessor"></span></div>
-<div class="line"><a name="l01451"></a><span class="lineno"> 1451</span> <span class="preprocessor"></span></div>
-<div class="line"><a name="l01452"></a><span class="lineno"> 1452</span> <span class="comment">// void Histogram::signature(double m1, double m2, double& k, double& alpha, double& beta, double e)</span></div>
-<div class="line"><a name="l01453"></a><span class="lineno"> 1453</span> <span class="comment">// {</span></div>
-<div class="line"><a name="l01454"></a><span class="lineno"> 1454</span> <span class="comment">//   double y=m1*m1/m2;</span></div>
-<div class="line"><a name="l01455"></a><span class="lineno"> 1455</span> <span class="comment">//   beta=F_1(y,0.1,10.0,e);</span></div>
-<div class="line"><a name="l01456"></a><span class="lineno"> 1456</span> <span class="comment">//   double fb=F(beta);</span></div>
-<div class="line"><a name="l01457"></a><span class="lineno"> 1457</span> <span class="comment">//   double g=exp(lgamma(1.0/beta));</span></div>
-<div class="line"><a name="l01458"></a><span class="lineno"> 1458</span> <span class="comment">//   alpha=m1*g/exp(lgamma(2.0/beta));</span></div>
-<div class="line"><a name="l01459"></a><span class="lineno"> 1459</span> <span class="comment">//   k=beta/(2*alpha*g);</span></div>
-<div class="line"><a name="l01460"></a><span class="lineno"> 1460</span> <span class="comment">// //   std::cout << "y, alpha, beta: " << y << ", " << alpha << ", " << beta << std::endl;</span></div>
-<div class="line"><a name="l01461"></a><span class="lineno"> 1461</span> <span class="comment">// }</span></div>
-<div class="line"><a name="l01462"></a><span class="lineno"> 1462</span> </div>
-<div class="line"><a name="l01463"></a><span class="lineno"> 1463</span> <span class="comment">// double Histogram::F(double x)</span></div>
-<div class="line"><a name="l01464"></a><span class="lineno"> 1464</span> <span class="comment">// {</span></div>
-<div class="line"><a name="l01465"></a><span class="lineno"> 1465</span> <span class="comment">//   double g2=exp(lgamma(2.0/x));</span></div>
-<div class="line"><a name="l01466"></a><span class="lineno"> 1466</span> <span class="comment">//   return(g2*g2/exp(lgamma(3.0/x))/exp(lgamma(1.0/x)));</span></div>
-<div class="line"><a name="l01467"></a><span class="lineno"> 1467</span> <span class="comment">// }</span></div>
+<div class="line"><a name="l01414"></a><span class="lineno"> 1414</span> }</div>
+<div class="line"><a name="l01415"></a><span class="lineno"> 1415</span> </div>
+<div class="line"><a name="l01416"></a><span class="lineno"> 1416</span> <span class="comment">//todo: nodata?</span></div>
+<div class="line"><a name="l01417"></a><span class="lineno"> 1417</span> <span class="keyword">template</span><<span class="keyword">class</span> T> <span class="keywordtype">void</span> StatFactory::nearUp(<span class="keyword">const</span> std::vector<T>& input, std::vector<T>& output)<span class="keyword"> const</span></div>
+<div class="line"><a name="l01418"></a><span class="lineno"> 1418</span> <span class="keyword"></span>{</div>
+<div class="line"><a name="l01419"></a><span class="lineno"> 1419</span>   <span class="keywordflow">if</span>(input.empty()){</div>
+<div class="line"><a name="l01420"></a><span class="lineno"> 1420</span>     std::ostringstream s;</div>
+<div class="line"><a name="l01421"></a><span class="lineno"> 1421</span>     s<<<span class="stringliteral">"Error: input is empty"</span>;</div>
+<div class="line"><a name="l01422"></a><span class="lineno"> 1422</span>     <span class="keywordflow">throw</span>(s.str());</div>
+<div class="line"><a name="l01423"></a><span class="lineno"> 1423</span>   }</div>
+<div class="line"><a name="l01424"></a><span class="lineno"> 1424</span>   <span class="keywordflow">if</span>(output.size()<input.size()){</div>
+<div class="line"><a name="l01425"></a><span class="lineno"> 1425</span>     std::ostringstream s;</div>
+<div class="line"><a name="l01426"></a><span class="lineno"> 1426</span>     s<<<span class="stringliteral">"Error: output size is smaller than input size"</span>;</div>
+<div class="line"><a name="l01427"></a><span class="lineno"> 1427</span>     <span class="keywordflow">throw</span>(s.str());</div>
+<div class="line"><a name="l01428"></a><span class="lineno"> 1428</span>   }</div>
+<div class="line"><a name="l01429"></a><span class="lineno"> 1429</span>   <span class="keywordtype">int</span> dimInput=input.size();</div>
+<div class="line"><a name="l01430"></a><span class="lineno"> 1430</span>   <span class="keywordtype">int</span> dimOutput=output.size();</div>
+<div class="line"><a name="l01431"></a><span class="lineno"> 1431</span>   </div>
+<div class="line"><a name="l01432"></a><span class="lineno"> 1432</span>   <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iin=0;iin<dimInput;++iin){</div>
+<div class="line"><a name="l01433"></a><span class="lineno"> 1433</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iout=0;iout<dimOutput/dimInput;++iout){</div>
+<div class="line"><a name="l01434"></a><span class="lineno"> 1434</span>       <span class="keywordtype">int</span> indexOutput=iin*dimOutput/dimInput+iout;</div>
+<div class="line"><a name="l01435"></a><span class="lineno"> 1435</span>       <span class="keywordflow">if</span>(indexOutput>=output.size()){</div>
+<div class="line"><a name="l01436"></a><span class="lineno"> 1436</span>     std::ostringstream s;</div>
+<div class="line"><a name="l01437"></a><span class="lineno"> 1437</span>     s<<<span class="stringliteral">"Error: indexOutput must be smaller than output.size()"</span>;</div>
+<div class="line"><a name="l01438"></a><span class="lineno"> 1438</span>     <span class="keywordflow">throw</span>(s.str());</div>
+<div class="line"><a name="l01439"></a><span class="lineno"> 1439</span>       }</div>
+<div class="line"><a name="l01440"></a><span class="lineno"> 1440</span>       output[indexOutput]=input[iin];</div>
+<div class="line"><a name="l01441"></a><span class="lineno"> 1441</span>     }</div>
+<div class="line"><a name="l01442"></a><span class="lineno"> 1442</span>   }</div>
+<div class="line"><a name="l01443"></a><span class="lineno"> 1443</span> }</div>
+<div class="line"><a name="l01444"></a><span class="lineno"> 1444</span> </div>
+<div class="line"><a name="l01445"></a><span class="lineno"> 1445</span> <span class="comment">//todo: nodata?</span></div>
+<div class="line"><a name="l01446"></a><span class="lineno"> 1446</span> <span class="keyword">template</span><<span class="keyword">class</span> T> <span class="keywordtype">void</span> StatFactory::interpolateUp(<span class="keywordtype">double</span>* input, <span class="keywordtype">int</span> dim, std::vector<T>& output, <span class="keywordtype">int</span> nbin)</div>
+<div class="line"><a name="l01447"></a><span class="lineno"> 1447</span> {</div>
+<div class="line"><a name="l01448"></a><span class="lineno"> 1448</span>   <span class="keywordflow">if</span>(!nbin){</div>
+<div class="line"><a name="l01449"></a><span class="lineno"> 1449</span>     std::ostringstream s;</div>
+<div class="line"><a name="l01450"></a><span class="lineno"> 1450</span>     s<<<span class="stringliteral">"Error: nbin must be larger than 0"</span>;</div>
+<div class="line"><a name="l01451"></a><span class="lineno"> 1451</span>     <span class="keywordflow">throw</span>(s.str());</div>
+<div class="line"><a name="l01452"></a><span class="lineno"> 1452</span>   }</div>
+<div class="line"><a name="l01453"></a><span class="lineno"> 1453</span>   output.clear();</div>
+<div class="line"><a name="l01454"></a><span class="lineno"> 1454</span>   <span class="keywordflow">for</span>(<span class="keywordtype">int</span> i=0;i<dim;++i){</div>
+<div class="line"><a name="l01455"></a><span class="lineno"> 1455</span>     <span class="keywordtype">double</span> deltaX=0;</div>
+<div class="line"><a name="l01456"></a><span class="lineno"> 1456</span>     <span class="keywordtype">double</span> left=input[i];</div>
+<div class="line"><a name="l01457"></a><span class="lineno"> 1457</span>     <span class="keywordflow">if</span>(i<dim-1){</div>
+<div class="line"><a name="l01458"></a><span class="lineno"> 1458</span>       <span class="keywordtype">double</span> right=(i<dim-1)? input[i+1]:input[i];</div>
+<div class="line"><a name="l01459"></a><span class="lineno"> 1459</span>       deltaX=(right-left)/static_cast<double>(nbin);</div>
+<div class="line"><a name="l01460"></a><span class="lineno"> 1460</span>       <span class="keywordflow">for</span>(<span class="keywordtype">int</span> x=0;x<nbin;++x){</div>
+<div class="line"><a name="l01461"></a><span class="lineno"> 1461</span>         output.push_back(left+x*deltaX);</div>
+<div class="line"><a name="l01462"></a><span class="lineno"> 1462</span>       }</div>
+<div class="line"><a name="l01463"></a><span class="lineno"> 1463</span>     }</div>
+<div class="line"><a name="l01464"></a><span class="lineno"> 1464</span>     <span class="keywordflow">else</span></div>
+<div class="line"><a name="l01465"></a><span class="lineno"> 1465</span>       output.push_back(input[dim-1]);</div>
+<div class="line"><a name="l01466"></a><span class="lineno"> 1466</span>   }</div>
+<div class="line"><a name="l01467"></a><span class="lineno"> 1467</span> }</div>
 <div class="line"><a name="l01468"></a><span class="lineno"> 1468</span> </div>
-<div class="line"><a name="l01469"></a><span class="lineno"> 1469</span> <span class="comment">// //x1 is under estimate, x2 is over estimate, e is error</span></div>
-<div class="line"><a name="l01470"></a><span class="lineno"> 1470</span> <span class="comment">// double Histogram::F_1(double y, double x1, double x2, double e)</span></div>
-<div class="line"><a name="l01471"></a><span class="lineno"> 1471</span> <span class="comment">// {</span></div>
-<div class="line"><a name="l01472"></a><span class="lineno"> 1472</span> <span class="comment">//   double f1=F(x1);</span></div>
-<div class="line"><a name="l01473"></a><span class="lineno"> 1473</span> <span class="comment">//   double f2=F(x2);</span></div>
-<div class="line"><a name="l01474"></a><span class="lineno"> 1474</span> <span class="comment">//   assert(f1!=f2);</span></div>
-<div class="line"><a name="l01475"></a><span class="lineno"> 1475</span> <span class="comment">//   double x=x1+(x2-x1)*(y-f1)/(f2-f1);</span></div>
-<div class="line"><a name="l01476"></a><span class="lineno"> 1476</span> <span class="comment">//   double f=F(x);</span></div>
-<div class="line"><a name="l01477"></a><span class="lineno"> 1477</span> <span class="comment">//   while(f-y>=e||y-f>=e){</span></div>
-<div class="line"><a name="l01478"></a><span class="lineno"> 1478</span> <span class="comment">//     if(f<y)</span></div>
-<div class="line"><a name="l01479"></a><span class="lineno"> 1479</span> <span class="comment">//       x1=x;</span></div>
-<div class="line"><a name="l01480"></a><span class="lineno"> 1480</span> <span class="comment">//     else </span></div>
-<div class="line"><a name="l01481"></a><span class="lineno"> 1481</span> <span class="comment">//       x2=x;</span></div>
-<div class="line"><a name="l01482"></a><span class="lineno"> 1482</span> <span class="comment">//     if(x1==x2)</span></div>
-<div class="line"><a name="l01483"></a><span class="lineno"> 1483</span> <span class="comment">//       return x1;</span></div>
-<div class="line"><a name="l01484"></a><span class="lineno"> 1484</span> <span class="comment">//     assert(f1!=f2);</span></div>
-<div class="line"><a name="l01485"></a><span class="lineno"> 1485</span> <span class="comment">//     x=x1+(x2-x1)*(y-f1)/(f2-f1);</span></div>
-<div class="line"><a name="l01486"></a><span class="lineno"> 1486</span> <span class="comment">//     f=F(x);</span></div>
-<div class="line"><a name="l01487"></a><span class="lineno"> 1487</span> <span class="comment">//   }</span></div>
-<div class="line"><a name="l01488"></a><span class="lineno"> 1488</span> <span class="comment">//   return x;</span></div>
-<div class="line"><a name="l01489"></a><span class="lineno"> 1489</span> <span class="comment">// }</span></div>
+<div class="line"><a name="l01469"></a><span class="lineno"> 1469</span> <span class="comment">//todo: nodata?</span></div>
+<div class="line"><a name="l01470"></a><span class="lineno"> 1470</span> <span class="keyword">template</span><<span class="keyword">class</span> T> <span class="keywordtype">void</span> StatFactory::interpolateDown(<span class="keyword">const</span> std::vector<T>& input, std::vector<T>& output, <span class="keywordtype">int</span> nbin)<span class="keyword"> const</span></div>
+<div class="line"><a name="l01471"></a><span class="lineno"> 1471</span> <span class="keyword"></span>{</div>
+<div class="line"><a name="l01472"></a><span class="lineno"> 1472</span>   <span class="keywordflow">if</span>(input.empty()){</div>
+<div class="line"><a name="l01473"></a><span class="lineno"> 1473</span>     std::ostringstream s;</div>
+<div class="line"><a name="l01474"></a><span class="lineno"> 1474</span>     s<<<span class="stringliteral">"Error: input is empty"</span>;</div>
+<div class="line"><a name="l01475"></a><span class="lineno"> 1475</span>     <span class="keywordflow">throw</span>(s.str());</div>
+<div class="line"><a name="l01476"></a><span class="lineno"> 1476</span>   }</div>
+<div class="line"><a name="l01477"></a><span class="lineno"> 1477</span>   <span class="keywordflow">if</span>(!nbin){</div>
+<div class="line"><a name="l01478"></a><span class="lineno"> 1478</span>     std::ostringstream s;</div>
+<div class="line"><a name="l01479"></a><span class="lineno"> 1479</span>     s<<<span class="stringliteral">"Error: nbin must be larger than 0"</span>;</div>
+<div class="line"><a name="l01480"></a><span class="lineno"> 1480</span>     <span class="keywordflow">throw</span>(s.str());</div>
+<div class="line"><a name="l01481"></a><span class="lineno"> 1481</span>   }</div>
+<div class="line"><a name="l01482"></a><span class="lineno"> 1482</span>   output.clear();</div>
+<div class="line"><a name="l01483"></a><span class="lineno"> 1483</span>   <span class="keywordtype">int</span> dim=input.size();</div>
+<div class="line"><a name="l01484"></a><span class="lineno"> 1484</span>   <span class="keywordtype">int</span> x=0;</div>
+<div class="line"><a name="l01485"></a><span class="lineno"> 1485</span>   output.push_back(input[0]);</div>
+<div class="line"><a name="l01486"></a><span class="lineno"> 1486</span>   <span class="keywordflow">for</span>(<span class="keywordtype">int</span> i=1;i<dim;++i){</div>
+<div class="line"><a name="l01487"></a><span class="lineno"> 1487</span>     <span class="keywordflow">if</span>(i%nbin)</div>
+<div class="line"><a name="l01488"></a><span class="lineno"> 1488</span>       <span class="keywordflow">continue</span>;</div>
+<div class="line"><a name="l01489"></a><span class="lineno"> 1489</span>     <span class="keywordflow">else</span>{</div>
+<div class="line"><a name="l01490"></a><span class="lineno"> 1490</span>       x=(i-1)/nbin+1;</div>
+<div class="line"><a name="l01491"></a><span class="lineno"> 1491</span>       output.push_back(input[i]);</div>
+<div class="line"><a name="l01492"></a><span class="lineno"> 1492</span>     }</div>
+<div class="line"><a name="l01493"></a><span class="lineno"> 1493</span>   }</div>
+<div class="line"><a name="l01494"></a><span class="lineno"> 1494</span> }</div>
+<div class="line"><a name="l01495"></a><span class="lineno"> 1495</span> </div>
+<div class="line"><a name="l01496"></a><span class="lineno"> 1496</span> <span class="comment">//todo: nodata?</span></div>
+<div class="line"><a name="l01497"></a><span class="lineno"> 1497</span> <span class="keyword">template</span><<span class="keyword">class</span> T> <span class="keywordtype">void</span> StatFactory::interpolateDown(<span class="keywordtype">double</span>* input, <span class="keywordtype">int</span> dim, std::vector<T>& output, <span class="keywordtype">int</span> nbin)</div>
+<div class="line"><a name="l01498"></a><span class="lineno"> 1498</span> {</div>
+<div class="line"><a name="l01499"></a><span class="lineno"> 1499</span>   <span class="keywordflow">if</span>(!nbin){</div>
+<div class="line"><a name="l01500"></a><span class="lineno"> 1500</span>     std::ostringstream s;</div>
+<div class="line"><a name="l01501"></a><span class="lineno"> 1501</span>     s<<<span class="stringliteral">"Error: nbin must be larger than 0"</span>;</div>
+<div class="line"><a name="l01502"></a><span class="lineno"> 1502</span>     <span class="keywordflow">throw</span>(s.str());</div>
+<div class="line"><a name="l01503"></a><span class="lineno"> 1503</span>   }</div>
+<div class="line"><a name="l01504"></a><span class="lineno"> 1504</span>   output.clear();</div>
+<div class="line"><a name="l01505"></a><span class="lineno"> 1505</span>   <span class="keywordtype">int</span> x=0;</div>
+<div class="line"><a name="l01506"></a><span class="lineno"> 1506</span>   output.push_back(input[0]);</div>
+<div class="line"><a name="l01507"></a><span class="lineno"> 1507</span>   <span class="keywordflow">for</span>(<span class="keywordtype">int</span> i=1;i<dim;++i){</div>
+<div class="line"><a name="l01508"></a><span class="lineno"> 1508</span>     <span class="keywordflow">if</span>(i%nbin)</div>
+<div class="line"><a name="l01509"></a><span class="lineno"> 1509</span>       <span class="keywordflow">continue</span>;</div>
+<div class="line"><a name="l01510"></a><span class="lineno"> 1510</span>     <span class="keywordflow">else</span>{</div>
+<div class="line"><a name="l01511"></a><span class="lineno"> 1511</span>       x=(i-1)/nbin+1;</div>
+<div class="line"><a name="l01512"></a><span class="lineno"> 1512</span>       output.push_back(input[i]);</div>
+<div class="line"><a name="l01513"></a><span class="lineno"> 1513</span>     }</div>
+<div class="line"><a name="l01514"></a><span class="lineno"> 1514</span>   }</div>
+<div class="line"><a name="l01515"></a><span class="lineno"> 1515</span> }</div>
+<div class="line"><a name="l01516"></a><span class="lineno"> 1516</span> }</div>
+<div class="line"><a name="l01517"></a><span class="lineno"> 1517</span> </div>
+<div class="line"><a name="l01518"></a><span class="lineno"> 1518</span> <span class="preprocessor">#endif </span><span class="comment">/* _STATFACTORY_H_ */</span><span class="preprocessor"></span></div>
+<div class="line"><a name="l01519"></a><span class="lineno"> 1519</span> <span class="preprocessor"></span></div>
+<div class="line"><a name="l01520"></a><span class="lineno"> 1520</span> <span class="comment">// void Histogram::signature(double m1, double m2, double& k, double& alpha, double& beta, double e)</span></div>
+<div class="line"><a name="l01521"></a><span class="lineno"> 1521</span> <span class="comment">// {</span></div>
+<div class="line"><a name="l01522"></a><span class="lineno"> 1522</span> <span class="comment">//   double y=m1*m1/m2;</span></div>
+<div class="line"><a name="l01523"></a><span class="lineno"> 1523</span> <span class="comment">//   beta=F_1(y,0.1,10.0,e);</span></div>
+<div class="line"><a name="l01524"></a><span class="lineno"> 1524</span> <span class="comment">//   double fb=F(beta);</span></div>
+<div class="line"><a name="l01525"></a><span class="lineno"> 1525</span> <span class="comment">//   double g=exp(lgamma(1.0/beta));</span></div>
+<div class="line"><a name="l01526"></a><span class="lineno"> 1526</span> <span class="comment">//   alpha=m1*g/exp(lgamma(2.0/beta));</span></div>
+<div class="line"><a name="l01527"></a><span class="lineno"> 1527</span> <span class="comment">//   k=beta/(2*alpha*g);</span></div>
+<div class="line"><a name="l01528"></a><span class="lineno"> 1528</span> <span class="comment">// //   std::cout << "y, alpha, beta: " << y << ", " << alpha << ", " << beta << std::endl;</span></div>
+<div class="line"><a name="l01529"></a><span class="lineno"> 1529</span> <span class="comment">// }</span></div>
+<div class="line"><a name="l01530"></a><span class="lineno"> 1530</span> </div>
+<div class="line"><a name="l01531"></a><span class="lineno"> 1531</span> <span class="comment">// double Histogram::F(double x)</span></div>
+<div class="line"><a name="l01532"></a><span class="lineno"> 1532</span> <span class="comment">// {</span></div>
+<div class="line"><a name="l01533"></a><span class="lineno"> 1533</span> <span class="comment">//   double g2=exp(lgamma(2.0/x));</span></div>
+<div class="line"><a name="l01534"></a><span class="lineno"> 1534</span> <span class="comment">//   return(g2*g2/exp(lgamma(3.0/x))/exp(lgamma(1.0/x)));</span></div>
+<div class="line"><a name="l01535"></a><span class="lineno"> 1535</span> <span class="comment">// }</span></div>
+<div class="line"><a name="l01536"></a><span class="lineno"> 1536</span> </div>
+<div class="line"><a name="l01537"></a><span class="lineno"> 1537</span> <span class="comment">// //x1 is under estimate, x2 is over estimate, e is error</span></div>
+<div class="line"><a name="l01538"></a><span class="lineno"> 1538</span> <span class="comment">// double Histogram::F_1(double y, double x1, double x2, double e)</span></div>
+<div class="line"><a name="l01539"></a><span class="lineno"> 1539</span> <span class="comment">// {</span></div>
+<div class="line"><a name="l01540"></a><span class="lineno"> 1540</span> <span class="comment">//   double f1=F(x1);</span></div>
+<div class="line"><a name="l01541"></a><span class="lineno"> 1541</span> <span class="comment">//   double f2=F(x2);</span></div>
+<div class="line"><a name="l01542"></a><span class="lineno"> 1542</span> <span class="comment">//   assert(f1!=f2);</span></div>
+<div class="line"><a name="l01543"></a><span class="lineno"> 1543</span> <span class="comment">//   double x=x1+(x2-x1)*(y-f1)/(f2-f1);</span></div>
+<div class="line"><a name="l01544"></a><span class="lineno"> 1544</span> <span class="comment">//   double f=F(x);</span></div>
+<div class="line"><a name="l01545"></a><span class="lineno"> 1545</span> <span class="comment">//   while(f-y>=e||y-f>=e){</span></div>
+<div class="line"><a name="l01546"></a><span class="lineno"> 1546</span> <span class="comment">//     if(f<y)</span></div>
+<div class="line"><a name="l01547"></a><span class="lineno"> 1547</span> <span class="comment">//       x1=x;</span></div>
+<div class="line"><a name="l01548"></a><span class="lineno"> 1548</span> <span class="comment">//     else </span></div>
+<div class="line"><a name="l01549"></a><span class="lineno"> 1549</span> <span class="comment">//       x2=x;</span></div>
+<div class="line"><a name="l01550"></a><span class="lineno"> 1550</span> <span class="comment">//     if(x1==x2)</span></div>
+<div class="line"><a name="l01551"></a><span class="lineno"> 1551</span> <span class="comment">//       return x1;</span></div>
+<div class="line"><a name="l01552"></a><span class="lineno"> 1552</span> <span class="comment">//     assert(f1!=f2);</span></div>
+<div class="line"><a name="l01553"></a><span class="lineno"> 1553</span> <span class="comment">//     x=x1+(x2-x1)*(y-f1)/(f2-f1);</span></div>
+<div class="line"><a name="l01554"></a><span class="lineno"> 1554</span> <span class="comment">//     f=F(x);</span></div>
+<div class="line"><a name="l01555"></a><span class="lineno"> 1555</span> <span class="comment">//   }</span></div>
+<div class="line"><a name="l01556"></a><span class="lineno"> 1556</span> <span class="comment">//   return x;</span></div>
+<div class="line"><a name="l01557"></a><span class="lineno"> 1557</span> <span class="comment">// }</span></div>
 <div class="ttc" id="classstatfactory_1_1StatFactory_html"><div class="ttname"><a href="classstatfactory_1_1StatFactory.html">statfactory::StatFactory</a></div><div class="ttdef"><b>Definition:</b> <a href="StatFactory_8h_source.html#l00043">StatFactory.h:43</a></div></div>
 </div><!-- fragment --></div><!-- contents -->
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Jun 23 2015 17:09:36 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Tue Nov 3 2015 15:58:26 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/Vector2d_8h_source.html b/doc/html/Vector2d_8h_source.html
index f6c28f4..539cc75 100644
--- a/doc/html/Vector2d_8h_source.html
+++ b/doc/html/Vector2d_8h_source.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.3</span>
+    <span id="projectnumber">2.6.4</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -388,7 +388,7 @@
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Jun 23 2015 17:09:36 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/____init_____8py_source.html b/doc/html/____init_____8py_source.html
index 0d9f795..f94dd0c 100644
--- a/doc/html/____init_____8py_source.html
+++ b/doc/html/____init_____8py_source.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.3</span>
+    <span id="projectnumber">2.6.4</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -87,7 +87,7 @@
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Jun 23 2015 17:09:36 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Tue Nov 3 2015 15:58:26 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/annotated.html b/doc/html/annotated.html
index 41de9cb..eef8dac 100644
--- a/doc/html/annotated.html
+++ b/doc/html/annotated.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.3</span>
+    <span id="projectnumber">2.6.4</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -52,7 +52,7 @@
 </div><!--header-->
 <div class="contents">
 <div class="textblock">Here are the classes, structs, unions and interfaces with brief descriptions:</div><div class="directory">
-<div class="levels">[detail level <span onclick="javascript:toggleLevel(1);">1</span><span onclick="javascript:toggleLevel(2);">2</span><span onclick="javascript:toggleLevel(3);">3</span>]</div><table class="directory">
+<div class="levels">[detail level <span onclick="javascript:toggleLevel(1);">1</span><span onclick="javascript:toggleLevel(2);">2</span><span onclick="javascript:toggleLevel(3);">3</span><span onclick="javascript:toggleLevel(4);">4</span>]</div><table class="directory">
 <tr id="row_0_" class="even"><td class="entry"><img id="arr_0_" src="ftv2mnode.png" alt="o" width="16" height="22" onclick="toggleFolder('0_')"/><img src="ftv2ns.png" alt="N" width="24" height="22" /><b>confusionmatrix</b></td><td class="desc"></td></tr>
 <tr id="row_0_0_"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2lastnode.png" alt="\" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classconfusionmatrix_1_1ConfusionMatrix.html" target="_self">ConfusionMatrix</a></td><td class="desc"></td></tr>
 <tr id="row_1_" class="even"><td class="entry"><img id="arr_1_" src="ftv2mnode.png" alt="o" width="16" height="22" onclick="toggleFolder('1_')"/><img src="ftv2ns.png" alt="N" width="24" height="22" /><b>FANN</b></td><td class="desc"></td></tr>
@@ -65,94 +65,131 @@
 <tr id="row_4_"><td class="entry"><img id="arr_4_" src="ftv2mnode.png" alt="o" width="16" height="22" onclick="toggleFolder('4_')"/><img src="ftv2ns.png" alt="N" width="24" height="22" /><b>imgregression</b></td><td class="desc"></td></tr>
 <tr id="row_4_0_" class="even"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2lastnode.png" alt="\" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classimgregression_1_1ImgRegression.html" target="_self">ImgRegression</a></td><td class="desc"></td></tr>
 <tr id="row_5_"><td class="entry"><img id="arr_5_" src="ftv2mnode.png" alt="o" width="16" height="22" onclick="toggleFolder('5_')"/><img src="ftv2ns.png" alt="N" width="24" height="22" /><b>qgis</b></td><td class="desc"></td></tr>
-<tr id="row_5_0_" class="even"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img id="arr_5_0_" src="ftv2mnode.png" alt="o" width="16" height="22" onclick="toggleFolder('5_0_')"/><img src="ftv2ns.png" alt="N" width="24" height="22" /><b>pkcomposite</b></td><td class="desc"></td></tr>
-<tr id="row_5_0_0_"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2lastnode.png" alt="\" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classqgis_1_1pkcomposite_1_1pkcomposite.html" target="_self">pkcomposite</a></td><td class="desc"></td></tr>
-<tr id="row_5_1_" class="even"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img id="arr_5_1_" src="ftv2mnode.png" alt="o" width="16" height="22" onclick="toggleFolder('5_1_')"/><img src="ftv2ns.png" alt="N" width="24" height="22" /><b>pkcrop</b></td><td class="desc"></td></tr>
-<tr id="row_5_1_0_"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2lastnode.png" alt="\" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classqgis_1_1pkcrop_1_1pkcrop.html" target="_self">pkcrop</a></td><td class="desc"></td></tr>
-<tr id="row_5_2_" class="even"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img id="arr_5_2_" src="ftv2mnode.png" alt="o" width="16" height="22" onclick="toggleFolder('5_2_')"/><img src="ftv2ns.png" alt="N" width="24" height="22" /><b>pkdiff_accuracy</b></td><td class="desc"></td></tr>
-<tr id="row_5_2_0_"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2lastnode.png" alt="\" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classqgis_1_1pkdiff__accuracy_1_1pkdiff__accuracy.html" target="_self">pkdiff_accuracy</a></td><td class="desc"></td></tr>
-<tr id="row_5_3_" class="even"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img id="arr_5_3_" src="ftv2mnode.png" alt="o" width="16" height="22" onclick="toggleFolder('5_3_')"/><img src="ftv2ns.png" alt="N" width="24" height="22" /><b>pkextract</b></td><td class="desc"></td></tr>
-<tr id="row_5_3_0_"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2lastnode.png" alt="\" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classqgis_1_1pkextract_1_1pkextract.html" target="_self">pkextract</a></td><td class="desc"></td></tr>
-<tr id="row_5_4_" class="even"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img id="arr_5_4_" src="ftv2mnode.png" alt="o" width="16" height="22" onclick="toggleFolder('5_4_')"/><img src="ftv2ns.png" alt="N" width="24" height="22" /><b>pkextract_grid</b></td><td class="desc"></td></tr>
-<tr id="row_5_4_0_"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2lastnode.png" alt="\" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classqgis_1_1pkextract__grid_1_1pkextract__grid.html" target="_self">pkextract_grid</a></td><td class="desc"></td></tr>
-<tr id="row_5_5_" class="even"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img id="arr_5_5_" src="ftv2mnode.png" alt="o" width="16" height="22" onclick="toggleFolder('5_5_')"/><img src="ftv2ns.png" alt="N" width="24" height="22" /><b>pkextract_random</b></td><td class="desc"></td></tr>
-<tr id="row_5_5_0_"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2lastnode.png" alt="\" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classqgis_1_1pkextract__random_1_1pkextract__random.html" target="_self">pkextract_random</a></td><td class="desc"></td></tr>
-<tr id="row_5_6_" class="even"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img id="arr_5_6_" src="ftv2mnode.png" alt="o" width="16" height="22" onclick="toggleFolder('5_6_')"/><img src="ftv2ns.png" alt="N" width="24" height="22" /><b>pkfilter_spatial</b></td><td class="desc"></td></tr>
-<tr id="row_5_6_0_"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2lastnode.png" alt="\" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classqgis_1_1pkfilter__spatial_1_1pkfilter__spatial.html" target="_self">pkfilter_spatial</a></td><td class="desc"></td></tr>
-<tr id="row_5_7_" class="even"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img id="arr_5_7_" src="ftv2mnode.png" alt="o" width="16" height="22" onclick="toggleFolder('5_7_')"/><img src="ftv2ns.png" alt="N" width="24" height="22" /><b>pkfilter_spectral</b></td><td class="desc"></td></tr>
-<tr id="row_5_7_0_"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2lastnode.png" alt="\" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classqgis_1_1pkfilter__spectral_1_1pkfilter__spectral.html" target="_self">pkfilter_spectral</a></td><td class="desc"></td></tr>
-<tr id="row_5_8_" class="even"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img id="arr_5_8_" src="ftv2mnode.png" alt="o" width="16" height="22" onclick="toggleFolder('5_8_')"/><img src="ftv2ns.png" alt="N" width="24" height="22" /><b>pkfilterdem</b></td><td class="desc"></td></tr>
-<tr id="row_5_8_0_"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2lastnode.png" alt="\" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classqgis_1_1pkfilterdem_1_1pkfilterdem.html" target="_self">pkfilterdem</a></td><td class="desc"></td></tr>
-<tr id="row_5_9_" class="even"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img id="arr_5_9_" src="ftv2mnode.png" alt="o" width="16" height="22" onclick="toggleFolder('5_9_')"/><img src="ftv2ns.png" alt="N" width="24" height="22" /><b>pkgetmask</b></td><td class="desc"></td></tr>
-<tr id="row_5_9_0_"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2lastnode.png" alt="\" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classqgis_1_1pkgetmask_1_1pkgetmask.html" target="_self">pkgetmask</a></td><td class="desc"></td></tr>
-<tr id="row_5_10_" class="even"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img id="arr_5_10_" src="ftv2mnode.png" alt="o" width="16" height="22" onclick="toggleFolder('5_10_')"/><img src="ftv2ns.png" alt="N" width="24" height="22" /><b>pklas2img</b></td><td class="desc"></td></tr>
-<tr id="row_5_10_0_"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2lastnode.png" alt="\" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classqgis_1_1pklas2img_1_1pklas2img.html" target="_self">pklas2img</a></td><td class="desc"></td></tr>
-<tr id="row_5_11_" class="even"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img id="arr_5_11_" src="ftv2mnode.png" alt="o" width="16" height="22" onclick="toggleFolder('5_11_')"/><img src="ftv2ns.png" alt="N" width="24" height="22" /><b>pkreclass</b></td><td class="desc"></td></tr>
-<tr id="row_5_11_0_"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2lastnode.png" alt="\" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classqgis_1_1pkreclass_1_1pkreclass.html" target="_self">pkreclass</a></td><td class="desc"></td></tr>
-<tr id="row_5_12_" class="even"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img id="arr_5_12_" src="ftv2mnode.png" alt="o" width="16" height="22" onclick="toggleFolder('5_12_')"/><img src="ftv2ns.png" alt="N" width="24" height="22" /><b>pksetmask</b></td><td class="desc"></td></tr>
-<tr id="row_5_12_0_"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2lastnode.png" alt="\" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classqgis_1_1pksetmask_1_1pksetmask.html" target="_self">pksetmask</a></td><td class="desc"></td></tr>
-<tr id="row_5_13_" class="even"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img id="arr_5_13_" src="ftv2mnode.png" alt="o" width="16" height="22" onclick="toggleFolder('5_13_')"/><img src="ftv2ns.png" alt="N" width="24" height="22" /><b>pksvm</b></td><td class="desc"></td></tr>
-<tr id="row_5_13_0_"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2lastnode.png" alt="\" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classqgis_1_1pksvm_1_1pksvm.html" target="_self">pksvm</a></td><td class="desc"></td></tr>
-<tr id="row_5_14_" class="even"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img id="arr_5_14_" src="ftv2mnode.png" alt="o" width="16" height="22" onclick="toggleFolder('5_14_')"/><img src="ftv2ns.png" alt="N" width="24" height="22" /><b>pktoolsAlgorithm</b></td><td class="desc"></td></tr>
-<tr id="row_5_14_0_"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2lastnode.png" alt="\" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classqgis_1_1pktoolsAlgorithm_1_1pktoolsAlgorithm.html" target="_self">pktoolsAlgorithm</a></td><td class="desc"></td></tr>
-<tr id="row_5_15_" class="even"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img id="arr_5_15_" src="ftv2mnode.png" alt="o" width="16" height="22" onclick="toggleFolder('5_15_')"/><img src="ftv2ns.png" alt="N" width="24" height="22" /><b>pktoolsAlgorithmProvider</b></td><td class="desc"></td></tr>
-<tr id="row_5_15_0_"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2lastnode.png" alt="\" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classqgis_1_1pktoolsAlgorithmProvider_1_1pktoolsAlgorithmProvider.html" target="_self">pktoolsAlgorithmProvider</a></td><td class="desc"></td></tr>
-<tr id="row_5_16_" class="even"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img id="arr_5_16_" src="ftv2mnode.png" alt="o" width="16" height="22" onclick="toggleFolder('5_16_')"/><img src="ftv2ns.png" alt="N" width="24" height="22" /><b>pktoolsUtils</b></td><td class="desc"></td></tr>
-<tr id="row_5_16_0_"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2lastnode.png" alt="\" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classqgis_1_1pktoolsUtils_1_1pktoolsUtils.html" target="_self">pktoolsUtils</a></td><td class="desc"></td></tr>
-<tr id="row_5_17_" class="even"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img id="arr_5_17_" src="ftv2mlastnode.png" alt="\" width="16" height="22" onclick="toggleFolder('5_17_')"/><img src="ftv2ns.png" alt="N" width="24" height="22" /><b>ProcessingPktoolsPlugin</b></td><td class="desc"></td></tr>
-<tr id="row_5_17_0_"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2blank.png" alt=" " width="16" height="22" /><img src="ftv2lastnode.png" alt="\" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classqgis_1_1ProcessingPktoolsPlugin_1_1ProcessingPktoolsPlugin.html" target="_self">ProcessingPktoolsPlugin</a></td><td class="desc"></td></tr>
-<tr id="row_6_" class="even"><td class="entry"><img id="arr_6_" src="ftv2mnode.png" alt="o" width="16" height="22" onclick="toggleFolder('6_')"/><img src="ftv2ns.png" alt="N" width="24" height="22" /><b>statfactory</b></td><td class="desc"></td></tr>
-<tr id="row_6_0_"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2lastnode.png" alt="\" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classstatfactory_1_1StatFactory.html" target="_self">StatFactory</a></td><td class="desc"></td></tr>
-<tr id="row_7_" class="even"><td class="entry"><img id="arr_7_" src="ftv2mnode.png" alt="o" width="16" height="22" onclick="toggleFolder('7_')"/><img src="ftv2ns.png" alt="N" width="24" height="22" /><b>Ui</b></td><td class="desc"></td></tr>
-<tr id="row_7_0_"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2lastnode.png" alt="\" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classUi_1_1MainWindow.html" target="_self">MainWindow</a></td><td class="desc"></td></tr>
-<tr id="row_8_" class="even"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classBadConversion.html" target="_self">BadConversion</a></td><td class="desc">Throw this class when syntax error in command line option </td></tr>
-<tr id="row_9_"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classCache.html" target="_self">Cache</a></td><td class="desc"></td></tr>
-<tr id="row_10_" class="even"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classCompare__IndexValue.html" target="_self">Compare_IndexValue</a></td><td class="desc"></td></tr>
-<tr id="row_11_"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classCompare__PosValue.html" target="_self">Compare_PosValue</a></td><td class="desc"></td></tr>
-<tr id="row_12_" class="even"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classCostFactory.html" target="_self">CostFactory</a></td><td class="desc"></td></tr>
-<tr id="row_13_"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classCostFactoryANN.html" target="_self">CostFactoryANN</a></td><td class="desc"></td></tr>
-<tr id="row_14_" class="even"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classCostFactorySVM.html" target="_self">CostFactorySVM</a></td><td class="desc"></td></tr>
-<tr id="row_15_"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classDataModel.html" target="_self">DataModel</a></td><td class="desc"></td></tr>
-<tr id="row_16_" class="even"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="structdecision__function.html" target="_self">decision_function</a></td><td class="desc"></td></tr>
-<tr id="row_17_"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classDecrease__IndexValue.html" target="_self">Decrease_IndexValue</a></td><td class="desc"></td></tr>
-<tr id="row_18_" class="even"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classDecrease__PosValue.html" target="_self">Decrease_PosValue</a></td><td class="desc"></td></tr>
-<tr id="row_19_"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classEgcs.html" target="_self">Egcs</a></td><td class="desc"></td></tr>
-<tr id="row_20_" class="even"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classFeatureSelector.html" target="_self">FeatureSelector</a></td><td class="desc"></td></tr>
-<tr id="row_21_"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classFileReaderAscii.html" target="_self">FileReaderAscii</a></td><td class="desc"></td></tr>
-<tr id="row_22_" class="even"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classFileReaderLas.html" target="_self">FileReaderLas</a></td><td class="desc"></td></tr>
-<tr id="row_23_"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classImgReaderGdal.html" target="_self">ImgReaderGdal</a></td><td class="desc"></td></tr>
-<tr id="row_24_" class="even"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classImgReaderOgr.html" target="_self">ImgReaderOgr</a></td><td class="desc"></td></tr>
-<tr id="row_25_"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classImgWriterGdal.html" target="_self">ImgWriterGdal</a></td><td class="desc"></td></tr>
-<tr id="row_26_" class="even"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classImgWriterOgr.html" target="_self">ImgWriterOgr</a></td><td class="desc"></td></tr>
-<tr id="row_27_"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classIncrease__IndexValue.html" target="_self">Increase_IndexValue</a></td><td class="desc"></td></tr>
-<tr id="row_28_" class="even"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classIncrease__PosValue.html" target="_self">Increase_PosValue</a></td><td class="desc"></td></tr>
-<tr id="row_29_"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="structIndexValue.html" target="_self">IndexValue</a></td><td class="desc"></td></tr>
-<tr id="row_30_" class="even"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classKernel.html" target="_self">Kernel</a></td><td class="desc"></td></tr>
-<tr id="row_31_"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classLastReturnFilter.html" target="_self">LastReturnFilter</a></td><td class="desc"></td></tr>
-<tr id="row_32_" class="even"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classMainWindow.html" target="_self">MainWindow</a></td><td class="desc"></td></tr>
-<tr id="row_33_"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classONE__CLASS__Q.html" target="_self">ONE_CLASS_Q</a></td><td class="desc"></td></tr>
-<tr id="row_34_" class="even"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classOptFactory.html" target="_self">OptFactory</a></td><td class="desc"></td></tr>
-<tr id="row_35_"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classOptionpk.html" target="_self">Optionpk</a></td><td class="desc"></td></tr>
-<tr id="row_36_" class="even"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="structPosValue.html" target="_self">PosValue</a></td><td class="desc"></td></tr>
-<tr id="row_37_"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classQMatrix.html" target="_self">QMatrix</a></td><td class="desc"></td></tr>
-<tr id="row_38_" class="even"><td class="entry"><img id="arr_38_" src="ftv2mnode.png" alt="o" width="16" height="22" onclick="toggleFolder('38_')"/><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classSolver.html" target="_self">Solver</a></td><td class="desc"></td></tr>
-<tr id="row_38_0_"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2lastnode.png" alt="\" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="structSolver_1_1SolutionInfo.html" target="_self">SolutionInfo</a></td><td class="desc"></td></tr>
-<tr id="row_39_" class="even"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classSolver__NU.html" target="_self">Solver_NU</a></td><td class="desc"></td></tr>
-<tr id="row_40_"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classSVC__Q.html" target="_self">SVC_Q</a></td><td class="desc"></td></tr>
-<tr id="row_41_" class="even"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="structsvm__model.html" target="_self">svm_model</a></td><td class="desc"></td></tr>
-<tr id="row_42_"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="structsvm__node.html" target="_self">svm_node</a></td><td class="desc"></td></tr>
-<tr id="row_43_" class="even"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="structsvm__parameter.html" target="_self">svm_parameter</a></td><td class="desc"></td></tr>
-<tr id="row_44_"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="structsvm__problem.html" target="_self">svm_problem</a></td><td class="desc"></td></tr>
-<tr id="row_45_" class="even"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classSVR__Q.html" target="_self">SVR_Q</a></td><td class="desc"></td></tr>
-<tr id="row_46_"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classUi__MainWindow.html" target="_self">Ui_MainWindow</a></td><td class="desc"></td></tr>
-<tr id="row_47_" class="even"><td class="entry"><img src="ftv2lastnode.png" alt="\" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classVector2d.html" target="_self">Vector2d</a></td><td class="desc"></td></tr>
+<tr id="row_5_0_" class="even"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img id="arr_5_0_" src="ftv2pnode.png" alt="o" width="16" height="22" onclick="toggleFolder('5_0_')"/><img src="ftv2ns.png" alt="N" width="24" height="22" /><b>pkcomposite</b></td><td class="desc"></td></tr>
+<tr id="row_5_0_0_" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2lastnode.png" alt="\" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classqgis_1_1pkcomposite_1_1pkcomposite.html" target="_self">pkcomposite</a></td><td class="desc"></td></tr>
+<tr id="row_5_1_"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img id="arr_5_1_" src="ftv2pnode.png" alt="o" width="16" height="22" onclick="toggleFolder('5_1_')"/><img src="ftv2ns.png" alt="N" width="24" height="22" /><b>pkcrop</b></td><td class="desc"></td></tr>
+<tr id="row_5_1_0_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2lastnode.png" alt="\" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classqgis_1_1pkcrop_1_1pkcrop.html" target="_self">pkcrop</a></td><td class="desc"></td></tr>
+<tr id="row_5_2_" class="even"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img id="arr_5_2_" src="ftv2pnode.png" alt="o" width="16" height="22" onclick="toggleFolder('5_2_')"/><img src="ftv2ns.png" alt="N" width="24" height="22" /><b>pkdiff_accuracy</b></td><td class="desc"></td></tr>
+<tr id="row_5_2_0_" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2lastnode.png" alt="\" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classqgis_1_1pkdiff__accuracy_1_1pkdiff__accuracy.html" target="_self">pkdiff_accuracy</a></td><td class="desc"></td></tr>
+<tr id="row_5_3_"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img id="arr_5_3_" src="ftv2pnode.png" alt="o" width="16" height="22" onclick="toggleFolder('5_3_')"/><img src="ftv2ns.png" alt="N" width="24" height="22" /><b>pkextract</b></td><td class="desc"></td></tr>
+<tr id="row_5_3_0_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2lastnode.png" alt="\" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classqgis_1_1pkextract_1_1pkextract.html" target="_self">pkextract</a></td><td class="desc"></td></tr>
+<tr id="row_5_4_" class="even"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img id="arr_5_4_" src="ftv2pnode.png" alt="o" width="16" height="22" onclick="toggleFolder('5_4_')"/><img src="ftv2ns.png" alt="N" width="24" height="22" /><b>pkextract_grid</b></td><td class="desc"></td></tr>
+<tr id="row_5_4_0_" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2lastnode.png" alt="\" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classqgis_1_1pkextract__grid_1_1pkextract__grid.html" target="_self">pkextract_grid</a></td><td class="desc"></td></tr>
+<tr id="row_5_5_"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img id="arr_5_5_" src="ftv2pnode.png" alt="o" width="16" height="22" onclick="toggleFolder('5_5_')"/><img src="ftv2ns.png" alt="N" width="24" height="22" /><b>pkextract_random</b></td><td class="desc"></td></tr>
+<tr id="row_5_5_0_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2lastnode.png" alt="\" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classqgis_1_1pkextract__random_1_1pkextract__random.html" target="_self">pkextract_random</a></td><td class="desc"></td></tr>
+<tr id="row_5_6_" class="even"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img id="arr_5_6_" src="ftv2pnode.png" alt="o" width="16" height="22" onclick="toggleFolder('5_6_')"/><img src="ftv2ns.png" alt="N" width="24" height="22" /><b>pkfilter_spatial</b></td><td class="desc"></td></tr>
+<tr id="row_5_6_0_" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2lastnode.png" alt="\" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classqgis_1_1pkfilter__spatial_1_1pkfilter__spatial.html" target="_self">pkfilter_spatial</a></td><td class="desc"></td></tr>
+<tr id="row_5_7_"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img id="arr_5_7_" src="ftv2pnode.png" alt="o" width="16" height="22" onclick="toggleFolder('5_7_')"/><img src="ftv2ns.png" alt="N" width="24" height="22" /><b>pkfilter_spectral</b></td><td class="desc"></td></tr>
+<tr id="row_5_7_0_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2lastnode.png" alt="\" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classqgis_1_1pkfilter__spectral_1_1pkfilter__spectral.html" target="_self">pkfilter_spectral</a></td><td class="desc"></td></tr>
+<tr id="row_5_8_" class="even"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img id="arr_5_8_" src="ftv2pnode.png" alt="o" width="16" height="22" onclick="toggleFolder('5_8_')"/><img src="ftv2ns.png" alt="N" width="24" height="22" /><b>pkfilterdem</b></td><td class="desc"></td></tr>
+<tr id="row_5_8_0_" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2lastnode.png" alt="\" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classqgis_1_1pkfilterdem_1_1pkfilterdem.html" target="_self">pkfilterdem</a></td><td class="desc"></td></tr>
+<tr id="row_5_9_"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img id="arr_5_9_" src="ftv2pnode.png" alt="o" width="16" height="22" onclick="toggleFolder('5_9_')"/><img src="ftv2ns.png" alt="N" width="24" height="22" /><b>pkgetmask</b></td><td class="desc"></td></tr>
+<tr id="row_5_9_0_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2lastnode.png" alt="\" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classqgis_1_1pkgetmask_1_1pkgetmask.html" target="_self">pkgetmask</a></td><td class="desc"></td></tr>
+<tr id="row_5_10_" class="even"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img id="arr_5_10_" src="ftv2pnode.png" alt="o" width="16" height="22" onclick="toggleFolder('5_10_')"/><img src="ftv2ns.png" alt="N" width="24" height="22" /><b>pklas2img</b></td><td class="desc"></td></tr>
+<tr id="row_5_10_0_" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2lastnode.png" alt="\" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classqgis_1_1pklas2img_1_1pklas2img.html" target="_self">pklas2img</a></td><td class="desc"></td></tr>
+<tr id="row_5_11_"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img id="arr_5_11_" src="ftv2pnode.png" alt="o" width="16" height="22" onclick="toggleFolder('5_11_')"/><img src="ftv2ns.png" alt="N" width="24" height="22" /><b>pkreclass</b></td><td class="desc"></td></tr>
+<tr id="row_5_11_0_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2lastnode.png" alt="\" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classqgis_1_1pkreclass_1_1pkreclass.html" target="_self">pkreclass</a></td><td class="desc"></td></tr>
+<tr id="row_5_12_" class="even"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img id="arr_5_12_" src="ftv2pnode.png" alt="o" width="16" height="22" onclick="toggleFolder('5_12_')"/><img src="ftv2ns.png" alt="N" width="24" height="22" /><b>pksetmask</b></td><td class="desc"></td></tr>
+<tr id="row_5_12_0_" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2lastnode.png" alt="\" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classqgis_1_1pksetmask_1_1pksetmask.html" target="_self">pksetmask</a></td><td class="desc"></td></tr>
+<tr id="row_5_13_"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img id="arr_5_13_" src="ftv2pnode.png" alt="o" width="16" height="22" onclick="toggleFolder('5_13_')"/><img src="ftv2ns.png" alt="N" width="24" height="22" /><b>pksvm</b></td><td class="desc"></td></tr>
+<tr id="row_5_13_0_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2lastnode.png" alt="\" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classqgis_1_1pksvm_1_1pksvm.html" target="_self">pksvm</a></td><td class="desc"></td></tr>
+<tr id="row_5_14_" class="even"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img id="arr_5_14_" src="ftv2pnode.png" alt="o" width="16" height="22" onclick="toggleFolder('5_14_')"/><img src="ftv2ns.png" alt="N" width="24" height="22" /><b>pktools</b></td><td class="desc"></td></tr>
+<tr id="row_5_14_0_" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img id="arr_5_14_0_" src="ftv2pnode.png" alt="o" width="16" height="22" onclick="toggleFolder('5_14_0_')"/><img src="ftv2ns.png" alt="N" width="24" height="22" /><b>pkcomposite</b></td><td class="desc"></td></tr>
+<tr id="row_5_14_0_0_" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2lastnode.png" alt="\" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classqgis_1_1pktools_1_1pkcomposite_1_1pkcomposite.html" target="_self">pkcomposite</a></td><td class="desc">< [...]
+<tr id="row_5_14_1_" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img id="arr_5_14_1_" src="ftv2pnode.png" alt="o" width="16" height="22" onclick="toggleFolder('5_14_1_')"/><img src="ftv2ns.png" alt="N" width="24" height="22" /><b>pkcrop</b></td><td class="desc"></td></tr>
+<tr id="row_5_14_1_0_" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2lastnode.png" alt="\" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classqgis_1_1pktools_1_1pkcrop_1_1pkcrop.html" target="_self">pkcrop</a></td><td class="desc"></td></tr>
+<tr id="row_5_14_2_" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img id="arr_5_14_2_" src="ftv2pnode.png" alt="o" width="16" height="22" onclick="toggleFolder('5_14_2_')"/><img src="ftv2ns.png" alt="N" width="24" height="22" /><b>pkdiff_accuracy</b></td><td class="desc"></td></tr>
+<tr id="row_5_14_2_0_" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2lastnode.png" alt="\" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classqgis_1_1pktools_1_1pkdiff__accuracy_1_1pkdiff__accuracy.html" target="_self">pkdiff_accuracy</a></td><td  [...]
+<tr id="row_5_14_3_" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img id="arr_5_14_3_" src="ftv2pnode.png" alt="o" width="16" height="22" onclick="toggleFolder('5_14_3_')"/><img src="ftv2ns.png" alt="N" width="24" height="22" /><b>pkextract</b></td><td class="desc"></td></tr>
+<tr id="row_5_14_3_0_" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2lastnode.png" alt="\" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classqgis_1_1pktools_1_1pkextract_1_1pkextract.html" target="_self">pkextract</a></td><td class="desc"></td></tr>
+<tr id="row_5_14_4_" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img id="arr_5_14_4_" src="ftv2pnode.png" alt="o" width="16" height="22" onclick="toggleFolder('5_14_4_')"/><img src="ftv2ns.png" alt="N" width="24" height="22" /><b>pkextract_grid</b></td><td class="desc"></td></tr>
+<tr id="row_5_14_4_0_" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2lastnode.png" alt="\" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classqgis_1_1pktools_1_1pkextract__grid_1_1pkextract__grid.html" target="_self">pkextract_grid</a></td><td cla [...]
+<tr id="row_5_14_5_" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img id="arr_5_14_5_" src="ftv2pnode.png" alt="o" width="16" height="22" onclick="toggleFolder('5_14_5_')"/><img src="ftv2ns.png" alt="N" width="24" height="22" /><b>pkextract_random</b></td><td class="desc"></td></tr>
+<tr id="row_5_14_5_0_" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2lastnode.png" alt="\" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classqgis_1_1pktools_1_1pkextract__random_1_1pkextract__random.html" target="_self">pkextract_random</a></td>< [...]
+<tr id="row_5_14_6_" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img id="arr_5_14_6_" src="ftv2pnode.png" alt="o" width="16" height="22" onclick="toggleFolder('5_14_6_')"/><img src="ftv2ns.png" alt="N" width="24" height="22" /><b>pkfilter_spatial</b></td><td class="desc"></td></tr>
+<tr id="row_5_14_6_0_" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2lastnode.png" alt="\" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classqgis_1_1pktools_1_1pkfilter__spatial_1_1pkfilter__spatial.html" target="_self">pkfilter_spatial</a></td>< [...]
+<tr id="row_5_14_7_" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img id="arr_5_14_7_" src="ftv2pnode.png" alt="o" width="16" height="22" onclick="toggleFolder('5_14_7_')"/><img src="ftv2ns.png" alt="N" width="24" height="22" /><b>pkfilter_spectral</b></td><td class="desc"></td></tr>
+<tr id="row_5_14_7_0_" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2lastnode.png" alt="\" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classqgis_1_1pktools_1_1pkfilter__spectral_1_1pkfilter__spectral.html" target="_self">pkfilter_spectral</a></t [...]
+<tr id="row_5_14_8_" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img id="arr_5_14_8_" src="ftv2pnode.png" alt="o" width="16" height="22" onclick="toggleFolder('5_14_8_')"/><img src="ftv2ns.png" alt="N" width="24" height="22" /><b>pkfilterdem</b></td><td class="desc"></td></tr>
+<tr id="row_5_14_8_0_" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2lastnode.png" alt="\" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classqgis_1_1pktools_1_1pkfilterdem_1_1pkfilterdem.html" target="_self">pkfilterdem</a></td><td class="desc">< [...]
+<tr id="row_5_14_9_" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img id="arr_5_14_9_" src="ftv2pnode.png" alt="o" width="16" height="22" onclick="toggleFolder('5_14_9_')"/><img src="ftv2ns.png" alt="N" width="24" height="22" /><b>pkgetmask</b></td><td class="desc"></td></tr>
+<tr id="row_5_14_9_0_" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2lastnode.png" alt="\" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classqgis_1_1pktools_1_1pkgetmask_1_1pkgetmask.html" target="_self">pkgetmask</a></td><td class="desc"></td></tr>
+<tr id="row_5_14_10_" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img id="arr_5_14_10_" src="ftv2pnode.png" alt="o" width="16" height="22" onclick="toggleFolder('5_14_10_')"/><img src="ftv2ns.png" alt="N" width="24" height="22" /><b>pklas2img</b></td><td class="desc"></td></tr>
+<tr id="row_5_14_10_0_" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2lastnode.png" alt="\" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classqgis_1_1pktools_1_1pklas2img_1_1pklas2img.html" target="_self">pklas2img</a></td><td class="desc"></td></tr>
+<tr id="row_5_14_11_" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img id="arr_5_14_11_" src="ftv2pnode.png" alt="o" width="16" height="22" onclick="toggleFolder('5_14_11_')"/><img src="ftv2ns.png" alt="N" width="24" height="22" /><b>pkreclass</b></td><td class="desc"></td></tr>
+<tr id="row_5_14_11_0_" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2lastnode.png" alt="\" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classqgis_1_1pktools_1_1pkreclass_1_1pkreclass.html" target="_self">pkreclass</a></td><td class="desc"></td></tr>
+<tr id="row_5_14_12_" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img id="arr_5_14_12_" src="ftv2pnode.png" alt="o" width="16" height="22" onclick="toggleFolder('5_14_12_')"/><img src="ftv2ns.png" alt="N" width="24" height="22" /><b>pksetmask</b></td><td class="desc"></td></tr>
+<tr id="row_5_14_12_0_" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2lastnode.png" alt="\" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classqgis_1_1pktools_1_1pksetmask_1_1pksetmask.html" target="_self">pksetmask</a></td><td class="desc"></td></tr>
+<tr id="row_5_14_13_" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img id="arr_5_14_13_" src="ftv2pnode.png" alt="o" width="16" height="22" onclick="toggleFolder('5_14_13_')"/><img src="ftv2ns.png" alt="N" width="24" height="22" /><b>pksvm</b></td><td class="desc"></td></tr>
+<tr id="row_5_14_13_0_" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2lastnode.png" alt="\" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classqgis_1_1pktools_1_1pksvm_1_1pksvm.html" target="_self">pksvm</a></td><td class="desc"></td></tr>
+<tr id="row_5_14_14_" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img id="arr_5_14_14_" src="ftv2pnode.png" alt="o" width="16" height="22" onclick="toggleFolder('5_14_14_')"/><img src="ftv2ns.png" alt="N" width="24" height="22" /><b>pktoolsAlgorithm</b></td><td class="desc"></td></tr>
+<tr id="row_5_14_14_0_" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2lastnode.png" alt="\" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classqgis_1_1pktools_1_1pktoolsAlgorithm_1_1pktoolsAlgorithm.html" target="_self">pktoolsAlgorithm</a></td><t [...]
+<tr id="row_5_14_15_" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img id="arr_5_14_15_" src="ftv2pnode.png" alt="o" width="16" height="22" onclick="toggleFolder('5_14_15_')"/><img src="ftv2ns.png" alt="N" width="24" height="22" /><b>pktoolsAlgorithmProvider</b></td><td class="desc"></td></tr>
+<tr id="row_5_14_15_0_" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2lastnode.png" alt="\" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classqgis_1_1pktools_1_1pktoolsAlgorithmProvider_1_1pktoolsAlgorithmProvider.html" target="_self">pktoolsAlgo [...]
+<tr id="row_5_14_16_" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img id="arr_5_14_16_" src="ftv2pnode.png" alt="o" width="16" height="22" onclick="toggleFolder('5_14_16_')"/><img src="ftv2ns.png" alt="N" width="24" height="22" /><b>pktoolsUtils</b></td><td class="desc"></td></tr>
+<tr id="row_5_14_16_0_" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2lastnode.png" alt="\" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classqgis_1_1pktools_1_1pktoolsUtils_1_1pktoolsUtils.html" target="_self">pktoolsUtils</a></td><td class="des [...]
+<tr id="row_5_14_17_" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img id="arr_5_14_17_" src="ftv2plastnode.png" alt="\" width="16" height="22" onclick="toggleFolder('5_14_17_')"/><img src="ftv2ns.png" alt="N" width="24" height="22" /><b>ProcessingPktoolsPlugin</b></td><td class="desc"></td></tr>
+<tr id="row_5_14_17_0_" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2blank.png" alt=" " width="16" height="22" /><img src="ftv2lastnode.png" alt="\" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classqgis_1_1pktools_1_1ProcessingPktoolsPlugin_1_1ProcessingPktoolsPlugin.html" target="_self">ProcessingP [...]
+<tr id="row_5_15_"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img id="arr_5_15_" src="ftv2pnode.png" alt="o" width="16" height="22" onclick="toggleFolder('5_15_')"/><img src="ftv2ns.png" alt="N" width="24" height="22" /><b>pktoolsAlgorithm</b></td><td class="desc"></td></tr>
+<tr id="row_5_15_0_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2lastnode.png" alt="\" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classqgis_1_1pktoolsAlgorithm_1_1pktoolsAlgorithm.html" target="_self">pktoolsAlgorithm</a></td><td class="desc"></td></tr>
+<tr id="row_5_16_" class="even"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img id="arr_5_16_" src="ftv2pnode.png" alt="o" width="16" height="22" onclick="toggleFolder('5_16_')"/><img src="ftv2ns.png" alt="N" width="24" height="22" /><b>pktoolsAlgorithmProvider</b></td><td class="desc"></td></tr>
+<tr id="row_5_16_0_" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2lastnode.png" alt="\" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classqgis_1_1pktoolsAlgorithmProvider_1_1pktoolsAlgorithmProvider.html" target="_self">pktoolsAlgorithmProvider</a></td><td class="desc"></td></tr>
+<tr id="row_5_17_"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img id="arr_5_17_" src="ftv2pnode.png" alt="o" width="16" height="22" onclick="toggleFolder('5_17_')"/><img src="ftv2ns.png" alt="N" width="24" height="22" /><b>pktoolsUtils</b></td><td class="desc"></td></tr>
+<tr id="row_5_17_0_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2lastnode.png" alt="\" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classqgis_1_1pktoolsUtils_1_1pktoolsUtils.html" target="_self">pktoolsUtils</a></td><td class="desc"></td></tr>
+<tr id="row_5_18_" class="even"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img id="arr_5_18_" src="ftv2plastnode.png" alt="\" width="16" height="22" onclick="toggleFolder('5_18_')"/><img src="ftv2ns.png" alt="N" width="24" height="22" /><b>ProcessingPktoolsPlugin</b></td><td class="desc"></td></tr>
+<tr id="row_5_18_0_" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2blank.png" alt=" " width="16" height="22" /><img src="ftv2lastnode.png" alt="\" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classqgis_1_1ProcessingPktoolsPlugin_1_1ProcessingPktoolsPlugin.html" target="_self">ProcessingPktoolsPlugin</a></td><td class="desc"></td></tr>
+<tr id="row_6_"><td class="entry"><img id="arr_6_" src="ftv2mnode.png" alt="o" width="16" height="22" onclick="toggleFolder('6_')"/><img src="ftv2ns.png" alt="N" width="24" height="22" /><b>statfactory</b></td><td class="desc"></td></tr>
+<tr id="row_6_0_" class="even"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2lastnode.png" alt="\" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classstatfactory_1_1StatFactory.html" target="_self">StatFactory</a></td><td class="desc"></td></tr>
+<tr id="row_7_"><td class="entry"><img id="arr_7_" src="ftv2mnode.png" alt="o" width="16" height="22" onclick="toggleFolder('7_')"/><img src="ftv2ns.png" alt="N" width="24" height="22" /><b>Ui</b></td><td class="desc"></td></tr>
+<tr id="row_7_0_" class="even"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2lastnode.png" alt="\" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classUi_1_1MainWindow.html" target="_self">MainWindow</a></td><td class="desc"></td></tr>
+<tr id="row_8_"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classBadConversion.html" target="_self">BadConversion</a></td><td class="desc">Throw this class when syntax error in command line option </td></tr>
+<tr id="row_9_" class="even"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classCache.html" target="_self">Cache</a></td><td class="desc"></td></tr>
+<tr id="row_10_"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classCompare__IndexValue.html" target="_self">Compare_IndexValue</a></td><td class="desc"></td></tr>
+<tr id="row_11_" class="even"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classCompare__PosValue.html" target="_self">Compare_PosValue</a></td><td class="desc"></td></tr>
+<tr id="row_12_"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classCostFactory.html" target="_self">CostFactory</a></td><td class="desc"></td></tr>
+<tr id="row_13_" class="even"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classCostFactoryANN.html" target="_self">CostFactoryANN</a></td><td class="desc"></td></tr>
+<tr id="row_14_"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classCostFactorySVM.html" target="_self">CostFactorySVM</a></td><td class="desc"></td></tr>
+<tr id="row_15_" class="even"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classDataModel.html" target="_self">DataModel</a></td><td class="desc"></td></tr>
+<tr id="row_16_"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="structdecision__function.html" target="_self">decision_function</a></td><td class="desc"></td></tr>
+<tr id="row_17_" class="even"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classDecrease__IndexValue.html" target="_self">Decrease_IndexValue</a></td><td class="desc"></td></tr>
+<tr id="row_18_"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classDecrease__PosValue.html" target="_self">Decrease_PosValue</a></td><td class="desc"></td></tr>
+<tr id="row_19_" class="even"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classEgcs.html" target="_self">Egcs</a></td><td class="desc"></td></tr>
+<tr id="row_20_"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classFeatureSelector.html" target="_self">FeatureSelector</a></td><td class="desc"></td></tr>
+<tr id="row_21_" class="even"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classFileReaderAscii.html" target="_self">FileReaderAscii</a></td><td class="desc"></td></tr>
+<tr id="row_22_"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classFileReaderLas.html" target="_self">FileReaderLas</a></td><td class="desc"></td></tr>
+<tr id="row_23_" class="even"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classImgReaderGdal.html" target="_self">ImgReaderGdal</a></td><td class="desc"></td></tr>
+<tr id="row_24_"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classImgReaderOgr.html" target="_self">ImgReaderOgr</a></td><td class="desc"></td></tr>
+<tr id="row_25_" class="even"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classImgWriterGdal.html" target="_self">ImgWriterGdal</a></td><td class="desc"></td></tr>
+<tr id="row_26_"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classImgWriterOgr.html" target="_self">ImgWriterOgr</a></td><td class="desc"></td></tr>
+<tr id="row_27_" class="even"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classIncrease__IndexValue.html" target="_self">Increase_IndexValue</a></td><td class="desc"></td></tr>
+<tr id="row_28_"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classIncrease__PosValue.html" target="_self">Increase_PosValue</a></td><td class="desc"></td></tr>
+<tr id="row_29_" class="even"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="structIndexValue.html" target="_self">IndexValue</a></td><td class="desc"></td></tr>
+<tr id="row_30_"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classKernel.html" target="_self">Kernel</a></td><td class="desc"></td></tr>
+<tr id="row_31_" class="even"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classLastReturnFilter.html" target="_self">LastReturnFilter</a></td><td class="desc"></td></tr>
+<tr id="row_32_"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classMainWindow.html" target="_self">MainWindow</a></td><td class="desc"></td></tr>
+<tr id="row_33_" class="even"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classONE__CLASS__Q.html" target="_self">ONE_CLASS_Q</a></td><td class="desc"></td></tr>
+<tr id="row_34_"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classOptFactory.html" target="_self">OptFactory</a></td><td class="desc"></td></tr>
+<tr id="row_35_" class="even"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classOptionpk.html" target="_self">Optionpk</a></td><td class="desc"></td></tr>
+<tr id="row_36_"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="structPosValue.html" target="_self">PosValue</a></td><td class="desc"></td></tr>
+<tr id="row_37_" class="even"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classQMatrix.html" target="_self">QMatrix</a></td><td class="desc"></td></tr>
+<tr id="row_38_"><td class="entry"><img id="arr_38_" src="ftv2mnode.png" alt="o" width="16" height="22" onclick="toggleFolder('38_')"/><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classSolver.html" target="_self">Solver</a></td><td class="desc"></td></tr>
+<tr id="row_38_0_" class="even"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2lastnode.png" alt="\" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="structSolver_1_1SolutionInfo.html" target="_self">SolutionInfo</a></td><td class="desc"></td></tr>
+<tr id="row_39_"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classSolver__NU.html" target="_self">Solver_NU</a></td><td class="desc"></td></tr>
+<tr id="row_40_" class="even"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classSVC__Q.html" target="_self">SVC_Q</a></td><td class="desc"></td></tr>
+<tr id="row_41_"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="structsvm__model.html" target="_self">svm_model</a></td><td class="desc"></td></tr>
+<tr id="row_42_" class="even"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="structsvm__node.html" target="_self">svm_node</a></td><td class="desc"></td></tr>
+<tr id="row_43_"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="structsvm__parameter.html" target="_self">svm_parameter</a></td><td class="desc"></td></tr>
+<tr id="row_44_" class="even"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="structsvm__problem.html" target="_self">svm_problem</a></td><td class="desc"></td></tr>
+<tr id="row_45_"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classSVR__Q.html" target="_self">SVR_Q</a></td><td class="desc"></td></tr>
+<tr id="row_46_" class="even"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classUi__MainWindow.html" target="_self">Ui_MainWindow</a></td><td class="desc"></td></tr>
+<tr id="row_47_"><td class="entry"><img src="ftv2lastnode.png" alt="\" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classVector2d.html" target="_self">Vector2d</a></td><td class="desc"></td></tr>
 </table>
 </div><!-- directory -->
 </div><!-- contents -->
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Jun 23 2015 17:09:37 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/build-pkcomposite__gui-gcc-Debug_2moc__mainwindow_8cpp_source.html b/doc/html/build-pkcomposite__gui-gcc-Debug_2moc__mainwindow_8cpp_source.html
index 48f679e..db39b7a 100644
--- a/doc/html/build-pkcomposite__gui-gcc-Debug_2moc__mainwindow_8cpp_source.html
+++ b/doc/html/build-pkcomposite__gui-gcc-Debug_2moc__mainwindow_8cpp_source.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.3</span>
+    <span id="projectnumber">2.6.4</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -186,7 +186,7 @@
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Jun 23 2015 17:09:36 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Tue Nov 3 2015 15:58:26 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/build-pkcomposite__gui-gcc-Debug_2ui__mainwindow_8h_source.html b/doc/html/build-pkcomposite__gui-gcc-Debug_2ui__mainwindow_8h_source.html
index 36632db..8d8a034 100644
--- a/doc/html/build-pkcomposite__gui-gcc-Debug_2ui__mainwindow_8h_source.html
+++ b/doc/html/build-pkcomposite__gui-gcc-Debug_2ui__mainwindow_8h_source.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.3</span>
+    <span id="projectnumber">2.6.4</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -766,7 +766,7 @@
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Jun 23 2015 17:09:36 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Tue Nov 3 2015 15:58:26 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/build-pkcomposite__gui-gcc-Release_2moc__mainwindow_8cpp_source.html b/doc/html/build-pkcomposite__gui-gcc-Release_2moc__mainwindow_8cpp_source.html
index 61bc130..e341439 100644
--- a/doc/html/build-pkcomposite__gui-gcc-Release_2moc__mainwindow_8cpp_source.html
+++ b/doc/html/build-pkcomposite__gui-gcc-Release_2moc__mainwindow_8cpp_source.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.3</span>
+    <span id="projectnumber">2.6.4</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -186,7 +186,7 @@
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Jun 23 2015 17:09:36 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Tue Nov 3 2015 15:58:26 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/build-pkcomposite__gui-gcc-Release_2ui__mainwindow_8h_source.html b/doc/html/build-pkcomposite__gui-gcc-Release_2ui__mainwindow_8h_source.html
index 16355d7..5c5a677 100644
--- a/doc/html/build-pkcomposite__gui-gcc-Release_2ui__mainwindow_8h_source.html
+++ b/doc/html/build-pkcomposite__gui-gcc-Release_2ui__mainwindow_8h_source.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.3</span>
+    <span id="projectnumber">2.6.4</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -765,7 +765,7 @@
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Jun 23 2015 17:09:36 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Tue Nov 3 2015 15:58:26 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/build-pkcrop__gui-gcc-Debug_2moc__mainwindow_8cpp_source.html b/doc/html/build-pkcrop__gui-gcc-Debug_2moc__mainwindow_8cpp_source.html
index a94b4d2..4bc1b0a 100644
--- a/doc/html/build-pkcrop__gui-gcc-Debug_2moc__mainwindow_8cpp_source.html
+++ b/doc/html/build-pkcrop__gui-gcc-Debug_2moc__mainwindow_8cpp_source.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.3</span>
+    <span id="projectnumber">2.6.4</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -190,7 +190,7 @@
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Jun 23 2015 17:09:36 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Tue Nov 3 2015 15:58:26 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/build-pkcrop__gui-gcc-Debug_2ui__mainwindow_8h_source.html b/doc/html/build-pkcrop__gui-gcc-Debug_2ui__mainwindow_8h_source.html
index 6990e7e..5279608 100644
--- a/doc/html/build-pkcrop__gui-gcc-Debug_2ui__mainwindow_8h_source.html
+++ b/doc/html/build-pkcrop__gui-gcc-Debug_2ui__mainwindow_8h_source.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.3</span>
+    <span id="projectnumber">2.6.4</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -786,7 +786,7 @@
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Jun 23 2015 17:09:36 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Tue Nov 3 2015 15:58:26 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/build-pkcrop__gui-gcc-Release_2moc__mainwindow_8cpp_source.html b/doc/html/build-pkcrop__gui-gcc-Release_2moc__mainwindow_8cpp_source.html
index 59131a1..2e43db9 100644
--- a/doc/html/build-pkcrop__gui-gcc-Release_2moc__mainwindow_8cpp_source.html
+++ b/doc/html/build-pkcrop__gui-gcc-Release_2moc__mainwindow_8cpp_source.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.3</span>
+    <span id="projectnumber">2.6.4</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -190,7 +190,7 @@
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Jun 23 2015 17:09:36 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Tue Nov 3 2015 15:58:26 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/build-pkcrop__gui-gcc-Release_2ui__mainwindow_8h_source.html b/doc/html/build-pkcrop__gui-gcc-Release_2ui__mainwindow_8h_source.html
index 26f8276..340d03d 100644
--- a/doc/html/build-pkcrop__gui-gcc-Release_2ui__mainwindow_8h_source.html
+++ b/doc/html/build-pkcrop__gui-gcc-Release_2ui__mainwindow_8h_source.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.3</span>
+    <span id="projectnumber">2.6.4</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -786,7 +786,7 @@
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Jun 23 2015 17:09:36 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Tue Nov 3 2015 15:58:26 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/build-pkdiff__gui-gcc-Debug_2moc__mainwindow_8cpp_source.html b/doc/html/build-pkdiff__gui-gcc-Debug_2moc__mainwindow_8cpp_source.html
index 98047d1..d0672ff 100644
--- a/doc/html/build-pkdiff__gui-gcc-Debug_2moc__mainwindow_8cpp_source.html
+++ b/doc/html/build-pkdiff__gui-gcc-Debug_2moc__mainwindow_8cpp_source.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.3</span>
+    <span id="projectnumber">2.6.4</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -180,7 +180,7 @@
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Jun 23 2015 17:09:36 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Tue Nov 3 2015 15:58:26 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/build-pkdiff__gui-gcc-Debug_2ui__mainwindow_8h_source.html b/doc/html/build-pkdiff__gui-gcc-Debug_2ui__mainwindow_8h_source.html
index ff8da6b..9bfa8eb 100644
--- a/doc/html/build-pkdiff__gui-gcc-Debug_2ui__mainwindow_8h_source.html
+++ b/doc/html/build-pkdiff__gui-gcc-Debug_2ui__mainwindow_8h_source.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.3</span>
+    <span id="projectnumber">2.6.4</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -499,7 +499,7 @@
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Jun 23 2015 17:09:36 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Tue Nov 3 2015 15:58:26 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/build-pkdiff__gui-gcc-Release_2moc__mainwindow_8cpp_source.html b/doc/html/build-pkdiff__gui-gcc-Release_2moc__mainwindow_8cpp_source.html
index 8e8db75..22ed84b 100644
--- a/doc/html/build-pkdiff__gui-gcc-Release_2moc__mainwindow_8cpp_source.html
+++ b/doc/html/build-pkdiff__gui-gcc-Release_2moc__mainwindow_8cpp_source.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.3</span>
+    <span id="projectnumber">2.6.4</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -180,7 +180,7 @@
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Jun 23 2015 17:09:36 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Tue Nov 3 2015 15:58:26 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/build-pkdiff__gui-gcc-Release_2ui__mainwindow_8h_source.html b/doc/html/build-pkdiff__gui-gcc-Release_2ui__mainwindow_8h_source.html
index b7d4fd1..9de4ba7 100644
--- a/doc/html/build-pkdiff__gui-gcc-Release_2ui__mainwindow_8h_source.html
+++ b/doc/html/build-pkdiff__gui-gcc-Release_2ui__mainwindow_8h_source.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.3</span>
+    <span id="projectnumber">2.6.4</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -499,7 +499,7 @@
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Jun 23 2015 17:09:36 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Tue Nov 3 2015 15:58:26 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/build-pkextract__gui-gcc-Debug_2moc__mainwindow_8cpp_source.html b/doc/html/build-pkextract__gui-gcc-Debug_2moc__mainwindow_8cpp_source.html
index 0f51a97..f359add 100644
--- a/doc/html/build-pkextract__gui-gcc-Debug_2moc__mainwindow_8cpp_source.html
+++ b/doc/html/build-pkextract__gui-gcc-Debug_2moc__mainwindow_8cpp_source.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.3</span>
+    <span id="projectnumber">2.6.4</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -174,7 +174,7 @@
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Jun 23 2015 17:09:36 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Tue Nov 3 2015 15:58:26 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/build-pkextract__gui-gcc-Debug_2ui__mainwindow_8h_source.html b/doc/html/build-pkextract__gui-gcc-Debug_2ui__mainwindow_8h_source.html
index eca7493..d641e6d 100644
--- a/doc/html/build-pkextract__gui-gcc-Debug_2ui__mainwindow_8h_source.html
+++ b/doc/html/build-pkextract__gui-gcc-Debug_2ui__mainwindow_8h_source.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.3</span>
+    <span id="projectnumber">2.6.4</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -574,7 +574,7 @@
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Jun 23 2015 17:09:36 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Tue Nov 3 2015 15:58:26 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/build-pkextract__gui-gcc-Release_2moc__mainwindow_8cpp_source.html b/doc/html/build-pkextract__gui-gcc-Release_2moc__mainwindow_8cpp_source.html
index cc78d56..8786911 100644
--- a/doc/html/build-pkextract__gui-gcc-Release_2moc__mainwindow_8cpp_source.html
+++ b/doc/html/build-pkextract__gui-gcc-Release_2moc__mainwindow_8cpp_source.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.3</span>
+    <span id="projectnumber">2.6.4</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -174,7 +174,7 @@
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Jun 23 2015 17:09:36 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Tue Nov 3 2015 15:58:26 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/build-pkextract__gui-gcc-Release_2ui__mainwindow_8h_source.html b/doc/html/build-pkextract__gui-gcc-Release_2ui__mainwindow_8h_source.html
index 8363e7d..5ecd607 100644
--- a/doc/html/build-pkextract__gui-gcc-Release_2ui__mainwindow_8h_source.html
+++ b/doc/html/build-pkextract__gui-gcc-Release_2ui__mainwindow_8h_source.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.3</span>
+    <span id="projectnumber">2.6.4</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -574,7 +574,7 @@
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Jun 23 2015 17:09:36 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Tue Nov 3 2015 15:58:26 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/build-pksvm__gui-gcc-Debug_2moc__mainwindow_8cpp_source.html b/doc/html/build-pksvm__gui-gcc-Debug_2moc__mainwindow_8cpp_source.html
index 5075183..ce6ef50 100644
--- a/doc/html/build-pksvm__gui-gcc-Debug_2moc__mainwindow_8cpp_source.html
+++ b/doc/html/build-pksvm__gui-gcc-Debug_2moc__mainwindow_8cpp_source.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.3</span>
+    <span id="projectnumber">2.6.4</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -189,7 +189,7 @@
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Jun 23 2015 17:09:36 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Tue Nov 3 2015 15:58:26 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/build-pksvm__gui-gcc-Debug_2ui__mainwindow_8h_source.html b/doc/html/build-pksvm__gui-gcc-Debug_2ui__mainwindow_8h_source.html
index 858eaf0..338b467 100644
--- a/doc/html/build-pksvm__gui-gcc-Debug_2ui__mainwindow_8h_source.html
+++ b/doc/html/build-pksvm__gui-gcc-Debug_2ui__mainwindow_8h_source.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.3</span>
+    <span id="projectnumber">2.6.4</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -724,7 +724,7 @@
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Jun 23 2015 17:09:36 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Tue Nov 3 2015 15:58:26 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/build-pksvm__gui-gcc-Release_2moc__mainwindow_8cpp_source.html b/doc/html/build-pksvm__gui-gcc-Release_2moc__mainwindow_8cpp_source.html
index 20e803e..8b2f7a9 100644
--- a/doc/html/build-pksvm__gui-gcc-Release_2moc__mainwindow_8cpp_source.html
+++ b/doc/html/build-pksvm__gui-gcc-Release_2moc__mainwindow_8cpp_source.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.3</span>
+    <span id="projectnumber">2.6.4</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -189,7 +189,7 @@
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Jun 23 2015 17:09:36 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Tue Nov 3 2015 15:58:26 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/build-pksvm__gui-gcc-Release_2ui__mainwindow_8h_source.html b/doc/html/build-pksvm__gui-gcc-Release_2ui__mainwindow_8h_source.html
index 8e6e894..6b7545c 100644
--- a/doc/html/build-pksvm__gui-gcc-Release_2ui__mainwindow_8h_source.html
+++ b/doc/html/build-pksvm__gui-gcc-Release_2ui__mainwindow_8h_source.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.3</span>
+    <span id="projectnumber">2.6.4</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -724,7 +724,7 @@
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Jun 23 2015 17:09:36 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Tue Nov 3 2015 15:58:26 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/classBadConversion-members.html b/doc/html/classBadConversion-members.html
index a56598c..498f9b4 100644
--- a/doc/html/classBadConversion-members.html
+++ b/doc/html/classBadConversion-members.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.3</span>
+    <span id="projectnumber">2.6.4</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -59,7 +59,7 @@
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Jun 23 2015 17:09:37 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/classBadConversion.html b/doc/html/classBadConversion.html
index e43dbaa..5e2b2ae 100644
--- a/doc/html/classBadConversion.html
+++ b/doc/html/classBadConversion.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.3</span>
+    <span id="projectnumber">2.6.4</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -91,7 +91,7 @@ Public Member Functions</h2></td></tr>
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Jun 23 2015 17:09:37 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/classCache-members.html b/doc/html/classCache-members.html
index e76c0d3..9515509 100644
--- a/doc/html/classCache-members.html
+++ b/doc/html/classCache-members.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.3</span>
+    <span id="projectnumber">2.6.4</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -62,7 +62,7 @@
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Jun 23 2015 17:09:37 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/classCache.html b/doc/html/classCache.html
index 0ed5a57..c3aecb5 100644
--- a/doc/html/classCache.html
+++ b/doc/html/classCache.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.3</span>
+    <span id="projectnumber">2.6.4</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -78,7 +78,7 @@ void </td><td class="memItemRight" valign="bottom"><b>swap_index</b> (int i
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Jun 23 2015 17:09:37 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/classCompare__IndexValue-members.html b/doc/html/classCompare__IndexValue-members.html
index 9e42e34..1c1b7d3 100644
--- a/doc/html/classCompare__IndexValue-members.html
+++ b/doc/html/classCompare__IndexValue-members.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.3</span>
+    <span id="projectnumber">2.6.4</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -59,7 +59,7 @@
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Jun 23 2015 17:09:37 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/classCompare__IndexValue.html b/doc/html/classCompare__IndexValue.html
index 066dd81..2c7c237 100644
--- a/doc/html/classCompare__IndexValue.html
+++ b/doc/html/classCompare__IndexValue.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.3</span>
+    <span id="projectnumber">2.6.4</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -71,7 +71,7 @@ int </td><td class="memItemRight" valign="bottom"><b>operator()</b> (const
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Jun 23 2015 17:09:37 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/classCompare__PosValue-members.html b/doc/html/classCompare__PosValue-members.html
index 073e5ef..f2cbcab 100644
--- a/doc/html/classCompare__PosValue-members.html
+++ b/doc/html/classCompare__PosValue-members.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.3</span>
+    <span id="projectnumber">2.6.4</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -59,7 +59,7 @@
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Jun 23 2015 17:09:37 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/classCompare__PosValue.html b/doc/html/classCompare__PosValue.html
index b292f58..4fe107f 100644
--- a/doc/html/classCompare__PosValue.html
+++ b/doc/html/classCompare__PosValue.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.3</span>
+    <span id="projectnumber">2.6.4</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -71,7 +71,7 @@ int </td><td class="memItemRight" valign="bottom"><b>operator()</b> (const
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Jun 23 2015 17:09:37 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/classCostFactory-members.html b/doc/html/classCostFactory-members.html
index 4b9e7cb..34d6885 100644
--- a/doc/html/classCostFactory-members.html
+++ b/doc/html/classCostFactory-members.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.3</span>
+    <span id="projectnumber">2.6.4</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -80,7 +80,7 @@
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Jun 23 2015 17:09:37 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/classCostFactory.html b/doc/html/classCostFactory.html
index 5577d52..58493db 100644
--- a/doc/html/classCostFactory.html
+++ b/doc/html/classCostFactory.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.3</span>
+    <span id="projectnumber">2.6.4</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -146,7 +146,7 @@ short </td><td class="memItemRight" valign="bottom"><b>m_verbose</b></td></
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Jun 23 2015 17:09:37 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/classCostFactoryANN-members.html b/doc/html/classCostFactoryANN-members.html
index f76ab0b..2ffbd5b 100644
--- a/doc/html/classCostFactoryANN-members.html
+++ b/doc/html/classCostFactoryANN-members.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.3</span>
+    <span id="projectnumber">2.6.4</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -83,7 +83,7 @@
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Jun 23 2015 17:09:37 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/classCostFactoryANN.html b/doc/html/classCostFactoryANN.html
index 1d02d0a..58ff49c 100644
--- a/doc/html/classCostFactoryANN.html
+++ b/doc/html/classCostFactoryANN.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.3</span>
+    <span id="projectnumber">2.6.4</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -151,7 +151,7 @@ short </td><td class="memItemRight" valign="bottom"><b>m_verbose</b></td></
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Jun 23 2015 17:09:37 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/classCostFactorySVM-members.html b/doc/html/classCostFactorySVM-members.html
index ee8138a..77daf4e 100644
--- a/doc/html/classCostFactorySVM-members.html
+++ b/doc/html/classCostFactorySVM-members.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.3</span>
+    <span id="projectnumber">2.6.4</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -83,7 +83,7 @@
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Jun 23 2015 17:09:37 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/classCostFactorySVM.html b/doc/html/classCostFactorySVM.html
index 17fc7fc..28aadd5 100644
--- a/doc/html/classCostFactorySVM.html
+++ b/doc/html/classCostFactorySVM.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.3</span>
+    <span id="projectnumber">2.6.4</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -151,7 +151,7 @@ short </td><td class="memItemRight" valign="bottom"><b>m_verbose</b></td></
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Jun 23 2015 17:09:37 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/classDataModel-members.html b/doc/html/classDataModel-members.html
index 708bbdb..5127847 100644
--- a/doc/html/classDataModel-members.html
+++ b/doc/html/classDataModel-members.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.3</span>
+    <span id="projectnumber">2.6.4</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -81,7 +81,7 @@
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Jun 23 2015 17:09:37 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/classDataModel.html b/doc/html/classDataModel.html
index e058699..b9a4061 100644
--- a/doc/html/classDataModel.html
+++ b/doc/html/classDataModel.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.3</span>
+    <span id="projectnumber">2.6.4</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -131,7 +131,7 @@ void </td><td class="memItemRight" valign="bottom"><b>setBoresightAtt</b> (
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Jun 23 2015 17:09:37 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/classDecrease__IndexValue-members.html b/doc/html/classDecrease__IndexValue-members.html
index 6710022..432ffa7 100644
--- a/doc/html/classDecrease__IndexValue-members.html
+++ b/doc/html/classDecrease__IndexValue-members.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.3</span>
+    <span id="projectnumber">2.6.4</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -59,7 +59,7 @@
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Jun 23 2015 17:09:37 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/classDecrease__IndexValue.html b/doc/html/classDecrease__IndexValue.html
index dff5d4d..268abb1 100644
--- a/doc/html/classDecrease__IndexValue.html
+++ b/doc/html/classDecrease__IndexValue.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.3</span>
+    <span id="projectnumber">2.6.4</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -71,7 +71,7 @@ int </td><td class="memItemRight" valign="bottom"><b>operator()</b> (const
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Jun 23 2015 17:09:37 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/classDecrease__PosValue-members.html b/doc/html/classDecrease__PosValue-members.html
index 9b32609..485ac3c 100644
--- a/doc/html/classDecrease__PosValue-members.html
+++ b/doc/html/classDecrease__PosValue-members.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.3</span>
+    <span id="projectnumber">2.6.4</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -59,7 +59,7 @@
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Jun 23 2015 17:09:37 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/classDecrease__PosValue.html b/doc/html/classDecrease__PosValue.html
index 7f91858..36c0eb0 100644
--- a/doc/html/classDecrease__PosValue.html
+++ b/doc/html/classDecrease__PosValue.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.3</span>
+    <span id="projectnumber">2.6.4</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -71,7 +71,7 @@ int </td><td class="memItemRight" valign="bottom"><b>operator()</b> (const
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Jun 23 2015 17:09:37 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/classEgcs-members.html b/doc/html/classEgcs-members.html
index 7688b51..7f2e0ea 100644
--- a/doc/html/classEgcs-members.html
+++ b/doc/html/classEgcs-members.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.3</span>
+    <span id="projectnumber">2.6.4</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -71,7 +71,7 @@
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Jun 23 2015 17:09:37 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/classEgcs.html b/doc/html/classEgcs.html
index c1e4da7..6b946d0 100644
--- a/doc/html/classEgcs.html
+++ b/doc/html/classEgcs.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.3</span>
+    <span id="projectnumber">2.6.4</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -102,7 +102,7 @@ void </td><td class="memItemRight" valign="bottom"><b>cell2mid</b> (const s
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Jun 23 2015 17:09:37 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/classFANN_1_1neural__net-members.html b/doc/html/classFANN_1_1neural__net-members.html
index f74a9b6..9f7d41f 100644
--- a/doc/html/classFANN_1_1neural__net-members.html
+++ b/doc/html/classFANN_1_1neural__net-members.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.3</span>
+    <span id="projectnumber">2.6.4</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -188,7 +188,7 @@
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Jun 23 2015 17:09:37 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/classFANN_1_1neural__net.html b/doc/html/classFANN_1_1neural__net.html
index 488fe30..1203659 100644
--- a/doc/html/classFANN_1_1neural__net.html
+++ b/doc/html/classFANN_1_1neural__net.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.3</span>
+    <span id="projectnumber">2.6.4</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -449,7 +449,7 @@ struct fann * </td><td class="memItemRight" valign="bottom"><b>ann</b></td>
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Jun 23 2015 17:09:37 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/classFANN_1_1training__data-members.html b/doc/html/classFANN_1_1training__data-members.html
index 0725795..80ce22c 100644
--- a/doc/html/classFANN_1_1training__data-members.html
+++ b/doc/html/classFANN_1_1training__data-members.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.3</span>
+    <span id="projectnumber">2.6.4</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -87,7 +87,7 @@
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Jun 23 2015 17:09:37 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/classFANN_1_1training__data.html b/doc/html/classFANN_1_1training__data.html
index 4c62b9d..63c66bc 100644
--- a/doc/html/classFANN_1_1training__data.html
+++ b/doc/html/classFANN_1_1training__data.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.3</span>
+    <span id="projectnumber">2.6.4</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -149,7 +149,7 @@ class </td><td class="memItemRight" valign="bottom"><b>neural_net</b></td><
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Jun 23 2015 17:09:37 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/classFeatureSelector-members.html b/doc/html/classFeatureSelector-members.html
index 7b6a8da..7e98315 100644
--- a/doc/html/classFeatureSelector-members.html
+++ b/doc/html/classFeatureSelector-members.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.3</span>
+    <span id="projectnumber">2.6.4</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -58,13 +58,13 @@
   <tr bgcolor="#f0f0f0"><td class="entry"><b>bruteForce</b>(std::vector< Vector2d< T > > &v, CostFactory &theCostFactory, std::list< int > &subset, int maxFeatures=0, short verbose=0) (defined in <a class="el" href="classFeatureSelector.html">FeatureSelector</a>)</td><td class="entry"><a class="el" href="classFeatureSelector.html">FeatureSelector</a></td><td class="entry"></td></tr>
   <tr bgcolor="#f0f0f0" class="even"><td class="entry"><b>FeatureSelector</b>() (defined in <a class="el" href="classFeatureSelector.html">FeatureSelector</a>)</td><td class="entry"><a class="el" href="classFeatureSelector.html">FeatureSelector</a></td><td class="entry"><span class="mlabel">inline</span></td></tr>
   <tr bgcolor="#f0f0f0"><td class="entry"><b>floating</b>(std::vector< Vector2d< T > > &v, CostFactory &theCostFactory, std::list< int > &subset, int maxFeatures=0, double epsilon=0.001, short verbose=0) (defined in <a class="el" href="classFeatureSelector.html">FeatureSelector</a>)</td><td class="entry"><a class="el" href="classFeatureSelector.html">FeatureSelector</a></td><td class="entry"></td></tr>
-  <tr bgcolor="#f0f0f0" class="even"><td class="entry"><b>forward</b>(std::vector< Vector2d< T > > &v, CostFactory &theCostFactory, std::list< int > &subset, int maxFeatures, short verbose=0) (defined in <a class="el" href="classFeatureSelector.html">FeatureSelector</a>)</td><td class="entry"><a class="el" href="classFeatureSelector.html">FeatureSelector</a></td><td class="entry"></td></tr>
+  <tr bgcolor="#f0f0f0" class="even"><td class="entry"><b>forward</b>(std::vector< Vector2d< T > > &v, CostFactory &theCostFactory, std::list< int > &subset, int maxFeatures=0, short verbose=0) (defined in <a class="el" href="classFeatureSelector.html">FeatureSelector</a>)</td><td class="entry"><a class="el" href="classFeatureSelector.html">FeatureSelector</a></td><td class="entry"></td></tr>
   <tr bgcolor="#f0f0f0"><td class="entry"><b>~FeatureSelector</b>() (defined in <a class="el" href="classFeatureSelector.html">FeatureSelector</a>)</td><td class="entry"><a class="el" href="classFeatureSelector.html">FeatureSelector</a></td><td class="entry"><span class="mlabel">inline</span></td></tr>
 </table></div><!-- contents -->
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Jun 23 2015 17:09:37 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/classFeatureSelector.html b/doc/html/classFeatureSelector.html
index 5446495..5285b1f 100644
--- a/doc/html/classFeatureSelector.html
+++ b/doc/html/classFeatureSelector.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.3</span>
+    <span id="projectnumber">2.6.4</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -57,10 +57,10 @@
 <table class="memberdecls">
 <tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pub-methods"></a>
 Public Member Functions</h2></td></tr>
-<tr class="memitem:a8d2432fabab0fd1da7925c5bac72cc6f"><td class="memTemplParams" colspan="2"><a class="anchor" id="a8d2432fabab0fd1da7925c5bac72cc6f"></a>
+<tr class="memitem:a0b3d6b2b0c5c0a41943a87cb69d1e357"><td class="memTemplParams" colspan="2"><a class="anchor" id="a0b3d6b2b0c5c0a41943a87cb69d1e357"></a>
 template<class T > </td></tr>
-<tr class="memitem:a8d2432fabab0fd1da7925c5bac72cc6f"><td class="memTemplItemLeft" align="right" valign="top">double </td><td class="memTemplItemRight" valign="bottom"><b>forward</b> (std::vector< <a class="el" href="classVector2d.html">Vector2d</a>< T > > &v, <a class="el" href="classCostFactory.html">CostFactory</a> &theCostFactory, std::list< int > &subset, int maxFeatures, short verbose=0)</td></tr>
-<tr class="separator:a8d2432fabab0fd1da7925c5bac72cc6f"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:a0b3d6b2b0c5c0a41943a87cb69d1e357"><td class="memTemplItemLeft" align="right" valign="top">double </td><td class="memTemplItemRight" valign="bottom"><b>forward</b> (std::vector< <a class="el" href="classVector2d.html">Vector2d</a>< T > > &v, <a class="el" href="classCostFactory.html">CostFactory</a> &theCostFactory, std::list< int > &subset, int maxFeatures=0, short verbose=0)</td></tr>
+<tr class="separator:a0b3d6b2b0c5c0a41943a87cb69d1e357"><td class="memSeparator" colspan="2"> </td></tr>
 <tr class="memitem:a545f5802b0019e625ad445b4c21f1903"><td class="memTemplParams" colspan="2"><a class="anchor" id="a545f5802b0019e625ad445b4c21f1903"></a>
 template<class T > </td></tr>
 <tr class="memitem:a545f5802b0019e625ad445b4c21f1903"><td class="memTemplItemLeft" align="right" valign="top">double </td><td class="memTemplItemRight" valign="bottom"><b>backward</b> (std::vector< <a class="el" href="classVector2d.html">Vector2d</a>< T > > &v, <a class="el" href="classCostFactory.html">CostFactory</a> &theCostFactory, std::list< int > &subset, int minFeatures, short verbose=0)</td></tr>
@@ -84,7 +84,7 @@ template<class T > </td></tr>
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Jun 23 2015 17:09:37 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/classFileReaderAscii-members.html b/doc/html/classFileReaderAscii-members.html
index be55335..0d7dd73 100644
--- a/doc/html/classFileReaderAscii-members.html
+++ b/doc/html/classFileReaderAscii-members.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.3</span>
+    <span id="projectnumber">2.6.4</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -81,7 +81,7 @@
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Jun 23 2015 17:09:37 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/classFileReaderAscii.html b/doc/html/classFileReaderAscii.html
index c37df4a..f075b6d 100644
--- a/doc/html/classFileReaderAscii.html
+++ b/doc/html/classFileReaderAscii.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.3</span>
+    <span id="projectnumber">2.6.4</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -145,7 +145,7 @@ int </td><td class="memItemRight" valign="bottom"><b>m_maxRow</b></td></tr>
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Jun 23 2015 17:09:37 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/classFileReaderLas-members.html b/doc/html/classFileReaderLas-members.html
index efaf19d..78fd7f2 100644
--- a/doc/html/classFileReaderLas-members.html
+++ b/doc/html/classFileReaderLas-members.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.3</span>
+    <span id="projectnumber">2.6.4</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -84,7 +84,7 @@
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Jun 23 2015 17:09:37 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/classFileReaderLas.html b/doc/html/classFileReaderLas.html
index cb2caef..5c8b034 100644
--- a/doc/html/classFileReaderLas.html
+++ b/doc/html/classFileReaderLas.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.3</span>
+    <span id="projectnumber">2.6.4</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -157,7 +157,7 @@ std::vector< liblas::FilterPtr > </td><td class="memItemRight" valign
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Jun 23 2015 17:09:37 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/classImgReaderGdal-members.html b/doc/html/classImgReaderGdal-members.html
index cf1c532..7c05998 100644
--- a/doc/html/classImgReaderGdal-members.html
+++ b/doc/html/classImgReaderGdal-members.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.3</span>
+    <span id="projectnumber">2.6.4</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -130,7 +130,7 @@
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Jun 23 2015 17:09:37 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/classImgReaderGdal.html b/doc/html/classImgReaderGdal.html
index 3370dda..2f3f4cc 100644
--- a/doc/html/classImgReaderGdal.html
+++ b/doc/html/classImgReaderGdal.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.3</span>
+    <span id="projectnumber">2.6.4</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -301,7 +301,7 @@ std::vector< double > </td><td class="memItemRight" valign="bottom"><
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Jun 23 2015 17:09:37 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/classImgReaderOgr-members.html b/doc/html/classImgReaderOgr-members.html
index 7e8b582..8995329 100644
--- a/doc/html/classImgReaderOgr-members.html
+++ b/doc/html/classImgReaderOgr-members.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.3</span>
+    <span id="projectnumber">2.6.4</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -82,7 +82,7 @@
   <tr bgcolor="#f0f0f0"><td class="entry"><b>readData</b>(std::map< int, Vector2d< T > > &data, const OGRFieldType &fieldType, std::vector< std::string > &fields, const std::string &label, int layer=0, bool pos=false, bool verbose=false) (defined in <a class="el" href="classImgReaderOgr.html">ImgReaderOgr</a>)</td><td class="entry"><a class="el" href="classImgReaderOgr.html">ImgReaderOgr</a></td><td class="entry"></td></tr>
   <tr bgcolor="#f0f0f0" class="even"><td class="entry"><b>readData</b>(std::map< std::string, Vector2d< T > > &data, const OGRFieldType &fieldType, std::vector< std::string > &fields, const std::string &label, int layer=0, bool pos=false, bool verbose=false) (defined in <a class="el" href="classImgReaderOgr.html">ImgReaderOgr</a>)</td><td class="entry"><a class="el" href="classImgReaderOgr.html">ImgReaderOgr</a></td><td class="entry"></td></tr>
   <tr bgcolor="#f0f0f0"><td class="entry"><b>readData</b>(std::vector< std::string > &data, const OGRFieldType &fieldType, const std::string &theField, int layer, bool verbose) (defined in <a class="el" href="classImgReaderOgr.html">ImgReaderOgr</a>)</td><td class="entry"><a class="el" href="classImgReaderOgr.html">ImgReaderOgr</a></td><td class="entry"><span class="mlabel">inline</span></td></tr>
-  <tr bgcolor="#f0f0f0" class="even"><td class="entry"><b>readDataImageOgr</b>(std::map< std::string, Vector2d< float > > &mapPixels, std::vector< std::string > &fields, const std::vector< short > &bands, const std::string &label, const std::vector< std::string > &layers, int verbose=false) (defined in <a class="el" href="classImgReaderOgr.html">ImgReaderOgr</a>)</td><td class="entry"><a class="el" href="classImgReaderOgr.html">ImgReaderO [...]
+  <tr bgcolor="#f0f0f0" class="even"><td class="entry"><b>readDataImageOgr</b>(std::map< std::string, Vector2d< float > > &mapPixels, std::vector< std::string > &fields, const std::vector< unsigned short > &bands, const std::string &label, const std::vector< std::string > &layers, int verbose=false) (defined in <a class="el" href="classImgReaderOgr.html">ImgReaderOgr</a>)</td><td class="entry"><a class="el" href="classImgReaderOgr.html">I [...]
   <tr bgcolor="#f0f0f0"><td class="entry"><b>readDataImageOgr</b>(std::map< std::string, Vector2d< float > > &mapPixels, std::vector< std::string > &fields, double start, double end, const std::string &label, const std::vector< std::string > &layers, int verbose=false) (defined in <a class="el" href="classImgReaderOgr.html">ImgReaderOgr</a>)</td><td class="entry"><a class="el" href="classImgReaderOgr.html">ImgReaderOgr</a></td><td class="entry"></td></tr>
   <tr bgcolor="#f0f0f0" class="even"><td class="entry"><b>readSql</b>(Vector2d< T > &data, const OGRFieldType &fieldType, std::vector< std::string > &fields, const std::string &sqlStatement, OGRGeometry *spatialFilter=NULL, int layer=0, bool pos=false, bool verbose=false) (defined in <a class="el" href="classImgReaderOgr.html">ImgReaderOgr</a>)</td><td class="entry"><a class="el" href="classImgReaderOgr.html">ImgReaderOgr</a></td><td class="entry"></td></tr>
   <tr bgcolor="#f0f0f0"><td class="entry"><b>readSql</b>(std::map< int, Vector2d< T > > &data, const OGRFieldType &fieldType, std::vector< std::string > &fields, const std::string &label, const std::string &sqlStatement, OGRGeometry *spatialFilter, int layer=0, bool pos=false, bool verbose=false) (defined in <a class="el" href="classImgReaderOgr.html">ImgReaderOgr</a>)</td><td class="entry"><a class="el" href="classImgReaderOgr.html">ImgReaderOgr</a> [...]
@@ -95,7 +95,7 @@
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Jun 23 2015 17:09:37 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/classImgReaderOgr.html b/doc/html/classImgReaderOgr.html
index 62ecd13..2b40cb3 100644
--- a/doc/html/classImgReaderOgr.html
+++ b/doc/html/classImgReaderOgr.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.3</span>
+    <span id="projectnumber">2.6.4</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -104,9 +104,9 @@ template<typename T > </td></tr>
 template<typename T > </td></tr>
 <tr class="memitem:a727233009401acf559927884f956c960"><td class="memTemplItemLeft" align="right" valign="top">int </td><td class="memTemplItemRight" valign="bottom"><b>readData</b> (std::map< std::string, <a class="el" href="classVector2d.html">Vector2d</a>< T > > &data, const OGRFieldType &fieldType, std::vector< std::string > &fields, const std::string &label, int layer=0, bool pos=false, bool verbose=false)</td></tr>
 <tr class="separator:a727233009401acf559927884f956c960"><td class="memSeparator" colspan="2"> </td></tr>
-<tr class="memitem:a93a29859caf6505737c59f5ac5b8d710"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a93a29859caf6505737c59f5ac5b8d710"></a>
-unsigned int </td><td class="memItemRight" valign="bottom"><b>readDataImageOgr</b> (std::map< std::string, <a class="el" href="classVector2d.html">Vector2d</a>< float > > &mapPixels, std::vector< std::string > &fields, const std::vector< short > &bands, const std::string &label, const std::vector< std::string > &layers, int verbose=false)</td></tr>
-<tr class="separator:a93a29859caf6505737c59f5ac5b8d710"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:a959371a0be15902ce68ff3a5f37ad950"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a959371a0be15902ce68ff3a5f37ad950"></a>
+unsigned int </td><td class="memItemRight" valign="bottom"><b>readDataImageOgr</b> (std::map< std::string, <a class="el" href="classVector2d.html">Vector2d</a>< float > > &mapPixels, std::vector< std::string > &fields, const std::vector< unsigned short > &bands, const std::string &label, const std::vector< std::string > &layers, int verbose=false)</td></tr>
+<tr class="separator:a959371a0be15902ce68ff3a5f37ad950"><td class="memSeparator" colspan="2"> </td></tr>
 <tr class="memitem:a1d15d5e9ac84c21eba3c026afe125afb"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a1d15d5e9ac84c21eba3c026afe125afb"></a>
 unsigned int </td><td class="memItemRight" valign="bottom"><b>readDataImageOgr</b> (std::map< std::string, <a class="el" href="classVector2d.html">Vector2d</a>< float > > &mapPixels, std::vector< std::string > &fields, double start, double end, const std::string &label, const std::vector< std::string > &layers, int verbose=false)</td></tr>
 <tr class="separator:a1d15d5e9ac84c21eba3c026afe125afb"><td class="memSeparator" colspan="2"> </td></tr>
@@ -203,7 +203,7 @@ std::ostream & </td><td class="memItemRight" valign="bottom"><b>operato
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Jun 23 2015 17:09:37 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/classImgWriterGdal-members.html b/doc/html/classImgWriterGdal-members.html
index 5b0a770..2c029b9 100644
--- a/doc/html/classImgWriterGdal-members.html
+++ b/doc/html/classImgWriterGdal-members.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.3</span>
+    <span id="projectnumber">2.6.4</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -108,7 +108,7 @@
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Jun 23 2015 17:09:37 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/classImgWriterGdal.html b/doc/html/classImgWriterGdal.html
index 69fd5e4..e064dfc 100644
--- a/doc/html/classImgWriterGdal.html
+++ b/doc/html/classImgWriterGdal.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.3</span>
+    <span id="projectnumber">2.6.4</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -232,7 +232,7 @@ std::vector< std::string > </td><td class="memItemRight" valign="bott
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Jun 23 2015 17:09:37 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/classImgWriterOgr-members.html b/doc/html/classImgWriterOgr-members.html
index 12530c1..0a8fa79 100644
--- a/doc/html/classImgWriterOgr-members.html
+++ b/doc/html/classImgWriterOgr-members.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.3</span>
+    <span id="projectnumber">2.6.4</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -91,7 +91,7 @@
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Jun 23 2015 17:09:37 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/classImgWriterOgr.html b/doc/html/classImgWriterOgr.html
index aac4763..1d6f8ff 100644
--- a/doc/html/classImgWriterOgr.html
+++ b/doc/html/classImgWriterOgr.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.3</span>
+    <span id="projectnumber">2.6.4</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -177,7 +177,7 @@ OGRDataSource * </td><td class="memItemRight" valign="bottom"><b>m_datasour
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Jun 23 2015 17:09:37 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/classIncrease__IndexValue-members.html b/doc/html/classIncrease__IndexValue-members.html
index 76b1185..fc67425 100644
--- a/doc/html/classIncrease__IndexValue-members.html
+++ b/doc/html/classIncrease__IndexValue-members.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.3</span>
+    <span id="projectnumber">2.6.4</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -59,7 +59,7 @@
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Jun 23 2015 17:09:37 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/classIncrease__IndexValue.html b/doc/html/classIncrease__IndexValue.html
index 356559f..bef62a5 100644
--- a/doc/html/classIncrease__IndexValue.html
+++ b/doc/html/classIncrease__IndexValue.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.3</span>
+    <span id="projectnumber">2.6.4</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -71,7 +71,7 @@ int </td><td class="memItemRight" valign="bottom"><b>operator()</b> (const
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Jun 23 2015 17:09:37 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/classIncrease__PosValue-members.html b/doc/html/classIncrease__PosValue-members.html
index 162bc70..7157a92 100644
--- a/doc/html/classIncrease__PosValue-members.html
+++ b/doc/html/classIncrease__PosValue-members.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.3</span>
+    <span id="projectnumber">2.6.4</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -59,7 +59,7 @@
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Jun 23 2015 17:09:37 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/classIncrease__PosValue.html b/doc/html/classIncrease__PosValue.html
index 7e43be9..6cb5ec8 100644
--- a/doc/html/classIncrease__PosValue.html
+++ b/doc/html/classIncrease__PosValue.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.3</span>
+    <span id="projectnumber">2.6.4</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -71,7 +71,7 @@ int </td><td class="memItemRight" valign="bottom"><b>operator()</b> (const
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Jun 23 2015 17:09:37 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/classKernel-members.html b/doc/html/classKernel-members.html
index 74175d0..d533475 100644
--- a/doc/html/classKernel-members.html
+++ b/doc/html/classKernel-members.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.3</span>
+    <span id="projectnumber">2.6.4</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -66,7 +66,7 @@
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Jun 23 2015 17:09:37 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/classKernel.html b/doc/html/classKernel.html
index b035b40..4b8ae61 100644
--- a/doc/html/classKernel.html
+++ b/doc/html/classKernel.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.3</span>
+    <span id="projectnumber">2.6.4</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -108,7 +108,7 @@ double(Kernel::* </td><td class="memItemRight" valign="bottom"><b>kernel_fu
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Jun 23 2015 17:09:37 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/classLastReturnFilter-members.html b/doc/html/classLastReturnFilter-members.html
index 8f79e65..8190c0e 100644
--- a/doc/html/classLastReturnFilter-members.html
+++ b/doc/html/classLastReturnFilter-members.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.3</span>
+    <span id="projectnumber">2.6.4</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -60,7 +60,7 @@
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Jun 23 2015 17:09:37 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/classLastReturnFilter.html b/doc/html/classLastReturnFilter.html
index 7fcd48c..b1b95a1 100644
--- a/doc/html/classLastReturnFilter.html
+++ b/doc/html/classLastReturnFilter.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.3</span>
+    <span id="projectnumber">2.6.4</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -82,7 +82,7 @@ bool </td><td class="memItemRight" valign="bottom"><b>filter</b> (const lib
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Jun 23 2015 17:09:37 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/classMainWindow-members.html b/doc/html/classMainWindow-members.html
index 44dda37..c884a6d 100644
--- a/doc/html/classMainWindow-members.html
+++ b/doc/html/classMainWindow-members.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.3</span>
+    <span id="projectnumber">2.6.4</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -68,7 +68,7 @@
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Jun 23 2015 17:09:37 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/classMainWindow.html b/doc/html/classMainWindow.html
index 308204c..1c93ede 100644
--- a/doc/html/classMainWindow.html
+++ b/doc/html/classMainWindow.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.3</span>
+    <span id="projectnumber">2.6.4</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -95,7 +95,7 @@ Public Member Functions</h2></td></tr>
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Jun 23 2015 17:09:37 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/classONE__CLASS__Q-members.html b/doc/html/classONE__CLASS__Q-members.html
index b169a4a..1cf7ee1 100644
--- a/doc/html/classONE__CLASS__Q-members.html
+++ b/doc/html/classONE__CLASS__Q-members.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.3</span>
+    <span id="projectnumber">2.6.4</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -68,7 +68,7 @@
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Jun 23 2015 17:09:37 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/classONE__CLASS__Q.html b/doc/html/classONE__CLASS__Q.html
index 224be63..e1ee438 100644
--- a/doc/html/classONE__CLASS__Q.html
+++ b/doc/html/classONE__CLASS__Q.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.3</span>
+    <span id="projectnumber">2.6.4</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -109,7 +109,7 @@ double(Kernel::* </td><td class="memItemRight" valign="bottom"><b>kernel_fu
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Jun 23 2015 17:09:37 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/classOptFactory-members.html b/doc/html/classOptFactory-members.html
index 98be087..6ca3d43 100644
--- a/doc/html/classOptFactory-members.html
+++ b/doc/html/classOptFactory-members.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.3</span>
+    <span id="projectnumber">2.6.4</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -61,7 +61,7 @@
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Jun 23 2015 17:09:37 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/classOptFactory.html b/doc/html/classOptFactory.html
index 832b590..ed2a6ef 100644
--- a/doc/html/classOptFactory.html
+++ b/doc/html/classOptFactory.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.3</span>
+    <span id="projectnumber">2.6.4</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -71,7 +71,7 @@ static nlopt::opt </td><td class="memItemRight" valign="bottom"><b>getOptim
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Jun 23 2015 17:09:37 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/classOptionpk-members.html b/doc/html/classOptionpk-members.html
index 2333a45..36a8d6d 100644
--- a/doc/html/classOptionpk-members.html
+++ b/doc/html/classOptionpk-members.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.3</span>
+    <span id="projectnumber">2.6.4</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -88,7 +88,7 @@
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Jun 23 2015 17:09:37 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/classOptionpk.html b/doc/html/classOptionpk.html
index 23134c2..4891ec7 100644
--- a/doc/html/classOptionpk.html
+++ b/doc/html/classOptionpk.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.3</span>
+    <span id="projectnumber">2.6.4</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -504,7 +504,7 @@ template<class T > </div>
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Jun 23 2015 17:09:37 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/classQMatrix-members.html b/doc/html/classQMatrix-members.html
index 3709e83..19e47a1 100644
--- a/doc/html/classQMatrix-members.html
+++ b/doc/html/classQMatrix-members.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.3</span>
+    <span id="projectnumber">2.6.4</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -62,7 +62,7 @@
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Jun 23 2015 17:09:37 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/classQMatrix.html b/doc/html/classQMatrix.html
index a7fc3fa..423c5be 100644
--- a/doc/html/classQMatrix.html
+++ b/doc/html/classQMatrix.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.3</span>
+    <span id="projectnumber">2.6.4</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -84,7 +84,7 @@ virtual void </td><td class="memItemRight" valign="bottom"><b>swap_index</b
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Jun 23 2015 17:09:37 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/classSVC__Q-members.html b/doc/html/classSVC__Q-members.html
index 38cc8f4..e91e617 100644
--- a/doc/html/classSVC__Q-members.html
+++ b/doc/html/classSVC__Q-members.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.3</span>
+    <span id="projectnumber">2.6.4</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -68,7 +68,7 @@
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Jun 23 2015 17:09:37 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/classSVC__Q.html b/doc/html/classSVC__Q.html
index 8aac902..e8b9bca 100644
--- a/doc/html/classSVC__Q.html
+++ b/doc/html/classSVC__Q.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.3</span>
+    <span id="projectnumber">2.6.4</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -109,7 +109,7 @@ double(Kernel::* </td><td class="memItemRight" valign="bottom"><b>kernel_fu
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Jun 23 2015 17:09:37 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/classSVR__Q-members.html b/doc/html/classSVR__Q-members.html
index d114ddf..15c495f 100644
--- a/doc/html/classSVR__Q-members.html
+++ b/doc/html/classSVR__Q-members.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.3</span>
+    <span id="projectnumber">2.6.4</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -68,7 +68,7 @@
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Jun 23 2015 17:09:37 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/classSVR__Q.html b/doc/html/classSVR__Q.html
index f6d477e..33d0adb 100644
--- a/doc/html/classSVR__Q.html
+++ b/doc/html/classSVR__Q.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.3</span>
+    <span id="projectnumber">2.6.4</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -109,7 +109,7 @@ double(Kernel::* </td><td class="memItemRight" valign="bottom"><b>kernel_fu
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Jun 23 2015 17:09:37 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/classSolver-members.html b/doc/html/classSolver-members.html
index c1ba2c2..cb3e57d 100644
--- a/doc/html/classSolver-members.html
+++ b/doc/html/classSolver-members.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.3</span>
+    <span id="projectnumber">2.6.4</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -89,7 +89,7 @@
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Jun 23 2015 17:09:37 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/classSolver.html b/doc/html/classSolver.html
index 0255434..806daf8 100644
--- a/doc/html/classSolver.html
+++ b/doc/html/classSolver.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.3</span>
+    <span id="projectnumber">2.6.4</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -183,7 +183,7 @@ bool </td><td class="memItemRight" valign="bottom"><b>unshrink</b></td></tr
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Jun 23 2015 17:09:37 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/classSolver__NU-members.html b/doc/html/classSolver__NU-members.html
index a1c3a57..81505a4 100644
--- a/doc/html/classSolver__NU-members.html
+++ b/doc/html/classSolver__NU-members.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.3</span>
+    <span id="projectnumber">2.6.4</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -87,7 +87,7 @@
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Jun 23 2015 17:09:37 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/classSolver__NU.html b/doc/html/classSolver__NU.html
index 39fc839..c98ed44 100644
--- a/doc/html/classSolver__NU.html
+++ b/doc/html/classSolver__NU.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.3</span>
+    <span id="projectnumber">2.6.4</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -166,7 +166,7 @@ bool </td><td class="memItemRight" valign="bottom"><b>unshrink</b></td></tr
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Jun 23 2015 17:09:37 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/classUi_1_1MainWindow-members.html b/doc/html/classUi_1_1MainWindow-members.html
index ae074a9..e428432 100644
--- a/doc/html/classUi_1_1MainWindow-members.html
+++ b/doc/html/classUi_1_1MainWindow-members.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.3</span>
+    <span id="projectnumber">2.6.4</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -246,7 +246,7 @@
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Jun 23 2015 17:09:37 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/classUi_1_1MainWindow.html b/doc/html/classUi_1_1MainWindow.html
index 61d0f4e..8a72c14 100644
--- a/doc/html/classUi_1_1MainWindow.html
+++ b/doc/html/classUi_1_1MainWindow.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.3</span>
+    <span id="projectnumber">2.6.4</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -639,7 +639,7 @@ QComboBox * </td><td class="memItemRight" valign="bottom"><b>kerneltype</b>
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Jun 23 2015 17:09:37 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/classUi__MainWindow-members.html b/doc/html/classUi__MainWindow-members.html
index 0acd357..06e3cc3 100644
--- a/doc/html/classUi__MainWindow-members.html
+++ b/doc/html/classUi__MainWindow-members.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.3</span>
+    <span id="projectnumber">2.6.4</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -242,7 +242,7 @@
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Jun 23 2015 17:09:37 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/classUi__MainWindow.html b/doc/html/classUi__MainWindow.html
index 3825104..2fa14e4 100644
--- a/doc/html/classUi__MainWindow.html
+++ b/doc/html/classUi__MainWindow.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.3</span>
+    <span id="projectnumber">2.6.4</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -631,7 +631,7 @@ QComboBox * </td><td class="memItemRight" valign="bottom"><b>kerneltype</b>
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Jun 23 2015 17:09:37 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/classVector2d-members.html b/doc/html/classVector2d-members.html
index a4255e5..08cf4d8 100644
--- a/doc/html/classVector2d-members.html
+++ b/doc/html/classVector2d-members.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.3</span>
+    <span id="projectnumber">2.6.4</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -85,7 +85,7 @@
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Jun 23 2015 17:09:37 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/classVector2d.html b/doc/html/classVector2d.html
index 80f35ff..d315fc1 100644
--- a/doc/html/classVector2d.html
+++ b/doc/html/classVector2d.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.3</span>
+    <span id="projectnumber">2.6.4</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -165,7 +165,7 @@ class Vector2d< T ></h3>
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Jun 23 2015 17:09:37 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/classconfusionmatrix_1_1ConfusionMatrix-members.html b/doc/html/classconfusionmatrix_1_1ConfusionMatrix-members.html
index 3bf78f8..c490811 100644
--- a/doc/html/classconfusionmatrix_1_1ConfusionMatrix-members.html
+++ b/doc/html/classconfusionmatrix_1_1ConfusionMatrix-members.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.3</span>
+    <span id="projectnumber">2.6.4</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -101,7 +101,7 @@
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Jun 23 2015 17:09:37 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/classconfusionmatrix_1_1ConfusionMatrix.html b/doc/html/classconfusionmatrix_1_1ConfusionMatrix.html
index 7932abd..70a4fca 100644
--- a/doc/html/classconfusionmatrix_1_1ConfusionMatrix.html
+++ b/doc/html/classconfusionmatrix_1_1ConfusionMatrix.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.3</span>
+    <span id="projectnumber">2.6.4</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -192,7 +192,7 @@ std::ostream & </td><td class="memItemRight" valign="bottom"><b>operato
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Jun 23 2015 17:09:37 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/classes.html b/doc/html/classes.html
index 368836b..d9e1bfd 100644
--- a/doc/html/classes.html
+++ b/doc/html/classes.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.3</span>
+    <span id="projectnumber">2.6.4</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -54,48 +54,50 @@
 <div class="qindex"><a class="qindex" href="#letter_B">B</a> | <a class="qindex" href="#letter_C">C</a> | <a class="qindex" href="#letter_D">D</a> | <a class="qindex" href="#letter_E">E</a> | <a class="qindex" href="#letter_F">F</a> | <a class="qindex" href="#letter_I">I</a> | <a class="qindex" href="#letter_K">K</a> | <a class="qindex" href="#letter_L">L</a> | <a class="qindex" href="#letter_M">M</a> |& [...]
 <table style="margin: 10px; white-space: nowrap;" align="center" width="95%" border="0" cellspacing="0" cellpadding="0">
 <tr><td rowspan="2" valign="bottom"><a name="letter_B"></a><table border="0" cellspacing="0" cellpadding="0"><tr><td><div class="ah">  B  </div></td></tr></table>
-</td><td valign="top"><a class="el" href="classFileReaderAscii.html">FileReaderAscii</a>   </td><td valign="top"><a class="el" href="classMainWindow.html">MainWindow</a>   </td><td rowspan="2" valign="bottom"><a name="letter_U"></a><table border="0" cellspacing="0" cellpadding="0"><tr><td><div class="ah">  U  </div></td></tr></table>
-</td><td valign="top"><a class="el" href="classqgis_1_1pkfilter__spectral_1_1pkfilter__spectral.html">pkfilter_spectral</a> (qgis.pkfilter_spectral)   </td></tr>
-<tr><td valign="top"><a class="el" href="classFileReaderLas.html">FileReaderLas</a>   </td><td rowspan="2" valign="bottom"><a name="letter_O"></a><table border="0" cellspacing="0" cellpadding="0"><tr><td><div class="ah">  O  </div></td></tr></table>
-</td><td valign="top"><a class="el" href="classqgis_1_1pkfilterdem_1_1pkfilterdem.html">pkfilterdem</a> (qgis.pkfilterdem)   </td></tr>
-<tr><td valign="top"><a class="el" href="classBadConversion.html">BadConversion</a>   </td><td valign="top"><a class="el" href="classfilter_1_1Filter.html">Filter</a> (filter)   </td><td valign="top"><a class="el" href="classUi__MainWindow.html">Ui_MainWindow</a>   </td><td valign="top"><a class="el" href="classqgis_1_1pkgetmask_1_1pkgetmask.html">pkgetmask</a> (qgis.pkgetmask)   </td></tr>
+</td><td valign="top"><a class="el" href="classFileReaderLas.html">FileReaderLas</a>   </td><td valign="top"><a class="el" href="classOptFactory.html">OptFactory</a>   </td><td rowspan="2" valign="bottom"><a name="letter_d"></a><table border="0" cellspacing="0" cellpadding="0"><tr><td><div class="ah">  d  </div></td></tr></table>
+</td><td valign="top"><a class="el" href="classqgis_1_1pktools_1_1pkfilterdem_1_1pkfilterdem.html">pkfilterdem</a> (qgis.pktools.pkfilterdem)   </td></tr>
+<tr><td valign="top"><a class="el" href="classfilter_1_1Filter.html">Filter</a> (filter)   </td><td valign="top"><a class="el" href="classOptionpk.html">Optionpk</a>   </td><td valign="top"><a class="el" href="classqgis_1_1pkfilterdem_1_1pkfilterdem.html">pkfilterdem</a> (qgis.pkfilterdem)   </td></tr>
+<tr><td valign="top"><a class="el" href="classBadConversion.html">BadConversion</a>   </td><td valign="top"><a class="el" href="classfilter2d_1_1Filter2d.html">Filter2d</a> (filter2d)   </td><td rowspan="2" valign="bottom"><a name="letter_P"></a><table border="0" cellspacing="0" cellpadding="0"><tr><td><div class="ah">  P  </div></td></tr></table>
+</td><td valign="top"><a class="el" href="structdecision__function.html">decision_function</a>   </td><td valign="top"><a class="el" href="classqgis_1_1pkgetmask_1_1pkgetmask.html">pkgetmask</a> (qgis.pkgetmask)   </td></tr>
 <tr><td rowspan="2" valign="bottom"><a name="letter_C"></a><table border="0" cellspacing="0" cellpadding="0"><tr><td><div class="ah">  C  </div></td></tr></table>
-</td><td valign="top"><a class="el" href="classfilter2d_1_1Filter2d.html">Filter2d</a> (filter2d)   </td><td valign="top"><a class="el" href="classONE__CLASS__Q.html">ONE_CLASS_Q</a>   </td><td rowspan="2" valign="bottom"><a name="letter_V"></a><table border="0" cellspacing="0" cellpadding="0"><tr><td><div class="ah">  V  </div></td></tr></table>
-</td><td valign="top"><a class="el" href="classqgis_1_1pklas2img_1_1pklas2img.html">pklas2img</a> (qgis.pklas2img)   </td></tr>
-<tr><td rowspan="2" valign="bottom"><a name="letter_I"></a><table border="0" cellspacing="0" cellpadding="0"><tr><td><div class="ah">  I  </div></td></tr></table>
-</td><td valign="top"><a class="el" href="classOptFactory.html">OptFactory</a>   </td><td valign="top"><a class="el" href="classqgis_1_1pkreclass_1_1pkreclass.html">pkreclass</a> (qgis.pkreclass)   </td></tr>
-<tr><td valign="top"><a class="el" href="classCache.html">Cache</a>   </td><td valign="top"><a class="el" href="classOptionpk.html">Optionpk</a>   </td><td valign="top"><a class="el" href="classVector2d.html">Vector2d</a>   </td><td valign="top"><a class="el" href="classqgis_1_1pksetmask_1_1pksetmask.html">pksetmask</a> (qgis.pksetmask)   </td></tr>
-<tr><td valign="top"><a class="el" href="classCompare__IndexValue.html">Compare_IndexValue</a>   </td><td valign="top"><a class="el" href="classImgReaderGdal.html">ImgReaderGdal</a>   </td><td rowspan="2" valign="bottom"><a name="letter_P"></a><table border="0" cellspacing="0" cellpadding="0"><tr><td><div class="ah">  P  </div></td></tr></table>
-</td><td rowspan="2" valign="bottom"><a name="letter_d"></a><table border="0" cellspacing="0" cellpadding="0"><tr><td><div class="ah">  d  </div></td></tr></table>
-</td><td valign="top"><a class="el" href="classqgis_1_1pksvm_1_1pksvm.html">pksvm</a> (qgis.pksvm)   </td></tr>
-<tr><td valign="top"><a class="el" href="classCompare__PosValue.html">Compare_PosValue</a>   </td><td valign="top"><a class="el" href="classImgReaderOgr.html">ImgReaderOgr</a>   </td><td valign="top"><a class="el" href="classqgis_1_1pktoolsAlgorithm_1_1pktoolsAlgorithm.html">pktoolsAlgorithm</a> (qgis.pktoolsAlgorithm)   </td></tr>
-<tr><td valign="top"><a class="el" href="classconfusionmatrix_1_1ConfusionMatrix.html">ConfusionMatrix</a> (confusionmatrix)   </td><td valign="top"><a class="el" href="classimgregression_1_1ImgRegression.html">ImgRegression</a> (imgregression)   </td><td valign="top"><a class="el" href="structPosValue.html">PosValue</a>   </td><td valign="top"><a class="el" href="structdecision__function.html">decision_function</a>   </td><td v [...]
-<tr><td valign="top"><a class="el" href="classCostFactory.html">CostFactory</a>   </td><td valign="top"><a class="el" href="classImgWriterGdal.html">ImgWriterGdal</a>   </td><td valign="top"><a class="el" href="classqgis_1_1ProcessingPktoolsPlugin_1_1ProcessingPktoolsPlugin.html">ProcessingPktoolsPlugin</a> (qgis.ProcessingPktoolsPlugin)   </td><td rowspan="2" valign="bottom"><a name="letter_n"></a><table border="0" cellspacing="0" cellpadding [...]
-</td><td valign="top"><a class="el" href="classqgis_1_1pktoolsUtils_1_1pktoolsUtils.html">pktoolsUtils</a> (qgis.pktoolsUtils)   </td></tr>
-<tr><td valign="top"><a class="el" href="classCostFactoryANN.html">CostFactoryANN</a>   </td><td valign="top"><a class="el" href="classImgWriterOgr.html">ImgWriterOgr</a>   </td><td rowspan="2" valign="bottom"><a name="letter_Q"></a><table border="0" cellspacing="0" cellpadding="0"><tr><td><div class="ah">  Q  </div></td></tr></table>
-</td><td rowspan="2" valign="bottom"><a name="letter_s"></a><table border="0" cellspacing="0" cellpadding="0"><tr><td><div class="ah">  s  </div></td></tr></table>
-</td></tr>
-<tr><td valign="top"><a class="el" href="classCostFactorySVM.html">CostFactorySVM</a>   </td><td valign="top"><a class="el" href="classIncrease__IndexValue.html">Increase_IndexValue</a>   </td><td valign="top"><a class="el" href="classFANN_1_1neural__net.html">neural_net</a> (FANN)   </td></tr>
+</td><td rowspan="2" valign="bottom"><a name="letter_I"></a><table border="0" cellspacing="0" cellpadding="0"><tr><td><div class="ah">  I  </div></td></tr></table>
+</td><td rowspan="2" valign="bottom"><a name="letter_n"></a><table border="0" cellspacing="0" cellpadding="0"><tr><td><div class="ah">  n  </div></td></tr></table>
+</td><td valign="top"><a class="el" href="classqgis_1_1pktools_1_1pkgetmask_1_1pkgetmask.html">pkgetmask</a> (qgis.pktools.pkgetmask)   </td></tr>
+<tr><td valign="top"><a class="el" href="structPosValue.html">PosValue</a>   </td><td valign="top"><a class="el" href="classqgis_1_1pktools_1_1pklas2img_1_1pklas2img.html">pklas2img</a> (qgis.pktools.pklas2img)   </td></tr>
+<tr><td valign="top"><a class="el" href="classCache.html">Cache</a>   </td><td valign="top"><a class="el" href="classImgReaderGdal.html">ImgReaderGdal</a>   </td><td valign="top"><a class="el" href="classqgis_1_1pktools_1_1ProcessingPktoolsPlugin_1_1ProcessingPktoolsPlugin.html">ProcessingPktoolsPlugin</a> (qgis.pktools.ProcessingPktoolsPlugin)   </td><td valign="top"><a class="el" href="classFANN_1_1neural__net.html">neural_net</a> (FANN)&#16 [...]
+<tr><td valign="top"><a class="el" href="classCompare__IndexValue.html">Compare_IndexValue</a>   </td><td valign="top"><a class="el" href="classImgReaderOgr.html">ImgReaderOgr</a>   </td><td valign="top"><a class="el" href="classqgis_1_1ProcessingPktoolsPlugin_1_1ProcessingPktoolsPlugin.html">ProcessingPktoolsPlugin</a> (qgis.ProcessingPktoolsPlugin)   </td><td rowspan="2" valign="bottom"><a name="letter_p"></a><table border="0" cellspacing="0 [...]
+</td><td valign="top"><a class="el" href="classqgis_1_1pkreclass_1_1pkreclass.html">pkreclass</a> (qgis.pkreclass)   </td></tr>
+<tr><td valign="top"><a class="el" href="classCompare__PosValue.html">Compare_PosValue</a>   </td><td valign="top"><a class="el" href="classimgregression_1_1ImgRegression.html">ImgRegression</a> (imgregression)   </td><td rowspan="2" valign="bottom"><a name="letter_Q"></a><table border="0" cellspacing="0" cellpadding="0"><tr><td><div class="ah">  Q  </div></td></tr></table>
+</td><td valign="top"><a class="el" href="classqgis_1_1pktools_1_1pkreclass_1_1pkreclass.html">pkreclass</a> (qgis.pktools.pkreclass)   </td></tr>
+<tr><td valign="top"><a class="el" href="classconfusionmatrix_1_1ConfusionMatrix.html">ConfusionMatrix</a> (confusionmatrix)   </td><td valign="top"><a class="el" href="classImgWriterGdal.html">ImgWriterGdal</a>   </td><td valign="top"><a class="el" href="classqgis_1_1pkcomposite_1_1pkcomposite.html">pkcomposite</a> (qgis.pkcomposite)   </td><td valign="top"><a class="el" href="classqgis_1_1pktools_1_1pksetmask_1_1pksetmask.html">pksetmask</a> [...]
+<tr><td valign="top"><a class="el" href="classCostFactory.html">CostFactory</a>   </td><td valign="top"><a class="el" href="classImgWriterOgr.html">ImgWriterOgr</a>   </td><td valign="top"><a class="el" href="classQMatrix.html">QMatrix</a>   </td><td valign="top"><a class="el" href="classqgis_1_1pktools_1_1pkcomposite_1_1pkcomposite.html">pkcomposite</a> (qgis.pktools.pkcomposite)   </td><td valign="top"><a class="el" href="clas [...]
+<tr><td valign="top"><a class="el" href="classCostFactoryANN.html">CostFactoryANN</a>   </td><td valign="top"><a class="el" href="classIncrease__IndexValue.html">Increase_IndexValue</a>   </td><td rowspan="2" valign="bottom"><a name="letter_S"></a><table border="0" cellspacing="0" cellpadding="0"><tr><td><div class="ah">  S  </div></td></tr></table>
+</td><td valign="top"><a class="el" href="classqgis_1_1pkcrop_1_1pkcrop.html">pkcrop</a> (qgis.pkcrop)   </td><td valign="top"><a class="el" href="classqgis_1_1pktools_1_1pksvm_1_1pksvm.html">pksvm</a> (qgis.pktools.pksvm)   </td></tr>
+<tr><td valign="top"><a class="el" href="classCostFactorySVM.html">CostFactorySVM</a>   </td><td valign="top"><a class="el" href="classIncrease__PosValue.html">Increase_PosValue</a>   </td><td valign="top"><a class="el" href="classqgis_1_1pktools_1_1pkcrop_1_1pkcrop.html">pkcrop</a> (qgis.pktools.pkcrop)   </td><td valign="top"><a class="el" href="classqgis_1_1pksvm_1_1pksvm.html">pksvm</a> (qgis.pksvm)   </td></tr>
 <tr><td rowspan="2" valign="bottom"><a name="letter_D"></a><table border="0" cellspacing="0" cellpadding="0"><tr><td><div class="ah">  D  </div></td></tr></table>
-</td><td valign="top"><a class="el" href="classIncrease__PosValue.html">Increase_PosValue</a>   </td><td valign="top"><a class="el" href="classQMatrix.html">QMatrix</a>   </td><td rowspan="2" valign="bottom"><a name="letter_p"></a><table border="0" cellspacing="0" cellpadding="0"><tr><td><div class="ah">  p  </div></td></tr></table>
-</td><td valign="top"><a class="el" href="structsvm__model.html">svm_model</a>   </td></tr>
-<tr><td valign="top"><a class="el" href="structIndexValue.html">IndexValue</a>   </td><td rowspan="2" valign="bottom"><a name="letter_S"></a><table border="0" cellspacing="0" cellpadding="0"><tr><td><div class="ah">  S  </div></td></tr></table>
-</td><td valign="top"><a class="el" href="structsvm__node.html">svm_node</a>   </td></tr>
-<tr><td valign="top"><a class="el" href="classDataModel.html">DataModel</a>   </td><td rowspan="2" valign="bottom"><a name="letter_K"></a><table border="0" cellspacing="0" cellpadding="0"><tr><td><div class="ah">  K  </div></td></tr></table>
-</td><td valign="top"><a class="el" href="classqgis_1_1pkcomposite_1_1pkcomposite.html">pkcomposite</a> (qgis.pkcomposite)   </td><td valign="top"><a class="el" href="structsvm__parameter.html">svm_parameter</a>   </td></tr>
-<tr><td valign="top"><a class="el" href="classDecrease__IndexValue.html">Decrease_IndexValue</a>   </td><td valign="top"><a class="el" href="structSolver_1_1SolutionInfo.html">Solver::SolutionInfo</a>   </td><td valign="top"><a class="el" href="classqgis_1_1pkcrop_1_1pkcrop.html">pkcrop</a> (qgis.pkcrop)   </td><td valign="top"><a class="el" href="structsvm__problem.html">svm_problem</a>   </td></tr>
-<tr><td valign="top"><a class="el" href="classDecrease__PosValue.html">Decrease_PosValue</a>   </td><td valign="top"><a class="el" href="classKernel.html">Kernel</a>   </td><td valign="top"><a class="el" href="classSolver.html">Solver</a>   </td><td valign="top"><a class="el" href="classqgis_1_1pkdiff__accuracy_1_1pkdiff__accuracy.html">pkdiff_accuracy</a> (qgis.pkdiff_accuracy)   </td><td rowspan="2" valign="bottom"><a name="le [...]
-</td></tr>
+</td><td valign="top"><a class="el" href="structIndexValue.html">IndexValue</a>   </td><td valign="top"><a class="el" href="structSolver_1_1SolutionInfo.html">Solver::SolutionInfo</a>   </td><td valign="top"><a class="el" href="classqgis_1_1pkdiff__accuracy_1_1pkdiff__accuracy.html">pkdiff_accuracy</a> (qgis.pkdiff_accuracy)   </td><td valign="top"><a class="el" href="classqgis_1_1pktools_1_1pktoolsAlgorithm_1_1pktoolsAlgorithm.html">pktoolsAl [...]
+<tr><td rowspan="2" valign="bottom"><a name="letter_K"></a><table border="0" cellspacing="0" cellpadding="0"><tr><td><div class="ah">  K  </div></td></tr></table>
+</td><td valign="top"><a class="el" href="classSolver.html">Solver</a>   </td><td valign="top"><a class="el" href="classqgis_1_1pktools_1_1pkdiff__accuracy_1_1pkdiff__accuracy.html">pkdiff_accuracy</a> (qgis.pktools.pkdiff_accuracy)   </td><td valign="top"><a class="el" href="classqgis_1_1pktoolsAlgorithm_1_1pktoolsAlgorithm.html">pktoolsAlgorithm</a> (qgis.pktoolsAlgorithm)   </td></tr>
+<tr><td valign="top"><a class="el" href="classDataModel.html">DataModel</a>   </td><td valign="top"><a class="el" href="classSolver__NU.html">Solver_NU</a>   </td><td valign="top"><a class="el" href="classqgis_1_1pkextract_1_1pkextract.html">pkextract</a> (qgis.pkextract)   </td><td valign="top"><a class="el" href="classqgis_1_1pktools_1_1pktoolsAlgorithmProvider_1_1pktoolsAlgorithmProvider.html">pktoolsAlgorithmProvider</a> (qgis.pktools.pkto [...]
+<tr><td valign="top"><a class="el" href="classDecrease__IndexValue.html">Decrease_IndexValue</a>   </td><td valign="top"><a class="el" href="classKernel.html">Kernel</a>   </td><td valign="top"><a class="el" href="classstatfactory_1_1StatFactory.html">StatFactory</a> (statfactory)   </td><td valign="top"><a class="el" href="classqgis_1_1pktools_1_1pkextract_1_1pkextract.html">pkextract</a> (qgis.pktools.pkextract)   </td><td val [...]
+<tr><td valign="top"><a class="el" href="classDecrease__PosValue.html">Decrease_PosValue</a>   </td><td rowspan="2" valign="bottom"><a name="letter_L"></a><table border="0" cellspacing="0" cellpadding="0"><tr><td><div class="ah">  L  </div></td></tr></table>
+</td><td valign="top"><a class="el" href="classSVC__Q.html">SVC_Q</a>   </td><td valign="top"><a class="el" href="classqgis_1_1pkextract__grid_1_1pkextract__grid.html">pkextract_grid</a> (qgis.pkextract_grid)   </td><td valign="top"><a class="el" href="classqgis_1_1pktoolsUtils_1_1pktoolsUtils.html">pktoolsUtils</a> (qgis.pktoolsUtils)   </td></tr>
 <tr><td rowspan="2" valign="bottom"><a name="letter_E"></a><table border="0" cellspacing="0" cellpadding="0"><tr><td><div class="ah">  E  </div></td></tr></table>
-</td><td rowspan="2" valign="bottom"><a name="letter_L"></a><table border="0" cellspacing="0" cellpadding="0"><tr><td><div class="ah">  L  </div></td></tr></table>
-</td><td valign="top"><a class="el" href="classSolver__NU.html">Solver_NU</a>   </td><td valign="top"><a class="el" href="classqgis_1_1pkextract_1_1pkextract.html">pkextract</a> (qgis.pkextract)   </td></tr>
-<tr><td valign="top"><a class="el" href="classstatfactory_1_1StatFactory.html">StatFactory</a> (statfactory)   </td><td valign="top"><a class="el" href="classqgis_1_1pkextract__grid_1_1pkextract__grid.html">pkextract_grid</a> (qgis.pkextract_grid)   </td><td valign="top"><a class="el" href="classFANN_1_1training__data.html">training_data</a> (FANN)   </td></tr>
-<tr><td valign="top"><a class="el" href="classEgcs.html">Egcs</a>   </td><td valign="top"><a class="el" href="classLastReturnFilter.html">LastReturnFilter</a>   </td><td valign="top"><a class="el" href="classSVC__Q.html">SVC_Q</a>   </td><td valign="top"><a class="el" href="classqgis_1_1pkextract__random_1_1pkextract__random.html">pkextract_random</a> (qgis.pkextract_random)   </td><td></td></tr>
+</td><td valign="top"><a class="el" href="classSVR__Q.html">SVR_Q</a>   </td><td valign="top"><a class="el" href="classqgis_1_1pktools_1_1pkextract__grid_1_1pkextract__grid.html">pkextract_grid</a> (qgis.pktools.pkextract_grid)   </td><td valign="top"><a class="el" href="classqgis_1_1pktools_1_1pktoolsUtils_1_1pktoolsUtils.html">pktoolsUtils</a> (qgis.pktools.pktoolsUtils)   </td></tr>
+<tr><td valign="top"><a class="el" href="classLastReturnFilter.html">LastReturnFilter</a>   </td><td rowspan="2" valign="bottom"><a name="letter_U"></a><table border="0" cellspacing="0" cellpadding="0"><tr><td><div class="ah">  U  </div></td></tr></table>
+</td><td valign="top"><a class="el" href="classqgis_1_1pkextract__random_1_1pkextract__random.html">pkextract_random</a> (qgis.pkextract_random)   </td><td rowspan="2" valign="bottom"><a name="letter_s"></a><table border="0" cellspacing="0" cellpadding="0"><tr><td><div class="ah">  s  </div></td></tr></table>
+</td></tr>
+<tr><td valign="top"><a class="el" href="classEgcs.html">Egcs</a>   </td><td rowspan="2" valign="bottom"><a name="letter_M"></a><table border="0" cellspacing="0" cellpadding="0"><tr><td><div class="ah">  M  </div></td></tr></table>
+</td><td valign="top"><a class="el" href="classqgis_1_1pktools_1_1pkextract__random_1_1pkextract__random.html">pkextract_random</a> (qgis.pktools.pkextract_random)   </td></tr>
 <tr><td rowspan="2" valign="bottom"><a name="letter_F"></a><table border="0" cellspacing="0" cellpadding="0"><tr><td><div class="ah">  F  </div></td></tr></table>
-</td><td rowspan="2" valign="bottom"><a name="letter_M"></a><table border="0" cellspacing="0" cellpadding="0"><tr><td><div class="ah">  M  </div></td></tr></table>
-</td><td valign="top"><a class="el" href="classSVR__Q.html">SVR_Q</a>   </td><td valign="top"><a class="el" href="classqgis_1_1pkfilter__spatial_1_1pkfilter__spatial.html">pkfilter_spatial</a> (qgis.pkfilter_spatial)   </td><td></td></tr>
-<tr><td></td><td></td><td></td></tr>
-<tr><td valign="top"><a class="el" href="classFeatureSelector.html">FeatureSelector</a>   </td><td valign="top"><a class="el" href="classUi_1_1MainWindow.html">MainWindow</a> (Ui)   </td><td></td><td></td><td></td></tr>
+</td><td valign="top"><a class="el" href="classUi__MainWindow.html">Ui_MainWindow</a>   </td><td valign="top"><a class="el" href="classqgis_1_1pkfilter__spatial_1_1pkfilter__spatial.html">pkfilter_spatial</a> (qgis.pkfilter_spatial)   </td><td valign="top"><a class="el" href="structsvm__model.html">svm_model</a>   </td></tr>
+<tr><td valign="top"><a class="el" href="classUi_1_1MainWindow.html">MainWindow</a> (Ui)   </td><td rowspan="2" valign="bottom"><a name="letter_V"></a><table border="0" cellspacing="0" cellpadding="0"><tr><td><div class="ah">  V  </div></td></tr></table>
+</td><td valign="top"><a class="el" href="classqgis_1_1pktools_1_1pkfilter__spatial_1_1pkfilter__spatial.html">pkfilter_spatial</a> (qgis.pktools.pkfilter_spatial)   </td><td valign="top"><a class="el" href="structsvm__node.html">svm_node</a>   </td></tr>
+<tr><td valign="top"><a class="el" href="classFeatureSelector.html">FeatureSelector</a>   </td><td valign="top"><a class="el" href="classMainWindow.html">MainWindow</a>   </td><td valign="top"><a class="el" href="classqgis_1_1pkfilter__spectral_1_1pkfilter__spectral.html">pkfilter_spectral</a> (qgis.pkfilter_spectral)   </td><td valign="top"><a class="el" href="structsvm__parameter.html">svm_parameter</a>   </td></tr>
+<tr><td valign="top"><a class="el" href="classFileReaderAscii.html">FileReaderAscii</a>   </td><td rowspan="2" valign="bottom"><a name="letter_O"></a><table border="0" cellspacing="0" cellpadding="0"><tr><td><div class="ah">  O  </div></td></tr></table>
+</td><td valign="top"><a class="el" href="classVector2d.html">Vector2d</a>   </td><td valign="top"><a class="el" href="classqgis_1_1pktools_1_1pkfilter__spectral_1_1pkfilter__spectral.html">pkfilter_spectral</a> (qgis.pktools.pkfilter_spectral)   </td><td valign="top"><a class="el" href="structsvm__problem.html">svm_problem</a>   </td></tr>
+<tr><td></td><td></td><td></td><td></td></tr>
+<tr><td></td><td valign="top"><a class="el" href="classONE__CLASS__Q.html">ONE_CLASS_Q</a>   </td><td></td><td></td><td></td></tr>
 <tr><td></td><td></td><td></td><td></td><td></td></tr>
 </table>
 <div class="qindex"><a class="qindex" href="#letter_B">B</a> | <a class="qindex" href="#letter_C">C</a> | <a class="qindex" href="#letter_D">D</a> | <a class="qindex" href="#letter_E">E</a> | <a class="qindex" href="#letter_F">F</a> | <a class="qindex" href="#letter_I">I</a> | <a class="qindex" href="#letter_K">K</a> | <a class="qindex" href="#letter_L">L</a> | <a class="qindex" href="#letter_M">M</a> |& [...]
@@ -103,7 +105,7 @@
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Jun 23 2015 17:09:37 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/classfilter2d_1_1Filter2d-members.html b/doc/html/classfilter2d_1_1Filter2d-members.html
index 3761daf..51cbd37 100644
--- a/doc/html/classfilter2d_1_1Filter2d-members.html
+++ b/doc/html/classfilter2d_1_1Filter2d-members.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.3</span>
+    <span id="projectnumber">2.6.4</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -108,7 +108,7 @@
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Jun 23 2015 17:09:37 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/classfilter2d_1_1Filter2d.html b/doc/html/classfilter2d_1_1Filter2d.html
index e6e057c..41ac098 100644
--- a/doc/html/classfilter2d_1_1Filter2d.html
+++ b/doc/html/classfilter2d_1_1Filter2d.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.3</span>
+    <span id="projectnumber">2.6.4</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -223,7 +223,7 @@ static const RESAMPLE </td><td class="memItemRight" valign="bottom"><b>getR
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Jun 23 2015 17:09:37 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/classfilter_1_1Filter-members.html b/doc/html/classfilter_1_1Filter-members.html
index 2f615bd..612e889 100644
--- a/doc/html/classfilter_1_1Filter-members.html
+++ b/doc/html/classfilter_1_1Filter-members.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.3</span>
+    <span id="projectnumber">2.6.4</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -135,7 +135,7 @@
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Jun 23 2015 17:09:37 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/classfilter_1_1Filter.html b/doc/html/classfilter_1_1Filter.html
index 54a024b..290f72f 100644
--- a/doc/html/classfilter_1_1Filter.html
+++ b/doc/html/classfilter_1_1Filter.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.3</span>
+    <span id="projectnumber">2.6.4</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -307,7 +307,7 @@ static FILTER_TYPE </td><td class="memItemRight" valign="bottom"><b>getFilt
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Jun 23 2015 17:09:37 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/classimgregression_1_1ImgRegression-members.html b/doc/html/classimgregression_1_1ImgRegression-members.html
index 04ab9ae..cc82c3a 100644
--- a/doc/html/classimgregression_1_1ImgRegression-members.html
+++ b/doc/html/classimgregression_1_1ImgRegression-members.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.3</span>
+    <span id="projectnumber">2.6.4</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -72,7 +72,7 @@
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Jun 23 2015 17:09:37 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/classimgregression_1_1ImgRegression.html b/doc/html/classimgregression_1_1ImgRegression.html
index 7a4af93..1faf630 100644
--- a/doc/html/classimgregression_1_1ImgRegression.html
+++ b/doc/html/classimgregression_1_1ImgRegression.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.3</span>
+    <span id="projectnumber">2.6.4</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -97,7 +97,7 @@ void </td><td class="memItemRight" valign="bottom"><b>setDown</b> (int theD
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Jun 23 2015 17:09:37 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/classqgis_1_1ProcessingPktoolsPlugin_1_1ProcessingPktoolsPlugin-members.html b/doc/html/classqgis_1_1ProcessingPktoolsPlugin_1_1ProcessingPktoolsPlugin-members.html
index 0d8935a..c24b7fe 100644
--- a/doc/html/classqgis_1_1ProcessingPktoolsPlugin_1_1ProcessingPktoolsPlugin-members.html
+++ b/doc/html/classqgis_1_1ProcessingPktoolsPlugin_1_1ProcessingPktoolsPlugin-members.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.3</span>
+    <span id="projectnumber">2.6.4</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -66,7 +66,7 @@
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Jun 23 2015 17:09:37 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/classqgis_1_1ProcessingPktoolsPlugin_1_1ProcessingPktoolsPlugin.html b/doc/html/classqgis_1_1ProcessingPktoolsPlugin_1_1ProcessingPktoolsPlugin.html
index 472837d..53395a8 100644
--- a/doc/html/classqgis_1_1ProcessingPktoolsPlugin_1_1ProcessingPktoolsPlugin.html
+++ b/doc/html/classqgis_1_1ProcessingPktoolsPlugin_1_1ProcessingPktoolsPlugin.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.3</span>
+    <span id="projectnumber">2.6.4</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -88,7 +88,7 @@ Public Attributes</h2></td></tr>
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Jun 23 2015 17:09:37 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/classqgis_1_1pkcomposite_1_1pkcomposite-members.html b/doc/html/classqgis_1_1pkcomposite_1_1pkcomposite-members.html
index b49da16..734757b 100644
--- a/doc/html/classqgis_1_1pkcomposite_1_1pkcomposite-members.html
+++ b/doc/html/classqgis_1_1pkcomposite_1_1pkcomposite-members.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.3</span>
+    <span id="projectnumber">2.6.4</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -85,7 +85,7 @@
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Jun 23 2015 17:09:37 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/classqgis_1_1pkcomposite_1_1pkcomposite.html b/doc/html/classqgis_1_1pkcomposite_1_1pkcomposite.html
index c979989..49509a9 100644
--- a/doc/html/classqgis_1_1pkcomposite_1_1pkcomposite.html
+++ b/doc/html/classqgis_1_1pkcomposite_1_1pkcomposite.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.3</span>
+    <span id="projectnumber">2.6.4</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -159,7 +159,7 @@ string </td><td class="memItemRight" valign="bottom"><b>EXTRA</b> = 'EXTRA'
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Jun 23 2015 17:09:37 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/classqgis_1_1pkcrop_1_1pkcrop-members.html b/doc/html/classqgis_1_1pkcrop_1_1pkcrop-members.html
index 7a7746a..1428829 100644
--- a/doc/html/classqgis_1_1pkcrop_1_1pkcrop-members.html
+++ b/doc/html/classqgis_1_1pkcrop_1_1pkcrop-members.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.3</span>
+    <span id="projectnumber">2.6.4</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -79,7 +79,7 @@
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Jun 23 2015 17:09:37 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/classqgis_1_1pkcrop_1_1pkcrop.html b/doc/html/classqgis_1_1pkcrop_1_1pkcrop.html
index ad87d5d..e80c2cb 100644
--- a/doc/html/classqgis_1_1pkcrop_1_1pkcrop.html
+++ b/doc/html/classqgis_1_1pkcrop_1_1pkcrop.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.3</span>
+    <span id="projectnumber">2.6.4</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -141,7 +141,7 @@ string </td><td class="memItemRight" valign="bottom"><b>EXTRA</b> = 'EXTRA'
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Jun 23 2015 17:09:37 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/classqgis_1_1pkdiff__accuracy_1_1pkdiff__accuracy-members.html b/doc/html/classqgis_1_1pkdiff__accuracy_1_1pkdiff__accuracy-members.html
index bd95ddf..b6b4423 100644
--- a/doc/html/classqgis_1_1pkdiff__accuracy_1_1pkdiff__accuracy-members.html
+++ b/doc/html/classqgis_1_1pkdiff__accuracy_1_1pkdiff__accuracy-members.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.3</span>
+    <span id="projectnumber">2.6.4</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -79,7 +79,7 @@
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Jun 23 2015 17:09:37 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/classqgis_1_1pkdiff__accuracy_1_1pkdiff__accuracy.html b/doc/html/classqgis_1_1pkdiff__accuracy_1_1pkdiff__accuracy.html
index 6dcc7cb..4dafc0f 100644
--- a/doc/html/classqgis_1_1pkdiff__accuracy_1_1pkdiff__accuracy.html
+++ b/doc/html/classqgis_1_1pkdiff__accuracy_1_1pkdiff__accuracy.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.3</span>
+    <span id="projectnumber">2.6.4</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -141,7 +141,7 @@ string </td><td class="memItemRight" valign="bottom"><b>EXTRA</b> = 'EXTRA'
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Jun 23 2015 17:09:37 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/classqgis_1_1pkextract_1_1pkextract-members.html b/doc/html/classqgis_1_1pkextract_1_1pkextract-members.html
index 36644fd..061a5db 100644
--- a/doc/html/classqgis_1_1pkextract_1_1pkextract-members.html
+++ b/doc/html/classqgis_1_1pkextract_1_1pkextract-members.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.3</span>
+    <span id="projectnumber">2.6.4</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -79,7 +79,7 @@
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Jun 23 2015 17:09:37 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/classqgis_1_1pkextract_1_1pkextract.html b/doc/html/classqgis_1_1pkextract_1_1pkextract.html
index 83e83b2..ad7463a 100644
--- a/doc/html/classqgis_1_1pkextract_1_1pkextract.html
+++ b/doc/html/classqgis_1_1pkextract_1_1pkextract.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.3</span>
+    <span id="projectnumber">2.6.4</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -107,7 +107,7 @@ string </td><td class="memItemRight" valign="bottom"><b>ITERATE</b> = &quot
 string </td><td class="memItemRight" valign="bottom"><b>OUTPUT</b> = "OUTPUT"</td></tr>
 <tr class="separator:aebb093e7f23d360f6657f8833f5c73f3"><td class="memSeparator" colspan="2"> </td></tr>
 <tr class="memitem:a78b93513da9f4173cd4218204a77d20a"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a78b93513da9f4173cd4218204a77d20a"></a>
-list </td><td class="memItemRight" valign="bottom"><b>RULE_OPTIONS</b> = ['centroid', 'point', 'mean', 'proportion', 'min', 'max', 'mode', 'sum', 'median', 'stdev', 'percentile']</td></tr>
+list </td><td class="memItemRight" valign="bottom"><b>RULE_OPTIONS</b> = ['centroid', 'point', 'mean', 'proportion', 'count', 'min', 'max', 'mode', 'sum', 'median', 'stdev', 'percentile']</td></tr>
 <tr class="separator:a78b93513da9f4173cd4218204a77d20a"><td class="memSeparator" colspan="2"> </td></tr>
 <tr class="memitem:af877cda3a19feb1f37d368d54680fd59"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="af877cda3a19feb1f37d368d54680fd59"></a>
 string </td><td class="memItemRight" valign="bottom"><b>RULE</b> = "RULE"</td></tr>
@@ -141,7 +141,7 @@ string </td><td class="memItemRight" valign="bottom"><b>FORMAT</b> = "
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Jun 23 2015 17:09:37 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/classqgis_1_1pkextract__grid_1_1pkextract__grid-members.html b/doc/html/classqgis_1_1pkextract__grid_1_1pkextract__grid-members.html
index 75fa1c3..7f3ddd1 100644
--- a/doc/html/classqgis_1_1pkextract__grid_1_1pkextract__grid-members.html
+++ b/doc/html/classqgis_1_1pkextract__grid_1_1pkextract__grid-members.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.3</span>
+    <span id="projectnumber">2.6.4</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -78,7 +78,7 @@
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Jun 23 2015 17:09:37 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/classqgis_1_1pkextract__grid_1_1pkextract__grid.html b/doc/html/classqgis_1_1pkextract__grid_1_1pkextract__grid.html
index aa6acf6..395d61f 100644
--- a/doc/html/classqgis_1_1pkextract__grid_1_1pkextract__grid.html
+++ b/doc/html/classqgis_1_1pkextract__grid_1_1pkextract__grid.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.3</span>
+    <span id="projectnumber">2.6.4</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -138,7 +138,7 @@ string </td><td class="memItemRight" valign="bottom"><b>FORMAT</b> = "
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Jun 23 2015 17:09:37 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/classqgis_1_1pkextract__random_1_1pkextract__random-members.html b/doc/html/classqgis_1_1pkextract__random_1_1pkextract__random-members.html
index 28f7526..37e84a7 100644
--- a/doc/html/classqgis_1_1pkextract__random_1_1pkextract__random-members.html
+++ b/doc/html/classqgis_1_1pkextract__random_1_1pkextract__random-members.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.3</span>
+    <span id="projectnumber">2.6.4</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -78,7 +78,7 @@
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Jun 23 2015 17:09:37 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/classqgis_1_1pkextract__random_1_1pkextract__random.html b/doc/html/classqgis_1_1pkextract__random_1_1pkextract__random.html
index 04a06d1..1a9e95a 100644
--- a/doc/html/classqgis_1_1pkextract__random_1_1pkextract__random.html
+++ b/doc/html/classqgis_1_1pkextract__random_1_1pkextract__random.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.3</span>
+    <span id="projectnumber">2.6.4</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -138,7 +138,7 @@ string </td><td class="memItemRight" valign="bottom"><b>FORMAT</b> = "
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Jun 23 2015 17:09:37 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/classqgis_1_1pkfilter__spatial_1_1pkfilter__spatial-members.html b/doc/html/classqgis_1_1pkfilter__spatial_1_1pkfilter__spatial-members.html
index d72d82a..353d1db 100644
--- a/doc/html/classqgis_1_1pkfilter__spatial_1_1pkfilter__spatial-members.html
+++ b/doc/html/classqgis_1_1pkfilter__spatial_1_1pkfilter__spatial-members.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.3</span>
+    <span id="projectnumber">2.6.4</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -78,7 +78,7 @@
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Jun 23 2015 17:09:37 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/classqgis_1_1pkfilter__spatial_1_1pkfilter__spatial.html b/doc/html/classqgis_1_1pkfilter__spatial_1_1pkfilter__spatial.html
index 3bdce2f..a322024 100644
--- a/doc/html/classqgis_1_1pkfilter__spatial_1_1pkfilter__spatial.html
+++ b/doc/html/classqgis_1_1pkfilter__spatial_1_1pkfilter__spatial.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.3</span>
+    <span id="projectnumber">2.6.4</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -138,7 +138,7 @@ string </td><td class="memItemRight" valign="bottom"><b>EXTRA</b> = 'EXTRA'
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Jun 23 2015 17:09:37 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/classqgis_1_1pkfilter__spectral_1_1pkfilter__spectral-members.html b/doc/html/classqgis_1_1pkfilter__spectral_1_1pkfilter__spectral-members.html
index 0479574..3f07667 100644
--- a/doc/html/classqgis_1_1pkfilter__spectral_1_1pkfilter__spectral-members.html
+++ b/doc/html/classqgis_1_1pkfilter__spectral_1_1pkfilter__spectral-members.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.3</span>
+    <span id="projectnumber">2.6.4</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -78,7 +78,7 @@
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Jun 23 2015 17:09:37 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/classqgis_1_1pkfilter__spectral_1_1pkfilter__spectral.html b/doc/html/classqgis_1_1pkfilter__spectral_1_1pkfilter__spectral.html
index 2682955..89d0cd0 100644
--- a/doc/html/classqgis_1_1pkfilter__spectral_1_1pkfilter__spectral.html
+++ b/doc/html/classqgis_1_1pkfilter__spectral_1_1pkfilter__spectral.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.3</span>
+    <span id="projectnumber">2.6.4</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -138,7 +138,7 @@ string </td><td class="memItemRight" valign="bottom"><b>EXTRA</b> = 'EXTRA'
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Jun 23 2015 17:09:37 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/classqgis_1_1pkfilterdem_1_1pkfilterdem-members.html b/doc/html/classqgis_1_1pkfilterdem_1_1pkfilterdem-members.html
index 1fe1f7f..8bc1311 100644
--- a/doc/html/classqgis_1_1pkfilterdem_1_1pkfilterdem-members.html
+++ b/doc/html/classqgis_1_1pkfilterdem_1_1pkfilterdem-members.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.3</span>
+    <span id="projectnumber">2.6.4</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -75,7 +75,7 @@
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Jun 23 2015 17:09:37 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/classqgis_1_1pkfilterdem_1_1pkfilterdem.html b/doc/html/classqgis_1_1pkfilterdem_1_1pkfilterdem.html
index ce98f69..31a8c99 100644
--- a/doc/html/classqgis_1_1pkfilterdem_1_1pkfilterdem.html
+++ b/doc/html/classqgis_1_1pkfilterdem_1_1pkfilterdem.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.3</span>
+    <span id="projectnumber">2.6.4</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -129,7 +129,7 @@ string </td><td class="memItemRight" valign="bottom"><b>EXTRA</b> = 'EXTRA'
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Jun 23 2015 17:09:37 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/classqgis_1_1pkgetmask_1_1pkgetmask-members.html b/doc/html/classqgis_1_1pkgetmask_1_1pkgetmask-members.html
index de6cd2d..769541d 100644
--- a/doc/html/classqgis_1_1pkgetmask_1_1pkgetmask-members.html
+++ b/doc/html/classqgis_1_1pkgetmask_1_1pkgetmask-members.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.3</span>
+    <span id="projectnumber">2.6.4</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -79,7 +79,7 @@
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Jun 23 2015 17:09:37 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/classqgis_1_1pkgetmask_1_1pkgetmask.html b/doc/html/classqgis_1_1pkgetmask_1_1pkgetmask.html
index fe8ce80..4c976fd 100644
--- a/doc/html/classqgis_1_1pkgetmask_1_1pkgetmask.html
+++ b/doc/html/classqgis_1_1pkgetmask_1_1pkgetmask.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.3</span>
+    <span id="projectnumber">2.6.4</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -141,7 +141,7 @@ string </td><td class="memItemRight" valign="bottom"><b>EXTRA</b> = 'EXTRA'
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Jun 23 2015 17:09:37 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/classqgis_1_1pklas2img_1_1pklas2img-members.html b/doc/html/classqgis_1_1pklas2img_1_1pklas2img-members.html
index bc22529..f6c8171 100644
--- a/doc/html/classqgis_1_1pklas2img_1_1pklas2img-members.html
+++ b/doc/html/classqgis_1_1pklas2img_1_1pklas2img-members.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.3</span>
+    <span id="projectnumber">2.6.4</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -82,7 +82,7 @@
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Jun 23 2015 17:09:37 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/classqgis_1_1pklas2img_1_1pklas2img.html b/doc/html/classqgis_1_1pklas2img_1_1pklas2img.html
index 841b8f2..bfc29f8 100644
--- a/doc/html/classqgis_1_1pklas2img_1_1pklas2img.html
+++ b/doc/html/classqgis_1_1pklas2img_1_1pklas2img.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.3</span>
+    <span id="projectnumber">2.6.4</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -150,7 +150,7 @@ string </td><td class="memItemRight" valign="bottom"><b>EXTRA</b> = 'EXTRA'
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Jun 23 2015 17:09:37 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/classqgis_1_1pkreclass_1_1pkreclass-members.html b/doc/html/classqgis_1_1pkreclass_1_1pkreclass-members.html
index 2f87a07..506f9a1 100644
--- a/doc/html/classqgis_1_1pkreclass_1_1pkreclass-members.html
+++ b/doc/html/classqgis_1_1pkreclass_1_1pkreclass-members.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.3</span>
+    <span id="projectnumber">2.6.4</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -78,7 +78,7 @@
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Jun 23 2015 17:09:37 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/classqgis_1_1pkreclass_1_1pkreclass.html b/doc/html/classqgis_1_1pkreclass_1_1pkreclass.html
index 8dcdf80..0635cf6 100644
--- a/doc/html/classqgis_1_1pkreclass_1_1pkreclass.html
+++ b/doc/html/classqgis_1_1pkreclass_1_1pkreclass.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.3</span>
+    <span id="projectnumber">2.6.4</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -138,7 +138,7 @@ string </td><td class="memItemRight" valign="bottom"><b>EXTRA</b> = 'EXTRA'
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Jun 23 2015 17:09:37 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/classqgis_1_1pksetmask_1_1pksetmask-members.html b/doc/html/classqgis_1_1pksetmask_1_1pksetmask-members.html
index e18d11b..8e13e8b 100644
--- a/doc/html/classqgis_1_1pksetmask_1_1pksetmask-members.html
+++ b/doc/html/classqgis_1_1pksetmask_1_1pksetmask-members.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.3</span>
+    <span id="projectnumber">2.6.4</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -78,7 +78,7 @@
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Jun 23 2015 17:09:37 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/classqgis_1_1pksetmask_1_1pksetmask.html b/doc/html/classqgis_1_1pksetmask_1_1pksetmask.html
index 1f35eb3..fa81c7a 100644
--- a/doc/html/classqgis_1_1pksetmask_1_1pksetmask.html
+++ b/doc/html/classqgis_1_1pksetmask_1_1pksetmask.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.3</span>
+    <span id="projectnumber">2.6.4</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -138,7 +138,7 @@ string </td><td class="memItemRight" valign="bottom"><b>EXTRA</b> = 'EXTRA'
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Jun 23 2015 17:09:37 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/classqgis_1_1pksvm_1_1pksvm-members.html b/doc/html/classqgis_1_1pksvm_1_1pksvm-members.html
index b8aceb6..d10e083 100644
--- a/doc/html/classqgis_1_1pksvm_1_1pksvm-members.html
+++ b/doc/html/classqgis_1_1pksvm_1_1pksvm-members.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.3</span>
+    <span id="projectnumber">2.6.4</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -77,7 +77,7 @@
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Jun 23 2015 17:09:37 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/classqgis_1_1pksvm_1_1pksvm.html b/doc/html/classqgis_1_1pksvm_1_1pksvm.html
index f18d2e2..48f803a 100644
--- a/doc/html/classqgis_1_1pksvm_1_1pksvm.html
+++ b/doc/html/classqgis_1_1pksvm_1_1pksvm.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.3</span>
+    <span id="projectnumber">2.6.4</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -127,7 +127,7 @@ string </td><td class="memItemRight" valign="bottom"><b>EXTRA</b> = 'EXTRA'
 </table>
 <a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
 <div class="textblock">
-<p>Definition at line <a class="el" href="pksvm_8py_source.html#l00039">39</a> of file <a class="el" href="pksvm_8py_source.html">pksvm.py</a>.</p>
+<p>Definition at line <a class="el" href="pksvm_8py_source.html#l00040">40</a> of file <a class="el" href="pksvm_8py_source.html">pksvm.py</a>.</p>
 </div><hr/>The documentation for this class was generated from the following file:<ul>
 <li>/home/kempenep/pktools/qgis/<a class="el" href="pksvm_8py_source.html">pksvm.py</a></li>
 </ul>
@@ -135,7 +135,7 @@ string </td><td class="memItemRight" valign="bottom"><b>EXTRA</b> = 'EXTRA'
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Jun 23 2015 17:09:37 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/classqgis_1_1pktoolsAlgorithmProvider_1_1pktoolsAlgorithmProvider.html b/doc/html/classqgis_1_1pktoolsAlgorithmProvider_1_1pktoolsAlgorithmProvider.html
index f2ed049..2615d89 100644
--- a/doc/html/classqgis_1_1pktoolsAlgorithmProvider_1_1pktoolsAlgorithmProvider.html
+++ b/doc/html/classqgis_1_1pktoolsAlgorithmProvider_1_1pktoolsAlgorithmProvider.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.3</span>
+    <span id="projectnumber">2.6.4</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -235,7 +235,7 @@ when the plugin is unloaded</pre>
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Jun 23 2015 17:09:37 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/classqgis_1_1pktoolsAlgorithm_1_1pktoolsAlgorithm-members.html b/doc/html/classqgis_1_1pktoolsAlgorithm_1_1pktoolsAlgorithm-members.html
index 1492558..53af5e8 100644
--- a/doc/html/classqgis_1_1pktoolsAlgorithm_1_1pktoolsAlgorithm-members.html
+++ b/doc/html/classqgis_1_1pktoolsAlgorithm_1_1pktoolsAlgorithm-members.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.3</span>
+    <span id="projectnumber">2.6.4</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -65,7 +65,7 @@
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Jun 23 2015 17:09:37 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/classqgis_1_1pktoolsAlgorithm_1_1pktoolsAlgorithm.html b/doc/html/classqgis_1_1pktoolsAlgorithm_1_1pktoolsAlgorithm.html
index a6c6e6c..38c14ec 100644
--- a/doc/html/classqgis_1_1pktoolsAlgorithm_1_1pktoolsAlgorithm.html
+++ b/doc/html/classqgis_1_1pktoolsAlgorithm_1_1pktoolsAlgorithm.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.3</span>
+    <span id="projectnumber">2.6.4</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -91,7 +91,7 @@ def </td><td class="memItemRight" valign="bottom"><b>help</b></td></tr>
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Jun 23 2015 17:09:37 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/classqgis_1_1pktoolsUtils_1_1pktoolsUtils-members.html b/doc/html/classqgis_1_1pktoolsUtils_1_1pktoolsUtils-members.html
index 2617f59..cfb4819 100644
--- a/doc/html/classqgis_1_1pktoolsUtils_1_1pktoolsUtils-members.html
+++ b/doc/html/classqgis_1_1pktoolsUtils_1_1pktoolsUtils-members.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.3</span>
+    <span id="projectnumber">2.6.4</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -65,7 +65,7 @@
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Jun 23 2015 17:09:37 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/classqgis_1_1pktoolsUtils_1_1pktoolsUtils.html b/doc/html/classqgis_1_1pktoolsUtils_1_1pktoolsUtils.html
index 755314c..c95a86e 100644
--- a/doc/html/classqgis_1_1pktoolsUtils_1_1pktoolsUtils.html
+++ b/doc/html/classqgis_1_1pktoolsUtils_1_1pktoolsUtils.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.3</span>
+    <span id="projectnumber">2.6.4</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -85,7 +85,7 @@ string </td><td class="memItemRight" valign="bottom"><b>PKTOOLS_FOLDER</b>
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Jun 23 2015 17:09:37 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/classqgis_1_1pktools_1_1pkcomposite_1_1pkcomposite-members.html b/doc/html/classqgis_1_1pktools_1_1pkcomposite_1_1pkcomposite-members.html
new file mode 100644
index 0000000..5128852
--- /dev/null
+++ b/doc/html/classqgis_1_1pktools_1_1pkcomposite_1_1pkcomposite-members.html
@@ -0,0 +1,101 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.6"/>
+<title>pktools: Member List</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+  <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
+  <td style="padding-left: 0.5em;">
+   <div id="projectname">pktools
+    <span id="projectnumber">2.6.4</span>
+   </div>
+   <div id="projectbrief">Processing Kernel for geospatial data</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.6 -->
+  <div id="navrow1" class="tabs">
+    <ul class="tablist">
+      <li><a href="index.html"><span>Main Page</span></a></li>
+      <li><a href="pages.html"><span>Related Pages</span></a></li>
+      <li class="current"><a href="annotated.html"><span>Classes</span></a></li>
+      <li><a href="files.html"><span>Files</span></a></li>
+    </ul>
+  </div>
+  <div id="navrow2" class="tabs2">
+    <ul class="tablist">
+      <li><a href="annotated.html"><span>Class List</span></a></li>
+      <li><a href="classes.html"><span>Class Index</span></a></li>
+      <li><a href="inherits.html"><span>Class Hierarchy</span></a></li>
+      <li><a href="functions.html"><span>Class Members</span></a></li>
+    </ul>
+  </div>
+<div id="nav-path" class="navpath">
+  <ul>
+<li class="navelem"><b>qgis</b></li><li class="navelem"><b>pktools</b></li><li class="navelem"><b>pkcomposite</b></li><li class="navelem"><a class="el" href="classqgis_1_1pktools_1_1pkcomposite_1_1pkcomposite.html">pkcomposite</a></li>  </ul>
+</div>
+</div><!-- top -->
+<div class="header">
+  <div class="headertitle">
+<div class="title">qgis.pktools.pkcomposite.pkcomposite Member List</div>  </div>
+</div><!--header-->
+<div class="contents">
+
+<p>This is the complete list of members for <a class="el" href="classqgis_1_1pktools_1_1pkcomposite_1_1pkcomposite.html">qgis.pktools.pkcomposite.pkcomposite</a>, including all inherited members.</p>
+<table class="directory">
+  <tr bgcolor="#f0f0f0" class="even"><td class="entry"><b>BNDNODATA</b> (defined in <a class="el" href="classqgis_1_1pktools_1_1pkcomposite_1_1pkcomposite.html">qgis.pktools.pkcomposite.pkcomposite</a>)</td><td class="entry"><a class="el" href="classqgis_1_1pktools_1_1pkcomposite_1_1pkcomposite.html">qgis.pktools.pkcomposite.pkcomposite</a></td><td class="entry"><span class="mlabel">static</span></td></tr>
+  <tr bgcolor="#f0f0f0"><td class="entry"><b>CB</b> (defined in <a class="el" href="classqgis_1_1pktools_1_1pkcomposite_1_1pkcomposite.html">qgis.pktools.pkcomposite.pkcomposite</a>)</td><td class="entry"><a class="el" href="classqgis_1_1pktools_1_1pkcomposite_1_1pkcomposite.html">qgis.pktools.pkcomposite.pkcomposite</a></td><td class="entry"><span class="mlabel">static</span></td></tr>
+  <tr bgcolor="#f0f0f0" class="even"><td class="entry"><b>cliName</b> (defined in <a class="el" href="classqgis_1_1pktools_1_1pkcomposite_1_1pkcomposite.html">qgis.pktools.pkcomposite.pkcomposite</a>)</td><td class="entry"><a class="el" href="classqgis_1_1pktools_1_1pkcomposite_1_1pkcomposite.html">qgis.pktools.pkcomposite.pkcomposite</a></td><td class="entry"></td></tr>
+  <tr bgcolor="#f0f0f0"><td class="entry"><b>CRULE</b> (defined in <a class="el" href="classqgis_1_1pktools_1_1pkcomposite_1_1pkcomposite.html">qgis.pktools.pkcomposite.pkcomposite</a>)</td><td class="entry"><a class="el" href="classqgis_1_1pktools_1_1pkcomposite_1_1pkcomposite.html">qgis.pktools.pkcomposite.pkcomposite</a></td><td class="entry"><span class="mlabel">static</span></td></tr>
+  <tr bgcolor="#f0f0f0" class="even"><td class="entry"><b>CRULE_OPTIONS</b> (defined in <a class="el" href="classqgis_1_1pktools_1_1pkcomposite_1_1pkcomposite.html">qgis.pktools.pkcomposite.pkcomposite</a>)</td><td class="entry"><a class="el" href="classqgis_1_1pktools_1_1pkcomposite_1_1pkcomposite.html">qgis.pktools.pkcomposite.pkcomposite</a></td><td class="entry"><span class="mlabel">static</span></td></tr>
+  <tr bgcolor="#f0f0f0"><td class="entry"><b>defineCharacteristics</b> (defined in <a class="el" href="classqgis_1_1pktools_1_1pkcomposite_1_1pkcomposite.html">qgis.pktools.pkcomposite.pkcomposite</a>)</td><td class="entry"><a class="el" href="classqgis_1_1pktools_1_1pkcomposite_1_1pkcomposite.html">qgis.pktools.pkcomposite.pkcomposite</a></td><td class="entry"></td></tr>
+  <tr bgcolor="#f0f0f0" class="even"><td class="entry"><b>DSTNODATA</b> (defined in <a class="el" href="classqgis_1_1pktools_1_1pkcomposite_1_1pkcomposite.html">qgis.pktools.pkcomposite.pkcomposite</a>)</td><td class="entry"><a class="el" href="classqgis_1_1pktools_1_1pkcomposite_1_1pkcomposite.html">qgis.pktools.pkcomposite.pkcomposite</a></td><td class="entry"><span class="mlabel">static</span></td></tr>
+  <tr bgcolor="#f0f0f0"><td class="entry"><b>DX</b> (defined in <a class="el" href="classqgis_1_1pktools_1_1pkcomposite_1_1pkcomposite.html">qgis.pktools.pkcomposite.pkcomposite</a>)</td><td class="entry"><a class="el" href="classqgis_1_1pktools_1_1pkcomposite_1_1pkcomposite.html">qgis.pktools.pkcomposite.pkcomposite</a></td><td class="entry"><span class="mlabel">static</span></td></tr>
+  <tr bgcolor="#f0f0f0" class="even"><td class="entry"><b>DY</b> (defined in <a class="el" href="classqgis_1_1pktools_1_1pkcomposite_1_1pkcomposite.html">qgis.pktools.pkcomposite.pkcomposite</a>)</td><td class="entry"><a class="el" href="classqgis_1_1pktools_1_1pkcomposite_1_1pkcomposite.html">qgis.pktools.pkcomposite.pkcomposite</a></td><td class="entry"><span class="mlabel">static</span></td></tr>
+  <tr bgcolor="#f0f0f0"><td class="entry"><b>EXTRA</b> (defined in <a class="el" href="classqgis_1_1pktools_1_1pkcomposite_1_1pkcomposite.html">qgis.pktools.pkcomposite.pkcomposite</a>)</td><td class="entry"><a class="el" href="classqgis_1_1pktools_1_1pkcomposite_1_1pkcomposite.html">qgis.pktools.pkcomposite.pkcomposite</a></td><td class="entry"><span class="mlabel">static</span></td></tr>
+  <tr bgcolor="#f0f0f0" class="even"><td class="entry"><b>group</b> (defined in <a class="el" href="classqgis_1_1pktools_1_1pkcomposite_1_1pkcomposite.html">qgis.pktools.pkcomposite.pkcomposite</a>)</td><td class="entry"><a class="el" href="classqgis_1_1pktools_1_1pkcomposite_1_1pkcomposite.html">qgis.pktools.pkcomposite.pkcomposite</a></td><td class="entry"></td></tr>
+  <tr bgcolor="#f0f0f0"><td class="entry"><b>INPUT</b> (defined in <a class="el" href="classqgis_1_1pktools_1_1pkcomposite_1_1pkcomposite.html">qgis.pktools.pkcomposite.pkcomposite</a>)</td><td class="entry"><a class="el" href="classqgis_1_1pktools_1_1pkcomposite_1_1pkcomposite.html">qgis.pktools.pkcomposite.pkcomposite</a></td><td class="entry"><span class="mlabel">static</span></td></tr>
+  <tr bgcolor="#f0f0f0" class="even"><td class="entry"><b>MAXGUI</b> (defined in <a class="el" href="classqgis_1_1pktools_1_1pkcomposite_1_1pkcomposite.html">qgis.pktools.pkcomposite.pkcomposite</a>)</td><td class="entry"><a class="el" href="classqgis_1_1pktools_1_1pkcomposite_1_1pkcomposite.html">qgis.pktools.pkcomposite.pkcomposite</a></td><td class="entry"><span class="mlabel">static</span></td></tr>
+  <tr bgcolor="#f0f0f0"><td class="entry"><b>MINGUI</b> (defined in <a class="el" href="classqgis_1_1pktools_1_1pkcomposite_1_1pkcomposite.html">qgis.pktools.pkcomposite.pkcomposite</a>)</td><td class="entry"><a class="el" href="classqgis_1_1pktools_1_1pkcomposite_1_1pkcomposite.html">qgis.pktools.pkcomposite.pkcomposite</a></td><td class="entry"><span class="mlabel">static</span></td></tr>
+  <tr bgcolor="#f0f0f0" class="even"><td class="entry"><b>name</b> (defined in <a class="el" href="classqgis_1_1pktools_1_1pkcomposite_1_1pkcomposite.html">qgis.pktools.pkcomposite.pkcomposite</a>)</td><td class="entry"><a class="el" href="classqgis_1_1pktools_1_1pkcomposite_1_1pkcomposite.html">qgis.pktools.pkcomposite.pkcomposite</a></td><td class="entry"></td></tr>
+  <tr bgcolor="#f0f0f0"><td class="entry"><b>OUTPUT</b> (defined in <a class="el" href="classqgis_1_1pktools_1_1pkcomposite_1_1pkcomposite.html">qgis.pktools.pkcomposite.pkcomposite</a>)</td><td class="entry"><a class="el" href="classqgis_1_1pktools_1_1pkcomposite_1_1pkcomposite.html">qgis.pktools.pkcomposite.pkcomposite</a></td><td class="entry"><span class="mlabel">static</span></td></tr>
+  <tr bgcolor="#f0f0f0" class="even"><td class="entry"><b>processAlgorithm</b> (defined in <a class="el" href="classqgis_1_1pktools_1_1pkcomposite_1_1pkcomposite.html">qgis.pktools.pkcomposite.pkcomposite</a>)</td><td class="entry"><a class="el" href="classqgis_1_1pktools_1_1pkcomposite_1_1pkcomposite.html">qgis.pktools.pkcomposite.pkcomposite</a></td><td class="entry"></td></tr>
+  <tr bgcolor="#f0f0f0"><td class="entry"><b>PROJWIN</b> (defined in <a class="el" href="classqgis_1_1pktools_1_1pkcomposite_1_1pkcomposite.html">qgis.pktools.pkcomposite.pkcomposite</a>)</td><td class="entry"><a class="el" href="classqgis_1_1pktools_1_1pkcomposite_1_1pkcomposite.html">qgis.pktools.pkcomposite.pkcomposite</a></td><td class="entry"><span class="mlabel">static</span></td></tr>
+  <tr bgcolor="#f0f0f0" class="even"><td class="entry"><b>RESAMPLE</b> (defined in <a class="el" href="classqgis_1_1pktools_1_1pkcomposite_1_1pkcomposite.html">qgis.pktools.pkcomposite.pkcomposite</a>)</td><td class="entry"><a class="el" href="classqgis_1_1pktools_1_1pkcomposite_1_1pkcomposite.html">qgis.pktools.pkcomposite.pkcomposite</a></td><td class="entry"><span class="mlabel">static</span></td></tr>
+  <tr bgcolor="#f0f0f0"><td class="entry"><b>RESAMPLE_OPTIONS</b> (defined in <a class="el" href="classqgis_1_1pktools_1_1pkcomposite_1_1pkcomposite.html">qgis.pktools.pkcomposite.pkcomposite</a>)</td><td class="entry"><a class="el" href="classqgis_1_1pktools_1_1pkcomposite_1_1pkcomposite.html">qgis.pktools.pkcomposite.pkcomposite</a></td><td class="entry"><span class="mlabel">static</span></td></tr>
+  <tr bgcolor="#f0f0f0" class="even"><td class="entry"><b>RTYPE</b> (defined in <a class="el" href="classqgis_1_1pktools_1_1pkcomposite_1_1pkcomposite.html">qgis.pktools.pkcomposite.pkcomposite</a>)</td><td class="entry"><a class="el" href="classqgis_1_1pktools_1_1pkcomposite_1_1pkcomposite.html">qgis.pktools.pkcomposite.pkcomposite</a></td><td class="entry"><span class="mlabel">static</span></td></tr>
+  <tr bgcolor="#f0f0f0"><td class="entry"><b>SRCNODATA</b> (defined in <a class="el" href="classqgis_1_1pktools_1_1pkcomposite_1_1pkcomposite.html">qgis.pktools.pkcomposite.pkcomposite</a>)</td><td class="entry"><a class="el" href="classqgis_1_1pktools_1_1pkcomposite_1_1pkcomposite.html">qgis.pktools.pkcomposite.pkcomposite</a></td><td class="entry"><span class="mlabel">static</span></td></tr>
+  <tr bgcolor="#f0f0f0" class="even"><td class="entry"><b>TYPE</b> (defined in <a class="el" href="classqgis_1_1pktools_1_1pkcomposite_1_1pkcomposite.html">qgis.pktools.pkcomposite.pkcomposite</a>)</td><td class="entry"><a class="el" href="classqgis_1_1pktools_1_1pkcomposite_1_1pkcomposite.html">qgis.pktools.pkcomposite.pkcomposite</a></td><td class="entry"><span class="mlabel">static</span></td></tr>
+</table></div><!-- contents -->
+<!-- HTML footer for doxygen 1.8.4-->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/>
+</a> 1.8.6
+</small></address>
+<script>
+  (function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
+  (i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
+  m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
+  })(window,document,'script','//www.google-analytics.com/analytics.js','ga');
+  ga('create', 'UA-46952639-1', 'nongnu.org');
+  ga('send', 'pageview');
+</script>
+</body>
+</html>
diff --git a/doc/html/classqgis_1_1pkcomposite_1_1pkcomposite.html b/doc/html/classqgis_1_1pktools_1_1pkcomposite_1_1pkcomposite.html
similarity index 62%
copy from doc/html/classqgis_1_1pkcomposite_1_1pkcomposite.html
copy to doc/html/classqgis_1_1pktools_1_1pkcomposite_1_1pkcomposite.html
index c979989..de3a802 100644
--- a/doc/html/classqgis_1_1pkcomposite_1_1pkcomposite.html
+++ b/doc/html/classqgis_1_1pktools_1_1pkcomposite_1_1pkcomposite.html
@@ -4,7 +4,7 @@
 <meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
 <meta http-equiv="X-UA-Compatible" content="IE=9"/>
 <meta name="generator" content="Doxygen 1.8.6"/>
-<title>pktools: qgis.pkcomposite.pkcomposite Class Reference</title>
+<title>pktools: qgis.pktools.pkcomposite.pkcomposite Class Reference</title>
 <link href="tabs.css" rel="stylesheet" type="text/css"/>
 <script type="text/javascript" src="jquery.js"></script>
 <script type="text/javascript" src="dynsections.js"></script>
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.3</span>
+    <span id="projectnumber">2.6.4</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -47,7 +47,7 @@
   </div>
 <div id="nav-path" class="navpath">
   <ul>
-<li class="navelem"><b>qgis</b></li><li class="navelem"><b>pkcomposite</b></li><li class="navelem"><a class="el" href="classqgis_1_1pkcomposite_1_1pkcomposite.html">pkcomposite</a></li>  </ul>
+<li class="navelem"><b>qgis</b></li><li class="navelem"><b>pktools</b></li><li class="navelem"><b>pkcomposite</b></li><li class="navelem"><a class="el" href="classqgis_1_1pktools_1_1pkcomposite_1_1pkcomposite.html">pkcomposite</a></li>  </ul>
 </div>
 </div><!-- top -->
 <div class="header">
@@ -55,111 +55,111 @@
 <a href="#pub-methods">Public Member Functions</a> |
 <a href="#pub-attribs">Public Attributes</a> |
 <a href="#pub-static-attribs">Static Public Attributes</a> |
-<a href="classqgis_1_1pkcomposite_1_1pkcomposite-members.html">List of all members</a>  </div>
+<a href="classqgis_1_1pktools_1_1pkcomposite_1_1pkcomposite-members.html">List of all members</a>  </div>
   <div class="headertitle">
-<div class="title">qgis.pkcomposite.pkcomposite Class Reference</div>  </div>
+<div class="title">qgis.pktools.pkcomposite.pkcomposite Class Reference</div>  </div>
 </div><!--header-->
 <div class="contents">
 <div class="dynheader">
-Inheritance diagram for qgis.pkcomposite.pkcomposite:</div>
+Inheritance diagram for qgis.pktools.pkcomposite.pkcomposite:</div>
 <div class="dyncontent">
-<div class="center"><img src="classqgis_1_1pkcomposite_1_1pkcomposite__inherit__graph.png" border="0" usemap="#qgis_8pkcomposite_8pkcomposite_inherit__map" alt="Inheritance graph"/></div>
+<div class="center"><img src="classqgis_1_1pktools_1_1pkcomposite_1_1pkcomposite__inherit__graph.png" border="0" usemap="#qgis_8pktools_8pkcomposite_8pkcomposite_inherit__map" alt="Inheritance graph"/></div>
 <center><span class="legend">[<a href="graph_legend.html">legend</a>]</span></center></div>
 <div class="dynheader">
-Collaboration diagram for qgis.pkcomposite.pkcomposite:</div>
+Collaboration diagram for qgis.pktools.pkcomposite.pkcomposite:</div>
 <div class="dyncontent">
-<div class="center"><img src="classqgis_1_1pkcomposite_1_1pkcomposite__coll__graph.png" border="0" usemap="#qgis_8pkcomposite_8pkcomposite_coll__map" alt="Collaboration graph"/></div>
+<div class="center"><img src="classqgis_1_1pktools_1_1pkcomposite_1_1pkcomposite__coll__graph.png" border="0" usemap="#qgis_8pktools_8pkcomposite_8pkcomposite_coll__map" alt="Collaboration graph"/></div>
 <center><span class="legend">[<a href="graph_legend.html">legend</a>]</span></center></div>
 <table class="memberdecls">
 <tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pub-methods"></a>
 Public Member Functions</h2></td></tr>
-<tr class="memitem:a50e046d7f4d00ac95080ec2b2f281bb6"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a50e046d7f4d00ac95080ec2b2f281bb6"></a>
+<tr class="memitem:a3965eb26c90ee1566a43a333540654fb"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a3965eb26c90ee1566a43a333540654fb"></a>
 def </td><td class="memItemRight" valign="bottom"><b>cliName</b></td></tr>
-<tr class="separator:a50e046d7f4d00ac95080ec2b2f281bb6"><td class="memSeparator" colspan="2"> </td></tr>
-<tr class="memitem:a1cf2090d81d678e95ef15cb8fbea18fe"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a1cf2090d81d678e95ef15cb8fbea18fe"></a>
+<tr class="separator:a3965eb26c90ee1566a43a333540654fb"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:a3b9c98497217512cd3bb751d3cc155ab"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a3b9c98497217512cd3bb751d3cc155ab"></a>
 def </td><td class="memItemRight" valign="bottom"><b>defineCharacteristics</b></td></tr>
-<tr class="separator:a1cf2090d81d678e95ef15cb8fbea18fe"><td class="memSeparator" colspan="2"> </td></tr>
-<tr class="memitem:ae2ffb4dcf36bc5cc006a5b78b1f4c4f7"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="ae2ffb4dcf36bc5cc006a5b78b1f4c4f7"></a>
+<tr class="separator:a3b9c98497217512cd3bb751d3cc155ab"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:ac0474454ed2da93c5f34c3f191c5ba97"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="ac0474454ed2da93c5f34c3f191c5ba97"></a>
 def </td><td class="memItemRight" valign="bottom"><b>processAlgorithm</b></td></tr>
-<tr class="separator:ae2ffb4dcf36bc5cc006a5b78b1f4c4f7"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="separator:ac0474454ed2da93c5f34c3f191c5ba97"><td class="memSeparator" colspan="2"> </td></tr>
 </table><table class="memberdecls">
 <tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pub-attribs"></a>
 Public Attributes</h2></td></tr>
-<tr class="memitem:af9ff4b9a274bc1edb87048da555c78c5"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="af9ff4b9a274bc1edb87048da555c78c5"></a>
+<tr class="memitem:ae5c19770832f35898b752105d828721b"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="ae5c19770832f35898b752105d828721b"></a>
  </td><td class="memItemRight" valign="bottom"><b>name</b></td></tr>
-<tr class="separator:af9ff4b9a274bc1edb87048da555c78c5"><td class="memSeparator" colspan="2"> </td></tr>
-<tr class="memitem:a93043eb33d26bf02e375323ca06ece59"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a93043eb33d26bf02e375323ca06ece59"></a>
+<tr class="separator:ae5c19770832f35898b752105d828721b"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:ae880cea72e765e6339ad058eee48338b"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="ae880cea72e765e6339ad058eee48338b"></a>
  </td><td class="memItemRight" valign="bottom"><b>group</b></td></tr>
-<tr class="separator:a93043eb33d26bf02e375323ca06ece59"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="separator:ae880cea72e765e6339ad058eee48338b"><td class="memSeparator" colspan="2"> </td></tr>
 </table><table class="memberdecls">
 <tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pub-static-attribs"></a>
 Static Public Attributes</h2></td></tr>
-<tr class="memitem:aebe799f44d6edf989b3d82412c02809a"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="aebe799f44d6edf989b3d82412c02809a"></a>
+<tr class="memitem:afb22832137b08d855bea38be798f09ea"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="afb22832137b08d855bea38be798f09ea"></a>
 string </td><td class="memItemRight" valign="bottom"><b>INPUT</b> = "INPUT"</td></tr>
-<tr class="separator:aebe799f44d6edf989b3d82412c02809a"><td class="memSeparator" colspan="2"> </td></tr>
-<tr class="memitem:a74b1ad0686d3e17322917be01eff6ac1"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a74b1ad0686d3e17322917be01eff6ac1"></a>
+<tr class="separator:afb22832137b08d855bea38be798f09ea"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:ad095de90efcd6d1da7bc2590ce9a0ee9"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="ad095de90efcd6d1da7bc2590ce9a0ee9"></a>
 string </td><td class="memItemRight" valign="bottom"><b>OUTPUT</b> = "OUTPUT"</td></tr>
-<tr class="separator:a74b1ad0686d3e17322917be01eff6ac1"><td class="memSeparator" colspan="2"> </td></tr>
-<tr class="memitem:a17e19984fe0607f36ee4cee78b9e5d06"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a17e19984fe0607f36ee4cee78b9e5d06"></a>
+<tr class="separator:ad095de90efcd6d1da7bc2590ce9a0ee9"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:a73b416e6ed08b45bd7efcfdfdaba4ab6"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a73b416e6ed08b45bd7efcfdfdaba4ab6"></a>
 list </td><td class="memItemRight" valign="bottom"><b>CRULE_OPTIONS</b> = ["overwrite", "maxndvi", "maxband", "minband", "validband", "mean", "mode", "median", "sum", "minallbands", "maxallbands","stdev"]</td></tr>
-<tr class="separator:a17e19984fe0607f36ee4cee78b9e5d06"><td class="memSeparator" colspan="2"> </td></tr>
-<tr class="memitem:aa82de884f201e7c964fd97e55faa3df3"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="aa82de884f201e7c964fd97e55faa3df3"></a>
+<tr class="separator:a73b416e6ed08b45bd7efcfdfdaba4ab6"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:a47345a51323bb1691ca35ece877efb1d"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a47345a51323bb1691ca35ece877efb1d"></a>
 string </td><td class="memItemRight" valign="bottom"><b>CRULE</b> = "CRULE"</td></tr>
-<tr class="separator:aa82de884f201e7c964fd97e55faa3df3"><td class="memSeparator" colspan="2"> </td></tr>
-<tr class="memitem:ae54bec0854b09e103e5dbe2146589997"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="ae54bec0854b09e103e5dbe2146589997"></a>
+<tr class="separator:a47345a51323bb1691ca35ece877efb1d"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:a7792dd836e222b13caadc31417e90a6b"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a7792dd836e222b13caadc31417e90a6b"></a>
 string </td><td class="memItemRight" valign="bottom"><b>DX</b> = "DX"</td></tr>
-<tr class="separator:ae54bec0854b09e103e5dbe2146589997"><td class="memSeparator" colspan="2"> </td></tr>
-<tr class="memitem:a9b797d46ca05fd41a88d0400351bd828"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a9b797d46ca05fd41a88d0400351bd828"></a>
+<tr class="separator:a7792dd836e222b13caadc31417e90a6b"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:aa940dd19d5252f4fef53d8257cd7811d"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="aa940dd19d5252f4fef53d8257cd7811d"></a>
 string </td><td class="memItemRight" valign="bottom"><b>DY</b> = "DY"</td></tr>
-<tr class="separator:a9b797d46ca05fd41a88d0400351bd828"><td class="memSeparator" colspan="2"> </td></tr>
-<tr class="memitem:ad003c6db03be187acded3c0890568c61"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="ad003c6db03be187acded3c0890568c61"></a>
+<tr class="separator:aa940dd19d5252f4fef53d8257cd7811d"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:a48b92a1335d66add3766103500c24a4d"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a48b92a1335d66add3766103500c24a4d"></a>
 string </td><td class="memItemRight" valign="bottom"><b>PROJWIN</b> = 'PROJWIN'</td></tr>
-<tr class="separator:ad003c6db03be187acded3c0890568c61"><td class="memSeparator" colspan="2"> </td></tr>
-<tr class="memitem:a75b586bb10dce1cb66553e222d3a214c"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a75b586bb10dce1cb66553e222d3a214c"></a>
+<tr class="separator:a48b92a1335d66add3766103500c24a4d"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:a450395c11852e1f005bffe466925c42d"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a450395c11852e1f005bffe466925c42d"></a>
 string </td><td class="memItemRight" valign="bottom"><b>CB</b> = "CB"</td></tr>
-<tr class="separator:a75b586bb10dce1cb66553e222d3a214c"><td class="memSeparator" colspan="2"> </td></tr>
-<tr class="memitem:a3c056445acdf3afd1cd26acd12c3c8f0"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a3c056445acdf3afd1cd26acd12c3c8f0"></a>
+<tr class="separator:a450395c11852e1f005bffe466925c42d"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:a2e5828b6eb4912e7fd035d9e885b54c4"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a2e5828b6eb4912e7fd035d9e885b54c4"></a>
 string </td><td class="memItemRight" valign="bottom"><b>SRCNODATA</b> = "SRCNODATA"</td></tr>
-<tr class="separator:a3c056445acdf3afd1cd26acd12c3c8f0"><td class="memSeparator" colspan="2"> </td></tr>
-<tr class="memitem:a65825f1ecd8b707d842cdc9b6bef2722"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a65825f1ecd8b707d842cdc9b6bef2722"></a>
+<tr class="separator:a2e5828b6eb4912e7fd035d9e885b54c4"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:a3eeab89eabe7294252f9610977f10c09"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a3eeab89eabe7294252f9610977f10c09"></a>
 string </td><td class="memItemRight" valign="bottom"><b>BNDNODATA</b> = "BNDNODATA"</td></tr>
-<tr class="separator:a65825f1ecd8b707d842cdc9b6bef2722"><td class="memSeparator" colspan="2"> </td></tr>
-<tr class="memitem:a243d2bbaac6c49959b2117a4042fa219"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a243d2bbaac6c49959b2117a4042fa219"></a>
+<tr class="separator:a3eeab89eabe7294252f9610977f10c09"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:ae80eeebbec867494eb799574a2a22346"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="ae80eeebbec867494eb799574a2a22346"></a>
 string </td><td class="memItemRight" valign="bottom"><b>DSTNODATA</b> = "DSTNODATA"</td></tr>
-<tr class="separator:a243d2bbaac6c49959b2117a4042fa219"><td class="memSeparator" colspan="2"> </td></tr>
-<tr class="memitem:a3e62273f4e72fcf528d3c2a2bf2f407d"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a3e62273f4e72fcf528d3c2a2bf2f407d"></a>
+<tr class="separator:ae80eeebbec867494eb799574a2a22346"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:a1523a0a2abdd0cf84c1c794e8d2eed89"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a1523a0a2abdd0cf84c1c794e8d2eed89"></a>
 string </td><td class="memItemRight" valign="bottom"><b>MINGUI</b> = "MINGUI"</td></tr>
-<tr class="separator:a3e62273f4e72fcf528d3c2a2bf2f407d"><td class="memSeparator" colspan="2"> </td></tr>
-<tr class="memitem:a3bc122ffa6ff04ac4da3c486387bf7cc"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a3bc122ffa6ff04ac4da3c486387bf7cc"></a>
+<tr class="separator:a1523a0a2abdd0cf84c1c794e8d2eed89"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:aaeab6fdf6429c284df503d0ee29eee24"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="aaeab6fdf6429c284df503d0ee29eee24"></a>
 string </td><td class="memItemRight" valign="bottom"><b>MAXGUI</b> = "MAXGUI"</td></tr>
-<tr class="separator:a3bc122ffa6ff04ac4da3c486387bf7cc"><td class="memSeparator" colspan="2"> </td></tr>
-<tr class="memitem:a08c3a8025fa0f42847033e6c7bfd6585"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a08c3a8025fa0f42847033e6c7bfd6585"></a>
+<tr class="separator:aaeab6fdf6429c284df503d0ee29eee24"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:aff4540989ad400292a4bb23fba35a598"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="aff4540989ad400292a4bb23fba35a598"></a>
 list </td><td class="memItemRight" valign="bottom"><b>RESAMPLE_OPTIONS</b> = ['near', 'bilinear']</td></tr>
-<tr class="separator:a08c3a8025fa0f42847033e6c7bfd6585"><td class="memSeparator" colspan="2"> </td></tr>
-<tr class="memitem:a54b2d965b3a847cc1975fd62c9c4dce1"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a54b2d965b3a847cc1975fd62c9c4dce1"></a>
+<tr class="separator:aff4540989ad400292a4bb23fba35a598"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:af1a5711589eb0837bf2f500508a6373e"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="af1a5711589eb0837bf2f500508a6373e"></a>
 string </td><td class="memItemRight" valign="bottom"><b>RESAMPLE</b> = "RESAMPLE"</td></tr>
-<tr class="separator:a54b2d965b3a847cc1975fd62c9c4dce1"><td class="memSeparator" colspan="2"> </td></tr>
-<tr class="memitem:aa65064fbe6e45aff10bd5e803026d12a"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="aa65064fbe6e45aff10bd5e803026d12a"></a>
+<tr class="separator:af1a5711589eb0837bf2f500508a6373e"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:a28599f5565263acdfe7ed1eadc976bde"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a28599f5565263acdfe7ed1eadc976bde"></a>
 string </td><td class="memItemRight" valign="bottom"><b>RTYPE</b> = 'RTYPE'</td></tr>
-<tr class="separator:aa65064fbe6e45aff10bd5e803026d12a"><td class="memSeparator" colspan="2"> </td></tr>
-<tr class="memitem:a71098b4079244d80eb821653a6e32f00"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a71098b4079244d80eb821653a6e32f00"></a>
+<tr class="separator:a28599f5565263acdfe7ed1eadc976bde"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:a5c1caab4d9c94ad9d0648348a364f133"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a5c1caab4d9c94ad9d0648348a364f133"></a>
 list </td><td class="memItemRight" valign="bottom"><b>TYPE</b> = ['none', 'Byte','Int16','UInt16','UInt32','Int32','Float32','Float64','CInt16','CInt32','CFloat32','CFloat64']</td></tr>
-<tr class="separator:a71098b4079244d80eb821653a6e32f00"><td class="memSeparator" colspan="2"> </td></tr>
-<tr class="memitem:a2a6835752fccf49eb80614d762310c49"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a2a6835752fccf49eb80614d762310c49"></a>
+<tr class="separator:a5c1caab4d9c94ad9d0648348a364f133"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:ac2d1f35938c4fc3a99039e06384df9a7"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="ac2d1f35938c4fc3a99039e06384df9a7"></a>
 string </td><td class="memItemRight" valign="bottom"><b>EXTRA</b> = 'EXTRA'</td></tr>
-<tr class="separator:a2a6835752fccf49eb80614d762310c49"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="separator:ac2d1f35938c4fc3a99039e06384df9a7"><td class="memSeparator" colspan="2"> </td></tr>
 </table>
 <a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
 <div class="textblock">
-<p>Definition at line <a class="el" href="pkcomposite_8py_source.html#l00038">38</a> of file <a class="el" href="pkcomposite_8py_source.html">pkcomposite.py</a>.</p>
+<p>Definition at line <a class="el" href="pktools_2pkcomposite_8py_source.html#l00038">38</a> of file <a class="el" href="pktools_2pkcomposite_8py_source.html">pkcomposite.py</a>.</p>
 </div><hr/>The documentation for this class was generated from the following file:<ul>
-<li>/home/kempenep/pktools/qgis/<a class="el" href="pkcomposite_8py_source.html">pkcomposite.py</a></li>
+<li>/home/kempenep/pktools/qgis/pktools/<a class="el" href="pktools_2pkcomposite_8py_source.html">pkcomposite.py</a></li>
 </ul>
 </div><!-- contents -->
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Jun 23 2015 17:09:37 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/classqgis_1_1pktools_1_1pkcomposite_1_1pkcomposite__coll__graph.map b/doc/html/classqgis_1_1pktools_1_1pkcomposite_1_1pkcomposite__coll__graph.map
new file mode 100644
index 0000000..c4f4629
--- /dev/null
+++ b/doc/html/classqgis_1_1pktools_1_1pkcomposite_1_1pkcomposite__coll__graph.map
@@ -0,0 +1,2 @@
+<map id="qgis.pktools.pkcomposite.pkcomposite" name="qgis.pktools.pkcomposite.pkcomposite">
+</map>
diff --git a/doc/html/classqgis_1_1pktools_1_1pkcomposite_1_1pkcomposite__coll__graph.md5 b/doc/html/classqgis_1_1pktools_1_1pkcomposite_1_1pkcomposite__coll__graph.md5
new file mode 100644
index 0000000..b2bbf53
--- /dev/null
+++ b/doc/html/classqgis_1_1pktools_1_1pkcomposite_1_1pkcomposite__coll__graph.md5
@@ -0,0 +1 @@
+2da4461a4e6b277d95fe960fcbe8e840
\ No newline at end of file
diff --git a/doc/html/classqgis_1_1pktools_1_1pkcomposite_1_1pkcomposite__coll__graph.png b/doc/html/classqgis_1_1pktools_1_1pkcomposite_1_1pkcomposite__coll__graph.png
new file mode 100644
index 0000000..f267a5d
Binary files /dev/null and b/doc/html/classqgis_1_1pktools_1_1pkcomposite_1_1pkcomposite__coll__graph.png differ
diff --git a/doc/html/classqgis_1_1pktools_1_1pkcomposite_1_1pkcomposite__inherit__graph.map b/doc/html/classqgis_1_1pktools_1_1pkcomposite_1_1pkcomposite__inherit__graph.map
new file mode 100644
index 0000000..c4f4629
--- /dev/null
+++ b/doc/html/classqgis_1_1pktools_1_1pkcomposite_1_1pkcomposite__inherit__graph.map
@@ -0,0 +1,2 @@
+<map id="qgis.pktools.pkcomposite.pkcomposite" name="qgis.pktools.pkcomposite.pkcomposite">
+</map>
diff --git a/doc/html/classqgis_1_1pktools_1_1pkcomposite_1_1pkcomposite__inherit__graph.md5 b/doc/html/classqgis_1_1pktools_1_1pkcomposite_1_1pkcomposite__inherit__graph.md5
new file mode 100644
index 0000000..b2bbf53
--- /dev/null
+++ b/doc/html/classqgis_1_1pktools_1_1pkcomposite_1_1pkcomposite__inherit__graph.md5
@@ -0,0 +1 @@
+2da4461a4e6b277d95fe960fcbe8e840
\ No newline at end of file
diff --git a/doc/html/classqgis_1_1pktools_1_1pkcomposite_1_1pkcomposite__inherit__graph.png b/doc/html/classqgis_1_1pktools_1_1pkcomposite_1_1pkcomposite__inherit__graph.png
new file mode 100644
index 0000000..f267a5d
Binary files /dev/null and b/doc/html/classqgis_1_1pktools_1_1pkcomposite_1_1pkcomposite__inherit__graph.png differ
diff --git a/doc/html/classqgis_1_1pktools_1_1pkcrop_1_1pkcrop-members.html b/doc/html/classqgis_1_1pktools_1_1pkcrop_1_1pkcrop-members.html
new file mode 100644
index 0000000..da0bd22
--- /dev/null
+++ b/doc/html/classqgis_1_1pktools_1_1pkcrop_1_1pkcrop-members.html
@@ -0,0 +1,95 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.6"/>
+<title>pktools: Member List</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+  <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
+  <td style="padding-left: 0.5em;">
+   <div id="projectname">pktools
+    <span id="projectnumber">2.6.4</span>
+   </div>
+   <div id="projectbrief">Processing Kernel for geospatial data</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.6 -->
+  <div id="navrow1" class="tabs">
+    <ul class="tablist">
+      <li><a href="index.html"><span>Main Page</span></a></li>
+      <li><a href="pages.html"><span>Related Pages</span></a></li>
+      <li class="current"><a href="annotated.html"><span>Classes</span></a></li>
+      <li><a href="files.html"><span>Files</span></a></li>
+    </ul>
+  </div>
+  <div id="navrow2" class="tabs2">
+    <ul class="tablist">
+      <li><a href="annotated.html"><span>Class List</span></a></li>
+      <li><a href="classes.html"><span>Class Index</span></a></li>
+      <li><a href="inherits.html"><span>Class Hierarchy</span></a></li>
+      <li><a href="functions.html"><span>Class Members</span></a></li>
+    </ul>
+  </div>
+<div id="nav-path" class="navpath">
+  <ul>
+<li class="navelem"><b>qgis</b></li><li class="navelem"><b>pktools</b></li><li class="navelem"><b>pkcrop</b></li><li class="navelem"><a class="el" href="classqgis_1_1pktools_1_1pkcrop_1_1pkcrop.html">pkcrop</a></li>  </ul>
+</div>
+</div><!-- top -->
+<div class="header">
+  <div class="headertitle">
+<div class="title">qgis.pktools.pkcrop.pkcrop Member List</div>  </div>
+</div><!--header-->
+<div class="contents">
+
+<p>This is the complete list of members for <a class="el" href="classqgis_1_1pktools_1_1pkcrop_1_1pkcrop.html">qgis.pktools.pkcrop.pkcrop</a>, including all inherited members.</p>
+<table class="directory">
+  <tr bgcolor="#f0f0f0" class="even"><td class="entry"><b>BAND</b> (defined in <a class="el" href="classqgis_1_1pktools_1_1pkcrop_1_1pkcrop.html">qgis.pktools.pkcrop.pkcrop</a>)</td><td class="entry"><a class="el" href="classqgis_1_1pktools_1_1pkcrop_1_1pkcrop.html">qgis.pktools.pkcrop.pkcrop</a></td><td class="entry"><span class="mlabel">static</span></td></tr>
+  <tr bgcolor="#f0f0f0"><td class="entry"><b>cliName</b> (defined in <a class="el" href="classqgis_1_1pktools_1_1pkcrop_1_1pkcrop.html">qgis.pktools.pkcrop.pkcrop</a>)</td><td class="entry"><a class="el" href="classqgis_1_1pktools_1_1pkcrop_1_1pkcrop.html">qgis.pktools.pkcrop.pkcrop</a></td><td class="entry"></td></tr>
+  <tr bgcolor="#f0f0f0" class="even"><td class="entry"><b>defineCharacteristics</b> (defined in <a class="el" href="classqgis_1_1pktools_1_1pkcrop_1_1pkcrop.html">qgis.pktools.pkcrop.pkcrop</a>)</td><td class="entry"><a class="el" href="classqgis_1_1pktools_1_1pkcrop_1_1pkcrop.html">qgis.pktools.pkcrop.pkcrop</a></td><td class="entry"></td></tr>
+  <tr bgcolor="#f0f0f0"><td class="entry"><b>DX</b> (defined in <a class="el" href="classqgis_1_1pktools_1_1pkcrop_1_1pkcrop.html">qgis.pktools.pkcrop.pkcrop</a>)</td><td class="entry"><a class="el" href="classqgis_1_1pktools_1_1pkcrop_1_1pkcrop.html">qgis.pktools.pkcrop.pkcrop</a></td><td class="entry"><span class="mlabel">static</span></td></tr>
+  <tr bgcolor="#f0f0f0" class="even"><td class="entry"><b>DY</b> (defined in <a class="el" href="classqgis_1_1pktools_1_1pkcrop_1_1pkcrop.html">qgis.pktools.pkcrop.pkcrop</a>)</td><td class="entry"><a class="el" href="classqgis_1_1pktools_1_1pkcrop_1_1pkcrop.html">qgis.pktools.pkcrop.pkcrop</a></td><td class="entry"><span class="mlabel">static</span></td></tr>
+  <tr bgcolor="#f0f0f0"><td class="entry"><b>EXTRA</b> (defined in <a class="el" href="classqgis_1_1pktools_1_1pkcrop_1_1pkcrop.html">qgis.pktools.pkcrop.pkcrop</a>)</td><td class="entry"><a class="el" href="classqgis_1_1pktools_1_1pkcrop_1_1pkcrop.html">qgis.pktools.pkcrop.pkcrop</a></td><td class="entry"><span class="mlabel">static</span></td></tr>
+  <tr bgcolor="#f0f0f0" class="even"><td class="entry"><b>group</b> (defined in <a class="el" href="classqgis_1_1pktools_1_1pkcrop_1_1pkcrop.html">qgis.pktools.pkcrop.pkcrop</a>)</td><td class="entry"><a class="el" href="classqgis_1_1pktools_1_1pkcrop_1_1pkcrop.html">qgis.pktools.pkcrop.pkcrop</a></td><td class="entry"></td></tr>
+  <tr bgcolor="#f0f0f0"><td class="entry"><b>INPUT</b> (defined in <a class="el" href="classqgis_1_1pktools_1_1pkcrop_1_1pkcrop.html">qgis.pktools.pkcrop.pkcrop</a>)</td><td class="entry"><a class="el" href="classqgis_1_1pktools_1_1pkcrop_1_1pkcrop.html">qgis.pktools.pkcrop.pkcrop</a></td><td class="entry"><span class="mlabel">static</span></td></tr>
+  <tr bgcolor="#f0f0f0" class="even"><td class="entry"><b>name</b> (defined in <a class="el" href="classqgis_1_1pktools_1_1pkcrop_1_1pkcrop.html">qgis.pktools.pkcrop.pkcrop</a>)</td><td class="entry"><a class="el" href="classqgis_1_1pktools_1_1pkcrop_1_1pkcrop.html">qgis.pktools.pkcrop.pkcrop</a></td><td class="entry"></td></tr>
+  <tr bgcolor="#f0f0f0"><td class="entry"><b>NODATA</b> (defined in <a class="el" href="classqgis_1_1pktools_1_1pkcrop_1_1pkcrop.html">qgis.pktools.pkcrop.pkcrop</a>)</td><td class="entry"><a class="el" href="classqgis_1_1pktools_1_1pkcrop_1_1pkcrop.html">qgis.pktools.pkcrop.pkcrop</a></td><td class="entry"><span class="mlabel">static</span></td></tr>
+  <tr bgcolor="#f0f0f0" class="even"><td class="entry"><b>OUTPUT</b> (defined in <a class="el" href="classqgis_1_1pktools_1_1pkcrop_1_1pkcrop.html">qgis.pktools.pkcrop.pkcrop</a>)</td><td class="entry"><a class="el" href="classqgis_1_1pktools_1_1pkcrop_1_1pkcrop.html">qgis.pktools.pkcrop.pkcrop</a></td><td class="entry"><span class="mlabel">static</span></td></tr>
+  <tr bgcolor="#f0f0f0"><td class="entry"><b>processAlgorithm</b> (defined in <a class="el" href="classqgis_1_1pktools_1_1pkcrop_1_1pkcrop.html">qgis.pktools.pkcrop.pkcrop</a>)</td><td class="entry"><a class="el" href="classqgis_1_1pktools_1_1pkcrop_1_1pkcrop.html">qgis.pktools.pkcrop.pkcrop</a></td><td class="entry"></td></tr>
+  <tr bgcolor="#f0f0f0" class="even"><td class="entry"><b>PROJWIN</b> (defined in <a class="el" href="classqgis_1_1pktools_1_1pkcrop_1_1pkcrop.html">qgis.pktools.pkcrop.pkcrop</a>)</td><td class="entry"><a class="el" href="classqgis_1_1pktools_1_1pkcrop_1_1pkcrop.html">qgis.pktools.pkcrop.pkcrop</a></td><td class="entry"><span class="mlabel">static</span></td></tr>
+  <tr bgcolor="#f0f0f0"><td class="entry"><b>RESAMPLE</b> (defined in <a class="el" href="classqgis_1_1pktools_1_1pkcrop_1_1pkcrop.html">qgis.pktools.pkcrop.pkcrop</a>)</td><td class="entry"><a class="el" href="classqgis_1_1pktools_1_1pkcrop_1_1pkcrop.html">qgis.pktools.pkcrop.pkcrop</a></td><td class="entry"><span class="mlabel">static</span></td></tr>
+  <tr bgcolor="#f0f0f0" class="even"><td class="entry"><b>RESAMPLE_OPTIONS</b> (defined in <a class="el" href="classqgis_1_1pktools_1_1pkcrop_1_1pkcrop.html">qgis.pktools.pkcrop.pkcrop</a>)</td><td class="entry"><a class="el" href="classqgis_1_1pktools_1_1pkcrop_1_1pkcrop.html">qgis.pktools.pkcrop.pkcrop</a></td><td class="entry"><span class="mlabel">static</span></td></tr>
+  <tr bgcolor="#f0f0f0"><td class="entry"><b>RTYPE</b> (defined in <a class="el" href="classqgis_1_1pktools_1_1pkcrop_1_1pkcrop.html">qgis.pktools.pkcrop.pkcrop</a>)</td><td class="entry"><a class="el" href="classqgis_1_1pktools_1_1pkcrop_1_1pkcrop.html">qgis.pktools.pkcrop.pkcrop</a></td><td class="entry"><span class="mlabel">static</span></td></tr>
+  <tr bgcolor="#f0f0f0" class="even"><td class="entry"><b>TYPE</b> (defined in <a class="el" href="classqgis_1_1pktools_1_1pkcrop_1_1pkcrop.html">qgis.pktools.pkcrop.pkcrop</a>)</td><td class="entry"><a class="el" href="classqgis_1_1pktools_1_1pkcrop_1_1pkcrop.html">qgis.pktools.pkcrop.pkcrop</a></td><td class="entry"><span class="mlabel">static</span></td></tr>
+</table></div><!-- contents -->
+<!-- HTML footer for doxygen 1.8.4-->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/>
+</a> 1.8.6
+</small></address>
+<script>
+  (function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
+  (i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
+  m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
+  })(window,document,'script','//www.google-analytics.com/analytics.js','ga');
+  ga('create', 'UA-46952639-1', 'nongnu.org');
+  ga('send', 'pageview');
+</script>
+</body>
+</html>
diff --git a/doc/html/classqgis_1_1pkcrop_1_1pkcrop.html b/doc/html/classqgis_1_1pktools_1_1pkcrop_1_1pkcrop.html
similarity index 63%
copy from doc/html/classqgis_1_1pkcrop_1_1pkcrop.html
copy to doc/html/classqgis_1_1pktools_1_1pkcrop_1_1pkcrop.html
index ad87d5d..0c2af2c 100644
--- a/doc/html/classqgis_1_1pkcrop_1_1pkcrop.html
+++ b/doc/html/classqgis_1_1pktools_1_1pkcrop_1_1pkcrop.html
@@ -4,7 +4,7 @@
 <meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
 <meta http-equiv="X-UA-Compatible" content="IE=9"/>
 <meta name="generator" content="Doxygen 1.8.6"/>
-<title>pktools: qgis.pkcrop.pkcrop Class Reference</title>
+<title>pktools: qgis.pktools.pkcrop.pkcrop Class Reference</title>
 <link href="tabs.css" rel="stylesheet" type="text/css"/>
 <script type="text/javascript" src="jquery.js"></script>
 <script type="text/javascript" src="dynsections.js"></script>
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.3</span>
+    <span id="projectnumber">2.6.4</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -47,7 +47,7 @@
   </div>
 <div id="nav-path" class="navpath">
   <ul>
-<li class="navelem"><b>qgis</b></li><li class="navelem"><b>pkcrop</b></li><li class="navelem"><a class="el" href="classqgis_1_1pkcrop_1_1pkcrop.html">pkcrop</a></li>  </ul>
+<li class="navelem"><b>qgis</b></li><li class="navelem"><b>pktools</b></li><li class="navelem"><b>pkcrop</b></li><li class="navelem"><a class="el" href="classqgis_1_1pktools_1_1pkcrop_1_1pkcrop.html">pkcrop</a></li>  </ul>
 </div>
 </div><!-- top -->
 <div class="header">
@@ -55,93 +55,93 @@
 <a href="#pub-methods">Public Member Functions</a> |
 <a href="#pub-attribs">Public Attributes</a> |
 <a href="#pub-static-attribs">Static Public Attributes</a> |
-<a href="classqgis_1_1pkcrop_1_1pkcrop-members.html">List of all members</a>  </div>
+<a href="classqgis_1_1pktools_1_1pkcrop_1_1pkcrop-members.html">List of all members</a>  </div>
   <div class="headertitle">
-<div class="title">qgis.pkcrop.pkcrop Class Reference</div>  </div>
+<div class="title">qgis.pktools.pkcrop.pkcrop Class Reference</div>  </div>
 </div><!--header-->
 <div class="contents">
 <div class="dynheader">
-Inheritance diagram for qgis.pkcrop.pkcrop:</div>
+Inheritance diagram for qgis.pktools.pkcrop.pkcrop:</div>
 <div class="dyncontent">
-<div class="center"><img src="classqgis_1_1pkcrop_1_1pkcrop__inherit__graph.png" border="0" usemap="#qgis_8pkcrop_8pkcrop_inherit__map" alt="Inheritance graph"/></div>
+<div class="center"><img src="classqgis_1_1pktools_1_1pkcrop_1_1pkcrop__inherit__graph.png" border="0" usemap="#qgis_8pktools_8pkcrop_8pkcrop_inherit__map" alt="Inheritance graph"/></div>
 <center><span class="legend">[<a href="graph_legend.html">legend</a>]</span></center></div>
 <div class="dynheader">
-Collaboration diagram for qgis.pkcrop.pkcrop:</div>
+Collaboration diagram for qgis.pktools.pkcrop.pkcrop:</div>
 <div class="dyncontent">
-<div class="center"><img src="classqgis_1_1pkcrop_1_1pkcrop__coll__graph.png" border="0" usemap="#qgis_8pkcrop_8pkcrop_coll__map" alt="Collaboration graph"/></div>
+<div class="center"><img src="classqgis_1_1pktools_1_1pkcrop_1_1pkcrop__coll__graph.png" border="0" usemap="#qgis_8pktools_8pkcrop_8pkcrop_coll__map" alt="Collaboration graph"/></div>
 <center><span class="legend">[<a href="graph_legend.html">legend</a>]</span></center></div>
 <table class="memberdecls">
 <tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pub-methods"></a>
 Public Member Functions</h2></td></tr>
-<tr class="memitem:a0a169418d9b1c0e55c1c09c711b920b1"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a0a169418d9b1c0e55c1c09c711b920b1"></a>
+<tr class="memitem:a6caffb1e09eec28b29ce9996e20b6cf9"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a6caffb1e09eec28b29ce9996e20b6cf9"></a>
 def </td><td class="memItemRight" valign="bottom"><b>cliName</b></td></tr>
-<tr class="separator:a0a169418d9b1c0e55c1c09c711b920b1"><td class="memSeparator" colspan="2"> </td></tr>
-<tr class="memitem:a3737ba86bc1676fd8276c43b1bf8a12b"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a3737ba86bc1676fd8276c43b1bf8a12b"></a>
+<tr class="separator:a6caffb1e09eec28b29ce9996e20b6cf9"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:a2a03689f5bb781dc798f88f91c0a99bb"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a2a03689f5bb781dc798f88f91c0a99bb"></a>
 def </td><td class="memItemRight" valign="bottom"><b>defineCharacteristics</b></td></tr>
-<tr class="separator:a3737ba86bc1676fd8276c43b1bf8a12b"><td class="memSeparator" colspan="2"> </td></tr>
-<tr class="memitem:ad91ffec9ffdd327ac66d08506ea8fca5"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="ad91ffec9ffdd327ac66d08506ea8fca5"></a>
+<tr class="separator:a2a03689f5bb781dc798f88f91c0a99bb"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:a92cb5bdebb0b74f6d8b7635502bf2088"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a92cb5bdebb0b74f6d8b7635502bf2088"></a>
 def </td><td class="memItemRight" valign="bottom"><b>processAlgorithm</b></td></tr>
-<tr class="separator:ad91ffec9ffdd327ac66d08506ea8fca5"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="separator:a92cb5bdebb0b74f6d8b7635502bf2088"><td class="memSeparator" colspan="2"> </td></tr>
 </table><table class="memberdecls">
 <tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pub-attribs"></a>
 Public Attributes</h2></td></tr>
-<tr class="memitem:a21c98defb19a723cbdbcae90e5c414b9"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a21c98defb19a723cbdbcae90e5c414b9"></a>
+<tr class="memitem:ae937210a61feb138b0abc2cb67d6ad5b"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="ae937210a61feb138b0abc2cb67d6ad5b"></a>
  </td><td class="memItemRight" valign="bottom"><b>name</b></td></tr>
-<tr class="separator:a21c98defb19a723cbdbcae90e5c414b9"><td class="memSeparator" colspan="2"> </td></tr>
-<tr class="memitem:a15a208344b67a578ed7592105617762f"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a15a208344b67a578ed7592105617762f"></a>
+<tr class="separator:ae937210a61feb138b0abc2cb67d6ad5b"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:ae2c4e89f56b83d8cab9b6d99c9645e80"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="ae2c4e89f56b83d8cab9b6d99c9645e80"></a>
  </td><td class="memItemRight" valign="bottom"><b>group</b></td></tr>
-<tr class="separator:a15a208344b67a578ed7592105617762f"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="separator:ae2c4e89f56b83d8cab9b6d99c9645e80"><td class="memSeparator" colspan="2"> </td></tr>
 </table><table class="memberdecls">
 <tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pub-static-attribs"></a>
 Static Public Attributes</h2></td></tr>
-<tr class="memitem:a660abf1b5edd9b7c39f49a48748e73b5"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a660abf1b5edd9b7c39f49a48748e73b5"></a>
+<tr class="memitem:a7309fd72361327278b1fefabfa7f03ad"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a7309fd72361327278b1fefabfa7f03ad"></a>
 string </td><td class="memItemRight" valign="bottom"><b>INPUT</b> = "INPUT"</td></tr>
-<tr class="separator:a660abf1b5edd9b7c39f49a48748e73b5"><td class="memSeparator" colspan="2"> </td></tr>
-<tr class="memitem:afab963f14ed687777ea04b6b03a44708"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="afab963f14ed687777ea04b6b03a44708"></a>
+<tr class="separator:a7309fd72361327278b1fefabfa7f03ad"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:ac3c7e447a20304d204e1cb9d956a9eed"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="ac3c7e447a20304d204e1cb9d956a9eed"></a>
 string </td><td class="memItemRight" valign="bottom"><b>OUTPUT</b> = "OUTPUT"</td></tr>
-<tr class="separator:afab963f14ed687777ea04b6b03a44708"><td class="memSeparator" colspan="2"> </td></tr>
-<tr class="memitem:aa64c23657fe96444fe2d03717be4b5c5"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="aa64c23657fe96444fe2d03717be4b5c5"></a>
+<tr class="separator:ac3c7e447a20304d204e1cb9d956a9eed"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:ac728a472b77be42ab2b4de231c21fe79"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="ac728a472b77be42ab2b4de231c21fe79"></a>
 string </td><td class="memItemRight" valign="bottom"><b>DX</b> = "DX"</td></tr>
-<tr class="separator:aa64c23657fe96444fe2d03717be4b5c5"><td class="memSeparator" colspan="2"> </td></tr>
-<tr class="memitem:ac5779beb227252f20da289d505f4deee"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="ac5779beb227252f20da289d505f4deee"></a>
+<tr class="separator:ac728a472b77be42ab2b4de231c21fe79"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:a89711319003fc990e2dedb83eb5405a3"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a89711319003fc990e2dedb83eb5405a3"></a>
 string </td><td class="memItemRight" valign="bottom"><b>DY</b> = "DY"</td></tr>
-<tr class="separator:ac5779beb227252f20da289d505f4deee"><td class="memSeparator" colspan="2"> </td></tr>
-<tr class="memitem:a6f6f27285700550bb52391c36d130328"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a6f6f27285700550bb52391c36d130328"></a>
+<tr class="separator:a89711319003fc990e2dedb83eb5405a3"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:a1beaf0244ed19ce9af19072399c95f47"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a1beaf0244ed19ce9af19072399c95f47"></a>
 string </td><td class="memItemRight" valign="bottom"><b>PROJWIN</b> = 'PROJWIN'</td></tr>
-<tr class="separator:a6f6f27285700550bb52391c36d130328"><td class="memSeparator" colspan="2"> </td></tr>
-<tr class="memitem:a5993a8cc5d573cf0bc3a0d97a1811cd7"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a5993a8cc5d573cf0bc3a0d97a1811cd7"></a>
+<tr class="separator:a1beaf0244ed19ce9af19072399c95f47"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:a356b1c519f594aa18f0b8f7dbb83abf3"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a356b1c519f594aa18f0b8f7dbb83abf3"></a>
 string </td><td class="memItemRight" valign="bottom"><b>BAND</b> = "BAND"</td></tr>
-<tr class="separator:a5993a8cc5d573cf0bc3a0d97a1811cd7"><td class="memSeparator" colspan="2"> </td></tr>
-<tr class="memitem:a9d01bfa7ad85384abf071d59c0f5f69e"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a9d01bfa7ad85384abf071d59c0f5f69e"></a>
+<tr class="separator:a356b1c519f594aa18f0b8f7dbb83abf3"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:a19fb0d5c68f226f6a9e7a939581b0970"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a19fb0d5c68f226f6a9e7a939581b0970"></a>
 string </td><td class="memItemRight" valign="bottom"><b>NODATA</b> = "NODATA"</td></tr>
-<tr class="separator:a9d01bfa7ad85384abf071d59c0f5f69e"><td class="memSeparator" colspan="2"> </td></tr>
-<tr class="memitem:a4ca284fa3cb6e48275aa399f6547d4f2"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a4ca284fa3cb6e48275aa399f6547d4f2"></a>
+<tr class="separator:a19fb0d5c68f226f6a9e7a939581b0970"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:a1b0888761b96112483aecfa774a9b8ab"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a1b0888761b96112483aecfa774a9b8ab"></a>
 list </td><td class="memItemRight" valign="bottom"><b>RESAMPLE_OPTIONS</b> = ['near', 'bilinear']</td></tr>
-<tr class="separator:a4ca284fa3cb6e48275aa399f6547d4f2"><td class="memSeparator" colspan="2"> </td></tr>
-<tr class="memitem:a000a9bda4206edf6ef542590140e43e8"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a000a9bda4206edf6ef542590140e43e8"></a>
+<tr class="separator:a1b0888761b96112483aecfa774a9b8ab"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:ab207608ada15c93982967e03b10b7524"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="ab207608ada15c93982967e03b10b7524"></a>
 string </td><td class="memItemRight" valign="bottom"><b>RESAMPLE</b> = "RESAMPLE"</td></tr>
-<tr class="separator:a000a9bda4206edf6ef542590140e43e8"><td class="memSeparator" colspan="2"> </td></tr>
-<tr class="memitem:a67d94ff9e997ceda91ff39334e1e668a"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a67d94ff9e997ceda91ff39334e1e668a"></a>
+<tr class="separator:ab207608ada15c93982967e03b10b7524"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:a909bbe623577b51ae6427d73aa703c28"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a909bbe623577b51ae6427d73aa703c28"></a>
 string </td><td class="memItemRight" valign="bottom"><b>RTYPE</b> = 'RTYPE'</td></tr>
-<tr class="separator:a67d94ff9e997ceda91ff39334e1e668a"><td class="memSeparator" colspan="2"> </td></tr>
-<tr class="memitem:aa901690d584f08efbc4a4225985fde89"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="aa901690d584f08efbc4a4225985fde89"></a>
+<tr class="separator:a909bbe623577b51ae6427d73aa703c28"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:a8135eba7dc27f89fef11c8cc226b77ca"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a8135eba7dc27f89fef11c8cc226b77ca"></a>
 list </td><td class="memItemRight" valign="bottom"><b>TYPE</b> = ['none', 'Byte','Int16','UInt16','UInt32','Int32','Float32','Float64','CInt16','CInt32','CFloat32','CFloat64']</td></tr>
-<tr class="separator:aa901690d584f08efbc4a4225985fde89"><td class="memSeparator" colspan="2"> </td></tr>
-<tr class="memitem:a7c99a0e343473c7cfc94623c115590db"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a7c99a0e343473c7cfc94623c115590db"></a>
+<tr class="separator:a8135eba7dc27f89fef11c8cc226b77ca"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:a3076c24eb1c309b6f5091545d7bd78c9"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a3076c24eb1c309b6f5091545d7bd78c9"></a>
 string </td><td class="memItemRight" valign="bottom"><b>EXTRA</b> = 'EXTRA'</td></tr>
-<tr class="separator:a7c99a0e343473c7cfc94623c115590db"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="separator:a3076c24eb1c309b6f5091545d7bd78c9"><td class="memSeparator" colspan="2"> </td></tr>
 </table>
 <a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
 <div class="textblock">
-<p>Definition at line <a class="el" href="pkcrop_8py_source.html#l00038">38</a> of file <a class="el" href="pkcrop_8py_source.html">pkcrop.py</a>.</p>
+<p>Definition at line <a class="el" href="pktools_2pkcrop_8py_source.html#l00038">38</a> of file <a class="el" href="pktools_2pkcrop_8py_source.html">pkcrop.py</a>.</p>
 </div><hr/>The documentation for this class was generated from the following file:<ul>
-<li>/home/kempenep/pktools/qgis/<a class="el" href="pkcrop_8py_source.html">pkcrop.py</a></li>
+<li>/home/kempenep/pktools/qgis/pktools/<a class="el" href="pktools_2pkcrop_8py_source.html">pkcrop.py</a></li>
 </ul>
 </div><!-- contents -->
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Jun 23 2015 17:09:37 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/classqgis_1_1pktools_1_1pkcrop_1_1pkcrop__coll__graph.map b/doc/html/classqgis_1_1pktools_1_1pkcrop_1_1pkcrop__coll__graph.map
new file mode 100644
index 0000000..3049877
--- /dev/null
+++ b/doc/html/classqgis_1_1pktools_1_1pkcrop_1_1pkcrop__coll__graph.map
@@ -0,0 +1,2 @@
+<map id="qgis.pktools.pkcrop.pkcrop" name="qgis.pktools.pkcrop.pkcrop">
+</map>
diff --git a/doc/html/classqgis_1_1pktools_1_1pkcrop_1_1pkcrop__coll__graph.md5 b/doc/html/classqgis_1_1pktools_1_1pkcrop_1_1pkcrop__coll__graph.md5
new file mode 100644
index 0000000..1e1b326
--- /dev/null
+++ b/doc/html/classqgis_1_1pktools_1_1pkcrop_1_1pkcrop__coll__graph.md5
@@ -0,0 +1 @@
+34fa2dac6c0a33c03e1352b8cee4a33b
\ No newline at end of file
diff --git a/doc/html/classqgis_1_1pktools_1_1pkcrop_1_1pkcrop__coll__graph.png b/doc/html/classqgis_1_1pktools_1_1pkcrop_1_1pkcrop__coll__graph.png
new file mode 100644
index 0000000..38b78ed
Binary files /dev/null and b/doc/html/classqgis_1_1pktools_1_1pkcrop_1_1pkcrop__coll__graph.png differ
diff --git a/doc/html/classqgis_1_1pktools_1_1pkcrop_1_1pkcrop__inherit__graph.map b/doc/html/classqgis_1_1pktools_1_1pkcrop_1_1pkcrop__inherit__graph.map
new file mode 100644
index 0000000..3049877
--- /dev/null
+++ b/doc/html/classqgis_1_1pktools_1_1pkcrop_1_1pkcrop__inherit__graph.map
@@ -0,0 +1,2 @@
+<map id="qgis.pktools.pkcrop.pkcrop" name="qgis.pktools.pkcrop.pkcrop">
+</map>
diff --git a/doc/html/classqgis_1_1pktools_1_1pkcrop_1_1pkcrop__inherit__graph.md5 b/doc/html/classqgis_1_1pktools_1_1pkcrop_1_1pkcrop__inherit__graph.md5
new file mode 100644
index 0000000..1e1b326
--- /dev/null
+++ b/doc/html/classqgis_1_1pktools_1_1pkcrop_1_1pkcrop__inherit__graph.md5
@@ -0,0 +1 @@
+34fa2dac6c0a33c03e1352b8cee4a33b
\ No newline at end of file
diff --git a/doc/html/classqgis_1_1pktools_1_1pkcrop_1_1pkcrop__inherit__graph.png b/doc/html/classqgis_1_1pktools_1_1pkcrop_1_1pkcrop__inherit__graph.png
new file mode 100644
index 0000000..38b78ed
Binary files /dev/null and b/doc/html/classqgis_1_1pktools_1_1pkcrop_1_1pkcrop__inherit__graph.png differ
diff --git a/doc/html/classqgis_1_1pktools_1_1pkdiff__accuracy_1_1pkdiff__accuracy-members.html b/doc/html/classqgis_1_1pktools_1_1pkdiff__accuracy_1_1pkdiff__accuracy-members.html
new file mode 100644
index 0000000..2aa73ce
--- /dev/null
+++ b/doc/html/classqgis_1_1pktools_1_1pkdiff__accuracy_1_1pkdiff__accuracy-members.html
@@ -0,0 +1,95 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.6"/>
+<title>pktools: Member List</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+  <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
+  <td style="padding-left: 0.5em;">
+   <div id="projectname">pktools
+    <span id="projectnumber">2.6.4</span>
+   </div>
+   <div id="projectbrief">Processing Kernel for geospatial data</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.6 -->
+  <div id="navrow1" class="tabs">
+    <ul class="tablist">
+      <li><a href="index.html"><span>Main Page</span></a></li>
+      <li><a href="pages.html"><span>Related Pages</span></a></li>
+      <li class="current"><a href="annotated.html"><span>Classes</span></a></li>
+      <li><a href="files.html"><span>Files</span></a></li>
+    </ul>
+  </div>
+  <div id="navrow2" class="tabs2">
+    <ul class="tablist">
+      <li><a href="annotated.html"><span>Class List</span></a></li>
+      <li><a href="classes.html"><span>Class Index</span></a></li>
+      <li><a href="inherits.html"><span>Class Hierarchy</span></a></li>
+      <li><a href="functions.html"><span>Class Members</span></a></li>
+    </ul>
+  </div>
+<div id="nav-path" class="navpath">
+  <ul>
+<li class="navelem"><b>qgis</b></li><li class="navelem"><b>pktools</b></li><li class="navelem"><b>pkdiff_accuracy</b></li><li class="navelem"><a class="el" href="classqgis_1_1pktools_1_1pkdiff__accuracy_1_1pkdiff__accuracy.html">pkdiff_accuracy</a></li>  </ul>
+</div>
+</div><!-- top -->
+<div class="header">
+  <div class="headertitle">
+<div class="title">qgis.pktools.pkdiff_accuracy.pkdiff_accuracy Member List</div>  </div>
+</div><!--header-->
+<div class="contents">
+
+<p>This is the complete list of members for <a class="el" href="classqgis_1_1pktools_1_1pkdiff__accuracy_1_1pkdiff__accuracy.html">qgis.pktools.pkdiff_accuracy.pkdiff_accuracy</a>, including all inherited members.</p>
+<table class="directory">
+  <tr bgcolor="#f0f0f0" class="even"><td class="entry"><b>cliName</b> (defined in <a class="el" href="classqgis_1_1pktools_1_1pkdiff__accuracy_1_1pkdiff__accuracy.html">qgis.pktools.pkdiff_accuracy.pkdiff_accuracy</a>)</td><td class="entry"><a class="el" href="classqgis_1_1pktools_1_1pkdiff__accuracy_1_1pkdiff__accuracy.html">qgis.pktools.pkdiff_accuracy.pkdiff_accuracy</a></td><td class="entry"></td></tr>
+  <tr bgcolor="#f0f0f0"><td class="entry"><b>CMFORMAT</b> (defined in <a class="el" href="classqgis_1_1pktools_1_1pkdiff__accuracy_1_1pkdiff__accuracy.html">qgis.pktools.pkdiff_accuracy.pkdiff_accuracy</a>)</td><td class="entry"><a class="el" href="classqgis_1_1pktools_1_1pkdiff__accuracy_1_1pkdiff__accuracy.html">qgis.pktools.pkdiff_accuracy.pkdiff_accuracy</a></td><td class="entry"><span class="mlabel">static</span></td></tr>
+  <tr bgcolor="#f0f0f0" class="even"><td class="entry"><b>CMFORMAT_OPTIONS</b> (defined in <a class="el" href="classqgis_1_1pktools_1_1pkdiff__accuracy_1_1pkdiff__accuracy.html">qgis.pktools.pkdiff_accuracy.pkdiff_accuracy</a>)</td><td class="entry"><a class="el" href="classqgis_1_1pktools_1_1pkdiff__accuracy_1_1pkdiff__accuracy.html">qgis.pktools.pkdiff_accuracy.pkdiff_accuracy</a></td><td class="entry"><span class="mlabel">static</span></td></tr>
+  <tr bgcolor="#f0f0f0"><td class="entry"><b>CMOUTPUT</b> (defined in <a class="el" href="classqgis_1_1pktools_1_1pkdiff__accuracy_1_1pkdiff__accuracy.html">qgis.pktools.pkdiff_accuracy.pkdiff_accuracy</a>)</td><td class="entry"><a class="el" href="classqgis_1_1pktools_1_1pkdiff__accuracy_1_1pkdiff__accuracy.html">qgis.pktools.pkdiff_accuracy.pkdiff_accuracy</a></td><td class="entry"><span class="mlabel">static</span></td></tr>
+  <tr bgcolor="#f0f0f0" class="even"><td class="entry"><b>defineCharacteristics</b> (defined in <a class="el" href="classqgis_1_1pktools_1_1pkdiff__accuracy_1_1pkdiff__accuracy.html">qgis.pktools.pkdiff_accuracy.pkdiff_accuracy</a>)</td><td class="entry"><a class="el" href="classqgis_1_1pktools_1_1pkdiff__accuracy_1_1pkdiff__accuracy.html">qgis.pktools.pkdiff_accuracy.pkdiff_accuracy</a></td><td class="entry"></td></tr>
+  <tr bgcolor="#f0f0f0"><td class="entry"><b>EXTRA</b> (defined in <a class="el" href="classqgis_1_1pktools_1_1pkdiff__accuracy_1_1pkdiff__accuracy.html">qgis.pktools.pkdiff_accuracy.pkdiff_accuracy</a>)</td><td class="entry"><a class="el" href="classqgis_1_1pktools_1_1pkdiff__accuracy_1_1pkdiff__accuracy.html">qgis.pktools.pkdiff_accuracy.pkdiff_accuracy</a></td><td class="entry"><span class="mlabel">static</span></td></tr>
+  <tr bgcolor="#f0f0f0" class="even"><td class="entry"><b>FORMAT</b> (defined in <a class="el" href="classqgis_1_1pktools_1_1pkdiff__accuracy_1_1pkdiff__accuracy.html">qgis.pktools.pkdiff_accuracy.pkdiff_accuracy</a>)</td><td class="entry"><a class="el" href="classqgis_1_1pktools_1_1pkdiff__accuracy_1_1pkdiff__accuracy.html">qgis.pktools.pkdiff_accuracy.pkdiff_accuracy</a></td><td class="entry"><span class="mlabel">static</span></td></tr>
+  <tr bgcolor="#f0f0f0"><td class="entry"><b>group</b> (defined in <a class="el" href="classqgis_1_1pktools_1_1pkdiff__accuracy_1_1pkdiff__accuracy.html">qgis.pktools.pkdiff_accuracy.pkdiff_accuracy</a>)</td><td class="entry"><a class="el" href="classqgis_1_1pktools_1_1pkdiff__accuracy_1_1pkdiff__accuracy.html">qgis.pktools.pkdiff_accuracy.pkdiff_accuracy</a></td><td class="entry"></td></tr>
+  <tr bgcolor="#f0f0f0" class="even"><td class="entry"><b>INPUT</b> (defined in <a class="el" href="classqgis_1_1pktools_1_1pkdiff__accuracy_1_1pkdiff__accuracy.html">qgis.pktools.pkdiff_accuracy.pkdiff_accuracy</a>)</td><td class="entry"><a class="el" href="classqgis_1_1pktools_1_1pkdiff__accuracy_1_1pkdiff__accuracy.html">qgis.pktools.pkdiff_accuracy.pkdiff_accuracy</a></td><td class="entry"><span class="mlabel">static</span></td></tr>
+  <tr bgcolor="#f0f0f0"><td class="entry"><b>ITERATE</b> (defined in <a class="el" href="classqgis_1_1pktools_1_1pkdiff__accuracy_1_1pkdiff__accuracy.html">qgis.pktools.pkdiff_accuracy.pkdiff_accuracy</a>)</td><td class="entry"><a class="el" href="classqgis_1_1pktools_1_1pkdiff__accuracy_1_1pkdiff__accuracy.html">qgis.pktools.pkdiff_accuracy.pkdiff_accuracy</a></td><td class="entry"><span class="mlabel">static</span></td></tr>
+  <tr bgcolor="#f0f0f0" class="even"><td class="entry"><b>LABELCLASS</b> (defined in <a class="el" href="classqgis_1_1pktools_1_1pkdiff__accuracy_1_1pkdiff__accuracy.html">qgis.pktools.pkdiff_accuracy.pkdiff_accuracy</a>)</td><td class="entry"><a class="el" href="classqgis_1_1pktools_1_1pkdiff__accuracy_1_1pkdiff__accuracy.html">qgis.pktools.pkdiff_accuracy.pkdiff_accuracy</a></td><td class="entry"><span class="mlabel">static</span></td></tr>
+  <tr bgcolor="#f0f0f0"><td class="entry"><b>LABELREF</b> (defined in <a class="el" href="classqgis_1_1pktools_1_1pkdiff__accuracy_1_1pkdiff__accuracy.html">qgis.pktools.pkdiff_accuracy.pkdiff_accuracy</a>)</td><td class="entry"><a class="el" href="classqgis_1_1pktools_1_1pkdiff__accuracy_1_1pkdiff__accuracy.html">qgis.pktools.pkdiff_accuracy.pkdiff_accuracy</a></td><td class="entry"><span class="mlabel">static</span></td></tr>
+  <tr bgcolor="#f0f0f0" class="even"><td class="entry"><b>name</b> (defined in <a class="el" href="classqgis_1_1pktools_1_1pkdiff__accuracy_1_1pkdiff__accuracy.html">qgis.pktools.pkdiff_accuracy.pkdiff_accuracy</a>)</td><td class="entry"><a class="el" href="classqgis_1_1pktools_1_1pkdiff__accuracy_1_1pkdiff__accuracy.html">qgis.pktools.pkdiff_accuracy.pkdiff_accuracy</a></td><td class="entry"></td></tr>
+  <tr bgcolor="#f0f0f0"><td class="entry"><b>NODATA</b> (defined in <a class="el" href="classqgis_1_1pktools_1_1pkdiff__accuracy_1_1pkdiff__accuracy.html">qgis.pktools.pkdiff_accuracy.pkdiff_accuracy</a>)</td><td class="entry"><a class="el" href="classqgis_1_1pktools_1_1pkdiff__accuracy_1_1pkdiff__accuracy.html">qgis.pktools.pkdiff_accuracy.pkdiff_accuracy</a></td><td class="entry"><span class="mlabel">static</span></td></tr>
+  <tr bgcolor="#f0f0f0" class="even"><td class="entry"><b>OUTPUT</b> (defined in <a class="el" href="classqgis_1_1pktools_1_1pkdiff__accuracy_1_1pkdiff__accuracy.html">qgis.pktools.pkdiff_accuracy.pkdiff_accuracy</a>)</td><td class="entry"><a class="el" href="classqgis_1_1pktools_1_1pkdiff__accuracy_1_1pkdiff__accuracy.html">qgis.pktools.pkdiff_accuracy.pkdiff_accuracy</a></td><td class="entry"><span class="mlabel">static</span></td></tr>
+  <tr bgcolor="#f0f0f0"><td class="entry"><b>processAlgorithm</b> (defined in <a class="el" href="classqgis_1_1pktools_1_1pkdiff__accuracy_1_1pkdiff__accuracy.html">qgis.pktools.pkdiff_accuracy.pkdiff_accuracy</a>)</td><td class="entry"><a class="el" href="classqgis_1_1pktools_1_1pkdiff__accuracy_1_1pkdiff__accuracy.html">qgis.pktools.pkdiff_accuracy.pkdiff_accuracy</a></td><td class="entry"></td></tr>
+  <tr bgcolor="#f0f0f0" class="even"><td class="entry"><b>REFERENCE</b> (defined in <a class="el" href="classqgis_1_1pktools_1_1pkdiff__accuracy_1_1pkdiff__accuracy.html">qgis.pktools.pkdiff_accuracy.pkdiff_accuracy</a>)</td><td class="entry"><a class="el" href="classqgis_1_1pktools_1_1pkdiff__accuracy_1_1pkdiff__accuracy.html">qgis.pktools.pkdiff_accuracy.pkdiff_accuracy</a></td><td class="entry"><span class="mlabel">static</span></td></tr>
+</table></div><!-- contents -->
+<!-- HTML footer for doxygen 1.8.4-->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/>
+</a> 1.8.6
+</small></address>
+<script>
+  (function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
+  (i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
+  m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
+  })(window,document,'script','//www.google-analytics.com/analytics.js','ga');
+  ga('create', 'UA-46952639-1', 'nongnu.org');
+  ga('send', 'pageview');
+</script>
+</body>
+</html>
diff --git a/doc/html/classqgis_1_1pkdiff__accuracy_1_1pkdiff__accuracy.html b/doc/html/classqgis_1_1pktools_1_1pkdiff__accuracy_1_1pkdiff__accuracy.html
similarity index 62%
copy from doc/html/classqgis_1_1pkdiff__accuracy_1_1pkdiff__accuracy.html
copy to doc/html/classqgis_1_1pktools_1_1pkdiff__accuracy_1_1pkdiff__accuracy.html
index 6dcc7cb..add4257 100644
--- a/doc/html/classqgis_1_1pkdiff__accuracy_1_1pkdiff__accuracy.html
+++ b/doc/html/classqgis_1_1pktools_1_1pkdiff__accuracy_1_1pkdiff__accuracy.html
@@ -4,7 +4,7 @@
 <meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
 <meta http-equiv="X-UA-Compatible" content="IE=9"/>
 <meta name="generator" content="Doxygen 1.8.6"/>
-<title>pktools: qgis.pkdiff_accuracy.pkdiff_accuracy Class Reference</title>
+<title>pktools: qgis.pktools.pkdiff_accuracy.pkdiff_accuracy Class Reference</title>
 <link href="tabs.css" rel="stylesheet" type="text/css"/>
 <script type="text/javascript" src="jquery.js"></script>
 <script type="text/javascript" src="dynsections.js"></script>
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.3</span>
+    <span id="projectnumber">2.6.4</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -47,7 +47,7 @@
   </div>
 <div id="nav-path" class="navpath">
   <ul>
-<li class="navelem"><b>qgis</b></li><li class="navelem"><b>pkdiff_accuracy</b></li><li class="navelem"><a class="el" href="classqgis_1_1pkdiff__accuracy_1_1pkdiff__accuracy.html">pkdiff_accuracy</a></li>  </ul>
+<li class="navelem"><b>qgis</b></li><li class="navelem"><b>pktools</b></li><li class="navelem"><b>pkdiff_accuracy</b></li><li class="navelem"><a class="el" href="classqgis_1_1pktools_1_1pkdiff__accuracy_1_1pkdiff__accuracy.html">pkdiff_accuracy</a></li>  </ul>
 </div>
 </div><!-- top -->
 <div class="header">
@@ -55,93 +55,93 @@
 <a href="#pub-methods">Public Member Functions</a> |
 <a href="#pub-attribs">Public Attributes</a> |
 <a href="#pub-static-attribs">Static Public Attributes</a> |
-<a href="classqgis_1_1pkdiff__accuracy_1_1pkdiff__accuracy-members.html">List of all members</a>  </div>
+<a href="classqgis_1_1pktools_1_1pkdiff__accuracy_1_1pkdiff__accuracy-members.html">List of all members</a>  </div>
   <div class="headertitle">
-<div class="title">qgis.pkdiff_accuracy.pkdiff_accuracy Class Reference</div>  </div>
+<div class="title">qgis.pktools.pkdiff_accuracy.pkdiff_accuracy Class Reference</div>  </div>
 </div><!--header-->
 <div class="contents">
 <div class="dynheader">
-Inheritance diagram for qgis.pkdiff_accuracy.pkdiff_accuracy:</div>
+Inheritance diagram for qgis.pktools.pkdiff_accuracy.pkdiff_accuracy:</div>
 <div class="dyncontent">
-<div class="center"><img src="classqgis_1_1pkdiff__accuracy_1_1pkdiff__accuracy__inherit__graph.png" border="0" usemap="#qgis_8pkdiff__accuracy_8pkdiff__accuracy_inherit__map" alt="Inheritance graph"/></div>
+<div class="center"><img src="classqgis_1_1pktools_1_1pkdiff__accuracy_1_1pkdiff__accuracy__inherit__graph.png" border="0" usemap="#qgis_8pktools_8pkdiff__accuracy_8pkdiff__accuracy_inherit__map" alt="Inheritance graph"/></div>
 <center><span class="legend">[<a href="graph_legend.html">legend</a>]</span></center></div>
 <div class="dynheader">
-Collaboration diagram for qgis.pkdiff_accuracy.pkdiff_accuracy:</div>
+Collaboration diagram for qgis.pktools.pkdiff_accuracy.pkdiff_accuracy:</div>
 <div class="dyncontent">
-<div class="center"><img src="classqgis_1_1pkdiff__accuracy_1_1pkdiff__accuracy__coll__graph.png" border="0" usemap="#qgis_8pkdiff__accuracy_8pkdiff__accuracy_coll__map" alt="Collaboration graph"/></div>
+<div class="center"><img src="classqgis_1_1pktools_1_1pkdiff__accuracy_1_1pkdiff__accuracy__coll__graph.png" border="0" usemap="#qgis_8pktools_8pkdiff__accuracy_8pkdiff__accuracy_coll__map" alt="Collaboration graph"/></div>
 <center><span class="legend">[<a href="graph_legend.html">legend</a>]</span></center></div>
 <table class="memberdecls">
 <tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pub-methods"></a>
 Public Member Functions</h2></td></tr>
-<tr class="memitem:a176e2f67f3be853c9197d99f4cd16a1c"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a176e2f67f3be853c9197d99f4cd16a1c"></a>
+<tr class="memitem:a55056565ea9f8f166997ca32bcf92d68"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a55056565ea9f8f166997ca32bcf92d68"></a>
 def </td><td class="memItemRight" valign="bottom"><b>cliName</b></td></tr>
-<tr class="separator:a176e2f67f3be853c9197d99f4cd16a1c"><td class="memSeparator" colspan="2"> </td></tr>
-<tr class="memitem:a616318b2e7f62de1a61615b3192af1bc"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a616318b2e7f62de1a61615b3192af1bc"></a>
+<tr class="separator:a55056565ea9f8f166997ca32bcf92d68"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:a7c5c16b265bf74afd3deed5d22b558e9"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a7c5c16b265bf74afd3deed5d22b558e9"></a>
 def </td><td class="memItemRight" valign="bottom"><b>defineCharacteristics</b></td></tr>
-<tr class="separator:a616318b2e7f62de1a61615b3192af1bc"><td class="memSeparator" colspan="2"> </td></tr>
-<tr class="memitem:a4cf4fcd1ae42c2380732c1d6b88cbe21"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a4cf4fcd1ae42c2380732c1d6b88cbe21"></a>
+<tr class="separator:a7c5c16b265bf74afd3deed5d22b558e9"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:a9c3ca1bf87e3a75d121b7a4518cf5be1"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a9c3ca1bf87e3a75d121b7a4518cf5be1"></a>
 def </td><td class="memItemRight" valign="bottom"><b>processAlgorithm</b></td></tr>
-<tr class="separator:a4cf4fcd1ae42c2380732c1d6b88cbe21"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="separator:a9c3ca1bf87e3a75d121b7a4518cf5be1"><td class="memSeparator" colspan="2"> </td></tr>
 </table><table class="memberdecls">
 <tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pub-attribs"></a>
 Public Attributes</h2></td></tr>
-<tr class="memitem:aa1a0571329dbfd38e21385392bab8de1"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="aa1a0571329dbfd38e21385392bab8de1"></a>
+<tr class="memitem:adde47dc64982051137c51b2b9c45d686"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="adde47dc64982051137c51b2b9c45d686"></a>
  </td><td class="memItemRight" valign="bottom"><b>name</b></td></tr>
-<tr class="separator:aa1a0571329dbfd38e21385392bab8de1"><td class="memSeparator" colspan="2"> </td></tr>
-<tr class="memitem:a724b6dc67c93a4392de92dcfca91f701"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a724b6dc67c93a4392de92dcfca91f701"></a>
+<tr class="separator:adde47dc64982051137c51b2b9c45d686"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:a25a018181afee40dea3e4d5275747bb7"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a25a018181afee40dea3e4d5275747bb7"></a>
  </td><td class="memItemRight" valign="bottom"><b>group</b></td></tr>
-<tr class="separator:a724b6dc67c93a4392de92dcfca91f701"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="separator:a25a018181afee40dea3e4d5275747bb7"><td class="memSeparator" colspan="2"> </td></tr>
 </table><table class="memberdecls">
 <tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pub-static-attribs"></a>
 Static Public Attributes</h2></td></tr>
-<tr class="memitem:a6cabc221036f66d975847866eaf14dd9"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a6cabc221036f66d975847866eaf14dd9"></a>
+<tr class="memitem:ab4e343f53122cd27e365391daa149b8e"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="ab4e343f53122cd27e365391daa149b8e"></a>
 string </td><td class="memItemRight" valign="bottom"><b>INPUT</b> = "INPUT"</td></tr>
-<tr class="separator:a6cabc221036f66d975847866eaf14dd9"><td class="memSeparator" colspan="2"> </td></tr>
-<tr class="memitem:afdaa56e3a00e8ad32fffd8600b998b92"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="afdaa56e3a00e8ad32fffd8600b998b92"></a>
+<tr class="separator:ab4e343f53122cd27e365391daa149b8e"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:ab721f3d9ae2c876ef39abc3b07a12530"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="ab721f3d9ae2c876ef39abc3b07a12530"></a>
 string </td><td class="memItemRight" valign="bottom"><b>REFERENCE</b> = "REFERENCE"</td></tr>
-<tr class="separator:afdaa56e3a00e8ad32fffd8600b998b92"><td class="memSeparator" colspan="2"> </td></tr>
-<tr class="memitem:a2a294e32e185d1f58bbde4ae40f62c55"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a2a294e32e185d1f58bbde4ae40f62c55"></a>
+<tr class="separator:ab721f3d9ae2c876ef39abc3b07a12530"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:a04cec215fc970c27c9cbbe0ddcd7a2b5"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a04cec215fc970c27c9cbbe0ddcd7a2b5"></a>
 string </td><td class="memItemRight" valign="bottom"><b>ITERATE</b> = "ITERATE"</td></tr>
-<tr class="separator:a2a294e32e185d1f58bbde4ae40f62c55"><td class="memSeparator" colspan="2"> </td></tr>
-<tr class="memitem:a99f5e02f16130f80143086252a38ee93"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a99f5e02f16130f80143086252a38ee93"></a>
+<tr class="separator:a04cec215fc970c27c9cbbe0ddcd7a2b5"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:a392cc9957b286d74ad2515c0dba4a695"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a392cc9957b286d74ad2515c0dba4a695"></a>
 string </td><td class="memItemRight" valign="bottom"><b>LABELREF</b> = "LABELREF"</td></tr>
-<tr class="separator:a99f5e02f16130f80143086252a38ee93"><td class="memSeparator" colspan="2"> </td></tr>
-<tr class="memitem:a02de7992fb58aea0f628f8f3c1c937ac"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a02de7992fb58aea0f628f8f3c1c937ac"></a>
+<tr class="separator:a392cc9957b286d74ad2515c0dba4a695"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:ae62e0e32e5c75f22f5a8ef0f521f5cce"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="ae62e0e32e5c75f22f5a8ef0f521f5cce"></a>
 string </td><td class="memItemRight" valign="bottom"><b>NODATA</b> = "NODATA"</td></tr>
-<tr class="separator:a02de7992fb58aea0f628f8f3c1c937ac"><td class="memSeparator" colspan="2"> </td></tr>
-<tr class="memitem:a22d37343b09f74019a836f1489d24c02"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a22d37343b09f74019a836f1489d24c02"></a>
+<tr class="separator:ae62e0e32e5c75f22f5a8ef0f521f5cce"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:ae64041efab08dd8fa6c19b625e168761"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="ae64041efab08dd8fa6c19b625e168761"></a>
 string </td><td class="memItemRight" valign="bottom"><b>OUTPUT</b> = "OUTPUT"</td></tr>
-<tr class="separator:a22d37343b09f74019a836f1489d24c02"><td class="memSeparator" colspan="2"> </td></tr>
-<tr class="memitem:a792f4cf29ee2f6034149c0233b32f4ff"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a792f4cf29ee2f6034149c0233b32f4ff"></a>
+<tr class="separator:ae64041efab08dd8fa6c19b625e168761"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:a53f02145c4734a0655c70a3d7b4950f6"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a53f02145c4734a0655c70a3d7b4950f6"></a>
 string </td><td class="memItemRight" valign="bottom"><b>CMOUTPUT</b> = "CMOUTPUT"</td></tr>
-<tr class="separator:a792f4cf29ee2f6034149c0233b32f4ff"><td class="memSeparator" colspan="2"> </td></tr>
-<tr class="memitem:a2ed757ec7259c4b56bee1acc8bbe1a61"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a2ed757ec7259c4b56bee1acc8bbe1a61"></a>
+<tr class="separator:a53f02145c4734a0655c70a3d7b4950f6"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:ad1221f675d9b9d779d83abbf9b437146"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="ad1221f675d9b9d779d83abbf9b437146"></a>
 list </td><td class="memItemRight" valign="bottom"><b>CMFORMAT_OPTIONS</b> = ["ascii", "latex"]</td></tr>
-<tr class="separator:a2ed757ec7259c4b56bee1acc8bbe1a61"><td class="memSeparator" colspan="2"> </td></tr>
-<tr class="memitem:a21c954c78e110bb1c93de64075afe182"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a21c954c78e110bb1c93de64075afe182"></a>
+<tr class="separator:ad1221f675d9b9d779d83abbf9b437146"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:a4b776ec91fa5d020d7680eca874427e2"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a4b776ec91fa5d020d7680eca874427e2"></a>
 string </td><td class="memItemRight" valign="bottom"><b>CMFORMAT</b> = "CMFORMAT"</td></tr>
-<tr class="separator:a21c954c78e110bb1c93de64075afe182"><td class="memSeparator" colspan="2"> </td></tr>
-<tr class="memitem:ab922ac43189488cb53e46bccd0d02b6a"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="ab922ac43189488cb53e46bccd0d02b6a"></a>
+<tr class="separator:a4b776ec91fa5d020d7680eca874427e2"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:a1fbcff81b3676249f0408de6319950d9"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a1fbcff81b3676249f0408de6319950d9"></a>
 string </td><td class="memItemRight" valign="bottom"><b>FORMAT</b> = "FORMAT"</td></tr>
-<tr class="separator:ab922ac43189488cb53e46bccd0d02b6a"><td class="memSeparator" colspan="2"> </td></tr>
-<tr class="memitem:a7580c2442f384fcc956e14d936a3a305"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a7580c2442f384fcc956e14d936a3a305"></a>
+<tr class="separator:a1fbcff81b3676249f0408de6319950d9"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:a2d4f21a8f0057584931a3a696a5d1b75"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a2d4f21a8f0057584931a3a696a5d1b75"></a>
 string </td><td class="memItemRight" valign="bottom"><b>LABELCLASS</b> = "LABELCLASS"</td></tr>
-<tr class="separator:a7580c2442f384fcc956e14d936a3a305"><td class="memSeparator" colspan="2"> </td></tr>
-<tr class="memitem:a83684b7d1751c3e507df1b2a61c06e7d"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a83684b7d1751c3e507df1b2a61c06e7d"></a>
+<tr class="separator:a2d4f21a8f0057584931a3a696a5d1b75"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:a5779733ceff946ac04ec1f6d0e494452"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a5779733ceff946ac04ec1f6d0e494452"></a>
 string </td><td class="memItemRight" valign="bottom"><b>EXTRA</b> = 'EXTRA'</td></tr>
-<tr class="separator:a83684b7d1751c3e507df1b2a61c06e7d"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="separator:a5779733ceff946ac04ec1f6d0e494452"><td class="memSeparator" colspan="2"> </td></tr>
 </table>
 <a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
 <div class="textblock">
-<p>Definition at line <a class="el" href="pkdiff__accuracy_8py_source.html#l00093">93</a> of file <a class="el" href="pkdiff__accuracy_8py_source.html">pkdiff_accuracy.py</a>.</p>
+<p>Definition at line <a class="el" href="pktools_2pkdiff__accuracy_8py_source.html#l00093">93</a> of file <a class="el" href="pktools_2pkdiff__accuracy_8py_source.html">pkdiff_accuracy.py</a>.</p>
 </div><hr/>The documentation for this class was generated from the following file:<ul>
-<li>/home/kempenep/pktools/qgis/<a class="el" href="pkdiff__accuracy_8py_source.html">pkdiff_accuracy.py</a></li>
+<li>/home/kempenep/pktools/qgis/pktools/<a class="el" href="pktools_2pkdiff__accuracy_8py_source.html">pkdiff_accuracy.py</a></li>
 </ul>
 </div><!-- contents -->
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Jun 23 2015 17:09:37 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/classqgis_1_1pktools_1_1pkdiff__accuracy_1_1pkdiff__accuracy__coll__graph.map b/doc/html/classqgis_1_1pktools_1_1pkdiff__accuracy_1_1pkdiff__accuracy__coll__graph.map
new file mode 100644
index 0000000..2a43123
--- /dev/null
+++ b/doc/html/classqgis_1_1pktools_1_1pkdiff__accuracy_1_1pkdiff__accuracy__coll__graph.map
@@ -0,0 +1,2 @@
+<map id="qgis.pktools.pkdiff_accuracy.pkdiff_accuracy" name="qgis.pktools.pkdiff_accuracy.pkdiff_accuracy">
+</map>
diff --git a/doc/html/classqgis_1_1pktools_1_1pkdiff__accuracy_1_1pkdiff__accuracy__coll__graph.md5 b/doc/html/classqgis_1_1pktools_1_1pkdiff__accuracy_1_1pkdiff__accuracy__coll__graph.md5
new file mode 100644
index 0000000..f6f9af4
--- /dev/null
+++ b/doc/html/classqgis_1_1pktools_1_1pkdiff__accuracy_1_1pkdiff__accuracy__coll__graph.md5
@@ -0,0 +1 @@
+cf65be9c6ad90b6aea751effcc659aed
\ No newline at end of file
diff --git a/doc/html/classqgis_1_1pktools_1_1pkdiff__accuracy_1_1pkdiff__accuracy__coll__graph.png b/doc/html/classqgis_1_1pktools_1_1pkdiff__accuracy_1_1pkdiff__accuracy__coll__graph.png
new file mode 100644
index 0000000..9f59937
Binary files /dev/null and b/doc/html/classqgis_1_1pktools_1_1pkdiff__accuracy_1_1pkdiff__accuracy__coll__graph.png differ
diff --git a/doc/html/classqgis_1_1pktools_1_1pkextract_1_1pkextract-members.html b/doc/html/classqgis_1_1pktools_1_1pkextract_1_1pkextract-members.html
new file mode 100644
index 0000000..6381188
--- /dev/null
+++ b/doc/html/classqgis_1_1pktools_1_1pkextract_1_1pkextract-members.html
@@ -0,0 +1,95 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.6"/>
+<title>pktools: Member List</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+  <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
+  <td style="padding-left: 0.5em;">
+   <div id="projectname">pktools
+    <span id="projectnumber">2.6.4</span>
+   </div>
+   <div id="projectbrief">Processing Kernel for geospatial data</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.6 -->
+  <div id="navrow1" class="tabs">
+    <ul class="tablist">
+      <li><a href="index.html"><span>Main Page</span></a></li>
+      <li><a href="pages.html"><span>Related Pages</span></a></li>
+      <li class="current"><a href="annotated.html"><span>Classes</span></a></li>
+      <li><a href="files.html"><span>Files</span></a></li>
+    </ul>
+  </div>
+  <div id="navrow2" class="tabs2">
+    <ul class="tablist">
+      <li><a href="annotated.html"><span>Class List</span></a></li>
+      <li><a href="classes.html"><span>Class Index</span></a></li>
+      <li><a href="inherits.html"><span>Class Hierarchy</span></a></li>
+      <li><a href="functions.html"><span>Class Members</span></a></li>
+    </ul>
+  </div>
+<div id="nav-path" class="navpath">
+  <ul>
+<li class="navelem"><b>qgis</b></li><li class="navelem"><b>pktools</b></li><li class="navelem"><b>pkextract</b></li><li class="navelem"><a class="el" href="classqgis_1_1pktools_1_1pkextract_1_1pkextract.html">pkextract</a></li>  </ul>
+</div>
+</div><!-- top -->
+<div class="header">
+  <div class="headertitle">
+<div class="title">qgis.pktools.pkextract.pkextract Member List</div>  </div>
+</div><!--header-->
+<div class="contents">
+
+<p>This is the complete list of members for <a class="el" href="classqgis_1_1pktools_1_1pkextract_1_1pkextract.html">qgis.pktools.pkextract.pkextract</a>, including all inherited members.</p>
+<table class="directory">
+  <tr bgcolor="#f0f0f0" class="even"><td class="entry"><b>BNDNODATA</b> (defined in <a class="el" href="classqgis_1_1pktools_1_1pkextract_1_1pkextract.html">qgis.pktools.pkextract.pkextract</a>)</td><td class="entry"><a class="el" href="classqgis_1_1pktools_1_1pkextract_1_1pkextract.html">qgis.pktools.pkextract.pkextract</a></td><td class="entry"><span class="mlabel">static</span></td></tr>
+  <tr bgcolor="#f0f0f0"><td class="entry"><b>BUFFER</b> (defined in <a class="el" href="classqgis_1_1pktools_1_1pkextract_1_1pkextract.html">qgis.pktools.pkextract.pkextract</a>)</td><td class="entry"><a class="el" href="classqgis_1_1pktools_1_1pkextract_1_1pkextract.html">qgis.pktools.pkextract.pkextract</a></td><td class="entry"><span class="mlabel">static</span></td></tr>
+  <tr bgcolor="#f0f0f0" class="even"><td class="entry"><b>cliName</b> (defined in <a class="el" href="classqgis_1_1pktools_1_1pkextract_1_1pkextract.html">qgis.pktools.pkextract.pkextract</a>)</td><td class="entry"><a class="el" href="classqgis_1_1pktools_1_1pkextract_1_1pkextract.html">qgis.pktools.pkextract.pkextract</a></td><td class="entry"></td></tr>
+  <tr bgcolor="#f0f0f0"><td class="entry"><b>defineCharacteristics</b> (defined in <a class="el" href="classqgis_1_1pktools_1_1pkextract_1_1pkextract.html">qgis.pktools.pkextract.pkextract</a>)</td><td class="entry"><a class="el" href="classqgis_1_1pktools_1_1pkextract_1_1pkextract.html">qgis.pktools.pkextract.pkextract</a></td><td class="entry"></td></tr>
+  <tr bgcolor="#f0f0f0" class="even"><td class="entry"><b>EXTRA</b> (defined in <a class="el" href="classqgis_1_1pktools_1_1pkextract_1_1pkextract.html">qgis.pktools.pkextract.pkextract</a>)</td><td class="entry"><a class="el" href="classqgis_1_1pktools_1_1pkextract_1_1pkextract.html">qgis.pktools.pkextract.pkextract</a></td><td class="entry"><span class="mlabel">static</span></td></tr>
+  <tr bgcolor="#f0f0f0"><td class="entry"><b>FORMAT</b> (defined in <a class="el" href="classqgis_1_1pktools_1_1pkextract_1_1pkextract.html">qgis.pktools.pkextract.pkextract</a>)</td><td class="entry"><a class="el" href="classqgis_1_1pktools_1_1pkextract_1_1pkextract.html">qgis.pktools.pkextract.pkextract</a></td><td class="entry"><span class="mlabel">static</span></td></tr>
+  <tr bgcolor="#f0f0f0" class="even"><td class="entry"><b>group</b> (defined in <a class="el" href="classqgis_1_1pktools_1_1pkextract_1_1pkextract.html">qgis.pktools.pkextract.pkextract</a>)</td><td class="entry"><a class="el" href="classqgis_1_1pktools_1_1pkextract_1_1pkextract.html">qgis.pktools.pkextract.pkextract</a></td><td class="entry"></td></tr>
+  <tr bgcolor="#f0f0f0"><td class="entry"><b>INPUT</b> (defined in <a class="el" href="classqgis_1_1pktools_1_1pkextract_1_1pkextract.html">qgis.pktools.pkextract.pkextract</a>)</td><td class="entry"><a class="el" href="classqgis_1_1pktools_1_1pkextract_1_1pkextract.html">qgis.pktools.pkextract.pkextract</a></td><td class="entry"><span class="mlabel">static</span></td></tr>
+  <tr bgcolor="#f0f0f0" class="even"><td class="entry"><b>ITERATE</b> (defined in <a class="el" href="classqgis_1_1pktools_1_1pkextract_1_1pkextract.html">qgis.pktools.pkextract.pkextract</a>)</td><td class="entry"><a class="el" href="classqgis_1_1pktools_1_1pkextract_1_1pkextract.html">qgis.pktools.pkextract.pkextract</a></td><td class="entry"><span class="mlabel">static</span></td></tr>
+  <tr bgcolor="#f0f0f0"><td class="entry"><b>name</b> (defined in <a class="el" href="classqgis_1_1pktools_1_1pkextract_1_1pkextract.html">qgis.pktools.pkextract.pkextract</a>)</td><td class="entry"><a class="el" href="classqgis_1_1pktools_1_1pkextract_1_1pkextract.html">qgis.pktools.pkextract.pkextract</a></td><td class="entry"></td></tr>
+  <tr bgcolor="#f0f0f0" class="even"><td class="entry"><b>OUTPUT</b> (defined in <a class="el" href="classqgis_1_1pktools_1_1pkextract_1_1pkextract.html">qgis.pktools.pkextract.pkextract</a>)</td><td class="entry"><a class="el" href="classqgis_1_1pktools_1_1pkextract_1_1pkextract.html">qgis.pktools.pkextract.pkextract</a></td><td class="entry"><span class="mlabel">static</span></td></tr>
+  <tr bgcolor="#f0f0f0"><td class="entry"><b>POLYGON</b> (defined in <a class="el" href="classqgis_1_1pktools_1_1pkextract_1_1pkextract.html">qgis.pktools.pkextract.pkextract</a>)</td><td class="entry"><a class="el" href="classqgis_1_1pktools_1_1pkextract_1_1pkextract.html">qgis.pktools.pkextract.pkextract</a></td><td class="entry"><span class="mlabel">static</span></td></tr>
+  <tr bgcolor="#f0f0f0" class="even"><td class="entry"><b>processAlgorithm</b> (defined in <a class="el" href="classqgis_1_1pktools_1_1pkextract_1_1pkextract.html">qgis.pktools.pkextract.pkextract</a>)</td><td class="entry"><a class="el" href="classqgis_1_1pktools_1_1pkextract_1_1pkextract.html">qgis.pktools.pkextract.pkextract</a></td><td class="entry"></td></tr>
+  <tr bgcolor="#f0f0f0"><td class="entry"><b>RULE</b> (defined in <a class="el" href="classqgis_1_1pktools_1_1pkextract_1_1pkextract.html">qgis.pktools.pkextract.pkextract</a>)</td><td class="entry"><a class="el" href="classqgis_1_1pktools_1_1pkextract_1_1pkextract.html">qgis.pktools.pkextract.pkextract</a></td><td class="entry"><span class="mlabel">static</span></td></tr>
+  <tr bgcolor="#f0f0f0" class="even"><td class="entry"><b>RULE_OPTIONS</b> (defined in <a class="el" href="classqgis_1_1pktools_1_1pkextract_1_1pkextract.html">qgis.pktools.pkextract.pkextract</a>)</td><td class="entry"><a class="el" href="classqgis_1_1pktools_1_1pkextract_1_1pkextract.html">qgis.pktools.pkextract.pkextract</a></td><td class="entry"><span class="mlabel">static</span></td></tr>
+  <tr bgcolor="#f0f0f0"><td class="entry"><b>SAMPLE</b> (defined in <a class="el" href="classqgis_1_1pktools_1_1pkextract_1_1pkextract.html">qgis.pktools.pkextract.pkextract</a>)</td><td class="entry"><a class="el" href="classqgis_1_1pktools_1_1pkextract_1_1pkextract.html">qgis.pktools.pkextract.pkextract</a></td><td class="entry"><span class="mlabel">static</span></td></tr>
+  <tr bgcolor="#f0f0f0" class="even"><td class="entry"><b>SRCNODATA</b> (defined in <a class="el" href="classqgis_1_1pktools_1_1pkextract_1_1pkextract.html">qgis.pktools.pkextract.pkextract</a>)</td><td class="entry"><a class="el" href="classqgis_1_1pktools_1_1pkextract_1_1pkextract.html">qgis.pktools.pkextract.pkextract</a></td><td class="entry"><span class="mlabel">static</span></td></tr>
+</table></div><!-- contents -->
+<!-- HTML footer for doxygen 1.8.4-->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/>
+</a> 1.8.6
+</small></address>
+<script>
+  (function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
+  (i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
+  m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
+  })(window,document,'script','//www.google-analytics.com/analytics.js','ga');
+  ga('create', 'UA-46952639-1', 'nongnu.org');
+  ga('send', 'pageview');
+</script>
+</body>
+</html>
diff --git a/doc/html/classqgis_1_1pkextract_1_1pkextract.html b/doc/html/classqgis_1_1pktools_1_1pkextract_1_1pkextract.html
similarity index 63%
copy from doc/html/classqgis_1_1pkextract_1_1pkextract.html
copy to doc/html/classqgis_1_1pktools_1_1pkextract_1_1pkextract.html
index 83e83b2..82aae98 100644
--- a/doc/html/classqgis_1_1pkextract_1_1pkextract.html
+++ b/doc/html/classqgis_1_1pktools_1_1pkextract_1_1pkextract.html
@@ -4,7 +4,7 @@
 <meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
 <meta http-equiv="X-UA-Compatible" content="IE=9"/>
 <meta name="generator" content="Doxygen 1.8.6"/>
-<title>pktools: qgis.pkextract.pkextract Class Reference</title>
+<title>pktools: qgis.pktools.pkextract.pkextract Class Reference</title>
 <link href="tabs.css" rel="stylesheet" type="text/css"/>
 <script type="text/javascript" src="jquery.js"></script>
 <script type="text/javascript" src="dynsections.js"></script>
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.3</span>
+    <span id="projectnumber">2.6.4</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -47,7 +47,7 @@
   </div>
 <div id="nav-path" class="navpath">
   <ul>
-<li class="navelem"><b>qgis</b></li><li class="navelem"><b>pkextract</b></li><li class="navelem"><a class="el" href="classqgis_1_1pkextract_1_1pkextract.html">pkextract</a></li>  </ul>
+<li class="navelem"><b>qgis</b></li><li class="navelem"><b>pktools</b></li><li class="navelem"><b>pkextract</b></li><li class="navelem"><a class="el" href="classqgis_1_1pktools_1_1pkextract_1_1pkextract.html">pkextract</a></li>  </ul>
 </div>
 </div><!-- top -->
 <div class="header">
@@ -55,93 +55,93 @@
 <a href="#pub-methods">Public Member Functions</a> |
 <a href="#pub-attribs">Public Attributes</a> |
 <a href="#pub-static-attribs">Static Public Attributes</a> |
-<a href="classqgis_1_1pkextract_1_1pkextract-members.html">List of all members</a>  </div>
+<a href="classqgis_1_1pktools_1_1pkextract_1_1pkextract-members.html">List of all members</a>  </div>
   <div class="headertitle">
-<div class="title">qgis.pkextract.pkextract Class Reference</div>  </div>
+<div class="title">qgis.pktools.pkextract.pkextract Class Reference</div>  </div>
 </div><!--header-->
 <div class="contents">
 <div class="dynheader">
-Inheritance diagram for qgis.pkextract.pkextract:</div>
+Inheritance diagram for qgis.pktools.pkextract.pkextract:</div>
 <div class="dyncontent">
-<div class="center"><img src="classqgis_1_1pkextract_1_1pkextract__inherit__graph.png" border="0" usemap="#qgis_8pkextract_8pkextract_inherit__map" alt="Inheritance graph"/></div>
+<div class="center"><img src="classqgis_1_1pktools_1_1pkextract_1_1pkextract__inherit__graph.png" border="0" usemap="#qgis_8pktools_8pkextract_8pkextract_inherit__map" alt="Inheritance graph"/></div>
 <center><span class="legend">[<a href="graph_legend.html">legend</a>]</span></center></div>
 <div class="dynheader">
-Collaboration diagram for qgis.pkextract.pkextract:</div>
+Collaboration diagram for qgis.pktools.pkextract.pkextract:</div>
 <div class="dyncontent">
-<div class="center"><img src="classqgis_1_1pkextract_1_1pkextract__coll__graph.png" border="0" usemap="#qgis_8pkextract_8pkextract_coll__map" alt="Collaboration graph"/></div>
+<div class="center"><img src="classqgis_1_1pktools_1_1pkextract_1_1pkextract__coll__graph.png" border="0" usemap="#qgis_8pktools_8pkextract_8pkextract_coll__map" alt="Collaboration graph"/></div>
 <center><span class="legend">[<a href="graph_legend.html">legend</a>]</span></center></div>
 <table class="memberdecls">
 <tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pub-methods"></a>
 Public Member Functions</h2></td></tr>
-<tr class="memitem:af5bc2523851ece32499990c6b9bd64f7"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="af5bc2523851ece32499990c6b9bd64f7"></a>
+<tr class="memitem:ae049566d661a688af829c9a068df729e"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="ae049566d661a688af829c9a068df729e"></a>
 def </td><td class="memItemRight" valign="bottom"><b>cliName</b></td></tr>
-<tr class="separator:af5bc2523851ece32499990c6b9bd64f7"><td class="memSeparator" colspan="2"> </td></tr>
-<tr class="memitem:afcbad22aed08a530d92a7eec5cf8040d"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="afcbad22aed08a530d92a7eec5cf8040d"></a>
+<tr class="separator:ae049566d661a688af829c9a068df729e"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:a2cd838a9e6e09334cec83099bebaf449"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a2cd838a9e6e09334cec83099bebaf449"></a>
 def </td><td class="memItemRight" valign="bottom"><b>defineCharacteristics</b></td></tr>
-<tr class="separator:afcbad22aed08a530d92a7eec5cf8040d"><td class="memSeparator" colspan="2"> </td></tr>
-<tr class="memitem:a2037cc4b42106e0bb97fcbb5d9eda7f7"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a2037cc4b42106e0bb97fcbb5d9eda7f7"></a>
+<tr class="separator:a2cd838a9e6e09334cec83099bebaf449"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:ab31e1ea1144f5316827e0752bc336201"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="ab31e1ea1144f5316827e0752bc336201"></a>
 def </td><td class="memItemRight" valign="bottom"><b>processAlgorithm</b></td></tr>
-<tr class="separator:a2037cc4b42106e0bb97fcbb5d9eda7f7"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="separator:ab31e1ea1144f5316827e0752bc336201"><td class="memSeparator" colspan="2"> </td></tr>
 </table><table class="memberdecls">
 <tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pub-attribs"></a>
 Public Attributes</h2></td></tr>
-<tr class="memitem:a682fac32a3bbc98fe364fc9d2a46a9ed"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a682fac32a3bbc98fe364fc9d2a46a9ed"></a>
+<tr class="memitem:ab9efcad6e33e229054cd88a80d2e31ff"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="ab9efcad6e33e229054cd88a80d2e31ff"></a>
  </td><td class="memItemRight" valign="bottom"><b>name</b></td></tr>
-<tr class="separator:a682fac32a3bbc98fe364fc9d2a46a9ed"><td class="memSeparator" colspan="2"> </td></tr>
-<tr class="memitem:ab9995a84ad157685b2d27025cdad22b0"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="ab9995a84ad157685b2d27025cdad22b0"></a>
+<tr class="separator:ab9efcad6e33e229054cd88a80d2e31ff"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:ae279e3125dc30a09e1430c5e76b473cb"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="ae279e3125dc30a09e1430c5e76b473cb"></a>
  </td><td class="memItemRight" valign="bottom"><b>group</b></td></tr>
-<tr class="separator:ab9995a84ad157685b2d27025cdad22b0"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="separator:ae279e3125dc30a09e1430c5e76b473cb"><td class="memSeparator" colspan="2"> </td></tr>
 </table><table class="memberdecls">
 <tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pub-static-attribs"></a>
 Static Public Attributes</h2></td></tr>
-<tr class="memitem:a95e1c0317ddcaeda681980e70494a638"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a95e1c0317ddcaeda681980e70494a638"></a>
+<tr class="memitem:a257192faedfabf32e503d72a2f34f459"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a257192faedfabf32e503d72a2f34f459"></a>
 string </td><td class="memItemRight" valign="bottom"><b>INPUT</b> = "INPUT"</td></tr>
-<tr class="separator:a95e1c0317ddcaeda681980e70494a638"><td class="memSeparator" colspan="2"> </td></tr>
-<tr class="memitem:a152b797f760ae98e27adbad95c3a8729"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a152b797f760ae98e27adbad95c3a8729"></a>
+<tr class="separator:a257192faedfabf32e503d72a2f34f459"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:a7e6d595c2e44bf7b9634f917bca79c61"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a7e6d595c2e44bf7b9634f917bca79c61"></a>
 string </td><td class="memItemRight" valign="bottom"><b>SAMPLE</b> = "SAMPLE"</td></tr>
-<tr class="separator:a152b797f760ae98e27adbad95c3a8729"><td class="memSeparator" colspan="2"> </td></tr>
-<tr class="memitem:a7a00b2c269b8968376d90b0bf893df9f"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a7a00b2c269b8968376d90b0bf893df9f"></a>
+<tr class="separator:a7e6d595c2e44bf7b9634f917bca79c61"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:a5797ede6cc9265a846e09a4f5ff31292"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a5797ede6cc9265a846e09a4f5ff31292"></a>
 string </td><td class="memItemRight" valign="bottom"><b>ITERATE</b> = "ITERATE"</td></tr>
-<tr class="separator:a7a00b2c269b8968376d90b0bf893df9f"><td class="memSeparator" colspan="2"> </td></tr>
-<tr class="memitem:aebb093e7f23d360f6657f8833f5c73f3"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="aebb093e7f23d360f6657f8833f5c73f3"></a>
+<tr class="separator:a5797ede6cc9265a846e09a4f5ff31292"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:a481ae866b7a60d1f8ec47f0caa8d3d6b"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a481ae866b7a60d1f8ec47f0caa8d3d6b"></a>
 string </td><td class="memItemRight" valign="bottom"><b>OUTPUT</b> = "OUTPUT"</td></tr>
-<tr class="separator:aebb093e7f23d360f6657f8833f5c73f3"><td class="memSeparator" colspan="2"> </td></tr>
-<tr class="memitem:a78b93513da9f4173cd4218204a77d20a"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a78b93513da9f4173cd4218204a77d20a"></a>
+<tr class="separator:a481ae866b7a60d1f8ec47f0caa8d3d6b"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:a3e61a3b83a4917429eb54cdbe69bf84f"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a3e61a3b83a4917429eb54cdbe69bf84f"></a>
 list </td><td class="memItemRight" valign="bottom"><b>RULE_OPTIONS</b> = ['centroid', 'point', 'mean', 'proportion', 'min', 'max', 'mode', 'sum', 'median', 'stdev', 'percentile']</td></tr>
-<tr class="separator:a78b93513da9f4173cd4218204a77d20a"><td class="memSeparator" colspan="2"> </td></tr>
-<tr class="memitem:af877cda3a19feb1f37d368d54680fd59"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="af877cda3a19feb1f37d368d54680fd59"></a>
+<tr class="separator:a3e61a3b83a4917429eb54cdbe69bf84f"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:a6997d33d8c4528dc3e278af16188ac1d"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a6997d33d8c4528dc3e278af16188ac1d"></a>
 string </td><td class="memItemRight" valign="bottom"><b>RULE</b> = "RULE"</td></tr>
-<tr class="separator:af877cda3a19feb1f37d368d54680fd59"><td class="memSeparator" colspan="2"> </td></tr>
-<tr class="memitem:ac120a3debadb9cbd38552fcdefba2fb0"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="ac120a3debadb9cbd38552fcdefba2fb0"></a>
+<tr class="separator:a6997d33d8c4528dc3e278af16188ac1d"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:aac5a26b050718715b4adfcdd5e10c6c2"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="aac5a26b050718715b4adfcdd5e10c6c2"></a>
 string </td><td class="memItemRight" valign="bottom"><b>POLYGON</b> = "POLYGON"</td></tr>
-<tr class="separator:ac120a3debadb9cbd38552fcdefba2fb0"><td class="memSeparator" colspan="2"> </td></tr>
-<tr class="memitem:a0052109b006ae33bb2014a05ffd9226f"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a0052109b006ae33bb2014a05ffd9226f"></a>
+<tr class="separator:aac5a26b050718715b4adfcdd5e10c6c2"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:a21c89f90489c9cc008332981c12868e2"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a21c89f90489c9cc008332981c12868e2"></a>
 string </td><td class="memItemRight" valign="bottom"><b>BUFFER</b> = "BUFFER"</td></tr>
-<tr class="separator:a0052109b006ae33bb2014a05ffd9226f"><td class="memSeparator" colspan="2"> </td></tr>
-<tr class="memitem:ab4431ebf4ce448655fcc25366f15abd3"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="ab4431ebf4ce448655fcc25366f15abd3"></a>
+<tr class="separator:a21c89f90489c9cc008332981c12868e2"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:adc9fa45630da5c63f41f4542bc82244f"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="adc9fa45630da5c63f41f4542bc82244f"></a>
 string </td><td class="memItemRight" valign="bottom"><b>SRCNODATA</b> = "SRCNODATA"</td></tr>
-<tr class="separator:ab4431ebf4ce448655fcc25366f15abd3"><td class="memSeparator" colspan="2"> </td></tr>
-<tr class="memitem:a1cb12c6b9a06225999395afa50b17987"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a1cb12c6b9a06225999395afa50b17987"></a>
+<tr class="separator:adc9fa45630da5c63f41f4542bc82244f"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:a222f15dc4f8abcf5ccdb34e909da8ec8"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a222f15dc4f8abcf5ccdb34e909da8ec8"></a>
 string </td><td class="memItemRight" valign="bottom"><b>BNDNODATA</b> = "BNDNODATA"</td></tr>
-<tr class="separator:a1cb12c6b9a06225999395afa50b17987"><td class="memSeparator" colspan="2"> </td></tr>
-<tr class="memitem:a741cc5d777e44ecde629f16a2499ae6c"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a741cc5d777e44ecde629f16a2499ae6c"></a>
+<tr class="separator:a222f15dc4f8abcf5ccdb34e909da8ec8"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:afd7a165c5f77f4ad99a6f664576852dd"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="afd7a165c5f77f4ad99a6f664576852dd"></a>
 string </td><td class="memItemRight" valign="bottom"><b>EXTRA</b> = 'EXTRA'</td></tr>
-<tr class="separator:a741cc5d777e44ecde629f16a2499ae6c"><td class="memSeparator" colspan="2"> </td></tr>
-<tr class="memitem:aec905ae5cbf25bc9d1a4a592bff30311"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="aec905ae5cbf25bc9d1a4a592bff30311"></a>
+<tr class="separator:afd7a165c5f77f4ad99a6f664576852dd"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:a3242dae21dccbdc5f1805b566fe4bc28"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a3242dae21dccbdc5f1805b566fe4bc28"></a>
 string </td><td class="memItemRight" valign="bottom"><b>FORMAT</b> = "FORMAT"</td></tr>
-<tr class="separator:aec905ae5cbf25bc9d1a4a592bff30311"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="separator:a3242dae21dccbdc5f1805b566fe4bc28"><td class="memSeparator" colspan="2"> </td></tr>
 </table>
 <a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
 <div class="textblock">
-<p>Definition at line <a class="el" href="pkextract_8py_source.html#l00087">87</a> of file <a class="el" href="pkextract_8py_source.html">pkextract.py</a>.</p>
+<p>Definition at line <a class="el" href="pktools_2pkextract_8py_source.html#l00087">87</a> of file <a class="el" href="pktools_2pkextract_8py_source.html">pkextract.py</a>.</p>
 </div><hr/>The documentation for this class was generated from the following file:<ul>
-<li>/home/kempenep/pktools/qgis/<a class="el" href="pkextract_8py_source.html">pkextract.py</a></li>
+<li>/home/kempenep/pktools/qgis/pktools/<a class="el" href="pktools_2pkextract_8py_source.html">pkextract.py</a></li>
 </ul>
 </div><!-- contents -->
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Jun 23 2015 17:09:37 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/classqgis_1_1pktools_1_1pkextract_1_1pkextract__coll__graph.map b/doc/html/classqgis_1_1pktools_1_1pkextract_1_1pkextract__coll__graph.map
new file mode 100644
index 0000000..f548170
--- /dev/null
+++ b/doc/html/classqgis_1_1pktools_1_1pkextract_1_1pkextract__coll__graph.map
@@ -0,0 +1,2 @@
+<map id="qgis.pktools.pkextract.pkextract" name="qgis.pktools.pkextract.pkextract">
+</map>
diff --git a/doc/html/classqgis_1_1pktools_1_1pkextract_1_1pkextract__coll__graph.md5 b/doc/html/classqgis_1_1pktools_1_1pkextract_1_1pkextract__coll__graph.md5
new file mode 100644
index 0000000..98a3bb6
--- /dev/null
+++ b/doc/html/classqgis_1_1pktools_1_1pkextract_1_1pkextract__coll__graph.md5
@@ -0,0 +1 @@
+90220da46079f3d06c739089255dbeed
\ No newline at end of file
diff --git a/doc/html/classqgis_1_1pktools_1_1pkextract_1_1pkextract__coll__graph.png b/doc/html/classqgis_1_1pktools_1_1pkextract_1_1pkextract__coll__graph.png
new file mode 100644
index 0000000..9b4f7ec
Binary files /dev/null and b/doc/html/classqgis_1_1pktools_1_1pkextract_1_1pkextract__coll__graph.png differ
diff --git a/doc/html/classqgis_1_1pktools_1_1pkextract_1_1pkextract__inherit__graph.map b/doc/html/classqgis_1_1pktools_1_1pkextract_1_1pkextract__inherit__graph.map
new file mode 100644
index 0000000..f548170
--- /dev/null
+++ b/doc/html/classqgis_1_1pktools_1_1pkextract_1_1pkextract__inherit__graph.map
@@ -0,0 +1,2 @@
+<map id="qgis.pktools.pkextract.pkextract" name="qgis.pktools.pkextract.pkextract">
+</map>
diff --git a/doc/html/classqgis_1_1pktools_1_1pkextract_1_1pkextract__inherit__graph.md5 b/doc/html/classqgis_1_1pktools_1_1pkextract_1_1pkextract__inherit__graph.md5
new file mode 100644
index 0000000..98a3bb6
--- /dev/null
+++ b/doc/html/classqgis_1_1pktools_1_1pkextract_1_1pkextract__inherit__graph.md5
@@ -0,0 +1 @@
+90220da46079f3d06c739089255dbeed
\ No newline at end of file
diff --git a/doc/html/classqgis_1_1pktools_1_1pkextract_1_1pkextract__inherit__graph.png b/doc/html/classqgis_1_1pktools_1_1pkextract_1_1pkextract__inherit__graph.png
new file mode 100644
index 0000000..9b4f7ec
Binary files /dev/null and b/doc/html/classqgis_1_1pktools_1_1pkextract_1_1pkextract__inherit__graph.png differ
diff --git a/doc/html/classqgis_1_1pktools_1_1pkextract__grid_1_1pkextract__grid-members.html b/doc/html/classqgis_1_1pktools_1_1pkextract__grid_1_1pkextract__grid-members.html
new file mode 100644
index 0000000..036d23d
--- /dev/null
+++ b/doc/html/classqgis_1_1pktools_1_1pkextract__grid_1_1pkextract__grid-members.html
@@ -0,0 +1,94 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.6"/>
+<title>pktools: Member List</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+  <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
+  <td style="padding-left: 0.5em;">
+   <div id="projectname">pktools
+    <span id="projectnumber">2.6.4</span>
+   </div>
+   <div id="projectbrief">Processing Kernel for geospatial data</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.6 -->
+  <div id="navrow1" class="tabs">
+    <ul class="tablist">
+      <li><a href="index.html"><span>Main Page</span></a></li>
+      <li><a href="pages.html"><span>Related Pages</span></a></li>
+      <li class="current"><a href="annotated.html"><span>Classes</span></a></li>
+      <li><a href="files.html"><span>Files</span></a></li>
+    </ul>
+  </div>
+  <div id="navrow2" class="tabs2">
+    <ul class="tablist">
+      <li><a href="annotated.html"><span>Class List</span></a></li>
+      <li><a href="classes.html"><span>Class Index</span></a></li>
+      <li><a href="inherits.html"><span>Class Hierarchy</span></a></li>
+      <li><a href="functions.html"><span>Class Members</span></a></li>
+    </ul>
+  </div>
+<div id="nav-path" class="navpath">
+  <ul>
+<li class="navelem"><b>qgis</b></li><li class="navelem"><b>pktools</b></li><li class="navelem"><b>pkextract_grid</b></li><li class="navelem"><a class="el" href="classqgis_1_1pktools_1_1pkextract__grid_1_1pkextract__grid.html">pkextract_grid</a></li>  </ul>
+</div>
+</div><!-- top -->
+<div class="header">
+  <div class="headertitle">
+<div class="title">qgis.pktools.pkextract_grid.pkextract_grid Member List</div>  </div>
+</div><!--header-->
+<div class="contents">
+
+<p>This is the complete list of members for <a class="el" href="classqgis_1_1pktools_1_1pkextract__grid_1_1pkextract__grid.html">qgis.pktools.pkextract_grid.pkextract_grid</a>, including all inherited members.</p>
+<table class="directory">
+  <tr bgcolor="#f0f0f0" class="even"><td class="entry"><b>BNDNODATA</b> (defined in <a class="el" href="classqgis_1_1pktools_1_1pkextract__grid_1_1pkextract__grid.html">qgis.pktools.pkextract_grid.pkextract_grid</a>)</td><td class="entry"><a class="el" href="classqgis_1_1pktools_1_1pkextract__grid_1_1pkextract__grid.html">qgis.pktools.pkextract_grid.pkextract_grid</a></td><td class="entry"><span class="mlabel">static</span></td></tr>
+  <tr bgcolor="#f0f0f0"><td class="entry"><b>BUFFER</b> (defined in <a class="el" href="classqgis_1_1pktools_1_1pkextract__grid_1_1pkextract__grid.html">qgis.pktools.pkextract_grid.pkextract_grid</a>)</td><td class="entry"><a class="el" href="classqgis_1_1pktools_1_1pkextract__grid_1_1pkextract__grid.html">qgis.pktools.pkextract_grid.pkextract_grid</a></td><td class="entry"><span class="mlabel">static</span></td></tr>
+  <tr bgcolor="#f0f0f0" class="even"><td class="entry"><b>cliName</b> (defined in <a class="el" href="classqgis_1_1pktools_1_1pkextract__grid_1_1pkextract__grid.html">qgis.pktools.pkextract_grid.pkextract_grid</a>)</td><td class="entry"><a class="el" href="classqgis_1_1pktools_1_1pkextract__grid_1_1pkextract__grid.html">qgis.pktools.pkextract_grid.pkextract_grid</a></td><td class="entry"></td></tr>
+  <tr bgcolor="#f0f0f0"><td class="entry"><b>defineCharacteristics</b> (defined in <a class="el" href="classqgis_1_1pktools_1_1pkextract__grid_1_1pkextract__grid.html">qgis.pktools.pkextract_grid.pkextract_grid</a>)</td><td class="entry"><a class="el" href="classqgis_1_1pktools_1_1pkextract__grid_1_1pkextract__grid.html">qgis.pktools.pkextract_grid.pkextract_grid</a></td><td class="entry"></td></tr>
+  <tr bgcolor="#f0f0f0" class="even"><td class="entry"><b>EXTRA</b> (defined in <a class="el" href="classqgis_1_1pktools_1_1pkextract__grid_1_1pkextract__grid.html">qgis.pktools.pkextract_grid.pkextract_grid</a>)</td><td class="entry"><a class="el" href="classqgis_1_1pktools_1_1pkextract__grid_1_1pkextract__grid.html">qgis.pktools.pkextract_grid.pkextract_grid</a></td><td class="entry"><span class="mlabel">static</span></td></tr>
+  <tr bgcolor="#f0f0f0"><td class="entry"><b>FORMAT</b> (defined in <a class="el" href="classqgis_1_1pktools_1_1pkextract__grid_1_1pkextract__grid.html">qgis.pktools.pkextract_grid.pkextract_grid</a>)</td><td class="entry"><a class="el" href="classqgis_1_1pktools_1_1pkextract__grid_1_1pkextract__grid.html">qgis.pktools.pkextract_grid.pkextract_grid</a></td><td class="entry"><span class="mlabel">static</span></td></tr>
+  <tr bgcolor="#f0f0f0" class="even"><td class="entry"><b>GRID</b> (defined in <a class="el" href="classqgis_1_1pktools_1_1pkextract__grid_1_1pkextract__grid.html">qgis.pktools.pkextract_grid.pkextract_grid</a>)</td><td class="entry"><a class="el" href="classqgis_1_1pktools_1_1pkextract__grid_1_1pkextract__grid.html">qgis.pktools.pkextract_grid.pkextract_grid</a></td><td class="entry"><span class="mlabel">static</span></td></tr>
+  <tr bgcolor="#f0f0f0"><td class="entry"><b>group</b> (defined in <a class="el" href="classqgis_1_1pktools_1_1pkextract__grid_1_1pkextract__grid.html">qgis.pktools.pkextract_grid.pkextract_grid</a>)</td><td class="entry"><a class="el" href="classqgis_1_1pktools_1_1pkextract__grid_1_1pkextract__grid.html">qgis.pktools.pkextract_grid.pkextract_grid</a></td><td class="entry"></td></tr>
+  <tr bgcolor="#f0f0f0" class="even"><td class="entry"><b>INPUT</b> (defined in <a class="el" href="classqgis_1_1pktools_1_1pkextract__grid_1_1pkextract__grid.html">qgis.pktools.pkextract_grid.pkextract_grid</a>)</td><td class="entry"><a class="el" href="classqgis_1_1pktools_1_1pkextract__grid_1_1pkextract__grid.html">qgis.pktools.pkextract_grid.pkextract_grid</a></td><td class="entry"><span class="mlabel">static</span></td></tr>
+  <tr bgcolor="#f0f0f0"><td class="entry"><b>name</b> (defined in <a class="el" href="classqgis_1_1pktools_1_1pkextract__grid_1_1pkextract__grid.html">qgis.pktools.pkextract_grid.pkextract_grid</a>)</td><td class="entry"><a class="el" href="classqgis_1_1pktools_1_1pkextract__grid_1_1pkextract__grid.html">qgis.pktools.pkextract_grid.pkextract_grid</a></td><td class="entry"></td></tr>
+  <tr bgcolor="#f0f0f0" class="even"><td class="entry"><b>OUTPUT</b> (defined in <a class="el" href="classqgis_1_1pktools_1_1pkextract__grid_1_1pkextract__grid.html">qgis.pktools.pkextract_grid.pkextract_grid</a>)</td><td class="entry"><a class="el" href="classqgis_1_1pktools_1_1pkextract__grid_1_1pkextract__grid.html">qgis.pktools.pkextract_grid.pkextract_grid</a></td><td class="entry"><span class="mlabel">static</span></td></tr>
+  <tr bgcolor="#f0f0f0"><td class="entry"><b>POLYGON</b> (defined in <a class="el" href="classqgis_1_1pktools_1_1pkextract__grid_1_1pkextract__grid.html">qgis.pktools.pkextract_grid.pkextract_grid</a>)</td><td class="entry"><a class="el" href="classqgis_1_1pktools_1_1pkextract__grid_1_1pkextract__grid.html">qgis.pktools.pkextract_grid.pkextract_grid</a></td><td class="entry"><span class="mlabel">static</span></td></tr>
+  <tr bgcolor="#f0f0f0" class="even"><td class="entry"><b>processAlgorithm</b> (defined in <a class="el" href="classqgis_1_1pktools_1_1pkextract__grid_1_1pkextract__grid.html">qgis.pktools.pkextract_grid.pkextract_grid</a>)</td><td class="entry"><a class="el" href="classqgis_1_1pktools_1_1pkextract__grid_1_1pkextract__grid.html">qgis.pktools.pkextract_grid.pkextract_grid</a></td><td class="entry"></td></tr>
+  <tr bgcolor="#f0f0f0"><td class="entry"><b>RULE</b> (defined in <a class="el" href="classqgis_1_1pktools_1_1pkextract__grid_1_1pkextract__grid.html">qgis.pktools.pkextract_grid.pkextract_grid</a>)</td><td class="entry"><a class="el" href="classqgis_1_1pktools_1_1pkextract__grid_1_1pkextract__grid.html">qgis.pktools.pkextract_grid.pkextract_grid</a></td><td class="entry"><span class="mlabel">static</span></td></tr>
+  <tr bgcolor="#f0f0f0" class="even"><td class="entry"><b>RULE_OPTIONS</b> (defined in <a class="el" href="classqgis_1_1pktools_1_1pkextract__grid_1_1pkextract__grid.html">qgis.pktools.pkextract_grid.pkextract_grid</a>)</td><td class="entry"><a class="el" href="classqgis_1_1pktools_1_1pkextract__grid_1_1pkextract__grid.html">qgis.pktools.pkextract_grid.pkextract_grid</a></td><td class="entry"><span class="mlabel">static</span></td></tr>
+  <tr bgcolor="#f0f0f0"><td class="entry"><b>SRCNODATA</b> (defined in <a class="el" href="classqgis_1_1pktools_1_1pkextract__grid_1_1pkextract__grid.html">qgis.pktools.pkextract_grid.pkextract_grid</a>)</td><td class="entry"><a class="el" href="classqgis_1_1pktools_1_1pkextract__grid_1_1pkextract__grid.html">qgis.pktools.pkextract_grid.pkextract_grid</a></td><td class="entry"><span class="mlabel">static</span></td></tr>
+</table></div><!-- contents -->
+<!-- HTML footer for doxygen 1.8.4-->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/>
+</a> 1.8.6
+</small></address>
+<script>
+  (function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
+  (i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
+  m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
+  })(window,document,'script','//www.google-analytics.com/analytics.js','ga');
+  ga('create', 'UA-46952639-1', 'nongnu.org');
+  ga('send', 'pageview');
+</script>
+</body>
+</html>
diff --git a/doc/html/classqgis_1_1pkextract__grid_1_1pkextract__grid.html b/doc/html/classqgis_1_1pktools_1_1pkextract__grid_1_1pkextract__grid.html
similarity index 62%
copy from doc/html/classqgis_1_1pkextract__grid_1_1pkextract__grid.html
copy to doc/html/classqgis_1_1pktools_1_1pkextract__grid_1_1pkextract__grid.html
index aa6acf6..79b85a3 100644
--- a/doc/html/classqgis_1_1pkextract__grid_1_1pkextract__grid.html
+++ b/doc/html/classqgis_1_1pktools_1_1pkextract__grid_1_1pkextract__grid.html
@@ -4,7 +4,7 @@
 <meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
 <meta http-equiv="X-UA-Compatible" content="IE=9"/>
 <meta name="generator" content="Doxygen 1.8.6"/>
-<title>pktools: qgis.pkextract_grid.pkextract_grid Class Reference</title>
+<title>pktools: qgis.pktools.pkextract_grid.pkextract_grid Class Reference</title>
 <link href="tabs.css" rel="stylesheet" type="text/css"/>
 <script type="text/javascript" src="jquery.js"></script>
 <script type="text/javascript" src="dynsections.js"></script>
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.3</span>
+    <span id="projectnumber">2.6.4</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -47,7 +47,7 @@
   </div>
 <div id="nav-path" class="navpath">
   <ul>
-<li class="navelem"><b>qgis</b></li><li class="navelem"><b>pkextract_grid</b></li><li class="navelem"><a class="el" href="classqgis_1_1pkextract__grid_1_1pkextract__grid.html">pkextract_grid</a></li>  </ul>
+<li class="navelem"><b>qgis</b></li><li class="navelem"><b>pktools</b></li><li class="navelem"><b>pkextract_grid</b></li><li class="navelem"><a class="el" href="classqgis_1_1pktools_1_1pkextract__grid_1_1pkextract__grid.html">pkextract_grid</a></li>  </ul>
 </div>
 </div><!-- top -->
 <div class="header">
@@ -55,90 +55,90 @@
 <a href="#pub-methods">Public Member Functions</a> |
 <a href="#pub-attribs">Public Attributes</a> |
 <a href="#pub-static-attribs">Static Public Attributes</a> |
-<a href="classqgis_1_1pkextract__grid_1_1pkextract__grid-members.html">List of all members</a>  </div>
+<a href="classqgis_1_1pktools_1_1pkextract__grid_1_1pkextract__grid-members.html">List of all members</a>  </div>
   <div class="headertitle">
-<div class="title">qgis.pkextract_grid.pkextract_grid Class Reference</div>  </div>
+<div class="title">qgis.pktools.pkextract_grid.pkextract_grid Class Reference</div>  </div>
 </div><!--header-->
 <div class="contents">
 <div class="dynheader">
-Inheritance diagram for qgis.pkextract_grid.pkextract_grid:</div>
+Inheritance diagram for qgis.pktools.pkextract_grid.pkextract_grid:</div>
 <div class="dyncontent">
-<div class="center"><img src="classqgis_1_1pkextract__grid_1_1pkextract__grid__inherit__graph.png" border="0" usemap="#qgis_8pkextract__grid_8pkextract__grid_inherit__map" alt="Inheritance graph"/></div>
+<div class="center"><img src="classqgis_1_1pktools_1_1pkextract__grid_1_1pkextract__grid__inherit__graph.png" border="0" usemap="#qgis_8pktools_8pkextract__grid_8pkextract__grid_inherit__map" alt="Inheritance graph"/></div>
 <center><span class="legend">[<a href="graph_legend.html">legend</a>]</span></center></div>
 <div class="dynheader">
-Collaboration diagram for qgis.pkextract_grid.pkextract_grid:</div>
+Collaboration diagram for qgis.pktools.pkextract_grid.pkextract_grid:</div>
 <div class="dyncontent">
-<div class="center"><img src="classqgis_1_1pkextract__grid_1_1pkextract__grid__coll__graph.png" border="0" usemap="#qgis_8pkextract__grid_8pkextract__grid_coll__map" alt="Collaboration graph"/></div>
+<div class="center"><img src="classqgis_1_1pktools_1_1pkextract__grid_1_1pkextract__grid__coll__graph.png" border="0" usemap="#qgis_8pktools_8pkextract__grid_8pkextract__grid_coll__map" alt="Collaboration graph"/></div>
 <center><span class="legend">[<a href="graph_legend.html">legend</a>]</span></center></div>
 <table class="memberdecls">
 <tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pub-methods"></a>
 Public Member Functions</h2></td></tr>
-<tr class="memitem:aa939f27236fbd7a0919bcb66b214b8c9"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="aa939f27236fbd7a0919bcb66b214b8c9"></a>
+<tr class="memitem:aa8f2f067f0a059b531c53a38b1a85308"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="aa8f2f067f0a059b531c53a38b1a85308"></a>
 def </td><td class="memItemRight" valign="bottom"><b>cliName</b></td></tr>
-<tr class="separator:aa939f27236fbd7a0919bcb66b214b8c9"><td class="memSeparator" colspan="2"> </td></tr>
-<tr class="memitem:a1e6b65b8611efef8459dfd6fe7637bab"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a1e6b65b8611efef8459dfd6fe7637bab"></a>
+<tr class="separator:aa8f2f067f0a059b531c53a38b1a85308"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:afbc6d9ad20f758c9d75503b27076bf1d"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="afbc6d9ad20f758c9d75503b27076bf1d"></a>
 def </td><td class="memItemRight" valign="bottom"><b>defineCharacteristics</b></td></tr>
-<tr class="separator:a1e6b65b8611efef8459dfd6fe7637bab"><td class="memSeparator" colspan="2"> </td></tr>
-<tr class="memitem:a188bdc261506880ef885176843eb4437"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a188bdc261506880ef885176843eb4437"></a>
+<tr class="separator:afbc6d9ad20f758c9d75503b27076bf1d"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:a502688d2d6044c1e4c5d7e9013746b9c"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a502688d2d6044c1e4c5d7e9013746b9c"></a>
 def </td><td class="memItemRight" valign="bottom"><b>processAlgorithm</b></td></tr>
-<tr class="separator:a188bdc261506880ef885176843eb4437"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="separator:a502688d2d6044c1e4c5d7e9013746b9c"><td class="memSeparator" colspan="2"> </td></tr>
 </table><table class="memberdecls">
 <tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pub-attribs"></a>
 Public Attributes</h2></td></tr>
-<tr class="memitem:aa9a3742d6a3703e840c7bc463740fb46"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="aa9a3742d6a3703e840c7bc463740fb46"></a>
+<tr class="memitem:af13c9efdff741494bfb58c8b10d4b53e"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="af13c9efdff741494bfb58c8b10d4b53e"></a>
  </td><td class="memItemRight" valign="bottom"><b>name</b></td></tr>
-<tr class="separator:aa9a3742d6a3703e840c7bc463740fb46"><td class="memSeparator" colspan="2"> </td></tr>
-<tr class="memitem:a481d147d56925a1ab75e18b1c8f145fc"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a481d147d56925a1ab75e18b1c8f145fc"></a>
+<tr class="separator:af13c9efdff741494bfb58c8b10d4b53e"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:a09ae45118a775983455e10ecc7959004"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a09ae45118a775983455e10ecc7959004"></a>
  </td><td class="memItemRight" valign="bottom"><b>group</b></td></tr>
-<tr class="separator:a481d147d56925a1ab75e18b1c8f145fc"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="separator:a09ae45118a775983455e10ecc7959004"><td class="memSeparator" colspan="2"> </td></tr>
 </table><table class="memberdecls">
 <tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pub-static-attribs"></a>
 Static Public Attributes</h2></td></tr>
-<tr class="memitem:ad359b649a15e3dbd0795278b984c6b23"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="ad359b649a15e3dbd0795278b984c6b23"></a>
+<tr class="memitem:a5412a66f1947ac26ccbd630b71428157"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a5412a66f1947ac26ccbd630b71428157"></a>
 string </td><td class="memItemRight" valign="bottom"><b>INPUT</b> = "INPUT"</td></tr>
-<tr class="separator:ad359b649a15e3dbd0795278b984c6b23"><td class="memSeparator" colspan="2"> </td></tr>
-<tr class="memitem:a59fa1c64049fbed2cc81548cf5d0e3a8"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a59fa1c64049fbed2cc81548cf5d0e3a8"></a>
+<tr class="separator:a5412a66f1947ac26ccbd630b71428157"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:a6064a8e5b885a1bad7a28957e70e1cdc"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a6064a8e5b885a1bad7a28957e70e1cdc"></a>
 string </td><td class="memItemRight" valign="bottom"><b>OUTPUT</b> = "OUTPUT"</td></tr>
-<tr class="separator:a59fa1c64049fbed2cc81548cf5d0e3a8"><td class="memSeparator" colspan="2"> </td></tr>
-<tr class="memitem:aff9ec53af87f8f28b82ea13707ed31a3"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="aff9ec53af87f8f28b82ea13707ed31a3"></a>
+<tr class="separator:a6064a8e5b885a1bad7a28957e70e1cdc"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:a3fb178091872bc1872478de700caf1b4"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a3fb178091872bc1872478de700caf1b4"></a>
 list </td><td class="memItemRight" valign="bottom"><b>RULE_OPTIONS</b> = ['centroid', 'point', 'mean', 'proportion', 'custom', 'min', 'max', 'mode', 'sum', 'median', 'stdev', 'percentile']</td></tr>
-<tr class="separator:aff9ec53af87f8f28b82ea13707ed31a3"><td class="memSeparator" colspan="2"> </td></tr>
-<tr class="memitem:a8b1c35d0229515eb8a9a4f74fbb27df2"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a8b1c35d0229515eb8a9a4f74fbb27df2"></a>
+<tr class="separator:a3fb178091872bc1872478de700caf1b4"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:a694eeda5f32f8f58ec20b873a2c31333"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a694eeda5f32f8f58ec20b873a2c31333"></a>
 string </td><td class="memItemRight" valign="bottom"><b>RULE</b> = "RULE"</td></tr>
-<tr class="separator:a8b1c35d0229515eb8a9a4f74fbb27df2"><td class="memSeparator" colspan="2"> </td></tr>
-<tr class="memitem:adaea5d0be7bd0435fdd3f6a42dc4c80f"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="adaea5d0be7bd0435fdd3f6a42dc4c80f"></a>
+<tr class="separator:a694eeda5f32f8f58ec20b873a2c31333"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:a7834e2f6a8d96793e5d50c379d69495f"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a7834e2f6a8d96793e5d50c379d69495f"></a>
 string </td><td class="memItemRight" valign="bottom"><b>POLYGON</b> = "POLYGON"</td></tr>
-<tr class="separator:adaea5d0be7bd0435fdd3f6a42dc4c80f"><td class="memSeparator" colspan="2"> </td></tr>
-<tr class="memitem:a1c07170b9f1999083d925f16c78e5ab1"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a1c07170b9f1999083d925f16c78e5ab1"></a>
+<tr class="separator:a7834e2f6a8d96793e5d50c379d69495f"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:af200c24667122672e45fd9d6f5067efd"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="af200c24667122672e45fd9d6f5067efd"></a>
 string </td><td class="memItemRight" valign="bottom"><b>BUFFER</b> = "BUFFER"</td></tr>
-<tr class="separator:a1c07170b9f1999083d925f16c78e5ab1"><td class="memSeparator" colspan="2"> </td></tr>
-<tr class="memitem:a914f319e7a3734966056b0e396e4b0a1"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a914f319e7a3734966056b0e396e4b0a1"></a>
+<tr class="separator:af200c24667122672e45fd9d6f5067efd"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:a90b6bcee6161de183851f985a02be337"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a90b6bcee6161de183851f985a02be337"></a>
 string </td><td class="memItemRight" valign="bottom"><b>GRID</b> = "GRID"</td></tr>
-<tr class="separator:a914f319e7a3734966056b0e396e4b0a1"><td class="memSeparator" colspan="2"> </td></tr>
-<tr class="memitem:a2b5e358b248cb62615584a90d651fea1"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a2b5e358b248cb62615584a90d651fea1"></a>
+<tr class="separator:a90b6bcee6161de183851f985a02be337"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:a567185dde201a783080d4e480a3f658b"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a567185dde201a783080d4e480a3f658b"></a>
 string </td><td class="memItemRight" valign="bottom"><b>SRCNODATA</b> = "SRCNODATA"</td></tr>
-<tr class="separator:a2b5e358b248cb62615584a90d651fea1"><td class="memSeparator" colspan="2"> </td></tr>
-<tr class="memitem:a458c8ea888792f63f8000afe8b6a5c6e"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a458c8ea888792f63f8000afe8b6a5c6e"></a>
+<tr class="separator:a567185dde201a783080d4e480a3f658b"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:a67f2914362c1595ea342a4b3a7a4715f"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a67f2914362c1595ea342a4b3a7a4715f"></a>
 string </td><td class="memItemRight" valign="bottom"><b>BNDNODATA</b> = "BNDNODATA"</td></tr>
-<tr class="separator:a458c8ea888792f63f8000afe8b6a5c6e"><td class="memSeparator" colspan="2"> </td></tr>
-<tr class="memitem:a058e183281127755bd1d851b3788138c"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a058e183281127755bd1d851b3788138c"></a>
+<tr class="separator:a67f2914362c1595ea342a4b3a7a4715f"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:acb46e5b74179c65a686d0a6e5f49d226"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="acb46e5b74179c65a686d0a6e5f49d226"></a>
 string </td><td class="memItemRight" valign="bottom"><b>EXTRA</b> = 'EXTRA'</td></tr>
-<tr class="separator:a058e183281127755bd1d851b3788138c"><td class="memSeparator" colspan="2"> </td></tr>
-<tr class="memitem:a4f170fcdea30859ad29048d61e90ce8b"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a4f170fcdea30859ad29048d61e90ce8b"></a>
+<tr class="separator:acb46e5b74179c65a686d0a6e5f49d226"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:a064ad85bca7f4be990fbb62d99a89ba1"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a064ad85bca7f4be990fbb62d99a89ba1"></a>
 string </td><td class="memItemRight" valign="bottom"><b>FORMAT</b> = "FORMAT"</td></tr>
-<tr class="separator:a4f170fcdea30859ad29048d61e90ce8b"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="separator:a064ad85bca7f4be990fbb62d99a89ba1"><td class="memSeparator" colspan="2"> </td></tr>
 </table>
 <a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
 <div class="textblock">
-<p>Definition at line <a class="el" href="pkextract__grid_8py_source.html#l00087">87</a> of file <a class="el" href="pkextract__grid_8py_source.html">pkextract_grid.py</a>.</p>
+<p>Definition at line <a class="el" href="pktools_2pkextract__grid_8py_source.html#l00087">87</a> of file <a class="el" href="pktools_2pkextract__grid_8py_source.html">pkextract_grid.py</a>.</p>
 </div><hr/>The documentation for this class was generated from the following file:<ul>
-<li>/home/kempenep/pktools/qgis/<a class="el" href="pkextract__grid_8py_source.html">pkextract_grid.py</a></li>
+<li>/home/kempenep/pktools/qgis/pktools/<a class="el" href="pktools_2pkextract__grid_8py_source.html">pkextract_grid.py</a></li>
 </ul>
 </div><!-- contents -->
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Jun 23 2015 17:09:37 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/classqgis_1_1pktools_1_1pkextract__grid_1_1pkextract__grid__coll__graph.map b/doc/html/classqgis_1_1pktools_1_1pkextract__grid_1_1pkextract__grid__coll__graph.map
new file mode 100644
index 0000000..8d269d2
--- /dev/null
+++ b/doc/html/classqgis_1_1pktools_1_1pkextract__grid_1_1pkextract__grid__coll__graph.map
@@ -0,0 +1,2 @@
+<map id="qgis.pktools.pkextract_grid.pkextract_grid" name="qgis.pktools.pkextract_grid.pkextract_grid">
+</map>
diff --git a/doc/html/classqgis_1_1pktools_1_1pkextract__grid_1_1pkextract__grid__coll__graph.md5 b/doc/html/classqgis_1_1pktools_1_1pkextract__grid_1_1pkextract__grid__coll__graph.md5
new file mode 100644
index 0000000..a0ecf9c
--- /dev/null
+++ b/doc/html/classqgis_1_1pktools_1_1pkextract__grid_1_1pkextract__grid__coll__graph.md5
@@ -0,0 +1 @@
+b903a258f35a053bb6f874051241e16b
\ No newline at end of file
diff --git a/doc/html/classqgis_1_1pktools_1_1pkextract__grid_1_1pkextract__grid__coll__graph.png b/doc/html/classqgis_1_1pktools_1_1pkextract__grid_1_1pkextract__grid__coll__graph.png
new file mode 100644
index 0000000..db7a250
Binary files /dev/null and b/doc/html/classqgis_1_1pktools_1_1pkextract__grid_1_1pkextract__grid__coll__graph.png differ
diff --git a/doc/html/classqgis_1_1pktools_1_1pkextract__random_1_1pkextract__random-members.html b/doc/html/classqgis_1_1pktools_1_1pkextract__random_1_1pkextract__random-members.html
new file mode 100644
index 0000000..df05b07
--- /dev/null
+++ b/doc/html/classqgis_1_1pktools_1_1pkextract__random_1_1pkextract__random-members.html
@@ -0,0 +1,94 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.6"/>
+<title>pktools: Member List</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+  <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
+  <td style="padding-left: 0.5em;">
+   <div id="projectname">pktools
+    <span id="projectnumber">2.6.4</span>
+   </div>
+   <div id="projectbrief">Processing Kernel for geospatial data</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.6 -->
+  <div id="navrow1" class="tabs">
+    <ul class="tablist">
+      <li><a href="index.html"><span>Main Page</span></a></li>
+      <li><a href="pages.html"><span>Related Pages</span></a></li>
+      <li class="current"><a href="annotated.html"><span>Classes</span></a></li>
+      <li><a href="files.html"><span>Files</span></a></li>
+    </ul>
+  </div>
+  <div id="navrow2" class="tabs2">
+    <ul class="tablist">
+      <li><a href="annotated.html"><span>Class List</span></a></li>
+      <li><a href="classes.html"><span>Class Index</span></a></li>
+      <li><a href="inherits.html"><span>Class Hierarchy</span></a></li>
+      <li><a href="functions.html"><span>Class Members</span></a></li>
+    </ul>
+  </div>
+<div id="nav-path" class="navpath">
+  <ul>
+<li class="navelem"><b>qgis</b></li><li class="navelem"><b>pktools</b></li><li class="navelem"><b>pkextract_random</b></li><li class="navelem"><a class="el" href="classqgis_1_1pktools_1_1pkextract__random_1_1pkextract__random.html">pkextract_random</a></li>  </ul>
+</div>
+</div><!-- top -->
+<div class="header">
+  <div class="headertitle">
+<div class="title">qgis.pktools.pkextract_random.pkextract_random Member List</div>  </div>
+</div><!--header-->
+<div class="contents">
+
+<p>This is the complete list of members for <a class="el" href="classqgis_1_1pktools_1_1pkextract__random_1_1pkextract__random.html">qgis.pktools.pkextract_random.pkextract_random</a>, including all inherited members.</p>
+<table class="directory">
+  <tr bgcolor="#f0f0f0" class="even"><td class="entry"><b>BNDNODATA</b> (defined in <a class="el" href="classqgis_1_1pktools_1_1pkextract__random_1_1pkextract__random.html">qgis.pktools.pkextract_random.pkextract_random</a>)</td><td class="entry"><a class="el" href="classqgis_1_1pktools_1_1pkextract__random_1_1pkextract__random.html">qgis.pktools.pkextract_random.pkextract_random</a></td><td class="entry"><span class="mlabel">static</span></td></tr>
+  <tr bgcolor="#f0f0f0"><td class="entry"><b>BUFFER</b> (defined in <a class="el" href="classqgis_1_1pktools_1_1pkextract__random_1_1pkextract__random.html">qgis.pktools.pkextract_random.pkextract_random</a>)</td><td class="entry"><a class="el" href="classqgis_1_1pktools_1_1pkextract__random_1_1pkextract__random.html">qgis.pktools.pkextract_random.pkextract_random</a></td><td class="entry"><span class="mlabel">static</span></td></tr>
+  <tr bgcolor="#f0f0f0" class="even"><td class="entry"><b>cliName</b> (defined in <a class="el" href="classqgis_1_1pktools_1_1pkextract__random_1_1pkextract__random.html">qgis.pktools.pkextract_random.pkextract_random</a>)</td><td class="entry"><a class="el" href="classqgis_1_1pktools_1_1pkextract__random_1_1pkextract__random.html">qgis.pktools.pkextract_random.pkextract_random</a></td><td class="entry"></td></tr>
+  <tr bgcolor="#f0f0f0"><td class="entry"><b>defineCharacteristics</b> (defined in <a class="el" href="classqgis_1_1pktools_1_1pkextract__random_1_1pkextract__random.html">qgis.pktools.pkextract_random.pkextract_random</a>)</td><td class="entry"><a class="el" href="classqgis_1_1pktools_1_1pkextract__random_1_1pkextract__random.html">qgis.pktools.pkextract_random.pkextract_random</a></td><td class="entry"></td></tr>
+  <tr bgcolor="#f0f0f0" class="even"><td class="entry"><b>EXTRA</b> (defined in <a class="el" href="classqgis_1_1pktools_1_1pkextract__random_1_1pkextract__random.html">qgis.pktools.pkextract_random.pkextract_random</a>)</td><td class="entry"><a class="el" href="classqgis_1_1pktools_1_1pkextract__random_1_1pkextract__random.html">qgis.pktools.pkextract_random.pkextract_random</a></td><td class="entry"><span class="mlabel">static</span></td></tr>
+  <tr bgcolor="#f0f0f0"><td class="entry"><b>FORMAT</b> (defined in <a class="el" href="classqgis_1_1pktools_1_1pkextract__random_1_1pkextract__random.html">qgis.pktools.pkextract_random.pkextract_random</a>)</td><td class="entry"><a class="el" href="classqgis_1_1pktools_1_1pkextract__random_1_1pkextract__random.html">qgis.pktools.pkextract_random.pkextract_random</a></td><td class="entry"><span class="mlabel">static</span></td></tr>
+  <tr bgcolor="#f0f0f0" class="even"><td class="entry"><b>group</b> (defined in <a class="el" href="classqgis_1_1pktools_1_1pkextract__random_1_1pkextract__random.html">qgis.pktools.pkextract_random.pkextract_random</a>)</td><td class="entry"><a class="el" href="classqgis_1_1pktools_1_1pkextract__random_1_1pkextract__random.html">qgis.pktools.pkextract_random.pkextract_random</a></td><td class="entry"></td></tr>
+  <tr bgcolor="#f0f0f0"><td class="entry"><b>INPUT</b> (defined in <a class="el" href="classqgis_1_1pktools_1_1pkextract__random_1_1pkextract__random.html">qgis.pktools.pkextract_random.pkextract_random</a>)</td><td class="entry"><a class="el" href="classqgis_1_1pktools_1_1pkextract__random_1_1pkextract__random.html">qgis.pktools.pkextract_random.pkextract_random</a></td><td class="entry"><span class="mlabel">static</span></td></tr>
+  <tr bgcolor="#f0f0f0" class="even"><td class="entry"><b>name</b> (defined in <a class="el" href="classqgis_1_1pktools_1_1pkextract__random_1_1pkextract__random.html">qgis.pktools.pkextract_random.pkextract_random</a>)</td><td class="entry"><a class="el" href="classqgis_1_1pktools_1_1pkextract__random_1_1pkextract__random.html">qgis.pktools.pkextract_random.pkextract_random</a></td><td class="entry"></td></tr>
+  <tr bgcolor="#f0f0f0"><td class="entry"><b>OUTPUT</b> (defined in <a class="el" href="classqgis_1_1pktools_1_1pkextract__random_1_1pkextract__random.html">qgis.pktools.pkextract_random.pkextract_random</a>)</td><td class="entry"><a class="el" href="classqgis_1_1pktools_1_1pkextract__random_1_1pkextract__random.html">qgis.pktools.pkextract_random.pkextract_random</a></td><td class="entry"><span class="mlabel">static</span></td></tr>
+  <tr bgcolor="#f0f0f0" class="even"><td class="entry"><b>POLYGON</b> (defined in <a class="el" href="classqgis_1_1pktools_1_1pkextract__random_1_1pkextract__random.html">qgis.pktools.pkextract_random.pkextract_random</a>)</td><td class="entry"><a class="el" href="classqgis_1_1pktools_1_1pkextract__random_1_1pkextract__random.html">qgis.pktools.pkextract_random.pkextract_random</a></td><td class="entry"><span class="mlabel">static</span></td></tr>
+  <tr bgcolor="#f0f0f0"><td class="entry"><b>processAlgorithm</b> (defined in <a class="el" href="classqgis_1_1pktools_1_1pkextract__random_1_1pkextract__random.html">qgis.pktools.pkextract_random.pkextract_random</a>)</td><td class="entry"><a class="el" href="classqgis_1_1pktools_1_1pkextract__random_1_1pkextract__random.html">qgis.pktools.pkextract_random.pkextract_random</a></td><td class="entry"></td></tr>
+  <tr bgcolor="#f0f0f0" class="even"><td class="entry"><b>RANDOM</b> (defined in <a class="el" href="classqgis_1_1pktools_1_1pkextract__random_1_1pkextract__random.html">qgis.pktools.pkextract_random.pkextract_random</a>)</td><td class="entry"><a class="el" href="classqgis_1_1pktools_1_1pkextract__random_1_1pkextract__random.html">qgis.pktools.pkextract_random.pkextract_random</a></td><td class="entry"><span class="mlabel">static</span></td></tr>
+  <tr bgcolor="#f0f0f0"><td class="entry"><b>RULE</b> (defined in <a class="el" href="classqgis_1_1pktools_1_1pkextract__random_1_1pkextract__random.html">qgis.pktools.pkextract_random.pkextract_random</a>)</td><td class="entry"><a class="el" href="classqgis_1_1pktools_1_1pkextract__random_1_1pkextract__random.html">qgis.pktools.pkextract_random.pkextract_random</a></td><td class="entry"><span class="mlabel">static</span></td></tr>
+  <tr bgcolor="#f0f0f0" class="even"><td class="entry"><b>RULE_OPTIONS</b> (defined in <a class="el" href="classqgis_1_1pktools_1_1pkextract__random_1_1pkextract__random.html">qgis.pktools.pkextract_random.pkextract_random</a>)</td><td class="entry"><a class="el" href="classqgis_1_1pktools_1_1pkextract__random_1_1pkextract__random.html">qgis.pktools.pkextract_random.pkextract_random</a></td><td class="entry"><span class="mlabel">static</span></td></tr>
+  <tr bgcolor="#f0f0f0"><td class="entry"><b>SRCNODATA</b> (defined in <a class="el" href="classqgis_1_1pktools_1_1pkextract__random_1_1pkextract__random.html">qgis.pktools.pkextract_random.pkextract_random</a>)</td><td class="entry"><a class="el" href="classqgis_1_1pktools_1_1pkextract__random_1_1pkextract__random.html">qgis.pktools.pkextract_random.pkextract_random</a></td><td class="entry"><span class="mlabel">static</span></td></tr>
+</table></div><!-- contents -->
+<!-- HTML footer for doxygen 1.8.4-->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/>
+</a> 1.8.6
+</small></address>
+<script>
+  (function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
+  (i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
+  m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
+  })(window,document,'script','//www.google-analytics.com/analytics.js','ga');
+  ga('create', 'UA-46952639-1', 'nongnu.org');
+  ga('send', 'pageview');
+</script>
+</body>
+</html>
diff --git a/doc/html/classqgis_1_1pkextract__random_1_1pkextract__random.html b/doc/html/classqgis_1_1pktools_1_1pkextract__random_1_1pkextract__random.html
similarity index 62%
copy from doc/html/classqgis_1_1pkextract__random_1_1pkextract__random.html
copy to doc/html/classqgis_1_1pktools_1_1pkextract__random_1_1pkextract__random.html
index 04a06d1..9e0ef6c 100644
--- a/doc/html/classqgis_1_1pkextract__random_1_1pkextract__random.html
+++ b/doc/html/classqgis_1_1pktools_1_1pkextract__random_1_1pkextract__random.html
@@ -4,7 +4,7 @@
 <meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
 <meta http-equiv="X-UA-Compatible" content="IE=9"/>
 <meta name="generator" content="Doxygen 1.8.6"/>
-<title>pktools: qgis.pkextract_random.pkextract_random Class Reference</title>
+<title>pktools: qgis.pktools.pkextract_random.pkextract_random Class Reference</title>
 <link href="tabs.css" rel="stylesheet" type="text/css"/>
 <script type="text/javascript" src="jquery.js"></script>
 <script type="text/javascript" src="dynsections.js"></script>
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.3</span>
+    <span id="projectnumber">2.6.4</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -47,7 +47,7 @@
   </div>
 <div id="nav-path" class="navpath">
   <ul>
-<li class="navelem"><b>qgis</b></li><li class="navelem"><b>pkextract_random</b></li><li class="navelem"><a class="el" href="classqgis_1_1pkextract__random_1_1pkextract__random.html">pkextract_random</a></li>  </ul>
+<li class="navelem"><b>qgis</b></li><li class="navelem"><b>pktools</b></li><li class="navelem"><b>pkextract_random</b></li><li class="navelem"><a class="el" href="classqgis_1_1pktools_1_1pkextract__random_1_1pkextract__random.html">pkextract_random</a></li>  </ul>
 </div>
 </div><!-- top -->
 <div class="header">
@@ -55,90 +55,90 @@
 <a href="#pub-methods">Public Member Functions</a> |
 <a href="#pub-attribs">Public Attributes</a> |
 <a href="#pub-static-attribs">Static Public Attributes</a> |
-<a href="classqgis_1_1pkextract__random_1_1pkextract__random-members.html">List of all members</a>  </div>
+<a href="classqgis_1_1pktools_1_1pkextract__random_1_1pkextract__random-members.html">List of all members</a>  </div>
   <div class="headertitle">
-<div class="title">qgis.pkextract_random.pkextract_random Class Reference</div>  </div>
+<div class="title">qgis.pktools.pkextract_random.pkextract_random Class Reference</div>  </div>
 </div><!--header-->
 <div class="contents">
 <div class="dynheader">
-Inheritance diagram for qgis.pkextract_random.pkextract_random:</div>
+Inheritance diagram for qgis.pktools.pkextract_random.pkextract_random:</div>
 <div class="dyncontent">
-<div class="center"><img src="classqgis_1_1pkextract__random_1_1pkextract__random__inherit__graph.png" border="0" usemap="#qgis_8pkextract__random_8pkextract__random_inherit__map" alt="Inheritance graph"/></div>
+<div class="center"><img src="classqgis_1_1pktools_1_1pkextract__random_1_1pkextract__random__inherit__graph.png" border="0" usemap="#qgis_8pktools_8pkextract__random_8pkextract__random_inherit__map" alt="Inheritance graph"/></div>
 <center><span class="legend">[<a href="graph_legend.html">legend</a>]</span></center></div>
 <div class="dynheader">
-Collaboration diagram for qgis.pkextract_random.pkextract_random:</div>
+Collaboration diagram for qgis.pktools.pkextract_random.pkextract_random:</div>
 <div class="dyncontent">
-<div class="center"><img src="classqgis_1_1pkextract__random_1_1pkextract__random__coll__graph.png" border="0" usemap="#qgis_8pkextract__random_8pkextract__random_coll__map" alt="Collaboration graph"/></div>
+<div class="center"><img src="classqgis_1_1pktools_1_1pkextract__random_1_1pkextract__random__coll__graph.png" border="0" usemap="#qgis_8pktools_8pkextract__random_8pkextract__random_coll__map" alt="Collaboration graph"/></div>
 <center><span class="legend">[<a href="graph_legend.html">legend</a>]</span></center></div>
 <table class="memberdecls">
 <tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pub-methods"></a>
 Public Member Functions</h2></td></tr>
-<tr class="memitem:a12d5f2e69fb4d44ceaa3446295ae8c99"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a12d5f2e69fb4d44ceaa3446295ae8c99"></a>
+<tr class="memitem:a4ad3adfb8949647f7e2ce887ef844473"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a4ad3adfb8949647f7e2ce887ef844473"></a>
 def </td><td class="memItemRight" valign="bottom"><b>cliName</b></td></tr>
-<tr class="separator:a12d5f2e69fb4d44ceaa3446295ae8c99"><td class="memSeparator" colspan="2"> </td></tr>
-<tr class="memitem:a133963a211abc5c6413ea49184ffb1e3"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a133963a211abc5c6413ea49184ffb1e3"></a>
+<tr class="separator:a4ad3adfb8949647f7e2ce887ef844473"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:a1747f9b3668105092aa36592b72ede68"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a1747f9b3668105092aa36592b72ede68"></a>
 def </td><td class="memItemRight" valign="bottom"><b>defineCharacteristics</b></td></tr>
-<tr class="separator:a133963a211abc5c6413ea49184ffb1e3"><td class="memSeparator" colspan="2"> </td></tr>
-<tr class="memitem:a381c05d2100529f51e11ab026270aecc"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a381c05d2100529f51e11ab026270aecc"></a>
+<tr class="separator:a1747f9b3668105092aa36592b72ede68"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:abb5dcf24aee0cbba5e9495134d24795b"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="abb5dcf24aee0cbba5e9495134d24795b"></a>
 def </td><td class="memItemRight" valign="bottom"><b>processAlgorithm</b></td></tr>
-<tr class="separator:a381c05d2100529f51e11ab026270aecc"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="separator:abb5dcf24aee0cbba5e9495134d24795b"><td class="memSeparator" colspan="2"> </td></tr>
 </table><table class="memberdecls">
 <tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pub-attribs"></a>
 Public Attributes</h2></td></tr>
-<tr class="memitem:a82b3377677efcc9221be352e4048cafd"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a82b3377677efcc9221be352e4048cafd"></a>
+<tr class="memitem:af22352f109032ed3a3340b13a9013e09"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="af22352f109032ed3a3340b13a9013e09"></a>
  </td><td class="memItemRight" valign="bottom"><b>name</b></td></tr>
-<tr class="separator:a82b3377677efcc9221be352e4048cafd"><td class="memSeparator" colspan="2"> </td></tr>
-<tr class="memitem:aca5c7763815ce8ed031311ba3a789ca1"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="aca5c7763815ce8ed031311ba3a789ca1"></a>
+<tr class="separator:af22352f109032ed3a3340b13a9013e09"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:a87570906ed677592d5f8bac33ff7a3d8"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a87570906ed677592d5f8bac33ff7a3d8"></a>
  </td><td class="memItemRight" valign="bottom"><b>group</b></td></tr>
-<tr class="separator:aca5c7763815ce8ed031311ba3a789ca1"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="separator:a87570906ed677592d5f8bac33ff7a3d8"><td class="memSeparator" colspan="2"> </td></tr>
 </table><table class="memberdecls">
 <tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pub-static-attribs"></a>
 Static Public Attributes</h2></td></tr>
-<tr class="memitem:aa12d40db6d4c1db34cb7c9f577f7c005"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="aa12d40db6d4c1db34cb7c9f577f7c005"></a>
+<tr class="memitem:af378362e275409fbaadf0164809d9580"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="af378362e275409fbaadf0164809d9580"></a>
 string </td><td class="memItemRight" valign="bottom"><b>INPUT</b> = "INPUT"</td></tr>
-<tr class="separator:aa12d40db6d4c1db34cb7c9f577f7c005"><td class="memSeparator" colspan="2"> </td></tr>
-<tr class="memitem:a085ee08ae2a482d8cbaff595892c54a8"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a085ee08ae2a482d8cbaff595892c54a8"></a>
+<tr class="separator:af378362e275409fbaadf0164809d9580"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:ada827e4d57de53322129310d1d2b01ac"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="ada827e4d57de53322129310d1d2b01ac"></a>
 string </td><td class="memItemRight" valign="bottom"><b>OUTPUT</b> = "OUTPUT"</td></tr>
-<tr class="separator:a085ee08ae2a482d8cbaff595892c54a8"><td class="memSeparator" colspan="2"> </td></tr>
-<tr class="memitem:a85a1e7cb635dcbd857a527768834e990"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a85a1e7cb635dcbd857a527768834e990"></a>
+<tr class="separator:ada827e4d57de53322129310d1d2b01ac"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:ada2bb55cda0c34c8b4a82a13401d2455"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="ada2bb55cda0c34c8b4a82a13401d2455"></a>
 list </td><td class="memItemRight" valign="bottom"><b>RULE_OPTIONS</b> = ['centroid', 'point', 'mean', 'proportion', 'custom', 'min', 'max', 'mode', 'sum', 'median', 'stdev', 'percentile']</td></tr>
-<tr class="separator:a85a1e7cb635dcbd857a527768834e990"><td class="memSeparator" colspan="2"> </td></tr>
-<tr class="memitem:afedf8577b67d791e03897075d8aa27ac"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="afedf8577b67d791e03897075d8aa27ac"></a>
+<tr class="separator:ada2bb55cda0c34c8b4a82a13401d2455"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:ae3e01342bd3404b653c4b8d24f505f17"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="ae3e01342bd3404b653c4b8d24f505f17"></a>
 string </td><td class="memItemRight" valign="bottom"><b>RULE</b> = "RULE"</td></tr>
-<tr class="separator:afedf8577b67d791e03897075d8aa27ac"><td class="memSeparator" colspan="2"> </td></tr>
-<tr class="memitem:a36283f7921c233717d3f14c8db5c1f0b"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a36283f7921c233717d3f14c8db5c1f0b"></a>
+<tr class="separator:ae3e01342bd3404b653c4b8d24f505f17"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:a6d966809aee7401ccf7c298400e7d590"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a6d966809aee7401ccf7c298400e7d590"></a>
 string </td><td class="memItemRight" valign="bottom"><b>POLYGON</b> = "POLYGON"</td></tr>
-<tr class="separator:a36283f7921c233717d3f14c8db5c1f0b"><td class="memSeparator" colspan="2"> </td></tr>
-<tr class="memitem:acd4d3fcc09b1d4e24614be0afaefbf3e"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="acd4d3fcc09b1d4e24614be0afaefbf3e"></a>
+<tr class="separator:a6d966809aee7401ccf7c298400e7d590"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:a9cae04c4754d9863a12c776286e96fdb"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a9cae04c4754d9863a12c776286e96fdb"></a>
 string </td><td class="memItemRight" valign="bottom"><b>BUFFER</b> = "BUFFER"</td></tr>
-<tr class="separator:acd4d3fcc09b1d4e24614be0afaefbf3e"><td class="memSeparator" colspan="2"> </td></tr>
-<tr class="memitem:adcaa31fc02c279d8bbdb849104d939e1"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="adcaa31fc02c279d8bbdb849104d939e1"></a>
+<tr class="separator:a9cae04c4754d9863a12c776286e96fdb"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:aae134982ad295e7f2f206c85b6d28528"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="aae134982ad295e7f2f206c85b6d28528"></a>
 string </td><td class="memItemRight" valign="bottom"><b>RANDOM</b> = "RANDOM"</td></tr>
-<tr class="separator:adcaa31fc02c279d8bbdb849104d939e1"><td class="memSeparator" colspan="2"> </td></tr>
-<tr class="memitem:a13dc6553f4a7a228ae4b94e810694889"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a13dc6553f4a7a228ae4b94e810694889"></a>
+<tr class="separator:aae134982ad295e7f2f206c85b6d28528"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:a7a0f0334d5a3ecc367fc6621a9bfe63f"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a7a0f0334d5a3ecc367fc6621a9bfe63f"></a>
 string </td><td class="memItemRight" valign="bottom"><b>SRCNODATA</b> = "SRCNODATA"</td></tr>
-<tr class="separator:a13dc6553f4a7a228ae4b94e810694889"><td class="memSeparator" colspan="2"> </td></tr>
-<tr class="memitem:aa443b2341e1b83d1c1cf56f95cdb36a0"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="aa443b2341e1b83d1c1cf56f95cdb36a0"></a>
+<tr class="separator:a7a0f0334d5a3ecc367fc6621a9bfe63f"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:aabe205b1faf586f973e527998303d834"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="aabe205b1faf586f973e527998303d834"></a>
 string </td><td class="memItemRight" valign="bottom"><b>BNDNODATA</b> = "BNDNODATA"</td></tr>
-<tr class="separator:aa443b2341e1b83d1c1cf56f95cdb36a0"><td class="memSeparator" colspan="2"> </td></tr>
-<tr class="memitem:acfa85cb06c31b3bf3a7b543e3185368e"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="acfa85cb06c31b3bf3a7b543e3185368e"></a>
+<tr class="separator:aabe205b1faf586f973e527998303d834"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:a366ca672a6dc061ca5624107cd1e6701"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a366ca672a6dc061ca5624107cd1e6701"></a>
 string </td><td class="memItemRight" valign="bottom"><b>EXTRA</b> = 'EXTRA'</td></tr>
-<tr class="separator:acfa85cb06c31b3bf3a7b543e3185368e"><td class="memSeparator" colspan="2"> </td></tr>
-<tr class="memitem:aa9917fab3df26d469766bfa0ba603ee4"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="aa9917fab3df26d469766bfa0ba603ee4"></a>
+<tr class="separator:a366ca672a6dc061ca5624107cd1e6701"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:aa477d50d42493c4a70f2d985dc235b8c"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="aa477d50d42493c4a70f2d985dc235b8c"></a>
 string </td><td class="memItemRight" valign="bottom"><b>FORMAT</b> = "FORMAT"</td></tr>
-<tr class="separator:aa9917fab3df26d469766bfa0ba603ee4"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="separator:aa477d50d42493c4a70f2d985dc235b8c"><td class="memSeparator" colspan="2"> </td></tr>
 </table>
 <a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
 <div class="textblock">
-<p>Definition at line <a class="el" href="pkextract__random_8py_source.html#l00087">87</a> of file <a class="el" href="pkextract__random_8py_source.html">pkextract_random.py</a>.</p>
+<p>Definition at line <a class="el" href="pktools_2pkextract__random_8py_source.html#l00087">87</a> of file <a class="el" href="pktools_2pkextract__random_8py_source.html">pkextract_random.py</a>.</p>
 </div><hr/>The documentation for this class was generated from the following file:<ul>
-<li>/home/kempenep/pktools/qgis/<a class="el" href="pkextract__random_8py_source.html">pkextract_random.py</a></li>
+<li>/home/kempenep/pktools/qgis/pktools/<a class="el" href="pktools_2pkextract__random_8py_source.html">pkextract_random.py</a></li>
 </ul>
 </div><!-- contents -->
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Jun 23 2015 17:09:37 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/classqgis_1_1pktools_1_1pkfilter__spatial_1_1pkfilter__spatial-members.html b/doc/html/classqgis_1_1pktools_1_1pkfilter__spatial_1_1pkfilter__spatial-members.html
new file mode 100644
index 0000000..6c60253
--- /dev/null
+++ b/doc/html/classqgis_1_1pktools_1_1pkfilter__spatial_1_1pkfilter__spatial-members.html
@@ -0,0 +1,94 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.6"/>
+<title>pktools: Member List</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+  <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
+  <td style="padding-left: 0.5em;">
+   <div id="projectname">pktools
+    <span id="projectnumber">2.6.4</span>
+   </div>
+   <div id="projectbrief">Processing Kernel for geospatial data</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.6 -->
+  <div id="navrow1" class="tabs">
+    <ul class="tablist">
+      <li><a href="index.html"><span>Main Page</span></a></li>
+      <li><a href="pages.html"><span>Related Pages</span></a></li>
+      <li class="current"><a href="annotated.html"><span>Classes</span></a></li>
+      <li><a href="files.html"><span>Files</span></a></li>
+    </ul>
+  </div>
+  <div id="navrow2" class="tabs2">
+    <ul class="tablist">
+      <li><a href="annotated.html"><span>Class List</span></a></li>
+      <li><a href="classes.html"><span>Class Index</span></a></li>
+      <li><a href="inherits.html"><span>Class Hierarchy</span></a></li>
+      <li><a href="functions.html"><span>Class Members</span></a></li>
+    </ul>
+  </div>
+<div id="nav-path" class="navpath">
+  <ul>
+<li class="navelem"><b>qgis</b></li><li class="navelem"><b>pktools</b></li><li class="navelem"><b>pkfilter_spatial</b></li><li class="navelem"><a class="el" href="classqgis_1_1pktools_1_1pkfilter__spatial_1_1pkfilter__spatial.html">pkfilter_spatial</a></li>  </ul>
+</div>
+</div><!-- top -->
+<div class="header">
+  <div class="headertitle">
+<div class="title">qgis.pktools.pkfilter_spatial.pkfilter_spatial Member List</div>  </div>
+</div><!--header-->
+<div class="contents">
+
+<p>This is the complete list of members for <a class="el" href="classqgis_1_1pktools_1_1pkfilter__spatial_1_1pkfilter__spatial.html">qgis.pktools.pkfilter_spatial.pkfilter_spatial</a>, including all inherited members.</p>
+<table class="directory">
+  <tr bgcolor="#f0f0f0" class="even"><td class="entry"><b>cliName</b> (defined in <a class="el" href="classqgis_1_1pktools_1_1pkfilter__spatial_1_1pkfilter__spatial.html">qgis.pktools.pkfilter_spatial.pkfilter_spatial</a>)</td><td class="entry"><a class="el" href="classqgis_1_1pktools_1_1pkfilter__spatial_1_1pkfilter__spatial.html">qgis.pktools.pkfilter_spatial.pkfilter_spatial</a></td><td class="entry"></td></tr>
+  <tr bgcolor="#f0f0f0"><td class="entry"><b>defineCharacteristics</b> (defined in <a class="el" href="classqgis_1_1pktools_1_1pkfilter__spatial_1_1pkfilter__spatial.html">qgis.pktools.pkfilter_spatial.pkfilter_spatial</a>)</td><td class="entry"><a class="el" href="classqgis_1_1pktools_1_1pkfilter__spatial_1_1pkfilter__spatial.html">qgis.pktools.pkfilter_spatial.pkfilter_spatial</a></td><td class="entry"></td></tr>
+  <tr bgcolor="#f0f0f0" class="even"><td class="entry"><b>DIM</b> (defined in <a class="el" href="classqgis_1_1pktools_1_1pkfilter__spatial_1_1pkfilter__spatial.html">qgis.pktools.pkfilter_spatial.pkfilter_spatial</a>)</td><td class="entry"><a class="el" href="classqgis_1_1pktools_1_1pkfilter__spatial_1_1pkfilter__spatial.html">qgis.pktools.pkfilter_spatial.pkfilter_spatial</a></td><td class="entry"><span class="mlabel">static</span></td></tr>
+  <tr bgcolor="#f0f0f0"><td class="entry"><b>EXTRA</b> (defined in <a class="el" href="classqgis_1_1pktools_1_1pkfilter__spatial_1_1pkfilter__spatial.html">qgis.pktools.pkfilter_spatial.pkfilter_spatial</a>)</td><td class="entry"><a class="el" href="classqgis_1_1pktools_1_1pkfilter__spatial_1_1pkfilter__spatial.html">qgis.pktools.pkfilter_spatial.pkfilter_spatial</a></td><td class="entry"><span class="mlabel">static</span></td></tr>
+  <tr bgcolor="#f0f0f0" class="even"><td class="entry"><b>group</b> (defined in <a class="el" href="classqgis_1_1pktools_1_1pkfilter__spatial_1_1pkfilter__spatial.html">qgis.pktools.pkfilter_spatial.pkfilter_spatial</a>)</td><td class="entry"><a class="el" href="classqgis_1_1pktools_1_1pkfilter__spatial_1_1pkfilter__spatial.html">qgis.pktools.pkfilter_spatial.pkfilter_spatial</a></td><td class="entry"></td></tr>
+  <tr bgcolor="#f0f0f0"><td class="entry"><b>INPUT</b> (defined in <a class="el" href="classqgis_1_1pktools_1_1pkfilter__spatial_1_1pkfilter__spatial.html">qgis.pktools.pkfilter_spatial.pkfilter_spatial</a>)</td><td class="entry"><a class="el" href="classqgis_1_1pktools_1_1pkfilter__spatial_1_1pkfilter__spatial.html">qgis.pktools.pkfilter_spatial.pkfilter_spatial</a></td><td class="entry"><span class="mlabel">static</span></td></tr>
+  <tr bgcolor="#f0f0f0" class="even"><td class="entry"><b>METHOD</b> (defined in <a class="el" href="classqgis_1_1pktools_1_1pkfilter__spatial_1_1pkfilter__spatial.html">qgis.pktools.pkfilter_spatial.pkfilter_spatial</a>)</td><td class="entry"><a class="el" href="classqgis_1_1pktools_1_1pkfilter__spatial_1_1pkfilter__spatial.html">qgis.pktools.pkfilter_spatial.pkfilter_spatial</a></td><td class="entry"><span class="mlabel">static</span></td></tr>
+  <tr bgcolor="#f0f0f0"><td class="entry"><b>METHOD_OPTIONS</b> (defined in <a class="el" href="classqgis_1_1pktools_1_1pkfilter__spatial_1_1pkfilter__spatial.html">qgis.pktools.pkfilter_spatial.pkfilter_spatial</a>)</td><td class="entry"><a class="el" href="classqgis_1_1pktools_1_1pkfilter__spatial_1_1pkfilter__spatial.html">qgis.pktools.pkfilter_spatial.pkfilter_spatial</a></td><td class="entry"><span class="mlabel">static</span></td></tr>
+  <tr bgcolor="#f0f0f0" class="even"><td class="entry"><b>name</b> (defined in <a class="el" href="classqgis_1_1pktools_1_1pkfilter__spatial_1_1pkfilter__spatial.html">qgis.pktools.pkfilter_spatial.pkfilter_spatial</a>)</td><td class="entry"><a class="el" href="classqgis_1_1pktools_1_1pkfilter__spatial_1_1pkfilter__spatial.html">qgis.pktools.pkfilter_spatial.pkfilter_spatial</a></td><td class="entry"></td></tr>
+  <tr bgcolor="#f0f0f0"><td class="entry"><b>NODATA</b> (defined in <a class="el" href="classqgis_1_1pktools_1_1pkfilter__spatial_1_1pkfilter__spatial.html">qgis.pktools.pkfilter_spatial.pkfilter_spatial</a>)</td><td class="entry"><a class="el" href="classqgis_1_1pktools_1_1pkfilter__spatial_1_1pkfilter__spatial.html">qgis.pktools.pkfilter_spatial.pkfilter_spatial</a></td><td class="entry"><span class="mlabel">static</span></td></tr>
+  <tr bgcolor="#f0f0f0" class="even"><td class="entry"><b>OUTPUT</b> (defined in <a class="el" href="classqgis_1_1pktools_1_1pkfilter__spatial_1_1pkfilter__spatial.html">qgis.pktools.pkfilter_spatial.pkfilter_spatial</a>)</td><td class="entry"><a class="el" href="classqgis_1_1pktools_1_1pkfilter__spatial_1_1pkfilter__spatial.html">qgis.pktools.pkfilter_spatial.pkfilter_spatial</a></td><td class="entry"><span class="mlabel">static</span></td></tr>
+  <tr bgcolor="#f0f0f0"><td class="entry"><b>PADDING</b> (defined in <a class="el" href="classqgis_1_1pktools_1_1pkfilter__spatial_1_1pkfilter__spatial.html">qgis.pktools.pkfilter_spatial.pkfilter_spatial</a>)</td><td class="entry"><a class="el" href="classqgis_1_1pktools_1_1pkfilter__spatial_1_1pkfilter__spatial.html">qgis.pktools.pkfilter_spatial.pkfilter_spatial</a></td><td class="entry"><span class="mlabel">static</span></td></tr>
+  <tr bgcolor="#f0f0f0" class="even"><td class="entry"><b>PADDING_OPTIONS</b> (defined in <a class="el" href="classqgis_1_1pktools_1_1pkfilter__spatial_1_1pkfilter__spatial.html">qgis.pktools.pkfilter_spatial.pkfilter_spatial</a>)</td><td class="entry"><a class="el" href="classqgis_1_1pktools_1_1pkfilter__spatial_1_1pkfilter__spatial.html">qgis.pktools.pkfilter_spatial.pkfilter_spatial</a></td><td class="entry"><span class="mlabel">static</span></td></tr>
+  <tr bgcolor="#f0f0f0"><td class="entry"><b>processAlgorithm</b> (defined in <a class="el" href="classqgis_1_1pktools_1_1pkfilter__spatial_1_1pkfilter__spatial.html">qgis.pktools.pkfilter_spatial.pkfilter_spatial</a>)</td><td class="entry"><a class="el" href="classqgis_1_1pktools_1_1pkfilter__spatial_1_1pkfilter__spatial.html">qgis.pktools.pkfilter_spatial.pkfilter_spatial</a></td><td class="entry"></td></tr>
+  <tr bgcolor="#f0f0f0" class="even"><td class="entry"><b>RTYPE</b> (defined in <a class="el" href="classqgis_1_1pktools_1_1pkfilter__spatial_1_1pkfilter__spatial.html">qgis.pktools.pkfilter_spatial.pkfilter_spatial</a>)</td><td class="entry"><a class="el" href="classqgis_1_1pktools_1_1pkfilter__spatial_1_1pkfilter__spatial.html">qgis.pktools.pkfilter_spatial.pkfilter_spatial</a></td><td class="entry"><span class="mlabel">static</span></td></tr>
+  <tr bgcolor="#f0f0f0"><td class="entry"><b>TYPE</b> (defined in <a class="el" href="classqgis_1_1pktools_1_1pkfilter__spatial_1_1pkfilter__spatial.html">qgis.pktools.pkfilter_spatial.pkfilter_spatial</a>)</td><td class="entry"><a class="el" href="classqgis_1_1pktools_1_1pkfilter__spatial_1_1pkfilter__spatial.html">qgis.pktools.pkfilter_spatial.pkfilter_spatial</a></td><td class="entry"><span class="mlabel">static</span></td></tr>
+</table></div><!-- contents -->
+<!-- HTML footer for doxygen 1.8.4-->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/>
+</a> 1.8.6
+</small></address>
+<script>
+  (function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
+  (i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
+  m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
+  })(window,document,'script','//www.google-analytics.com/analytics.js','ga');
+  ga('create', 'UA-46952639-1', 'nongnu.org');
+  ga('send', 'pageview');
+</script>
+</body>
+</html>
diff --git a/doc/html/classqgis_1_1pkfilter__spatial_1_1pkfilter__spatial.html b/doc/html/classqgis_1_1pktools_1_1pkfilter__spatial_1_1pkfilter__spatial.html
similarity index 64%
copy from doc/html/classqgis_1_1pkfilter__spatial_1_1pkfilter__spatial.html
copy to doc/html/classqgis_1_1pktools_1_1pkfilter__spatial_1_1pkfilter__spatial.html
index 3bdce2f..3623b97 100644
--- a/doc/html/classqgis_1_1pkfilter__spatial_1_1pkfilter__spatial.html
+++ b/doc/html/classqgis_1_1pktools_1_1pkfilter__spatial_1_1pkfilter__spatial.html
@@ -4,7 +4,7 @@
 <meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
 <meta http-equiv="X-UA-Compatible" content="IE=9"/>
 <meta name="generator" content="Doxygen 1.8.6"/>
-<title>pktools: qgis.pkfilter_spatial.pkfilter_spatial Class Reference</title>
+<title>pktools: qgis.pktools.pkfilter_spatial.pkfilter_spatial Class Reference</title>
 <link href="tabs.css" rel="stylesheet" type="text/css"/>
 <script type="text/javascript" src="jquery.js"></script>
 <script type="text/javascript" src="dynsections.js"></script>
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.3</span>
+    <span id="projectnumber">2.6.4</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -47,7 +47,7 @@
   </div>
 <div id="nav-path" class="navpath">
   <ul>
-<li class="navelem"><b>qgis</b></li><li class="navelem"><b>pkfilter_spatial</b></li><li class="navelem"><a class="el" href="classqgis_1_1pkfilter__spatial_1_1pkfilter__spatial.html">pkfilter_spatial</a></li>  </ul>
+<li class="navelem"><b>qgis</b></li><li class="navelem"><b>pktools</b></li><li class="navelem"><b>pkfilter_spatial</b></li><li class="navelem"><a class="el" href="classqgis_1_1pktools_1_1pkfilter__spatial_1_1pkfilter__spatial.html">pkfilter_spatial</a></li>  </ul>
 </div>
 </div><!-- top -->
 <div class="header">
@@ -55,90 +55,90 @@
 <a href="#pub-methods">Public Member Functions</a> |
 <a href="#pub-attribs">Public Attributes</a> |
 <a href="#pub-static-attribs">Static Public Attributes</a> |
-<a href="classqgis_1_1pkfilter__spatial_1_1pkfilter__spatial-members.html">List of all members</a>  </div>
+<a href="classqgis_1_1pktools_1_1pkfilter__spatial_1_1pkfilter__spatial-members.html">List of all members</a>  </div>
   <div class="headertitle">
-<div class="title">qgis.pkfilter_spatial.pkfilter_spatial Class Reference</div>  </div>
+<div class="title">qgis.pktools.pkfilter_spatial.pkfilter_spatial Class Reference</div>  </div>
 </div><!--header-->
 <div class="contents">
 <div class="dynheader">
-Inheritance diagram for qgis.pkfilter_spatial.pkfilter_spatial:</div>
+Inheritance diagram for qgis.pktools.pkfilter_spatial.pkfilter_spatial:</div>
 <div class="dyncontent">
-<div class="center"><img src="classqgis_1_1pkfilter__spatial_1_1pkfilter__spatial__inherit__graph.png" border="0" usemap="#qgis_8pkfilter__spatial_8pkfilter__spatial_inherit__map" alt="Inheritance graph"/></div>
+<div class="center"><img src="classqgis_1_1pktools_1_1pkfilter__spatial_1_1pkfilter__spatial__inherit__graph.png" border="0" usemap="#qgis_8pktools_8pkfilter__spatial_8pkfilter__spatial_inherit__map" alt="Inheritance graph"/></div>
 <center><span class="legend">[<a href="graph_legend.html">legend</a>]</span></center></div>
 <div class="dynheader">
-Collaboration diagram for qgis.pkfilter_spatial.pkfilter_spatial:</div>
+Collaboration diagram for qgis.pktools.pkfilter_spatial.pkfilter_spatial:</div>
 <div class="dyncontent">
-<div class="center"><img src="classqgis_1_1pkfilter__spatial_1_1pkfilter__spatial__coll__graph.png" border="0" usemap="#qgis_8pkfilter__spatial_8pkfilter__spatial_coll__map" alt="Collaboration graph"/></div>
+<div class="center"><img src="classqgis_1_1pktools_1_1pkfilter__spatial_1_1pkfilter__spatial__coll__graph.png" border="0" usemap="#qgis_8pktools_8pkfilter__spatial_8pkfilter__spatial_coll__map" alt="Collaboration graph"/></div>
 <center><span class="legend">[<a href="graph_legend.html">legend</a>]</span></center></div>
 <table class="memberdecls">
 <tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pub-methods"></a>
 Public Member Functions</h2></td></tr>
-<tr class="memitem:a8517fc04fd5f13c52e174efc16736f83"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a8517fc04fd5f13c52e174efc16736f83"></a>
+<tr class="memitem:a49b7370981ec4d1b7ce7fe15c26138bd"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a49b7370981ec4d1b7ce7fe15c26138bd"></a>
 def </td><td class="memItemRight" valign="bottom"><b>cliName</b></td></tr>
-<tr class="separator:a8517fc04fd5f13c52e174efc16736f83"><td class="memSeparator" colspan="2"> </td></tr>
-<tr class="memitem:a28a9650dcd013cb49b033a7cef101d43"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a28a9650dcd013cb49b033a7cef101d43"></a>
+<tr class="separator:a49b7370981ec4d1b7ce7fe15c26138bd"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:a40e4204b03bc22faae17a7562ca419b4"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a40e4204b03bc22faae17a7562ca419b4"></a>
 def </td><td class="memItemRight" valign="bottom"><b>defineCharacteristics</b></td></tr>
-<tr class="separator:a28a9650dcd013cb49b033a7cef101d43"><td class="memSeparator" colspan="2"> </td></tr>
-<tr class="memitem:a916cd41987cb92d488afcdfe6b42b5f1"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a916cd41987cb92d488afcdfe6b42b5f1"></a>
+<tr class="separator:a40e4204b03bc22faae17a7562ca419b4"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:afe93b8974da64e6d9621e67c234080d1"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="afe93b8974da64e6d9621e67c234080d1"></a>
 def </td><td class="memItemRight" valign="bottom"><b>processAlgorithm</b></td></tr>
-<tr class="separator:a916cd41987cb92d488afcdfe6b42b5f1"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="separator:afe93b8974da64e6d9621e67c234080d1"><td class="memSeparator" colspan="2"> </td></tr>
 </table><table class="memberdecls">
 <tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pub-attribs"></a>
 Public Attributes</h2></td></tr>
-<tr class="memitem:abb1b57dd0e00851665ec24a1df526ab6"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="abb1b57dd0e00851665ec24a1df526ab6"></a>
+<tr class="memitem:a94b3480f40673e5016d7383c63ec83a5"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a94b3480f40673e5016d7383c63ec83a5"></a>
  </td><td class="memItemRight" valign="bottom"><b>name</b></td></tr>
-<tr class="separator:abb1b57dd0e00851665ec24a1df526ab6"><td class="memSeparator" colspan="2"> </td></tr>
-<tr class="memitem:ab468aa6da0990f5884debd8bfbe27e21"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="ab468aa6da0990f5884debd8bfbe27e21"></a>
+<tr class="separator:a94b3480f40673e5016d7383c63ec83a5"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:afff9b2d6386a3a2f623056162d9d5cfd"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="afff9b2d6386a3a2f623056162d9d5cfd"></a>
  </td><td class="memItemRight" valign="bottom"><b>group</b></td></tr>
-<tr class="separator:ab468aa6da0990f5884debd8bfbe27e21"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="separator:afff9b2d6386a3a2f623056162d9d5cfd"><td class="memSeparator" colspan="2"> </td></tr>
 </table><table class="memberdecls">
 <tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pub-static-attribs"></a>
 Static Public Attributes</h2></td></tr>
-<tr class="memitem:aab43173cb62c16cccd2311cc2351ea72"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="aab43173cb62c16cccd2311cc2351ea72"></a>
+<tr class="memitem:a70643eead7c6d1505fad7e785fb65360"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a70643eead7c6d1505fad7e785fb65360"></a>
 string </td><td class="memItemRight" valign="bottom"><b>INPUT</b> = "INPUT"</td></tr>
-<tr class="separator:aab43173cb62c16cccd2311cc2351ea72"><td class="memSeparator" colspan="2"> </td></tr>
-<tr class="memitem:a17420bcb37a89c2b89f4531ab6180de0"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a17420bcb37a89c2b89f4531ab6180de0"></a>
+<tr class="separator:a70643eead7c6d1505fad7e785fb65360"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:a2bded0b49bef4a2fbd1fb93c5448cd31"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a2bded0b49bef4a2fbd1fb93c5448cd31"></a>
 string </td><td class="memItemRight" valign="bottom"><b>OUTPUT</b> = "OUTPUT"</td></tr>
-<tr class="separator:a17420bcb37a89c2b89f4531ab6180de0"><td class="memSeparator" colspan="2"> </td></tr>
-<tr class="memitem:af2ee51651a6a19a6922db57a4d72d549"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="af2ee51651a6a19a6922db57a4d72d549"></a>
+<tr class="separator:a2bded0b49bef4a2fbd1fb93c5448cd31"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:a5f7665673481e0fc3fcec2249af3ded1"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a5f7665673481e0fc3fcec2249af3ded1"></a>
 list </td><td class="memItemRight" valign="bottom"><b>METHOD_OPTIONS</b> = ["none", "median", "var", "min", "max", "sum", "mean", "dilate", "erode", "close", "open", "homog ", "heterog ", "sobelx ", "sobely ", "sobelxy ", "sobelyx" , "smooth", "countid", "smoothnodata values", "thr [...]
-<tr class="separator:af2ee51651a6a19a6922db57a4d72d549"><td class="memSeparator" colspan="2"> </td></tr>
-<tr class="memitem:a17c23d864a0778596b436f6fdb864de5"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a17c23d864a0778596b436f6fdb864de5"></a>
+<tr class="separator:a5f7665673481e0fc3fcec2249af3ded1"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:a50ea23abc53abb9a4b5b829c9e1ed221"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a50ea23abc53abb9a4b5b829c9e1ed221"></a>
 string </td><td class="memItemRight" valign="bottom"><b>METHOD</b> = "METHOD"</td></tr>
-<tr class="separator:a17c23d864a0778596b436f6fdb864de5"><td class="memSeparator" colspan="2"> </td></tr>
-<tr class="memitem:ac31abd8117f135e1e7f43bcbdd8456c9"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="ac31abd8117f135e1e7f43bcbdd8456c9"></a>
+<tr class="separator:a50ea23abc53abb9a4b5b829c9e1ed221"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:a5b3e50fc81018403e22380d4a9f81376"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a5b3e50fc81018403e22380d4a9f81376"></a>
 string </td><td class="memItemRight" valign="bottom"><b>DIM</b> = "DIM"</td></tr>
-<tr class="separator:ac31abd8117f135e1e7f43bcbdd8456c9"><td class="memSeparator" colspan="2"> </td></tr>
-<tr class="memitem:a241b1a8c1933b44e84da25c708a93e61"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a241b1a8c1933b44e84da25c708a93e61"></a>
+<tr class="separator:a5b3e50fc81018403e22380d4a9f81376"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:a9f53b19e3f757101071ad12687ea8133"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a9f53b19e3f757101071ad12687ea8133"></a>
 string </td><td class="memItemRight" valign="bottom"><b>NODATA</b> = "NODATA"</td></tr>
-<tr class="separator:a241b1a8c1933b44e84da25c708a93e61"><td class="memSeparator" colspan="2"> </td></tr>
-<tr class="memitem:a199b3a2d3018c67ea5046c7c38a9e974"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a199b3a2d3018c67ea5046c7c38a9e974"></a>
+<tr class="separator:a9f53b19e3f757101071ad12687ea8133"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:a701591dea36d98ef8ebc551500eb38f7"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a701591dea36d98ef8ebc551500eb38f7"></a>
 list </td><td class="memItemRight" valign="bottom"><b>PADDING_OPTIONS</b> = ["symmetric", "replicate", "circular", "zero"]</td></tr>
-<tr class="separator:a199b3a2d3018c67ea5046c7c38a9e974"><td class="memSeparator" colspan="2"> </td></tr>
-<tr class="memitem:a359fadbd1e77c36bfa229b1708b364a0"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a359fadbd1e77c36bfa229b1708b364a0"></a>
+<tr class="separator:a701591dea36d98ef8ebc551500eb38f7"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:a4c65e79b498ae3c1455181680af356ae"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a4c65e79b498ae3c1455181680af356ae"></a>
 string </td><td class="memItemRight" valign="bottom"><b>PADDING</b> = "PADDING"</td></tr>
-<tr class="separator:a359fadbd1e77c36bfa229b1708b364a0"><td class="memSeparator" colspan="2"> </td></tr>
-<tr class="memitem:a556dd033f6fbe62238ea73f26f142752"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a556dd033f6fbe62238ea73f26f142752"></a>
+<tr class="separator:a4c65e79b498ae3c1455181680af356ae"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:a417eebdeec4c9e85ff7bf759c0f9396d"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a417eebdeec4c9e85ff7bf759c0f9396d"></a>
 string </td><td class="memItemRight" valign="bottom"><b>RTYPE</b> = 'RTYPE'</td></tr>
-<tr class="separator:a556dd033f6fbe62238ea73f26f142752"><td class="memSeparator" colspan="2"> </td></tr>
-<tr class="memitem:ac9bc83f6c62747fafd30efecb13c5d62"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="ac9bc83f6c62747fafd30efecb13c5d62"></a>
+<tr class="separator:a417eebdeec4c9e85ff7bf759c0f9396d"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:a1b6d5e87c0633ad7b7297d8689b681d8"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a1b6d5e87c0633ad7b7297d8689b681d8"></a>
 list </td><td class="memItemRight" valign="bottom"><b>TYPE</b> = ['none', 'Byte','Int16','UInt16','UInt32','Int32','Float32','Float64','CInt16','CInt32','CFloat32','CFloat64']</td></tr>
-<tr class="separator:ac9bc83f6c62747fafd30efecb13c5d62"><td class="memSeparator" colspan="2"> </td></tr>
-<tr class="memitem:a1a3a4d8cc8523b66376f621feed86909"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a1a3a4d8cc8523b66376f621feed86909"></a>
+<tr class="separator:a1b6d5e87c0633ad7b7297d8689b681d8"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:aea043fa4377c44c0e081e7377f6b30b3"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="aea043fa4377c44c0e081e7377f6b30b3"></a>
 string </td><td class="memItemRight" valign="bottom"><b>EXTRA</b> = 'EXTRA'</td></tr>
-<tr class="separator:a1a3a4d8cc8523b66376f621feed86909"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="separator:aea043fa4377c44c0e081e7377f6b30b3"><td class="memSeparator" colspan="2"> </td></tr>
 </table>
 <a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
 <div class="textblock">
-<p>Definition at line <a class="el" href="pkfilter__spatial_8py_source.html#l00038">38</a> of file <a class="el" href="pkfilter__spatial_8py_source.html">pkfilter_spatial.py</a>.</p>
+<p>Definition at line <a class="el" href="pktools_2pkfilter__spatial_8py_source.html#l00038">38</a> of file <a class="el" href="pktools_2pkfilter__spatial_8py_source.html">pkfilter_spatial.py</a>.</p>
 </div><hr/>The documentation for this class was generated from the following file:<ul>
-<li>/home/kempenep/pktools/qgis/<a class="el" href="pkfilter__spatial_8py_source.html">pkfilter_spatial.py</a></li>
+<li>/home/kempenep/pktools/qgis/pktools/<a class="el" href="pktools_2pkfilter__spatial_8py_source.html">pkfilter_spatial.py</a></li>
 </ul>
 </div><!-- contents -->
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Jun 23 2015 17:09:37 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/classqgis_1_1pktools_1_1pkfilter__spectral_1_1pkfilter__spectral-members.html b/doc/html/classqgis_1_1pktools_1_1pkfilter__spectral_1_1pkfilter__spectral-members.html
new file mode 100644
index 0000000..a71fe59
--- /dev/null
+++ b/doc/html/classqgis_1_1pktools_1_1pkfilter__spectral_1_1pkfilter__spectral-members.html
@@ -0,0 +1,94 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.6"/>
+<title>pktools: Member List</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+  <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
+  <td style="padding-left: 0.5em;">
+   <div id="projectname">pktools
+    <span id="projectnumber">2.6.4</span>
+   </div>
+   <div id="projectbrief">Processing Kernel for geospatial data</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.6 -->
+  <div id="navrow1" class="tabs">
+    <ul class="tablist">
+      <li><a href="index.html"><span>Main Page</span></a></li>
+      <li><a href="pages.html"><span>Related Pages</span></a></li>
+      <li class="current"><a href="annotated.html"><span>Classes</span></a></li>
+      <li><a href="files.html"><span>Files</span></a></li>
+    </ul>
+  </div>
+  <div id="navrow2" class="tabs2">
+    <ul class="tablist">
+      <li><a href="annotated.html"><span>Class List</span></a></li>
+      <li><a href="classes.html"><span>Class Index</span></a></li>
+      <li><a href="inherits.html"><span>Class Hierarchy</span></a></li>
+      <li><a href="functions.html"><span>Class Members</span></a></li>
+    </ul>
+  </div>
+<div id="nav-path" class="navpath">
+  <ul>
+<li class="navelem"><b>qgis</b></li><li class="navelem"><b>pktools</b></li><li class="navelem"><b>pkfilter_spectral</b></li><li class="navelem"><a class="el" href="classqgis_1_1pktools_1_1pkfilter__spectral_1_1pkfilter__spectral.html">pkfilter_spectral</a></li>  </ul>
+</div>
+</div><!-- top -->
+<div class="header">
+  <div class="headertitle">
+<div class="title">qgis.pktools.pkfilter_spectral.pkfilter_spectral Member List</div>  </div>
+</div><!--header-->
+<div class="contents">
+
+<p>This is the complete list of members for <a class="el" href="classqgis_1_1pktools_1_1pkfilter__spectral_1_1pkfilter__spectral.html">qgis.pktools.pkfilter_spectral.pkfilter_spectral</a>, including all inherited members.</p>
+<table class="directory">
+  <tr bgcolor="#f0f0f0" class="even"><td class="entry"><b>cliName</b> (defined in <a class="el" href="classqgis_1_1pktools_1_1pkfilter__spectral_1_1pkfilter__spectral.html">qgis.pktools.pkfilter_spectral.pkfilter_spectral</a>)</td><td class="entry"><a class="el" href="classqgis_1_1pktools_1_1pkfilter__spectral_1_1pkfilter__spectral.html">qgis.pktools.pkfilter_spectral.pkfilter_spectral</a></td><td class="entry"></td></tr>
+  <tr bgcolor="#f0f0f0"><td class="entry"><b>defineCharacteristics</b> (defined in <a class="el" href="classqgis_1_1pktools_1_1pkfilter__spectral_1_1pkfilter__spectral.html">qgis.pktools.pkfilter_spectral.pkfilter_spectral</a>)</td><td class="entry"><a class="el" href="classqgis_1_1pktools_1_1pkfilter__spectral_1_1pkfilter__spectral.html">qgis.pktools.pkfilter_spectral.pkfilter_spectral</a></td><td class="entry"></td></tr>
+  <tr bgcolor="#f0f0f0" class="even"><td class="entry"><b>DZ</b> (defined in <a class="el" href="classqgis_1_1pktools_1_1pkfilter__spectral_1_1pkfilter__spectral.html">qgis.pktools.pkfilter_spectral.pkfilter_spectral</a>)</td><td class="entry"><a class="el" href="classqgis_1_1pktools_1_1pkfilter__spectral_1_1pkfilter__spectral.html">qgis.pktools.pkfilter_spectral.pkfilter_spectral</a></td><td class="entry"><span class="mlabel">static</span></td></tr>
+  <tr bgcolor="#f0f0f0"><td class="entry"><b>EXTRA</b> (defined in <a class="el" href="classqgis_1_1pktools_1_1pkfilter__spectral_1_1pkfilter__spectral.html">qgis.pktools.pkfilter_spectral.pkfilter_spectral</a>)</td><td class="entry"><a class="el" href="classqgis_1_1pktools_1_1pkfilter__spectral_1_1pkfilter__spectral.html">qgis.pktools.pkfilter_spectral.pkfilter_spectral</a></td><td class="entry"><span class="mlabel">static</span></td></tr>
+  <tr bgcolor="#f0f0f0" class="even"><td class="entry"><b>group</b> (defined in <a class="el" href="classqgis_1_1pktools_1_1pkfilter__spectral_1_1pkfilter__spectral.html">qgis.pktools.pkfilter_spectral.pkfilter_spectral</a>)</td><td class="entry"><a class="el" href="classqgis_1_1pktools_1_1pkfilter__spectral_1_1pkfilter__spectral.html">qgis.pktools.pkfilter_spectral.pkfilter_spectral</a></td><td class="entry"></td></tr>
+  <tr bgcolor="#f0f0f0"><td class="entry"><b>INPUT</b> (defined in <a class="el" href="classqgis_1_1pktools_1_1pkfilter__spectral_1_1pkfilter__spectral.html">qgis.pktools.pkfilter_spectral.pkfilter_spectral</a>)</td><td class="entry"><a class="el" href="classqgis_1_1pktools_1_1pkfilter__spectral_1_1pkfilter__spectral.html">qgis.pktools.pkfilter_spectral.pkfilter_spectral</a></td><td class="entry"><span class="mlabel">static</span></td></tr>
+  <tr bgcolor="#f0f0f0" class="even"><td class="entry"><b>METHOD</b> (defined in <a class="el" href="classqgis_1_1pktools_1_1pkfilter__spectral_1_1pkfilter__spectral.html">qgis.pktools.pkfilter_spectral.pkfilter_spectral</a>)</td><td class="entry"><a class="el" href="classqgis_1_1pktools_1_1pkfilter__spectral_1_1pkfilter__spectral.html">qgis.pktools.pkfilter_spectral.pkfilter_spectral</a></td><td class="entry"><span class="mlabel">static</span></td></tr>
+  <tr bgcolor="#f0f0f0"><td class="entry"><b>METHOD_OPTIONS</b> (defined in <a class="el" href="classqgis_1_1pktools_1_1pkfilter__spectral_1_1pkfilter__spectral.html">qgis.pktools.pkfilter_spectral.pkfilter_spectral</a>)</td><td class="entry"><a class="el" href="classqgis_1_1pktools_1_1pkfilter__spectral_1_1pkfilter__spectral.html">qgis.pktools.pkfilter_spectral.pkfilter_spectral</a></td><td class="entry"><span class="mlabel">static</span></td></tr>
+  <tr bgcolor="#f0f0f0" class="even"><td class="entry"><b>name</b> (defined in <a class="el" href="classqgis_1_1pktools_1_1pkfilter__spectral_1_1pkfilter__spectral.html">qgis.pktools.pkfilter_spectral.pkfilter_spectral</a>)</td><td class="entry"><a class="el" href="classqgis_1_1pktools_1_1pkfilter__spectral_1_1pkfilter__spectral.html">qgis.pktools.pkfilter_spectral.pkfilter_spectral</a></td><td class="entry"></td></tr>
+  <tr bgcolor="#f0f0f0"><td class="entry"><b>NODATA</b> (defined in <a class="el" href="classqgis_1_1pktools_1_1pkfilter__spectral_1_1pkfilter__spectral.html">qgis.pktools.pkfilter_spectral.pkfilter_spectral</a>)</td><td class="entry"><a class="el" href="classqgis_1_1pktools_1_1pkfilter__spectral_1_1pkfilter__spectral.html">qgis.pktools.pkfilter_spectral.pkfilter_spectral</a></td><td class="entry"><span class="mlabel">static</span></td></tr>
+  <tr bgcolor="#f0f0f0" class="even"><td class="entry"><b>OUTPUT</b> (defined in <a class="el" href="classqgis_1_1pktools_1_1pkfilter__spectral_1_1pkfilter__spectral.html">qgis.pktools.pkfilter_spectral.pkfilter_spectral</a>)</td><td class="entry"><a class="el" href="classqgis_1_1pktools_1_1pkfilter__spectral_1_1pkfilter__spectral.html">qgis.pktools.pkfilter_spectral.pkfilter_spectral</a></td><td class="entry"><span class="mlabel">static</span></td></tr>
+  <tr bgcolor="#f0f0f0"><td class="entry"><b>PADDING</b> (defined in <a class="el" href="classqgis_1_1pktools_1_1pkfilter__spectral_1_1pkfilter__spectral.html">qgis.pktools.pkfilter_spectral.pkfilter_spectral</a>)</td><td class="entry"><a class="el" href="classqgis_1_1pktools_1_1pkfilter__spectral_1_1pkfilter__spectral.html">qgis.pktools.pkfilter_spectral.pkfilter_spectral</a></td><td class="entry"><span class="mlabel">static</span></td></tr>
+  <tr bgcolor="#f0f0f0" class="even"><td class="entry"><b>PADDING_OPTIONS</b> (defined in <a class="el" href="classqgis_1_1pktools_1_1pkfilter__spectral_1_1pkfilter__spectral.html">qgis.pktools.pkfilter_spectral.pkfilter_spectral</a>)</td><td class="entry"><a class="el" href="classqgis_1_1pktools_1_1pkfilter__spectral_1_1pkfilter__spectral.html">qgis.pktools.pkfilter_spectral.pkfilter_spectral</a></td><td class="entry"><span class="mlabel">static</span></td></tr>
+  <tr bgcolor="#f0f0f0"><td class="entry"><b>processAlgorithm</b> (defined in <a class="el" href="classqgis_1_1pktools_1_1pkfilter__spectral_1_1pkfilter__spectral.html">qgis.pktools.pkfilter_spectral.pkfilter_spectral</a>)</td><td class="entry"><a class="el" href="classqgis_1_1pktools_1_1pkfilter__spectral_1_1pkfilter__spectral.html">qgis.pktools.pkfilter_spectral.pkfilter_spectral</a></td><td class="entry"></td></tr>
+  <tr bgcolor="#f0f0f0" class="even"><td class="entry"><b>RTYPE</b> (defined in <a class="el" href="classqgis_1_1pktools_1_1pkfilter__spectral_1_1pkfilter__spectral.html">qgis.pktools.pkfilter_spectral.pkfilter_spectral</a>)</td><td class="entry"><a class="el" href="classqgis_1_1pktools_1_1pkfilter__spectral_1_1pkfilter__spectral.html">qgis.pktools.pkfilter_spectral.pkfilter_spectral</a></td><td class="entry"><span class="mlabel">static</span></td></tr>
+  <tr bgcolor="#f0f0f0"><td class="entry"><b>TYPE</b> (defined in <a class="el" href="classqgis_1_1pktools_1_1pkfilter__spectral_1_1pkfilter__spectral.html">qgis.pktools.pkfilter_spectral.pkfilter_spectral</a>)</td><td class="entry"><a class="el" href="classqgis_1_1pktools_1_1pkfilter__spectral_1_1pkfilter__spectral.html">qgis.pktools.pkfilter_spectral.pkfilter_spectral</a></td><td class="entry"><span class="mlabel">static</span></td></tr>
+</table></div><!-- contents -->
+<!-- HTML footer for doxygen 1.8.4-->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/>
+</a> 1.8.6
+</small></address>
+<script>
+  (function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
+  (i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
+  m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
+  })(window,document,'script','//www.google-analytics.com/analytics.js','ga');
+  ga('create', 'UA-46952639-1', 'nongnu.org');
+  ga('send', 'pageview');
+</script>
+</body>
+</html>
diff --git a/doc/html/classqgis_1_1pkfilter__spectral_1_1pkfilter__spectral.html b/doc/html/classqgis_1_1pktools_1_1pkfilter__spectral_1_1pkfilter__spectral.html
similarity index 63%
copy from doc/html/classqgis_1_1pkfilter__spectral_1_1pkfilter__spectral.html
copy to doc/html/classqgis_1_1pktools_1_1pkfilter__spectral_1_1pkfilter__spectral.html
index 2682955..adfd318 100644
--- a/doc/html/classqgis_1_1pkfilter__spectral_1_1pkfilter__spectral.html
+++ b/doc/html/classqgis_1_1pktools_1_1pkfilter__spectral_1_1pkfilter__spectral.html
@@ -4,7 +4,7 @@
 <meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
 <meta http-equiv="X-UA-Compatible" content="IE=9"/>
 <meta name="generator" content="Doxygen 1.8.6"/>
-<title>pktools: qgis.pkfilter_spectral.pkfilter_spectral Class Reference</title>
+<title>pktools: qgis.pktools.pkfilter_spectral.pkfilter_spectral Class Reference</title>
 <link href="tabs.css" rel="stylesheet" type="text/css"/>
 <script type="text/javascript" src="jquery.js"></script>
 <script type="text/javascript" src="dynsections.js"></script>
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.3</span>
+    <span id="projectnumber">2.6.4</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -47,7 +47,7 @@
   </div>
 <div id="nav-path" class="navpath">
   <ul>
-<li class="navelem"><b>qgis</b></li><li class="navelem"><b>pkfilter_spectral</b></li><li class="navelem"><a class="el" href="classqgis_1_1pkfilter__spectral_1_1pkfilter__spectral.html">pkfilter_spectral</a></li>  </ul>
+<li class="navelem"><b>qgis</b></li><li class="navelem"><b>pktools</b></li><li class="navelem"><b>pkfilter_spectral</b></li><li class="navelem"><a class="el" href="classqgis_1_1pktools_1_1pkfilter__spectral_1_1pkfilter__spectral.html">pkfilter_spectral</a></li>  </ul>
 </div>
 </div><!-- top -->
 <div class="header">
@@ -55,90 +55,90 @@
 <a href="#pub-methods">Public Member Functions</a> |
 <a href="#pub-attribs">Public Attributes</a> |
 <a href="#pub-static-attribs">Static Public Attributes</a> |
-<a href="classqgis_1_1pkfilter__spectral_1_1pkfilter__spectral-members.html">List of all members</a>  </div>
+<a href="classqgis_1_1pktools_1_1pkfilter__spectral_1_1pkfilter__spectral-members.html">List of all members</a>  </div>
   <div class="headertitle">
-<div class="title">qgis.pkfilter_spectral.pkfilter_spectral Class Reference</div>  </div>
+<div class="title">qgis.pktools.pkfilter_spectral.pkfilter_spectral Class Reference</div>  </div>
 </div><!--header-->
 <div class="contents">
 <div class="dynheader">
-Inheritance diagram for qgis.pkfilter_spectral.pkfilter_spectral:</div>
+Inheritance diagram for qgis.pktools.pkfilter_spectral.pkfilter_spectral:</div>
 <div class="dyncontent">
-<div class="center"><img src="classqgis_1_1pkfilter__spectral_1_1pkfilter__spectral__inherit__graph.png" border="0" usemap="#qgis_8pkfilter__spectral_8pkfilter__spectral_inherit__map" alt="Inheritance graph"/></div>
+<div class="center"><img src="classqgis_1_1pktools_1_1pkfilter__spectral_1_1pkfilter__spectral__inherit__graph.png" border="0" usemap="#qgis_8pktools_8pkfilter__spectral_8pkfilter__spectral_inherit__map" alt="Inheritance graph"/></div>
 <center><span class="legend">[<a href="graph_legend.html">legend</a>]</span></center></div>
 <div class="dynheader">
-Collaboration diagram for qgis.pkfilter_spectral.pkfilter_spectral:</div>
+Collaboration diagram for qgis.pktools.pkfilter_spectral.pkfilter_spectral:</div>
 <div class="dyncontent">
-<div class="center"><img src="classqgis_1_1pkfilter__spectral_1_1pkfilter__spectral__coll__graph.png" border="0" usemap="#qgis_8pkfilter__spectral_8pkfilter__spectral_coll__map" alt="Collaboration graph"/></div>
+<div class="center"><img src="classqgis_1_1pktools_1_1pkfilter__spectral_1_1pkfilter__spectral__coll__graph.png" border="0" usemap="#qgis_8pktools_8pkfilter__spectral_8pkfilter__spectral_coll__map" alt="Collaboration graph"/></div>
 <center><span class="legend">[<a href="graph_legend.html">legend</a>]</span></center></div>
 <table class="memberdecls">
 <tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pub-methods"></a>
 Public Member Functions</h2></td></tr>
-<tr class="memitem:a67ee5ff2f1cb29dd15291e3ac0e5331c"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a67ee5ff2f1cb29dd15291e3ac0e5331c"></a>
+<tr class="memitem:ae4ff77f62787c22082b90cce278fe647"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="ae4ff77f62787c22082b90cce278fe647"></a>
 def </td><td class="memItemRight" valign="bottom"><b>cliName</b></td></tr>
-<tr class="separator:a67ee5ff2f1cb29dd15291e3ac0e5331c"><td class="memSeparator" colspan="2"> </td></tr>
-<tr class="memitem:af55a16e489b299317f90f5d15493efe8"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="af55a16e489b299317f90f5d15493efe8"></a>
+<tr class="separator:ae4ff77f62787c22082b90cce278fe647"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:a85ccd74854e3e2b5b3839301df8abc67"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a85ccd74854e3e2b5b3839301df8abc67"></a>
 def </td><td class="memItemRight" valign="bottom"><b>defineCharacteristics</b></td></tr>
-<tr class="separator:af55a16e489b299317f90f5d15493efe8"><td class="memSeparator" colspan="2"> </td></tr>
-<tr class="memitem:a0f7fba7c11f7644e71e8c41ae72fa06d"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a0f7fba7c11f7644e71e8c41ae72fa06d"></a>
+<tr class="separator:a85ccd74854e3e2b5b3839301df8abc67"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:a59e137f4fdb6ab68662b260d89171314"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a59e137f4fdb6ab68662b260d89171314"></a>
 def </td><td class="memItemRight" valign="bottom"><b>processAlgorithm</b></td></tr>
-<tr class="separator:a0f7fba7c11f7644e71e8c41ae72fa06d"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="separator:a59e137f4fdb6ab68662b260d89171314"><td class="memSeparator" colspan="2"> </td></tr>
 </table><table class="memberdecls">
 <tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pub-attribs"></a>
 Public Attributes</h2></td></tr>
-<tr class="memitem:a85b2c92f62e8260f9f51d8d8f10ff44a"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a85b2c92f62e8260f9f51d8d8f10ff44a"></a>
+<tr class="memitem:a3acd427b14996200c28731af93881230"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a3acd427b14996200c28731af93881230"></a>
  </td><td class="memItemRight" valign="bottom"><b>name</b></td></tr>
-<tr class="separator:a85b2c92f62e8260f9f51d8d8f10ff44a"><td class="memSeparator" colspan="2"> </td></tr>
-<tr class="memitem:ad21f52f89d4b6cbe06e4bf830a8f5678"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="ad21f52f89d4b6cbe06e4bf830a8f5678"></a>
+<tr class="separator:a3acd427b14996200c28731af93881230"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:a564ebf9df0204af2dcdddddd4242e8e1"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a564ebf9df0204af2dcdddddd4242e8e1"></a>
  </td><td class="memItemRight" valign="bottom"><b>group</b></td></tr>
-<tr class="separator:ad21f52f89d4b6cbe06e4bf830a8f5678"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="separator:a564ebf9df0204af2dcdddddd4242e8e1"><td class="memSeparator" colspan="2"> </td></tr>
 </table><table class="memberdecls">
 <tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pub-static-attribs"></a>
 Static Public Attributes</h2></td></tr>
-<tr class="memitem:a20a6cee11be7abd9325358a564819d26"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a20a6cee11be7abd9325358a564819d26"></a>
+<tr class="memitem:a66e04e576250870781b5354957894c96"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a66e04e576250870781b5354957894c96"></a>
 string </td><td class="memItemRight" valign="bottom"><b>INPUT</b> = "INPUT"</td></tr>
-<tr class="separator:a20a6cee11be7abd9325358a564819d26"><td class="memSeparator" colspan="2"> </td></tr>
-<tr class="memitem:a0be5ed45033cae15184219a6485a396b"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a0be5ed45033cae15184219a6485a396b"></a>
+<tr class="separator:a66e04e576250870781b5354957894c96"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:a0386672f58fdda479ca994c7dd7ceda8"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a0386672f58fdda479ca994c7dd7ceda8"></a>
 string </td><td class="memItemRight" valign="bottom"><b>OUTPUT</b> = "OUTPUT"</td></tr>
-<tr class="separator:a0be5ed45033cae15184219a6485a396b"><td class="memSeparator" colspan="2"> </td></tr>
-<tr class="memitem:a88267ee3b205fbfc5e6823c693eb4e14"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a88267ee3b205fbfc5e6823c693eb4e14"></a>
+<tr class="separator:a0386672f58fdda479ca994c7dd7ceda8"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:a0b6ef52a12318176d8a7274b0b3c0992"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a0b6ef52a12318176d8a7274b0b3c0992"></a>
 list </td><td class="memItemRight" valign="bottom"><b>METHOD_OPTIONS</b> = ["none", "median", "var", "min", "max", "sum", "mean", "dilate", "erode", "close", "open", "smooth", "density", "smoothnodata values", "threshold local filtering", "stdev", "dwt", "dwti", "dwt_cut", "dwt_cut_from&quot [...]
-<tr class="separator:a88267ee3b205fbfc5e6823c693eb4e14"><td class="memSeparator" colspan="2"> </td></tr>
-<tr class="memitem:a15c6950b12c57ff838be9ba415e28c8e"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a15c6950b12c57ff838be9ba415e28c8e"></a>
+<tr class="separator:a0b6ef52a12318176d8a7274b0b3c0992"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:a2161052c92e79f5af48d6777d37afe2f"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a2161052c92e79f5af48d6777d37afe2f"></a>
 string </td><td class="memItemRight" valign="bottom"><b>METHOD</b> = "METHOD"</td></tr>
-<tr class="separator:a15c6950b12c57ff838be9ba415e28c8e"><td class="memSeparator" colspan="2"> </td></tr>
-<tr class="memitem:aeff20f41be397170c8e351d0aa74bc79"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="aeff20f41be397170c8e351d0aa74bc79"></a>
+<tr class="separator:a2161052c92e79f5af48d6777d37afe2f"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:a818a9a5d4a7484deaa19a4445e034c60"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a818a9a5d4a7484deaa19a4445e034c60"></a>
 string </td><td class="memItemRight" valign="bottom"><b>DZ</b> = "DZ"</td></tr>
-<tr class="separator:aeff20f41be397170c8e351d0aa74bc79"><td class="memSeparator" colspan="2"> </td></tr>
-<tr class="memitem:a68d3c2ee722166fa9d8ddf3151fd8e55"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a68d3c2ee722166fa9d8ddf3151fd8e55"></a>
+<tr class="separator:a818a9a5d4a7484deaa19a4445e034c60"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:a9f1e339aa49f2753729f9fcd4ed43d09"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a9f1e339aa49f2753729f9fcd4ed43d09"></a>
 string </td><td class="memItemRight" valign="bottom"><b>NODATA</b> = "NODATA"</td></tr>
-<tr class="separator:a68d3c2ee722166fa9d8ddf3151fd8e55"><td class="memSeparator" colspan="2"> </td></tr>
-<tr class="memitem:a706e766bf47d4fab85e95879c6d657a4"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a706e766bf47d4fab85e95879c6d657a4"></a>
+<tr class="separator:a9f1e339aa49f2753729f9fcd4ed43d09"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:a90860af18044f5ce29b36c7c4ef112dd"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a90860af18044f5ce29b36c7c4ef112dd"></a>
 list </td><td class="memItemRight" valign="bottom"><b>PADDING_OPTIONS</b> = ["symmetric", "replicate", "circular", "zero"]</td></tr>
-<tr class="separator:a706e766bf47d4fab85e95879c6d657a4"><td class="memSeparator" colspan="2"> </td></tr>
-<tr class="memitem:ae9fcf789fcc3b4871f5419bbce84511a"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="ae9fcf789fcc3b4871f5419bbce84511a"></a>
+<tr class="separator:a90860af18044f5ce29b36c7c4ef112dd"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:aeab6b7f6a3471187ae33f3597a86721a"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="aeab6b7f6a3471187ae33f3597a86721a"></a>
 string </td><td class="memItemRight" valign="bottom"><b>PADDING</b> = "PADDING"</td></tr>
-<tr class="separator:ae9fcf789fcc3b4871f5419bbce84511a"><td class="memSeparator" colspan="2"> </td></tr>
-<tr class="memitem:ab8240d9589b85c133897e73224e6bcb2"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="ab8240d9589b85c133897e73224e6bcb2"></a>
+<tr class="separator:aeab6b7f6a3471187ae33f3597a86721a"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:a6464f37811e617e629087e4760f353d8"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a6464f37811e617e629087e4760f353d8"></a>
 string </td><td class="memItemRight" valign="bottom"><b>RTYPE</b> = 'RTYPE'</td></tr>
-<tr class="separator:ab8240d9589b85c133897e73224e6bcb2"><td class="memSeparator" colspan="2"> </td></tr>
-<tr class="memitem:a43e8b1dc19ef86bee9a3c933f9f83529"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a43e8b1dc19ef86bee9a3c933f9f83529"></a>
+<tr class="separator:a6464f37811e617e629087e4760f353d8"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:ae43cc505f2d02b9bbc05f4a84658a792"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="ae43cc505f2d02b9bbc05f4a84658a792"></a>
 list </td><td class="memItemRight" valign="bottom"><b>TYPE</b> = ['none', 'Byte','Int16','UInt16','UInt32','Int32','Float32','Float64','CInt16','CInt32','CFloat32','CFloat64']</td></tr>
-<tr class="separator:a43e8b1dc19ef86bee9a3c933f9f83529"><td class="memSeparator" colspan="2"> </td></tr>
-<tr class="memitem:a916a5975c9e4fc03fdf55a8a02dcb91e"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a916a5975c9e4fc03fdf55a8a02dcb91e"></a>
+<tr class="separator:ae43cc505f2d02b9bbc05f4a84658a792"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:a9c91be195b361b2616904f3ee2990ff5"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a9c91be195b361b2616904f3ee2990ff5"></a>
 string </td><td class="memItemRight" valign="bottom"><b>EXTRA</b> = 'EXTRA'</td></tr>
-<tr class="separator:a916a5975c9e4fc03fdf55a8a02dcb91e"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="separator:a9c91be195b361b2616904f3ee2990ff5"><td class="memSeparator" colspan="2"> </td></tr>
 </table>
 <a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
 <div class="textblock">
-<p>Definition at line <a class="el" href="pkfilter__spectral_8py_source.html#l00038">38</a> of file <a class="el" href="pkfilter__spectral_8py_source.html">pkfilter_spectral.py</a>.</p>
+<p>Definition at line <a class="el" href="pktools_2pkfilter__spectral_8py_source.html#l00038">38</a> of file <a class="el" href="pktools_2pkfilter__spectral_8py_source.html">pkfilter_spectral.py</a>.</p>
 </div><hr/>The documentation for this class was generated from the following file:<ul>
-<li>/home/kempenep/pktools/qgis/<a class="el" href="pkfilter__spectral_8py_source.html">pkfilter_spectral.py</a></li>
+<li>/home/kempenep/pktools/qgis/pktools/<a class="el" href="pktools_2pkfilter__spectral_8py_source.html">pkfilter_spectral.py</a></li>
 </ul>
 </div><!-- contents -->
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Jun 23 2015 17:09:37 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/classqgis_1_1pktools_1_1pkfilterdem_1_1pkfilterdem-members.html b/doc/html/classqgis_1_1pktools_1_1pkfilterdem_1_1pkfilterdem-members.html
new file mode 100644
index 0000000..1eb71f9
--- /dev/null
+++ b/doc/html/classqgis_1_1pktools_1_1pkfilterdem_1_1pkfilterdem-members.html
@@ -0,0 +1,91 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.6"/>
+<title>pktools: Member List</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+  <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
+  <td style="padding-left: 0.5em;">
+   <div id="projectname">pktools
+    <span id="projectnumber">2.6.4</span>
+   </div>
+   <div id="projectbrief">Processing Kernel for geospatial data</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.6 -->
+  <div id="navrow1" class="tabs">
+    <ul class="tablist">
+      <li><a href="index.html"><span>Main Page</span></a></li>
+      <li><a href="pages.html"><span>Related Pages</span></a></li>
+      <li class="current"><a href="annotated.html"><span>Classes</span></a></li>
+      <li><a href="files.html"><span>Files</span></a></li>
+    </ul>
+  </div>
+  <div id="navrow2" class="tabs2">
+    <ul class="tablist">
+      <li><a href="annotated.html"><span>Class List</span></a></li>
+      <li><a href="classes.html"><span>Class Index</span></a></li>
+      <li><a href="inherits.html"><span>Class Hierarchy</span></a></li>
+      <li><a href="functions.html"><span>Class Members</span></a></li>
+    </ul>
+  </div>
+<div id="nav-path" class="navpath">
+  <ul>
+<li class="navelem"><b>qgis</b></li><li class="navelem"><b>pktools</b></li><li class="navelem"><b>pkfilterdem</b></li><li class="navelem"><a class="el" href="classqgis_1_1pktools_1_1pkfilterdem_1_1pkfilterdem.html">pkfilterdem</a></li>  </ul>
+</div>
+</div><!-- top -->
+<div class="header">
+  <div class="headertitle">
+<div class="title">qgis.pktools.pkfilterdem.pkfilterdem Member List</div>  </div>
+</div><!--header-->
+<div class="contents">
+
+<p>This is the complete list of members for <a class="el" href="classqgis_1_1pktools_1_1pkfilterdem_1_1pkfilterdem.html">qgis.pktools.pkfilterdem.pkfilterdem</a>, including all inherited members.</p>
+<table class="directory">
+  <tr bgcolor="#f0f0f0" class="even"><td class="entry"><b>cliName</b> (defined in <a class="el" href="classqgis_1_1pktools_1_1pkfilterdem_1_1pkfilterdem.html">qgis.pktools.pkfilterdem.pkfilterdem</a>)</td><td class="entry"><a class="el" href="classqgis_1_1pktools_1_1pkfilterdem_1_1pkfilterdem.html">qgis.pktools.pkfilterdem.pkfilterdem</a></td><td class="entry"></td></tr>
+  <tr bgcolor="#f0f0f0"><td class="entry"><b>defineCharacteristics</b> (defined in <a class="el" href="classqgis_1_1pktools_1_1pkfilterdem_1_1pkfilterdem.html">qgis.pktools.pkfilterdem.pkfilterdem</a>)</td><td class="entry"><a class="el" href="classqgis_1_1pktools_1_1pkfilterdem_1_1pkfilterdem.html">qgis.pktools.pkfilterdem.pkfilterdem</a></td><td class="entry"></td></tr>
+  <tr bgcolor="#f0f0f0" class="even"><td class="entry"><b>DIM</b> (defined in <a class="el" href="classqgis_1_1pktools_1_1pkfilterdem_1_1pkfilterdem.html">qgis.pktools.pkfilterdem.pkfilterdem</a>)</td><td class="entry"><a class="el" href="classqgis_1_1pktools_1_1pkfilterdem_1_1pkfilterdem.html">qgis.pktools.pkfilterdem.pkfilterdem</a></td><td class="entry"><span class="mlabel">static</span></td></tr>
+  <tr bgcolor="#f0f0f0"><td class="entry"><b>EXTRA</b> (defined in <a class="el" href="classqgis_1_1pktools_1_1pkfilterdem_1_1pkfilterdem.html">qgis.pktools.pkfilterdem.pkfilterdem</a>)</td><td class="entry"><a class="el" href="classqgis_1_1pktools_1_1pkfilterdem_1_1pkfilterdem.html">qgis.pktools.pkfilterdem.pkfilterdem</a></td><td class="entry"><span class="mlabel">static</span></td></tr>
+  <tr bgcolor="#f0f0f0" class="even"><td class="entry"><b>FILTER</b> (defined in <a class="el" href="classqgis_1_1pktools_1_1pkfilterdem_1_1pkfilterdem.html">qgis.pktools.pkfilterdem.pkfilterdem</a>)</td><td class="entry"><a class="el" href="classqgis_1_1pktools_1_1pkfilterdem_1_1pkfilterdem.html">qgis.pktools.pkfilterdem.pkfilterdem</a></td><td class="entry"><span class="mlabel">static</span></td></tr>
+  <tr bgcolor="#f0f0f0"><td class="entry"><b>FILTER_OPTIONS</b> (defined in <a class="el" href="classqgis_1_1pktools_1_1pkfilterdem_1_1pkfilterdem.html">qgis.pktools.pkfilterdem.pkfilterdem</a>)</td><td class="entry"><a class="el" href="classqgis_1_1pktools_1_1pkfilterdem_1_1pkfilterdem.html">qgis.pktools.pkfilterdem.pkfilterdem</a></td><td class="entry"><span class="mlabel">static</span></td></tr>
+  <tr bgcolor="#f0f0f0" class="even"><td class="entry"><b>group</b> (defined in <a class="el" href="classqgis_1_1pktools_1_1pkfilterdem_1_1pkfilterdem.html">qgis.pktools.pkfilterdem.pkfilterdem</a>)</td><td class="entry"><a class="el" href="classqgis_1_1pktools_1_1pkfilterdem_1_1pkfilterdem.html">qgis.pktools.pkfilterdem.pkfilterdem</a></td><td class="entry"></td></tr>
+  <tr bgcolor="#f0f0f0"><td class="entry"><b>INPUT</b> (defined in <a class="el" href="classqgis_1_1pktools_1_1pkfilterdem_1_1pkfilterdem.html">qgis.pktools.pkfilterdem.pkfilterdem</a>)</td><td class="entry"><a class="el" href="classqgis_1_1pktools_1_1pkfilterdem_1_1pkfilterdem.html">qgis.pktools.pkfilterdem.pkfilterdem</a></td><td class="entry"><span class="mlabel">static</span></td></tr>
+  <tr bgcolor="#f0f0f0" class="even"><td class="entry"><b>name</b> (defined in <a class="el" href="classqgis_1_1pktools_1_1pkfilterdem_1_1pkfilterdem.html">qgis.pktools.pkfilterdem.pkfilterdem</a>)</td><td class="entry"><a class="el" href="classqgis_1_1pktools_1_1pkfilterdem_1_1pkfilterdem.html">qgis.pktools.pkfilterdem.pkfilterdem</a></td><td class="entry"></td></tr>
+  <tr bgcolor="#f0f0f0"><td class="entry"><b>OUTPUT</b> (defined in <a class="el" href="classqgis_1_1pktools_1_1pkfilterdem_1_1pkfilterdem.html">qgis.pktools.pkfilterdem.pkfilterdem</a>)</td><td class="entry"><a class="el" href="classqgis_1_1pktools_1_1pkfilterdem_1_1pkfilterdem.html">qgis.pktools.pkfilterdem.pkfilterdem</a></td><td class="entry"><span class="mlabel">static</span></td></tr>
+  <tr bgcolor="#f0f0f0" class="even"><td class="entry"><b>processAlgorithm</b> (defined in <a class="el" href="classqgis_1_1pktools_1_1pkfilterdem_1_1pkfilterdem.html">qgis.pktools.pkfilterdem.pkfilterdem</a>)</td><td class="entry"><a class="el" href="classqgis_1_1pktools_1_1pkfilterdem_1_1pkfilterdem.html">qgis.pktools.pkfilterdem.pkfilterdem</a></td><td class="entry"></td></tr>
+  <tr bgcolor="#f0f0f0"><td class="entry"><b>RTYPE</b> (defined in <a class="el" href="classqgis_1_1pktools_1_1pkfilterdem_1_1pkfilterdem.html">qgis.pktools.pkfilterdem.pkfilterdem</a>)</td><td class="entry"><a class="el" href="classqgis_1_1pktools_1_1pkfilterdem_1_1pkfilterdem.html">qgis.pktools.pkfilterdem.pkfilterdem</a></td><td class="entry"><span class="mlabel">static</span></td></tr>
+  <tr bgcolor="#f0f0f0" class="even"><td class="entry"><b>TYPE</b> (defined in <a class="el" href="classqgis_1_1pktools_1_1pkfilterdem_1_1pkfilterdem.html">qgis.pktools.pkfilterdem.pkfilterdem</a>)</td><td class="entry"><a class="el" href="classqgis_1_1pktools_1_1pkfilterdem_1_1pkfilterdem.html">qgis.pktools.pkfilterdem.pkfilterdem</a></td><td class="entry"><span class="mlabel">static</span></td></tr>
+</table></div><!-- contents -->
+<!-- HTML footer for doxygen 1.8.4-->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/>
+</a> 1.8.6
+</small></address>
+<script>
+  (function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
+  (i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
+  m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
+  })(window,document,'script','//www.google-analytics.com/analytics.js','ga');
+  ga('create', 'UA-46952639-1', 'nongnu.org');
+  ga('send', 'pageview');
+</script>
+</body>
+</html>
diff --git a/doc/html/classqgis_1_1pkfilterdem_1_1pkfilterdem.html b/doc/html/classqgis_1_1pktools_1_1pkfilterdem_1_1pkfilterdem.html
similarity index 63%
copy from doc/html/classqgis_1_1pkfilterdem_1_1pkfilterdem.html
copy to doc/html/classqgis_1_1pktools_1_1pkfilterdem_1_1pkfilterdem.html
index ce98f69..003372a 100644
--- a/doc/html/classqgis_1_1pkfilterdem_1_1pkfilterdem.html
+++ b/doc/html/classqgis_1_1pktools_1_1pkfilterdem_1_1pkfilterdem.html
@@ -4,7 +4,7 @@
 <meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
 <meta http-equiv="X-UA-Compatible" content="IE=9"/>
 <meta name="generator" content="Doxygen 1.8.6"/>
-<title>pktools: qgis.pkfilterdem.pkfilterdem Class Reference</title>
+<title>pktools: qgis.pktools.pkfilterdem.pkfilterdem Class Reference</title>
 <link href="tabs.css" rel="stylesheet" type="text/css"/>
 <script type="text/javascript" src="jquery.js"></script>
 <script type="text/javascript" src="dynsections.js"></script>
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.3</span>
+    <span id="projectnumber">2.6.4</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -47,7 +47,7 @@
   </div>
 <div id="nav-path" class="navpath">
   <ul>
-<li class="navelem"><b>qgis</b></li><li class="navelem"><b>pkfilterdem</b></li><li class="navelem"><a class="el" href="classqgis_1_1pkfilterdem_1_1pkfilterdem.html">pkfilterdem</a></li>  </ul>
+<li class="navelem"><b>qgis</b></li><li class="navelem"><b>pktools</b></li><li class="navelem"><b>pkfilterdem</b></li><li class="navelem"><a class="el" href="classqgis_1_1pktools_1_1pkfilterdem_1_1pkfilterdem.html">pkfilterdem</a></li>  </ul>
 </div>
 </div><!-- top -->
 <div class="header">
@@ -55,81 +55,81 @@
 <a href="#pub-methods">Public Member Functions</a> |
 <a href="#pub-attribs">Public Attributes</a> |
 <a href="#pub-static-attribs">Static Public Attributes</a> |
-<a href="classqgis_1_1pkfilterdem_1_1pkfilterdem-members.html">List of all members</a>  </div>
+<a href="classqgis_1_1pktools_1_1pkfilterdem_1_1pkfilterdem-members.html">List of all members</a>  </div>
   <div class="headertitle">
-<div class="title">qgis.pkfilterdem.pkfilterdem Class Reference</div>  </div>
+<div class="title">qgis.pktools.pkfilterdem.pkfilterdem Class Reference</div>  </div>
 </div><!--header-->
 <div class="contents">
 <div class="dynheader">
-Inheritance diagram for qgis.pkfilterdem.pkfilterdem:</div>
+Inheritance diagram for qgis.pktools.pkfilterdem.pkfilterdem:</div>
 <div class="dyncontent">
-<div class="center"><img src="classqgis_1_1pkfilterdem_1_1pkfilterdem__inherit__graph.png" border="0" usemap="#qgis_8pkfilterdem_8pkfilterdem_inherit__map" alt="Inheritance graph"/></div>
+<div class="center"><img src="classqgis_1_1pktools_1_1pkfilterdem_1_1pkfilterdem__inherit__graph.png" border="0" usemap="#qgis_8pktools_8pkfilterdem_8pkfilterdem_inherit__map" alt="Inheritance graph"/></div>
 <center><span class="legend">[<a href="graph_legend.html">legend</a>]</span></center></div>
 <div class="dynheader">
-Collaboration diagram for qgis.pkfilterdem.pkfilterdem:</div>
+Collaboration diagram for qgis.pktools.pkfilterdem.pkfilterdem:</div>
 <div class="dyncontent">
-<div class="center"><img src="classqgis_1_1pkfilterdem_1_1pkfilterdem__coll__graph.png" border="0" usemap="#qgis_8pkfilterdem_8pkfilterdem_coll__map" alt="Collaboration graph"/></div>
+<div class="center"><img src="classqgis_1_1pktools_1_1pkfilterdem_1_1pkfilterdem__coll__graph.png" border="0" usemap="#qgis_8pktools_8pkfilterdem_8pkfilterdem_coll__map" alt="Collaboration graph"/></div>
 <center><span class="legend">[<a href="graph_legend.html">legend</a>]</span></center></div>
 <table class="memberdecls">
 <tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pub-methods"></a>
 Public Member Functions</h2></td></tr>
-<tr class="memitem:a0f4ab9a21d0270b9215bdeadd24be172"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a0f4ab9a21d0270b9215bdeadd24be172"></a>
+<tr class="memitem:a0aac6f68d72ca4b02b164f5d76f25e6e"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a0aac6f68d72ca4b02b164f5d76f25e6e"></a>
 def </td><td class="memItemRight" valign="bottom"><b>cliName</b></td></tr>
-<tr class="separator:a0f4ab9a21d0270b9215bdeadd24be172"><td class="memSeparator" colspan="2"> </td></tr>
-<tr class="memitem:a063c9e4fe1b7958eabc4bfaf5175de14"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a063c9e4fe1b7958eabc4bfaf5175de14"></a>
+<tr class="separator:a0aac6f68d72ca4b02b164f5d76f25e6e"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:aadcc0a3cc20c7d83d271fff4b3b29f6c"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="aadcc0a3cc20c7d83d271fff4b3b29f6c"></a>
 def </td><td class="memItemRight" valign="bottom"><b>defineCharacteristics</b></td></tr>
-<tr class="separator:a063c9e4fe1b7958eabc4bfaf5175de14"><td class="memSeparator" colspan="2"> </td></tr>
-<tr class="memitem:ad836b1fe6c57ec07645d3a6db9c18bf0"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="ad836b1fe6c57ec07645d3a6db9c18bf0"></a>
+<tr class="separator:aadcc0a3cc20c7d83d271fff4b3b29f6c"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:aeccc625908484bc8a0ebcf2e6f2a7a20"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="aeccc625908484bc8a0ebcf2e6f2a7a20"></a>
 def </td><td class="memItemRight" valign="bottom"><b>processAlgorithm</b></td></tr>
-<tr class="separator:ad836b1fe6c57ec07645d3a6db9c18bf0"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="separator:aeccc625908484bc8a0ebcf2e6f2a7a20"><td class="memSeparator" colspan="2"> </td></tr>
 </table><table class="memberdecls">
 <tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pub-attribs"></a>
 Public Attributes</h2></td></tr>
-<tr class="memitem:a6cda59e12b5d35384148d3a9e50a380c"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a6cda59e12b5d35384148d3a9e50a380c"></a>
+<tr class="memitem:acf67738f3f769ecd8c908f883aaf585a"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="acf67738f3f769ecd8c908f883aaf585a"></a>
  </td><td class="memItemRight" valign="bottom"><b>name</b></td></tr>
-<tr class="separator:a6cda59e12b5d35384148d3a9e50a380c"><td class="memSeparator" colspan="2"> </td></tr>
-<tr class="memitem:a362a12d7bac87e1ef6bd3b0921893e4b"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a362a12d7bac87e1ef6bd3b0921893e4b"></a>
+<tr class="separator:acf67738f3f769ecd8c908f883aaf585a"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:a2b10663adca2f38835d50d6872e157ce"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a2b10663adca2f38835d50d6872e157ce"></a>
  </td><td class="memItemRight" valign="bottom"><b>group</b></td></tr>
-<tr class="separator:a362a12d7bac87e1ef6bd3b0921893e4b"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="separator:a2b10663adca2f38835d50d6872e157ce"><td class="memSeparator" colspan="2"> </td></tr>
 </table><table class="memberdecls">
 <tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pub-static-attribs"></a>
 Static Public Attributes</h2></td></tr>
-<tr class="memitem:ac63e9625819c3df9a3f210a44577de8d"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="ac63e9625819c3df9a3f210a44577de8d"></a>
+<tr class="memitem:ae1e46a26be886bacea781ad51b4410a8"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="ae1e46a26be886bacea781ad51b4410a8"></a>
 string </td><td class="memItemRight" valign="bottom"><b>INPUT</b> = "INPUT"</td></tr>
-<tr class="separator:ac63e9625819c3df9a3f210a44577de8d"><td class="memSeparator" colspan="2"> </td></tr>
-<tr class="memitem:af1b0b8b6543976e0436e35269673d135"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="af1b0b8b6543976e0436e35269673d135"></a>
+<tr class="separator:ae1e46a26be886bacea781ad51b4410a8"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:af8b963b1053b7cb062180301e101f6e8"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="af8b963b1053b7cb062180301e101f6e8"></a>
 string </td><td class="memItemRight" valign="bottom"><b>OUTPUT</b> = "OUTPUT"</td></tr>
-<tr class="separator:af1b0b8b6543976e0436e35269673d135"><td class="memSeparator" colspan="2"> </td></tr>
-<tr class="memitem:a36f24e3cf45c53076e40bf050690c9e4"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a36f24e3cf45c53076e40bf050690c9e4"></a>
+<tr class="separator:af8b963b1053b7cb062180301e101f6e8"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:ad307370f861c20fe353817b2ab0b8d30"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="ad307370f861c20fe353817b2ab0b8d30"></a>
 string </td><td class="memItemRight" valign="bottom"><b>DIM</b> = "DIM"</td></tr>
-<tr class="separator:a36f24e3cf45c53076e40bf050690c9e4"><td class="memSeparator" colspan="2"> </td></tr>
-<tr class="memitem:a93d222282debe7b1e835fe457e42668e"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a93d222282debe7b1e835fe457e42668e"></a>
+<tr class="separator:ad307370f861c20fe353817b2ab0b8d30"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:aabf2e76352764ec3bd9c181276da0022"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="aabf2e76352764ec3bd9c181276da0022"></a>
 string </td><td class="memItemRight" valign="bottom"><b>RTYPE</b> = 'RTYPE'</td></tr>
-<tr class="separator:a93d222282debe7b1e835fe457e42668e"><td class="memSeparator" colspan="2"> </td></tr>
-<tr class="memitem:a609a8357c611c1b7291714359d293205"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a609a8357c611c1b7291714359d293205"></a>
+<tr class="separator:aabf2e76352764ec3bd9c181276da0022"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:aa4a697381f67ada0cfdf81a7f103cfcb"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="aa4a697381f67ada0cfdf81a7f103cfcb"></a>
 list </td><td class="memItemRight" valign="bottom"><b>TYPE</b> = ['Float32','Byte','Int16','UInt16','UInt32','Int32','Float64','CInt16','CInt32','CFloat32','CFloat64']</td></tr>
-<tr class="separator:a609a8357c611c1b7291714359d293205"><td class="memSeparator" colspan="2"> </td></tr>
-<tr class="memitem:aa684f5dff3236fff634fd644507ead3f"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="aa684f5dff3236fff634fd644507ead3f"></a>
+<tr class="separator:aa4a697381f67ada0cfdf81a7f103cfcb"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:a638ece9d2b2398b40299138509bfb82b"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a638ece9d2b2398b40299138509bfb82b"></a>
 list </td><td class="memItemRight" valign="bottom"><b>FILTER_OPTIONS</b> = ["promorph"]</td></tr>
-<tr class="separator:aa684f5dff3236fff634fd644507ead3f"><td class="memSeparator" colspan="2"> </td></tr>
-<tr class="memitem:a231a73cc70938e1e8c0fbfe2ad354666"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a231a73cc70938e1e8c0fbfe2ad354666"></a>
+<tr class="separator:a638ece9d2b2398b40299138509bfb82b"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:a7f5103cdd44f324038b46d976a5b83fd"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a7f5103cdd44f324038b46d976a5b83fd"></a>
 string </td><td class="memItemRight" valign="bottom"><b>FILTER</b> = "FILTER"</td></tr>
-<tr class="separator:a231a73cc70938e1e8c0fbfe2ad354666"><td class="memSeparator" colspan="2"> </td></tr>
-<tr class="memitem:a8d539783f415aef729ad8eec26d1befc"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a8d539783f415aef729ad8eec26d1befc"></a>
+<tr class="separator:a7f5103cdd44f324038b46d976a5b83fd"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:a350392989faf79142d8005da7a13056b"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a350392989faf79142d8005da7a13056b"></a>
 string </td><td class="memItemRight" valign="bottom"><b>EXTRA</b> = 'EXTRA'</td></tr>
-<tr class="separator:a8d539783f415aef729ad8eec26d1befc"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="separator:a350392989faf79142d8005da7a13056b"><td class="memSeparator" colspan="2"> </td></tr>
 </table>
 <a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
 <div class="textblock">
-<p>Definition at line <a class="el" href="pkfilterdem_8py_source.html#l00039">39</a> of file <a class="el" href="pkfilterdem_8py_source.html">pkfilterdem.py</a>.</p>
+<p>Definition at line <a class="el" href="pktools_2pkfilterdem_8py_source.html#l00039">39</a> of file <a class="el" href="pktools_2pkfilterdem_8py_source.html">pkfilterdem.py</a>.</p>
 </div><hr/>The documentation for this class was generated from the following file:<ul>
-<li>/home/kempenep/pktools/qgis/<a class="el" href="pkfilterdem_8py_source.html">pkfilterdem.py</a></li>
+<li>/home/kempenep/pktools/qgis/pktools/<a class="el" href="pktools_2pkfilterdem_8py_source.html">pkfilterdem.py</a></li>
 </ul>
 </div><!-- contents -->
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Jun 23 2015 17:09:37 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/classqgis_1_1pktools_1_1pkfilterdem_1_1pkfilterdem__coll__graph.map b/doc/html/classqgis_1_1pktools_1_1pkfilterdem_1_1pkfilterdem__coll__graph.map
new file mode 100644
index 0000000..a56174d
--- /dev/null
+++ b/doc/html/classqgis_1_1pktools_1_1pkfilterdem_1_1pkfilterdem__coll__graph.map
@@ -0,0 +1,2 @@
+<map id="qgis.pktools.pkfilterdem.pkfilterdem" name="qgis.pktools.pkfilterdem.pkfilterdem">
+</map>
diff --git a/doc/html/classqgis_1_1pktools_1_1pkfilterdem_1_1pkfilterdem__coll__graph.md5 b/doc/html/classqgis_1_1pktools_1_1pkfilterdem_1_1pkfilterdem__coll__graph.md5
new file mode 100644
index 0000000..82bb3fe
--- /dev/null
+++ b/doc/html/classqgis_1_1pktools_1_1pkfilterdem_1_1pkfilterdem__coll__graph.md5
@@ -0,0 +1 @@
+cbf52a07ff8eed0ceac70d0be39a651e
\ No newline at end of file
diff --git a/doc/html/classqgis_1_1pktools_1_1pkfilterdem_1_1pkfilterdem__coll__graph.png b/doc/html/classqgis_1_1pktools_1_1pkfilterdem_1_1pkfilterdem__coll__graph.png
new file mode 100644
index 0000000..1a777a3
Binary files /dev/null and b/doc/html/classqgis_1_1pktools_1_1pkfilterdem_1_1pkfilterdem__coll__graph.png differ
diff --git a/doc/html/classqgis_1_1pktools_1_1pkfilterdem_1_1pkfilterdem__inherit__graph.map b/doc/html/classqgis_1_1pktools_1_1pkfilterdem_1_1pkfilterdem__inherit__graph.map
new file mode 100644
index 0000000..a56174d
--- /dev/null
+++ b/doc/html/classqgis_1_1pktools_1_1pkfilterdem_1_1pkfilterdem__inherit__graph.map
@@ -0,0 +1,2 @@
+<map id="qgis.pktools.pkfilterdem.pkfilterdem" name="qgis.pktools.pkfilterdem.pkfilterdem">
+</map>
diff --git a/doc/html/classqgis_1_1pktools_1_1pkfilterdem_1_1pkfilterdem__inherit__graph.md5 b/doc/html/classqgis_1_1pktools_1_1pkfilterdem_1_1pkfilterdem__inherit__graph.md5
new file mode 100644
index 0000000..82bb3fe
--- /dev/null
+++ b/doc/html/classqgis_1_1pktools_1_1pkfilterdem_1_1pkfilterdem__inherit__graph.md5
@@ -0,0 +1 @@
+cbf52a07ff8eed0ceac70d0be39a651e
\ No newline at end of file
diff --git a/doc/html/classqgis_1_1pktools_1_1pkfilterdem_1_1pkfilterdem__inherit__graph.png b/doc/html/classqgis_1_1pktools_1_1pkfilterdem_1_1pkfilterdem__inherit__graph.png
new file mode 100644
index 0000000..1a777a3
Binary files /dev/null and b/doc/html/classqgis_1_1pktools_1_1pkfilterdem_1_1pkfilterdem__inherit__graph.png differ
diff --git a/doc/html/classqgis_1_1pktools_1_1pkgetmask_1_1pkgetmask-members.html b/doc/html/classqgis_1_1pktools_1_1pkgetmask_1_1pkgetmask-members.html
new file mode 100644
index 0000000..fda90ab
--- /dev/null
+++ b/doc/html/classqgis_1_1pktools_1_1pkgetmask_1_1pkgetmask-members.html
@@ -0,0 +1,95 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.6"/>
+<title>pktools: Member List</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+  <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
+  <td style="padding-left: 0.5em;">
+   <div id="projectname">pktools
+    <span id="projectnumber">2.6.4</span>
+   </div>
+   <div id="projectbrief">Processing Kernel for geospatial data</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.6 -->
+  <div id="navrow1" class="tabs">
+    <ul class="tablist">
+      <li><a href="index.html"><span>Main Page</span></a></li>
+      <li><a href="pages.html"><span>Related Pages</span></a></li>
+      <li class="current"><a href="annotated.html"><span>Classes</span></a></li>
+      <li><a href="files.html"><span>Files</span></a></li>
+    </ul>
+  </div>
+  <div id="navrow2" class="tabs2">
+    <ul class="tablist">
+      <li><a href="annotated.html"><span>Class List</span></a></li>
+      <li><a href="classes.html"><span>Class Index</span></a></li>
+      <li><a href="inherits.html"><span>Class Hierarchy</span></a></li>
+      <li><a href="functions.html"><span>Class Members</span></a></li>
+    </ul>
+  </div>
+<div id="nav-path" class="navpath">
+  <ul>
+<li class="navelem"><b>qgis</b></li><li class="navelem"><b>pktools</b></li><li class="navelem"><b>pkgetmask</b></li><li class="navelem"><a class="el" href="classqgis_1_1pktools_1_1pkgetmask_1_1pkgetmask.html">pkgetmask</a></li>  </ul>
+</div>
+</div><!-- top -->
+<div class="header">
+  <div class="headertitle">
+<div class="title">qgis.pktools.pkgetmask.pkgetmask Member List</div>  </div>
+</div><!--header-->
+<div class="contents">
+
+<p>This is the complete list of members for <a class="el" href="classqgis_1_1pktools_1_1pkgetmask_1_1pkgetmask.html">qgis.pktools.pkgetmask.pkgetmask</a>, including all inherited members.</p>
+<table class="directory">
+  <tr bgcolor="#f0f0f0" class="even"><td class="entry"><b>BAND</b> (defined in <a class="el" href="classqgis_1_1pktools_1_1pkgetmask_1_1pkgetmask.html">qgis.pktools.pkgetmask.pkgetmask</a>)</td><td class="entry"><a class="el" href="classqgis_1_1pktools_1_1pkgetmask_1_1pkgetmask.html">qgis.pktools.pkgetmask.pkgetmask</a></td><td class="entry"><span class="mlabel">static</span></td></tr>
+  <tr bgcolor="#f0f0f0"><td class="entry"><b>cliName</b> (defined in <a class="el" href="classqgis_1_1pktools_1_1pkgetmask_1_1pkgetmask.html">qgis.pktools.pkgetmask.pkgetmask</a>)</td><td class="entry"><a class="el" href="classqgis_1_1pktools_1_1pkgetmask_1_1pkgetmask.html">qgis.pktools.pkgetmask.pkgetmask</a></td><td class="entry"></td></tr>
+  <tr bgcolor="#f0f0f0" class="even"><td class="entry"><b>DATA</b> (defined in <a class="el" href="classqgis_1_1pktools_1_1pkgetmask_1_1pkgetmask.html">qgis.pktools.pkgetmask.pkgetmask</a>)</td><td class="entry"><a class="el" href="classqgis_1_1pktools_1_1pkgetmask_1_1pkgetmask.html">qgis.pktools.pkgetmask.pkgetmask</a></td><td class="entry"><span class="mlabel">static</span></td></tr>
+  <tr bgcolor="#f0f0f0"><td class="entry"><b>defineCharacteristics</b> (defined in <a class="el" href="classqgis_1_1pktools_1_1pkgetmask_1_1pkgetmask.html">qgis.pktools.pkgetmask.pkgetmask</a>)</td><td class="entry"><a class="el" href="classqgis_1_1pktools_1_1pkgetmask_1_1pkgetmask.html">qgis.pktools.pkgetmask.pkgetmask</a></td><td class="entry"></td></tr>
+  <tr bgcolor="#f0f0f0" class="even"><td class="entry"><b>EXTRA</b> (defined in <a class="el" href="classqgis_1_1pktools_1_1pkgetmask_1_1pkgetmask.html">qgis.pktools.pkgetmask.pkgetmask</a>)</td><td class="entry"><a class="el" href="classqgis_1_1pktools_1_1pkgetmask_1_1pkgetmask.html">qgis.pktools.pkgetmask.pkgetmask</a></td><td class="entry"><span class="mlabel">static</span></td></tr>
+  <tr bgcolor="#f0f0f0"><td class="entry"><b>group</b> (defined in <a class="el" href="classqgis_1_1pktools_1_1pkgetmask_1_1pkgetmask.html">qgis.pktools.pkgetmask.pkgetmask</a>)</td><td class="entry"><a class="el" href="classqgis_1_1pktools_1_1pkgetmask_1_1pkgetmask.html">qgis.pktools.pkgetmask.pkgetmask</a></td><td class="entry"></td></tr>
+  <tr bgcolor="#f0f0f0" class="even"><td class="entry"><b>INPUT</b> (defined in <a class="el" href="classqgis_1_1pktools_1_1pkgetmask_1_1pkgetmask.html">qgis.pktools.pkgetmask.pkgetmask</a>)</td><td class="entry"><a class="el" href="classqgis_1_1pktools_1_1pkgetmask_1_1pkgetmask.html">qgis.pktools.pkgetmask.pkgetmask</a></td><td class="entry"><span class="mlabel">static</span></td></tr>
+  <tr bgcolor="#f0f0f0"><td class="entry"><b>MAX</b> (defined in <a class="el" href="classqgis_1_1pktools_1_1pkgetmask_1_1pkgetmask.html">qgis.pktools.pkgetmask.pkgetmask</a>)</td><td class="entry"><a class="el" href="classqgis_1_1pktools_1_1pkgetmask_1_1pkgetmask.html">qgis.pktools.pkgetmask.pkgetmask</a></td><td class="entry"><span class="mlabel">static</span></td></tr>
+  <tr bgcolor="#f0f0f0" class="even"><td class="entry"><b>MIN</b> (defined in <a class="el" href="classqgis_1_1pktools_1_1pkgetmask_1_1pkgetmask.html">qgis.pktools.pkgetmask.pkgetmask</a>)</td><td class="entry"><a class="el" href="classqgis_1_1pktools_1_1pkgetmask_1_1pkgetmask.html">qgis.pktools.pkgetmask.pkgetmask</a></td><td class="entry"><span class="mlabel">static</span></td></tr>
+  <tr bgcolor="#f0f0f0"><td class="entry"><b>name</b> (defined in <a class="el" href="classqgis_1_1pktools_1_1pkgetmask_1_1pkgetmask.html">qgis.pktools.pkgetmask.pkgetmask</a>)</td><td class="entry"><a class="el" href="classqgis_1_1pktools_1_1pkgetmask_1_1pkgetmask.html">qgis.pktools.pkgetmask.pkgetmask</a></td><td class="entry"></td></tr>
+  <tr bgcolor="#f0f0f0" class="even"><td class="entry"><b>NODATA</b> (defined in <a class="el" href="classqgis_1_1pktools_1_1pkgetmask_1_1pkgetmask.html">qgis.pktools.pkgetmask.pkgetmask</a>)</td><td class="entry"><a class="el" href="classqgis_1_1pktools_1_1pkgetmask_1_1pkgetmask.html">qgis.pktools.pkgetmask.pkgetmask</a></td><td class="entry"><span class="mlabel">static</span></td></tr>
+  <tr bgcolor="#f0f0f0"><td class="entry"><b>OPERATOR</b> (defined in <a class="el" href="classqgis_1_1pktools_1_1pkgetmask_1_1pkgetmask.html">qgis.pktools.pkgetmask.pkgetmask</a>)</td><td class="entry"><a class="el" href="classqgis_1_1pktools_1_1pkgetmask_1_1pkgetmask.html">qgis.pktools.pkgetmask.pkgetmask</a></td><td class="entry"><span class="mlabel">static</span></td></tr>
+  <tr bgcolor="#f0f0f0" class="even"><td class="entry"><b>OPERATOR_OPTIONS</b> (defined in <a class="el" href="classqgis_1_1pktools_1_1pkgetmask_1_1pkgetmask.html">qgis.pktools.pkgetmask.pkgetmask</a>)</td><td class="entry"><a class="el" href="classqgis_1_1pktools_1_1pkgetmask_1_1pkgetmask.html">qgis.pktools.pkgetmask.pkgetmask</a></td><td class="entry"><span class="mlabel">static</span></td></tr>
+  <tr bgcolor="#f0f0f0"><td class="entry"><b>OUTPUT</b> (defined in <a class="el" href="classqgis_1_1pktools_1_1pkgetmask_1_1pkgetmask.html">qgis.pktools.pkgetmask.pkgetmask</a>)</td><td class="entry"><a class="el" href="classqgis_1_1pktools_1_1pkgetmask_1_1pkgetmask.html">qgis.pktools.pkgetmask.pkgetmask</a></td><td class="entry"><span class="mlabel">static</span></td></tr>
+  <tr bgcolor="#f0f0f0" class="even"><td class="entry"><b>processAlgorithm</b> (defined in <a class="el" href="classqgis_1_1pktools_1_1pkgetmask_1_1pkgetmask.html">qgis.pktools.pkgetmask.pkgetmask</a>)</td><td class="entry"><a class="el" href="classqgis_1_1pktools_1_1pkgetmask_1_1pkgetmask.html">qgis.pktools.pkgetmask.pkgetmask</a></td><td class="entry"></td></tr>
+  <tr bgcolor="#f0f0f0"><td class="entry"><b>RTYPE</b> (defined in <a class="el" href="classqgis_1_1pktools_1_1pkgetmask_1_1pkgetmask.html">qgis.pktools.pkgetmask.pkgetmask</a>)</td><td class="entry"><a class="el" href="classqgis_1_1pktools_1_1pkgetmask_1_1pkgetmask.html">qgis.pktools.pkgetmask.pkgetmask</a></td><td class="entry"><span class="mlabel">static</span></td></tr>
+  <tr bgcolor="#f0f0f0" class="even"><td class="entry"><b>TYPE</b> (defined in <a class="el" href="classqgis_1_1pktools_1_1pkgetmask_1_1pkgetmask.html">qgis.pktools.pkgetmask.pkgetmask</a>)</td><td class="entry"><a class="el" href="classqgis_1_1pktools_1_1pkgetmask_1_1pkgetmask.html">qgis.pktools.pkgetmask.pkgetmask</a></td><td class="entry"><span class="mlabel">static</span></td></tr>
+</table></div><!-- contents -->
+<!-- HTML footer for doxygen 1.8.4-->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/>
+</a> 1.8.6
+</small></address>
+<script>
+  (function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
+  (i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
+  m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
+  })(window,document,'script','//www.google-analytics.com/analytics.js','ga');
+  ga('create', 'UA-46952639-1', 'nongnu.org');
+  ga('send', 'pageview');
+</script>
+</body>
+</html>
diff --git a/doc/html/classqgis_1_1pkgetmask_1_1pkgetmask.html b/doc/html/classqgis_1_1pktools_1_1pkgetmask_1_1pkgetmask.html
similarity index 63%
copy from doc/html/classqgis_1_1pkgetmask_1_1pkgetmask.html
copy to doc/html/classqgis_1_1pktools_1_1pkgetmask_1_1pkgetmask.html
index fe8ce80..5a1bc3f 100644
--- a/doc/html/classqgis_1_1pkgetmask_1_1pkgetmask.html
+++ b/doc/html/classqgis_1_1pktools_1_1pkgetmask_1_1pkgetmask.html
@@ -4,7 +4,7 @@
 <meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
 <meta http-equiv="X-UA-Compatible" content="IE=9"/>
 <meta name="generator" content="Doxygen 1.8.6"/>
-<title>pktools: qgis.pkgetmask.pkgetmask Class Reference</title>
+<title>pktools: qgis.pktools.pkgetmask.pkgetmask Class Reference</title>
 <link href="tabs.css" rel="stylesheet" type="text/css"/>
 <script type="text/javascript" src="jquery.js"></script>
 <script type="text/javascript" src="dynsections.js"></script>
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.3</span>
+    <span id="projectnumber">2.6.4</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -47,7 +47,7 @@
   </div>
 <div id="nav-path" class="navpath">
   <ul>
-<li class="navelem"><b>qgis</b></li><li class="navelem"><b>pkgetmask</b></li><li class="navelem"><a class="el" href="classqgis_1_1pkgetmask_1_1pkgetmask.html">pkgetmask</a></li>  </ul>
+<li class="navelem"><b>qgis</b></li><li class="navelem"><b>pktools</b></li><li class="navelem"><b>pkgetmask</b></li><li class="navelem"><a class="el" href="classqgis_1_1pktools_1_1pkgetmask_1_1pkgetmask.html">pkgetmask</a></li>  </ul>
 </div>
 </div><!-- top -->
 <div class="header">
@@ -55,93 +55,93 @@
 <a href="#pub-methods">Public Member Functions</a> |
 <a href="#pub-attribs">Public Attributes</a> |
 <a href="#pub-static-attribs">Static Public Attributes</a> |
-<a href="classqgis_1_1pkgetmask_1_1pkgetmask-members.html">List of all members</a>  </div>
+<a href="classqgis_1_1pktools_1_1pkgetmask_1_1pkgetmask-members.html">List of all members</a>  </div>
   <div class="headertitle">
-<div class="title">qgis.pkgetmask.pkgetmask Class Reference</div>  </div>
+<div class="title">qgis.pktools.pkgetmask.pkgetmask Class Reference</div>  </div>
 </div><!--header-->
 <div class="contents">
 <div class="dynheader">
-Inheritance diagram for qgis.pkgetmask.pkgetmask:</div>
+Inheritance diagram for qgis.pktools.pkgetmask.pkgetmask:</div>
 <div class="dyncontent">
-<div class="center"><img src="classqgis_1_1pkgetmask_1_1pkgetmask__inherit__graph.png" border="0" usemap="#qgis_8pkgetmask_8pkgetmask_inherit__map" alt="Inheritance graph"/></div>
+<div class="center"><img src="classqgis_1_1pktools_1_1pkgetmask_1_1pkgetmask__inherit__graph.png" border="0" usemap="#qgis_8pktools_8pkgetmask_8pkgetmask_inherit__map" alt="Inheritance graph"/></div>
 <center><span class="legend">[<a href="graph_legend.html">legend</a>]</span></center></div>
 <div class="dynheader">
-Collaboration diagram for qgis.pkgetmask.pkgetmask:</div>
+Collaboration diagram for qgis.pktools.pkgetmask.pkgetmask:</div>
 <div class="dyncontent">
-<div class="center"><img src="classqgis_1_1pkgetmask_1_1pkgetmask__coll__graph.png" border="0" usemap="#qgis_8pkgetmask_8pkgetmask_coll__map" alt="Collaboration graph"/></div>
+<div class="center"><img src="classqgis_1_1pktools_1_1pkgetmask_1_1pkgetmask__coll__graph.png" border="0" usemap="#qgis_8pktools_8pkgetmask_8pkgetmask_coll__map" alt="Collaboration graph"/></div>
 <center><span class="legend">[<a href="graph_legend.html">legend</a>]</span></center></div>
 <table class="memberdecls">
 <tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pub-methods"></a>
 Public Member Functions</h2></td></tr>
-<tr class="memitem:ae9c628f2f53021c654f6cf1a597b3c54"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="ae9c628f2f53021c654f6cf1a597b3c54"></a>
+<tr class="memitem:af8638a18a992135f0d2333599455da9d"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="af8638a18a992135f0d2333599455da9d"></a>
 def </td><td class="memItemRight" valign="bottom"><b>cliName</b></td></tr>
-<tr class="separator:ae9c628f2f53021c654f6cf1a597b3c54"><td class="memSeparator" colspan="2"> </td></tr>
-<tr class="memitem:a4d990f23726755e8310f9c6ba3be21a6"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a4d990f23726755e8310f9c6ba3be21a6"></a>
+<tr class="separator:af8638a18a992135f0d2333599455da9d"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:a9885f1bdf78dc1cf60b2698ca3dd5730"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a9885f1bdf78dc1cf60b2698ca3dd5730"></a>
 def </td><td class="memItemRight" valign="bottom"><b>defineCharacteristics</b></td></tr>
-<tr class="separator:a4d990f23726755e8310f9c6ba3be21a6"><td class="memSeparator" colspan="2"> </td></tr>
-<tr class="memitem:a6db8620a4e55fda9dfbda6e86b052666"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a6db8620a4e55fda9dfbda6e86b052666"></a>
+<tr class="separator:a9885f1bdf78dc1cf60b2698ca3dd5730"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:ac321f521ff5d628f18d3769c4e5953cd"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="ac321f521ff5d628f18d3769c4e5953cd"></a>
 def </td><td class="memItemRight" valign="bottom"><b>processAlgorithm</b></td></tr>
-<tr class="separator:a6db8620a4e55fda9dfbda6e86b052666"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="separator:ac321f521ff5d628f18d3769c4e5953cd"><td class="memSeparator" colspan="2"> </td></tr>
 </table><table class="memberdecls">
 <tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pub-attribs"></a>
 Public Attributes</h2></td></tr>
-<tr class="memitem:ab9a736f64545f8ac36bbf1eae8576cd5"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="ab9a736f64545f8ac36bbf1eae8576cd5"></a>
+<tr class="memitem:ac4229d79e7fdbcc320c34b70b4996c61"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="ac4229d79e7fdbcc320c34b70b4996c61"></a>
  </td><td class="memItemRight" valign="bottom"><b>name</b></td></tr>
-<tr class="separator:ab9a736f64545f8ac36bbf1eae8576cd5"><td class="memSeparator" colspan="2"> </td></tr>
-<tr class="memitem:aa0e0d197447b16bee323b2e9fdaa876b"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="aa0e0d197447b16bee323b2e9fdaa876b"></a>
+<tr class="separator:ac4229d79e7fdbcc320c34b70b4996c61"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:afe1f40dd307ff76950c2b7095fa51b2d"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="afe1f40dd307ff76950c2b7095fa51b2d"></a>
  </td><td class="memItemRight" valign="bottom"><b>group</b></td></tr>
-<tr class="separator:aa0e0d197447b16bee323b2e9fdaa876b"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="separator:afe1f40dd307ff76950c2b7095fa51b2d"><td class="memSeparator" colspan="2"> </td></tr>
 </table><table class="memberdecls">
 <tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pub-static-attribs"></a>
 Static Public Attributes</h2></td></tr>
-<tr class="memitem:a1990e1aab12f8a84394b7c44c9c78efd"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a1990e1aab12f8a84394b7c44c9c78efd"></a>
+<tr class="memitem:aaf2310f968ae6d6254816539b83b424b"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="aaf2310f968ae6d6254816539b83b424b"></a>
 string </td><td class="memItemRight" valign="bottom"><b>INPUT</b> = "INPUT"</td></tr>
-<tr class="separator:a1990e1aab12f8a84394b7c44c9c78efd"><td class="memSeparator" colspan="2"> </td></tr>
-<tr class="memitem:ad45ff2519baa645c8bf75e063fc2939d"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="ad45ff2519baa645c8bf75e063fc2939d"></a>
+<tr class="separator:aaf2310f968ae6d6254816539b83b424b"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:a4b3b39185a49678924fa180770112465"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a4b3b39185a49678924fa180770112465"></a>
 string </td><td class="memItemRight" valign="bottom"><b>BAND</b> = "BAND"</td></tr>
-<tr class="separator:ad45ff2519baa645c8bf75e063fc2939d"><td class="memSeparator" colspan="2"> </td></tr>
-<tr class="memitem:a86f16ca18fe18083446f0a2fdab1c989"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a86f16ca18fe18083446f0a2fdab1c989"></a>
+<tr class="separator:a4b3b39185a49678924fa180770112465"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:accd8fb321226d11fb68b2564297d3b13"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="accd8fb321226d11fb68b2564297d3b13"></a>
 string </td><td class="memItemRight" valign="bottom"><b>MIN</b> = "MIN"</td></tr>
-<tr class="separator:a86f16ca18fe18083446f0a2fdab1c989"><td class="memSeparator" colspan="2"> </td></tr>
-<tr class="memitem:a74d4d91d62405ae1cb788e0fc52b64c6"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a74d4d91d62405ae1cb788e0fc52b64c6"></a>
+<tr class="separator:accd8fb321226d11fb68b2564297d3b13"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:a89fc80dd3cf449b57ee883116ea2b4a7"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a89fc80dd3cf449b57ee883116ea2b4a7"></a>
 string </td><td class="memItemRight" valign="bottom"><b>MAX</b> = "MAX"</td></tr>
-<tr class="separator:a74d4d91d62405ae1cb788e0fc52b64c6"><td class="memSeparator" colspan="2"> </td></tr>
-<tr class="memitem:a418e9d844d597fb600d16afc0b7e70cd"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a418e9d844d597fb600d16afc0b7e70cd"></a>
+<tr class="separator:a89fc80dd3cf449b57ee883116ea2b4a7"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:a8e2b218c2424a51cbc4a93fe83d07c04"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a8e2b218c2424a51cbc4a93fe83d07c04"></a>
 list </td><td class="memItemRight" valign="bottom"><b>OPERATOR_OPTIONS</b> = ["OR", "AND"]</td></tr>
-<tr class="separator:a418e9d844d597fb600d16afc0b7e70cd"><td class="memSeparator" colspan="2"> </td></tr>
-<tr class="memitem:a2a1d0302fefa56238c42d3ea6f747941"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a2a1d0302fefa56238c42d3ea6f747941"></a>
+<tr class="separator:a8e2b218c2424a51cbc4a93fe83d07c04"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:af34e465611d97efa0f38d938c61391d6"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="af34e465611d97efa0f38d938c61391d6"></a>
 string </td><td class="memItemRight" valign="bottom"><b>OPERATOR</b> = "OPERATOR"</td></tr>
-<tr class="separator:a2a1d0302fefa56238c42d3ea6f747941"><td class="memSeparator" colspan="2"> </td></tr>
-<tr class="memitem:a579e059d072a57554c9a61180a9fd08c"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a579e059d072a57554c9a61180a9fd08c"></a>
+<tr class="separator:af34e465611d97efa0f38d938c61391d6"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:a70f3dbf7f080106837a8b17c006d81ac"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a70f3dbf7f080106837a8b17c006d81ac"></a>
 string </td><td class="memItemRight" valign="bottom"><b>DATA</b> = "DATA"</td></tr>
-<tr class="separator:a579e059d072a57554c9a61180a9fd08c"><td class="memSeparator" colspan="2"> </td></tr>
-<tr class="memitem:ab851d0b2d6acf47df89a9d89373f804b"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="ab851d0b2d6acf47df89a9d89373f804b"></a>
+<tr class="separator:a70f3dbf7f080106837a8b17c006d81ac"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:af966197d692f8351d058f374fbc5179c"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="af966197d692f8351d058f374fbc5179c"></a>
 string </td><td class="memItemRight" valign="bottom"><b>NODATA</b> = "NODATA"</td></tr>
-<tr class="separator:ab851d0b2d6acf47df89a9d89373f804b"><td class="memSeparator" colspan="2"> </td></tr>
-<tr class="memitem:a5eedd82f4dda4923e8560ff43b657f73"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a5eedd82f4dda4923e8560ff43b657f73"></a>
+<tr class="separator:af966197d692f8351d058f374fbc5179c"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:a9923121c7323d34231111da4876b6ae1"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a9923121c7323d34231111da4876b6ae1"></a>
 string </td><td class="memItemRight" valign="bottom"><b>OUTPUT</b> = "OUTPUT"</td></tr>
-<tr class="separator:a5eedd82f4dda4923e8560ff43b657f73"><td class="memSeparator" colspan="2"> </td></tr>
-<tr class="memitem:a091f5ee5165bde746ed9841909d06d5c"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a091f5ee5165bde746ed9841909d06d5c"></a>
+<tr class="separator:a9923121c7323d34231111da4876b6ae1"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:ac7313cff3a0c24fab4a0c93b49a46ed8"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="ac7313cff3a0c24fab4a0c93b49a46ed8"></a>
 string </td><td class="memItemRight" valign="bottom"><b>RTYPE</b> = 'RTYPE'</td></tr>
-<tr class="separator:a091f5ee5165bde746ed9841909d06d5c"><td class="memSeparator" colspan="2"> </td></tr>
-<tr class="memitem:a7f1272eeb8cf07f429440cdf387c2d17"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a7f1272eeb8cf07f429440cdf387c2d17"></a>
+<tr class="separator:ac7313cff3a0c24fab4a0c93b49a46ed8"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:a5d4080e59895fdae293320e363dbfa03"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a5d4080e59895fdae293320e363dbfa03"></a>
 list </td><td class="memItemRight" valign="bottom"><b>TYPE</b> = ['none', 'Byte','Int16','UInt16','UInt32','Int32','Float32','Float64','CInt16','CInt32','CFloat32','CFloat64']</td></tr>
-<tr class="separator:a7f1272eeb8cf07f429440cdf387c2d17"><td class="memSeparator" colspan="2"> </td></tr>
-<tr class="memitem:a7c46da38f871a5211efe90216afff4ef"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a7c46da38f871a5211efe90216afff4ef"></a>
+<tr class="separator:a5d4080e59895fdae293320e363dbfa03"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:a67fb04dae201f7eeacd2c1c15ea8a68b"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a67fb04dae201f7eeacd2c1c15ea8a68b"></a>
 string </td><td class="memItemRight" valign="bottom"><b>EXTRA</b> = 'EXTRA'</td></tr>
-<tr class="separator:a7c46da38f871a5211efe90216afff4ef"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="separator:a67fb04dae201f7eeacd2c1c15ea8a68b"><td class="memSeparator" colspan="2"> </td></tr>
 </table>
 <a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
 <div class="textblock">
-<p>Definition at line <a class="el" href="pkgetmask_8py_source.html#l00038">38</a> of file <a class="el" href="pkgetmask_8py_source.html">pkgetmask.py</a>.</p>
+<p>Definition at line <a class="el" href="pktools_2pkgetmask_8py_source.html#l00038">38</a> of file <a class="el" href="pktools_2pkgetmask_8py_source.html">pkgetmask.py</a>.</p>
 </div><hr/>The documentation for this class was generated from the following file:<ul>
-<li>/home/kempenep/pktools/qgis/<a class="el" href="pkgetmask_8py_source.html">pkgetmask.py</a></li>
+<li>/home/kempenep/pktools/qgis/pktools/<a class="el" href="pktools_2pkgetmask_8py_source.html">pkgetmask.py</a></li>
 </ul>
 </div><!-- contents -->
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Jun 23 2015 17:09:37 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/classqgis_1_1pktools_1_1pkgetmask_1_1pkgetmask__coll__graph.map b/doc/html/classqgis_1_1pktools_1_1pkgetmask_1_1pkgetmask__coll__graph.map
new file mode 100644
index 0000000..04427f3
--- /dev/null
+++ b/doc/html/classqgis_1_1pktools_1_1pkgetmask_1_1pkgetmask__coll__graph.map
@@ -0,0 +1,2 @@
+<map id="qgis.pktools.pkgetmask.pkgetmask" name="qgis.pktools.pkgetmask.pkgetmask">
+</map>
diff --git a/doc/html/classqgis_1_1pktools_1_1pkgetmask_1_1pkgetmask__coll__graph.md5 b/doc/html/classqgis_1_1pktools_1_1pkgetmask_1_1pkgetmask__coll__graph.md5
new file mode 100644
index 0000000..65aa0ff
--- /dev/null
+++ b/doc/html/classqgis_1_1pktools_1_1pkgetmask_1_1pkgetmask__coll__graph.md5
@@ -0,0 +1 @@
+49725e4acafdaf74f1676a3e738250f2
\ No newline at end of file
diff --git a/doc/html/classqgis_1_1pktools_1_1pkgetmask_1_1pkgetmask__coll__graph.png b/doc/html/classqgis_1_1pktools_1_1pkgetmask_1_1pkgetmask__coll__graph.png
new file mode 100644
index 0000000..e299553
Binary files /dev/null and b/doc/html/classqgis_1_1pktools_1_1pkgetmask_1_1pkgetmask__coll__graph.png differ
diff --git a/doc/html/classqgis_1_1pktools_1_1pkgetmask_1_1pkgetmask__inherit__graph.map b/doc/html/classqgis_1_1pktools_1_1pkgetmask_1_1pkgetmask__inherit__graph.map
new file mode 100644
index 0000000..04427f3
--- /dev/null
+++ b/doc/html/classqgis_1_1pktools_1_1pkgetmask_1_1pkgetmask__inherit__graph.map
@@ -0,0 +1,2 @@
+<map id="qgis.pktools.pkgetmask.pkgetmask" name="qgis.pktools.pkgetmask.pkgetmask">
+</map>
diff --git a/doc/html/classqgis_1_1pktools_1_1pkgetmask_1_1pkgetmask__inherit__graph.md5 b/doc/html/classqgis_1_1pktools_1_1pkgetmask_1_1pkgetmask__inherit__graph.md5
new file mode 100644
index 0000000..65aa0ff
--- /dev/null
+++ b/doc/html/classqgis_1_1pktools_1_1pkgetmask_1_1pkgetmask__inherit__graph.md5
@@ -0,0 +1 @@
+49725e4acafdaf74f1676a3e738250f2
\ No newline at end of file
diff --git a/doc/html/classqgis_1_1pktools_1_1pkgetmask_1_1pkgetmask__inherit__graph.png b/doc/html/classqgis_1_1pktools_1_1pkgetmask_1_1pkgetmask__inherit__graph.png
new file mode 100644
index 0000000..e299553
Binary files /dev/null and b/doc/html/classqgis_1_1pktools_1_1pkgetmask_1_1pkgetmask__inherit__graph.png differ
diff --git a/doc/html/classqgis_1_1pktools_1_1pklas2img_1_1pklas2img-members.html b/doc/html/classqgis_1_1pktools_1_1pklas2img_1_1pklas2img-members.html
new file mode 100644
index 0000000..784f906
--- /dev/null
+++ b/doc/html/classqgis_1_1pktools_1_1pklas2img_1_1pklas2img-members.html
@@ -0,0 +1,98 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.6"/>
+<title>pktools: Member List</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+  <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
+  <td style="padding-left: 0.5em;">
+   <div id="projectname">pktools
+    <span id="projectnumber">2.6.4</span>
+   </div>
+   <div id="projectbrief">Processing Kernel for geospatial data</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.6 -->
+  <div id="navrow1" class="tabs">
+    <ul class="tablist">
+      <li><a href="index.html"><span>Main Page</span></a></li>
+      <li><a href="pages.html"><span>Related Pages</span></a></li>
+      <li class="current"><a href="annotated.html"><span>Classes</span></a></li>
+      <li><a href="files.html"><span>Files</span></a></li>
+    </ul>
+  </div>
+  <div id="navrow2" class="tabs2">
+    <ul class="tablist">
+      <li><a href="annotated.html"><span>Class List</span></a></li>
+      <li><a href="classes.html"><span>Class Index</span></a></li>
+      <li><a href="inherits.html"><span>Class Hierarchy</span></a></li>
+      <li><a href="functions.html"><span>Class Members</span></a></li>
+    </ul>
+  </div>
+<div id="nav-path" class="navpath">
+  <ul>
+<li class="navelem"><b>qgis</b></li><li class="navelem"><b>pktools</b></li><li class="navelem"><b>pklas2img</b></li><li class="navelem"><a class="el" href="classqgis_1_1pktools_1_1pklas2img_1_1pklas2img.html">pklas2img</a></li>  </ul>
+</div>
+</div><!-- top -->
+<div class="header">
+  <div class="headertitle">
+<div class="title">qgis.pktools.pklas2img.pklas2img Member List</div>  </div>
+</div><!--header-->
+<div class="contents">
+
+<p>This is the complete list of members for <a class="el" href="classqgis_1_1pktools_1_1pklas2img_1_1pklas2img.html">qgis.pktools.pklas2img.pklas2img</a>, including all inherited members.</p>
+<table class="directory">
+  <tr bgcolor="#f0f0f0" class="even"><td class="entry"><b>ATTRIBUTE</b> (defined in <a class="el" href="classqgis_1_1pktools_1_1pklas2img_1_1pklas2img.html">qgis.pktools.pklas2img.pklas2img</a>)</td><td class="entry"><a class="el" href="classqgis_1_1pktools_1_1pklas2img_1_1pklas2img.html">qgis.pktools.pklas2img.pklas2img</a></td><td class="entry"><span class="mlabel">static</span></td></tr>
+  <tr bgcolor="#f0f0f0"><td class="entry"><b>ATTRIBUTE_OPTIONS</b> (defined in <a class="el" href="classqgis_1_1pktools_1_1pklas2img_1_1pklas2img.html">qgis.pktools.pklas2img.pklas2img</a>)</td><td class="entry"><a class="el" href="classqgis_1_1pktools_1_1pklas2img_1_1pklas2img.html">qgis.pktools.pklas2img.pklas2img</a></td><td class="entry"><span class="mlabel">static</span></td></tr>
+  <tr bgcolor="#f0f0f0" class="even"><td class="entry"><b>cliName</b> (defined in <a class="el" href="classqgis_1_1pktools_1_1pklas2img_1_1pklas2img.html">qgis.pktools.pklas2img.pklas2img</a>)</td><td class="entry"><a class="el" href="classqgis_1_1pktools_1_1pklas2img_1_1pklas2img.html">qgis.pktools.pklas2img.pklas2img</a></td><td class="entry"></td></tr>
+  <tr bgcolor="#f0f0f0"><td class="entry"><b>COMPOSITE</b> (defined in <a class="el" href="classqgis_1_1pktools_1_1pklas2img_1_1pklas2img.html">qgis.pktools.pklas2img.pklas2img</a>)</td><td class="entry"><a class="el" href="classqgis_1_1pktools_1_1pklas2img_1_1pklas2img.html">qgis.pktools.pklas2img.pklas2img</a></td><td class="entry"><span class="mlabel">static</span></td></tr>
+  <tr bgcolor="#f0f0f0" class="even"><td class="entry"><b>COMPOSITE_OPTIONS</b> (defined in <a class="el" href="classqgis_1_1pktools_1_1pklas2img_1_1pklas2img.html">qgis.pktools.pklas2img.pklas2img</a>)</td><td class="entry"><a class="el" href="classqgis_1_1pktools_1_1pklas2img_1_1pklas2img.html">qgis.pktools.pklas2img.pklas2img</a></td><td class="entry"><span class="mlabel">static</span></td></tr>
+  <tr bgcolor="#f0f0f0"><td class="entry"><b>defineCharacteristics</b> (defined in <a class="el" href="classqgis_1_1pktools_1_1pklas2img_1_1pklas2img.html">qgis.pktools.pklas2img.pklas2img</a>)</td><td class="entry"><a class="el" href="classqgis_1_1pktools_1_1pklas2img_1_1pklas2img.html">qgis.pktools.pklas2img.pklas2img</a></td><td class="entry"></td></tr>
+  <tr bgcolor="#f0f0f0" class="even"><td class="entry"><b>DX</b> (defined in <a class="el" href="classqgis_1_1pktools_1_1pklas2img_1_1pklas2img.html">qgis.pktools.pklas2img.pklas2img</a>)</td><td class="entry"><a class="el" href="classqgis_1_1pktools_1_1pklas2img_1_1pklas2img.html">qgis.pktools.pklas2img.pklas2img</a></td><td class="entry"><span class="mlabel">static</span></td></tr>
+  <tr bgcolor="#f0f0f0"><td class="entry"><b>DY</b> (defined in <a class="el" href="classqgis_1_1pktools_1_1pklas2img_1_1pklas2img.html">qgis.pktools.pklas2img.pklas2img</a>)</td><td class="entry"><a class="el" href="classqgis_1_1pktools_1_1pklas2img_1_1pklas2img.html">qgis.pktools.pklas2img.pklas2img</a></td><td class="entry"><span class="mlabel">static</span></td></tr>
+  <tr bgcolor="#f0f0f0" class="even"><td class="entry"><b>EXTRA</b> (defined in <a class="el" href="classqgis_1_1pktools_1_1pklas2img_1_1pklas2img.html">qgis.pktools.pklas2img.pklas2img</a>)</td><td class="entry"><a class="el" href="classqgis_1_1pktools_1_1pklas2img_1_1pklas2img.html">qgis.pktools.pklas2img.pklas2img</a></td><td class="entry"><span class="mlabel">static</span></td></tr>
+  <tr bgcolor="#f0f0f0"><td class="entry"><b>FILTER</b> (defined in <a class="el" href="classqgis_1_1pktools_1_1pklas2img_1_1pklas2img.html">qgis.pktools.pklas2img.pklas2img</a>)</td><td class="entry"><a class="el" href="classqgis_1_1pktools_1_1pklas2img_1_1pklas2img.html">qgis.pktools.pklas2img.pklas2img</a></td><td class="entry"><span class="mlabel">static</span></td></tr>
+  <tr bgcolor="#f0f0f0" class="even"><td class="entry"><b>FILTER_OPTIONS</b> (defined in <a class="el" href="classqgis_1_1pktools_1_1pklas2img_1_1pklas2img.html">qgis.pktools.pklas2img.pklas2img</a>)</td><td class="entry"><a class="el" href="classqgis_1_1pktools_1_1pklas2img_1_1pklas2img.html">qgis.pktools.pklas2img.pklas2img</a></td><td class="entry"><span class="mlabel">static</span></td></tr>
+  <tr bgcolor="#f0f0f0"><td class="entry"><b>group</b> (defined in <a class="el" href="classqgis_1_1pktools_1_1pklas2img_1_1pklas2img.html">qgis.pktools.pklas2img.pklas2img</a>)</td><td class="entry"><a class="el" href="classqgis_1_1pktools_1_1pklas2img_1_1pklas2img.html">qgis.pktools.pklas2img.pklas2img</a></td><td class="entry"></td></tr>
+  <tr bgcolor="#f0f0f0" class="even"><td class="entry"><b>INPUT</b> (defined in <a class="el" href="classqgis_1_1pktools_1_1pklas2img_1_1pklas2img.html">qgis.pktools.pklas2img.pklas2img</a>)</td><td class="entry"><a class="el" href="classqgis_1_1pktools_1_1pklas2img_1_1pklas2img.html">qgis.pktools.pklas2img.pklas2img</a></td><td class="entry"><span class="mlabel">static</span></td></tr>
+  <tr bgcolor="#f0f0f0"><td class="entry"><b>name</b> (defined in <a class="el" href="classqgis_1_1pktools_1_1pklas2img_1_1pklas2img.html">qgis.pktools.pklas2img.pklas2img</a>)</td><td class="entry"><a class="el" href="classqgis_1_1pktools_1_1pklas2img_1_1pklas2img.html">qgis.pktools.pklas2img.pklas2img</a></td><td class="entry"></td></tr>
+  <tr bgcolor="#f0f0f0" class="even"><td class="entry"><b>NODATA</b> (defined in <a class="el" href="classqgis_1_1pktools_1_1pklas2img_1_1pklas2img.html">qgis.pktools.pklas2img.pklas2img</a>)</td><td class="entry"><a class="el" href="classqgis_1_1pktools_1_1pklas2img_1_1pklas2img.html">qgis.pktools.pklas2img.pklas2img</a></td><td class="entry"><span class="mlabel">static</span></td></tr>
+  <tr bgcolor="#f0f0f0"><td class="entry"><b>OUTPUT</b> (defined in <a class="el" href="classqgis_1_1pktools_1_1pklas2img_1_1pklas2img.html">qgis.pktools.pklas2img.pklas2img</a>)</td><td class="entry"><a class="el" href="classqgis_1_1pktools_1_1pklas2img_1_1pklas2img.html">qgis.pktools.pklas2img.pklas2img</a></td><td class="entry"><span class="mlabel">static</span></td></tr>
+  <tr bgcolor="#f0f0f0" class="even"><td class="entry"><b>PERCENTILE</b> (defined in <a class="el" href="classqgis_1_1pktools_1_1pklas2img_1_1pklas2img.html">qgis.pktools.pklas2img.pklas2img</a>)</td><td class="entry"><a class="el" href="classqgis_1_1pktools_1_1pklas2img_1_1pklas2img.html">qgis.pktools.pklas2img.pklas2img</a></td><td class="entry"><span class="mlabel">static</span></td></tr>
+  <tr bgcolor="#f0f0f0"><td class="entry"><b>processAlgorithm</b> (defined in <a class="el" href="classqgis_1_1pktools_1_1pklas2img_1_1pklas2img.html">qgis.pktools.pklas2img.pklas2img</a>)</td><td class="entry"><a class="el" href="classqgis_1_1pktools_1_1pklas2img_1_1pklas2img.html">qgis.pktools.pklas2img.pklas2img</a></td><td class="entry"></td></tr>
+  <tr bgcolor="#f0f0f0" class="even"><td class="entry"><b>RTYPE</b> (defined in <a class="el" href="classqgis_1_1pktools_1_1pklas2img_1_1pklas2img.html">qgis.pktools.pklas2img.pklas2img</a>)</td><td class="entry"><a class="el" href="classqgis_1_1pktools_1_1pklas2img_1_1pklas2img.html">qgis.pktools.pklas2img.pklas2img</a></td><td class="entry"><span class="mlabel">static</span></td></tr>
+  <tr bgcolor="#f0f0f0"><td class="entry"><b>TYPE</b> (defined in <a class="el" href="classqgis_1_1pktools_1_1pklas2img_1_1pklas2img.html">qgis.pktools.pklas2img.pklas2img</a>)</td><td class="entry"><a class="el" href="classqgis_1_1pktools_1_1pklas2img_1_1pklas2img.html">qgis.pktools.pklas2img.pklas2img</a></td><td class="entry"><span class="mlabel">static</span></td></tr>
+</table></div><!-- contents -->
+<!-- HTML footer for doxygen 1.8.4-->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/>
+</a> 1.8.6
+</small></address>
+<script>
+  (function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
+  (i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
+  m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
+  })(window,document,'script','//www.google-analytics.com/analytics.js','ga');
+  ga('create', 'UA-46952639-1', 'nongnu.org');
+  ga('send', 'pageview');
+</script>
+</body>
+</html>
diff --git a/doc/html/classqgis_1_1pklas2img_1_1pklas2img.html b/doc/html/classqgis_1_1pktools_1_1pklas2img_1_1pklas2img.html
similarity index 63%
copy from doc/html/classqgis_1_1pklas2img_1_1pklas2img.html
copy to doc/html/classqgis_1_1pktools_1_1pklas2img_1_1pklas2img.html
index 841b8f2..20b613b 100644
--- a/doc/html/classqgis_1_1pklas2img_1_1pklas2img.html
+++ b/doc/html/classqgis_1_1pktools_1_1pklas2img_1_1pklas2img.html
@@ -4,7 +4,7 @@
 <meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
 <meta http-equiv="X-UA-Compatible" content="IE=9"/>
 <meta name="generator" content="Doxygen 1.8.6"/>
-<title>pktools: qgis.pklas2img.pklas2img Class Reference</title>
+<title>pktools: qgis.pktools.pklas2img.pklas2img Class Reference</title>
 <link href="tabs.css" rel="stylesheet" type="text/css"/>
 <script type="text/javascript" src="jquery.js"></script>
 <script type="text/javascript" src="dynsections.js"></script>
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.3</span>
+    <span id="projectnumber">2.6.4</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -47,7 +47,7 @@
   </div>
 <div id="nav-path" class="navpath">
   <ul>
-<li class="navelem"><b>qgis</b></li><li class="navelem"><b>pklas2img</b></li><li class="navelem"><a class="el" href="classqgis_1_1pklas2img_1_1pklas2img.html">pklas2img</a></li>  </ul>
+<li class="navelem"><b>qgis</b></li><li class="navelem"><b>pktools</b></li><li class="navelem"><b>pklas2img</b></li><li class="navelem"><a class="el" href="classqgis_1_1pktools_1_1pklas2img_1_1pklas2img.html">pklas2img</a></li>  </ul>
 </div>
 </div><!-- top -->
 <div class="header">
@@ -55,102 +55,102 @@
 <a href="#pub-methods">Public Member Functions</a> |
 <a href="#pub-attribs">Public Attributes</a> |
 <a href="#pub-static-attribs">Static Public Attributes</a> |
-<a href="classqgis_1_1pklas2img_1_1pklas2img-members.html">List of all members</a>  </div>
+<a href="classqgis_1_1pktools_1_1pklas2img_1_1pklas2img-members.html">List of all members</a>  </div>
   <div class="headertitle">
-<div class="title">qgis.pklas2img.pklas2img Class Reference</div>  </div>
+<div class="title">qgis.pktools.pklas2img.pklas2img Class Reference</div>  </div>
 </div><!--header-->
 <div class="contents">
 <div class="dynheader">
-Inheritance diagram for qgis.pklas2img.pklas2img:</div>
+Inheritance diagram for qgis.pktools.pklas2img.pklas2img:</div>
 <div class="dyncontent">
-<div class="center"><img src="classqgis_1_1pklas2img_1_1pklas2img__inherit__graph.png" border="0" usemap="#qgis_8pklas2img_8pklas2img_inherit__map" alt="Inheritance graph"/></div>
+<div class="center"><img src="classqgis_1_1pktools_1_1pklas2img_1_1pklas2img__inherit__graph.png" border="0" usemap="#qgis_8pktools_8pklas2img_8pklas2img_inherit__map" alt="Inheritance graph"/></div>
 <center><span class="legend">[<a href="graph_legend.html">legend</a>]</span></center></div>
 <div class="dynheader">
-Collaboration diagram for qgis.pklas2img.pklas2img:</div>
+Collaboration diagram for qgis.pktools.pklas2img.pklas2img:</div>
 <div class="dyncontent">
-<div class="center"><img src="classqgis_1_1pklas2img_1_1pklas2img__coll__graph.png" border="0" usemap="#qgis_8pklas2img_8pklas2img_coll__map" alt="Collaboration graph"/></div>
+<div class="center"><img src="classqgis_1_1pktools_1_1pklas2img_1_1pklas2img__coll__graph.png" border="0" usemap="#qgis_8pktools_8pklas2img_8pklas2img_coll__map" alt="Collaboration graph"/></div>
 <center><span class="legend">[<a href="graph_legend.html">legend</a>]</span></center></div>
 <table class="memberdecls">
 <tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pub-methods"></a>
 Public Member Functions</h2></td></tr>
-<tr class="memitem:a32b88cd9bfc7602df94418d953cc44a7"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a32b88cd9bfc7602df94418d953cc44a7"></a>
+<tr class="memitem:a341f95eb3efccf5c63b40c2aaf5b84d9"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a341f95eb3efccf5c63b40c2aaf5b84d9"></a>
 def </td><td class="memItemRight" valign="bottom"><b>cliName</b></td></tr>
-<tr class="separator:a32b88cd9bfc7602df94418d953cc44a7"><td class="memSeparator" colspan="2"> </td></tr>
-<tr class="memitem:a9d29035252b68c6d64910c363743357c"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a9d29035252b68c6d64910c363743357c"></a>
+<tr class="separator:a341f95eb3efccf5c63b40c2aaf5b84d9"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:a61418ad48dd382af34a30b773bea7cf9"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a61418ad48dd382af34a30b773bea7cf9"></a>
 def </td><td class="memItemRight" valign="bottom"><b>defineCharacteristics</b></td></tr>
-<tr class="separator:a9d29035252b68c6d64910c363743357c"><td class="memSeparator" colspan="2"> </td></tr>
-<tr class="memitem:adae08f5a8a287a1584d18aed0a0d994d"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="adae08f5a8a287a1584d18aed0a0d994d"></a>
+<tr class="separator:a61418ad48dd382af34a30b773bea7cf9"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:aceb7c72250e537a43b5806ee109f7774"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="aceb7c72250e537a43b5806ee109f7774"></a>
 def </td><td class="memItemRight" valign="bottom"><b>processAlgorithm</b></td></tr>
-<tr class="separator:adae08f5a8a287a1584d18aed0a0d994d"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="separator:aceb7c72250e537a43b5806ee109f7774"><td class="memSeparator" colspan="2"> </td></tr>
 </table><table class="memberdecls">
 <tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pub-attribs"></a>
 Public Attributes</h2></td></tr>
-<tr class="memitem:aa41f6aa59efd28521fd49a8f2740917d"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="aa41f6aa59efd28521fd49a8f2740917d"></a>
+<tr class="memitem:accc880de7d62d73a9a3c5b34d2c1205a"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="accc880de7d62d73a9a3c5b34d2c1205a"></a>
  </td><td class="memItemRight" valign="bottom"><b>name</b></td></tr>
-<tr class="separator:aa41f6aa59efd28521fd49a8f2740917d"><td class="memSeparator" colspan="2"> </td></tr>
-<tr class="memitem:a5504eac2d342bdae408e9ce3d51a6a6a"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a5504eac2d342bdae408e9ce3d51a6a6a"></a>
+<tr class="separator:accc880de7d62d73a9a3c5b34d2c1205a"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:ae424f891aaec9acfd3d85259f0b5ebca"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="ae424f891aaec9acfd3d85259f0b5ebca"></a>
  </td><td class="memItemRight" valign="bottom"><b>group</b></td></tr>
-<tr class="separator:a5504eac2d342bdae408e9ce3d51a6a6a"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="separator:ae424f891aaec9acfd3d85259f0b5ebca"><td class="memSeparator" colspan="2"> </td></tr>
 </table><table class="memberdecls">
 <tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pub-static-attribs"></a>
 Static Public Attributes</h2></td></tr>
-<tr class="memitem:a7b57ce9958d387ac60e2564b468c9121"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a7b57ce9958d387ac60e2564b468c9121"></a>
+<tr class="memitem:ac7de684f0362601c5bf667db9b68763a"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="ac7de684f0362601c5bf667db9b68763a"></a>
 string </td><td class="memItemRight" valign="bottom"><b>INPUT</b> = "INPUT"</td></tr>
-<tr class="separator:a7b57ce9958d387ac60e2564b468c9121"><td class="memSeparator" colspan="2"> </td></tr>
-<tr class="memitem:a6b94eb994fa787dc2a90c4df618b7192"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a6b94eb994fa787dc2a90c4df618b7192"></a>
+<tr class="separator:ac7de684f0362601c5bf667db9b68763a"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:aa923079e3e31c6f9045fc26402066b28"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="aa923079e3e31c6f9045fc26402066b28"></a>
 string </td><td class="memItemRight" valign="bottom"><b>OUTPUT</b> = "OUTPUT"</td></tr>
-<tr class="separator:a6b94eb994fa787dc2a90c4df618b7192"><td class="memSeparator" colspan="2"> </td></tr>
-<tr class="memitem:a0409e973a7b8cdf6057c607a998354a5"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a0409e973a7b8cdf6057c607a998354a5"></a>
+<tr class="separator:aa923079e3e31c6f9045fc26402066b28"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:afe4c444f4c7f89fd2851e4517c66e82d"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="afe4c444f4c7f89fd2851e4517c66e82d"></a>
 list </td><td class="memItemRight" valign="bottom"><b>ATTRIBUTE_OPTIONS</b> = ["z","intensity", "return", "nreturn"]</td></tr>
-<tr class="separator:a0409e973a7b8cdf6057c607a998354a5"><td class="memSeparator" colspan="2"> </td></tr>
-<tr class="memitem:ad00b69bd446875f229cadeb69ac6a8f7"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="ad00b69bd446875f229cadeb69ac6a8f7"></a>
+<tr class="separator:afe4c444f4c7f89fd2851e4517c66e82d"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:a95fe33a74c29ec44b4601b384358e024"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a95fe33a74c29ec44b4601b384358e024"></a>
 list </td><td class="memItemRight" valign="bottom"><b>COMPOSITE_OPTIONS</b> = ["last", "min", "max", "median", "mean", "sum", "first", "profile" "percentile", "height", "values", "percentile", "number"]</td></tr>
-<tr class="separator:ad00b69bd446875f229cadeb69ac6a8f7"><td class="memSeparator" colspan="2"> </td></tr>
-<tr class="memitem:ac7ef9219de8e84423760309190deb56e"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="ac7ef9219de8e84423760309190deb56e"></a>
+<tr class="separator:a95fe33a74c29ec44b4601b384358e024"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:a18f6b8223a9c56b4fd5676f5c8062d13"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a18f6b8223a9c56b4fd5676f5c8062d13"></a>
 list </td><td class="memItemRight" valign="bottom"><b>FILTER_OPTIONS</b> = ["all","first","last","single","multiple"]</td></tr>
-<tr class="separator:ac7ef9219de8e84423760309190deb56e"><td class="memSeparator" colspan="2"> </td></tr>
-<tr class="memitem:a130c1acc3e9b615079634fd9685b8dec"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a130c1acc3e9b615079634fd9685b8dec"></a>
+<tr class="separator:a18f6b8223a9c56b4fd5676f5c8062d13"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:adfbb8aab172e26f0382162c1a81fa863"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="adfbb8aab172e26f0382162c1a81fa863"></a>
 string </td><td class="memItemRight" valign="bottom"><b>ATTRIBUTE</b> = "ATTRIBUTE"</td></tr>
-<tr class="separator:a130c1acc3e9b615079634fd9685b8dec"><td class="memSeparator" colspan="2"> </td></tr>
-<tr class="memitem:ae0c885711f536f96a5c63d535f1bb878"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="ae0c885711f536f96a5c63d535f1bb878"></a>
+<tr class="separator:adfbb8aab172e26f0382162c1a81fa863"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:a8e27277f96bb3c59dc7fa3e39050ac85"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a8e27277f96bb3c59dc7fa3e39050ac85"></a>
 string </td><td class="memItemRight" valign="bottom"><b>COMPOSITE</b> = "COMPOSITE"</td></tr>
-<tr class="separator:ae0c885711f536f96a5c63d535f1bb878"><td class="memSeparator" colspan="2"> </td></tr>
-<tr class="memitem:a63d7f043f1912491e2e34857ac4b498a"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a63d7f043f1912491e2e34857ac4b498a"></a>
+<tr class="separator:a8e27277f96bb3c59dc7fa3e39050ac85"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:acf62ddc2366d8d598fbee8185a363c9d"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="acf62ddc2366d8d598fbee8185a363c9d"></a>
 string </td><td class="memItemRight" valign="bottom"><b>FILTER</b> = "FILTER"</td></tr>
-<tr class="separator:a63d7f043f1912491e2e34857ac4b498a"><td class="memSeparator" colspan="2"> </td></tr>
-<tr class="memitem:a320a11359d403b61b67cdf113770723e"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a320a11359d403b61b67cdf113770723e"></a>
+<tr class="separator:acf62ddc2366d8d598fbee8185a363c9d"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:ac0a6e98dcb6d3726d1e861e1485cf3d9"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="ac0a6e98dcb6d3726d1e861e1485cf3d9"></a>
 string </td><td class="memItemRight" valign="bottom"><b>PERCENTILE</b> = "PERCENTILE"</td></tr>
-<tr class="separator:a320a11359d403b61b67cdf113770723e"><td class="memSeparator" colspan="2"> </td></tr>
-<tr class="memitem:a6aa0d7c47f3a6c8b9eb4375049e69824"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a6aa0d7c47f3a6c8b9eb4375049e69824"></a>
+<tr class="separator:ac0a6e98dcb6d3726d1e861e1485cf3d9"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:a4b50520fa826ccb6a6bc24e414ec5391"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a4b50520fa826ccb6a6bc24e414ec5391"></a>
 string </td><td class="memItemRight" valign="bottom"><b>DX</b> = "DX"</td></tr>
-<tr class="separator:a6aa0d7c47f3a6c8b9eb4375049e69824"><td class="memSeparator" colspan="2"> </td></tr>
-<tr class="memitem:a165ee10778d2f0bdbe5abfae21f36d8f"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a165ee10778d2f0bdbe5abfae21f36d8f"></a>
+<tr class="separator:a4b50520fa826ccb6a6bc24e414ec5391"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:ab450e8c2f27160d69f5f376a6e39dfa1"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="ab450e8c2f27160d69f5f376a6e39dfa1"></a>
 string </td><td class="memItemRight" valign="bottom"><b>DY</b> = "DY"</td></tr>
-<tr class="separator:a165ee10778d2f0bdbe5abfae21f36d8f"><td class="memSeparator" colspan="2"> </td></tr>
-<tr class="memitem:a9cbf569ff7b068dade13fb6dc0ede553"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a9cbf569ff7b068dade13fb6dc0ede553"></a>
+<tr class="separator:ab450e8c2f27160d69f5f376a6e39dfa1"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:a2072186e8c3a370ceb38067d56b33868"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a2072186e8c3a370ceb38067d56b33868"></a>
 string </td><td class="memItemRight" valign="bottom"><b>NODATA</b> = "NODATA"</td></tr>
-<tr class="separator:a9cbf569ff7b068dade13fb6dc0ede553"><td class="memSeparator" colspan="2"> </td></tr>
-<tr class="memitem:a60a126c8d52d3911d75f9e67231e3730"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a60a126c8d52d3911d75f9e67231e3730"></a>
+<tr class="separator:a2072186e8c3a370ceb38067d56b33868"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:a450ccb8c2deb11dff9a0debe2ab3873a"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a450ccb8c2deb11dff9a0debe2ab3873a"></a>
 string </td><td class="memItemRight" valign="bottom"><b>RTYPE</b> = 'RTYPE'</td></tr>
-<tr class="separator:a60a126c8d52d3911d75f9e67231e3730"><td class="memSeparator" colspan="2"> </td></tr>
-<tr class="memitem:ab2c9b209aebe166c5202551470dcf7f0"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="ab2c9b209aebe166c5202551470dcf7f0"></a>
+<tr class="separator:a450ccb8c2deb11dff9a0debe2ab3873a"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:ae724a48a4f739d510c3d4aadfa069b83"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="ae724a48a4f739d510c3d4aadfa069b83"></a>
 list </td><td class="memItemRight" valign="bottom"><b>TYPE</b> = ['Float32','Byte','Int16','UInt16','UInt32','Int32','Float64','CInt16','CInt32','CFloat32','CFloat64']</td></tr>
-<tr class="separator:ab2c9b209aebe166c5202551470dcf7f0"><td class="memSeparator" colspan="2"> </td></tr>
-<tr class="memitem:a8cf9933f7aca1f1ace4957cbde0f958e"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a8cf9933f7aca1f1ace4957cbde0f958e"></a>
+<tr class="separator:ae724a48a4f739d510c3d4aadfa069b83"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:a534a211c9476179786a5b4fd526aa76b"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a534a211c9476179786a5b4fd526aa76b"></a>
 string </td><td class="memItemRight" valign="bottom"><b>EXTRA</b> = 'EXTRA'</td></tr>
-<tr class="separator:a8cf9933f7aca1f1ace4957cbde0f958e"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="separator:a534a211c9476179786a5b4fd526aa76b"><td class="memSeparator" colspan="2"> </td></tr>
 </table>
 <a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
 <div class="textblock">
-<p>Definition at line <a class="el" href="pklas2img_8py_source.html#l00039">39</a> of file <a class="el" href="pklas2img_8py_source.html">pklas2img.py</a>.</p>
+<p>Definition at line <a class="el" href="pktools_2pklas2img_8py_source.html#l00039">39</a> of file <a class="el" href="pktools_2pklas2img_8py_source.html">pklas2img.py</a>.</p>
 </div><hr/>The documentation for this class was generated from the following file:<ul>
-<li>/home/kempenep/pktools/qgis/<a class="el" href="pklas2img_8py_source.html">pklas2img.py</a></li>
+<li>/home/kempenep/pktools/qgis/pktools/<a class="el" href="pktools_2pklas2img_8py_source.html">pklas2img.py</a></li>
 </ul>
 </div><!-- contents -->
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Jun 23 2015 17:09:37 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/classqgis_1_1pktools_1_1pklas2img_1_1pklas2img__coll__graph.map b/doc/html/classqgis_1_1pktools_1_1pklas2img_1_1pklas2img__coll__graph.map
new file mode 100644
index 0000000..a8ab769
--- /dev/null
+++ b/doc/html/classqgis_1_1pktools_1_1pklas2img_1_1pklas2img__coll__graph.map
@@ -0,0 +1,2 @@
+<map id="qgis.pktools.pklas2img.pklas2img" name="qgis.pktools.pklas2img.pklas2img">
+</map>
diff --git a/doc/html/classqgis_1_1pktools_1_1pklas2img_1_1pklas2img__coll__graph.md5 b/doc/html/classqgis_1_1pktools_1_1pklas2img_1_1pklas2img__coll__graph.md5
new file mode 100644
index 0000000..ed84f11
--- /dev/null
+++ b/doc/html/classqgis_1_1pktools_1_1pklas2img_1_1pklas2img__coll__graph.md5
@@ -0,0 +1 @@
+370d3db2308817b35abccf3147f6e330
\ No newline at end of file
diff --git a/doc/html/classqgis_1_1pktools_1_1pklas2img_1_1pklas2img__coll__graph.png b/doc/html/classqgis_1_1pktools_1_1pklas2img_1_1pklas2img__coll__graph.png
new file mode 100644
index 0000000..01bb060
Binary files /dev/null and b/doc/html/classqgis_1_1pktools_1_1pklas2img_1_1pklas2img__coll__graph.png differ
diff --git a/doc/html/classqgis_1_1pktools_1_1pklas2img_1_1pklas2img__inherit__graph.map b/doc/html/classqgis_1_1pktools_1_1pklas2img_1_1pklas2img__inherit__graph.map
new file mode 100644
index 0000000..a8ab769
--- /dev/null
+++ b/doc/html/classqgis_1_1pktools_1_1pklas2img_1_1pklas2img__inherit__graph.map
@@ -0,0 +1,2 @@
+<map id="qgis.pktools.pklas2img.pklas2img" name="qgis.pktools.pklas2img.pklas2img">
+</map>
diff --git a/doc/html/classqgis_1_1pktools_1_1pklas2img_1_1pklas2img__inherit__graph.md5 b/doc/html/classqgis_1_1pktools_1_1pklas2img_1_1pklas2img__inherit__graph.md5
new file mode 100644
index 0000000..ed84f11
--- /dev/null
+++ b/doc/html/classqgis_1_1pktools_1_1pklas2img_1_1pklas2img__inherit__graph.md5
@@ -0,0 +1 @@
+370d3db2308817b35abccf3147f6e330
\ No newline at end of file
diff --git a/doc/html/classqgis_1_1pktools_1_1pklas2img_1_1pklas2img__inherit__graph.png b/doc/html/classqgis_1_1pktools_1_1pklas2img_1_1pklas2img__inherit__graph.png
new file mode 100644
index 0000000..01bb060
Binary files /dev/null and b/doc/html/classqgis_1_1pktools_1_1pklas2img_1_1pklas2img__inherit__graph.png differ
diff --git a/doc/html/classqgis_1_1pktools_1_1pkreclass_1_1pkreclass-members.html b/doc/html/classqgis_1_1pktools_1_1pkreclass_1_1pkreclass-members.html
new file mode 100644
index 0000000..3baf581
--- /dev/null
+++ b/doc/html/classqgis_1_1pktools_1_1pkreclass_1_1pkreclass-members.html
@@ -0,0 +1,94 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.6"/>
+<title>pktools: Member List</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+  <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
+  <td style="padding-left: 0.5em;">
+   <div id="projectname">pktools
+    <span id="projectnumber">2.6.4</span>
+   </div>
+   <div id="projectbrief">Processing Kernel for geospatial data</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.6 -->
+  <div id="navrow1" class="tabs">
+    <ul class="tablist">
+      <li><a href="index.html"><span>Main Page</span></a></li>
+      <li><a href="pages.html"><span>Related Pages</span></a></li>
+      <li class="current"><a href="annotated.html"><span>Classes</span></a></li>
+      <li><a href="files.html"><span>Files</span></a></li>
+    </ul>
+  </div>
+  <div id="navrow2" class="tabs2">
+    <ul class="tablist">
+      <li><a href="annotated.html"><span>Class List</span></a></li>
+      <li><a href="classes.html"><span>Class Index</span></a></li>
+      <li><a href="inherits.html"><span>Class Hierarchy</span></a></li>
+      <li><a href="functions.html"><span>Class Members</span></a></li>
+    </ul>
+  </div>
+<div id="nav-path" class="navpath">
+  <ul>
+<li class="navelem"><b>qgis</b></li><li class="navelem"><b>pktools</b></li><li class="navelem"><b>pkreclass</b></li><li class="navelem"><a class="el" href="classqgis_1_1pktools_1_1pkreclass_1_1pkreclass.html">pkreclass</a></li>  </ul>
+</div>
+</div><!-- top -->
+<div class="header">
+  <div class="headertitle">
+<div class="title">qgis.pktools.pkreclass.pkreclass Member List</div>  </div>
+</div><!--header-->
+<div class="contents">
+
+<p>This is the complete list of members for <a class="el" href="classqgis_1_1pktools_1_1pkreclass_1_1pkreclass.html">qgis.pktools.pkreclass.pkreclass</a>, including all inherited members.</p>
+<table class="directory">
+  <tr bgcolor="#f0f0f0" class="even"><td class="entry"><b>BAND</b> (defined in <a class="el" href="classqgis_1_1pktools_1_1pkreclass_1_1pkreclass.html">qgis.pktools.pkreclass.pkreclass</a>)</td><td class="entry"><a class="el" href="classqgis_1_1pktools_1_1pkreclass_1_1pkreclass.html">qgis.pktools.pkreclass.pkreclass</a></td><td class="entry"><span class="mlabel">static</span></td></tr>
+  <tr bgcolor="#f0f0f0"><td class="entry"><b>CLASS</b> (defined in <a class="el" href="classqgis_1_1pktools_1_1pkreclass_1_1pkreclass.html">qgis.pktools.pkreclass.pkreclass</a>)</td><td class="entry"><a class="el" href="classqgis_1_1pktools_1_1pkreclass_1_1pkreclass.html">qgis.pktools.pkreclass.pkreclass</a></td><td class="entry"><span class="mlabel">static</span></td></tr>
+  <tr bgcolor="#f0f0f0" class="even"><td class="entry"><b>cliName</b> (defined in <a class="el" href="classqgis_1_1pktools_1_1pkreclass_1_1pkreclass.html">qgis.pktools.pkreclass.pkreclass</a>)</td><td class="entry"><a class="el" href="classqgis_1_1pktools_1_1pkreclass_1_1pkreclass.html">qgis.pktools.pkreclass.pkreclass</a></td><td class="entry"></td></tr>
+  <tr bgcolor="#f0f0f0"><td class="entry"><b>defineCharacteristics</b> (defined in <a class="el" href="classqgis_1_1pktools_1_1pkreclass_1_1pkreclass.html">qgis.pktools.pkreclass.pkreclass</a>)</td><td class="entry"><a class="el" href="classqgis_1_1pktools_1_1pkreclass_1_1pkreclass.html">qgis.pktools.pkreclass.pkreclass</a></td><td class="entry"></td></tr>
+  <tr bgcolor="#f0f0f0" class="even"><td class="entry"><b>EXTRA</b> (defined in <a class="el" href="classqgis_1_1pktools_1_1pkreclass_1_1pkreclass.html">qgis.pktools.pkreclass.pkreclass</a>)</td><td class="entry"><a class="el" href="classqgis_1_1pktools_1_1pkreclass_1_1pkreclass.html">qgis.pktools.pkreclass.pkreclass</a></td><td class="entry"><span class="mlabel">static</span></td></tr>
+  <tr bgcolor="#f0f0f0"><td class="entry"><b>group</b> (defined in <a class="el" href="classqgis_1_1pktools_1_1pkreclass_1_1pkreclass.html">qgis.pktools.pkreclass.pkreclass</a>)</td><td class="entry"><a class="el" href="classqgis_1_1pktools_1_1pkreclass_1_1pkreclass.html">qgis.pktools.pkreclass.pkreclass</a></td><td class="entry"></td></tr>
+  <tr bgcolor="#f0f0f0" class="even"><td class="entry"><b>INPUT</b> (defined in <a class="el" href="classqgis_1_1pktools_1_1pkreclass_1_1pkreclass.html">qgis.pktools.pkreclass.pkreclass</a>)</td><td class="entry"><a class="el" href="classqgis_1_1pktools_1_1pkreclass_1_1pkreclass.html">qgis.pktools.pkreclass.pkreclass</a></td><td class="entry"><span class="mlabel">static</span></td></tr>
+  <tr bgcolor="#f0f0f0"><td class="entry"><b>MASK</b> (defined in <a class="el" href="classqgis_1_1pktools_1_1pkreclass_1_1pkreclass.html">qgis.pktools.pkreclass.pkreclass</a>)</td><td class="entry"><a class="el" href="classqgis_1_1pktools_1_1pkreclass_1_1pkreclass.html">qgis.pktools.pkreclass.pkreclass</a></td><td class="entry"><span class="mlabel">static</span></td></tr>
+  <tr bgcolor="#f0f0f0" class="even"><td class="entry"><b>MSKNODATA</b> (defined in <a class="el" href="classqgis_1_1pktools_1_1pkreclass_1_1pkreclass.html">qgis.pktools.pkreclass.pkreclass</a>)</td><td class="entry"><a class="el" href="classqgis_1_1pktools_1_1pkreclass_1_1pkreclass.html">qgis.pktools.pkreclass.pkreclass</a></td><td class="entry"><span class="mlabel">static</span></td></tr>
+  <tr bgcolor="#f0f0f0"><td class="entry"><b>name</b> (defined in <a class="el" href="classqgis_1_1pktools_1_1pkreclass_1_1pkreclass.html">qgis.pktools.pkreclass.pkreclass</a>)</td><td class="entry"><a class="el" href="classqgis_1_1pktools_1_1pkreclass_1_1pkreclass.html">qgis.pktools.pkreclass.pkreclass</a></td><td class="entry"></td></tr>
+  <tr bgcolor="#f0f0f0" class="even"><td class="entry"><b>NODATA</b> (defined in <a class="el" href="classqgis_1_1pktools_1_1pkreclass_1_1pkreclass.html">qgis.pktools.pkreclass.pkreclass</a>)</td><td class="entry"><a class="el" href="classqgis_1_1pktools_1_1pkreclass_1_1pkreclass.html">qgis.pktools.pkreclass.pkreclass</a></td><td class="entry"><span class="mlabel">static</span></td></tr>
+  <tr bgcolor="#f0f0f0"><td class="entry"><b>OUTPUT</b> (defined in <a class="el" href="classqgis_1_1pktools_1_1pkreclass_1_1pkreclass.html">qgis.pktools.pkreclass.pkreclass</a>)</td><td class="entry"><a class="el" href="classqgis_1_1pktools_1_1pkreclass_1_1pkreclass.html">qgis.pktools.pkreclass.pkreclass</a></td><td class="entry"><span class="mlabel">static</span></td></tr>
+  <tr bgcolor="#f0f0f0" class="even"><td class="entry"><b>processAlgorithm</b> (defined in <a class="el" href="classqgis_1_1pktools_1_1pkreclass_1_1pkreclass.html">qgis.pktools.pkreclass.pkreclass</a>)</td><td class="entry"><a class="el" href="classqgis_1_1pktools_1_1pkreclass_1_1pkreclass.html">qgis.pktools.pkreclass.pkreclass</a></td><td class="entry"></td></tr>
+  <tr bgcolor="#f0f0f0"><td class="entry"><b>RECLASS</b> (defined in <a class="el" href="classqgis_1_1pktools_1_1pkreclass_1_1pkreclass.html">qgis.pktools.pkreclass.pkreclass</a>)</td><td class="entry"><a class="el" href="classqgis_1_1pktools_1_1pkreclass_1_1pkreclass.html">qgis.pktools.pkreclass.pkreclass</a></td><td class="entry"><span class="mlabel">static</span></td></tr>
+  <tr bgcolor="#f0f0f0" class="even"><td class="entry"><b>RTYPE</b> (defined in <a class="el" href="classqgis_1_1pktools_1_1pkreclass_1_1pkreclass.html">qgis.pktools.pkreclass.pkreclass</a>)</td><td class="entry"><a class="el" href="classqgis_1_1pktools_1_1pkreclass_1_1pkreclass.html">qgis.pktools.pkreclass.pkreclass</a></td><td class="entry"><span class="mlabel">static</span></td></tr>
+  <tr bgcolor="#f0f0f0"><td class="entry"><b>TYPE</b> (defined in <a class="el" href="classqgis_1_1pktools_1_1pkreclass_1_1pkreclass.html">qgis.pktools.pkreclass.pkreclass</a>)</td><td class="entry"><a class="el" href="classqgis_1_1pktools_1_1pkreclass_1_1pkreclass.html">qgis.pktools.pkreclass.pkreclass</a></td><td class="entry"><span class="mlabel">static</span></td></tr>
+</table></div><!-- contents -->
+<!-- HTML footer for doxygen 1.8.4-->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/>
+</a> 1.8.6
+</small></address>
+<script>
+  (function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
+  (i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
+  m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
+  })(window,document,'script','//www.google-analytics.com/analytics.js','ga');
+  ga('create', 'UA-46952639-1', 'nongnu.org');
+  ga('send', 'pageview');
+</script>
+</body>
+</html>
diff --git a/doc/html/classqgis_1_1pkreclass_1_1pkreclass.html b/doc/html/classqgis_1_1pktools_1_1pkreclass_1_1pkreclass.html
similarity index 63%
copy from doc/html/classqgis_1_1pkreclass_1_1pkreclass.html
copy to doc/html/classqgis_1_1pktools_1_1pkreclass_1_1pkreclass.html
index 8dcdf80..12efa8b 100644
--- a/doc/html/classqgis_1_1pkreclass_1_1pkreclass.html
+++ b/doc/html/classqgis_1_1pktools_1_1pkreclass_1_1pkreclass.html
@@ -4,7 +4,7 @@
 <meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
 <meta http-equiv="X-UA-Compatible" content="IE=9"/>
 <meta name="generator" content="Doxygen 1.8.6"/>
-<title>pktools: qgis.pkreclass.pkreclass Class Reference</title>
+<title>pktools: qgis.pktools.pkreclass.pkreclass Class Reference</title>
 <link href="tabs.css" rel="stylesheet" type="text/css"/>
 <script type="text/javascript" src="jquery.js"></script>
 <script type="text/javascript" src="dynsections.js"></script>
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.3</span>
+    <span id="projectnumber">2.6.4</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -47,7 +47,7 @@
   </div>
 <div id="nav-path" class="navpath">
   <ul>
-<li class="navelem"><b>qgis</b></li><li class="navelem"><b>pkreclass</b></li><li class="navelem"><a class="el" href="classqgis_1_1pkreclass_1_1pkreclass.html">pkreclass</a></li>  </ul>
+<li class="navelem"><b>qgis</b></li><li class="navelem"><b>pktools</b></li><li class="navelem"><b>pkreclass</b></li><li class="navelem"><a class="el" href="classqgis_1_1pktools_1_1pkreclass_1_1pkreclass.html">pkreclass</a></li>  </ul>
 </div>
 </div><!-- top -->
 <div class="header">
@@ -55,90 +55,90 @@
 <a href="#pub-methods">Public Member Functions</a> |
 <a href="#pub-attribs">Public Attributes</a> |
 <a href="#pub-static-attribs">Static Public Attributes</a> |
-<a href="classqgis_1_1pkreclass_1_1pkreclass-members.html">List of all members</a>  </div>
+<a href="classqgis_1_1pktools_1_1pkreclass_1_1pkreclass-members.html">List of all members</a>  </div>
   <div class="headertitle">
-<div class="title">qgis.pkreclass.pkreclass Class Reference</div>  </div>
+<div class="title">qgis.pktools.pkreclass.pkreclass Class Reference</div>  </div>
 </div><!--header-->
 <div class="contents">
 <div class="dynheader">
-Inheritance diagram for qgis.pkreclass.pkreclass:</div>
+Inheritance diagram for qgis.pktools.pkreclass.pkreclass:</div>
 <div class="dyncontent">
-<div class="center"><img src="classqgis_1_1pkreclass_1_1pkreclass__inherit__graph.png" border="0" usemap="#qgis_8pkreclass_8pkreclass_inherit__map" alt="Inheritance graph"/></div>
+<div class="center"><img src="classqgis_1_1pktools_1_1pkreclass_1_1pkreclass__inherit__graph.png" border="0" usemap="#qgis_8pktools_8pkreclass_8pkreclass_inherit__map" alt="Inheritance graph"/></div>
 <center><span class="legend">[<a href="graph_legend.html">legend</a>]</span></center></div>
 <div class="dynheader">
-Collaboration diagram for qgis.pkreclass.pkreclass:</div>
+Collaboration diagram for qgis.pktools.pkreclass.pkreclass:</div>
 <div class="dyncontent">
-<div class="center"><img src="classqgis_1_1pkreclass_1_1pkreclass__coll__graph.png" border="0" usemap="#qgis_8pkreclass_8pkreclass_coll__map" alt="Collaboration graph"/></div>
+<div class="center"><img src="classqgis_1_1pktools_1_1pkreclass_1_1pkreclass__coll__graph.png" border="0" usemap="#qgis_8pktools_8pkreclass_8pkreclass_coll__map" alt="Collaboration graph"/></div>
 <center><span class="legend">[<a href="graph_legend.html">legend</a>]</span></center></div>
 <table class="memberdecls">
 <tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pub-methods"></a>
 Public Member Functions</h2></td></tr>
-<tr class="memitem:a1e3b6410096d899e755b4c3b8ceb2b63"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a1e3b6410096d899e755b4c3b8ceb2b63"></a>
+<tr class="memitem:a984813cdec014931ab57b85348708d12"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a984813cdec014931ab57b85348708d12"></a>
 def </td><td class="memItemRight" valign="bottom"><b>cliName</b></td></tr>
-<tr class="separator:a1e3b6410096d899e755b4c3b8ceb2b63"><td class="memSeparator" colspan="2"> </td></tr>
-<tr class="memitem:aa10069a49d180825b9d299868cdee9b5"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="aa10069a49d180825b9d299868cdee9b5"></a>
+<tr class="separator:a984813cdec014931ab57b85348708d12"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:afddac1fdf3d950d63d50dec6aacbcc23"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="afddac1fdf3d950d63d50dec6aacbcc23"></a>
 def </td><td class="memItemRight" valign="bottom"><b>defineCharacteristics</b></td></tr>
-<tr class="separator:aa10069a49d180825b9d299868cdee9b5"><td class="memSeparator" colspan="2"> </td></tr>
-<tr class="memitem:ab28b6ffbe5ed1d67d6f569af5af158ca"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="ab28b6ffbe5ed1d67d6f569af5af158ca"></a>
+<tr class="separator:afddac1fdf3d950d63d50dec6aacbcc23"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:ae33c054e79062fef196bfc42c7b5ba1f"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="ae33c054e79062fef196bfc42c7b5ba1f"></a>
 def </td><td class="memItemRight" valign="bottom"><b>processAlgorithm</b></td></tr>
-<tr class="separator:ab28b6ffbe5ed1d67d6f569af5af158ca"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="separator:ae33c054e79062fef196bfc42c7b5ba1f"><td class="memSeparator" colspan="2"> </td></tr>
 </table><table class="memberdecls">
 <tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pub-attribs"></a>
 Public Attributes</h2></td></tr>
-<tr class="memitem:a2d3e9d7948ff61e49ecaa646ace3b51c"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a2d3e9d7948ff61e49ecaa646ace3b51c"></a>
+<tr class="memitem:a556f1db8b0402c9c9c4f7cca81b1c264"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a556f1db8b0402c9c9c4f7cca81b1c264"></a>
  </td><td class="memItemRight" valign="bottom"><b>name</b></td></tr>
-<tr class="separator:a2d3e9d7948ff61e49ecaa646ace3b51c"><td class="memSeparator" colspan="2"> </td></tr>
-<tr class="memitem:a5474989e8a32b4f84da61b1030d928d4"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a5474989e8a32b4f84da61b1030d928d4"></a>
+<tr class="separator:a556f1db8b0402c9c9c4f7cca81b1c264"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:a2fff886959f64cb10c12a26c056a1e88"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a2fff886959f64cb10c12a26c056a1e88"></a>
  </td><td class="memItemRight" valign="bottom"><b>group</b></td></tr>
-<tr class="separator:a5474989e8a32b4f84da61b1030d928d4"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="separator:a2fff886959f64cb10c12a26c056a1e88"><td class="memSeparator" colspan="2"> </td></tr>
 </table><table class="memberdecls">
 <tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pub-static-attribs"></a>
 Static Public Attributes</h2></td></tr>
-<tr class="memitem:aac30b4b09ec8af2b365ffc60dd969fa4"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="aac30b4b09ec8af2b365ffc60dd969fa4"></a>
+<tr class="memitem:a303601836409f7a7a101ac4af8d8f3a6"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a303601836409f7a7a101ac4af8d8f3a6"></a>
 string </td><td class="memItemRight" valign="bottom"><b>INPUT</b> = "INPUT"</td></tr>
-<tr class="separator:aac30b4b09ec8af2b365ffc60dd969fa4"><td class="memSeparator" colspan="2"> </td></tr>
-<tr class="memitem:ac06924e2f6d01acffb97d97f5ed30550"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="ac06924e2f6d01acffb97d97f5ed30550"></a>
+<tr class="separator:a303601836409f7a7a101ac4af8d8f3a6"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:a065a117498a6be8d13ee27b0bcc04647"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a065a117498a6be8d13ee27b0bcc04647"></a>
 string </td><td class="memItemRight" valign="bottom"><b>OUTPUT</b> = "OUTPUT"</td></tr>
-<tr class="separator:ac06924e2f6d01acffb97d97f5ed30550"><td class="memSeparator" colspan="2"> </td></tr>
-<tr class="memitem:a6eee06a836cf0cda3bb7d4e471dd0ff8"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a6eee06a836cf0cda3bb7d4e471dd0ff8"></a>
+<tr class="separator:a065a117498a6be8d13ee27b0bcc04647"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:a47265725eeabaab2bb47e02c34ce8f66"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a47265725eeabaab2bb47e02c34ce8f66"></a>
 string </td><td class="memItemRight" valign="bottom"><b>CLASS</b> = "CLASS"</td></tr>
-<tr class="separator:a6eee06a836cf0cda3bb7d4e471dd0ff8"><td class="memSeparator" colspan="2"> </td></tr>
-<tr class="memitem:a670784309f5dde13aa8d7c8956b85501"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a670784309f5dde13aa8d7c8956b85501"></a>
+<tr class="separator:a47265725eeabaab2bb47e02c34ce8f66"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:a310bec7495dd575a3ac641d81f914ae3"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a310bec7495dd575a3ac641d81f914ae3"></a>
 string </td><td class="memItemRight" valign="bottom"><b>BAND</b> = "BAND"</td></tr>
-<tr class="separator:a670784309f5dde13aa8d7c8956b85501"><td class="memSeparator" colspan="2"> </td></tr>
-<tr class="memitem:ab677fcc1481ee0f4804a64ba5a9ccf41"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="ab677fcc1481ee0f4804a64ba5a9ccf41"></a>
+<tr class="separator:a310bec7495dd575a3ac641d81f914ae3"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:a77d68ecc97bddef7f58cfdb7426139d8"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a77d68ecc97bddef7f58cfdb7426139d8"></a>
 string </td><td class="memItemRight" valign="bottom"><b>RECLASS</b> = "RECLASS"</td></tr>
-<tr class="separator:ab677fcc1481ee0f4804a64ba5a9ccf41"><td class="memSeparator" colspan="2"> </td></tr>
-<tr class="memitem:a8d00f95e83e048f830d3541e0006412a"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a8d00f95e83e048f830d3541e0006412a"></a>
+<tr class="separator:a77d68ecc97bddef7f58cfdb7426139d8"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:a801a99540cfdf947b4837778ed0a1f37"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a801a99540cfdf947b4837778ed0a1f37"></a>
 string </td><td class="memItemRight" valign="bottom"><b>MASK</b> = "MASK"</td></tr>
-<tr class="separator:a8d00f95e83e048f830d3541e0006412a"><td class="memSeparator" colspan="2"> </td></tr>
-<tr class="memitem:ad9cb8a5b163ad79ff18263dac1c27ea9"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="ad9cb8a5b163ad79ff18263dac1c27ea9"></a>
+<tr class="separator:a801a99540cfdf947b4837778ed0a1f37"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:ad273e7dbdd1610b40f42d3c50295bd3a"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="ad273e7dbdd1610b40f42d3c50295bd3a"></a>
 string </td><td class="memItemRight" valign="bottom"><b>MSKNODATA</b> = "MSKNODATA"</td></tr>
-<tr class="separator:ad9cb8a5b163ad79ff18263dac1c27ea9"><td class="memSeparator" colspan="2"> </td></tr>
-<tr class="memitem:a377d3003bdce66a2ef2083bcd439950f"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a377d3003bdce66a2ef2083bcd439950f"></a>
+<tr class="separator:ad273e7dbdd1610b40f42d3c50295bd3a"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:ae133eccf7059c47635068612f8d788db"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="ae133eccf7059c47635068612f8d788db"></a>
 string </td><td class="memItemRight" valign="bottom"><b>NODATA</b> = "NODATA"</td></tr>
-<tr class="separator:a377d3003bdce66a2ef2083bcd439950f"><td class="memSeparator" colspan="2"> </td></tr>
-<tr class="memitem:a7b77eea90f50504357742100c95ac454"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a7b77eea90f50504357742100c95ac454"></a>
+<tr class="separator:ae133eccf7059c47635068612f8d788db"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:ad32491e68ff156791fe09f6435925b64"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="ad32491e68ff156791fe09f6435925b64"></a>
 string </td><td class="memItemRight" valign="bottom"><b>RTYPE</b> = 'RTYPE'</td></tr>
-<tr class="separator:a7b77eea90f50504357742100c95ac454"><td class="memSeparator" colspan="2"> </td></tr>
-<tr class="memitem:af8727418e991db1564e423d9ebeb2c89"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="af8727418e991db1564e423d9ebeb2c89"></a>
+<tr class="separator:ad32491e68ff156791fe09f6435925b64"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:ae0f930fadcfbe749ee6565d75bb090f3"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="ae0f930fadcfbe749ee6565d75bb090f3"></a>
 list </td><td class="memItemRight" valign="bottom"><b>TYPE</b> = ['none', 'Byte','Int16','UInt16','UInt32','Int32','Float32','Float64','CInt16','CInt32','CFloat32','CFloat64']</td></tr>
-<tr class="separator:af8727418e991db1564e423d9ebeb2c89"><td class="memSeparator" colspan="2"> </td></tr>
-<tr class="memitem:a10e1786759936dd074581841f73c2505"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a10e1786759936dd074581841f73c2505"></a>
+<tr class="separator:ae0f930fadcfbe749ee6565d75bb090f3"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:a2da5ea965129a52c1559f80b8815b65d"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a2da5ea965129a52c1559f80b8815b65d"></a>
 string </td><td class="memItemRight" valign="bottom"><b>EXTRA</b> = 'EXTRA'</td></tr>
-<tr class="separator:a10e1786759936dd074581841f73c2505"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="separator:a2da5ea965129a52c1559f80b8815b65d"><td class="memSeparator" colspan="2"> </td></tr>
 </table>
 <a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
 <div class="textblock">
-<p>Definition at line <a class="el" href="pkreclass_8py_source.html#l00038">38</a> of file <a class="el" href="pkreclass_8py_source.html">pkreclass.py</a>.</p>
+<p>Definition at line <a class="el" href="pktools_2pkreclass_8py_source.html#l00038">38</a> of file <a class="el" href="pktools_2pkreclass_8py_source.html">pkreclass.py</a>.</p>
 </div><hr/>The documentation for this class was generated from the following file:<ul>
-<li>/home/kempenep/pktools/qgis/<a class="el" href="pkreclass_8py_source.html">pkreclass.py</a></li>
+<li>/home/kempenep/pktools/qgis/pktools/<a class="el" href="pktools_2pkreclass_8py_source.html">pkreclass.py</a></li>
 </ul>
 </div><!-- contents -->
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Jun 23 2015 17:09:37 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/classqgis_1_1pktools_1_1pkreclass_1_1pkreclass__coll__graph.map b/doc/html/classqgis_1_1pktools_1_1pkreclass_1_1pkreclass__coll__graph.map
new file mode 100644
index 0000000..b4bc7b8
--- /dev/null
+++ b/doc/html/classqgis_1_1pktools_1_1pkreclass_1_1pkreclass__coll__graph.map
@@ -0,0 +1,2 @@
+<map id="qgis.pktools.pkreclass.pkreclass" name="qgis.pktools.pkreclass.pkreclass">
+</map>
diff --git a/doc/html/classqgis_1_1pktools_1_1pkreclass_1_1pkreclass__coll__graph.md5 b/doc/html/classqgis_1_1pktools_1_1pkreclass_1_1pkreclass__coll__graph.md5
new file mode 100644
index 0000000..b83e99a
--- /dev/null
+++ b/doc/html/classqgis_1_1pktools_1_1pkreclass_1_1pkreclass__coll__graph.md5
@@ -0,0 +1 @@
+734d838e268dc55de60fb9356326c2d9
\ No newline at end of file
diff --git a/doc/html/classqgis_1_1pktools_1_1pkreclass_1_1pkreclass__coll__graph.png b/doc/html/classqgis_1_1pktools_1_1pkreclass_1_1pkreclass__coll__graph.png
new file mode 100644
index 0000000..1d0d610
Binary files /dev/null and b/doc/html/classqgis_1_1pktools_1_1pkreclass_1_1pkreclass__coll__graph.png differ
diff --git a/doc/html/classqgis_1_1pktools_1_1pkreclass_1_1pkreclass__inherit__graph.map b/doc/html/classqgis_1_1pktools_1_1pkreclass_1_1pkreclass__inherit__graph.map
new file mode 100644
index 0000000..b4bc7b8
--- /dev/null
+++ b/doc/html/classqgis_1_1pktools_1_1pkreclass_1_1pkreclass__inherit__graph.map
@@ -0,0 +1,2 @@
+<map id="qgis.pktools.pkreclass.pkreclass" name="qgis.pktools.pkreclass.pkreclass">
+</map>
diff --git a/doc/html/classqgis_1_1pktools_1_1pkreclass_1_1pkreclass__inherit__graph.md5 b/doc/html/classqgis_1_1pktools_1_1pkreclass_1_1pkreclass__inherit__graph.md5
new file mode 100644
index 0000000..b83e99a
--- /dev/null
+++ b/doc/html/classqgis_1_1pktools_1_1pkreclass_1_1pkreclass__inherit__graph.md5
@@ -0,0 +1 @@
+734d838e268dc55de60fb9356326c2d9
\ No newline at end of file
diff --git a/doc/html/classqgis_1_1pktools_1_1pkreclass_1_1pkreclass__inherit__graph.png b/doc/html/classqgis_1_1pktools_1_1pkreclass_1_1pkreclass__inherit__graph.png
new file mode 100644
index 0000000..1d0d610
Binary files /dev/null and b/doc/html/classqgis_1_1pktools_1_1pkreclass_1_1pkreclass__inherit__graph.png differ
diff --git a/doc/html/classqgis_1_1pktools_1_1pksetmask_1_1pksetmask-members.html b/doc/html/classqgis_1_1pktools_1_1pksetmask_1_1pksetmask-members.html
new file mode 100644
index 0000000..8a3c22b
--- /dev/null
+++ b/doc/html/classqgis_1_1pktools_1_1pksetmask_1_1pksetmask-members.html
@@ -0,0 +1,94 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.6"/>
+<title>pktools: Member List</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+  <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
+  <td style="padding-left: 0.5em;">
+   <div id="projectname">pktools
+    <span id="projectnumber">2.6.4</span>
+   </div>
+   <div id="projectbrief">Processing Kernel for geospatial data</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.6 -->
+  <div id="navrow1" class="tabs">
+    <ul class="tablist">
+      <li><a href="index.html"><span>Main Page</span></a></li>
+      <li><a href="pages.html"><span>Related Pages</span></a></li>
+      <li class="current"><a href="annotated.html"><span>Classes</span></a></li>
+      <li><a href="files.html"><span>Files</span></a></li>
+    </ul>
+  </div>
+  <div id="navrow2" class="tabs2">
+    <ul class="tablist">
+      <li><a href="annotated.html"><span>Class List</span></a></li>
+      <li><a href="classes.html"><span>Class Index</span></a></li>
+      <li><a href="inherits.html"><span>Class Hierarchy</span></a></li>
+      <li><a href="functions.html"><span>Class Members</span></a></li>
+    </ul>
+  </div>
+<div id="nav-path" class="navpath">
+  <ul>
+<li class="navelem"><b>qgis</b></li><li class="navelem"><b>pktools</b></li><li class="navelem"><b>pksetmask</b></li><li class="navelem"><a class="el" href="classqgis_1_1pktools_1_1pksetmask_1_1pksetmask.html">pksetmask</a></li>  </ul>
+</div>
+</div><!-- top -->
+<div class="header">
+  <div class="headertitle">
+<div class="title">qgis.pktools.pksetmask.pksetmask Member List</div>  </div>
+</div><!--header-->
+<div class="contents">
+
+<p>This is the complete list of members for <a class="el" href="classqgis_1_1pktools_1_1pksetmask_1_1pksetmask.html">qgis.pktools.pksetmask.pksetmask</a>, including all inherited members.</p>
+<table class="directory">
+  <tr bgcolor="#f0f0f0" class="even"><td class="entry"><b>cliName</b> (defined in <a class="el" href="classqgis_1_1pktools_1_1pksetmask_1_1pksetmask.html">qgis.pktools.pksetmask.pksetmask</a>)</td><td class="entry"><a class="el" href="classqgis_1_1pktools_1_1pksetmask_1_1pksetmask.html">qgis.pktools.pksetmask.pksetmask</a></td><td class="entry"></td></tr>
+  <tr bgcolor="#f0f0f0"><td class="entry"><b>defineCharacteristics</b> (defined in <a class="el" href="classqgis_1_1pktools_1_1pksetmask_1_1pksetmask.html">qgis.pktools.pksetmask.pksetmask</a>)</td><td class="entry"><a class="el" href="classqgis_1_1pktools_1_1pksetmask_1_1pksetmask.html">qgis.pktools.pksetmask.pksetmask</a></td><td class="entry"></td></tr>
+  <tr bgcolor="#f0f0f0" class="even"><td class="entry"><b>EXTRA</b> (defined in <a class="el" href="classqgis_1_1pktools_1_1pksetmask_1_1pksetmask.html">qgis.pktools.pksetmask.pksetmask</a>)</td><td class="entry"><a class="el" href="classqgis_1_1pktools_1_1pksetmask_1_1pksetmask.html">qgis.pktools.pksetmask.pksetmask</a></td><td class="entry"><span class="mlabel">static</span></td></tr>
+  <tr bgcolor="#f0f0f0"><td class="entry"><b>group</b> (defined in <a class="el" href="classqgis_1_1pktools_1_1pksetmask_1_1pksetmask.html">qgis.pktools.pksetmask.pksetmask</a>)</td><td class="entry"><a class="el" href="classqgis_1_1pktools_1_1pksetmask_1_1pksetmask.html">qgis.pktools.pksetmask.pksetmask</a></td><td class="entry"></td></tr>
+  <tr bgcolor="#f0f0f0" class="even"><td class="entry"><b>INPUT</b> (defined in <a class="el" href="classqgis_1_1pktools_1_1pksetmask_1_1pksetmask.html">qgis.pktools.pksetmask.pksetmask</a>)</td><td class="entry"><a class="el" href="classqgis_1_1pktools_1_1pksetmask_1_1pksetmask.html">qgis.pktools.pksetmask.pksetmask</a></td><td class="entry"><span class="mlabel">static</span></td></tr>
+  <tr bgcolor="#f0f0f0"><td class="entry"><b>MASK</b> (defined in <a class="el" href="classqgis_1_1pktools_1_1pksetmask_1_1pksetmask.html">qgis.pktools.pksetmask.pksetmask</a>)</td><td class="entry"><a class="el" href="classqgis_1_1pktools_1_1pksetmask_1_1pksetmask.html">qgis.pktools.pksetmask.pksetmask</a></td><td class="entry"><span class="mlabel">static</span></td></tr>
+  <tr bgcolor="#f0f0f0" class="even"><td class="entry"><b>MSKBAND</b> (defined in <a class="el" href="classqgis_1_1pktools_1_1pksetmask_1_1pksetmask.html">qgis.pktools.pksetmask.pksetmask</a>)</td><td class="entry"><a class="el" href="classqgis_1_1pktools_1_1pksetmask_1_1pksetmask.html">qgis.pktools.pksetmask.pksetmask</a></td><td class="entry"><span class="mlabel">static</span></td></tr>
+  <tr bgcolor="#f0f0f0"><td class="entry"><b>MSKNODATA</b> (defined in <a class="el" href="classqgis_1_1pktools_1_1pksetmask_1_1pksetmask.html">qgis.pktools.pksetmask.pksetmask</a>)</td><td class="entry"><a class="el" href="classqgis_1_1pktools_1_1pksetmask_1_1pksetmask.html">qgis.pktools.pksetmask.pksetmask</a></td><td class="entry"><span class="mlabel">static</span></td></tr>
+  <tr bgcolor="#f0f0f0" class="even"><td class="entry"><b>name</b> (defined in <a class="el" href="classqgis_1_1pktools_1_1pksetmask_1_1pksetmask.html">qgis.pktools.pksetmask.pksetmask</a>)</td><td class="entry"><a class="el" href="classqgis_1_1pktools_1_1pksetmask_1_1pksetmask.html">qgis.pktools.pksetmask.pksetmask</a></td><td class="entry"></td></tr>
+  <tr bgcolor="#f0f0f0"><td class="entry"><b>NODATA</b> (defined in <a class="el" href="classqgis_1_1pktools_1_1pksetmask_1_1pksetmask.html">qgis.pktools.pksetmask.pksetmask</a>)</td><td class="entry"><a class="el" href="classqgis_1_1pktools_1_1pksetmask_1_1pksetmask.html">qgis.pktools.pksetmask.pksetmask</a></td><td class="entry"><span class="mlabel">static</span></td></tr>
+  <tr bgcolor="#f0f0f0" class="even"><td class="entry"><b>OPERATOR</b> (defined in <a class="el" href="classqgis_1_1pktools_1_1pksetmask_1_1pksetmask.html">qgis.pktools.pksetmask.pksetmask</a>)</td><td class="entry"><a class="el" href="classqgis_1_1pktools_1_1pksetmask_1_1pksetmask.html">qgis.pktools.pksetmask.pksetmask</a></td><td class="entry"><span class="mlabel">static</span></td></tr>
+  <tr bgcolor="#f0f0f0"><td class="entry"><b>OPERATOR_OPTIONS</b> (defined in <a class="el" href="classqgis_1_1pktools_1_1pksetmask_1_1pksetmask.html">qgis.pktools.pksetmask.pksetmask</a>)</td><td class="entry"><a class="el" href="classqgis_1_1pktools_1_1pksetmask_1_1pksetmask.html">qgis.pktools.pksetmask.pksetmask</a></td><td class="entry"><span class="mlabel">static</span></td></tr>
+  <tr bgcolor="#f0f0f0" class="even"><td class="entry"><b>OUTPUT</b> (defined in <a class="el" href="classqgis_1_1pktools_1_1pksetmask_1_1pksetmask.html">qgis.pktools.pksetmask.pksetmask</a>)</td><td class="entry"><a class="el" href="classqgis_1_1pktools_1_1pksetmask_1_1pksetmask.html">qgis.pktools.pksetmask.pksetmask</a></td><td class="entry"><span class="mlabel">static</span></td></tr>
+  <tr bgcolor="#f0f0f0"><td class="entry"><b>processAlgorithm</b> (defined in <a class="el" href="classqgis_1_1pktools_1_1pksetmask_1_1pksetmask.html">qgis.pktools.pksetmask.pksetmask</a>)</td><td class="entry"><a class="el" href="classqgis_1_1pktools_1_1pksetmask_1_1pksetmask.html">qgis.pktools.pksetmask.pksetmask</a></td><td class="entry"></td></tr>
+  <tr bgcolor="#f0f0f0" class="even"><td class="entry"><b>RTYPE</b> (defined in <a class="el" href="classqgis_1_1pktools_1_1pksetmask_1_1pksetmask.html">qgis.pktools.pksetmask.pksetmask</a>)</td><td class="entry"><a class="el" href="classqgis_1_1pktools_1_1pksetmask_1_1pksetmask.html">qgis.pktools.pksetmask.pksetmask</a></td><td class="entry"><span class="mlabel">static</span></td></tr>
+  <tr bgcolor="#f0f0f0"><td class="entry"><b>TYPE</b> (defined in <a class="el" href="classqgis_1_1pktools_1_1pksetmask_1_1pksetmask.html">qgis.pktools.pksetmask.pksetmask</a>)</td><td class="entry"><a class="el" href="classqgis_1_1pktools_1_1pksetmask_1_1pksetmask.html">qgis.pktools.pksetmask.pksetmask</a></td><td class="entry"><span class="mlabel">static</span></td></tr>
+</table></div><!-- contents -->
+<!-- HTML footer for doxygen 1.8.4-->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/>
+</a> 1.8.6
+</small></address>
+<script>
+  (function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
+  (i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
+  m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
+  })(window,document,'script','//www.google-analytics.com/analytics.js','ga');
+  ga('create', 'UA-46952639-1', 'nongnu.org');
+  ga('send', 'pageview');
+</script>
+</body>
+</html>
diff --git a/doc/html/classqgis_1_1pksetmask_1_1pksetmask.html b/doc/html/classqgis_1_1pktools_1_1pksetmask_1_1pksetmask.html
similarity index 63%
copy from doc/html/classqgis_1_1pksetmask_1_1pksetmask.html
copy to doc/html/classqgis_1_1pktools_1_1pksetmask_1_1pksetmask.html
index 1f35eb3..f1699b9 100644
--- a/doc/html/classqgis_1_1pksetmask_1_1pksetmask.html
+++ b/doc/html/classqgis_1_1pktools_1_1pksetmask_1_1pksetmask.html
@@ -4,7 +4,7 @@
 <meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
 <meta http-equiv="X-UA-Compatible" content="IE=9"/>
 <meta name="generator" content="Doxygen 1.8.6"/>
-<title>pktools: qgis.pksetmask.pksetmask Class Reference</title>
+<title>pktools: qgis.pktools.pksetmask.pksetmask Class Reference</title>
 <link href="tabs.css" rel="stylesheet" type="text/css"/>
 <script type="text/javascript" src="jquery.js"></script>
 <script type="text/javascript" src="dynsections.js"></script>
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.3</span>
+    <span id="projectnumber">2.6.4</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -47,7 +47,7 @@
   </div>
 <div id="nav-path" class="navpath">
   <ul>
-<li class="navelem"><b>qgis</b></li><li class="navelem"><b>pksetmask</b></li><li class="navelem"><a class="el" href="classqgis_1_1pksetmask_1_1pksetmask.html">pksetmask</a></li>  </ul>
+<li class="navelem"><b>qgis</b></li><li class="navelem"><b>pktools</b></li><li class="navelem"><b>pksetmask</b></li><li class="navelem"><a class="el" href="classqgis_1_1pktools_1_1pksetmask_1_1pksetmask.html">pksetmask</a></li>  </ul>
 </div>
 </div><!-- top -->
 <div class="header">
@@ -55,90 +55,90 @@
 <a href="#pub-methods">Public Member Functions</a> |
 <a href="#pub-attribs">Public Attributes</a> |
 <a href="#pub-static-attribs">Static Public Attributes</a> |
-<a href="classqgis_1_1pksetmask_1_1pksetmask-members.html">List of all members</a>  </div>
+<a href="classqgis_1_1pktools_1_1pksetmask_1_1pksetmask-members.html">List of all members</a>  </div>
   <div class="headertitle">
-<div class="title">qgis.pksetmask.pksetmask Class Reference</div>  </div>
+<div class="title">qgis.pktools.pksetmask.pksetmask Class Reference</div>  </div>
 </div><!--header-->
 <div class="contents">
 <div class="dynheader">
-Inheritance diagram for qgis.pksetmask.pksetmask:</div>
+Inheritance diagram for qgis.pktools.pksetmask.pksetmask:</div>
 <div class="dyncontent">
-<div class="center"><img src="classqgis_1_1pksetmask_1_1pksetmask__inherit__graph.png" border="0" usemap="#qgis_8pksetmask_8pksetmask_inherit__map" alt="Inheritance graph"/></div>
+<div class="center"><img src="classqgis_1_1pktools_1_1pksetmask_1_1pksetmask__inherit__graph.png" border="0" usemap="#qgis_8pktools_8pksetmask_8pksetmask_inherit__map" alt="Inheritance graph"/></div>
 <center><span class="legend">[<a href="graph_legend.html">legend</a>]</span></center></div>
 <div class="dynheader">
-Collaboration diagram for qgis.pksetmask.pksetmask:</div>
+Collaboration diagram for qgis.pktools.pksetmask.pksetmask:</div>
 <div class="dyncontent">
-<div class="center"><img src="classqgis_1_1pksetmask_1_1pksetmask__coll__graph.png" border="0" usemap="#qgis_8pksetmask_8pksetmask_coll__map" alt="Collaboration graph"/></div>
+<div class="center"><img src="classqgis_1_1pktools_1_1pksetmask_1_1pksetmask__coll__graph.png" border="0" usemap="#qgis_8pktools_8pksetmask_8pksetmask_coll__map" alt="Collaboration graph"/></div>
 <center><span class="legend">[<a href="graph_legend.html">legend</a>]</span></center></div>
 <table class="memberdecls">
 <tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pub-methods"></a>
 Public Member Functions</h2></td></tr>
-<tr class="memitem:a539b2bbbabaa1ea1ac1dcdcc60a87669"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a539b2bbbabaa1ea1ac1dcdcc60a87669"></a>
+<tr class="memitem:a25ebf3b8fa56e16e2dfa077434ee4419"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a25ebf3b8fa56e16e2dfa077434ee4419"></a>
 def </td><td class="memItemRight" valign="bottom"><b>cliName</b></td></tr>
-<tr class="separator:a539b2bbbabaa1ea1ac1dcdcc60a87669"><td class="memSeparator" colspan="2"> </td></tr>
-<tr class="memitem:af821d49d5dc0751df801aa77f3c45439"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="af821d49d5dc0751df801aa77f3c45439"></a>
+<tr class="separator:a25ebf3b8fa56e16e2dfa077434ee4419"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:a43fe1f0bfd877ae4e935517251971f7a"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a43fe1f0bfd877ae4e935517251971f7a"></a>
 def </td><td class="memItemRight" valign="bottom"><b>defineCharacteristics</b></td></tr>
-<tr class="separator:af821d49d5dc0751df801aa77f3c45439"><td class="memSeparator" colspan="2"> </td></tr>
-<tr class="memitem:a525d67ecea4615d5e54bd6c2d6d7a911"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a525d67ecea4615d5e54bd6c2d6d7a911"></a>
+<tr class="separator:a43fe1f0bfd877ae4e935517251971f7a"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:adb755e6a77023a07b337f3d76c0eb647"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="adb755e6a77023a07b337f3d76c0eb647"></a>
 def </td><td class="memItemRight" valign="bottom"><b>processAlgorithm</b></td></tr>
-<tr class="separator:a525d67ecea4615d5e54bd6c2d6d7a911"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="separator:adb755e6a77023a07b337f3d76c0eb647"><td class="memSeparator" colspan="2"> </td></tr>
 </table><table class="memberdecls">
 <tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pub-attribs"></a>
 Public Attributes</h2></td></tr>
-<tr class="memitem:ac356f16f384fdc78b5419cdbaaac496d"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="ac356f16f384fdc78b5419cdbaaac496d"></a>
+<tr class="memitem:a0c7a9177b36c398a267bf8de262516eb"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a0c7a9177b36c398a267bf8de262516eb"></a>
  </td><td class="memItemRight" valign="bottom"><b>name</b></td></tr>
-<tr class="separator:ac356f16f384fdc78b5419cdbaaac496d"><td class="memSeparator" colspan="2"> </td></tr>
-<tr class="memitem:a26a6204cff0e0414422bddb6d714c8d5"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a26a6204cff0e0414422bddb6d714c8d5"></a>
+<tr class="separator:a0c7a9177b36c398a267bf8de262516eb"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:ae1d2501517fe54bab01bb8d797582e84"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="ae1d2501517fe54bab01bb8d797582e84"></a>
  </td><td class="memItemRight" valign="bottom"><b>group</b></td></tr>
-<tr class="separator:a26a6204cff0e0414422bddb6d714c8d5"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="separator:ae1d2501517fe54bab01bb8d797582e84"><td class="memSeparator" colspan="2"> </td></tr>
 </table><table class="memberdecls">
 <tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pub-static-attribs"></a>
 Static Public Attributes</h2></td></tr>
-<tr class="memitem:a64b4d0cf98dae937536135be3220011d"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a64b4d0cf98dae937536135be3220011d"></a>
+<tr class="memitem:a8e87715eedd9a7165b00d55d02833569"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a8e87715eedd9a7165b00d55d02833569"></a>
 string </td><td class="memItemRight" valign="bottom"><b>INPUT</b> = "INPUT"</td></tr>
-<tr class="separator:a64b4d0cf98dae937536135be3220011d"><td class="memSeparator" colspan="2"> </td></tr>
-<tr class="memitem:a926a151acae3b3947f8f659c08901a0e"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a926a151acae3b3947f8f659c08901a0e"></a>
+<tr class="separator:a8e87715eedd9a7165b00d55d02833569"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:ac40b33e07c5ee97c23a151a66df84689"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="ac40b33e07c5ee97c23a151a66df84689"></a>
 string </td><td class="memItemRight" valign="bottom"><b>MASK</b> = "MASK"</td></tr>
-<tr class="separator:a926a151acae3b3947f8f659c08901a0e"><td class="memSeparator" colspan="2"> </td></tr>
-<tr class="memitem:afd621c70d1c2fc2f29a598ca94f52209"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="afd621c70d1c2fc2f29a598ca94f52209"></a>
+<tr class="separator:ac40b33e07c5ee97c23a151a66df84689"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:a9b66ea21c12be4ad78c2ca6cff1f43f9"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a9b66ea21c12be4ad78c2ca6cff1f43f9"></a>
 string </td><td class="memItemRight" valign="bottom"><b>MSKNODATA</b> = "MSKNODATA"</td></tr>
-<tr class="separator:afd621c70d1c2fc2f29a598ca94f52209"><td class="memSeparator" colspan="2"> </td></tr>
-<tr class="memitem:a72fd0200a13dd69eb8a8e8664288f8f3"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a72fd0200a13dd69eb8a8e8664288f8f3"></a>
+<tr class="separator:a9b66ea21c12be4ad78c2ca6cff1f43f9"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:ace691beff7bf0d303e8fee5efde7b265"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="ace691beff7bf0d303e8fee5efde7b265"></a>
 string </td><td class="memItemRight" valign="bottom"><b>MSKBAND</b> = "MSKBAND"</td></tr>
-<tr class="separator:a72fd0200a13dd69eb8a8e8664288f8f3"><td class="memSeparator" colspan="2"> </td></tr>
-<tr class="memitem:a0ec16c72e434e986dc7127edd22a8756"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a0ec16c72e434e986dc7127edd22a8756"></a>
+<tr class="separator:ace691beff7bf0d303e8fee5efde7b265"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:a51a45aa30286d2a9ff7810da37e28aae"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a51a45aa30286d2a9ff7810da37e28aae"></a>
 list </td><td class="memItemRight" valign="bottom"><b>OPERATOR_OPTIONS</b> = ["=","<",">","!"]</td></tr>
-<tr class="separator:a0ec16c72e434e986dc7127edd22a8756"><td class="memSeparator" colspan="2"> </td></tr>
-<tr class="memitem:a68d2802febad55d67d4848ee6553d21e"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a68d2802febad55d67d4848ee6553d21e"></a>
+<tr class="separator:a51a45aa30286d2a9ff7810da37e28aae"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:a73bb29985c2a59680763c0037397739e"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a73bb29985c2a59680763c0037397739e"></a>
 string </td><td class="memItemRight" valign="bottom"><b>OPERATOR</b> = "OPERATOR"</td></tr>
-<tr class="separator:a68d2802febad55d67d4848ee6553d21e"><td class="memSeparator" colspan="2"> </td></tr>
-<tr class="memitem:a7db2c15757ac66baf866fcaaba9f27ac"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a7db2c15757ac66baf866fcaaba9f27ac"></a>
+<tr class="separator:a73bb29985c2a59680763c0037397739e"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:a24c98153680e1de66746fd52785ae784"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a24c98153680e1de66746fd52785ae784"></a>
 string </td><td class="memItemRight" valign="bottom"><b>NODATA</b> = "NODATA"</td></tr>
-<tr class="separator:a7db2c15757ac66baf866fcaaba9f27ac"><td class="memSeparator" colspan="2"> </td></tr>
-<tr class="memitem:a1f43a43129a59344782bd62b9984045b"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a1f43a43129a59344782bd62b9984045b"></a>
+<tr class="separator:a24c98153680e1de66746fd52785ae784"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:a5883cf4f62435f304fdadd16b2cffc7b"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a5883cf4f62435f304fdadd16b2cffc7b"></a>
 string </td><td class="memItemRight" valign="bottom"><b>OUTPUT</b> = "OUTPUT"</td></tr>
-<tr class="separator:a1f43a43129a59344782bd62b9984045b"><td class="memSeparator" colspan="2"> </td></tr>
-<tr class="memitem:a53adabeb756e8f6c38b739a182b4c351"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a53adabeb756e8f6c38b739a182b4c351"></a>
+<tr class="separator:a5883cf4f62435f304fdadd16b2cffc7b"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:aebbb05f08af1f26f4bdab58e4765f0f4"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="aebbb05f08af1f26f4bdab58e4765f0f4"></a>
 string </td><td class="memItemRight" valign="bottom"><b>RTYPE</b> = 'RTYPE'</td></tr>
-<tr class="separator:a53adabeb756e8f6c38b739a182b4c351"><td class="memSeparator" colspan="2"> </td></tr>
-<tr class="memitem:a4c222c8118aa51967806a48f9e67151a"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a4c222c8118aa51967806a48f9e67151a"></a>
+<tr class="separator:aebbb05f08af1f26f4bdab58e4765f0f4"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:a9e6a013c1e4fb1d7a17be4c55e414a21"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a9e6a013c1e4fb1d7a17be4c55e414a21"></a>
 list </td><td class="memItemRight" valign="bottom"><b>TYPE</b> = ['none', 'Byte','Int16','UInt16','UInt32','Int32','Float32','Float64','CInt16','CInt32','CFloat32','CFloat64']</td></tr>
-<tr class="separator:a4c222c8118aa51967806a48f9e67151a"><td class="memSeparator" colspan="2"> </td></tr>
-<tr class="memitem:ae31305e3b79571cc6475b47cf9c4762e"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="ae31305e3b79571cc6475b47cf9c4762e"></a>
+<tr class="separator:a9e6a013c1e4fb1d7a17be4c55e414a21"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:a7844f283b29ff1eab06a928d703b1628"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a7844f283b29ff1eab06a928d703b1628"></a>
 string </td><td class="memItemRight" valign="bottom"><b>EXTRA</b> = 'EXTRA'</td></tr>
-<tr class="separator:ae31305e3b79571cc6475b47cf9c4762e"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="separator:a7844f283b29ff1eab06a928d703b1628"><td class="memSeparator" colspan="2"> </td></tr>
 </table>
 <a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
 <div class="textblock">
-<p>Definition at line <a class="el" href="pksetmask_8py_source.html#l00038">38</a> of file <a class="el" href="pksetmask_8py_source.html">pksetmask.py</a>.</p>
+<p>Definition at line <a class="el" href="pktools_2pksetmask_8py_source.html#l00038">38</a> of file <a class="el" href="pktools_2pksetmask_8py_source.html">pksetmask.py</a>.</p>
 </div><hr/>The documentation for this class was generated from the following file:<ul>
-<li>/home/kempenep/pktools/qgis/<a class="el" href="pksetmask_8py_source.html">pksetmask.py</a></li>
+<li>/home/kempenep/pktools/qgis/pktools/<a class="el" href="pktools_2pksetmask_8py_source.html">pksetmask.py</a></li>
 </ul>
 </div><!-- contents -->
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Jun 23 2015 17:09:37 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/classqgis_1_1pktools_1_1pksetmask_1_1pksetmask__coll__graph.map b/doc/html/classqgis_1_1pktools_1_1pksetmask_1_1pksetmask__coll__graph.map
new file mode 100644
index 0000000..655c2cf
--- /dev/null
+++ b/doc/html/classqgis_1_1pktools_1_1pksetmask_1_1pksetmask__coll__graph.map
@@ -0,0 +1,2 @@
+<map id="qgis.pktools.pksetmask.pksetmask" name="qgis.pktools.pksetmask.pksetmask">
+</map>
diff --git a/doc/html/classqgis_1_1pktools_1_1pksetmask_1_1pksetmask__coll__graph.md5 b/doc/html/classqgis_1_1pktools_1_1pksetmask_1_1pksetmask__coll__graph.md5
new file mode 100644
index 0000000..c944154
--- /dev/null
+++ b/doc/html/classqgis_1_1pktools_1_1pksetmask_1_1pksetmask__coll__graph.md5
@@ -0,0 +1 @@
+fd4e090bd4f6765f6023ca57d131081d
\ No newline at end of file
diff --git a/doc/html/classqgis_1_1pktools_1_1pksetmask_1_1pksetmask__coll__graph.png b/doc/html/classqgis_1_1pktools_1_1pksetmask_1_1pksetmask__coll__graph.png
new file mode 100644
index 0000000..2fc79db
Binary files /dev/null and b/doc/html/classqgis_1_1pktools_1_1pksetmask_1_1pksetmask__coll__graph.png differ
diff --git a/doc/html/classqgis_1_1pktools_1_1pksetmask_1_1pksetmask__inherit__graph.map b/doc/html/classqgis_1_1pktools_1_1pksetmask_1_1pksetmask__inherit__graph.map
new file mode 100644
index 0000000..655c2cf
--- /dev/null
+++ b/doc/html/classqgis_1_1pktools_1_1pksetmask_1_1pksetmask__inherit__graph.map
@@ -0,0 +1,2 @@
+<map id="qgis.pktools.pksetmask.pksetmask" name="qgis.pktools.pksetmask.pksetmask">
+</map>
diff --git a/doc/html/classqgis_1_1pktools_1_1pksetmask_1_1pksetmask__inherit__graph.md5 b/doc/html/classqgis_1_1pktools_1_1pksetmask_1_1pksetmask__inherit__graph.md5
new file mode 100644
index 0000000..c944154
--- /dev/null
+++ b/doc/html/classqgis_1_1pktools_1_1pksetmask_1_1pksetmask__inherit__graph.md5
@@ -0,0 +1 @@
+fd4e090bd4f6765f6023ca57d131081d
\ No newline at end of file
diff --git a/doc/html/classqgis_1_1pktools_1_1pksetmask_1_1pksetmask__inherit__graph.png b/doc/html/classqgis_1_1pktools_1_1pksetmask_1_1pksetmask__inherit__graph.png
new file mode 100644
index 0000000..2fc79db
Binary files /dev/null and b/doc/html/classqgis_1_1pktools_1_1pksetmask_1_1pksetmask__inherit__graph.png differ
diff --git a/doc/html/classqgis_1_1pktools_1_1pksvm_1_1pksvm-members.html b/doc/html/classqgis_1_1pktools_1_1pksvm_1_1pksvm-members.html
new file mode 100644
index 0000000..a335387
--- /dev/null
+++ b/doc/html/classqgis_1_1pktools_1_1pksvm_1_1pksvm-members.html
@@ -0,0 +1,93 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.6"/>
+<title>pktools: Member List</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+  <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
+  <td style="padding-left: 0.5em;">
+   <div id="projectname">pktools
+    <span id="projectnumber">2.6.4</span>
+   </div>
+   <div id="projectbrief">Processing Kernel for geospatial data</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.6 -->
+  <div id="navrow1" class="tabs">
+    <ul class="tablist">
+      <li><a href="index.html"><span>Main Page</span></a></li>
+      <li><a href="pages.html"><span>Related Pages</span></a></li>
+      <li class="current"><a href="annotated.html"><span>Classes</span></a></li>
+      <li><a href="files.html"><span>Files</span></a></li>
+    </ul>
+  </div>
+  <div id="navrow2" class="tabs2">
+    <ul class="tablist">
+      <li><a href="annotated.html"><span>Class List</span></a></li>
+      <li><a href="classes.html"><span>Class Index</span></a></li>
+      <li><a href="inherits.html"><span>Class Hierarchy</span></a></li>
+      <li><a href="functions.html"><span>Class Members</span></a></li>
+    </ul>
+  </div>
+<div id="nav-path" class="navpath">
+  <ul>
+<li class="navelem"><b>qgis</b></li><li class="navelem"><b>pktools</b></li><li class="navelem"><b>pksvm</b></li><li class="navelem"><a class="el" href="classqgis_1_1pktools_1_1pksvm_1_1pksvm.html">pksvm</a></li>  </ul>
+</div>
+</div><!-- top -->
+<div class="header">
+  <div class="headertitle">
+<div class="title">qgis.pktools.pksvm.pksvm Member List</div>  </div>
+</div><!--header-->
+<div class="contents">
+
+<p>This is the complete list of members for <a class="el" href="classqgis_1_1pktools_1_1pksvm_1_1pksvm.html">qgis.pktools.pksvm.pksvm</a>, including all inherited members.</p>
+<table class="directory">
+  <tr bgcolor="#f0f0f0" class="even"><td class="entry"><b>cliName</b> (defined in <a class="el" href="classqgis_1_1pktools_1_1pksvm_1_1pksvm.html">qgis.pktools.pksvm.pksvm</a>)</td><td class="entry"><a class="el" href="classqgis_1_1pktools_1_1pksvm_1_1pksvm.html">qgis.pktools.pksvm.pksvm</a></td><td class="entry"></td></tr>
+  <tr bgcolor="#f0f0f0"><td class="entry"><b>COST</b> (defined in <a class="el" href="classqgis_1_1pktools_1_1pksvm_1_1pksvm.html">qgis.pktools.pksvm.pksvm</a>)</td><td class="entry"><a class="el" href="classqgis_1_1pktools_1_1pksvm_1_1pksvm.html">qgis.pktools.pksvm.pksvm</a></td><td class="entry"><span class="mlabel">static</span></td></tr>
+  <tr bgcolor="#f0f0f0" class="even"><td class="entry"><b>defineCharacteristics</b> (defined in <a class="el" href="classqgis_1_1pktools_1_1pksvm_1_1pksvm.html">qgis.pktools.pksvm.pksvm</a>)</td><td class="entry"><a class="el" href="classqgis_1_1pktools_1_1pksvm_1_1pksvm.html">qgis.pktools.pksvm.pksvm</a></td><td class="entry"></td></tr>
+  <tr bgcolor="#f0f0f0"><td class="entry"><b>EXTRA</b> (defined in <a class="el" href="classqgis_1_1pktools_1_1pksvm_1_1pksvm.html">qgis.pktools.pksvm.pksvm</a>)</td><td class="entry"><a class="el" href="classqgis_1_1pktools_1_1pksvm_1_1pksvm.html">qgis.pktools.pksvm.pksvm</a></td><td class="entry"><span class="mlabel">static</span></td></tr>
+  <tr bgcolor="#f0f0f0" class="even"><td class="entry"><b>GAMMA</b> (defined in <a class="el" href="classqgis_1_1pktools_1_1pksvm_1_1pksvm.html">qgis.pktools.pksvm.pksvm</a>)</td><td class="entry"><a class="el" href="classqgis_1_1pktools_1_1pksvm_1_1pksvm.html">qgis.pktools.pksvm.pksvm</a></td><td class="entry"><span class="mlabel">static</span></td></tr>
+  <tr bgcolor="#f0f0f0"><td class="entry"><b>group</b> (defined in <a class="el" href="classqgis_1_1pktools_1_1pksvm_1_1pksvm.html">qgis.pktools.pksvm.pksvm</a>)</td><td class="entry"><a class="el" href="classqgis_1_1pktools_1_1pksvm_1_1pksvm.html">qgis.pktools.pksvm.pksvm</a></td><td class="entry"></td></tr>
+  <tr bgcolor="#f0f0f0" class="even"><td class="entry"><b>INPUT</b> (defined in <a class="el" href="classqgis_1_1pktools_1_1pksvm_1_1pksvm.html">qgis.pktools.pksvm.pksvm</a>)</td><td class="entry"><a class="el" href="classqgis_1_1pktools_1_1pksvm_1_1pksvm.html">qgis.pktools.pksvm.pksvm</a></td><td class="entry"><span class="mlabel">static</span></td></tr>
+  <tr bgcolor="#f0f0f0"><td class="entry"><b>ITERATE</b> (defined in <a class="el" href="classqgis_1_1pktools_1_1pksvm_1_1pksvm.html">qgis.pktools.pksvm.pksvm</a>)</td><td class="entry"><a class="el" href="classqgis_1_1pktools_1_1pksvm_1_1pksvm.html">qgis.pktools.pksvm.pksvm</a></td><td class="entry"><span class="mlabel">static</span></td></tr>
+  <tr bgcolor="#f0f0f0" class="even"><td class="entry"><b>LABEL</b> (defined in <a class="el" href="classqgis_1_1pktools_1_1pksvm_1_1pksvm.html">qgis.pktools.pksvm.pksvm</a>)</td><td class="entry"><a class="el" href="classqgis_1_1pktools_1_1pksvm_1_1pksvm.html">qgis.pktools.pksvm.pksvm</a></td><td class="entry"><span class="mlabel">static</span></td></tr>
+  <tr bgcolor="#f0f0f0"><td class="entry"><b>MASK</b> (defined in <a class="el" href="classqgis_1_1pktools_1_1pksvm_1_1pksvm.html">qgis.pktools.pksvm.pksvm</a>)</td><td class="entry"><a class="el" href="classqgis_1_1pktools_1_1pksvm_1_1pksvm.html">qgis.pktools.pksvm.pksvm</a></td><td class="entry"><span class="mlabel">static</span></td></tr>
+  <tr bgcolor="#f0f0f0" class="even"><td class="entry"><b>MSKNODATA</b> (defined in <a class="el" href="classqgis_1_1pktools_1_1pksvm_1_1pksvm.html">qgis.pktools.pksvm.pksvm</a>)</td><td class="entry"><a class="el" href="classqgis_1_1pktools_1_1pksvm_1_1pksvm.html">qgis.pktools.pksvm.pksvm</a></td><td class="entry"><span class="mlabel">static</span></td></tr>
+  <tr bgcolor="#f0f0f0"><td class="entry"><b>name</b> (defined in <a class="el" href="classqgis_1_1pktools_1_1pksvm_1_1pksvm.html">qgis.pktools.pksvm.pksvm</a>)</td><td class="entry"><a class="el" href="classqgis_1_1pktools_1_1pksvm_1_1pksvm.html">qgis.pktools.pksvm.pksvm</a></td><td class="entry"></td></tr>
+  <tr bgcolor="#f0f0f0" class="even"><td class="entry"><b>OUTPUT</b> (defined in <a class="el" href="classqgis_1_1pktools_1_1pksvm_1_1pksvm.html">qgis.pktools.pksvm.pksvm</a>)</td><td class="entry"><a class="el" href="classqgis_1_1pktools_1_1pksvm_1_1pksvm.html">qgis.pktools.pksvm.pksvm</a></td><td class="entry"><span class="mlabel">static</span></td></tr>
+  <tr bgcolor="#f0f0f0"><td class="entry"><b>processAlgorithm</b> (defined in <a class="el" href="classqgis_1_1pktools_1_1pksvm_1_1pksvm.html">qgis.pktools.pksvm.pksvm</a>)</td><td class="entry"><a class="el" href="classqgis_1_1pktools_1_1pksvm_1_1pksvm.html">qgis.pktools.pksvm.pksvm</a></td><td class="entry"></td></tr>
+  <tr bgcolor="#f0f0f0" class="even"><td class="entry"><b>TRAINING</b> (defined in <a class="el" href="classqgis_1_1pktools_1_1pksvm_1_1pksvm.html">qgis.pktools.pksvm.pksvm</a>)</td><td class="entry"><a class="el" href="classqgis_1_1pktools_1_1pksvm_1_1pksvm.html">qgis.pktools.pksvm.pksvm</a></td><td class="entry"><span class="mlabel">static</span></td></tr>
+</table></div><!-- contents -->
+<!-- HTML footer for doxygen 1.8.4-->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/>
+</a> 1.8.6
+</small></address>
+<script>
+  (function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
+  (i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
+  m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
+  })(window,document,'script','//www.google-analytics.com/analytics.js','ga');
+  ga('create', 'UA-46952639-1', 'nongnu.org');
+  ga('send', 'pageview');
+</script>
+</body>
+</html>
diff --git a/doc/html/classqgis_1_1pksvm_1_1pksvm.html b/doc/html/classqgis_1_1pktools_1_1pksvm_1_1pksvm.html
similarity index 64%
copy from doc/html/classqgis_1_1pksvm_1_1pksvm.html
copy to doc/html/classqgis_1_1pktools_1_1pksvm_1_1pksvm.html
index f18d2e2..382f565 100644
--- a/doc/html/classqgis_1_1pksvm_1_1pksvm.html
+++ b/doc/html/classqgis_1_1pktools_1_1pksvm_1_1pksvm.html
@@ -4,7 +4,7 @@
 <meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
 <meta http-equiv="X-UA-Compatible" content="IE=9"/>
 <meta name="generator" content="Doxygen 1.8.6"/>
-<title>pktools: qgis.pksvm.pksvm Class Reference</title>
+<title>pktools: qgis.pktools.pksvm.pksvm Class Reference</title>
 <link href="tabs.css" rel="stylesheet" type="text/css"/>
 <script type="text/javascript" src="jquery.js"></script>
 <script type="text/javascript" src="dynsections.js"></script>
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.3</span>
+    <span id="projectnumber">2.6.4</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -47,7 +47,7 @@
   </div>
 <div id="nav-path" class="navpath">
   <ul>
-<li class="navelem"><b>qgis</b></li><li class="navelem"><b>pksvm</b></li><li class="navelem"><a class="el" href="classqgis_1_1pksvm_1_1pksvm.html">pksvm</a></li>  </ul>
+<li class="navelem"><b>qgis</b></li><li class="navelem"><b>pktools</b></li><li class="navelem"><b>pksvm</b></li><li class="navelem"><a class="el" href="classqgis_1_1pktools_1_1pksvm_1_1pksvm.html">pksvm</a></li>  </ul>
 </div>
 </div><!-- top -->
 <div class="header">
@@ -55,87 +55,87 @@
 <a href="#pub-methods">Public Member Functions</a> |
 <a href="#pub-attribs">Public Attributes</a> |
 <a href="#pub-static-attribs">Static Public Attributes</a> |
-<a href="classqgis_1_1pksvm_1_1pksvm-members.html">List of all members</a>  </div>
+<a href="classqgis_1_1pktools_1_1pksvm_1_1pksvm-members.html">List of all members</a>  </div>
   <div class="headertitle">
-<div class="title">qgis.pksvm.pksvm Class Reference</div>  </div>
+<div class="title">qgis.pktools.pksvm.pksvm Class Reference</div>  </div>
 </div><!--header-->
 <div class="contents">
 <div class="dynheader">
-Inheritance diagram for qgis.pksvm.pksvm:</div>
+Inheritance diagram for qgis.pktools.pksvm.pksvm:</div>
 <div class="dyncontent">
-<div class="center"><img src="classqgis_1_1pksvm_1_1pksvm__inherit__graph.png" border="0" usemap="#qgis_8pksvm_8pksvm_inherit__map" alt="Inheritance graph"/></div>
+<div class="center"><img src="classqgis_1_1pktools_1_1pksvm_1_1pksvm__inherit__graph.png" border="0" usemap="#qgis_8pktools_8pksvm_8pksvm_inherit__map" alt="Inheritance graph"/></div>
 <center><span class="legend">[<a href="graph_legend.html">legend</a>]</span></center></div>
 <div class="dynheader">
-Collaboration diagram for qgis.pksvm.pksvm:</div>
+Collaboration diagram for qgis.pktools.pksvm.pksvm:</div>
 <div class="dyncontent">
-<div class="center"><img src="classqgis_1_1pksvm_1_1pksvm__coll__graph.png" border="0" usemap="#qgis_8pksvm_8pksvm_coll__map" alt="Collaboration graph"/></div>
+<div class="center"><img src="classqgis_1_1pktools_1_1pksvm_1_1pksvm__coll__graph.png" border="0" usemap="#qgis_8pktools_8pksvm_8pksvm_coll__map" alt="Collaboration graph"/></div>
 <center><span class="legend">[<a href="graph_legend.html">legend</a>]</span></center></div>
 <table class="memberdecls">
 <tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pub-methods"></a>
 Public Member Functions</h2></td></tr>
-<tr class="memitem:ac0504ade82ce87e0d386db1a50812bf9"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="ac0504ade82ce87e0d386db1a50812bf9"></a>
+<tr class="memitem:af39f9264502b9f57b573d61861e24061"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="af39f9264502b9f57b573d61861e24061"></a>
 def </td><td class="memItemRight" valign="bottom"><b>cliName</b></td></tr>
-<tr class="separator:ac0504ade82ce87e0d386db1a50812bf9"><td class="memSeparator" colspan="2"> </td></tr>
-<tr class="memitem:a2e00e56ee9a56a8f4010913f94e0bdb9"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a2e00e56ee9a56a8f4010913f94e0bdb9"></a>
+<tr class="separator:af39f9264502b9f57b573d61861e24061"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:a64094c02a03a2ba3338dc776fed768d8"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a64094c02a03a2ba3338dc776fed768d8"></a>
 def </td><td class="memItemRight" valign="bottom"><b>defineCharacteristics</b></td></tr>
-<tr class="separator:a2e00e56ee9a56a8f4010913f94e0bdb9"><td class="memSeparator" colspan="2"> </td></tr>
-<tr class="memitem:a9ea8c3f049900620ceebb3b1c3dea838"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a9ea8c3f049900620ceebb3b1c3dea838"></a>
+<tr class="separator:a64094c02a03a2ba3338dc776fed768d8"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:a7d90b3106972788e6776cadb439ef645"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a7d90b3106972788e6776cadb439ef645"></a>
 def </td><td class="memItemRight" valign="bottom"><b>processAlgorithm</b></td></tr>
-<tr class="separator:a9ea8c3f049900620ceebb3b1c3dea838"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="separator:a7d90b3106972788e6776cadb439ef645"><td class="memSeparator" colspan="2"> </td></tr>
 </table><table class="memberdecls">
 <tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pub-attribs"></a>
 Public Attributes</h2></td></tr>
-<tr class="memitem:aa5c7d4dda4c1b0316e26dfb3c8f4cf8f"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="aa5c7d4dda4c1b0316e26dfb3c8f4cf8f"></a>
+<tr class="memitem:ac3e6f06386e8ed665adb2168e57e01a8"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="ac3e6f06386e8ed665adb2168e57e01a8"></a>
  </td><td class="memItemRight" valign="bottom"><b>name</b></td></tr>
-<tr class="separator:aa5c7d4dda4c1b0316e26dfb3c8f4cf8f"><td class="memSeparator" colspan="2"> </td></tr>
-<tr class="memitem:a33cc5cc741eadc78c3fa6687592cd810"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a33cc5cc741eadc78c3fa6687592cd810"></a>
+<tr class="separator:ac3e6f06386e8ed665adb2168e57e01a8"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:aa20dab28c3712708dbd39bf066bfb99c"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="aa20dab28c3712708dbd39bf066bfb99c"></a>
  </td><td class="memItemRight" valign="bottom"><b>group</b></td></tr>
-<tr class="separator:a33cc5cc741eadc78c3fa6687592cd810"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="separator:aa20dab28c3712708dbd39bf066bfb99c"><td class="memSeparator" colspan="2"> </td></tr>
 </table><table class="memberdecls">
 <tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pub-static-attribs"></a>
 Static Public Attributes</h2></td></tr>
-<tr class="memitem:a70980660386dbf0e5a4abbaee81b20b7"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a70980660386dbf0e5a4abbaee81b20b7"></a>
+<tr class="memitem:a449dacc23d9df8747a447f46d9f8295e"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a449dacc23d9df8747a447f46d9f8295e"></a>
 string </td><td class="memItemRight" valign="bottom"><b>INPUT</b> = "INPUT"</td></tr>
-<tr class="separator:a70980660386dbf0e5a4abbaee81b20b7"><td class="memSeparator" colspan="2"> </td></tr>
-<tr class="memitem:a52e9137080458d2fa51683e03d046418"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a52e9137080458d2fa51683e03d046418"></a>
+<tr class="separator:a449dacc23d9df8747a447f46d9f8295e"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:ac4bd65562ba7f52abb53c6fb35e368ca"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="ac4bd65562ba7f52abb53c6fb35e368ca"></a>
 string </td><td class="memItemRight" valign="bottom"><b>TRAINING</b> = "TRAINING"</td></tr>
-<tr class="separator:a52e9137080458d2fa51683e03d046418"><td class="memSeparator" colspan="2"> </td></tr>
-<tr class="memitem:a655f6139a543113d1dd2ad8b11f773b9"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a655f6139a543113d1dd2ad8b11f773b9"></a>
+<tr class="separator:ac4bd65562ba7f52abb53c6fb35e368ca"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:ae80fe946cdd873ff57e05a3a2ed6131b"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="ae80fe946cdd873ff57e05a3a2ed6131b"></a>
 string </td><td class="memItemRight" valign="bottom"><b>ITERATE</b> = "ITERATE"</td></tr>
-<tr class="separator:a655f6139a543113d1dd2ad8b11f773b9"><td class="memSeparator" colspan="2"> </td></tr>
-<tr class="memitem:a426fe91136cb5f3e7ebbeba2c4199501"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a426fe91136cb5f3e7ebbeba2c4199501"></a>
+<tr class="separator:ae80fe946cdd873ff57e05a3a2ed6131b"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:a8a3efb11fd3716fd738991ec2289e2f1"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a8a3efb11fd3716fd738991ec2289e2f1"></a>
 string </td><td class="memItemRight" valign="bottom"><b>LABEL</b> = "LABEL"</td></tr>
-<tr class="separator:a426fe91136cb5f3e7ebbeba2c4199501"><td class="memSeparator" colspan="2"> </td></tr>
-<tr class="memitem:ab6c3b8cccb265ca1cfadeaa79fed04a1"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="ab6c3b8cccb265ca1cfadeaa79fed04a1"></a>
+<tr class="separator:a8a3efb11fd3716fd738991ec2289e2f1"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:a5cb924380f4009fa78a99f0e63a98a22"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a5cb924380f4009fa78a99f0e63a98a22"></a>
 string </td><td class="memItemRight" valign="bottom"><b>GAMMA</b> = "GAMMA"</td></tr>
-<tr class="separator:ab6c3b8cccb265ca1cfadeaa79fed04a1"><td class="memSeparator" colspan="2"> </td></tr>
-<tr class="memitem:ab3ec104ab7505d3115c8aa868b4f8cba"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="ab3ec104ab7505d3115c8aa868b4f8cba"></a>
+<tr class="separator:a5cb924380f4009fa78a99f0e63a98a22"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:af889c66eadaf2a22a56db24c11b6dc2a"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="af889c66eadaf2a22a56db24c11b6dc2a"></a>
 string </td><td class="memItemRight" valign="bottom"><b>COST</b> = "COST"</td></tr>
-<tr class="separator:ab3ec104ab7505d3115c8aa868b4f8cba"><td class="memSeparator" colspan="2"> </td></tr>
-<tr class="memitem:aeb7332c0838e46bfe82b647cb5085700"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="aeb7332c0838e46bfe82b647cb5085700"></a>
+<tr class="separator:af889c66eadaf2a22a56db24c11b6dc2a"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:a81bff218d4c83d0f71a38d81109bd395"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a81bff218d4c83d0f71a38d81109bd395"></a>
 string </td><td class="memItemRight" valign="bottom"><b>OUTPUT</b> = "OUTPUT"</td></tr>
-<tr class="separator:aeb7332c0838e46bfe82b647cb5085700"><td class="memSeparator" colspan="2"> </td></tr>
-<tr class="memitem:a614bbc0b875b73667749b0e58d89fc54"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a614bbc0b875b73667749b0e58d89fc54"></a>
+<tr class="separator:a81bff218d4c83d0f71a38d81109bd395"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:a749c2182f8ab095d690e08951156f695"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a749c2182f8ab095d690e08951156f695"></a>
 string </td><td class="memItemRight" valign="bottom"><b>MASK</b> = "MASK"</td></tr>
-<tr class="separator:a614bbc0b875b73667749b0e58d89fc54"><td class="memSeparator" colspan="2"> </td></tr>
-<tr class="memitem:a63e8acd9ffce30910af0eed869439190"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a63e8acd9ffce30910af0eed869439190"></a>
+<tr class="separator:a749c2182f8ab095d690e08951156f695"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:a986be02b97ec4cc26f00ea4dd9c878ff"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a986be02b97ec4cc26f00ea4dd9c878ff"></a>
 string </td><td class="memItemRight" valign="bottom"><b>MSKNODATA</b> = "MSKNODATA"</td></tr>
-<tr class="separator:a63e8acd9ffce30910af0eed869439190"><td class="memSeparator" colspan="2"> </td></tr>
-<tr class="memitem:aead41106feadc1f8d3078aa839df4f79"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="aead41106feadc1f8d3078aa839df4f79"></a>
+<tr class="separator:a986be02b97ec4cc26f00ea4dd9c878ff"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:aea279cd6acf26d72a740aa6a8149b6fe"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="aea279cd6acf26d72a740aa6a8149b6fe"></a>
 string </td><td class="memItemRight" valign="bottom"><b>EXTRA</b> = 'EXTRA'</td></tr>
-<tr class="separator:aead41106feadc1f8d3078aa839df4f79"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="separator:aea279cd6acf26d72a740aa6a8149b6fe"><td class="memSeparator" colspan="2"> </td></tr>
 </table>
 <a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
 <div class="textblock">
-<p>Definition at line <a class="el" href="pksvm_8py_source.html#l00039">39</a> of file <a class="el" href="pksvm_8py_source.html">pksvm.py</a>.</p>
+<p>Definition at line <a class="el" href="pktools_2pksvm_8py_source.html#l00039">39</a> of file <a class="el" href="pktools_2pksvm_8py_source.html">pksvm.py</a>.</p>
 </div><hr/>The documentation for this class was generated from the following file:<ul>
-<li>/home/kempenep/pktools/qgis/<a class="el" href="pksvm_8py_source.html">pksvm.py</a></li>
+<li>/home/kempenep/pktools/qgis/pktools/<a class="el" href="pktools_2pksvm_8py_source.html">pksvm.py</a></li>
 </ul>
 </div><!-- contents -->
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Jun 23 2015 17:09:37 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/classqgis_1_1pktools_1_1pksvm_1_1pksvm__coll__graph.map b/doc/html/classqgis_1_1pktools_1_1pksvm_1_1pksvm__coll__graph.map
new file mode 100644
index 0000000..1986620
--- /dev/null
+++ b/doc/html/classqgis_1_1pktools_1_1pksvm_1_1pksvm__coll__graph.map
@@ -0,0 +1,2 @@
+<map id="qgis.pktools.pksvm.pksvm" name="qgis.pktools.pksvm.pksvm">
+</map>
diff --git a/doc/html/classqgis_1_1pktools_1_1pksvm_1_1pksvm__coll__graph.md5 b/doc/html/classqgis_1_1pktools_1_1pksvm_1_1pksvm__coll__graph.md5
new file mode 100644
index 0000000..fde0182
--- /dev/null
+++ b/doc/html/classqgis_1_1pktools_1_1pksvm_1_1pksvm__coll__graph.md5
@@ -0,0 +1 @@
+2ccee9e3c7ca2e8bb6385bb7d490defd
\ No newline at end of file
diff --git a/doc/html/classqgis_1_1pktools_1_1pksvm_1_1pksvm__coll__graph.png b/doc/html/classqgis_1_1pktools_1_1pksvm_1_1pksvm__coll__graph.png
new file mode 100644
index 0000000..04772b0
Binary files /dev/null and b/doc/html/classqgis_1_1pktools_1_1pksvm_1_1pksvm__coll__graph.png differ
diff --git a/doc/html/classqgis_1_1pktools_1_1pksvm_1_1pksvm__inherit__graph.map b/doc/html/classqgis_1_1pktools_1_1pksvm_1_1pksvm__inherit__graph.map
new file mode 100644
index 0000000..1986620
--- /dev/null
+++ b/doc/html/classqgis_1_1pktools_1_1pksvm_1_1pksvm__inherit__graph.map
@@ -0,0 +1,2 @@
+<map id="qgis.pktools.pksvm.pksvm" name="qgis.pktools.pksvm.pksvm">
+</map>
diff --git a/doc/html/classqgis_1_1pktools_1_1pksvm_1_1pksvm__inherit__graph.md5 b/doc/html/classqgis_1_1pktools_1_1pksvm_1_1pksvm__inherit__graph.md5
new file mode 100644
index 0000000..fde0182
--- /dev/null
+++ b/doc/html/classqgis_1_1pktools_1_1pksvm_1_1pksvm__inherit__graph.md5
@@ -0,0 +1 @@
+2ccee9e3c7ca2e8bb6385bb7d490defd
\ No newline at end of file
diff --git a/doc/html/classqgis_1_1pktools_1_1pksvm_1_1pksvm__inherit__graph.png b/doc/html/classqgis_1_1pktools_1_1pksvm_1_1pksvm__inherit__graph.png
new file mode 100644
index 0000000..04772b0
Binary files /dev/null and b/doc/html/classqgis_1_1pktools_1_1pksvm_1_1pksvm__inherit__graph.png differ
diff --git a/doc/html/classqgis_1_1pktoolsAlgorithm_1_1pktoolsAlgorithm-members.html b/doc/html/classqgis_1_1pktools_1_1pktoolsAlgorithm_1_1pktoolsAlgorithm-members.html
similarity index 65%
copy from doc/html/classqgis_1_1pktoolsAlgorithm_1_1pktoolsAlgorithm-members.html
copy to doc/html/classqgis_1_1pktools_1_1pktoolsAlgorithm_1_1pktoolsAlgorithm-members.html
index 1492558..326093c 100644
--- a/doc/html/classqgis_1_1pktoolsAlgorithm_1_1pktoolsAlgorithm-members.html
+++ b/doc/html/classqgis_1_1pktools_1_1pktoolsAlgorithm_1_1pktoolsAlgorithm-members.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.3</span>
+    <span id="projectnumber">2.6.4</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -47,25 +47,25 @@
   </div>
 <div id="nav-path" class="navpath">
   <ul>
-<li class="navelem"><b>qgis</b></li><li class="navelem"><b>pktoolsAlgorithm</b></li><li class="navelem"><a class="el" href="classqgis_1_1pktoolsAlgorithm_1_1pktoolsAlgorithm.html">pktoolsAlgorithm</a></li>  </ul>
+<li class="navelem"><b>qgis</b></li><li class="navelem"><b>pktools</b></li><li class="navelem"><b>pktoolsAlgorithm</b></li><li class="navelem"><a class="el" href="classqgis_1_1pktools_1_1pktoolsAlgorithm_1_1pktoolsAlgorithm.html">pktoolsAlgorithm</a></li>  </ul>
 </div>
 </div><!-- top -->
 <div class="header">
   <div class="headertitle">
-<div class="title">qgis.pktoolsAlgorithm.pktoolsAlgorithm Member List</div>  </div>
+<div class="title">qgis.pktools.pktoolsAlgorithm.pktoolsAlgorithm Member List</div>  </div>
 </div><!--header-->
 <div class="contents">
 
-<p>This is the complete list of members for <a class="el" href="classqgis_1_1pktoolsAlgorithm_1_1pktoolsAlgorithm.html">qgis.pktoolsAlgorithm.pktoolsAlgorithm</a>, including all inherited members.</p>
+<p>This is the complete list of members for <a class="el" href="classqgis_1_1pktools_1_1pktoolsAlgorithm_1_1pktoolsAlgorithm.html">qgis.pktools.pktoolsAlgorithm.pktoolsAlgorithm</a>, including all inherited members.</p>
 <table class="directory">
-  <tr bgcolor="#f0f0f0" class="even"><td class="entry"><b>checkBeforeOpeningParametersDialog</b> (defined in <a class="el" href="classqgis_1_1pktoolsAlgorithm_1_1pktoolsAlgorithm.html">qgis.pktoolsAlgorithm.pktoolsAlgorithm</a>)</td><td class="entry"><a class="el" href="classqgis_1_1pktoolsAlgorithm_1_1pktoolsAlgorithm.html">qgis.pktoolsAlgorithm.pktoolsAlgorithm</a></td><td class="entry"></td></tr>
-  <tr bgcolor="#f0f0f0"><td class="entry"><b>getIcon</b> (defined in <a class="el" href="classqgis_1_1pktoolsAlgorithm_1_1pktoolsAlgorithm.html">qgis.pktoolsAlgorithm.pktoolsAlgorithm</a>)</td><td class="entry"><a class="el" href="classqgis_1_1pktoolsAlgorithm_1_1pktoolsAlgorithm.html">qgis.pktoolsAlgorithm.pktoolsAlgorithm</a></td><td class="entry"></td></tr>
-  <tr bgcolor="#f0f0f0" class="even"><td class="entry"><b>help</b> (defined in <a class="el" href="classqgis_1_1pktoolsAlgorithm_1_1pktoolsAlgorithm.html">qgis.pktoolsAlgorithm.pktoolsAlgorithm</a>)</td><td class="entry"><a class="el" href="classqgis_1_1pktoolsAlgorithm_1_1pktoolsAlgorithm.html">qgis.pktoolsAlgorithm.pktoolsAlgorithm</a></td><td class="entry"></td></tr>
+  <tr bgcolor="#f0f0f0" class="even"><td class="entry"><b>checkBeforeOpeningParametersDialog</b> (defined in <a class="el" href="classqgis_1_1pktools_1_1pktoolsAlgorithm_1_1pktoolsAlgorithm.html">qgis.pktools.pktoolsAlgorithm.pktoolsAlgorithm</a>)</td><td class="entry"><a class="el" href="classqgis_1_1pktools_1_1pktoolsAlgorithm_1_1pktoolsAlgorithm.html">qgis.pktools.pktoolsAlgorithm.pktoolsAlgorithm</a></td><td class="entry"></td></tr>
+  <tr bgcolor="#f0f0f0"><td class="entry"><b>getIcon</b> (defined in <a class="el" href="classqgis_1_1pktools_1_1pktoolsAlgorithm_1_1pktoolsAlgorithm.html">qgis.pktools.pktoolsAlgorithm.pktoolsAlgorithm</a>)</td><td class="entry"><a class="el" href="classqgis_1_1pktools_1_1pktoolsAlgorithm_1_1pktoolsAlgorithm.html">qgis.pktools.pktoolsAlgorithm.pktoolsAlgorithm</a></td><td class="entry"></td></tr>
+  <tr bgcolor="#f0f0f0" class="even"><td class="entry"><b>help</b> (defined in <a class="el" href="classqgis_1_1pktools_1_1pktoolsAlgorithm_1_1pktoolsAlgorithm.html">qgis.pktools.pktoolsAlgorithm.pktoolsAlgorithm</a>)</td><td class="entry"><a class="el" href="classqgis_1_1pktools_1_1pktoolsAlgorithm_1_1pktoolsAlgorithm.html">qgis.pktools.pktoolsAlgorithm.pktoolsAlgorithm</a></td><td class="entry"></td></tr>
 </table></div><!-- contents -->
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Jun 23 2015 17:09:37 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/classqgis_1_1pktoolsAlgorithm_1_1pktoolsAlgorithm.html b/doc/html/classqgis_1_1pktools_1_1pktoolsAlgorithm_1_1pktoolsAlgorithm.html
similarity index 65%
copy from doc/html/classqgis_1_1pktoolsAlgorithm_1_1pktoolsAlgorithm.html
copy to doc/html/classqgis_1_1pktools_1_1pktoolsAlgorithm_1_1pktoolsAlgorithm.html
index a6c6e6c..6f543c5 100644
--- a/doc/html/classqgis_1_1pktoolsAlgorithm_1_1pktoolsAlgorithm.html
+++ b/doc/html/classqgis_1_1pktools_1_1pktoolsAlgorithm_1_1pktoolsAlgorithm.html
@@ -4,7 +4,7 @@
 <meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
 <meta http-equiv="X-UA-Compatible" content="IE=9"/>
 <meta name="generator" content="Doxygen 1.8.6"/>
-<title>pktools: qgis.pktoolsAlgorithm.pktoolsAlgorithm Class Reference</title>
+<title>pktools: qgis.pktools.pktoolsAlgorithm.pktoolsAlgorithm Class Reference</title>
 <link href="tabs.css" rel="stylesheet" type="text/css"/>
 <script type="text/javascript" src="jquery.js"></script>
 <script type="text/javascript" src="dynsections.js"></script>
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.3</span>
+    <span id="projectnumber">2.6.4</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -47,51 +47,51 @@
   </div>
 <div id="nav-path" class="navpath">
   <ul>
-<li class="navelem"><b>qgis</b></li><li class="navelem"><b>pktoolsAlgorithm</b></li><li class="navelem"><a class="el" href="classqgis_1_1pktoolsAlgorithm_1_1pktoolsAlgorithm.html">pktoolsAlgorithm</a></li>  </ul>
+<li class="navelem"><b>qgis</b></li><li class="navelem"><b>pktools</b></li><li class="navelem"><b>pktoolsAlgorithm</b></li><li class="navelem"><a class="el" href="classqgis_1_1pktools_1_1pktoolsAlgorithm_1_1pktoolsAlgorithm.html">pktoolsAlgorithm</a></li>  </ul>
 </div>
 </div><!-- top -->
 <div class="header">
   <div class="summary">
 <a href="#pub-methods">Public Member Functions</a> |
-<a href="classqgis_1_1pktoolsAlgorithm_1_1pktoolsAlgorithm-members.html">List of all members</a>  </div>
+<a href="classqgis_1_1pktools_1_1pktoolsAlgorithm_1_1pktoolsAlgorithm-members.html">List of all members</a>  </div>
   <div class="headertitle">
-<div class="title">qgis.pktoolsAlgorithm.pktoolsAlgorithm Class Reference</div>  </div>
+<div class="title">qgis.pktools.pktoolsAlgorithm.pktoolsAlgorithm Class Reference</div>  </div>
 </div><!--header-->
 <div class="contents">
 <div class="dynheader">
-Inheritance diagram for qgis.pktoolsAlgorithm.pktoolsAlgorithm:</div>
+Inheritance diagram for qgis.pktools.pktoolsAlgorithm.pktoolsAlgorithm:</div>
 <div class="dyncontent">
-<div class="center"><img src="classqgis_1_1pktoolsAlgorithm_1_1pktoolsAlgorithm__inherit__graph.png" border="0" usemap="#qgis_8pktoolsAlgorithm_8pktoolsAlgorithm_inherit__map" alt="Inheritance graph"/></div>
+<div class="center"><img src="classqgis_1_1pktools_1_1pktoolsAlgorithm_1_1pktoolsAlgorithm__inherit__graph.png" border="0" usemap="#qgis_8pktools_8pktoolsAlgorithm_8pktoolsAlgorithm_inherit__map" alt="Inheritance graph"/></div>
 <center><span class="legend">[<a href="graph_legend.html">legend</a>]</span></center></div>
 <div class="dynheader">
-Collaboration diagram for qgis.pktoolsAlgorithm.pktoolsAlgorithm:</div>
+Collaboration diagram for qgis.pktools.pktoolsAlgorithm.pktoolsAlgorithm:</div>
 <div class="dyncontent">
-<div class="center"><img src="classqgis_1_1pktoolsAlgorithm_1_1pktoolsAlgorithm__coll__graph.png" border="0" usemap="#qgis_8pktoolsAlgorithm_8pktoolsAlgorithm_coll__map" alt="Collaboration graph"/></div>
+<div class="center"><img src="classqgis_1_1pktools_1_1pktoolsAlgorithm_1_1pktoolsAlgorithm__coll__graph.png" border="0" usemap="#qgis_8pktools_8pktoolsAlgorithm_8pktoolsAlgorithm_coll__map" alt="Collaboration graph"/></div>
 <center><span class="legend">[<a href="graph_legend.html">legend</a>]</span></center></div>
 <table class="memberdecls">
 <tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pub-methods"></a>
 Public Member Functions</h2></td></tr>
-<tr class="memitem:ac070faf19453a2d75e8cc14f7be097f8"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="ac070faf19453a2d75e8cc14f7be097f8"></a>
+<tr class="memitem:ac652ef4b9cf5a6b0318230209c127ba4"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="ac652ef4b9cf5a6b0318230209c127ba4"></a>
 def </td><td class="memItemRight" valign="bottom"><b>getIcon</b></td></tr>
-<tr class="separator:ac070faf19453a2d75e8cc14f7be097f8"><td class="memSeparator" colspan="2"> </td></tr>
-<tr class="memitem:a38a2a21e8672ffe7f9533c0a144b7053"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a38a2a21e8672ffe7f9533c0a144b7053"></a>
+<tr class="separator:ac652ef4b9cf5a6b0318230209c127ba4"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:a51ba8b742dd75bedd67749accfd7c8d5"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a51ba8b742dd75bedd67749accfd7c8d5"></a>
 def </td><td class="memItemRight" valign="bottom"><b>checkBeforeOpeningParametersDialog</b></td></tr>
-<tr class="separator:a38a2a21e8672ffe7f9533c0a144b7053"><td class="memSeparator" colspan="2"> </td></tr>
-<tr class="memitem:a758e81a12a427104dd46f9574115918c"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a758e81a12a427104dd46f9574115918c"></a>
+<tr class="separator:a51ba8b742dd75bedd67749accfd7c8d5"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:a1b82ca165baf14de65d194a55bb2d109"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a1b82ca165baf14de65d194a55bb2d109"></a>
 def </td><td class="memItemRight" valign="bottom"><b>help</b></td></tr>
-<tr class="separator:a758e81a12a427104dd46f9574115918c"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="separator:a1b82ca165baf14de65d194a55bb2d109"><td class="memSeparator" colspan="2"> </td></tr>
 </table>
 <a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
 <div class="textblock">
-<p>Definition at line <a class="el" href="pktoolsAlgorithm_8py_source.html#l00041">41</a> of file <a class="el" href="pktoolsAlgorithm_8py_source.html">pktoolsAlgorithm.py</a>.</p>
+<p>Definition at line <a class="el" href="pktools_2pktoolsAlgorithm_8py_source.html#l00041">41</a> of file <a class="el" href="pktools_2pktoolsAlgorithm_8py_source.html">pktoolsAlgorithm.py</a>.</p>
 </div><hr/>The documentation for this class was generated from the following file:<ul>
-<li>/home/kempenep/pktools/qgis/<a class="el" href="pktoolsAlgorithm_8py_source.html">pktoolsAlgorithm.py</a></li>
+<li>/home/kempenep/pktools/qgis/pktools/<a class="el" href="pktools_2pktoolsAlgorithm_8py_source.html">pktoolsAlgorithm.py</a></li>
 </ul>
 </div><!-- contents -->
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Jun 23 2015 17:09:37 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/classqgis_1_1pktools_1_1pktoolsAlgorithm_1_1pktoolsAlgorithm__coll__graph.map b/doc/html/classqgis_1_1pktools_1_1pktoolsAlgorithm_1_1pktoolsAlgorithm__coll__graph.map
new file mode 100644
index 0000000..829bbaa
--- /dev/null
+++ b/doc/html/classqgis_1_1pktools_1_1pktoolsAlgorithm_1_1pktoolsAlgorithm__coll__graph.map
@@ -0,0 +1,2 @@
+<map id="qgis.pktools.pktoolsAlgorithm.pktoolsAlgorithm" name="qgis.pktools.pktoolsAlgorithm.pktoolsAlgorithm">
+</map>
diff --git a/doc/html/classqgis_1_1pktools_1_1pktoolsAlgorithm_1_1pktoolsAlgorithm__coll__graph.md5 b/doc/html/classqgis_1_1pktools_1_1pktoolsAlgorithm_1_1pktoolsAlgorithm__coll__graph.md5
new file mode 100644
index 0000000..c5db4f4
--- /dev/null
+++ b/doc/html/classqgis_1_1pktools_1_1pktoolsAlgorithm_1_1pktoolsAlgorithm__coll__graph.md5
@@ -0,0 +1 @@
+e6760bfbce67e55c523cf5ac056d08d1
\ No newline at end of file
diff --git a/doc/html/classqgis_1_1pktools_1_1pktoolsAlgorithm_1_1pktoolsAlgorithm__coll__graph.png b/doc/html/classqgis_1_1pktools_1_1pktoolsAlgorithm_1_1pktoolsAlgorithm__coll__graph.png
new file mode 100644
index 0000000..2d321dc
Binary files /dev/null and b/doc/html/classqgis_1_1pktools_1_1pktoolsAlgorithm_1_1pktoolsAlgorithm__coll__graph.png differ
diff --git a/doc/html/classqgis_1_1pktoolsUtils_1_1pktoolsUtils-members.html b/doc/html/classqgis_1_1pktools_1_1pktoolsUtils_1_1pktoolsUtils-members.html
similarity index 66%
copy from doc/html/classqgis_1_1pktoolsUtils_1_1pktoolsUtils-members.html
copy to doc/html/classqgis_1_1pktools_1_1pktoolsUtils_1_1pktoolsUtils-members.html
index 2617f59..cba2b33 100644
--- a/doc/html/classqgis_1_1pktoolsUtils_1_1pktoolsUtils-members.html
+++ b/doc/html/classqgis_1_1pktools_1_1pktoolsUtils_1_1pktoolsUtils-members.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.3</span>
+    <span id="projectnumber">2.6.4</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -47,25 +47,25 @@
   </div>
 <div id="nav-path" class="navpath">
   <ul>
-<li class="navelem"><b>qgis</b></li><li class="navelem"><b>pktoolsUtils</b></li><li class="navelem"><a class="el" href="classqgis_1_1pktoolsUtils_1_1pktoolsUtils.html">pktoolsUtils</a></li>  </ul>
+<li class="navelem"><b>qgis</b></li><li class="navelem"><b>pktools</b></li><li class="navelem"><b>pktoolsUtils</b></li><li class="navelem"><a class="el" href="classqgis_1_1pktools_1_1pktoolsUtils_1_1pktoolsUtils.html">pktoolsUtils</a></li>  </ul>
 </div>
 </div><!-- top -->
 <div class="header">
   <div class="headertitle">
-<div class="title">qgis.pktoolsUtils.pktoolsUtils Member List</div>  </div>
+<div class="title">qgis.pktools.pktoolsUtils.pktoolsUtils Member List</div>  </div>
 </div><!--header-->
 <div class="contents">
 
-<p>This is the complete list of members for <a class="el" href="classqgis_1_1pktoolsUtils_1_1pktoolsUtils.html">qgis.pktoolsUtils.pktoolsUtils</a>, including all inherited members.</p>
+<p>This is the complete list of members for <a class="el" href="classqgis_1_1pktools_1_1pktoolsUtils_1_1pktoolsUtils.html">qgis.pktools.pktoolsUtils.pktoolsUtils</a>, including all inherited members.</p>
 <table class="directory">
-  <tr bgcolor="#f0f0f0" class="even"><td class="entry"><b>PKTOOLS_FOLDER</b> (defined in <a class="el" href="classqgis_1_1pktoolsUtils_1_1pktoolsUtils.html">qgis.pktoolsUtils.pktoolsUtils</a>)</td><td class="entry"><a class="el" href="classqgis_1_1pktoolsUtils_1_1pktoolsUtils.html">qgis.pktoolsUtils.pktoolsUtils</a></td><td class="entry"><span class="mlabel">static</span></td></tr>
-  <tr bgcolor="#f0f0f0"><td class="entry"><b>pktoolsPath</b> (defined in <a class="el" href="classqgis_1_1pktoolsUtils_1_1pktoolsUtils.html">qgis.pktoolsUtils.pktoolsUtils</a>)</td><td class="entry"><a class="el" href="classqgis_1_1pktoolsUtils_1_1pktoolsUtils.html">qgis.pktoolsUtils.pktoolsUtils</a></td><td class="entry"><span class="mlabel">static</span></td></tr>
-  <tr bgcolor="#f0f0f0" class="even"><td class="entry"><b>runpktools</b> (defined in <a class="el" href="classqgis_1_1pktoolsUtils_1_1pktoolsUtils.html">qgis.pktoolsUtils.pktoolsUtils</a>)</td><td class="entry"><a class="el" href="classqgis_1_1pktoolsUtils_1_1pktoolsUtils.html">qgis.pktoolsUtils.pktoolsUtils</a></td><td class="entry"><span class="mlabel">static</span></td></tr>
+  <tr bgcolor="#f0f0f0" class="even"><td class="entry"><b>PKTOOLS_FOLDER</b> (defined in <a class="el" href="classqgis_1_1pktools_1_1pktoolsUtils_1_1pktoolsUtils.html">qgis.pktools.pktoolsUtils.pktoolsUtils</a>)</td><td class="entry"><a class="el" href="classqgis_1_1pktools_1_1pktoolsUtils_1_1pktoolsUtils.html">qgis.pktools.pktoolsUtils.pktoolsUtils</a></td><td class="entry"><span class="mlabel">static</span></td></tr>
+  <tr bgcolor="#f0f0f0"><td class="entry"><b>pktoolsPath</b> (defined in <a class="el" href="classqgis_1_1pktools_1_1pktoolsUtils_1_1pktoolsUtils.html">qgis.pktools.pktoolsUtils.pktoolsUtils</a>)</td><td class="entry"><a class="el" href="classqgis_1_1pktools_1_1pktoolsUtils_1_1pktoolsUtils.html">qgis.pktools.pktoolsUtils.pktoolsUtils</a></td><td class="entry"><span class="mlabel">static</span></td></tr>
+  <tr bgcolor="#f0f0f0" class="even"><td class="entry"><b>runpktools</b> (defined in <a class="el" href="classqgis_1_1pktools_1_1pktoolsUtils_1_1pktoolsUtils.html">qgis.pktools.pktoolsUtils.pktoolsUtils</a>)</td><td class="entry"><a class="el" href="classqgis_1_1pktools_1_1pktoolsUtils_1_1pktoolsUtils.html">qgis.pktools.pktoolsUtils.pktoolsUtils</a></td><td class="entry"><span class="mlabel">static</span></td></tr>
 </table></div><!-- contents -->
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Jun 23 2015 17:09:37 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/classqgis_1_1pktoolsUtils_1_1pktoolsUtils.html b/doc/html/classqgis_1_1pktools_1_1pktoolsUtils_1_1pktoolsUtils.html
similarity index 73%
copy from doc/html/classqgis_1_1pktoolsUtils_1_1pktoolsUtils.html
copy to doc/html/classqgis_1_1pktools_1_1pktoolsUtils_1_1pktoolsUtils.html
index 755314c..32035e0 100644
--- a/doc/html/classqgis_1_1pktoolsUtils_1_1pktoolsUtils.html
+++ b/doc/html/classqgis_1_1pktools_1_1pktoolsUtils_1_1pktoolsUtils.html
@@ -4,7 +4,7 @@
 <meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
 <meta http-equiv="X-UA-Compatible" content="IE=9"/>
 <meta name="generator" content="Doxygen 1.8.6"/>
-<title>pktools: qgis.pktoolsUtils.pktoolsUtils Class Reference</title>
+<title>pktools: qgis.pktools.pktoolsUtils.pktoolsUtils Class Reference</title>
 <link href="tabs.css" rel="stylesheet" type="text/css"/>
 <script type="text/javascript" src="jquery.js"></script>
 <script type="text/javascript" src="dynsections.js"></script>
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.3</span>
+    <span id="projectnumber">2.6.4</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -47,45 +47,45 @@
   </div>
 <div id="nav-path" class="navpath">
   <ul>
-<li class="navelem"><b>qgis</b></li><li class="navelem"><b>pktoolsUtils</b></li><li class="navelem"><a class="el" href="classqgis_1_1pktoolsUtils_1_1pktoolsUtils.html">pktoolsUtils</a></li>  </ul>
+<li class="navelem"><b>qgis</b></li><li class="navelem"><b>pktools</b></li><li class="navelem"><b>pktoolsUtils</b></li><li class="navelem"><a class="el" href="classqgis_1_1pktools_1_1pktoolsUtils_1_1pktoolsUtils.html">pktoolsUtils</a></li>  </ul>
 </div>
 </div><!-- top -->
 <div class="header">
   <div class="summary">
 <a href="#pub-static-methods">Static Public Member Functions</a> |
 <a href="#pub-static-attribs">Static Public Attributes</a> |
-<a href="classqgis_1_1pktoolsUtils_1_1pktoolsUtils-members.html">List of all members</a>  </div>
+<a href="classqgis_1_1pktools_1_1pktoolsUtils_1_1pktoolsUtils-members.html">List of all members</a>  </div>
   <div class="headertitle">
-<div class="title">qgis.pktoolsUtils.pktoolsUtils Class Reference</div>  </div>
+<div class="title">qgis.pktools.pktoolsUtils.pktoolsUtils Class Reference</div>  </div>
 </div><!--header-->
 <div class="contents">
 <table class="memberdecls">
 <tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pub-static-methods"></a>
 Static Public Member Functions</h2></td></tr>
-<tr class="memitem:ac38a2b2844a2bca6054bdf3cb8a6d526"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="ac38a2b2844a2bca6054bdf3cb8a6d526"></a>
+<tr class="memitem:a478ecd4ffbf3bb233f532743dd589ea0"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a478ecd4ffbf3bb233f532743dd589ea0"></a>
 def </td><td class="memItemRight" valign="bottom"><b>pktoolsPath</b></td></tr>
-<tr class="separator:ac38a2b2844a2bca6054bdf3cb8a6d526"><td class="memSeparator" colspan="2"> </td></tr>
-<tr class="memitem:a41b06e387849095ea42740a64edf5ceb"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a41b06e387849095ea42740a64edf5ceb"></a>
+<tr class="separator:a478ecd4ffbf3bb233f532743dd589ea0"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:a1f658a8f9a0a6ef8aa58be57ad07b156"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a1f658a8f9a0a6ef8aa58be57ad07b156"></a>
 def </td><td class="memItemRight" valign="bottom"><b>runpktools</b></td></tr>
-<tr class="separator:a41b06e387849095ea42740a64edf5ceb"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="separator:a1f658a8f9a0a6ef8aa58be57ad07b156"><td class="memSeparator" colspan="2"> </td></tr>
 </table><table class="memberdecls">
 <tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pub-static-attribs"></a>
 Static Public Attributes</h2></td></tr>
-<tr class="memitem:ab86e76240bd3e4d9f05be1abf84ea435"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="ab86e76240bd3e4d9f05be1abf84ea435"></a>
+<tr class="memitem:a88bdfaa9d7e469f7d554cda523d2354a"><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a88bdfaa9d7e469f7d554cda523d2354a"></a>
 string </td><td class="memItemRight" valign="bottom"><b>PKTOOLS_FOLDER</b> = "PKTOOLS_FOLDER"</td></tr>
-<tr class="separator:ab86e76240bd3e4d9f05be1abf84ea435"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="separator:a88bdfaa9d7e469f7d554cda523d2354a"><td class="memSeparator" colspan="2"> </td></tr>
 </table>
 <a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
 <div class="textblock">
-<p>Definition at line <a class="el" href="pktoolsUtils_8py_source.html#l00035">35</a> of file <a class="el" href="pktoolsUtils_8py_source.html">pktoolsUtils.py</a>.</p>
+<p>Definition at line <a class="el" href="pktools_2pktoolsUtils_8py_source.html#l00035">35</a> of file <a class="el" href="pktools_2pktoolsUtils_8py_source.html">pktoolsUtils.py</a>.</p>
 </div><hr/>The documentation for this class was generated from the following file:<ul>
-<li>/home/kempenep/pktools/qgis/<a class="el" href="pktoolsUtils_8py_source.html">pktoolsUtils.py</a></li>
+<li>/home/kempenep/pktools/qgis/pktools/<a class="el" href="pktools_2pktoolsUtils_8py_source.html">pktoolsUtils.py</a></li>
 </ul>
 </div><!-- contents -->
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Jun 23 2015 17:09:37 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/classstatfactory_1_1StatFactory-members.html b/doc/html/classstatfactory_1_1StatFactory-members.html
index 7d46491..d95cc52 100644
--- a/doc/html/classstatfactory_1_1StatFactory-members.html
+++ b/doc/html/classstatfactory_1_1StatFactory-members.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.3</span>
+    <span id="projectnumber">2.6.4</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -145,7 +145,7 @@
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Jun 23 2015 17:09:37 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/classstatfactory_1_1StatFactory.html b/doc/html/classstatfactory_1_1StatFactory.html
index 918018a..78cad13 100644
--- a/doc/html/classstatfactory_1_1StatFactory.html
+++ b/doc/html/classstatfactory_1_1StatFactory.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.3</span>
+    <span id="projectnumber">2.6.4</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -363,7 +363,7 @@ static gsl_rng * </td><td class="memItemRight" valign="bottom"><b>getRandom
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Jun 23 2015 17:09:37 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/config_8h_source.html b/doc/html/config_8h_source.html
index af786af..a879b62 100644
--- a/doc/html/config_8h_source.html
+++ b/doc/html/config_8h_source.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.3</span>
+    <span id="projectnumber">2.6.4</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -110,7 +110,7 @@
 <div class="line"><a name="l00060"></a><span class="lineno">   60</span> <span class="preprocessor">#define PACKAGE_NAME "pktools"</span></div>
 <div class="line"><a name="l00061"></a><span class="lineno">   61</span> <span class="preprocessor"></span></div>
 <div class="line"><a name="l00062"></a><span class="lineno">   62</span> <span class="comment">/* Define to the full name and version of this package. */</span></div>
-<div class="line"><a name="l00063"></a><span class="lineno">   63</span> <span class="preprocessor">#define PACKAGE_STRING "pktools 2.6.4"</span></div>
+<div class="line"><a name="l00063"></a><span class="lineno">   63</span> <span class="preprocessor">#define PACKAGE_STRING "pktools 2.6.5"</span></div>
 <div class="line"><a name="l00064"></a><span class="lineno">   64</span> <span class="preprocessor"></span></div>
 <div class="line"><a name="l00065"></a><span class="lineno">   65</span> <span class="comment">/* Define to the one symbol short name of this package. */</span></div>
 <div class="line"><a name="l00066"></a><span class="lineno">   66</span> <span class="preprocessor">#define PACKAGE_TARNAME "pktools"</span></div>
@@ -119,13 +119,13 @@
 <div class="line"><a name="l00069"></a><span class="lineno">   69</span> <span class="preprocessor">#define PACKAGE_URL ""</span></div>
 <div class="line"><a name="l00070"></a><span class="lineno">   70</span> <span class="preprocessor"></span></div>
 <div class="line"><a name="l00071"></a><span class="lineno">   71</span> <span class="comment">/* Define to the version of this package. */</span></div>
-<div class="line"><a name="l00072"></a><span class="lineno">   72</span> <span class="preprocessor">#define PACKAGE_VERSION "2.6.4"</span></div>
+<div class="line"><a name="l00072"></a><span class="lineno">   72</span> <span class="preprocessor">#define PACKAGE_VERSION "2.6.5"</span></div>
 <div class="line"><a name="l00073"></a><span class="lineno">   73</span> <span class="preprocessor"></span></div>
 <div class="line"><a name="l00074"></a><span class="lineno">   74</span> <span class="comment">/* Define to 1 if you have the ANSI C header files. */</span></div>
 <div class="line"><a name="l00075"></a><span class="lineno">   75</span> <span class="preprocessor">#define STDC_HEADERS 1</span></div>
 <div class="line"><a name="l00076"></a><span class="lineno">   76</span> <span class="preprocessor"></span></div>
 <div class="line"><a name="l00077"></a><span class="lineno">   77</span> <span class="comment">/* Version number of package */</span></div>
-<div class="line"><a name="l00078"></a><span class="lineno">   78</span> <span class="preprocessor">#define VERSION "2.6.4"</span></div>
+<div class="line"><a name="l00078"></a><span class="lineno">   78</span> <span class="preprocessor">#define VERSION "2.6.5"</span></div>
 <div class="line"><a name="l00079"></a><span class="lineno">   79</span> <span class="preprocessor"></span></div>
 <div class="line"><a name="l00080"></a><span class="lineno">   80</span> <span class="comment">/* Define to `unsigned int' if <sys/types.h> does not define. */</span></div>
 <div class="line"><a name="l00081"></a><span class="lineno">   81</span> <span class="comment">/* #undef size_t */</span></div>
@@ -133,7 +133,7 @@
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Jun 23 2015 17:09:36 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Tue Nov 3 2015 15:58:26 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/dir_0af1587c8378955de40f48b4bd1869f0.html b/doc/html/dir_0af1587c8378955de40f48b4bd1869f0.html
index 94f3fdd..020b515 100644
--- a/doc/html/dir_0af1587c8378955de40f48b4bd1869f0.html
+++ b/doc/html/dir_0af1587c8378955de40f48b4bd1869f0.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.3</span>
+    <span id="projectnumber">2.6.4</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -72,7 +72,7 @@ Files</h2></td></tr>
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Jun 23 2015 17:09:37 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/dir_0d45166ba6790a432639a127a727f02c.html b/doc/html/dir_0d45166ba6790a432639a127a727f02c.html
index f6e4c4f..5bc1ebc 100644
--- a/doc/html/dir_0d45166ba6790a432639a127a727f02c.html
+++ b/doc/html/dir_0d45166ba6790a432639a127a727f02c.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.3</span>
+    <span id="projectnumber">2.6.4</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -64,7 +64,7 @@ Files</h2></td></tr>
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Jun 23 2015 17:09:37 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/dir_0f38b5d14ac73b43e2a48a75f9e70be8.html b/doc/html/dir_0f38b5d14ac73b43e2a48a75f9e70be8.html
index fe96c32..dfc66c9 100644
--- a/doc/html/dir_0f38b5d14ac73b43e2a48a75f9e70be8.html
+++ b/doc/html/dir_0f38b5d14ac73b43e2a48a75f9e70be8.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.3</span>
+    <span id="projectnumber">2.6.4</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -66,7 +66,7 @@ Files</h2></td></tr>
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Jun 23 2015 17:09:37 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/dir_0f63d6441a2c250919e1e8723011eb2f.html b/doc/html/dir_0f63d6441a2c250919e1e8723011eb2f.html
index a0f442f..d85ce33 100644
--- a/doc/html/dir_0f63d6441a2c250919e1e8723011eb2f.html
+++ b/doc/html/dir_0f63d6441a2c250919e1e8723011eb2f.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.3</span>
+    <span id="projectnumber">2.6.4</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -92,7 +92,7 @@ Directories</h2></td></tr>
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Jun 23 2015 17:09:37 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/dir_2676862852e3d558e3597542a81ecc63.html b/doc/html/dir_2676862852e3d558e3597542a81ecc63.html
index 763b11f..8e22746 100644
--- a/doc/html/dir_2676862852e3d558e3597542a81ecc63.html
+++ b/doc/html/dir_2676862852e3d558e3597542a81ecc63.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.3</span>
+    <span id="projectnumber">2.6.4</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -68,7 +68,7 @@ Files</h2></td></tr>
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Jun 23 2015 17:09:37 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/dir_280a0ba2820d23d6529bf494f1ea3ddd.html b/doc/html/dir_280a0ba2820d23d6529bf494f1ea3ddd.html
index 57de2f7..f560925 100644
--- a/doc/html/dir_280a0ba2820d23d6529bf494f1ea3ddd.html
+++ b/doc/html/dir_280a0ba2820d23d6529bf494f1ea3ddd.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.3</span>
+    <span id="projectnumber">2.6.4</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -66,7 +66,7 @@ Files</h2></td></tr>
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Jun 23 2015 17:09:37 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/dir_35acdce8930fac877097c845a64519e5.html b/doc/html/dir_35acdce8930fac877097c845a64519e5.html
index 00dff7d..c517c32 100644
--- a/doc/html/dir_35acdce8930fac877097c845a64519e5.html
+++ b/doc/html/dir_35acdce8930fac877097c845a64519e5.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.3</span>
+    <span id="projectnumber">2.6.4</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -68,7 +68,7 @@ Files</h2></td></tr>
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Jun 23 2015 17:09:37 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/dir_41d189c72498e24f979b227eb8e138b1.html b/doc/html/dir_41d189c72498e24f979b227eb8e138b1.html
index 520fe2c..b8b8ecc 100644
--- a/doc/html/dir_41d189c72498e24f979b227eb8e138b1.html
+++ b/doc/html/dir_41d189c72498e24f979b227eb8e138b1.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.3</span>
+    <span id="projectnumber">2.6.4</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -66,7 +66,7 @@ Files</h2></td></tr>
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Jun 23 2015 17:09:37 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/dir_457de909e3893805a4d2d0b8c0742bd8.html b/doc/html/dir_457de909e3893805a4d2d0b8c0742bd8.html
index 9f71429..6ad804e 100644
--- a/doc/html/dir_457de909e3893805a4d2d0b8c0742bd8.html
+++ b/doc/html/dir_457de909e3893805a4d2d0b8c0742bd8.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.3</span>
+    <span id="projectnumber">2.6.4</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -69,7 +69,7 @@ Files</h2></td></tr>
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Jun 23 2015 17:09:37 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/dir_4dfaa1fe1382d1276d1c80b1d5035ade.html b/doc/html/dir_4dfaa1fe1382d1276d1c80b1d5035ade.html
index c436ee7..6fed25c 100644
--- a/doc/html/dir_4dfaa1fe1382d1276d1c80b1d5035ade.html
+++ b/doc/html/dir_4dfaa1fe1382d1276d1c80b1d5035ade.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.3</span>
+    <span id="projectnumber">2.6.4</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -66,7 +66,7 @@ Files</h2></td></tr>
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Jun 23 2015 17:09:37 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/dir_53adf0b982dc8545998aae3f283a5a58.html b/doc/html/dir_53adf0b982dc8545998aae3f283a5a58.html
index 743c8ab..1cbfc47 100644
--- a/doc/html/dir_53adf0b982dc8545998aae3f283a5a58.html
+++ b/doc/html/dir_53adf0b982dc8545998aae3f283a5a58.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.3</span>
+    <span id="projectnumber">2.6.4</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -108,6 +108,8 @@ Files</h2></td></tr>
 <tr class="separator:"><td class="memSeparator" colspan="2"> </td></tr>
 <tr class="memitem:pkkalman_8cc"><td class="memItemLeft" align="right" valign="top">file  </td><td class="memItemRight" valign="bottom"><b>pkkalman.cc</b> <a href="pkkalman_8cc_source.html">[code]</a></td></tr>
 <tr class="separator:"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:pkkalman1_8cc"><td class="memItemLeft" align="right" valign="top">file  </td><td class="memItemRight" valign="bottom"><b>pkkalman1.cc</b> <a href="pkkalman1_8cc_source.html">[code]</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2"> </td></tr>
 <tr class="memitem:pklas2img_8cc"><td class="memItemLeft" align="right" valign="top">file  </td><td class="memItemRight" valign="bottom"><b>pklas2img.cc</b> <a href="pklas2img_8cc_source.html">[code]</a></td></tr>
 <tr class="separator:"><td class="memSeparator" colspan="2"> </td></tr>
 <tr class="memitem:pkoptsvm_8cc"><td class="memItemLeft" align="right" valign="top">file  </td><td class="memItemRight" valign="bottom"><b>pkoptsvm.cc</b> <a href="pkoptsvm_8cc_source.html">[code]</a></td></tr>
@@ -137,7 +139,7 @@ Files</h2></td></tr>
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Jun 23 2015 17:09:37 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/dir_5785acc8d2e42f8795bdbe936856f26d.html b/doc/html/dir_5785acc8d2e42f8795bdbe936856f26d.html
index fe315ca..022019b 100644
--- a/doc/html/dir_5785acc8d2e42f8795bdbe936856f26d.html
+++ b/doc/html/dir_5785acc8d2e42f8795bdbe936856f26d.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.3</span>
+    <span id="projectnumber">2.6.4</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -52,9 +52,14 @@ Directory dependency graph for qgis:</div>
 <div class="dyncontent">
 <div class="center"><img src="dir_5785acc8d2e42f8795bdbe936856f26d_dep.png" border="0" usemap="#dir__5785acc8d2e42f8795bdbe936856f26d__dep" alt="/home/kempenep/pktools/qgis"/></div>
 <map name="dir__5785acc8d2e42f8795bdbe936856f26d__dep" id="dir__5785acc8d2e42f8795bdbe936856f26d__dep">
-<area shape="rect" id="node1" href="dir_5785acc8d2e42f8795bdbe936856f26d.html" title="qgis" alt="" coords="5,5,77,53"/></map>
+<area shape="rect" id="node2" href="dir_b7cc22b4453454f1e686d9a2e78d988d.html" title="pktools" alt="" coords="27,27,99,75"/><area shape="rect" id="clust1" href="dir_5785acc8d2e42f8795bdbe936856f26d.html" alt="" coords="16,16,205,85"/></map>
 </div>
 <table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="subdirs"></a>
+Directories</h2></td></tr>
+<tr class="memitem:dir_b7cc22b4453454f1e686d9a2e78d988d"><td class="memItemLeft" align="right" valign="top">directory  </td><td class="memItemRight" valign="bottom"><a class="el" href="dir_b7cc22b4453454f1e686d9a2e78d988d.html">pktools</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2"> </td></tr>
+</table><table class="memberdecls">
 <tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="files"></a>
 Files</h2></td></tr>
 <tr class="memitem:____init_____8py"><td class="memItemLeft" align="right" valign="top">file  </td><td class="memItemRight" valign="bottom"><b>__init__.py</b> <a href="____init_____8py_source.html">[code]</a></td></tr>
@@ -100,7 +105,7 @@ Files</h2></td></tr>
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Jun 23 2015 17:09:37 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/dir_5785acc8d2e42f8795bdbe936856f26d_dep.map b/doc/html/dir_5785acc8d2e42f8795bdbe936856f26d_dep.map
index 0a58696..6c892ab 100644
--- a/doc/html/dir_5785acc8d2e42f8795bdbe936856f26d_dep.map
+++ b/doc/html/dir_5785acc8d2e42f8795bdbe936856f26d_dep.map
@@ -1,3 +1,4 @@
 <map id="/home/kempenep/pktools/qgis" name="/home/kempenep/pktools/qgis">
-<area shape="rect" id="node1" href="dir_5785acc8d2e42f8795bdbe936856f26d.html" title="qgis" alt="" coords="5,5,77,53"/>
+<area shape="rect" id="node2" href="dir_b7cc22b4453454f1e686d9a2e78d988d.html" title="pktools" alt="" coords="27,27,99,75"/>
+<area shape="rect" id="clust1" href="dir_5785acc8d2e42f8795bdbe936856f26d.html" alt="" coords="16,16,205,85"/>
 </map>
diff --git a/doc/html/dir_5785acc8d2e42f8795bdbe936856f26d_dep.md5 b/doc/html/dir_5785acc8d2e42f8795bdbe936856f26d_dep.md5
index 18186c0..12c1869 100644
--- a/doc/html/dir_5785acc8d2e42f8795bdbe936856f26d_dep.md5
+++ b/doc/html/dir_5785acc8d2e42f8795bdbe936856f26d_dep.md5
@@ -1 +1 @@
-fe020485af298c12a87f416f31e8f743
\ No newline at end of file
+5a8c8ae158394bd02678e26657f8b391
\ No newline at end of file
diff --git a/doc/html/dir_5785acc8d2e42f8795bdbe936856f26d_dep.png b/doc/html/dir_5785acc8d2e42f8795bdbe936856f26d_dep.png
index 8b36aae..0543d94 100644
Binary files a/doc/html/dir_5785acc8d2e42f8795bdbe936856f26d_dep.png and b/doc/html/dir_5785acc8d2e42f8795bdbe936856f26d_dep.png differ
diff --git a/doc/html/dir_5f1e10fd305b434def78aaf73fd56d60.html b/doc/html/dir_5f1e10fd305b434def78aaf73fd56d60.html
index 1f2fd20..9689c33 100644
--- a/doc/html/dir_5f1e10fd305b434def78aaf73fd56d60.html
+++ b/doc/html/dir_5f1e10fd305b434def78aaf73fd56d60.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.3</span>
+    <span id="projectnumber">2.6.4</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -66,7 +66,7 @@ Files</h2></td></tr>
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Jun 23 2015 17:09:37 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/dir_68267d1309a1af8e8297ef4c3efbcdba.html b/doc/html/dir_68267d1309a1af8e8297ef4c3efbcdba.html
index f596efd..5dd37f6 100644
--- a/doc/html/dir_68267d1309a1af8e8297ef4c3efbcdba.html
+++ b/doc/html/dir_68267d1309a1af8e8297ef4c3efbcdba.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.3</span>
+    <span id="projectnumber">2.6.4</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -74,7 +74,7 @@ Directories</h2></td></tr>
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Jun 23 2015 17:09:37 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/dir_6d2fd95b0bd390617ad5a1eb4a537b4a.html b/doc/html/dir_6d2fd95b0bd390617ad5a1eb4a537b4a.html
index befdab1..c901878 100644
--- a/doc/html/dir_6d2fd95b0bd390617ad5a1eb4a537b4a.html
+++ b/doc/html/dir_6d2fd95b0bd390617ad5a1eb4a537b4a.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.3</span>
+    <span id="projectnumber">2.6.4</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -78,7 +78,7 @@ Files</h2></td></tr>
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Jun 23 2015 17:09:37 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/dir_849702d4228bd835bdf1201002937cb3.html b/doc/html/dir_849702d4228bd835bdf1201002937cb3.html
index d9d9bb1..381973b 100644
--- a/doc/html/dir_849702d4228bd835bdf1201002937cb3.html
+++ b/doc/html/dir_849702d4228bd835bdf1201002937cb3.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.3</span>
+    <span id="projectnumber">2.6.4</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -66,7 +66,7 @@ Files</h2></td></tr>
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Jun 23 2015 17:09:37 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/dir_89a0bd85ecec8fbb2c320310670be290.html b/doc/html/dir_89a0bd85ecec8fbb2c320310670be290.html
index 22bc39c..44b2a77 100644
--- a/doc/html/dir_89a0bd85ecec8fbb2c320310670be290.html
+++ b/doc/html/dir_89a0bd85ecec8fbb2c320310670be290.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.3</span>
+    <span id="projectnumber">2.6.4</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -66,7 +66,7 @@ Files</h2></td></tr>
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Jun 23 2015 17:09:37 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/dir_ab1bbd5a6b4bd6507847335527b029bb.html b/doc/html/dir_ab1bbd5a6b4bd6507847335527b029bb.html
index cb25c74..e711650 100644
--- a/doc/html/dir_ab1bbd5a6b4bd6507847335527b029bb.html
+++ b/doc/html/dir_ab1bbd5a6b4bd6507847335527b029bb.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.3</span>
+    <span id="projectnumber">2.6.4</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -68,7 +68,7 @@ Files</h2></td></tr>
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Jun 23 2015 17:09:37 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/dir_b66e135988e27fdc966ddddb8708f514.html b/doc/html/dir_b66e135988e27fdc966ddddb8708f514.html
index 3a34948..d79713f 100644
--- a/doc/html/dir_b66e135988e27fdc966ddddb8708f514.html
+++ b/doc/html/dir_b66e135988e27fdc966ddddb8708f514.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.3</span>
+    <span id="projectnumber">2.6.4</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -68,7 +68,7 @@ Files</h2></td></tr>
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Jun 23 2015 17:09:37 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/dir_b6b6de371025fb67c6b8623f3d3cd2ce.html b/doc/html/dir_b6b6de371025fb67c6b8623f3d3cd2ce.html
index 958bdd4..d114357 100644
--- a/doc/html/dir_b6b6de371025fb67c6b8623f3d3cd2ce.html
+++ b/doc/html/dir_b6b6de371025fb67c6b8623f3d3cd2ce.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.3</span>
+    <span id="projectnumber">2.6.4</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -68,7 +68,7 @@ Files</h2></td></tr>
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Jun 23 2015 17:09:37 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/dir_b7cc22b4453454f1e686d9a2e78d988d.html b/doc/html/dir_b7cc22b4453454f1e686d9a2e78d988d.html
new file mode 100644
index 0000000..3ac76c4
--- /dev/null
+++ b/doc/html/dir_b7cc22b4453454f1e686d9a2e78d988d.html
@@ -0,0 +1,116 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.6"/>
+<title>pktools: /home/kempenep/pktools/qgis/pktools Directory Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+  <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
+  <td style="padding-left: 0.5em;">
+   <div id="projectname">pktools
+    <span id="projectnumber">2.6.4</span>
+   </div>
+   <div id="projectbrief">Processing Kernel for geospatial data</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.6 -->
+  <div id="navrow1" class="tabs">
+    <ul class="tablist">
+      <li><a href="index.html"><span>Main Page</span></a></li>
+      <li><a href="pages.html"><span>Related Pages</span></a></li>
+      <li><a href="annotated.html"><span>Classes</span></a></li>
+      <li><a href="files.html"><span>Files</span></a></li>
+    </ul>
+  </div>
+<div id="nav-path" class="navpath">
+  <ul>
+<li class="navelem"><a class="el" href="dir_5785acc8d2e42f8795bdbe936856f26d.html">qgis</a></li><li class="navelem"><a class="el" href="dir_b7cc22b4453454f1e686d9a2e78d988d.html">pktools</a></li>  </ul>
+</div>
+</div><!-- top -->
+<div class="header">
+  <div class="headertitle">
+<div class="title">pktools Directory Reference</div>  </div>
+</div><!--header-->
+<div class="contents">
+<div class="dynheader">
+Directory dependency graph for pktools:</div>
+<div class="dyncontent">
+<div class="center"><img src="dir_b7cc22b4453454f1e686d9a2e78d988d_dep.png" border="0" usemap="#dir__b7cc22b4453454f1e686d9a2e78d988d__dep" alt="/home/kempenep/pktools/qgis/pktools"/></div>
+<map name="dir__b7cc22b4453454f1e686d9a2e78d988d__dep" id="dir__b7cc22b4453454f1e686d9a2e78d988d__dep">
+<area shape="rect" id="node1" href="dir_b7cc22b4453454f1e686d9a2e78d988d.html" title="pktools" alt="" coords="27,52,99,100"/><area shape="rect" id="clust1" href="dir_5785acc8d2e42f8795bdbe936856f26d.html" title="qgis" alt="" coords="16,16,109,111"/></map>
+</div>
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="files"></a>
+Files</h2></td></tr>
+<tr class="memitem:pktools_2____init_____8py"><td class="memItemLeft" align="right" valign="top">file  </td><td class="memItemRight" valign="bottom"><b>__init__.py</b> <a href="pktools_2____init_____8py_source.html">[code]</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:pktools_2pkcomposite_8py"><td class="memItemLeft" align="right" valign="top">file  </td><td class="memItemRight" valign="bottom"><b>pkcomposite.py</b> <a href="pktools_2pkcomposite_8py_source.html">[code]</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:pktools_2pkcrop_8py"><td class="memItemLeft" align="right" valign="top">file  </td><td class="memItemRight" valign="bottom"><b>pkcrop.py</b> <a href="pktools_2pkcrop_8py_source.html">[code]</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:pktools_2pkdiff__accuracy_8py"><td class="memItemLeft" align="right" valign="top">file  </td><td class="memItemRight" valign="bottom"><b>pkdiff_accuracy.py</b> <a href="pktools_2pkdiff__accuracy_8py_source.html">[code]</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:pktools_2pkextract_8py"><td class="memItemLeft" align="right" valign="top">file  </td><td class="memItemRight" valign="bottom"><b>pkextract.py</b> <a href="pktools_2pkextract_8py_source.html">[code]</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:pktools_2pkextract__grid_8py"><td class="memItemLeft" align="right" valign="top">file  </td><td class="memItemRight" valign="bottom"><b>pkextract_grid.py</b> <a href="pktools_2pkextract__grid_8py_source.html">[code]</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:pktools_2pkextract__random_8py"><td class="memItemLeft" align="right" valign="top">file  </td><td class="memItemRight" valign="bottom"><b>pkextract_random.py</b> <a href="pktools_2pkextract__random_8py_source.html">[code]</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:pktools_2pkfilter__spatial_8py"><td class="memItemLeft" align="right" valign="top">file  </td><td class="memItemRight" valign="bottom"><b>pkfilter_spatial.py</b> <a href="pktools_2pkfilter__spatial_8py_source.html">[code]</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:pktools_2pkfilter__spectral_8py"><td class="memItemLeft" align="right" valign="top">file  </td><td class="memItemRight" valign="bottom"><b>pkfilter_spectral.py</b> <a href="pktools_2pkfilter__spectral_8py_source.html">[code]</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:pktools_2pkfilterdem_8py"><td class="memItemLeft" align="right" valign="top">file  </td><td class="memItemRight" valign="bottom"><b>pkfilterdem.py</b> <a href="pktools_2pkfilterdem_8py_source.html">[code]</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:pktools_2pkgetmask_8py"><td class="memItemLeft" align="right" valign="top">file  </td><td class="memItemRight" valign="bottom"><b>pkgetmask.py</b> <a href="pktools_2pkgetmask_8py_source.html">[code]</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:pktools_2pklas2img_8py"><td class="memItemLeft" align="right" valign="top">file  </td><td class="memItemRight" valign="bottom"><b>pklas2img.py</b> <a href="pktools_2pklas2img_8py_source.html">[code]</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:pktools_2pkreclass_8py"><td class="memItemLeft" align="right" valign="top">file  </td><td class="memItemRight" valign="bottom"><b>pkreclass.py</b> <a href="pktools_2pkreclass_8py_source.html">[code]</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:pktools_2pksetmask_8py"><td class="memItemLeft" align="right" valign="top">file  </td><td class="memItemRight" valign="bottom"><b>pksetmask.py</b> <a href="pktools_2pksetmask_8py_source.html">[code]</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:pktools_2pksvm_8py"><td class="memItemLeft" align="right" valign="top">file  </td><td class="memItemRight" valign="bottom"><b>pksvm.py</b> <a href="pktools_2pksvm_8py_source.html">[code]</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:pktools_2pktoolsAlgorithm_8py"><td class="memItemLeft" align="right" valign="top">file  </td><td class="memItemRight" valign="bottom"><b>pktoolsAlgorithm.py</b> <a href="pktools_2pktoolsAlgorithm_8py_source.html">[code]</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:pktools_2pktoolsAlgorithmProvider_8py"><td class="memItemLeft" align="right" valign="top">file  </td><td class="memItemRight" valign="bottom"><b>pktoolsAlgorithmProvider.py</b> <a href="pktools_2pktoolsAlgorithmProvider_8py_source.html">[code]</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:pktools_2pktoolsUtils_8py"><td class="memItemLeft" align="right" valign="top">file  </td><td class="memItemRight" valign="bottom"><b>pktoolsUtils.py</b> <a href="pktools_2pktoolsUtils_8py_source.html">[code]</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2"> </td></tr>
+<tr class="memitem:pktools_2ProcessingPktoolsPlugin_8py"><td class="memItemLeft" align="right" valign="top">file  </td><td class="memItemRight" valign="bottom"><b>ProcessingPktoolsPlugin.py</b> <a href="pktools_2ProcessingPktoolsPlugin_8py_source.html">[code]</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2"> </td></tr>
+</table>
+</div><!-- contents -->
+<!-- HTML footer for doxygen 1.8.4-->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/>
+</a> 1.8.6
+</small></address>
+<script>
+  (function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
+  (i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
+  m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
+  })(window,document,'script','//www.google-analytics.com/analytics.js','ga');
+  ga('create', 'UA-46952639-1', 'nongnu.org');
+  ga('send', 'pageview');
+</script>
+</body>
+</html>
diff --git a/doc/html/dir_b7cc22b4453454f1e686d9a2e78d988d_dep.map b/doc/html/dir_b7cc22b4453454f1e686d9a2e78d988d_dep.map
new file mode 100644
index 0000000..4f867f5
--- /dev/null
+++ b/doc/html/dir_b7cc22b4453454f1e686d9a2e78d988d_dep.map
@@ -0,0 +1,4 @@
+<map id="/home/kempenep/pktools/qgis/pktools" name="/home/kempenep/pktools/qgis/pktools">
+<area shape="rect" id="node1" href="dir_b7cc22b4453454f1e686d9a2e78d988d.html" title="pktools" alt="" coords="27,52,99,100"/>
+<area shape="rect" id="clust1" href="dir_5785acc8d2e42f8795bdbe936856f26d.html" title="qgis" alt="" coords="16,16,109,111"/>
+</map>
diff --git a/doc/html/dir_b7cc22b4453454f1e686d9a2e78d988d_dep.md5 b/doc/html/dir_b7cc22b4453454f1e686d9a2e78d988d_dep.md5
new file mode 100644
index 0000000..7323714
--- /dev/null
+++ b/doc/html/dir_b7cc22b4453454f1e686d9a2e78d988d_dep.md5
@@ -0,0 +1 @@
+40d7a54b1a14c4a5188ebe70da9adad6
\ No newline at end of file
diff --git a/doc/html/dir_b7cc22b4453454f1e686d9a2e78d988d_dep.png b/doc/html/dir_b7cc22b4453454f1e686d9a2e78d988d_dep.png
new file mode 100644
index 0000000..1630b46
Binary files /dev/null and b/doc/html/dir_b7cc22b4453454f1e686d9a2e78d988d_dep.png differ
diff --git a/doc/html/dir_b8eb6544d8d9ffceba16909a7b9d17d7.html b/doc/html/dir_b8eb6544d8d9ffceba16909a7b9d17d7.html
index 1b53871..344e264 100644
--- a/doc/html/dir_b8eb6544d8d9ffceba16909a7b9d17d7.html
+++ b/doc/html/dir_b8eb6544d8d9ffceba16909a7b9d17d7.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.3</span>
+    <span id="projectnumber">2.6.4</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -66,7 +66,7 @@ Files</h2></td></tr>
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Jun 23 2015 17:09:37 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/dir_d7b2ebecdb5f44d7fa09bdedebc881a7.html b/doc/html/dir_d7b2ebecdb5f44d7fa09bdedebc881a7.html
index 42c68e3..f3909eb 100644
--- a/doc/html/dir_d7b2ebecdb5f44d7fa09bdedebc881a7.html
+++ b/doc/html/dir_d7b2ebecdb5f44d7fa09bdedebc881a7.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.3</span>
+    <span id="projectnumber">2.6.4</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -66,7 +66,7 @@ Files</h2></td></tr>
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Jun 23 2015 17:09:37 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/dir_e28b2035b152bb51229fe7a0fca4e376.html b/doc/html/dir_e28b2035b152bb51229fe7a0fca4e376.html
index 406c19d..a80451e 100644
--- a/doc/html/dir_e28b2035b152bb51229fe7a0fca4e376.html
+++ b/doc/html/dir_e28b2035b152bb51229fe7a0fca4e376.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.3</span>
+    <span id="projectnumber">2.6.4</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -68,7 +68,7 @@ Files</h2></td></tr>
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Jun 23 2015 17:09:37 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/dir_e61db0d85028141ec5940fd7f2a6e0fc.html b/doc/html/dir_e61db0d85028141ec5940fd7f2a6e0fc.html
index 913ce04..afbb2df 100644
--- a/doc/html/dir_e61db0d85028141ec5940fd7f2a6e0fc.html
+++ b/doc/html/dir_e61db0d85028141ec5940fd7f2a6e0fc.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.3</span>
+    <span id="projectnumber">2.6.4</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -66,7 +66,7 @@ Files</h2></td></tr>
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Jun 23 2015 17:09:37 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/dir_e6df591b0639d4c4807ef64d058833e2.html b/doc/html/dir_e6df591b0639d4c4807ef64d058833e2.html
index 864c0fb..e93ed5d 100644
--- a/doc/html/dir_e6df591b0639d4c4807ef64d058833e2.html
+++ b/doc/html/dir_e6df591b0639d4c4807ef64d058833e2.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.3</span>
+    <span id="projectnumber">2.6.4</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -102,7 +102,7 @@ Files</h2></td></tr>
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Jun 23 2015 17:09:37 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/dir_ed1df9621940d6aa1183c365ad1750d2.html b/doc/html/dir_ed1df9621940d6aa1183c365ad1750d2.html
index 0122215..a1e6c8f 100644
--- a/doc/html/dir_ed1df9621940d6aa1183c365ad1750d2.html
+++ b/doc/html/dir_ed1df9621940d6aa1183c365ad1750d2.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.3</span>
+    <span id="projectnumber">2.6.4</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -66,7 +66,7 @@ Files</h2></td></tr>
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Jun 23 2015 17:09:37 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/dir_f92e37ed5759424bff98155847b1034b.html b/doc/html/dir_f92e37ed5759424bff98155847b1034b.html
index 113c85f..5eb34c9 100644
--- a/doc/html/dir_f92e37ed5759424bff98155847b1034b.html
+++ b/doc/html/dir_f92e37ed5759424bff98155847b1034b.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.3</span>
+    <span id="projectnumber">2.6.4</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -66,7 +66,7 @@ Files</h2></td></tr>
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Jun 23 2015 17:09:37 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/files.html b/doc/html/files.html
index 1b6a8a5..2a4d815 100644
--- a/doc/html/files.html
+++ b/doc/html/files.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.3</span>
+    <span id="projectnumber">2.6.4</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -51,171 +51,192 @@
 <div class="textblock">Here is a list of all documented files with brief descriptions:</div><div class="directory">
 <div class="levels">[detail level <span onclick="javascript:toggleLevel(1);">1</span><span onclick="javascript:toggleLevel(2);">2</span><span onclick="javascript:toggleLevel(3);">3</span><span onclick="javascript:toggleLevel(4);">4</span>]</div><table class="directory">
 <tr id="row_0_" class="even"><td class="entry"><img id="arr_0_" src="ftv2mnode.png" alt="o" width="16" height="22" onclick="toggleFolder('0_')"/><img id="img_0_" src="ftv2folderopen.png" alt="-" width="24" height="22" onclick="toggleFolder('0_')"/><a class="el" href="dir_5785acc8d2e42f8795bdbe936856f26d.html" target="_self">qgis</a></td><td class="desc"></td></tr>
-<tr id="row_0_0_"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><a href="____init_____8py_source.html"><img src="ftv2doc.png" alt="*" width="24" height="22" /></a><b>__init__.py</b></td><td class="desc"></td></tr>
-<tr id="row_0_1_" class="even"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><a href="pkcomposite_8py_source.html"><img src="ftv2doc.png" alt="*" width="24" height="22" /></a><b>pkcomposite.py</b></td><td class="desc"></td></tr>
-<tr id="row_0_2_"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><a href="pkcrop_8py_source.html"><img src="ftv2doc.png" alt="*" width="24" height="22" /></a><b>pkcrop.py</b></td><td class="desc"></td></tr>
-<tr id="row_0_3_" class="even"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><a href="pkdiff__accuracy_8py_source.html"><img src="ftv2doc.png" alt="*" width="24" height="22" /></a><b>pkdiff_accuracy.py</b></td><td class="desc"></td></tr>
-<tr id="row_0_4_"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><a href="pkextract_8py_source.html"><img src="ftv2doc.png" alt="*" width="24" height="22" /></a><b>pkextract.py</b></td><td class="desc"></td></tr>
-<tr id="row_0_5_" class="even"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><a href="pkextract__grid_8py_source.html"><img src="ftv2doc.png" alt="*" width="24" height="22" /></a><b>pkextract_grid.py</b></td><td class="desc"></td></tr>
-<tr id="row_0_6_"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><a href="pkextract__random_8py_source.html"><img src="ftv2doc.png" alt="*" width="24" height="22" /></a><b>pkextract_random.py</b></td><td class="desc"></td></tr>
-<tr id="row_0_7_" class="even"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><a href="pkfilter__spatial_8py_source.html"><img src="ftv2doc.png" alt="*" width="24" height="22" /></a><b>pkfilter_spatial.py</b></td><td class="desc"></td></tr>
-<tr id="row_0_8_"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><a href="pkfilter__spectral_8py_source.html"><img src="ftv2doc.png" alt="*" width="24" height="22" /></a><b>pkfilter_spectral.py</b></td><td class="desc"></td></tr>
-<tr id="row_0_9_" class="even"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><a href="pkfilterdem_8py_source.html"><img src="ftv2doc.png" alt="*" width="24" height="22" /></a><b>pkfilterdem.py</b></td><td class="desc"></td></tr>
-<tr id="row_0_10_"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><a href="pkgetmask_8py_source.html"><img src="ftv2doc.png" alt="*" width="24" height="22" /></a><b>pkgetmask.py</b></td><td class="desc"></td></tr>
-<tr id="row_0_11_" class="even"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><a href="pklas2img_8py_source.html"><img src="ftv2doc.png" alt="*" width="24" height="22" /></a><b>pklas2img.py</b></td><td class="desc"></td></tr>
-<tr id="row_0_12_"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><a href="pkreclass_8py_source.html"><img src="ftv2doc.png" alt="*" width="24" height="22" /></a><b>pkreclass.py</b></td><td class="desc"></td></tr>
-<tr id="row_0_13_" class="even"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><a href="pksetmask_8py_source.html"><img src="ftv2doc.png" alt="*" width="24" height="22" /></a><b>pksetmask.py</b></td><td class="desc"></td></tr>
-<tr id="row_0_14_"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><a href="pksvm_8py_source.html"><img src="ftv2doc.png" alt="*" width="24" height="22" /></a><b>pksvm.py</b></td><td class="desc"></td></tr>
-<tr id="row_0_15_" class="even"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><a href="pktoolsAlgorithm_8py_source.html"><img src="ftv2doc.png" alt="*" width="24" height="22" /></a><b>pktoolsAlgorithm.py</b></td><td class="desc"></td></tr>
-<tr id="row_0_16_"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><a href="pktoolsAlgorithmProvider_8py_source.html"><img src="ftv2doc.png" alt="*" width="24" height="22" /></a><b>pktoolsAlgorithmProvider.py</b></td><td class="desc"></td></tr>
-<tr id="row_0_17_" class="even"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><a href="pktoolsUtils_8py_source.html"><img src="ftv2doc.png" alt="*" width="24" height="22" /></a><b>pktoolsUtils.py</b></td><td class="desc"></td></tr>
-<tr id="row_0_18_"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2lastnode.png" alt="\" width="16" height="22" /><a href="ProcessingPktoolsPlugin_8py_source.html"><img src="ftv2doc.png" alt="*" width="24" height="22" /></a><b>ProcessingPktoolsPlugin.py</b></td><td class="desc"></td></tr>
-<tr id="row_1_" class="even"><td class="entry"><img id="arr_1_" src="ftv2mnode.png" alt="o" width="16" height="22" onclick="toggleFolder('1_')"/><img id="img_1_" src="ftv2folderopen.png" alt="-" width="24" height="22" onclick="toggleFolder('1_')"/><a class="el" href="dir_0f63d6441a2c250919e1e8723011eb2f.html" target="_self">qt</a></td><td class="desc"></td></tr>
-<tr id="row_1_0_"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img id="arr_1_0_" src="ftv2pnode.png" alt="o" width="16" height="22" onclick="toggleFolder('1_0_')"/><img id="img_1_0_" src="ftv2folderclosed.png" alt="+" width="24" height="22" onclick="toggleFolder('1_0_')"/><a class="el" href="dir_280a0ba2820d23d6529bf494f1ea3ddd.html" target="_self">build-pkcomposite_gui-gcc-Debug</a></td><td class="desc"></td></tr>
-<tr id="row_1_0_0_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><a href="build-pkcomposite__gui-gcc-Debug_2moc__mainwindow_8cpp_source.html"><img src="ftv2doc.png" alt="*" width="24" height="22" /></a><b>moc_mainwindow.cpp</b></td><td class="desc"></td></tr>
-<tr id="row_1_0_1_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2lastnode.png" alt="\" width="16" height="22" /><a href="build-pkcomposite__gui-gcc-Debug_2ui__mainwindow_8h_source.html"><img src="ftv2doc.png" alt="*" width="24" height="22" /></a><b>ui_mainwindow.h</b></td><td class="desc"></td></tr>
-<tr id="row_1_1_" class="even"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img id="arr_1_1_" src="ftv2pnode.png" alt="o" width="16" height="22" onclick="toggleFolder('1_1_')"/><img id="img_1_1_" src="ftv2folderclosed.png" alt="+" width="24" height="22" onclick="toggleFolder('1_1_')"/><a class="el" href="dir_b8eb6544d8d9ffceba16909a7b9d17d7.html" target="_self">build-pkcomposite_gui-gcc-Release</a></td><td class="desc"></td></tr>
-<tr id="row_1_1_0_" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><a href="build-pkcomposite__gui-gcc-Release_2moc__mainwindow_8cpp_source.html"><img src="ftv2doc.png" alt="*" width="24" height="22" /></a><b>moc_mainwindow.cpp</b></td><td class="desc"></td></tr>
-<tr id="row_1_1_1_" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2lastnode.png" alt="\" width="16" height="22" /><a href="build-pkcomposite__gui-gcc-Release_2ui__mainwindow_8h_source.html"><img src="ftv2doc.png" alt="*" width="24" height="22" /></a><b>ui_mainwindow.h</b></td><td class="desc"></td></tr>
-<tr id="row_1_2_"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img id="arr_1_2_" src="ftv2pnode.png" alt="o" width="16" height="22" onclick="toggleFolder('1_2_')"/><img id="img_1_2_" src="ftv2folderclosed.png" alt="+" width="24" height="22" onclick="toggleFolder('1_2_')"/><a class="el" href="dir_0f38b5d14ac73b43e2a48a75f9e70be8.html" target="_self">build-pkcrop_gui-gcc-Debug</a></td><td class="desc"></td></tr>
-<tr id="row_1_2_0_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><a href="build-pkcrop__gui-gcc-Debug_2moc__mainwindow_8cpp_source.html"><img src="ftv2doc.png" alt="*" width="24" height="22" /></a><b>moc_mainwindow.cpp</b></td><td class="desc"></td></tr>
-<tr id="row_1_2_1_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2lastnode.png" alt="\" width="16" height="22" /><a href="build-pkcrop__gui-gcc-Debug_2ui__mainwindow_8h_source.html"><img src="ftv2doc.png" alt="*" width="24" height="22" /></a><b>ui_mainwindow.h</b></td><td class="desc"></td></tr>
-<tr id="row_1_3_" class="even"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img id="arr_1_3_" src="ftv2pnode.png" alt="o" width="16" height="22" onclick="toggleFolder('1_3_')"/><img id="img_1_3_" src="ftv2folderclosed.png" alt="+" width="24" height="22" onclick="toggleFolder('1_3_')"/><a class="el" href="dir_f92e37ed5759424bff98155847b1034b.html" target="_self">build-pkcrop_gui-gcc-Release</a></td><td class="desc"></td></tr>
-<tr id="row_1_3_0_" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><a href="build-pkcrop__gui-gcc-Release_2moc__mainwindow_8cpp_source.html"><img src="ftv2doc.png" alt="*" width="24" height="22" /></a><b>moc_mainwindow.cpp</b></td><td class="desc"></td></tr>
-<tr id="row_1_3_1_" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2lastnode.png" alt="\" width="16" height="22" /><a href="build-pkcrop__gui-gcc-Release_2ui__mainwindow_8h_source.html"><img src="ftv2doc.png" alt="*" width="24" height="22" /></a><b>ui_mainwindow.h</b></td><td class="desc"></td></tr>
-<tr id="row_1_4_"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img id="arr_1_4_" src="ftv2pnode.png" alt="o" width="16" height="22" onclick="toggleFolder('1_4_')"/><img id="img_1_4_" src="ftv2folderclosed.png" alt="+" width="24" height="22" onclick="toggleFolder('1_4_')"/><a class="el" href="dir_5f1e10fd305b434def78aaf73fd56d60.html" target="_self">build-pkdiff_gui-gcc-Debug</a></td><td class="desc"></td></tr>
-<tr id="row_1_4_0_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><a href="build-pkdiff__gui-gcc-Debug_2moc__mainwindow_8cpp_source.html"><img src="ftv2doc.png" alt="*" width="24" height="22" /></a><b>moc_mainwindow.cpp</b></td><td class="desc"></td></tr>
-<tr id="row_1_4_1_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2lastnode.png" alt="\" width="16" height="22" /><a href="build-pkdiff__gui-gcc-Debug_2ui__mainwindow_8h_source.html"><img src="ftv2doc.png" alt="*" width="24" height="22" /></a><b>ui_mainwindow.h</b></td><td class="desc"></td></tr>
-<tr id="row_1_5_" class="even"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img id="arr_1_5_" src="ftv2pnode.png" alt="o" width="16" height="22" onclick="toggleFolder('1_5_')"/><img id="img_1_5_" src="ftv2folderclosed.png" alt="+" width="24" height="22" onclick="toggleFolder('1_5_')"/><a class="el" href="dir_4dfaa1fe1382d1276d1c80b1d5035ade.html" target="_self">build-pkdiff_gui-gcc-Release</a></td><td class="desc"></td></tr>
-<tr id="row_1_5_0_" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><a href="build-pkdiff__gui-gcc-Release_2moc__mainwindow_8cpp_source.html"><img src="ftv2doc.png" alt="*" width="24" height="22" /></a><b>moc_mainwindow.cpp</b></td><td class="desc"></td></tr>
-<tr id="row_1_5_1_" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2lastnode.png" alt="\" width="16" height="22" /><a href="build-pkdiff__gui-gcc-Release_2ui__mainwindow_8h_source.html"><img src="ftv2doc.png" alt="*" width="24" height="22" /></a><b>ui_mainwindow.h</b></td><td class="desc"></td></tr>
-<tr id="row_1_6_"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img id="arr_1_6_" src="ftv2pnode.png" alt="o" width="16" height="22" onclick="toggleFolder('1_6_')"/><img id="img_1_6_" src="ftv2folderclosed.png" alt="+" width="24" height="22" onclick="toggleFolder('1_6_')"/><a class="el" href="dir_d7b2ebecdb5f44d7fa09bdedebc881a7.html" target="_self">build-pkextract_gui-gcc-Debug</a></td><td class="desc"></td></tr>
-<tr id="row_1_6_0_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><a href="build-pkextract__gui-gcc-Debug_2moc__mainwindow_8cpp_source.html"><img src="ftv2doc.png" alt="*" width="24" height="22" /></a><b>moc_mainwindow.cpp</b></td><td class="desc"></td></tr>
-<tr id="row_1_6_1_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2lastnode.png" alt="\" width="16" height="22" /><a href="build-pkextract__gui-gcc-Debug_2ui__mainwindow_8h_source.html"><img src="ftv2doc.png" alt="*" width="24" height="22" /></a><b>ui_mainwindow.h</b></td><td class="desc"></td></tr>
-<tr id="row_1_7_" class="even"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img id="arr_1_7_" src="ftv2pnode.png" alt="o" width="16" height="22" onclick="toggleFolder('1_7_')"/><img id="img_1_7_" src="ftv2folderclosed.png" alt="+" width="24" height="22" onclick="toggleFolder('1_7_')"/><a class="el" href="dir_41d189c72498e24f979b227eb8e138b1.html" target="_self">build-pkextract_gui-gcc-Release</a></td><td class="desc"></td></tr>
-<tr id="row_1_7_0_" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><a href="build-pkextract__gui-gcc-Release_2moc__mainwindow_8cpp_source.html"><img src="ftv2doc.png" alt="*" width="24" height="22" /></a><b>moc_mainwindow.cpp</b></td><td class="desc"></td></tr>
-<tr id="row_1_7_1_" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2lastnode.png" alt="\" width="16" height="22" /><a href="build-pkextract__gui-gcc-Release_2ui__mainwindow_8h_source.html"><img src="ftv2doc.png" alt="*" width="24" height="22" /></a><b>ui_mainwindow.h</b></td><td class="desc"></td></tr>
-<tr id="row_1_8_"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img id="arr_1_8_" src="ftv2pnode.png" alt="o" width="16" height="22" onclick="toggleFolder('1_8_')"/><img id="img_1_8_" src="ftv2folderclosed.png" alt="+" width="24" height="22" onclick="toggleFolder('1_8_')"/><a class="el" href="dir_e61db0d85028141ec5940fd7f2a6e0fc.html" target="_self">build-pksvm_gui-gcc-Debug</a></td><td class="desc"></td></tr>
-<tr id="row_1_8_0_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><a href="build-pksvm__gui-gcc-Debug_2moc__mainwindow_8cpp_source.html"><img src="ftv2doc.png" alt="*" width="24" height="22" /></a><b>moc_mainwindow.cpp</b></td><td class="desc"></td></tr>
-<tr id="row_1_8_1_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2lastnode.png" alt="\" width="16" height="22" /><a href="build-pksvm__gui-gcc-Debug_2ui__mainwindow_8h_source.html"><img src="ftv2doc.png" alt="*" width="24" height="22" /></a><b>ui_mainwindow.h</b></td><td class="desc"></td></tr>
-<tr id="row_1_9_" class="even"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img id="arr_1_9_" src="ftv2pnode.png" alt="o" width="16" height="22" onclick="toggleFolder('1_9_')"/><img id="img_1_9_" src="ftv2folderclosed.png" alt="+" width="24" height="22" onclick="toggleFolder('1_9_')"/><a class="el" href="dir_ed1df9621940d6aa1183c365ad1750d2.html" target="_self">build-pksvm_gui-gcc-Release</a></td><td class="desc"></td></tr>
-<tr id="row_1_9_0_" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><a href="build-pksvm__gui-gcc-Release_2moc__mainwindow_8cpp_source.html"><img src="ftv2doc.png" alt="*" width="24" height="22" /></a><b>moc_mainwindow.cpp</b></td><td class="desc"></td></tr>
-<tr id="row_1_9_1_" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2lastnode.png" alt="\" width="16" height="22" /><a href="build-pksvm__gui-gcc-Release_2ui__mainwindow_8h_source.html"><img src="ftv2doc.png" alt="*" width="24" height="22" /></a><b>ui_mainwindow.h</b></td><td class="desc"></td></tr>
-<tr id="row_1_10_"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img id="arr_1_10_" src="ftv2pnode.png" alt="o" width="16" height="22" onclick="toggleFolder('1_10_')"/><img id="img_1_10_" src="ftv2folderclosed.png" alt="+" width="24" height="22" onclick="toggleFolder('1_10_')"/><a class="el" href="dir_ab1bbd5a6b4bd6507847335527b029bb.html" target="_self">pkcomposite_gui</a></td><td class="desc"></td></tr>
-<tr id="row_1_10_0_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><a href="pkcomposite__gui_2main_8cc_source.html"><img src="ftv2doc.png" alt="*" width="24" height="22" /></a><b>main.cc</b></td><td class="desc"></td></tr>
-<tr id="row_1_10_1_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><a href="pkcomposite__gui_2mainwindow_8cc_source.html"><img src="ftv2doc.png" alt="*" width="24" height="22" /></a><b>mainwindow.cc</b></td><td class="desc"></td></tr>
-<tr id="row_1_10_2_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2lastnode.png" alt="\" width="16" height="22" /><a href="pkcomposite__gui_2mainwindow_8h_source.html"><img src="ftv2doc.png" alt="*" width="24" height="22" /></a><b>mainwindow.h</b></td><td class="desc"></td></tr>
-<tr id="row_1_11_" class="even"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img id="arr_1_11_" src="ftv2pnode.png" alt="o" width="16" height="22" onclick="toggleFolder('1_11_')"/><img id="img_1_11_" src="ftv2folderclosed.png" alt="+" width="24" height="22" onclick="toggleFolder('1_11_')"/><a class="el" href="dir_35acdce8930fac877097c845a64519e5.html" target="_self">pkcrop_gui</a></td><td class="desc"></td></tr>
-<tr id="row_1_11_0_" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><a href="pkcrop__gui_2main_8cc_source.html"><img src="ftv2doc.png" alt="*" width="24" height="22" /></a><b>main.cc</b></td><td class="desc"></td></tr>
-<tr id="row_1_11_1_" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><a href="pkcrop__gui_2mainwindow_8cc_source.html"><img src="ftv2doc.png" alt="*" width="24" height="22" /></a><b>mainwindow.cc</b></td><td class="desc"></td></tr>
-<tr id="row_1_11_2_" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2lastnode.png" alt="\" width="16" height="22" /><a href="pkcrop__gui_2mainwindow_8h_source.html"><img src="ftv2doc.png" alt="*" width="24" height="22" /></a><b>mainwindow.h</b></td><td class="desc"></td></tr>
-<tr id="row_1_12_"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img id="arr_1_12_" src="ftv2pnode.png" alt="o" width="16" height="22" onclick="toggleFolder('1_12_')"/><img id="img_1_12_" src="ftv2folderclosed.png" alt="+" width="24" height="22" onclick="toggleFolder('1_12_')"/><a class="el" href="dir_b6b6de371025fb67c6b8623f3d3cd2ce.html" target="_self">pkdiff_gui</a></td><td class="desc"></td></tr>
-<tr id="row_1_12_0_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><a href="pkdiff__gui_2main_8cpp_source.html"><img src="ftv2doc.png" alt="*" width="24" height="22" /></a><b>main.cpp</b></td><td class="desc"></td></tr>
-<tr id="row_1_12_1_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><a href="pkdiff__gui_2mainwindow_8cpp_source.html"><img src="ftv2doc.png" alt="*" width="24" height="22" /></a><b>mainwindow.cpp</b></td><td class="desc"></td></tr>
-<tr id="row_1_12_2_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2lastnode.png" alt="\" width="16" height="22" /><a href="pkdiff__gui_2mainwindow_8h_source.html"><img src="ftv2doc.png" alt="*" width="24" height="22" /></a><b>mainwindow.h</b></td><td class="desc"></td></tr>
-<tr id="row_1_13_" class="even"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img id="arr_1_13_" src="ftv2pnode.png" alt="o" width="16" height="22" onclick="toggleFolder('1_13_')"/><img id="img_1_13_" src="ftv2folderclosed.png" alt="+" width="24" height="22" onclick="toggleFolder('1_13_')"/><a class="el" href="dir_2676862852e3d558e3597542a81ecc63.html" target="_self">pkextract_gui</a></td><td class="desc"></td></tr>
-<tr id="row_1_13_0_" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><a href="pkextract__gui_2main_8cpp_source.html"><img src="ftv2doc.png" alt="*" width="24" height="22" /></a><b>main.cpp</b></td><td class="desc"></td></tr>
-<tr id="row_1_13_1_" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><a href="pkextract__gui_2mainwindow_8cpp_source.html"><img src="ftv2doc.png" alt="*" width="24" height="22" /></a><b>mainwindow.cpp</b></td><td class="desc"></td></tr>
-<tr id="row_1_13_2_" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2lastnode.png" alt="\" width="16" height="22" /><a href="pkextract__gui_2mainwindow_8h_source.html"><img src="ftv2doc.png" alt="*" width="24" height="22" /></a><b>mainwindow.h</b></td><td class="desc"></td></tr>
-<tr id="row_1_14_"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img id="arr_1_14_" src="ftv2plastnode.png" alt="\" width="16" height="22" onclick="toggleFolder('1_14_')"/><img id="img_1_14_" src="ftv2folderclosed.png" alt="+" width="24" height="22" onclick="toggleFolder('1_14_')"/><a class="el" href="dir_b66e135988e27fdc966ddddb8708f514.html" target="_self">pksvm_gui</a></td><td class="desc"></td></tr>
-<tr id="row_1_14_0_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2blank.png" alt=" " width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><a href="pksvm__gui_2main_8cpp_source.html"><img src="ftv2doc.png" alt="*" width="24" height="22" /></a><b>main.cpp</b></td><td class="desc"></td></tr>
-<tr id="row_1_14_1_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2blank.png" alt=" " width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><a href="pksvm__gui_2mainwindow_8cpp_source.html"><img src="ftv2doc.png" alt="*" width="24" height="22" /></a><b>mainwindow.cpp</b></td><td class="desc"></td></tr>
-<tr id="row_1_14_2_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2blank.png" alt=" " width="16" height="22" /><img src="ftv2lastnode.png" alt="\" width="16" height="22" /><a href="pksvm__gui_2mainwindow_8h_source.html"><img src="ftv2doc.png" alt="*" width="24" height="22" /></a><b>mainwindow.h</b></td><td class="desc"></td></tr>
-<tr id="row_2_" class="even"><td class="entry"><img id="arr_2_" src="ftv2mnode.png" alt="o" width="16" height="22" onclick="toggleFolder('2_')"/><img id="img_2_" src="ftv2folderopen.png" alt="-" width="24" height="22" onclick="toggleFolder('2_')"/><a class="el" href="dir_68267d1309a1af8e8297ef4c3efbcdba.html" target="_self">src</a></td><td class="desc"></td></tr>
-<tr id="row_2_0_"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img id="arr_2_0_" src="ftv2pnode.png" alt="o" width="16" height="22" onclick="toggleFolder('2_0_')"/><img id="img_2_0_" src="ftv2folderclosed.png" alt="+" width="24" height="22" onclick="toggleFolder('2_0_')"/><a class="el" href="dir_e6df591b0639d4c4807ef64d058833e2.html" target="_self">algorithms</a></td><td class="desc"></td></tr>
-<tr id="row_2_0_0_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><a href="ConfusionMatrix_8cc_source.html"><img src="ftv2doc.png" alt="*" width="24" height="22" /></a><b>ConfusionMatrix.cc</b></td><td class="desc"></td></tr>
-<tr id="row_2_0_1_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><a href="ConfusionMatrix_8h_source.html"><img src="ftv2doc.png" alt="*" width="24" height="22" /></a><b>ConfusionMatrix.h</b></td><td class="desc"></td></tr>
-<tr id="row_2_0_2_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><a href="CostFactory_8h_source.html"><img src="ftv2doc.png" alt="*" width="24" height="22" /></a><b>CostFactory.h</b></td><td class="desc"></td></tr>
-<tr id="row_2_0_3_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><a href="CostFactorySVM_8cc_source.html"><img src="ftv2doc.png" alt="*" width="24" height="22" /></a><b>CostFactorySVM.cc</b></td><td class="desc"></td></tr>
-<tr id="row_2_0_4_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><a href="CostFactorySVM_8h_source.html"><img src="ftv2doc.png" alt="*" width="24" height="22" /></a><b>CostFactorySVM.h</b></td><td class="desc"></td></tr>
-<tr id="row_2_0_5_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><a href="Egcs_8cc_source.html"><img src="ftv2doc.png" alt="*" width="24" height="22" /></a><b>Egcs.cc</b></td><td class="desc"></td></tr>
-<tr id="row_2_0_6_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><a href="Egcs_8h_source.html"><img src="ftv2doc.png" alt="*" width="24" height="22" /></a><b>Egcs.h</b></td><td class="desc"></td></tr>
-<tr id="row_2_0_7_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><a href="FeatureSelector_8h_source.html"><img src="ftv2doc.png" alt="*" width="24" height="22" /></a><b>FeatureSelector.h</b></td><td class="desc"></td></tr>
-<tr id="row_2_0_8_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><a href="Filter_8cc_source.html"><img src="ftv2doc.png" alt="*" width="24" height="22" /></a><b>Filter.cc</b></td><td class="desc"></td></tr>
-<tr id="row_2_0_9_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><a href="Filter_8h_source.html"><img src="ftv2doc.png" alt="*" width="24" height="22" /></a><b>Filter.h</b></td><td class="desc"></td></tr>
-<tr id="row_2_0_10_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><a href="Filter2d_8cc_source.html"><img src="ftv2doc.png" alt="*" width="24" height="22" /></a><b>Filter2d.cc</b></td><td class="desc"></td></tr>
-<tr id="row_2_0_11_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><a href="Filter2d_8h_source.html"><img src="ftv2doc.png" alt="*" width="24" height="22" /></a><b>Filter2d.h</b></td><td class="desc"></td></tr>
-<tr id="row_2_0_12_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><a href="Filter__old_8h_source.html"><img src="ftv2doc.png" alt="*" width="24" height="22" /></a><b>Filter_old.h</b></td><td class="desc"></td></tr>
-<tr id="row_2_0_13_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><a href="ImgRegression_8cc_source.html"><img src="ftv2doc.png" alt="*" width="24" height="22" /></a><b>ImgRegression.cc</b></td><td class="desc"></td></tr>
-<tr id="row_2_0_14_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><a href="ImgRegression_8h_source.html"><img src="ftv2doc.png" alt="*" width="24" height="22" /></a><b>ImgRegression.h</b></td><td class="desc"></td></tr>
-<tr id="row_2_0_15_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><a href="myfann__cpp_8h_source.html"><img src="ftv2doc.png" alt="*" width="24" height="22" /></a><b>myfann_cpp.h</b></td><td class="desc"></td></tr>
-<tr id="row_2_0_16_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><a href="OptFactory_8h_source.html"><img src="ftv2doc.png" alt="*" width="24" height="22" /></a><b>OptFactory.h</b></td><td class="desc"></td></tr>
-<tr id="row_2_0_17_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><a href="StatFactory_8h_source.html"><img src="ftv2doc.png" alt="*" width="24" height="22" /></a><b>StatFactory.h</b></td><td class="desc"></td></tr>
-<tr id="row_2_0_18_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><a href="svm_8cpp_source.html"><img src="ftv2doc.png" alt="*" width="24" height="22" /></a><b>svm.cpp</b></td><td class="desc"></td></tr>
-<tr id="row_2_0_19_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2lastnode.png" alt="\" width="16" height="22" /><a href="svm_8h_source.html"><img src="ftv2doc.png" alt="*" width="24" height="22" /></a><b>svm.h</b></td><td class="desc"></td></tr>
-<tr id="row_2_1_" class="even"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img id="arr_2_1_" src="ftv2pnode.png" alt="o" width="16" height="22" onclick="toggleFolder('2_1_')"/><img id="img_2_1_" src="ftv2folderclosed.png" alt="+" width="24" height="22" onclick="toggleFolder('2_1_')"/><a class="el" href="dir_53adf0b982dc8545998aae3f283a5a58.html" target="_self">apps</a></td><td class="desc"></td></tr>
-<tr id="row_2_1_0_" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img id="arr_2_1_0_" src="ftv2pnode.png" alt="o" width="16" height="22" onclick="toggleFolder('2_1_0_')"/><img id="img_2_1_0_" src="ftv2folderclosed.png" alt="+" width="24" height="22" onclick="toggleFolder('2_1_0_')"/><a class="el" href="dir_e28b2035b152bb51229fe7a0fca4e376.html" target="_self">not_used</a>< [...]
-<tr id="row_2_1_0_0_" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><a href="pkeditogr_8cc_source.html"><img src="ftv2doc.png" alt="*" width="24" height="22" /></a><b>pkeditogr.cc</b></td><td class="desc"></td></tr>
-<tr id="row_2_1_0_1_" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><a href="pkenhance_8cc_source.html"><img src="ftv2doc.png" alt="*" width="24" height="22" /></a><b>pkenhance.cc</b></td><td class="desc"></td></tr>
-<tr id="row_2_1_0_2_" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2lastnode.png" alt="\" width="16" height="22" /><a href="pkndvi_8cc_source.html"><img src="ftv2doc.png" alt="*" width="24" height="22" /></a><b>pkndvi.cc</b></td><td class="desc"></td></tr>
-<tr id="row_2_1_1_" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><a href="pkann_8cc_source.html"><img src="ftv2doc.png" alt="*" width="24" height="22" /></a><b>pkann.cc</b></td><td class="desc"></td></tr>
-<tr id="row_2_1_2_" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><a href="pkascii2img_8cc_source.html"><img src="ftv2doc.png" alt="*" width="24" height="22" /></a><b>pkascii2img.cc</b></td><td class="desc"></td></tr>
-<tr id="row_2_1_3_" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><a href="pkascii2ogr_8cc_source.html"><img src="ftv2doc.png" alt="*" width="24" height="22" /></a><b>pkascii2ogr.cc</b></td><td class="desc"></td></tr>
-<tr id="row_2_1_4_" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><a href="pkcomposite_8cc_source.html"><img src="ftv2doc.png" alt="*" width="24" height="22" /></a><b>pkcomposite.cc</b></td><td class="desc"></td></tr>
-<tr id="row_2_1_5_" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><a href="pkcreatect_8cc_source.html"><img src="ftv2doc.png" alt="*" width="24" height="22" /></a><b>pkcreatect.cc</b></td><td class="desc"></td></tr>
-<tr id="row_2_1_6_" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><a href="pkcrop_8cc_source.html"><img src="ftv2doc.png" alt="*" width="24" height="22" /></a><b>pkcrop.cc</b></td><td class="desc"></td></tr>
-<tr id="row_2_1_7_" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><a href="pkdiff_8cc_source.html"><img src="ftv2doc.png" alt="*" width="24" height="22" /></a><b>pkdiff.cc</b></td><td class="desc"></td></tr>
-<tr id="row_2_1_8_" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><a href="pkdsm2shadow_8cc_source.html"><img src="ftv2doc.png" alt="*" width="24" height="22" /></a><b>pkdsm2shadow.cc</b></td><td class="desc"></td></tr>
-<tr id="row_2_1_9_" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><a href="pkdumpimg_8cc_source.html"><img src="ftv2doc.png" alt="*" width="24" height="22" /></a><b>pkdumpimg.cc</b></td><td class="desc"></td></tr>
-<tr id="row_2_1_10_" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><a href="pkdumpogr_8cc_source.html"><img src="ftv2doc.png" alt="*" width="24" height="22" /></a><b>pkdumpogr.cc</b></td><td class="desc"></td></tr>
-<tr id="row_2_1_11_" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><a href="pkdumpogr_8h_source.html"><img src="ftv2doc.png" alt="*" width="24" height="22" /></a><b>pkdumpogr.h</b></td><td class="desc"></td></tr>
-<tr id="row_2_1_12_" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><a href="pkegcs_8cc_source.html"><img src="ftv2doc.png" alt="*" width="24" height="22" /></a><b>pkegcs.cc</b></td><td class="desc"></td></tr>
-<tr id="row_2_1_13_" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><a href="pkextract_8cc_source.html"><img src="ftv2doc.png" alt="*" width="24" height="22" /></a><b>pkextract.cc</b></td><td class="desc"></td></tr>
-<tr id="row_2_1_14_" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><a href="pkfillnodata_8cc_source.html"><img src="ftv2doc.png" alt="*" width="24" height="22" /></a><b>pkfillnodata.cc</b></td><td class="desc"></td></tr>
-<tr id="row_2_1_15_" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><a href="pkfilter_8cc_source.html"><img src="ftv2doc.png" alt="*" width="24" height="22" /></a><b>pkfilter.cc</b></td><td class="desc"></td></tr>
-<tr id="row_2_1_16_" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><a href="pkfilterascii_8cc_source.html"><img src="ftv2doc.png" alt="*" width="24" height="22" /></a><b>pkfilterascii.cc</b></td><td class="desc"></td></tr>
-<tr id="row_2_1_17_" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><a href="pkfilterdem_8cc_source.html"><img src="ftv2doc.png" alt="*" width="24" height="22" /></a><b>pkfilterdem.cc</b></td><td class="desc"></td></tr>
-<tr id="row_2_1_18_" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><a href="pkfsann_8cc_source.html"><img src="ftv2doc.png" alt="*" width="24" height="22" /></a><b>pkfsann.cc</b></td><td class="desc"></td></tr>
-<tr id="row_2_1_19_" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><a href="pkfsann_8h_source.html"><img src="ftv2doc.png" alt="*" width="24" height="22" /></a><b>pkfsann.h</b></td><td class="desc"></td></tr>
-<tr id="row_2_1_20_" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><a href="pkfssvm_8cc_source.html"><img src="ftv2doc.png" alt="*" width="24" height="22" /></a><b>pkfssvm.cc</b></td><td class="desc"></td></tr>
-<tr id="row_2_1_21_" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><a href="pkgetmask_8cc_source.html"><img src="ftv2doc.png" alt="*" width="24" height="22" /></a><b>pkgetmask.cc</b></td><td class="desc"></td></tr>
-<tr id="row_2_1_22_" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><a href="pkinfo_8cc_source.html"><img src="ftv2doc.png" alt="*" width="24" height="22" /></a><b>pkinfo.cc</b></td><td class="desc"></td></tr>
-<tr id="row_2_1_23_" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><a href="pkkalman_8cc_source.html"><img src="ftv2doc.png" alt="*" width="24" height="22" /></a><b>pkkalman.cc</b></td><td class="desc"></td></tr>
-<tr id="row_2_1_24_" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><a href="pklas2img_8cc_source.html"><img src="ftv2doc.png" alt="*" width="24" height="22" /></a><b>pklas2img.cc</b></td><td class="desc"></td></tr>
-<tr id="row_2_1_25_" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><a href="pkoptsvm_8cc_source.html"><img src="ftv2doc.png" alt="*" width="24" height="22" /></a><b>pkoptsvm.cc</b></td><td class="desc"></td></tr>
-<tr id="row_2_1_26_" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><a href="pkpolygonize_8cc_source.html"><img src="ftv2doc.png" alt="*" width="24" height="22" /></a><b>pkpolygonize.cc</b></td><td class="desc"></td></tr>
-<tr id="row_2_1_27_" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><a href="pkreclass_8cc_source.html"><img src="ftv2doc.png" alt="*" width="24" height="22" /></a><b>pkreclass.cc</b></td><td class="desc"></td></tr>
-<tr id="row_2_1_28_" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><a href="pkregann_8cc_source.html"><img src="ftv2doc.png" alt="*" width="24" height="22" /></a><b>pkregann.cc</b></td><td class="desc"></td></tr>
-<tr id="row_2_1_29_" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><a href="pksensormodel_8h_source.html"><img src="ftv2doc.png" alt="*" width="24" height="22" /></a><b>pksensormodel.h</b></td><td class="desc"></td></tr>
-<tr id="row_2_1_30_" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><a href="pksetmask_8cc_source.html"><img src="ftv2doc.png" alt="*" width="24" height="22" /></a><b>pksetmask.cc</b></td><td class="desc"></td></tr>
-<tr id="row_2_1_31_" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><a href="pksieve_8cc_source.html"><img src="ftv2doc.png" alt="*" width="24" height="22" /></a><b>pksieve.cc</b></td><td class="desc"></td></tr>
-<tr id="row_2_1_32_" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><a href="pkstat_8cc_source.html"><img src="ftv2doc.png" alt="*" width="24" height="22" /></a><b>pkstat.cc</b></td><td class="desc"></td></tr>
-<tr id="row_2_1_33_" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><a href="pkstatascii_8cc_source.html"><img src="ftv2doc.png" alt="*" width="24" height="22" /></a><b>pkstatascii.cc</b></td><td class="desc"></td></tr>
-<tr id="row_2_1_34_" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><a href="pkstatogr_8cc_source.html"><img src="ftv2doc.png" alt="*" width="24" height="22" /></a><b>pkstatogr.cc</b></td><td class="desc"></td></tr>
-<tr id="row_2_1_35_" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2lastnode.png" alt="\" width="16" height="22" /><a href="pksvm_8cc_source.html"><img src="ftv2doc.png" alt="*" width="24" height="22" /></a><b>pksvm.cc</b></td><td class="desc"></td></tr>
-<tr id="row_2_2_"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img id="arr_2_2_" src="ftv2pnode.png" alt="o" width="16" height="22" onclick="toggleFolder('2_2_')"/><img id="img_2_2_" src="ftv2folderclosed.png" alt="+" width="24" height="22" onclick="toggleFolder('2_2_')"/><a class="el" href="dir_0af1587c8378955de40f48b4bd1869f0.html" target="_self">base</a></td><td class="desc"></td></tr>
-<tr id="row_2_2_0_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><a href="IndexValue_8h_source.html"><img src="ftv2doc.png" alt="*" width="24" height="22" /></a><b>IndexValue.h</b></td><td class="desc"></td></tr>
-<tr id="row_2_2_1_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><a href="Optionpk_8h_source.html"><img src="ftv2doc.png" alt="*" width="24" height="22" /></a><b>Optionpk.h</b></td><td class="desc"></td></tr>
-<tr id="row_2_2_2_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><a href="pktestOption_8cc_source.html"><img src="ftv2doc.png" alt="*" width="24" height="22" /></a><b>pktestOption.cc</b></td><td class="desc"></td></tr>
-<tr id="row_2_2_3_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><a href="PosValue_8h_source.html"><img src="ftv2doc.png" alt="*" width="24" height="22" /></a><b>PosValue.h</b></td><td class="desc"></td></tr>
-<tr id="row_2_2_4_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2lastnode.png" alt="\" width="16" height="22" /><a href="Vector2d_8h_source.html"><img src="ftv2doc.png" alt="*" width="24" height="22" /></a><b>Vector2d.h</b></td><td class="desc"></td></tr>
-<tr id="row_2_3_" class="even"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img id="arr_2_3_" src="ftv2pnode.png" alt="o" width="16" height="22" onclick="toggleFolder('2_3_')"/><img id="img_2_3_" src="ftv2folderclosed.png" alt="+" width="24" height="22" onclick="toggleFolder('2_3_')"/><a class="el" href="dir_849702d4228bd835bdf1201002937cb3.html" target="_self">fileclasses</a></td><td class="desc"></td></tr>
-<tr id="row_2_3_0_" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><a href="FileReaderAscii_8cc_source.html"><img src="ftv2doc.png" alt="*" width="24" height="22" /></a><b>FileReaderAscii.cc</b></td><td class="desc"></td></tr>
-<tr id="row_2_3_1_" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2lastnode.png" alt="\" width="16" height="22" /><a href="FileReaderAscii_8h_source.html"><img src="ftv2doc.png" alt="*" width="24" height="22" /></a><b>FileReaderAscii.h</b></td><td class="desc"></td></tr>
-<tr id="row_2_4_"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img id="arr_2_4_" src="ftv2pnode.png" alt="o" width="16" height="22" onclick="toggleFolder('2_4_')"/><img id="img_2_4_" src="ftv2folderclosed.png" alt="+" width="24" height="22" onclick="toggleFolder('2_4_')"/><a class="el" href="dir_6d2fd95b0bd390617ad5a1eb4a537b4a.html" target="_self">imageclasses</a></td><td class="desc"></td></tr>
-<tr id="row_2_4_0_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><a href="ImgReaderGdal_8cc_source.html"><img src="ftv2doc.png" alt="*" width="24" height="22" /></a><b>ImgReaderGdal.cc</b></td><td class="desc"></td></tr>
-<tr id="row_2_4_1_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><a href="ImgReaderGdal_8h_source.html"><img src="ftv2doc.png" alt="*" width="24" height="22" /></a><b>ImgReaderGdal.h</b></td><td class="desc"></td></tr>
-<tr id="row_2_4_2_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><a href="ImgReaderOgr_8cc_source.html"><img src="ftv2doc.png" alt="*" width="24" height="22" /></a><b>ImgReaderOgr.cc</b></td><td class="desc"></td></tr>
-<tr id="row_2_4_3_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><a href="ImgReaderOgr_8h_source.html"><img src="ftv2doc.png" alt="*" width="24" height="22" /></a><b>ImgReaderOgr.h</b></td><td class="desc"></td></tr>
-<tr id="row_2_4_4_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><a href="ImgWriterGdal_8cc_source.html"><img src="ftv2doc.png" alt="*" width="24" height="22" /></a><b>ImgWriterGdal.cc</b></td><td class="desc"></td></tr>
-<tr id="row_2_4_5_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><a href="ImgWriterGdal_8h_source.html"><img src="ftv2doc.png" alt="*" width="24" height="22" /></a><b>ImgWriterGdal.h</b></td><td class="desc"></td></tr>
-<tr id="row_2_4_6_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><a href="ImgWriterOgr_8cc_source.html"><img src="ftv2doc.png" alt="*" width="24" height="22" /></a><b>ImgWriterOgr.cc</b></td><td class="desc"></td></tr>
-<tr id="row_2_4_7_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2lastnode.png" alt="\" width="16" height="22" /><a href="ImgWriterOgr_8h_source.html"><img src="ftv2doc.png" alt="*" width="24" height="22" /></a><b>ImgWriterOgr.h</b></td><td class="desc"></td></tr>
-<tr id="row_2_5_" class="even"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img id="arr_2_5_" src="ftv2plastnode.png" alt="\" width="16" height="22" onclick="toggleFolder('2_5_')"/><img id="img_2_5_" src="ftv2folderclosed.png" alt="+" width="24" height="22" onclick="toggleFolder('2_5_')"/><a class="el" href="dir_89a0bd85ecec8fbb2c320310670be290.html" target="_self">lasclasses</a></td><td class="desc"></td></tr>
-<tr id="row_2_5_0_" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2blank.png" alt=" " width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><a href="FileReaderLas_8cc_source.html"><img src="ftv2doc.png" alt="*" width="24" height="22" /></a><b>FileReaderLas.cc</b></td><td class="desc"></td></tr>
-<tr id="row_2_5_1_" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2blank.png" alt=" " width="16" height="22" /><img src="ftv2lastnode.png" alt="\" width="16" height="22" /><a href="FileReaderLas_8h_source.html"><img src="ftv2doc.png" alt="*" width="24" height="22" /></a><b>FileReaderLas.h</b></td><td class="desc"></td></tr>
-<tr id="row_3_"><td class="entry"><img id="arr_3_" src="ftv2mnode.png" alt="o" width="16" height="22" onclick="toggleFolder('3_')"/><img id="img_3_" src="ftv2folderopen.png" alt="-" width="24" height="22" onclick="toggleFolder('3_')"/><a class="el" href="dir_457de909e3893805a4d2d0b8c0742bd8.html" target="_self">vis_studio</a></td><td class="desc"></td></tr>
-<tr id="row_3_0_" class="even"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img id="arr_3_0_" src="ftv2pnode.png" alt="o" width="16" height="22" onclick="toggleFolder('3_0_')"/><img id="img_3_0_" src="ftv2folderclosed.png" alt="+" width="24" height="22" onclick="toggleFolder('3_0_')"/><a class="el" href="dir_0d45166ba6790a432639a127a727f02c.html" target="_self">base</a></td><td class="desc"></td></tr>
-<tr id="row_3_0_0_" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2lastnode.png" alt="\" width="16" height="22" /><a href="Optionpk_8cc_source.html"><img src="ftv2doc.png" alt="*" width="24" height="22" /></a><b>Optionpk.cc</b></td><td class="desc"></td></tr>
-<tr id="row_3_1_"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2lastnode.png" alt="\" width="16" height="22" /><a href="vis__studio_2config_8h_source.html"><img src="ftv2doc.png" alt="*" width="24" height="22" /></a><b>config.h</b></td><td class="desc"></td></tr>
-<tr id="row_4_" class="even"><td class="entry"><img src="ftv2lastnode.png" alt="\" width="16" height="22" /><a href="config_8h_source.html"><img src="ftv2doc.png" alt="*" width="24" height="22" /></a><b>config.h</b></td><td class="desc"></td></tr>
+<tr id="row_0_0_"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img id="arr_0_0_" src="ftv2pnode.png" alt="o" width="16" height="22" onclick="toggleFolder('0_0_')"/><img id="img_0_0_" src="ftv2folderclosed.png" alt="+" width="24" height="22" onclick="toggleFolder('0_0_')"/><a class="el" href="dir_b7cc22b4453454f1e686d9a2e78d988d.html" target="_self">pktools</a></td><td class="desc"></td></tr>
+<tr id="row_0_0_0_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><a href="pktools_2____init_____8py_source.html"><img src="ftv2doc.png" alt="*" width="24" height="22" /></a><b>__init__.py</b></td><td class="desc"></td></tr>
+<tr id="row_0_0_1_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><a href="pktools_2pkcomposite_8py_source.html"><img src="ftv2doc.png" alt="*" width="24" height="22" /></a><b>pkcomposite.py</b></td><td class="desc"></td></tr>
+<tr id="row_0_0_2_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><a href="pktools_2pkcrop_8py_source.html"><img src="ftv2doc.png" alt="*" width="24" height="22" /></a><b>pkcrop.py</b></td><td class="desc"></td></tr>
+<tr id="row_0_0_3_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><a href="pktools_2pkdiff__accuracy_8py_source.html"><img src="ftv2doc.png" alt="*" width="24" height="22" /></a><b>pkdiff_accuracy.py</b></td><td class="desc"></td></tr>
+<tr id="row_0_0_4_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><a href="pktools_2pkextract_8py_source.html"><img src="ftv2doc.png" alt="*" width="24" height="22" /></a><b>pkextract.py</b></td><td class="desc"></td></tr>
+<tr id="row_0_0_5_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><a href="pktools_2pkextract__grid_8py_source.html"><img src="ftv2doc.png" alt="*" width="24" height="22" /></a><b>pkextract_grid.py</b></td><td class="desc"></td></tr>
+<tr id="row_0_0_6_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><a href="pktools_2pkextract__random_8py_source.html"><img src="ftv2doc.png" alt="*" width="24" height="22" /></a><b>pkextract_random.py</b></td><td class="desc"></td></tr>
+<tr id="row_0_0_7_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><a href="pktools_2pkfilter__spatial_8py_source.html"><img src="ftv2doc.png" alt="*" width="24" height="22" /></a><b>pkfilter_spatial.py</b></td><td class="desc"></td></tr>
+<tr id="row_0_0_8_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><a href="pktools_2pkfilter__spectral_8py_source.html"><img src="ftv2doc.png" alt="*" width="24" height="22" /></a><b>pkfilter_spectral.py</b></td><td class="desc"></td></tr>
+<tr id="row_0_0_9_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><a href="pktools_2pkfilterdem_8py_source.html"><img src="ftv2doc.png" alt="*" width="24" height="22" /></a><b>pkfilterdem.py</b></td><td class="desc"></td></tr>
+<tr id="row_0_0_10_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><a href="pktools_2pkgetmask_8py_source.html"><img src="ftv2doc.png" alt="*" width="24" height="22" /></a><b>pkgetmask.py</b></td><td class="desc"></td></tr>
+<tr id="row_0_0_11_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><a href="pktools_2pklas2img_8py_source.html"><img src="ftv2doc.png" alt="*" width="24" height="22" /></a><b>pklas2img.py</b></td><td class="desc"></td></tr>
+<tr id="row_0_0_12_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><a href="pktools_2pkreclass_8py_source.html"><img src="ftv2doc.png" alt="*" width="24" height="22" /></a><b>pkreclass.py</b></td><td class="desc"></td></tr>
+<tr id="row_0_0_13_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><a href="pktools_2pksetmask_8py_source.html"><img src="ftv2doc.png" alt="*" width="24" height="22" /></a><b>pksetmask.py</b></td><td class="desc"></td></tr>
+<tr id="row_0_0_14_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><a href="pktools_2pksvm_8py_source.html"><img src="ftv2doc.png" alt="*" width="24" height="22" /></a><b>pksvm.py</b></td><td class="desc"></td></tr>
+<tr id="row_0_0_15_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><a href="pktools_2pktoolsAlgorithm_8py_source.html"><img src="ftv2doc.png" alt="*" width="24" height="22" /></a><b>pktoolsAlgorithm.py</b></td><td class="desc"></td></tr>
+<tr id="row_0_0_16_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><a href="pktools_2pktoolsAlgorithmProvider_8py_source.html"><img src="ftv2doc.png" alt="*" width="24" height="22" /></a><b>pktoolsAlgorithmProvider.py</b></td><td class="desc"></td></tr>
+<tr id="row_0_0_17_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><a href="pktools_2pktoolsUtils_8py_source.html"><img src="ftv2doc.png" alt="*" width="24" height="22" /></a><b>pktoolsUtils.py</b></td><td class="desc"></td></tr>
+<tr id="row_0_0_18_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2lastnode.png" alt="\" width="16" height="22" /><a href="pktools_2ProcessingPktoolsPlugin_8py_source.html"><img src="ftv2doc.png" alt="*" width="24" height="22" /></a><b>ProcessingPktoolsPlugin.py</b></td><td class="desc"></td></tr>
+<tr id="row_0_1_" class="even"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><a href="____init_____8py_source.html"><img src="ftv2doc.png" alt="*" width="24" height="22" /></a><b>__init__.py</b></td><td class="desc"></td></tr>
+<tr id="row_0_2_"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><a href="pkcomposite_8py_source.html"><img src="ftv2doc.png" alt="*" width="24" height="22" /></a><b>pkcomposite.py</b></td><td class="desc"></td></tr>
+<tr id="row_0_3_" class="even"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><a href="pkcrop_8py_source.html"><img src="ftv2doc.png" alt="*" width="24" height="22" /></a><b>pkcrop.py</b></td><td class="desc"></td></tr>
+<tr id="row_0_4_"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><a href="pkdiff__accuracy_8py_source.html"><img src="ftv2doc.png" alt="*" width="24" height="22" /></a><b>pkdiff_accuracy.py</b></td><td class="desc"></td></tr>
+<tr id="row_0_5_" class="even"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><a href="pkextract_8py_source.html"><img src="ftv2doc.png" alt="*" width="24" height="22" /></a><b>pkextract.py</b></td><td class="desc"></td></tr>
+<tr id="row_0_6_"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><a href="pkextract__grid_8py_source.html"><img src="ftv2doc.png" alt="*" width="24" height="22" /></a><b>pkextract_grid.py</b></td><td class="desc"></td></tr>
+<tr id="row_0_7_" class="even"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><a href="pkextract__random_8py_source.html"><img src="ftv2doc.png" alt="*" width="24" height="22" /></a><b>pkextract_random.py</b></td><td class="desc"></td></tr>
+<tr id="row_0_8_"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><a href="pkfilter__spatial_8py_source.html"><img src="ftv2doc.png" alt="*" width="24" height="22" /></a><b>pkfilter_spatial.py</b></td><td class="desc"></td></tr>
+<tr id="row_0_9_" class="even"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><a href="pkfilter__spectral_8py_source.html"><img src="ftv2doc.png" alt="*" width="24" height="22" /></a><b>pkfilter_spectral.py</b></td><td class="desc"></td></tr>
+<tr id="row_0_10_"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><a href="pkfilterdem_8py_source.html"><img src="ftv2doc.png" alt="*" width="24" height="22" /></a><b>pkfilterdem.py</b></td><td class="desc"></td></tr>
+<tr id="row_0_11_" class="even"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><a href="pkgetmask_8py_source.html"><img src="ftv2doc.png" alt="*" width="24" height="22" /></a><b>pkgetmask.py</b></td><td class="desc"></td></tr>
+<tr id="row_0_12_"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><a href="pklas2img_8py_source.html"><img src="ftv2doc.png" alt="*" width="24" height="22" /></a><b>pklas2img.py</b></td><td class="desc"></td></tr>
+<tr id="row_0_13_" class="even"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><a href="pkreclass_8py_source.html"><img src="ftv2doc.png" alt="*" width="24" height="22" /></a><b>pkreclass.py</b></td><td class="desc"></td></tr>
+<tr id="row_0_14_"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><a href="pksetmask_8py_source.html"><img src="ftv2doc.png" alt="*" width="24" height="22" /></a><b>pksetmask.py</b></td><td class="desc"></td></tr>
+<tr id="row_0_15_" class="even"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><a href="pksvm_8py_source.html"><img src="ftv2doc.png" alt="*" width="24" height="22" /></a><b>pksvm.py</b></td><td class="desc"></td></tr>
+<tr id="row_0_16_"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><a href="pktoolsAlgorithm_8py_source.html"><img src="ftv2doc.png" alt="*" width="24" height="22" /></a><b>pktoolsAlgorithm.py</b></td><td class="desc"></td></tr>
+<tr id="row_0_17_" class="even"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><a href="pktoolsAlgorithmProvider_8py_source.html"><img src="ftv2doc.png" alt="*" width="24" height="22" /></a><b>pktoolsAlgorithmProvider.py</b></td><td class="desc"></td></tr>
+<tr id="row_0_18_"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><a href="pktoolsUtils_8py_source.html"><img src="ftv2doc.png" alt="*" width="24" height="22" /></a><b>pktoolsUtils.py</b></td><td class="desc"></td></tr>
+<tr id="row_0_19_" class="even"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2lastnode.png" alt="\" width="16" height="22" /><a href="ProcessingPktoolsPlugin_8py_source.html"><img src="ftv2doc.png" alt="*" width="24" height="22" /></a><b>ProcessingPktoolsPlugin.py</b></td><td class="desc"></td></tr>
+<tr id="row_1_"><td class="entry"><img id="arr_1_" src="ftv2mnode.png" alt="o" width="16" height="22" onclick="toggleFolder('1_')"/><img id="img_1_" src="ftv2folderopen.png" alt="-" width="24" height="22" onclick="toggleFolder('1_')"/><a class="el" href="dir_0f63d6441a2c250919e1e8723011eb2f.html" target="_self">qt</a></td><td class="desc"></td></tr>
+<tr id="row_1_0_" class="even"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img id="arr_1_0_" src="ftv2pnode.png" alt="o" width="16" height="22" onclick="toggleFolder('1_0_')"/><img id="img_1_0_" src="ftv2folderclosed.png" alt="+" width="24" height="22" onclick="toggleFolder('1_0_')"/><a class="el" href="dir_280a0ba2820d23d6529bf494f1ea3ddd.html" target="_self">build-pkcomposite_gui-gcc-Debug</a></td><td class="desc"></td></tr>
+<tr id="row_1_0_0_" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><a href="build-pkcomposite__gui-gcc-Debug_2moc__mainwindow_8cpp_source.html"><img src="ftv2doc.png" alt="*" width="24" height="22" /></a><b>moc_mainwindow.cpp</b></td><td class="desc"></td></tr>
+<tr id="row_1_0_1_" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2lastnode.png" alt="\" width="16" height="22" /><a href="build-pkcomposite__gui-gcc-Debug_2ui__mainwindow_8h_source.html"><img src="ftv2doc.png" alt="*" width="24" height="22" /></a><b>ui_mainwindow.h</b></td><td class="desc"></td></tr>
+<tr id="row_1_1_"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img id="arr_1_1_" src="ftv2pnode.png" alt="o" width="16" height="22" onclick="toggleFolder('1_1_')"/><img id="img_1_1_" src="ftv2folderclosed.png" alt="+" width="24" height="22" onclick="toggleFolder('1_1_')"/><a class="el" href="dir_b8eb6544d8d9ffceba16909a7b9d17d7.html" target="_self">build-pkcomposite_gui-gcc-Release</a></td><td class="desc"></td></tr>
+<tr id="row_1_1_0_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><a href="build-pkcomposite__gui-gcc-Release_2moc__mainwindow_8cpp_source.html"><img src="ftv2doc.png" alt="*" width="24" height="22" /></a><b>moc_mainwindow.cpp</b></td><td class="desc"></td></tr>
+<tr id="row_1_1_1_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2lastnode.png" alt="\" width="16" height="22" /><a href="build-pkcomposite__gui-gcc-Release_2ui__mainwindow_8h_source.html"><img src="ftv2doc.png" alt="*" width="24" height="22" /></a><b>ui_mainwindow.h</b></td><td class="desc"></td></tr>
+<tr id="row_1_2_" class="even"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img id="arr_1_2_" src="ftv2pnode.png" alt="o" width="16" height="22" onclick="toggleFolder('1_2_')"/><img id="img_1_2_" src="ftv2folderclosed.png" alt="+" width="24" height="22" onclick="toggleFolder('1_2_')"/><a class="el" href="dir_0f38b5d14ac73b43e2a48a75f9e70be8.html" target="_self">build-pkcrop_gui-gcc-Debug</a></td><td class="desc"></td></tr>
+<tr id="row_1_2_0_" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><a href="build-pkcrop__gui-gcc-Debug_2moc__mainwindow_8cpp_source.html"><img src="ftv2doc.png" alt="*" width="24" height="22" /></a><b>moc_mainwindow.cpp</b></td><td class="desc"></td></tr>
+<tr id="row_1_2_1_" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2lastnode.png" alt="\" width="16" height="22" /><a href="build-pkcrop__gui-gcc-Debug_2ui__mainwindow_8h_source.html"><img src="ftv2doc.png" alt="*" width="24" height="22" /></a><b>ui_mainwindow.h</b></td><td class="desc"></td></tr>
+<tr id="row_1_3_"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img id="arr_1_3_" src="ftv2pnode.png" alt="o" width="16" height="22" onclick="toggleFolder('1_3_')"/><img id="img_1_3_" src="ftv2folderclosed.png" alt="+" width="24" height="22" onclick="toggleFolder('1_3_')"/><a class="el" href="dir_f92e37ed5759424bff98155847b1034b.html" target="_self">build-pkcrop_gui-gcc-Release</a></td><td class="desc"></td></tr>
+<tr id="row_1_3_0_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><a href="build-pkcrop__gui-gcc-Release_2moc__mainwindow_8cpp_source.html"><img src="ftv2doc.png" alt="*" width="24" height="22" /></a><b>moc_mainwindow.cpp</b></td><td class="desc"></td></tr>
+<tr id="row_1_3_1_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2lastnode.png" alt="\" width="16" height="22" /><a href="build-pkcrop__gui-gcc-Release_2ui__mainwindow_8h_source.html"><img src="ftv2doc.png" alt="*" width="24" height="22" /></a><b>ui_mainwindow.h</b></td><td class="desc"></td></tr>
+<tr id="row_1_4_" class="even"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img id="arr_1_4_" src="ftv2pnode.png" alt="o" width="16" height="22" onclick="toggleFolder('1_4_')"/><img id="img_1_4_" src="ftv2folderclosed.png" alt="+" width="24" height="22" onclick="toggleFolder('1_4_')"/><a class="el" href="dir_5f1e10fd305b434def78aaf73fd56d60.html" target="_self">build-pkdiff_gui-gcc-Debug</a></td><td class="desc"></td></tr>
+<tr id="row_1_4_0_" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><a href="build-pkdiff__gui-gcc-Debug_2moc__mainwindow_8cpp_source.html"><img src="ftv2doc.png" alt="*" width="24" height="22" /></a><b>moc_mainwindow.cpp</b></td><td class="desc"></td></tr>
+<tr id="row_1_4_1_" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2lastnode.png" alt="\" width="16" height="22" /><a href="build-pkdiff__gui-gcc-Debug_2ui__mainwindow_8h_source.html"><img src="ftv2doc.png" alt="*" width="24" height="22" /></a><b>ui_mainwindow.h</b></td><td class="desc"></td></tr>
+<tr id="row_1_5_"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img id="arr_1_5_" src="ftv2pnode.png" alt="o" width="16" height="22" onclick="toggleFolder('1_5_')"/><img id="img_1_5_" src="ftv2folderclosed.png" alt="+" width="24" height="22" onclick="toggleFolder('1_5_')"/><a class="el" href="dir_4dfaa1fe1382d1276d1c80b1d5035ade.html" target="_self">build-pkdiff_gui-gcc-Release</a></td><td class="desc"></td></tr>
+<tr id="row_1_5_0_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><a href="build-pkdiff__gui-gcc-Release_2moc__mainwindow_8cpp_source.html"><img src="ftv2doc.png" alt="*" width="24" height="22" /></a><b>moc_mainwindow.cpp</b></td><td class="desc"></td></tr>
+<tr id="row_1_5_1_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2lastnode.png" alt="\" width="16" height="22" /><a href="build-pkdiff__gui-gcc-Release_2ui__mainwindow_8h_source.html"><img src="ftv2doc.png" alt="*" width="24" height="22" /></a><b>ui_mainwindow.h</b></td><td class="desc"></td></tr>
+<tr id="row_1_6_" class="even"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img id="arr_1_6_" src="ftv2pnode.png" alt="o" width="16" height="22" onclick="toggleFolder('1_6_')"/><img id="img_1_6_" src="ftv2folderclosed.png" alt="+" width="24" height="22" onclick="toggleFolder('1_6_')"/><a class="el" href="dir_d7b2ebecdb5f44d7fa09bdedebc881a7.html" target="_self">build-pkextract_gui-gcc-Debug</a></td><td class="desc"></td></tr>
+<tr id="row_1_6_0_" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><a href="build-pkextract__gui-gcc-Debug_2moc__mainwindow_8cpp_source.html"><img src="ftv2doc.png" alt="*" width="24" height="22" /></a><b>moc_mainwindow.cpp</b></td><td class="desc"></td></tr>
+<tr id="row_1_6_1_" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2lastnode.png" alt="\" width="16" height="22" /><a href="build-pkextract__gui-gcc-Debug_2ui__mainwindow_8h_source.html"><img src="ftv2doc.png" alt="*" width="24" height="22" /></a><b>ui_mainwindow.h</b></td><td class="desc"></td></tr>
+<tr id="row_1_7_"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img id="arr_1_7_" src="ftv2pnode.png" alt="o" width="16" height="22" onclick="toggleFolder('1_7_')"/><img id="img_1_7_" src="ftv2folderclosed.png" alt="+" width="24" height="22" onclick="toggleFolder('1_7_')"/><a class="el" href="dir_41d189c72498e24f979b227eb8e138b1.html" target="_self">build-pkextract_gui-gcc-Release</a></td><td class="desc"></td></tr>
+<tr id="row_1_7_0_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><a href="build-pkextract__gui-gcc-Release_2moc__mainwindow_8cpp_source.html"><img src="ftv2doc.png" alt="*" width="24" height="22" /></a><b>moc_mainwindow.cpp</b></td><td class="desc"></td></tr>
+<tr id="row_1_7_1_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2lastnode.png" alt="\" width="16" height="22" /><a href="build-pkextract__gui-gcc-Release_2ui__mainwindow_8h_source.html"><img src="ftv2doc.png" alt="*" width="24" height="22" /></a><b>ui_mainwindow.h</b></td><td class="desc"></td></tr>
+<tr id="row_1_8_" class="even"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img id="arr_1_8_" src="ftv2pnode.png" alt="o" width="16" height="22" onclick="toggleFolder('1_8_')"/><img id="img_1_8_" src="ftv2folderclosed.png" alt="+" width="24" height="22" onclick="toggleFolder('1_8_')"/><a class="el" href="dir_e61db0d85028141ec5940fd7f2a6e0fc.html" target="_self">build-pksvm_gui-gcc-Debug</a></td><td class="desc"></td></tr>
+<tr id="row_1_8_0_" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><a href="build-pksvm__gui-gcc-Debug_2moc__mainwindow_8cpp_source.html"><img src="ftv2doc.png" alt="*" width="24" height="22" /></a><b>moc_mainwindow.cpp</b></td><td class="desc"></td></tr>
+<tr id="row_1_8_1_" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2lastnode.png" alt="\" width="16" height="22" /><a href="build-pksvm__gui-gcc-Debug_2ui__mainwindow_8h_source.html"><img src="ftv2doc.png" alt="*" width="24" height="22" /></a><b>ui_mainwindow.h</b></td><td class="desc"></td></tr>
+<tr id="row_1_9_"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img id="arr_1_9_" src="ftv2pnode.png" alt="o" width="16" height="22" onclick="toggleFolder('1_9_')"/><img id="img_1_9_" src="ftv2folderclosed.png" alt="+" width="24" height="22" onclick="toggleFolder('1_9_')"/><a class="el" href="dir_ed1df9621940d6aa1183c365ad1750d2.html" target="_self">build-pksvm_gui-gcc-Release</a></td><td class="desc"></td></tr>
+<tr id="row_1_9_0_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><a href="build-pksvm__gui-gcc-Release_2moc__mainwindow_8cpp_source.html"><img src="ftv2doc.png" alt="*" width="24" height="22" /></a><b>moc_mainwindow.cpp</b></td><td class="desc"></td></tr>
+<tr id="row_1_9_1_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2lastnode.png" alt="\" width="16" height="22" /><a href="build-pksvm__gui-gcc-Release_2ui__mainwindow_8h_source.html"><img src="ftv2doc.png" alt="*" width="24" height="22" /></a><b>ui_mainwindow.h</b></td><td class="desc"></td></tr>
+<tr id="row_1_10_" class="even"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img id="arr_1_10_" src="ftv2pnode.png" alt="o" width="16" height="22" onclick="toggleFolder('1_10_')"/><img id="img_1_10_" src="ftv2folderclosed.png" alt="+" width="24" height="22" onclick="toggleFolder('1_10_')"/><a class="el" href="dir_ab1bbd5a6b4bd6507847335527b029bb.html" target="_self">pkcomposite_gui</a></td><td class="desc"></td></tr>
+<tr id="row_1_10_0_" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><a href="pkcomposite__gui_2main_8cc_source.html"><img src="ftv2doc.png" alt="*" width="24" height="22" /></a><b>main.cc</b></td><td class="desc"></td></tr>
+<tr id="row_1_10_1_" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><a href="pkcomposite__gui_2mainwindow_8cc_source.html"><img src="ftv2doc.png" alt="*" width="24" height="22" /></a><b>mainwindow.cc</b></td><td class="desc"></td></tr>
+<tr id="row_1_10_2_" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2lastnode.png" alt="\" width="16" height="22" /><a href="pkcomposite__gui_2mainwindow_8h_source.html"><img src="ftv2doc.png" alt="*" width="24" height="22" /></a><b>mainwindow.h</b></td><td class="desc"></td></tr>
+<tr id="row_1_11_"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img id="arr_1_11_" src="ftv2pnode.png" alt="o" width="16" height="22" onclick="toggleFolder('1_11_')"/><img id="img_1_11_" src="ftv2folderclosed.png" alt="+" width="24" height="22" onclick="toggleFolder('1_11_')"/><a class="el" href="dir_35acdce8930fac877097c845a64519e5.html" target="_self">pkcrop_gui</a></td><td class="desc"></td></tr>
+<tr id="row_1_11_0_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><a href="pkcrop__gui_2main_8cc_source.html"><img src="ftv2doc.png" alt="*" width="24" height="22" /></a><b>main.cc</b></td><td class="desc"></td></tr>
+<tr id="row_1_11_1_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><a href="pkcrop__gui_2mainwindow_8cc_source.html"><img src="ftv2doc.png" alt="*" width="24" height="22" /></a><b>mainwindow.cc</b></td><td class="desc"></td></tr>
+<tr id="row_1_11_2_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2lastnode.png" alt="\" width="16" height="22" /><a href="pkcrop__gui_2mainwindow_8h_source.html"><img src="ftv2doc.png" alt="*" width="24" height="22" /></a><b>mainwindow.h</b></td><td class="desc"></td></tr>
+<tr id="row_1_12_" class="even"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img id="arr_1_12_" src="ftv2pnode.png" alt="o" width="16" height="22" onclick="toggleFolder('1_12_')"/><img id="img_1_12_" src="ftv2folderclosed.png" alt="+" width="24" height="22" onclick="toggleFolder('1_12_')"/><a class="el" href="dir_b6b6de371025fb67c6b8623f3d3cd2ce.html" target="_self">pkdiff_gui</a></td><td class="desc"></td></tr>
+<tr id="row_1_12_0_" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><a href="pkdiff__gui_2main_8cpp_source.html"><img src="ftv2doc.png" alt="*" width="24" height="22" /></a><b>main.cpp</b></td><td class="desc"></td></tr>
+<tr id="row_1_12_1_" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><a href="pkdiff__gui_2mainwindow_8cpp_source.html"><img src="ftv2doc.png" alt="*" width="24" height="22" /></a><b>mainwindow.cpp</b></td><td class="desc"></td></tr>
+<tr id="row_1_12_2_" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2lastnode.png" alt="\" width="16" height="22" /><a href="pkdiff__gui_2mainwindow_8h_source.html"><img src="ftv2doc.png" alt="*" width="24" height="22" /></a><b>mainwindow.h</b></td><td class="desc"></td></tr>
+<tr id="row_1_13_"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img id="arr_1_13_" src="ftv2pnode.png" alt="o" width="16" height="22" onclick="toggleFolder('1_13_')"/><img id="img_1_13_" src="ftv2folderclosed.png" alt="+" width="24" height="22" onclick="toggleFolder('1_13_')"/><a class="el" href="dir_2676862852e3d558e3597542a81ecc63.html" target="_self">pkextract_gui</a></td><td class="desc"></td></tr>
+<tr id="row_1_13_0_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><a href="pkextract__gui_2main_8cpp_source.html"><img src="ftv2doc.png" alt="*" width="24" height="22" /></a><b>main.cpp</b></td><td class="desc"></td></tr>
+<tr id="row_1_13_1_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><a href="pkextract__gui_2mainwindow_8cpp_source.html"><img src="ftv2doc.png" alt="*" width="24" height="22" /></a><b>mainwindow.cpp</b></td><td class="desc"></td></tr>
+<tr id="row_1_13_2_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2lastnode.png" alt="\" width="16" height="22" /><a href="pkextract__gui_2mainwindow_8h_source.html"><img src="ftv2doc.png" alt="*" width="24" height="22" /></a><b>mainwindow.h</b></td><td class="desc"></td></tr>
+<tr id="row_1_14_" class="even"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img id="arr_1_14_" src="ftv2plastnode.png" alt="\" width="16" height="22" onclick="toggleFolder('1_14_')"/><img id="img_1_14_" src="ftv2folderclosed.png" alt="+" width="24" height="22" onclick="toggleFolder('1_14_')"/><a class="el" href="dir_b66e135988e27fdc966ddddb8708f514.html" target="_self">pksvm_gui</a></td><td class="desc"></td></tr>
+<tr id="row_1_14_0_" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2blank.png" alt=" " width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><a href="pksvm__gui_2main_8cpp_source.html"><img src="ftv2doc.png" alt="*" width="24" height="22" /></a><b>main.cpp</b></td><td class="desc"></td></tr>
+<tr id="row_1_14_1_" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2blank.png" alt=" " width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><a href="pksvm__gui_2mainwindow_8cpp_source.html"><img src="ftv2doc.png" alt="*" width="24" height="22" /></a><b>mainwindow.cpp</b></td><td class="desc"></td></tr>
+<tr id="row_1_14_2_" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2blank.png" alt=" " width="16" height="22" /><img src="ftv2lastnode.png" alt="\" width="16" height="22" /><a href="pksvm__gui_2mainwindow_8h_source.html"><img src="ftv2doc.png" alt="*" width="24" height="22" /></a><b>mainwindow.h</b></td><td class="desc"></td></tr>
+<tr id="row_2_"><td class="entry"><img id="arr_2_" src="ftv2mnode.png" alt="o" width="16" height="22" onclick="toggleFolder('2_')"/><img id="img_2_" src="ftv2folderopen.png" alt="-" width="24" height="22" onclick="toggleFolder('2_')"/><a class="el" href="dir_68267d1309a1af8e8297ef4c3efbcdba.html" target="_self">src</a></td><td class="desc"></td></tr>
+<tr id="row_2_0_" class="even"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img id="arr_2_0_" src="ftv2pnode.png" alt="o" width="16" height="22" onclick="toggleFolder('2_0_')"/><img id="img_2_0_" src="ftv2folderclosed.png" alt="+" width="24" height="22" onclick="toggleFolder('2_0_')"/><a class="el" href="dir_e6df591b0639d4c4807ef64d058833e2.html" target="_self">algorithms</a></td><td class="desc"></td></tr>
+<tr id="row_2_0_0_" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><a href="ConfusionMatrix_8cc_source.html"><img src="ftv2doc.png" alt="*" width="24" height="22" /></a><b>ConfusionMatrix.cc</b></td><td class="desc"></td></tr>
+<tr id="row_2_0_1_" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><a href="ConfusionMatrix_8h_source.html"><img src="ftv2doc.png" alt="*" width="24" height="22" /></a><b>ConfusionMatrix.h</b></td><td class="desc"></td></tr>
+<tr id="row_2_0_2_" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><a href="CostFactory_8h_source.html"><img src="ftv2doc.png" alt="*" width="24" height="22" /></a><b>CostFactory.h</b></td><td class="desc"></td></tr>
+<tr id="row_2_0_3_" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><a href="CostFactorySVM_8cc_source.html"><img src="ftv2doc.png" alt="*" width="24" height="22" /></a><b>CostFactorySVM.cc</b></td><td class="desc"></td></tr>
+<tr id="row_2_0_4_" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><a href="CostFactorySVM_8h_source.html"><img src="ftv2doc.png" alt="*" width="24" height="22" /></a><b>CostFactorySVM.h</b></td><td class="desc"></td></tr>
+<tr id="row_2_0_5_" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><a href="Egcs_8cc_source.html"><img src="ftv2doc.png" alt="*" width="24" height="22" /></a><b>Egcs.cc</b></td><td class="desc"></td></tr>
+<tr id="row_2_0_6_" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><a href="Egcs_8h_source.html"><img src="ftv2doc.png" alt="*" width="24" height="22" /></a><b>Egcs.h</b></td><td class="desc"></td></tr>
+<tr id="row_2_0_7_" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><a href="FeatureSelector_8h_source.html"><img src="ftv2doc.png" alt="*" width="24" height="22" /></a><b>FeatureSelector.h</b></td><td class="desc"></td></tr>
+<tr id="row_2_0_8_" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><a href="Filter_8cc_source.html"><img src="ftv2doc.png" alt="*" width="24" height="22" /></a><b>Filter.cc</b></td><td class="desc"></td></tr>
+<tr id="row_2_0_9_" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><a href="Filter_8h_source.html"><img src="ftv2doc.png" alt="*" width="24" height="22" /></a><b>Filter.h</b></td><td class="desc"></td></tr>
+<tr id="row_2_0_10_" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><a href="Filter2d_8cc_source.html"><img src="ftv2doc.png" alt="*" width="24" height="22" /></a><b>Filter2d.cc</b></td><td class="desc"></td></tr>
+<tr id="row_2_0_11_" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><a href="Filter2d_8h_source.html"><img src="ftv2doc.png" alt="*" width="24" height="22" /></a><b>Filter2d.h</b></td><td class="desc"></td></tr>
+<tr id="row_2_0_12_" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><a href="Filter__old_8h_source.html"><img src="ftv2doc.png" alt="*" width="24" height="22" /></a><b>Filter_old.h</b></td><td class="desc"></td></tr>
+<tr id="row_2_0_13_" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><a href="ImgRegression_8cc_source.html"><img src="ftv2doc.png" alt="*" width="24" height="22" /></a><b>ImgRegression.cc</b></td><td class="desc"></td></tr>
+<tr id="row_2_0_14_" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><a href="ImgRegression_8h_source.html"><img src="ftv2doc.png" alt="*" width="24" height="22" /></a><b>ImgRegression.h</b></td><td class="desc"></td></tr>
+<tr id="row_2_0_15_" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><a href="myfann__cpp_8h_source.html"><img src="ftv2doc.png" alt="*" width="24" height="22" /></a><b>myfann_cpp.h</b></td><td class="desc"></td></tr>
+<tr id="row_2_0_16_" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><a href="OptFactory_8h_source.html"><img src="ftv2doc.png" alt="*" width="24" height="22" /></a><b>OptFactory.h</b></td><td class="desc"></td></tr>
+<tr id="row_2_0_17_" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><a href="StatFactory_8h_source.html"><img src="ftv2doc.png" alt="*" width="24" height="22" /></a><b>StatFactory.h</b></td><td class="desc"></td></tr>
+<tr id="row_2_0_18_" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><a href="svm_8cpp_source.html"><img src="ftv2doc.png" alt="*" width="24" height="22" /></a><b>svm.cpp</b></td><td class="desc"></td></tr>
+<tr id="row_2_0_19_" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2lastnode.png" alt="\" width="16" height="22" /><a href="svm_8h_source.html"><img src="ftv2doc.png" alt="*" width="24" height="22" /></a><b>svm.h</b></td><td class="desc"></td></tr>
+<tr id="row_2_1_"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img id="arr_2_1_" src="ftv2pnode.png" alt="o" width="16" height="22" onclick="toggleFolder('2_1_')"/><img id="img_2_1_" src="ftv2folderclosed.png" alt="+" width="24" height="22" onclick="toggleFolder('2_1_')"/><a class="el" href="dir_53adf0b982dc8545998aae3f283a5a58.html" target="_self">apps</a></td><td class="desc"></td></tr>
+<tr id="row_2_1_0_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img id="arr_2_1_0_" src="ftv2pnode.png" alt="o" width="16" height="22" onclick="toggleFolder('2_1_0_')"/><img id="img_2_1_0_" src="ftv2folderclosed.png" alt="+" width="24" height="22" onclick="toggleFolder('2_1_0_')"/><a class="el" href="dir_e28b2035b152bb51229fe7a0fca4e376.html" target="_self"> [...]
+<tr id="row_2_1_0_0_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><a href="pkeditogr_8cc_source.html"><img src="ftv2doc.png" alt="*" width="24" height="22" /></a><b>pkeditogr.cc</b></td><td class="desc"></td></tr>
+<tr id="row_2_1_0_1_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><a href="pkenhance_8cc_source.html"><img src="ftv2doc.png" alt="*" width="24" height="22" /></a><b>pkenhance.cc</b></td><td class="desc"></td></tr>
+<tr id="row_2_1_0_2_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2lastnode.png" alt="\" width="16" height="22" /><a href="pkndvi_8cc_source.html"><img src="ftv2doc.png" alt="*" width="24" height="22" /></a><b>pkndvi.cc</b></td><td class="desc"></td></tr>
+<tr id="row_2_1_1_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><a href="pkann_8cc_source.html"><img src="ftv2doc.png" alt="*" width="24" height="22" /></a><b>pkann.cc</b></td><td class="desc"></td></tr>
+<tr id="row_2_1_2_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><a href="pkascii2img_8cc_source.html"><img src="ftv2doc.png" alt="*" width="24" height="22" /></a><b>pkascii2img.cc</b></td><td class="desc"></td></tr>
+<tr id="row_2_1_3_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><a href="pkascii2ogr_8cc_source.html"><img src="ftv2doc.png" alt="*" width="24" height="22" /></a><b>pkascii2ogr.cc</b></td><td class="desc"></td></tr>
+<tr id="row_2_1_4_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><a href="pkcomposite_8cc_source.html"><img src="ftv2doc.png" alt="*" width="24" height="22" /></a><b>pkcomposite.cc</b></td><td class="desc"></td></tr>
+<tr id="row_2_1_5_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><a href="pkcreatect_8cc_source.html"><img src="ftv2doc.png" alt="*" width="24" height="22" /></a><b>pkcreatect.cc</b></td><td class="desc"></td></tr>
+<tr id="row_2_1_6_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><a href="pkcrop_8cc_source.html"><img src="ftv2doc.png" alt="*" width="24" height="22" /></a><b>pkcrop.cc</b></td><td class="desc"></td></tr>
+<tr id="row_2_1_7_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><a href="pkdiff_8cc_source.html"><img src="ftv2doc.png" alt="*" width="24" height="22" /></a><b>pkdiff.cc</b></td><td class="desc"></td></tr>
+<tr id="row_2_1_8_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><a href="pkdsm2shadow_8cc_source.html"><img src="ftv2doc.png" alt="*" width="24" height="22" /></a><b>pkdsm2shadow.cc</b></td><td class="desc"></td></tr>
+<tr id="row_2_1_9_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><a href="pkdumpimg_8cc_source.html"><img src="ftv2doc.png" alt="*" width="24" height="22" /></a><b>pkdumpimg.cc</b></td><td class="desc"></td></tr>
+<tr id="row_2_1_10_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><a href="pkdumpogr_8cc_source.html"><img src="ftv2doc.png" alt="*" width="24" height="22" /></a><b>pkdumpogr.cc</b></td><td class="desc"></td></tr>
+<tr id="row_2_1_11_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><a href="pkdumpogr_8h_source.html"><img src="ftv2doc.png" alt="*" width="24" height="22" /></a><b>pkdumpogr.h</b></td><td class="desc"></td></tr>
+<tr id="row_2_1_12_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><a href="pkegcs_8cc_source.html"><img src="ftv2doc.png" alt="*" width="24" height="22" /></a><b>pkegcs.cc</b></td><td class="desc"></td></tr>
+<tr id="row_2_1_13_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><a href="pkextract_8cc_source.html"><img src="ftv2doc.png" alt="*" width="24" height="22" /></a><b>pkextract.cc</b></td><td class="desc"></td></tr>
+<tr id="row_2_1_14_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><a href="pkfillnodata_8cc_source.html"><img src="ftv2doc.png" alt="*" width="24" height="22" /></a><b>pkfillnodata.cc</b></td><td class="desc"></td></tr>
+<tr id="row_2_1_15_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><a href="pkfilter_8cc_source.html"><img src="ftv2doc.png" alt="*" width="24" height="22" /></a><b>pkfilter.cc</b></td><td class="desc"></td></tr>
+<tr id="row_2_1_16_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><a href="pkfilterascii_8cc_source.html"><img src="ftv2doc.png" alt="*" width="24" height="22" /></a><b>pkfilterascii.cc</b></td><td class="desc"></td></tr>
+<tr id="row_2_1_17_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><a href="pkfilterdem_8cc_source.html"><img src="ftv2doc.png" alt="*" width="24" height="22" /></a><b>pkfilterdem.cc</b></td><td class="desc"></td></tr>
+<tr id="row_2_1_18_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><a href="pkfsann_8cc_source.html"><img src="ftv2doc.png" alt="*" width="24" height="22" /></a><b>pkfsann.cc</b></td><td class="desc"></td></tr>
+<tr id="row_2_1_19_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><a href="pkfsann_8h_source.html"><img src="ftv2doc.png" alt="*" width="24" height="22" /></a><b>pkfsann.h</b></td><td class="desc"></td></tr>
+<tr id="row_2_1_20_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><a href="pkfssvm_8cc_source.html"><img src="ftv2doc.png" alt="*" width="24" height="22" /></a><b>pkfssvm.cc</b></td><td class="desc"></td></tr>
+<tr id="row_2_1_21_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><a href="pkgetmask_8cc_source.html"><img src="ftv2doc.png" alt="*" width="24" height="22" /></a><b>pkgetmask.cc</b></td><td class="desc"></td></tr>
+<tr id="row_2_1_22_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><a href="pkinfo_8cc_source.html"><img src="ftv2doc.png" alt="*" width="24" height="22" /></a><b>pkinfo.cc</b></td><td class="desc"></td></tr>
+<tr id="row_2_1_23_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><a href="pkkalman_8cc_source.html"><img src="ftv2doc.png" alt="*" width="24" height="22" /></a><b>pkkalman.cc</b></td><td class="desc"></td></tr>
+<tr id="row_2_1_24_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><a href="pkkalman1_8cc_source.html"><img src="ftv2doc.png" alt="*" width="24" height="22" /></a><b>pkkalman1.cc</b></td><td class="desc"></td></tr>
+<tr id="row_2_1_25_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><a href="pklas2img_8cc_source.html"><img src="ftv2doc.png" alt="*" width="24" height="22" /></a><b>pklas2img.cc</b></td><td class="desc"></td></tr>
+<tr id="row_2_1_26_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><a href="pkoptsvm_8cc_source.html"><img src="ftv2doc.png" alt="*" width="24" height="22" /></a><b>pkoptsvm.cc</b></td><td class="desc"></td></tr>
+<tr id="row_2_1_27_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><a href="pkpolygonize_8cc_source.html"><img src="ftv2doc.png" alt="*" width="24" height="22" /></a><b>pkpolygonize.cc</b></td><td class="desc"></td></tr>
+<tr id="row_2_1_28_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><a href="pkreclass_8cc_source.html"><img src="ftv2doc.png" alt="*" width="24" height="22" /></a><b>pkreclass.cc</b></td><td class="desc"></td></tr>
+<tr id="row_2_1_29_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><a href="pkregann_8cc_source.html"><img src="ftv2doc.png" alt="*" width="24" height="22" /></a><b>pkregann.cc</b></td><td class="desc"></td></tr>
+<tr id="row_2_1_30_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><a href="pksensormodel_8h_source.html"><img src="ftv2doc.png" alt="*" width="24" height="22" /></a><b>pksensormodel.h</b></td><td class="desc"></td></tr>
+<tr id="row_2_1_31_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><a href="pksetmask_8cc_source.html"><img src="ftv2doc.png" alt="*" width="24" height="22" /></a><b>pksetmask.cc</b></td><td class="desc"></td></tr>
+<tr id="row_2_1_32_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><a href="pksieve_8cc_source.html"><img src="ftv2doc.png" alt="*" width="24" height="22" /></a><b>pksieve.cc</b></td><td class="desc"></td></tr>
+<tr id="row_2_1_33_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><a href="pkstat_8cc_source.html"><img src="ftv2doc.png" alt="*" width="24" height="22" /></a><b>pkstat.cc</b></td><td class="desc"></td></tr>
+<tr id="row_2_1_34_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><a href="pkstatascii_8cc_source.html"><img src="ftv2doc.png" alt="*" width="24" height="22" /></a><b>pkstatascii.cc</b></td><td class="desc"></td></tr>
+<tr id="row_2_1_35_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><a href="pkstatogr_8cc_source.html"><img src="ftv2doc.png" alt="*" width="24" height="22" /></a><b>pkstatogr.cc</b></td><td class="desc"></td></tr>
+<tr id="row_2_1_36_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2lastnode.png" alt="\" width="16" height="22" /><a href="pksvm_8cc_source.html"><img src="ftv2doc.png" alt="*" width="24" height="22" /></a><b>pksvm.cc</b></td><td class="desc"></td></tr>
+<tr id="row_2_2_" class="even"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img id="arr_2_2_" src="ftv2pnode.png" alt="o" width="16" height="22" onclick="toggleFolder('2_2_')"/><img id="img_2_2_" src="ftv2folderclosed.png" alt="+" width="24" height="22" onclick="toggleFolder('2_2_')"/><a class="el" href="dir_0af1587c8378955de40f48b4bd1869f0.html" target="_self">base</a></td><td class="desc"></td></tr>
+<tr id="row_2_2_0_" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><a href="IndexValue_8h_source.html"><img src="ftv2doc.png" alt="*" width="24" height="22" /></a><b>IndexValue.h</b></td><td class="desc"></td></tr>
+<tr id="row_2_2_1_" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><a href="Optionpk_8h_source.html"><img src="ftv2doc.png" alt="*" width="24" height="22" /></a><b>Optionpk.h</b></td><td class="desc"></td></tr>
+<tr id="row_2_2_2_" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><a href="pktestOption_8cc_source.html"><img src="ftv2doc.png" alt="*" width="24" height="22" /></a><b>pktestOption.cc</b></td><td class="desc"></td></tr>
+<tr id="row_2_2_3_" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><a href="PosValue_8h_source.html"><img src="ftv2doc.png" alt="*" width="24" height="22" /></a><b>PosValue.h</b></td><td class="desc"></td></tr>
+<tr id="row_2_2_4_" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2lastnode.png" alt="\" width="16" height="22" /><a href="Vector2d_8h_source.html"><img src="ftv2doc.png" alt="*" width="24" height="22" /></a><b>Vector2d.h</b></td><td class="desc"></td></tr>
+<tr id="row_2_3_"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img id="arr_2_3_" src="ftv2pnode.png" alt="o" width="16" height="22" onclick="toggleFolder('2_3_')"/><img id="img_2_3_" src="ftv2folderclosed.png" alt="+" width="24" height="22" onclick="toggleFolder('2_3_')"/><a class="el" href="dir_849702d4228bd835bdf1201002937cb3.html" target="_self">fileclasses</a></td><td class="desc"></td></tr>
+<tr id="row_2_3_0_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><a href="FileReaderAscii_8cc_source.html"><img src="ftv2doc.png" alt="*" width="24" height="22" /></a><b>FileReaderAscii.cc</b></td><td class="desc"></td></tr>
+<tr id="row_2_3_1_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2lastnode.png" alt="\" width="16" height="22" /><a href="FileReaderAscii_8h_source.html"><img src="ftv2doc.png" alt="*" width="24" height="22" /></a><b>FileReaderAscii.h</b></td><td class="desc"></td></tr>
+<tr id="row_2_4_" class="even"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img id="arr_2_4_" src="ftv2pnode.png" alt="o" width="16" height="22" onclick="toggleFolder('2_4_')"/><img id="img_2_4_" src="ftv2folderclosed.png" alt="+" width="24" height="22" onclick="toggleFolder('2_4_')"/><a class="el" href="dir_6d2fd95b0bd390617ad5a1eb4a537b4a.html" target="_self">imageclasses</a></td><td class="desc"></td></tr>
+<tr id="row_2_4_0_" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><a href="ImgReaderGdal_8cc_source.html"><img src="ftv2doc.png" alt="*" width="24" height="22" /></a><b>ImgReaderGdal.cc</b></td><td class="desc"></td></tr>
+<tr id="row_2_4_1_" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><a href="ImgReaderGdal_8h_source.html"><img src="ftv2doc.png" alt="*" width="24" height="22" /></a><b>ImgReaderGdal.h</b></td><td class="desc"></td></tr>
+<tr id="row_2_4_2_" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><a href="ImgReaderOgr_8cc_source.html"><img src="ftv2doc.png" alt="*" width="24" height="22" /></a><b>ImgReaderOgr.cc</b></td><td class="desc"></td></tr>
+<tr id="row_2_4_3_" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><a href="ImgReaderOgr_8h_source.html"><img src="ftv2doc.png" alt="*" width="24" height="22" /></a><b>ImgReaderOgr.h</b></td><td class="desc"></td></tr>
+<tr id="row_2_4_4_" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><a href="ImgWriterGdal_8cc_source.html"><img src="ftv2doc.png" alt="*" width="24" height="22" /></a><b>ImgWriterGdal.cc</b></td><td class="desc"></td></tr>
+<tr id="row_2_4_5_" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><a href="ImgWriterGdal_8h_source.html"><img src="ftv2doc.png" alt="*" width="24" height="22" /></a><b>ImgWriterGdal.h</b></td><td class="desc"></td></tr>
+<tr id="row_2_4_6_" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><a href="ImgWriterOgr_8cc_source.html"><img src="ftv2doc.png" alt="*" width="24" height="22" /></a><b>ImgWriterOgr.cc</b></td><td class="desc"></td></tr>
+<tr id="row_2_4_7_" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2lastnode.png" alt="\" width="16" height="22" /><a href="ImgWriterOgr_8h_source.html"><img src="ftv2doc.png" alt="*" width="24" height="22" /></a><b>ImgWriterOgr.h</b></td><td class="desc"></td></tr>
+<tr id="row_2_5_"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img id="arr_2_5_" src="ftv2plastnode.png" alt="\" width="16" height="22" onclick="toggleFolder('2_5_')"/><img id="img_2_5_" src="ftv2folderclosed.png" alt="+" width="24" height="22" onclick="toggleFolder('2_5_')"/><a class="el" href="dir_89a0bd85ecec8fbb2c320310670be290.html" target="_self">lasclasses</a></td><td class="desc"></td></tr>
+<tr id="row_2_5_0_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2blank.png" alt=" " width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><a href="FileReaderLas_8cc_source.html"><img src="ftv2doc.png" alt="*" width="24" height="22" /></a><b>FileReaderLas.cc</b></td><td class="desc"></td></tr>
+<tr id="row_2_5_1_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2blank.png" alt=" " width="16" height="22" /><img src="ftv2lastnode.png" alt="\" width="16" height="22" /><a href="FileReaderLas_8h_source.html"><img src="ftv2doc.png" alt="*" width="24" height="22" /></a><b>FileReaderLas.h</b></td><td class="desc"></td></tr>
+<tr id="row_3_" class="even"><td class="entry"><img id="arr_3_" src="ftv2mnode.png" alt="o" width="16" height="22" onclick="toggleFolder('3_')"/><img id="img_3_" src="ftv2folderopen.png" alt="-" width="24" height="22" onclick="toggleFolder('3_')"/><a class="el" href="dir_457de909e3893805a4d2d0b8c0742bd8.html" target="_self">vis_studio</a></td><td class="desc"></td></tr>
+<tr id="row_3_0_"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img id="arr_3_0_" src="ftv2pnode.png" alt="o" width="16" height="22" onclick="toggleFolder('3_0_')"/><img id="img_3_0_" src="ftv2folderclosed.png" alt="+" width="24" height="22" onclick="toggleFolder('3_0_')"/><a class="el" href="dir_0d45166ba6790a432639a127a727f02c.html" target="_self">base</a></td><td class="desc"></td></tr>
+<tr id="row_3_0_0_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2lastnode.png" alt="\" width="16" height="22" /><a href="Optionpk_8cc_source.html"><img src="ftv2doc.png" alt="*" width="24" height="22" /></a><b>Optionpk.cc</b></td><td class="desc"></td></tr>
+<tr id="row_3_1_" class="even"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2lastnode.png" alt="\" width="16" height="22" /><a href="vis__studio_2config_8h_source.html"><img src="ftv2doc.png" alt="*" width="24" height="22" /></a><b>config.h</b></td><td class="desc"></td></tr>
+<tr id="row_4_"><td class="entry"><img src="ftv2lastnode.png" alt="\" width="16" height="22" /><a href="config_8h_source.html"><img src="ftv2doc.png" alt="*" width="24" height="22" /></a><b>config.h</b></td><td class="desc"></td></tr>
 </table>
 </div><!-- directory -->
 </div><!-- contents -->
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Jun 23 2015 17:09:37 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/functions.html b/doc/html/functions.html
index 9250c52..a23e3ea 100644
--- a/doc/html/functions.html
+++ b/doc/html/functions.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.3</span>
+    <span id="projectnumber">2.6.4</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -59,7 +59,8 @@
 : <a class="el" href="classOptionpk.html#a092414f315f6b310fc88eaf5688b81f4">Optionpk< T ></a>
 </li>
 <li>getDescription()
-: <a class="el" href="classqgis_1_1pktoolsAlgorithmProvider_1_1pktoolsAlgorithmProvider.html#aa6d4f9562f9502ae7c12e90d0d95d7b1">qgis.pktoolsAlgorithmProvider.pktoolsAlgorithmProvider</a>
+: <a class="el" href="classqgis_1_1pktools_1_1pktoolsAlgorithmProvider_1_1pktoolsAlgorithmProvider.html#a7ccc5c08d6d0d906b57e978657d628c8">qgis.pktools.pktoolsAlgorithmProvider.pktoolsAlgorithmProvider</a>
+, <a class="el" href="classqgis_1_1pktoolsAlgorithmProvider_1_1pktoolsAlgorithmProvider.html#aa6d4f9562f9502ae7c12e90d0d95d7b1">qgis.pktoolsAlgorithmProvider.pktoolsAlgorithmProvider</a>
 </li>
 <li>getGPLv3License()
 : <a class="el" href="classOptionpk.html#acb7e411ce6a318424bf2ad1f9dc846ff">Optionpk< T ></a>
@@ -71,13 +72,15 @@
 : <a class="el" href="classOptionpk.html#af7ce0ff4dfe57f1e6685b67fb1d70b69">Optionpk< T ></a>
 </li>
 <li>getName()
-: <a class="el" href="classqgis_1_1pktoolsAlgorithmProvider_1_1pktoolsAlgorithmProvider.html#ac0eb1ee881715c3efe5819e23b8ff473">qgis.pktoolsAlgorithmProvider.pktoolsAlgorithmProvider</a>
+: <a class="el" href="classqgis_1_1pktools_1_1pktoolsAlgorithmProvider_1_1pktoolsAlgorithmProvider.html#aa1d3118388803531aa5368f90bd0dbce">qgis.pktools.pktoolsAlgorithmProvider.pktoolsAlgorithmProvider</a>
+, <a class="el" href="classqgis_1_1pktoolsAlgorithmProvider_1_1pktoolsAlgorithmProvider.html#ac0eb1ee881715c3efe5819e23b8ff473">qgis.pktoolsAlgorithmProvider.pktoolsAlgorithmProvider</a>
 </li>
 <li>getShortName()
 : <a class="el" href="classOptionpk.html#ae0d0d55bac2456e6cbcec97892667742">Optionpk< T ></a>
 </li>
 <li>initializeSettings()
-: <a class="el" href="classqgis_1_1pktoolsAlgorithmProvider_1_1pktoolsAlgorithmProvider.html#a41cbf8f2612d0ba5e7e858f421e4c344">qgis.pktoolsAlgorithmProvider.pktoolsAlgorithmProvider</a>
+: <a class="el" href="classqgis_1_1pktools_1_1pktoolsAlgorithmProvider_1_1pktoolsAlgorithmProvider.html#a3c0515d681ec29ab388bc10d2d5cb455">qgis.pktools.pktoolsAlgorithmProvider.pktoolsAlgorithmProvider</a>
+, <a class="el" href="classqgis_1_1pktoolsAlgorithmProvider_1_1pktoolsAlgorithmProvider.html#a41cbf8f2612d0ba5e7e858f421e4c344">qgis.pktoolsAlgorithmProvider.pktoolsAlgorithmProvider</a>
 </li>
 <li>operator<<
 : <a class="el" href="classOptionpk.html#a4ab58d03540efa49fe3ebf6a58507f23">Optionpk< T ></a>
@@ -107,7 +110,8 @@
 : <a class="el" href="classOptionpk.html#a561e7d4b4141cd9023563d4dee01b932">Optionpk< T ></a>
 </li>
 <li>unload()
-: <a class="el" href="classqgis_1_1pktoolsAlgorithmProvider_1_1pktoolsAlgorithmProvider.html#a458d5bb02c856ca83d7ca332ff4125aa">qgis.pktoolsAlgorithmProvider.pktoolsAlgorithmProvider</a>
+: <a class="el" href="classqgis_1_1pktools_1_1pktoolsAlgorithmProvider_1_1pktoolsAlgorithmProvider.html#a0d55ab57e07e57292f309173cf65114f">qgis.pktools.pktoolsAlgorithmProvider.pktoolsAlgorithmProvider</a>
+, <a class="el" href="classqgis_1_1pktoolsAlgorithmProvider_1_1pktoolsAlgorithmProvider.html#a458d5bb02c856ca83d7ca332ff4125aa">qgis.pktoolsAlgorithmProvider.pktoolsAlgorithmProvider</a>
 </li>
 <li>~Optionpk()
 : <a class="el" href="classOptionpk.html#aacf921491e6b6fab3c4cad8b39594cff">Optionpk< T ></a>
@@ -117,7 +121,7 @@
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Jun 23 2015 17:09:37 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/functions_func.html b/doc/html/functions_func.html
index 0e1304d..45c58b8 100644
--- a/doc/html/functions_func.html
+++ b/doc/html/functions_func.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.3</span>
+    <span id="projectnumber">2.6.4</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -59,7 +59,8 @@
 : <a class="el" href="classOptionpk.html#a092414f315f6b310fc88eaf5688b81f4">Optionpk< T ></a>
 </li>
 <li>getDescription()
-: <a class="el" href="classqgis_1_1pktoolsAlgorithmProvider_1_1pktoolsAlgorithmProvider.html#aa6d4f9562f9502ae7c12e90d0d95d7b1">qgis.pktoolsAlgorithmProvider.pktoolsAlgorithmProvider</a>
+: <a class="el" href="classqgis_1_1pktools_1_1pktoolsAlgorithmProvider_1_1pktoolsAlgorithmProvider.html#a7ccc5c08d6d0d906b57e978657d628c8">qgis.pktools.pktoolsAlgorithmProvider.pktoolsAlgorithmProvider</a>
+, <a class="el" href="classqgis_1_1pktoolsAlgorithmProvider_1_1pktoolsAlgorithmProvider.html#aa6d4f9562f9502ae7c12e90d0d95d7b1">qgis.pktoolsAlgorithmProvider.pktoolsAlgorithmProvider</a>
 </li>
 <li>getGPLv3License()
 : <a class="el" href="classOptionpk.html#acb7e411ce6a318424bf2ad1f9dc846ff">Optionpk< T ></a>
@@ -71,13 +72,15 @@
 : <a class="el" href="classOptionpk.html#af7ce0ff4dfe57f1e6685b67fb1d70b69">Optionpk< T ></a>
 </li>
 <li>getName()
-: <a class="el" href="classqgis_1_1pktoolsAlgorithmProvider_1_1pktoolsAlgorithmProvider.html#ac0eb1ee881715c3efe5819e23b8ff473">qgis.pktoolsAlgorithmProvider.pktoolsAlgorithmProvider</a>
+: <a class="el" href="classqgis_1_1pktools_1_1pktoolsAlgorithmProvider_1_1pktoolsAlgorithmProvider.html#aa1d3118388803531aa5368f90bd0dbce">qgis.pktools.pktoolsAlgorithmProvider.pktoolsAlgorithmProvider</a>
+, <a class="el" href="classqgis_1_1pktoolsAlgorithmProvider_1_1pktoolsAlgorithmProvider.html#ac0eb1ee881715c3efe5819e23b8ff473">qgis.pktoolsAlgorithmProvider.pktoolsAlgorithmProvider</a>
 </li>
 <li>getShortName()
 : <a class="el" href="classOptionpk.html#ae0d0d55bac2456e6cbcec97892667742">Optionpk< T ></a>
 </li>
 <li>initializeSettings()
-: <a class="el" href="classqgis_1_1pktoolsAlgorithmProvider_1_1pktoolsAlgorithmProvider.html#a41cbf8f2612d0ba5e7e858f421e4c344">qgis.pktoolsAlgorithmProvider.pktoolsAlgorithmProvider</a>
+: <a class="el" href="classqgis_1_1pktools_1_1pktoolsAlgorithmProvider_1_1pktoolsAlgorithmProvider.html#a3c0515d681ec29ab388bc10d2d5cb455">qgis.pktools.pktoolsAlgorithmProvider.pktoolsAlgorithmProvider</a>
+, <a class="el" href="classqgis_1_1pktoolsAlgorithmProvider_1_1pktoolsAlgorithmProvider.html#a41cbf8f2612d0ba5e7e858f421e4c344">qgis.pktoolsAlgorithmProvider.pktoolsAlgorithmProvider</a>
 </li>
 <li>Optionpk()
 : <a class="el" href="classOptionpk.html#a0082d074d437413b3beefa06c0521644">Optionpk< T ></a>
@@ -104,7 +107,8 @@
 : <a class="el" href="classOptionpk.html#a561e7d4b4141cd9023563d4dee01b932">Optionpk< T ></a>
 </li>
 <li>unload()
-: <a class="el" href="classqgis_1_1pktoolsAlgorithmProvider_1_1pktoolsAlgorithmProvider.html#a458d5bb02c856ca83d7ca332ff4125aa">qgis.pktoolsAlgorithmProvider.pktoolsAlgorithmProvider</a>
+: <a class="el" href="classqgis_1_1pktools_1_1pktoolsAlgorithmProvider_1_1pktoolsAlgorithmProvider.html#a0d55ab57e07e57292f309173cf65114f">qgis.pktools.pktoolsAlgorithmProvider.pktoolsAlgorithmProvider</a>
+, <a class="el" href="classqgis_1_1pktoolsAlgorithmProvider_1_1pktoolsAlgorithmProvider.html#a458d5bb02c856ca83d7ca332ff4125aa">qgis.pktoolsAlgorithmProvider.pktoolsAlgorithmProvider</a>
 </li>
 <li>~Optionpk()
 : <a class="el" href="classOptionpk.html#aacf921491e6b6fab3c4cad8b39594cff">Optionpk< T ></a>
@@ -114,7 +118,7 @@
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Jun 23 2015 17:09:37 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/functions_rela.html b/doc/html/functions_rela.html
index 0e772bc..65b399a 100644
--- a/doc/html/functions_rela.html
+++ b/doc/html/functions_rela.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.3</span>
+    <span id="projectnumber">2.6.4</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -63,7 +63,7 @@
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Jun 23 2015 17:09:37 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/graph_legend.html b/doc/html/graph_legend.html
index f305ce6..ed6f248 100644
--- a/doc/html/graph_legend.html
+++ b/doc/html/graph_legend.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.3</span>
+    <span id="projectnumber">2.6.4</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -111,7 +111,7 @@ A yellow dashed arrow denotes a relation between a template instance and the tem
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Jun 23 2015 17:09:37 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/hierarchy.html b/doc/html/hierarchy.html
index 5fd38ed..270bdf7 100644
--- a/doc/html/hierarchy.html
+++ b/doc/html/hierarchy.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.3</span>
+    <span id="projectnumber">2.6.4</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -59,98 +59,116 @@ This inheritance list is sorted roughly, but not completely, alphabetically:</di
 <tr id="row_1_"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classCompare__IndexValue.html" target="_self">Compare_IndexValue</a></td><td class="desc"></td></tr>
 <tr id="row_2_" class="even"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classCompare__PosValue.html" target="_self">Compare_PosValue</a></td><td class="desc"></td></tr>
 <tr id="row_3_"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classconfusionmatrix_1_1ConfusionMatrix.html" target="_self">confusionmatrix::ConfusionMatrix</a></td><td class="desc"></td></tr>
-<tr id="row_4_" class="even"><td class="entry"><img id="arr_4_" src="ftv2mnode.png" alt="o" width="16" height="22" onclick="toggleFolder('4_')"/><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classCostFactory.html" target="_self">CostFactory</a></td><td class="desc"></td></tr>
-<tr id="row_4_0_"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classCostFactoryANN.html" target="_self">CostFactoryANN</a></td><td class="desc"></td></tr>
-<tr id="row_4_1_" class="even"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2lastnode.png" alt="\" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classCostFactorySVM.html" target="_self">CostFactorySVM</a></td><td class="desc"></td></tr>
+<tr id="row_4_" class="even"><td class="entry"><img id="arr_4_" src="ftv2pnode.png" alt="o" width="16" height="22" onclick="toggleFolder('4_')"/><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classCostFactory.html" target="_self">CostFactory</a></td><td class="desc"></td></tr>
+<tr id="row_4_0_" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classCostFactoryANN.html" target="_self">CostFactoryANN</a></td><td class="desc"></td></tr>
+<tr id="row_4_1_" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2lastnode.png" alt="\" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classCostFactorySVM.html" target="_self">CostFactorySVM</a></td><td class="desc"></td></tr>
 <tr id="row_5_"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classDataModel.html" target="_self">DataModel</a></td><td class="desc"></td></tr>
 <tr id="row_6_" class="even"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="structdecision__function.html" target="_self">decision_function</a></td><td class="desc"></td></tr>
 <tr id="row_7_"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classDecrease__IndexValue.html" target="_self">Decrease_IndexValue</a></td><td class="desc"></td></tr>
 <tr id="row_8_" class="even"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classDecrease__PosValue.html" target="_self">Decrease_PosValue</a></td><td class="desc"></td></tr>
 <tr id="row_9_"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classEgcs.html" target="_self">Egcs</a></td><td class="desc"></td></tr>
-<tr id="row_10_" class="even"><td class="entry"><img id="arr_10_" src="ftv2mnode.png" alt="o" width="16" height="22" onclick="toggleFolder('10_')"/><img src="ftv2cl.png" alt="C" width="24" height="22" /><b>std::exception</b></td><td class="desc">STL class </td></tr>
-<tr id="row_10_0_"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img id="arr_10_0_" src="ftv2mlastnode.png" alt="\" width="16" height="22" onclick="toggleFolder('10_0_')"/><img src="ftv2cl.png" alt="C" width="24" height="22" /><b>std::runtime_error</b></td><td class="desc">STL class </td></tr>
-<tr id="row_10_0_0_" class="even"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2blank.png" alt=" " width="16" height="22" /><img src="ftv2lastnode.png" alt="\" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classBadConversion.html" target="_self">BadConversion</a></td><td class="desc">Throw this class when syntax error in command line option </td></tr>
+<tr id="row_10_" class="even"><td class="entry"><img id="arr_10_" src="ftv2pnode.png" alt="o" width="16" height="22" onclick="toggleFolder('10_')"/><img src="ftv2cl.png" alt="C" width="24" height="22" /><b>std::exception</b></td><td class="desc">STL class </td></tr>
+<tr id="row_10_0_" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img id="arr_10_0_" src="ftv2plastnode.png" alt="\" width="16" height="22" onclick="toggleFolder('10_0_')"/><img src="ftv2cl.png" alt="C" width="24" height="22" /><b>std::runtime_error</b></td><td class="desc">STL class </td></tr>
+<tr id="row_10_0_0_" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2blank.png" alt=" " width="16" height="22" /><img src="ftv2lastnode.png" alt="\" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classBadConversion.html" target="_self">BadConversion</a></td><td class="desc">Throw this class when syntax error in command line option </td></tr>
 <tr id="row_11_"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classFeatureSelector.html" target="_self">FeatureSelector</a></td><td class="desc"></td></tr>
 <tr id="row_12_" class="even"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classFileReaderAscii.html" target="_self">FileReaderAscii</a></td><td class="desc"></td></tr>
 <tr id="row_13_"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classFileReaderLas.html" target="_self">FileReaderLas</a></td><td class="desc"></td></tr>
 <tr id="row_14_" class="even"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classfilter_1_1Filter.html" target="_self">filter::Filter</a></td><td class="desc"></td></tr>
 <tr id="row_15_"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classfilter2d_1_1Filter2d.html" target="_self">filter2d::Filter2d</a></td><td class="desc"></td></tr>
-<tr id="row_16_" class="even"><td class="entry"><img id="arr_16_" src="ftv2mnode.png" alt="o" width="16" height="22" onclick="toggleFolder('16_')"/><img src="ftv2cl.png" alt="C" width="24" height="22" /><b>FilterI</b></td><td class="desc"></td></tr>
-<tr id="row_16_0_"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2lastnode.png" alt="\" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classLastReturnFilter.html" target="_self">LastReturnFilter</a></td><td class="desc"></td></tr>
-<tr id="row_17_" class="even"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classImgReaderGdal.html" target="_self">ImgReaderGdal</a></td><td class="desc"></td></tr>
-<tr id="row_18_"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classImgReaderOgr.html" target="_self">ImgReaderOgr</a></td><td class="desc"></td></tr>
-<tr id="row_19_" class="even"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classimgregression_1_1ImgRegression.html" target="_self">imgregression::ImgRegression</a></td><td class="desc"></td></tr>
-<tr id="row_20_"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classImgWriterGdal.html" target="_self">ImgWriterGdal</a></td><td class="desc"></td></tr>
-<tr id="row_21_" class="even"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classImgWriterOgr.html" target="_self">ImgWriterOgr</a></td><td class="desc"></td></tr>
-<tr id="row_22_"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classIncrease__IndexValue.html" target="_self">Increase_IndexValue</a></td><td class="desc"></td></tr>
-<tr id="row_23_" class="even"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classIncrease__PosValue.html" target="_self">Increase_PosValue</a></td><td class="desc"></td></tr>
-<tr id="row_24_"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="structIndexValue.html" target="_self">IndexValue</a></td><td class="desc"></td></tr>
-<tr id="row_25_" class="even"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classFANN_1_1neural__net.html" target="_self">FANN::neural_net</a></td><td class="desc"></td></tr>
-<tr id="row_26_"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classOptFactory.html" target="_self">OptFactory</a></td><td class="desc"></td></tr>
-<tr id="row_27_" class="even"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classqgis_1_1pktoolsUtils_1_1pktoolsUtils.html" target="_self">qgis.pktoolsUtils.pktoolsUtils</a></td><td class="desc"></td></tr>
-<tr id="row_28_"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="structPosValue.html" target="_self">PosValue</a></td><td class="desc"></td></tr>
-<tr id="row_29_" class="even"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classqgis_1_1ProcessingPktoolsPlugin_1_1ProcessingPktoolsPlugin.html" target="_self">qgis.ProcessingPktoolsPlugin.ProcessingPktoolsPlugin</a></td><td class="desc"></td></tr>
-<tr id="row_30_"><td class="entry"><img id="arr_30_" src="ftv2mnode.png" alt="o" width="16" height="22" onclick="toggleFolder('30_')"/><img src="ftv2cl.png" alt="C" width="24" height="22" /><b>QMainWindow</b></td><td class="desc"></td></tr>
-<tr id="row_30_0_" class="even"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classMainWindow.html" target="_self">MainWindow</a></td><td class="desc"></td></tr>
-<tr id="row_30_1_"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classMainWindow.html" target="_self">MainWindow</a></td><td class="desc"></td></tr>
-<tr id="row_30_2_" class="even"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classMainWindow.html" target="_self">MainWindow</a></td><td class="desc"></td></tr>
-<tr id="row_30_3_"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classMainWindow.html" target="_self">MainWindow</a></td><td class="desc"></td></tr>
-<tr id="row_30_4_" class="even"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2lastnode.png" alt="\" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classMainWindow.html" target="_self">MainWindow</a></td><td class="desc"></td></tr>
-<tr id="row_31_"><td class="entry"><img id="arr_31_" src="ftv2mnode.png" alt="o" width="16" height="22" onclick="toggleFolder('31_')"/><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classQMatrix.html" target="_self">QMatrix</a></td><td class="desc"></td></tr>
-<tr id="row_31_0_" class="even"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img id="arr_31_0_" src="ftv2mlastnode.png" alt="\" width="16" height="22" onclick="toggleFolder('31_0_')"/><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classKernel.html" target="_self">Kernel</a></td><td class="desc"></td></tr>
-<tr id="row_31_0_0_"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2blank.png" alt=" " width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classONE__CLASS__Q.html" target="_self">ONE_CLASS_Q</a></td><td class="desc"></td></tr>
-<tr id="row_31_0_1_" class="even"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2blank.png" alt=" " width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classSVC__Q.html" target="_self">SVC_Q</a></td><td class="desc"></td></tr>
-<tr id="row_31_0_2_"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2blank.png" alt=" " width="16" height="22" /><img src="ftv2lastnode.png" alt="\" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classSVR__Q.html" target="_self">SVR_Q</a></td><td class="desc"></td></tr>
-<tr id="row_32_" class="even"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="structSolver_1_1SolutionInfo.html" target="_self">Solver::SolutionInfo</a></td><td class="desc"></td></tr>
-<tr id="row_33_"><td class="entry"><img id="arr_33_" src="ftv2mnode.png" alt="o" width="16" height="22" onclick="toggleFolder('33_')"/><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classSolver.html" target="_self">Solver</a></td><td class="desc"></td></tr>
-<tr id="row_33_0_" class="even"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2lastnode.png" alt="\" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classSolver__NU.html" target="_self">Solver_NU</a></td><td class="desc"></td></tr>
-<tr id="row_34_"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classstatfactory_1_1StatFactory.html" target="_self">statfactory::StatFactory</a></td><td class="desc"></td></tr>
-<tr id="row_35_" class="even"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="structsvm__model.html" target="_self">svm_model</a></td><td class="desc"></td></tr>
-<tr id="row_36_"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="structsvm__node.html" target="_self">svm_node</a></td><td class="desc"></td></tr>
-<tr id="row_37_" class="even"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="structsvm__parameter.html" target="_self">svm_parameter</a></td><td class="desc"></td></tr>
-<tr id="row_38_"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="structsvm__problem.html" target="_self">svm_problem</a></td><td class="desc"></td></tr>
-<tr id="row_39_" class="even"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classFANN_1_1training__data.html" target="_self">FANN::training_data</a></td><td class="desc"></td></tr>
-<tr id="row_40_"><td class="entry"><img id="arr_40_" src="ftv2mnode.png" alt="o" width="16" height="22" onclick="toggleFolder('40_')"/><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classUi__MainWindow.html" target="_self">Ui_MainWindow</a></td><td class="desc"></td></tr>
-<tr id="row_40_0_" class="even"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classUi_1_1MainWindow.html" target="_self">Ui::MainWindow</a></td><td class="desc"></td></tr>
-<tr id="row_40_1_"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classUi_1_1MainWindow.html" target="_self">Ui::MainWindow</a></td><td class="desc"></td></tr>
-<tr id="row_40_2_" class="even"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classUi_1_1MainWindow.html" target="_self">Ui::MainWindow</a></td><td class="desc"></td></tr>
-<tr id="row_40_3_"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classUi_1_1MainWindow.html" target="_self">Ui::MainWindow</a></td><td class="desc"></td></tr>
-<tr id="row_40_4_" class="even"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classUi_1_1MainWindow.html" target="_self">Ui::MainWindow</a></td><td class="desc"></td></tr>
-<tr id="row_40_5_"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classUi_1_1MainWindow.html" target="_self">Ui::MainWindow</a></td><td class="desc"></td></tr>
-<tr id="row_40_6_" class="even"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classUi_1_1MainWindow.html" target="_self">Ui::MainWindow</a></td><td class="desc"></td></tr>
-<tr id="row_40_7_"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classUi_1_1MainWindow.html" target="_self">Ui::MainWindow</a></td><td class="desc"></td></tr>
-<tr id="row_40_8_" class="even"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classUi_1_1MainWindow.html" target="_self">Ui::MainWindow</a></td><td class="desc"></td></tr>
-<tr id="row_40_9_"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2lastnode.png" alt="\" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classUi_1_1MainWindow.html" target="_self">Ui::MainWindow</a></td><td class="desc"></td></tr>
-<tr id="row_41_" class="even"><td class="entry"><img id="arr_41_" src="ftv2mnode.png" alt="o" width="16" height="22" onclick="toggleFolder('41_')"/><img src="ftv2cl.png" alt="C" width="24" height="22" /><b>std::vector< T ></b></td><td class="desc">STL class </td></tr>
-<tr id="row_41_0_"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classOptionpk.html" target="_self">Optionpk< T ></a></td><td class="desc"></td></tr>
-<tr id="row_41_1_" class="even"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classVector2d.html" target="_self">Vector2d< T ></a></td><td class="desc"></td></tr>
-<tr id="row_41_2_"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2lastnode.png" alt="\" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classVector2d.html" target="_self">Vector2d< double ></a></td><td class="desc"></td></tr>
-<tr id="row_42_" class="even"><td class="entry"><img id="arr_42_" src="ftv2mnode.png" alt="o" width="16" height="22" onclick="toggleFolder('42_')"/><img src="ftv2cl.png" alt="C" width="24" height="22" /><b>AlgorithmProvider</b></td><td class="desc"></td></tr>
-<tr id="row_42_0_"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2lastnode.png" alt="\" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classqgis_1_1pktoolsAlgorithmProvider_1_1pktoolsAlgorithmProvider.html" target="_self">qgis.pktoolsAlgorithmProvider.pktoolsAlgorithmProvider</a></td><td class="desc"></td></tr>
-<tr id="row_43_" class="even"><td class="entry"><img id="arr_43_" src="ftv2mnode.png" alt="o" width="16" height="22" onclick="toggleFolder('43_')"/><img src="ftv2cl.png" alt="C" width="24" height="22" /><b>GeoAlgorithm</b></td><td class="desc"></td></tr>
-<tr id="row_43_0_"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2lastnode.png" alt="\" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classqgis_1_1pktoolsAlgorithm_1_1pktoolsAlgorithm.html" target="_self">qgis.pktoolsAlgorithm.pktoolsAlgorithm</a></td><td class="desc"></td></tr>
-<tr id="row_44_" class="even"><td class="entry"><img id="arr_44_" src="ftv2mlastnode.png" alt="\" width="16" height="22" onclick="toggleFolder('44_')"/><img src="ftv2cl.png" alt="C" width="24" height="22" /><b>pktoolsAlgorithm</b></td><td class="desc"></td></tr>
-<tr id="row_44_0_"><td class="entry"><img src="ftv2blank.png" alt=" " width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classqgis_1_1pkcomposite_1_1pkcomposite.html" target="_self">qgis.pkcomposite.pkcomposite</a></td><td class="desc"></td></tr>
-<tr id="row_44_1_" class="even"><td class="entry"><img src="ftv2blank.png" alt=" " width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classqgis_1_1pkcrop_1_1pkcrop.html" target="_self">qgis.pkcrop.pkcrop</a></td><td class="desc"></td></tr>
-<tr id="row_44_2_"><td class="entry"><img src="ftv2blank.png" alt=" " width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classqgis_1_1pkdiff__accuracy_1_1pkdiff__accuracy.html" target="_self">qgis.pkdiff_accuracy.pkdiff_accuracy</a></td><td class="desc"></td></tr>
-<tr id="row_44_3_" class="even"><td class="entry"><img src="ftv2blank.png" alt=" " width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classqgis_1_1pkextract_1_1pkextract.html" target="_self">qgis.pkextract.pkextract</a></td><td class="desc"></td></tr>
-<tr id="row_44_4_"><td class="entry"><img src="ftv2blank.png" alt=" " width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classqgis_1_1pkextract__grid_1_1pkextract__grid.html" target="_self">qgis.pkextract_grid.pkextract_grid</a></td><td class="desc"></td></tr>
-<tr id="row_44_5_" class="even"><td class="entry"><img src="ftv2blank.png" alt=" " width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classqgis_1_1pkextract__random_1_1pkextract__random.html" target="_self">qgis.pkextract_random.pkextract_random</a></td><td class="desc"></td></tr>
-<tr id="row_44_6_"><td class="entry"><img src="ftv2blank.png" alt=" " width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classqgis_1_1pkfilter__spatial_1_1pkfilter__spatial.html" target="_self">qgis.pkfilter_spatial.pkfilter_spatial</a></td><td class="desc"></td></tr>
-<tr id="row_44_7_" class="even"><td class="entry"><img src="ftv2blank.png" alt=" " width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classqgis_1_1pkfilter__spectral_1_1pkfilter__spectral.html" target="_self">qgis.pkfilter_spectral.pkfilter_spectral</a></td><td class="desc"></td></tr>
-<tr id="row_44_8_"><td class="entry"><img src="ftv2blank.png" alt=" " width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classqgis_1_1pkfilterdem_1_1pkfilterdem.html" target="_self">qgis.pkfilterdem.pkfilterdem</a></td><td class="desc"></td></tr>
-<tr id="row_44_9_" class="even"><td class="entry"><img src="ftv2blank.png" alt=" " width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classqgis_1_1pkgetmask_1_1pkgetmask.html" target="_self">qgis.pkgetmask.pkgetmask</a></td><td class="desc"></td></tr>
-<tr id="row_44_10_"><td class="entry"><img src="ftv2blank.png" alt=" " width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classqgis_1_1pklas2img_1_1pklas2img.html" target="_self">qgis.pklas2img.pklas2img</a></td><td class="desc"></td></tr>
-<tr id="row_44_11_" class="even"><td class="entry"><img src="ftv2blank.png" alt=" " width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classqgis_1_1pkreclass_1_1pkreclass.html" target="_self">qgis.pkreclass.pkreclass</a></td><td class="desc"></td></tr>
-<tr id="row_44_12_"><td class="entry"><img src="ftv2blank.png" alt=" " width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classqgis_1_1pksetmask_1_1pksetmask.html" target="_self">qgis.pksetmask.pksetmask</a></td><td class="desc"></td></tr>
-<tr id="row_44_13_" class="even"><td class="entry"><img src="ftv2blank.png" alt=" " width="16" height="22" /><img src="ftv2lastnode.png" alt="\" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classqgis_1_1pksvm_1_1pksvm.html" target="_self">qgis.pksvm.pksvm</a></td><td class="desc"></td></tr>
+<tr id="row_16_" class="even"><td class="entry"><img id="arr_16_" src="ftv2pnode.png" alt="o" width="16" height="22" onclick="toggleFolder('16_')"/><img src="ftv2cl.png" alt="C" width="24" height="22" /><b>FilterI</b></td><td class="desc"></td></tr>
+<tr id="row_16_0_" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2lastnode.png" alt="\" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classLastReturnFilter.html" target="_self">LastReturnFilter</a></td><td class="desc"></td></tr>
+<tr id="row_17_"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classImgReaderGdal.html" target="_self">ImgReaderGdal</a></td><td class="desc"></td></tr>
+<tr id="row_18_" class="even"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classImgReaderOgr.html" target="_self">ImgReaderOgr</a></td><td class="desc"></td></tr>
+<tr id="row_19_"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classimgregression_1_1ImgRegression.html" target="_self">imgregression::ImgRegression</a></td><td class="desc"></td></tr>
+<tr id="row_20_" class="even"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classImgWriterGdal.html" target="_self">ImgWriterGdal</a></td><td class="desc"></td></tr>
+<tr id="row_21_"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classImgWriterOgr.html" target="_self">ImgWriterOgr</a></td><td class="desc"></td></tr>
+<tr id="row_22_" class="even"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classIncrease__IndexValue.html" target="_self">Increase_IndexValue</a></td><td class="desc"></td></tr>
+<tr id="row_23_"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classIncrease__PosValue.html" target="_self">Increase_PosValue</a></td><td class="desc"></td></tr>
+<tr id="row_24_" class="even"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="structIndexValue.html" target="_self">IndexValue</a></td><td class="desc"></td></tr>
+<tr id="row_25_"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classFANN_1_1neural__net.html" target="_self">FANN::neural_net</a></td><td class="desc"></td></tr>
+<tr id="row_26_" class="even"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classOptFactory.html" target="_self">OptFactory</a></td><td class="desc"></td></tr>
+<tr id="row_27_"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classqgis_1_1pktoolsUtils_1_1pktoolsUtils.html" target="_self">qgis.pktoolsUtils.pktoolsUtils</a></td><td class="desc"></td></tr>
+<tr id="row_28_" class="even"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classqgis_1_1pktools_1_1pktoolsUtils_1_1pktoolsUtils.html" target="_self">qgis.pktools.pktoolsUtils.pktoolsUtils</a></td><td class="desc"></td></tr>
+<tr id="row_29_"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="structPosValue.html" target="_self">PosValue</a></td><td class="desc"></td></tr>
+<tr id="row_30_" class="even"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classqgis_1_1pktools_1_1ProcessingPktoolsPlugin_1_1ProcessingPktoolsPlugin.html" target="_self">qgis.pktools.ProcessingPktoolsPlugin.ProcessingPktoolsPlugin</a></td><td class="desc"></td></tr>
+<tr id="row_31_"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classqgis_1_1ProcessingPktoolsPlugin_1_1ProcessingPktoolsPlugin.html" target="_self">qgis.ProcessingPktoolsPlugin.ProcessingPktoolsPlugin</a></td><td class="desc"></td></tr>
+<tr id="row_32_" class="even"><td class="entry"><img id="arr_32_" src="ftv2pnode.png" alt="o" width="16" height="22" onclick="toggleFolder('32_')"/><img src="ftv2cl.png" alt="C" width="24" height="22" /><b>QMainWindow</b></td><td class="desc"></td></tr>
+<tr id="row_32_0_" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classMainWindow.html" target="_self">MainWindow</a></td><td class="desc"></td></tr>
+<tr id="row_32_1_" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classMainWindow.html" target="_self">MainWindow</a></td><td class="desc"></td></tr>
+<tr id="row_32_2_" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classMainWindow.html" target="_self">MainWindow</a></td><td class="desc"></td></tr>
+<tr id="row_32_3_" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classMainWindow.html" target="_self">MainWindow</a></td><td class="desc"></td></tr>
+<tr id="row_32_4_" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2lastnode.png" alt="\" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classMainWindow.html" target="_self">MainWindow</a></td><td class="desc"></td></tr>
+<tr id="row_33_"><td class="entry"><img id="arr_33_" src="ftv2pnode.png" alt="o" width="16" height="22" onclick="toggleFolder('33_')"/><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classQMatrix.html" target="_self">QMatrix</a></td><td class="desc"></td></tr>
+<tr id="row_33_0_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img id="arr_33_0_" src="ftv2plastnode.png" alt="\" width="16" height="22" onclick="toggleFolder('33_0_')"/><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classKernel.html" target="_self">Kernel</a></td><td class="desc"></td></tr>
+<tr id="row_33_0_0_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2blank.png" alt=" " width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classONE__CLASS__Q.html" target="_self">ONE_CLASS_Q</a></td><td class="desc"></td></tr>
+<tr id="row_33_0_1_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2blank.png" alt=" " width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classSVC__Q.html" target="_self">SVC_Q</a></td><td class="desc"></td></tr>
+<tr id="row_33_0_2_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2blank.png" alt=" " width="16" height="22" /><img src="ftv2lastnode.png" alt="\" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classSVR__Q.html" target="_self">SVR_Q</a></td><td class="desc"></td></tr>
+<tr id="row_34_" class="even"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="structSolver_1_1SolutionInfo.html" target="_self">Solver::SolutionInfo</a></td><td class="desc"></td></tr>
+<tr id="row_35_"><td class="entry"><img id="arr_35_" src="ftv2pnode.png" alt="o" width="16" height="22" onclick="toggleFolder('35_')"/><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classSolver.html" target="_self">Solver</a></td><td class="desc"></td></tr>
+<tr id="row_35_0_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2lastnode.png" alt="\" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classSolver__NU.html" target="_self">Solver_NU</a></td><td class="desc"></td></tr>
+<tr id="row_36_" class="even"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classstatfactory_1_1StatFactory.html" target="_self">statfactory::StatFactory</a></td><td class="desc"></td></tr>
+<tr id="row_37_"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="structsvm__model.html" target="_self">svm_model</a></td><td class="desc"></td></tr>
+<tr id="row_38_" class="even"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="structsvm__node.html" target="_self">svm_node</a></td><td class="desc"></td></tr>
+<tr id="row_39_"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="structsvm__parameter.html" target="_self">svm_parameter</a></td><td class="desc"></td></tr>
+<tr id="row_40_" class="even"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="structsvm__problem.html" target="_self">svm_problem</a></td><td class="desc"></td></tr>
+<tr id="row_41_"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classFANN_1_1training__data.html" target="_self">FANN::training_data</a></td><td class="desc"></td></tr>
+<tr id="row_42_" class="even"><td class="entry"><img id="arr_42_" src="ftv2pnode.png" alt="o" width="16" height="22" onclick="toggleFolder('42_')"/><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classUi__MainWindow.html" target="_self">Ui_MainWindow</a></td><td class="desc"></td></tr>
+<tr id="row_42_0_" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classUi_1_1MainWindow.html" target="_self">Ui::MainWindow</a></td><td class="desc"></td></tr>
+<tr id="row_42_1_" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classUi_1_1MainWindow.html" target="_self">Ui::MainWindow</a></td><td class="desc"></td></tr>
+<tr id="row_42_2_" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classUi_1_1MainWindow.html" target="_self">Ui::MainWindow</a></td><td class="desc"></td></tr>
+<tr id="row_42_3_" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classUi_1_1MainWindow.html" target="_self">Ui::MainWindow</a></td><td class="desc"></td></tr>
+<tr id="row_42_4_" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classUi_1_1MainWindow.html" target="_self">Ui::MainWindow</a></td><td class="desc"></td></tr>
+<tr id="row_42_5_" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classUi_1_1MainWindow.html" target="_self">Ui::MainWindow</a></td><td class="desc"></td></tr>
+<tr id="row_42_6_" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classUi_1_1MainWindow.html" target="_self">Ui::MainWindow</a></td><td class="desc"></td></tr>
+<tr id="row_42_7_" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classUi_1_1MainWindow.html" target="_self">Ui::MainWindow</a></td><td class="desc"></td></tr>
+<tr id="row_42_8_" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classUi_1_1MainWindow.html" target="_self">Ui::MainWindow</a></td><td class="desc"></td></tr>
+<tr id="row_42_9_" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2lastnode.png" alt="\" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classUi_1_1MainWindow.html" target="_self">Ui::MainWindow</a></td><td class="desc"></td></tr>
+<tr id="row_43_"><td class="entry"><img id="arr_43_" src="ftv2pnode.png" alt="o" width="16" height="22" onclick="toggleFolder('43_')"/><img src="ftv2cl.png" alt="C" width="24" height="22" /><b>std::vector< T ></b></td><td class="desc">STL class </td></tr>
+<tr id="row_43_0_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classOptionpk.html" target="_self">Optionpk< T ></a></td><td class="desc"></td></tr>
+<tr id="row_43_1_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classVector2d.html" target="_self">Vector2d< T ></a></td><td class="desc"></td></tr>
+<tr id="row_43_2_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2lastnode.png" alt="\" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classVector2d.html" target="_self">Vector2d< double ></a></td><td class="desc"></td></tr>
+<tr id="row_44_" class="even"><td class="entry"><img id="arr_44_" src="ftv2pnode.png" alt="o" width="16" height="22" onclick="toggleFolder('44_')"/><img src="ftv2cl.png" alt="C" width="24" height="22" /><b>AlgorithmProvider</b></td><td class="desc"></td></tr>
+<tr id="row_44_0_" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classqgis_1_1pktools_1_1pktoolsAlgorithmProvider_1_1pktoolsAlgorithmProvider.html" target="_self">qgis.pktools.pktoolsAlgorithmProvider.pktoolsAlgorithmProvider</a></td><td class="desc"></td></tr>
+<tr id="row_44_1_" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2lastnode.png" alt="\" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classqgis_1_1pktoolsAlgorithmProvider_1_1pktoolsAlgorithmProvider.html" target="_self">qgis.pktoolsAlgorithmProvider.pktoolsAlgorithmProvider</a></td><td class="desc"></td></tr>
+<tr id="row_45_"><td class="entry"><img id="arr_45_" src="ftv2pnode.png" alt="o" width="16" height="22" onclick="toggleFolder('45_')"/><img src="ftv2cl.png" alt="C" width="24" height="22" /><b>GeoAlgorithm</b></td><td class="desc"></td></tr>
+<tr id="row_45_0_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classqgis_1_1pktools_1_1pktoolsAlgorithm_1_1pktoolsAlgorithm.html" target="_self">qgis.pktools.pktoolsAlgorithm.pktoolsAlgorithm</a></td><td class="desc"></td></tr>
+<tr id="row_45_1_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2lastnode.png" alt="\" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classqgis_1_1pktoolsAlgorithm_1_1pktoolsAlgorithm.html" target="_self">qgis.pktoolsAlgorithm.pktoolsAlgorithm</a></td><td class="desc"></td></tr>
+<tr id="row_46_" class="even"><td class="entry"><img id="arr_46_" src="ftv2plastnode.png" alt="\" width="16" height="22" onclick="toggleFolder('46_')"/><img src="ftv2cl.png" alt="C" width="24" height="22" /><b>pktoolsAlgorithm</b></td><td class="desc"></td></tr>
+<tr id="row_46_0_" style="display:none;"><td class="entry"><img src="ftv2blank.png" alt=" " width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classqgis_1_1pkcomposite_1_1pkcomposite.html" target="_self">qgis.pkcomposite.pkcomposite</a></td><td class="desc"></td></tr>
+<tr id="row_46_1_" style="display:none;"><td class="entry"><img src="ftv2blank.png" alt=" " width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classqgis_1_1pkcrop_1_1pkcrop.html" target="_self">qgis.pkcrop.pkcrop</a></td><td class="desc"></td></tr>
+<tr id="row_46_2_" style="display:none;"><td class="entry"><img src="ftv2blank.png" alt=" " width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classqgis_1_1pkdiff__accuracy_1_1pkdiff__accuracy.html" target="_self">qgis.pkdiff_accuracy.pkdiff_accuracy</a></td><td class="desc"></td></tr>
+<tr id="row_46_3_" style="display:none;"><td class="entry"><img src="ftv2blank.png" alt=" " width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classqgis_1_1pkextract_1_1pkextract.html" target="_self">qgis.pkextract.pkextract</a></td><td class="desc"></td></tr>
+<tr id="row_46_4_" style="display:none;"><td class="entry"><img src="ftv2blank.png" alt=" " width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classqgis_1_1pkextract__grid_1_1pkextract__grid.html" target="_self">qgis.pkextract_grid.pkextract_grid</a></td><td class="desc"></td></tr>
+<tr id="row_46_5_" style="display:none;"><td class="entry"><img src="ftv2blank.png" alt=" " width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classqgis_1_1pkextract__random_1_1pkextract__random.html" target="_self">qgis.pkextract_random.pkextract_random</a></td><td class="desc"></td></tr>
+<tr id="row_46_6_" style="display:none;"><td class="entry"><img src="ftv2blank.png" alt=" " width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classqgis_1_1pkfilter__spatial_1_1pkfilter__spatial.html" target="_self">qgis.pkfilter_spatial.pkfilter_spatial</a></td><td class="desc"></td></tr>
+<tr id="row_46_7_" style="display:none;"><td class="entry"><img src="ftv2blank.png" alt=" " width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classqgis_1_1pkfilter__spectral_1_1pkfilter__spectral.html" target="_self">qgis.pkfilter_spectral.pkfilter_spectral</a></td><td class="desc"></td></tr>
+<tr id="row_46_8_" style="display:none;"><td class="entry"><img src="ftv2blank.png" alt=" " width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classqgis_1_1pkfilterdem_1_1pkfilterdem.html" target="_self">qgis.pkfilterdem.pkfilterdem</a></td><td class="desc"></td></tr>
+<tr id="row_46_9_" style="display:none;"><td class="entry"><img src="ftv2blank.png" alt=" " width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classqgis_1_1pkgetmask_1_1pkgetmask.html" target="_self">qgis.pkgetmask.pkgetmask</a></td><td class="desc"></td></tr>
+<tr id="row_46_10_" style="display:none;"><td class="entry"><img src="ftv2blank.png" alt=" " width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classqgis_1_1pklas2img_1_1pklas2img.html" target="_self">qgis.pklas2img.pklas2img</a></td><td class="desc"></td></tr>
+<tr id="row_46_11_" style="display:none;"><td class="entry"><img src="ftv2blank.png" alt=" " width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classqgis_1_1pkreclass_1_1pkreclass.html" target="_self">qgis.pkreclass.pkreclass</a></td><td class="desc"></td></tr>
+<tr id="row_46_12_" style="display:none;"><td class="entry"><img src="ftv2blank.png" alt=" " width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classqgis_1_1pksetmask_1_1pksetmask.html" target="_self">qgis.pksetmask.pksetmask</a></td><td class="desc"></td></tr>
+<tr id="row_46_13_" style="display:none;"><td class="entry"><img src="ftv2blank.png" alt=" " width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classqgis_1_1pksvm_1_1pksvm.html" target="_self">qgis.pksvm.pksvm</a></td><td class="desc"></td></tr>
+<tr id="row_46_14_" style="display:none;"><td class="entry"><img src="ftv2blank.png" alt=" " width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classqgis_1_1pktools_1_1pkcomposite_1_1pkcomposite.html" target="_self">qgis.pktools.pkcomposite.pkcomposite</a></td><td class="desc"></td></tr>
+<tr id="row_46_15_" style="display:none;"><td class="entry"><img src="ftv2blank.png" alt=" " width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classqgis_1_1pktools_1_1pkcrop_1_1pkcrop.html" target="_self">qgis.pktools.pkcrop.pkcrop</a></td><td class="desc"></td></tr>
+<tr id="row_46_16_" style="display:none;"><td class="entry"><img src="ftv2blank.png" alt=" " width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classqgis_1_1pktools_1_1pkdiff__accuracy_1_1pkdiff__accuracy.html" target="_self">qgis.pktools.pkdiff_accuracy.pkdiff_accuracy</a></td><td class="desc"></td></tr>
+<tr id="row_46_17_" style="display:none;"><td class="entry"><img src="ftv2blank.png" alt=" " width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classqgis_1_1pktools_1_1pkextract_1_1pkextract.html" target="_self">qgis.pktools.pkextract.pkextract</a></td><td class="desc"></td></tr>
+<tr id="row_46_18_" style="display:none;"><td class="entry"><img src="ftv2blank.png" alt=" " width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classqgis_1_1pktools_1_1pkextract__grid_1_1pkextract__grid.html" target="_self">qgis.pktools.pkextract_grid.pkextract_grid</a></td><td class="desc"></td></tr>
+<tr id="row_46_19_" style="display:none;"><td class="entry"><img src="ftv2blank.png" alt=" " width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classqgis_1_1pktools_1_1pkextract__random_1_1pkextract__random.html" target="_self">qgis.pktools.pkextract_random.pkextract_random</a></td><td class="desc"></td></tr>
+<tr id="row_46_20_" style="display:none;"><td class="entry"><img src="ftv2blank.png" alt=" " width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classqgis_1_1pktools_1_1pkfilter__spatial_1_1pkfilter__spatial.html" target="_self">qgis.pktools.pkfilter_spatial.pkfilter_spatial</a></td><td class="desc"></td></tr>
+<tr id="row_46_21_" style="display:none;"><td class="entry"><img src="ftv2blank.png" alt=" " width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classqgis_1_1pktools_1_1pkfilter__spectral_1_1pkfilter__spectral.html" target="_self">qgis.pktools.pkfilter_spectral.pkfilter_spectral</a></td><td class="desc"></td></tr>
+<tr id="row_46_22_" style="display:none;"><td class="entry"><img src="ftv2blank.png" alt=" " width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classqgis_1_1pktools_1_1pkfilterdem_1_1pkfilterdem.html" target="_self">qgis.pktools.pkfilterdem.pkfilterdem</a></td><td class="desc"></td></tr>
+<tr id="row_46_23_" style="display:none;"><td class="entry"><img src="ftv2blank.png" alt=" " width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classqgis_1_1pktools_1_1pkgetmask_1_1pkgetmask.html" target="_self">qgis.pktools.pkgetmask.pkgetmask</a></td><td class="desc"></td></tr>
+<tr id="row_46_24_" style="display:none;"><td class="entry"><img src="ftv2blank.png" alt=" " width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classqgis_1_1pktools_1_1pklas2img_1_1pklas2img.html" target="_self">qgis.pktools.pklas2img.pklas2img</a></td><td class="desc"></td></tr>
+<tr id="row_46_25_" style="display:none;"><td class="entry"><img src="ftv2blank.png" alt=" " width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classqgis_1_1pktools_1_1pkreclass_1_1pkreclass.html" target="_self">qgis.pktools.pkreclass.pkreclass</a></td><td class="desc"></td></tr>
+<tr id="row_46_26_" style="display:none;"><td class="entry"><img src="ftv2blank.png" alt=" " width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classqgis_1_1pktools_1_1pksetmask_1_1pksetmask.html" target="_self">qgis.pktools.pksetmask.pksetmask</a></td><td class="desc"></td></tr>
+<tr id="row_46_27_" style="display:none;"><td class="entry"><img src="ftv2blank.png" alt=" " width="16" height="22" /><img src="ftv2lastnode.png" alt="\" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classqgis_1_1pktools_1_1pksvm_1_1pksvm.html" target="_self">qgis.pktools.pksvm.pksvm</a></td><td class="desc"></td></tr>
 </table>
 </div><!-- directory -->
 </div><!-- contents -->
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Jun 23 2015 17:09:37 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/index.html b/doc/html/index.html
index 1ff5911..c08453b 100644
--- a/doc/html/index.html
+++ b/doc/html/index.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.3</span>
+    <span id="projectnumber">2.6.4</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -46,9 +46,10 @@
 <div class="textblock"><ul>
 <li><a class="el" href="index.html#pktools_introduction">Introduction</a></li>
 <li><a class="el" href="index.html#pktools_license">License</a></li>
-<li><a class="el" href="index.html#pktools_download">Download</a></li>
+<li><a class="el" href="index.html#pktools_how_to_get">How te get pktools?</a></li>
 <li><a class="el" href="index.html#pktools_refer">How to refer</a></li>
 <li><a class="el" href="index.html#pktools_installation">Installation</a></li>
+<li><a class="el" href="index.html#pktools_plugins">Plugins</a></li>
 <li><a class="el" href="md_apps.html#available_tools">Available Tools</a></li>
 <li><a class="el" href="index.html#pktools_bugs">Found a bug or need a change?</a></li>
 </ul>
@@ -65,11 +66,23 @@ Introduction</h1>
 License</h1>
 <p>pktools is written by Pieter Kempeneers and released under the GNU General Public License version3</p>
 <p>See <a href="http://www.gnu.org/licenses">http://www.gnu.org/licenses</a> for more details</p>
-<h1><a class="anchor" id="pktools_download"></a>
-Download</h1>
-<p>You can <a href="http://download.savannah.gnu.org/releases/pktools/">download</a> the latest release from <a href="https://savannah.nongnu.org/projects/pktools">Savannah</a></p>
-<p>Or you can get a copy from the Git repository</p>
+<h1><a class="anchor" id="pktools_how_to_get"></a>
+How to get pktools?</h1>
+<h2><a class="anchor" id="pktools_download"></a>
+Download</h2>
+<p>You can <a href="http://download.savannah.gnu.org/releases/pktools/">download</a> the latest stable release from <a href="https://savannah.nongnu.org/projects/pktools">Savannah</a></p>
+<h2><a class="anchor" id="From"></a>
+the git repository</h2>
+<p>Get the latest code in development (bleeding edge) from the Git repository:</p>
 <div class="fragment"><div class="line">git clone git:<span class="comment">//git.savannah.nongnu.org/pktools.git</span></div>
+</div><!-- fragment --><p>In a Linux environment, please perform the following actions before following the <a class="el" href="md_installation_linux.html#install_manual">manual installation procedure</a></p>
+<div class="fragment"><div class="line">cd pktools</div>
+</div><!-- fragment --><p>Add libtool support to your package:</p>
+<div class="fragment"><div class="line">libtoolize</div>
+</div><!-- fragment --><p>Remake the GNU Build System files by scanning 'configure.ac' and running 'autoconf', 'autoheader', 'aclocal', 'automake' and 'libtoolize':</p>
+<div class="fragment"><div class="line">autoreconf</div>
+</div><!-- fragment --><p>Finalize package generation:</p>
+<div class="fragment"><div class="line">automake --add-missing</div>
 </div><!-- fragment --><h1><a class="anchor" id="pktools_refer"></a>
 How to refer</h1>
 <p>Please refer to pktools as: <a href="http://pktools.nongnu.org">http://pktools.nongnu.org</a> (Pieter Kempeneers)</p>
@@ -79,6 +92,9 @@ How to refer</h1>
 Installation</h1>
 <p>Installation for <a class="el" href="md_installation_linux.html#installation_linux">Linux</a></p>
 <p>Installation for <a class="el" href="md_installation_windows.html#installation_windows">Windows</a></p>
+<h1><a class="anchor" id="pktools_plugins"></a>
+Plugins</h1>
+<p>pktools in QGIS via <a class="el" href="md_installation_plugins.html#qgis_plugin">plugin</a></p>
 <h1><a class="anchor" id="pktools_bugs"></a>
 Bug reports and change requests</h1>
 <p>Please write a <a href="https://savannah.nongnu.org/bugs/?func=additem&group=pktools">ticket</a> in savannah to report bugs and request changes. You will automatically be informed about the ticket status and this helps me to keep track of the bugs/changes. </p>
@@ -86,7 +102,7 @@ Bug reports and change requests</h1>
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Jun 23 2015 17:09:37 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/inherit_graph_31.map b/doc/html/inherit_graph_31.map
index 96891f8..7186a79 100644
--- a/doc/html/inherit_graph_31.map
+++ b/doc/html/inherit_graph_31.map
@@ -1,16 +1,30 @@
 <map id="Graphical Class Hierarchy" name="Graphical Class Hierarchy">
-<area shape="rect" id="node2" href="$classqgis_1_1pkcomposite_1_1pkcomposite.html" title="qgis.pkcomposite.pkcomposite" alt="" coords="181,5,384,32"/>
-<area shape="rect" id="node3" href="$classqgis_1_1pkcrop_1_1pkcrop.html" title="qgis.pkcrop.pkcrop" alt="" coords="217,56,349,83"/>
-<area shape="rect" id="node4" href="$classqgis_1_1pkdiff__accuracy_1_1pkdiff__accuracy.html" title="qgis.pkdiff_accuracy.pkdiff\l_accuracy" alt="" coords="193,107,372,149"/>
-<area shape="rect" id="node5" href="$classqgis_1_1pkextract_1_1pkextract.html" title="qgis.pkextract.pkextract" alt="" coords="201,173,364,200"/>
-<area shape="rect" id="node6" href="$classqgis_1_1pkextract__grid_1_1pkextract__grid.html" title="qgis.pkextract_grid.pkextract_grid" alt="" coords="173,224,392,251"/>
-<area shape="rect" id="node7" href="$classqgis_1_1pkextract__random_1_1pkextract__random.html" title="qgis.pkextract_random.pkextract\l_random" alt="" coords="177,275,389,317"/>
-<area shape="rect" id="node8" href="$classqgis_1_1pkfilter__spatial_1_1pkfilter__spatial.html" title="qgis.pkfilter_spatial.pkfilter\l_spatial" alt="" coords="194,341,371,382"/>
-<area shape="rect" id="node9" href="$classqgis_1_1pkfilter__spectral_1_1pkfilter__spectral.html" title="qgis.pkfilter_spectral.pkfilter\l_spectral" alt="" coords="190,406,375,447"/>
-<area shape="rect" id="node10" href="$classqgis_1_1pkfilterdem_1_1pkfilterdem.html" title="qgis.pkfilterdem.pkfilterdem" alt="" coords="191,472,374,499"/>
-<area shape="rect" id="node11" href="$classqgis_1_1pkgetmask_1_1pkgetmask.html" title="qgis.pkgetmask.pkgetmask" alt="" coords="191,523,374,549"/>
-<area shape="rect" id="node12" href="$classqgis_1_1pklas2img_1_1pklas2img.html" title="qgis.pklas2img.pklas2img" alt="" coords="197,573,369,600"/>
-<area shape="rect" id="node13" href="$classqgis_1_1pkreclass_1_1pkreclass.html" title="qgis.pkreclass.pkreclass" alt="" coords="199,624,366,651"/>
-<area shape="rect" id="node14" href="$classqgis_1_1pksetmask_1_1pksetmask.html" title="qgis.pksetmask.pksetmask" alt="" coords="191,675,374,701"/>
-<area shape="rect" id="node15" href="$classqgis_1_1pksvm_1_1pksvm.html" title="qgis.pksvm.pksvm" alt="" coords="217,725,349,752"/>
+<area shape="rect" id="node2" href="$classqgis_1_1pkcomposite_1_1pkcomposite.html" title="qgis.pkcomposite.pkcomposite" alt="" coords="196,5,399,32"/>
+<area shape="rect" id="node3" href="$classqgis_1_1pkcrop_1_1pkcrop.html" title="qgis.pkcrop.pkcrop" alt="" coords="231,56,363,83"/>
+<area shape="rect" id="node4" href="$classqgis_1_1pkdiff__accuracy_1_1pkdiff__accuracy.html" title="qgis.pkdiff_accuracy.pkdiff\l_accuracy" alt="" coords="208,107,387,149"/>
+<area shape="rect" id="node5" href="$classqgis_1_1pkextract_1_1pkextract.html" title="qgis.pkextract.pkextract" alt="" coords="216,173,379,200"/>
+<area shape="rect" id="node6" href="$classqgis_1_1pkextract__grid_1_1pkextract__grid.html" title="qgis.pkextract_grid.pkextract_grid" alt="" coords="188,224,407,251"/>
+<area shape="rect" id="node7" href="$classqgis_1_1pkextract__random_1_1pkextract__random.html" title="qgis.pkextract_random.pkextract\l_random" alt="" coords="191,275,403,317"/>
+<area shape="rect" id="node8" href="$classqgis_1_1pkfilter__spatial_1_1pkfilter__spatial.html" title="qgis.pkfilter_spatial.pkfilter\l_spatial" alt="" coords="209,341,386,382"/>
+<area shape="rect" id="node9" href="$classqgis_1_1pkfilter__spectral_1_1pkfilter__spectral.html" title="qgis.pkfilter_spectral.pkfilter\l_spectral" alt="" coords="205,406,390,447"/>
+<area shape="rect" id="node10" href="$classqgis_1_1pkfilterdem_1_1pkfilterdem.html" title="qgis.pkfilterdem.pkfilterdem" alt="" coords="206,472,389,499"/>
+<area shape="rect" id="node11" href="$classqgis_1_1pkgetmask_1_1pkgetmask.html" title="qgis.pkgetmask.pkgetmask" alt="" coords="206,523,389,549"/>
+<area shape="rect" id="node12" href="$classqgis_1_1pklas2img_1_1pklas2img.html" title="qgis.pklas2img.pklas2img" alt="" coords="211,573,383,600"/>
+<area shape="rect" id="node13" href="$classqgis_1_1pkreclass_1_1pkreclass.html" title="qgis.pkreclass.pkreclass" alt="" coords="214,624,381,651"/>
+<area shape="rect" id="node14" href="$classqgis_1_1pksetmask_1_1pksetmask.html" title="qgis.pksetmask.pksetmask" alt="" coords="206,675,389,701"/>
+<area shape="rect" id="node15" href="$classqgis_1_1pksvm_1_1pksvm.html" title="qgis.pksvm.pksvm" alt="" coords="231,725,363,752"/>
+<area shape="rect" id="node16" href="$classqgis_1_1pktools_1_1pkcomposite_1_1pkcomposite.html" title="qgis.pktools.pkcomposite.pkcomposite" alt="" coords="173,776,421,803"/>
+<area shape="rect" id="node17" href="$classqgis_1_1pktools_1_1pkcrop_1_1pkcrop.html" title="qgis.pktools.pkcrop.pkcrop" alt="" coords="208,827,387,853"/>
+<area shape="rect" id="node18" href="$classqgis_1_1pktools_1_1pkdiff__accuracy_1_1pkdiff__accuracy.html" title="qgis.pktools.pkdiff\l_accuracy.pkdiff_accuracy" alt="" coords="208,878,387,919"/>
+<area shape="rect" id="node19" href="$classqgis_1_1pktools_1_1pkextract_1_1pkextract.html" title="qgis.pktools.pkextract.pkextract" alt="" coords="193,944,401,971"/>
+<area shape="rect" id="node20" href="$classqgis_1_1pktools_1_1pkextract__grid_1_1pkextract__grid.html" title="qgis.pktools.pkextract\l_grid.pkextract_grid" alt="" coords="222,995,373,1037"/>
+<area shape="rect" id="node21" href="$classqgis_1_1pktools_1_1pkextract__random_1_1pkextract__random.html" title="qgis.pktools.pkextract\l_random.pkextract_random" alt="" coords="207,1061,387,1102"/>
+<area shape="rect" id="node22" href="$classqgis_1_1pktools_1_1pkfilter__spatial_1_1pkfilter__spatial.html" title="qgis.pktools.pkfilter\l_spatial.pkfilter_spatial" alt="" coords="220,1126,375,1167"/>
+<area shape="rect" id="node23" href="$classqgis_1_1pktools_1_1pkfilter__spectral_1_1pkfilter__spectral.html" title="qgis.pktools.pkfilter\l_spectral.pkfilter_spectral" alt="" coords="212,1191,383,1233"/>
+<area shape="rect" id="node24" href="$classqgis_1_1pktools_1_1pkfilterdem_1_1pkfilterdem.html" title="qgis.pktools.pkfilterdem.pkfilterdem" alt="" coords="183,1257,411,1284"/>
+<area shape="rect" id="node25" href="$classqgis_1_1pktools_1_1pkgetmask_1_1pkgetmask.html" title="qgis.pktools.pkgetmask.pkgetmask" alt="" coords="183,1308,411,1335"/>
+<area shape="rect" id="node26" href="$classqgis_1_1pktools_1_1pklas2img_1_1pklas2img.html" title="qgis.pktools.pklas2img.pklas2img" alt="" coords="188,1359,407,1385"/>
+<area shape="rect" id="node27" href="$classqgis_1_1pktools_1_1pkreclass_1_1pkreclass.html" title="qgis.pktools.pkreclass.pkreclass" alt="" coords="191,1409,403,1436"/>
+<area shape="rect" id="node28" href="$classqgis_1_1pktools_1_1pksetmask_1_1pksetmask.html" title="qgis.pktools.pksetmask.pksetmask" alt="" coords="183,1460,411,1487"/>
+<area shape="rect" id="node29" href="$classqgis_1_1pktools_1_1pksvm_1_1pksvm.html" title="qgis.pktools.pksvm.pksvm" alt="" coords="208,1511,387,1537"/>
 </map>
diff --git a/doc/html/inherit_graph_31.md5 b/doc/html/inherit_graph_31.md5
index f2707e9..7119d49 100644
--- a/doc/html/inherit_graph_31.md5
+++ b/doc/html/inherit_graph_31.md5
@@ -1 +1 @@
-542dad52a3aba4faaadfb00cd952750e
\ No newline at end of file
+9954b2c568caef583bc28869e631b0dd
\ No newline at end of file
diff --git a/doc/html/inherit_graph_31.png b/doc/html/inherit_graph_31.png
index c9ff6d5..eba882d 100644
Binary files a/doc/html/inherit_graph_31.png and b/doc/html/inherit_graph_31.png differ
diff --git a/doc/html/inherit_graph_32.map b/doc/html/inherit_graph_32.map
index 145ac74..b2c789c 100644
--- a/doc/html/inherit_graph_32.map
+++ b/doc/html/inherit_graph_32.map
@@ -1,3 +1,4 @@
 <map id="Graphical Class Hierarchy" name="Graphical Class Hierarchy">
-<area shape="rect" id="node2" href="$classqgis_1_1pktoolsAlgorithm_1_1pktoolsAlgorithm.html" title="qgis.pktoolsAlgorithm.pktools\lAlgorithm" alt="" coords="155,5,349,46"/>
+<area shape="rect" id="node2" href="$classqgis_1_1pktools_1_1pktoolsAlgorithm_1_1pktoolsAlgorithm.html" title="qgis.pktools.pktoolsAlgorithm.pktools\lAlgorithm" alt="" coords="155,5,394,46"/>
+<area shape="rect" id="node3" href="$classqgis_1_1pktoolsAlgorithm_1_1pktoolsAlgorithm.html" title="qgis.pktoolsAlgorithm.pktools\lAlgorithm" alt="" coords="178,70,371,111"/>
 </map>
diff --git a/doc/html/inherit_graph_32.md5 b/doc/html/inherit_graph_32.md5
index 6fe7a52..71ce351 100644
--- a/doc/html/inherit_graph_32.md5
+++ b/doc/html/inherit_graph_32.md5
@@ -1 +1 @@
-fd4063c5213fdc50915558dc904f8639
\ No newline at end of file
+3c9304ebe9fdad1e7a503db1c533d0b6
\ No newline at end of file
diff --git a/doc/html/inherit_graph_32.png b/doc/html/inherit_graph_32.png
index a6a9425..498932d 100644
Binary files a/doc/html/inherit_graph_32.png and b/doc/html/inherit_graph_32.png differ
diff --git a/doc/html/inherit_graph_33.map b/doc/html/inherit_graph_33.map
index 1889fbe..f428487 100644
--- a/doc/html/inherit_graph_33.map
+++ b/doc/html/inherit_graph_33.map
@@ -1,3 +1,4 @@
 <map id="Graphical Class Hierarchy" name="Graphical Class Hierarchy">
-<area shape="rect" id="node2" href="$classqgis_1_1pktoolsAlgorithmProvider_1_1pktoolsAlgorithmProvider.html" title="qgis.pktoolsAlgorithmProvider.pktools\lAlgorithmProvider" alt="" coords="179,5,421,46"/>
+<area shape="rect" id="node2" href="$classqgis_1_1pktools_1_1pktoolsAlgorithmProvider_1_1pktoolsAlgorithmProvider.html" title="qgis.pktools.pktoolsAlgorithm\lProvider.pktoolsAlgorithmProvider" alt="" coords="191,5,409,46"/>
+<area shape="rect" id="node3" href="$classqgis_1_1pktoolsAlgorithmProvider_1_1pktoolsAlgorithmProvider.html" title="qgis.pktoolsAlgorithmProvider.pktools\lAlgorithmProvider" alt="" coords="179,70,421,111"/>
 </map>
diff --git a/doc/html/inherit_graph_33.md5 b/doc/html/inherit_graph_33.md5
index fee54ad..7b3dea2 100644
--- a/doc/html/inherit_graph_33.md5
+++ b/doc/html/inherit_graph_33.md5
@@ -1 +1 @@
-effe94b9ac2dfaa964c641dcedeb4962
\ No newline at end of file
+39685cc5d90d6118c44f4d26507483d2
\ No newline at end of file
diff --git a/doc/html/inherit_graph_33.png b/doc/html/inherit_graph_33.png
index 2f30952..d9a6035 100644
Binary files a/doc/html/inherit_graph_33.png and b/doc/html/inherit_graph_33.png differ
diff --git a/doc/html/inherit_graph_34.map b/doc/html/inherit_graph_34.map
index 7ff2667..036ffcb 100644
--- a/doc/html/inherit_graph_34.map
+++ b/doc/html/inherit_graph_34.map
@@ -1,3 +1,3 @@
 <map id="Graphical Class Hierarchy" name="Graphical Class Hierarchy">
-<area shape="rect" id="node1" href="$classqgis_1_1pktoolsUtils_1_1pktoolsUtils.html" title="qgis.pktoolsUtils.pktools\lUtils" alt="" coords="5,5,171,46"/>
+<area shape="rect" id="node1" href="$classqgis_1_1pktools_1_1pktoolsUtils_1_1pktoolsUtils.html" title="qgis.pktools.pktoolsUtils.pktools\lUtils" alt="" coords="5,5,216,46"/>
 </map>
diff --git a/doc/html/inherit_graph_34.md5 b/doc/html/inherit_graph_34.md5
index 92745d9..b67dce0 100644
--- a/doc/html/inherit_graph_34.md5
+++ b/doc/html/inherit_graph_34.md5
@@ -1 +1 @@
-193a7f60a5ea0dd260be1bdb91bbdc88
\ No newline at end of file
+4fe4b1e5d89e7090871b53cf53608b74
\ No newline at end of file
diff --git a/doc/html/inherit_graph_34.png b/doc/html/inherit_graph_34.png
index ac6fdf8..575928c 100644
Binary files a/doc/html/inherit_graph_34.png and b/doc/html/inherit_graph_34.png differ
diff --git a/doc/html/inherit_graph_35.map b/doc/html/inherit_graph_35.map
index 8422376..21a4589 100644
--- a/doc/html/inherit_graph_35.map
+++ b/doc/html/inherit_graph_35.map
@@ -1,3 +1,3 @@
 <map id="Graphical Class Hierarchy" name="Graphical Class Hierarchy">
-<area shape="rect" id="node1" href="$classqgis_1_1ProcessingPktoolsPlugin_1_1ProcessingPktoolsPlugin.html" title="qgis.ProcessingPktoolsPlugin.\lProcessingPktoolsPlugin" alt="" coords="6,5,205,46"/>
+<area shape="rect" id="node1" href="$classqgis_1_1pktools_1_1ProcessingPktoolsPlugin_1_1ProcessingPktoolsPlugin.html" title="qgis.pktools.ProcessingPktools\lPlugin.ProcessingPktoolsPlugin" alt="" coords="6,5,213,46"/>
 </map>
diff --git a/doc/html/inherit_graph_35.md5 b/doc/html/inherit_graph_35.md5
index e735e1f..af00428 100644
--- a/doc/html/inherit_graph_35.md5
+++ b/doc/html/inherit_graph_35.md5
@@ -1 +1 @@
-cff7ac1ee5a5232d6e7b82f41627ab2a
\ No newline at end of file
+2206cdc4d139a6c86521c0fd8a09da98
\ No newline at end of file
diff --git a/doc/html/inherit_graph_35.png b/doc/html/inherit_graph_35.png
index 210dc05..9615251 100644
Binary files a/doc/html/inherit_graph_35.png and b/doc/html/inherit_graph_35.png differ
diff --git a/doc/html/inherit_graph_36.map b/doc/html/inherit_graph_36.map
index e63d8fd..7ff2667 100644
--- a/doc/html/inherit_graph_36.map
+++ b/doc/html/inherit_graph_36.map
@@ -1,7 +1,3 @@
 <map id="Graphical Class Hierarchy" name="Graphical Class Hierarchy">
-<area shape="rect" id="node1" href="$classQMatrix.html" title="QMatrix" alt="" coords="6,56,74,83"/>
-<area shape="rect" id="node2" href="$classKernel.html" title="Kernel" alt="" coords="123,56,181,83"/>
-<area shape="rect" id="node3" href="$classONE__CLASS__Q.html" title="ONE_CLASS_Q" alt="" coords="230,5,349,32"/>
-<area shape="rect" id="node4" href="$classSVC__Q.html" title="SVC_Q" alt="" coords="256,56,323,83"/>
-<area shape="rect" id="node5" href="$classSVR__Q.html" title="SVR_Q" alt="" coords="256,107,323,133"/>
+<area shape="rect" id="node1" href="$classqgis_1_1pktoolsUtils_1_1pktoolsUtils.html" title="qgis.pktoolsUtils.pktools\lUtils" alt="" coords="5,5,171,46"/>
 </map>
diff --git a/doc/html/inherit_graph_36.md5 b/doc/html/inherit_graph_36.md5
index 1dc682b..92745d9 100644
--- a/doc/html/inherit_graph_36.md5
+++ b/doc/html/inherit_graph_36.md5
@@ -1 +1 @@
-e7cc1a9ac7cc7303dcdad4850aa27124
\ No newline at end of file
+193a7f60a5ea0dd260be1bdb91bbdc88
\ No newline at end of file
diff --git a/doc/html/inherit_graph_36.png b/doc/html/inherit_graph_36.png
index 99af2bb..ac6fdf8 100644
Binary files a/doc/html/inherit_graph_36.png and b/doc/html/inherit_graph_36.png differ
diff --git a/doc/html/inherit_graph_37.map b/doc/html/inherit_graph_37.map
index 13ba453..8422376 100644
--- a/doc/html/inherit_graph_37.map
+++ b/doc/html/inherit_graph_37.map
@@ -1,4 +1,3 @@
 <map id="Graphical Class Hierarchy" name="Graphical Class Hierarchy">
-<area shape="rect" id="node1" href="$classSolver.html" title="Solver" alt="" coords="5,5,64,32"/>
-<area shape="rect" id="node2" href="$classSolver__NU.html" title="Solver_NU" alt="" coords="113,5,199,32"/>
+<area shape="rect" id="node1" href="$classqgis_1_1ProcessingPktoolsPlugin_1_1ProcessingPktoolsPlugin.html" title="qgis.ProcessingPktoolsPlugin.\lProcessingPktoolsPlugin" alt="" coords="6,5,205,46"/>
 </map>
diff --git a/doc/html/inherit_graph_37.md5 b/doc/html/inherit_graph_37.md5
index 5d06ade..e735e1f 100644
--- a/doc/html/inherit_graph_37.md5
+++ b/doc/html/inherit_graph_37.md5
@@ -1 +1 @@
-7be29cee47604c598e9b41d6f6d26540
\ No newline at end of file
+cff7ac1ee5a5232d6e7b82f41627ab2a
\ No newline at end of file
diff --git a/doc/html/inherit_graph_37.png b/doc/html/inherit_graph_37.png
index a8f4610..210dc05 100644
Binary files a/doc/html/inherit_graph_37.png and b/doc/html/inherit_graph_37.png differ
diff --git a/doc/html/inherit_graph_38.map b/doc/html/inherit_graph_38.map
index ee2aeb5..e63d8fd 100644
--- a/doc/html/inherit_graph_38.map
+++ b/doc/html/inherit_graph_38.map
@@ -1,3 +1,7 @@
 <map id="Graphical Class Hierarchy" name="Graphical Class Hierarchy">
-<area shape="rect" id="node1" href="$structSolver_1_1SolutionInfo.html" title="Solver::SolutionInfo" alt="" coords="5,5,141,32"/>
+<area shape="rect" id="node1" href="$classQMatrix.html" title="QMatrix" alt="" coords="6,56,74,83"/>
+<area shape="rect" id="node2" href="$classKernel.html" title="Kernel" alt="" coords="123,56,181,83"/>
+<area shape="rect" id="node3" href="$classONE__CLASS__Q.html" title="ONE_CLASS_Q" alt="" coords="230,5,349,32"/>
+<area shape="rect" id="node4" href="$classSVC__Q.html" title="SVC_Q" alt="" coords="256,56,323,83"/>
+<area shape="rect" id="node5" href="$classSVR__Q.html" title="SVR_Q" alt="" coords="256,107,323,133"/>
 </map>
diff --git a/doc/html/inherit_graph_38.md5 b/doc/html/inherit_graph_38.md5
index 77ada4a..1dc682b 100644
--- a/doc/html/inherit_graph_38.md5
+++ b/doc/html/inherit_graph_38.md5
@@ -1 +1 @@
-eb536ae09518c9401a3cc68fe8336845
\ No newline at end of file
+e7cc1a9ac7cc7303dcdad4850aa27124
\ No newline at end of file
diff --git a/doc/html/inherit_graph_38.png b/doc/html/inherit_graph_38.png
index 6157226..99af2bb 100644
Binary files a/doc/html/inherit_graph_38.png and b/doc/html/inherit_graph_38.png differ
diff --git a/doc/html/inherit_graph_39.map b/doc/html/inherit_graph_39.map
index 38dc8ea..13ba453 100644
--- a/doc/html/inherit_graph_39.map
+++ b/doc/html/inherit_graph_39.map
@@ -1,3 +1,4 @@
 <map id="Graphical Class Hierarchy" name="Graphical Class Hierarchy">
-<area shape="rect" id="node1" href="$classstatfactory_1_1StatFactory.html" title="statfactory::StatFactory" alt="" coords="5,5,165,32"/>
+<area shape="rect" id="node1" href="$classSolver.html" title="Solver" alt="" coords="5,5,64,32"/>
+<area shape="rect" id="node2" href="$classSolver__NU.html" title="Solver_NU" alt="" coords="113,5,199,32"/>
 </map>
diff --git a/doc/html/inherit_graph_39.md5 b/doc/html/inherit_graph_39.md5
index 12d0f53..5d06ade 100644
--- a/doc/html/inherit_graph_39.md5
+++ b/doc/html/inherit_graph_39.md5
@@ -1 +1 @@
-87aa7d801c4fb0d24fa9d29992fafeb1
\ No newline at end of file
+7be29cee47604c598e9b41d6f6d26540
\ No newline at end of file
diff --git a/doc/html/inherit_graph_39.png b/doc/html/inherit_graph_39.png
index 8414ef4..a8f4610 100644
Binary files a/doc/html/inherit_graph_39.png and b/doc/html/inherit_graph_39.png differ
diff --git a/doc/html/inherit_graph_40.map b/doc/html/inherit_graph_40.map
index db2638c..ee2aeb5 100644
--- a/doc/html/inherit_graph_40.map
+++ b/doc/html/inherit_graph_40.map
@@ -1,3 +1,3 @@
 <map id="Graphical Class Hierarchy" name="Graphical Class Hierarchy">
-<area shape="rect" id="node1" href="$structsvm__model.html" title="svm_model" alt="" coords="6,5,95,32"/>
+<area shape="rect" id="node1" href="$structSolver_1_1SolutionInfo.html" title="Solver::SolutionInfo" alt="" coords="5,5,141,32"/>
 </map>
diff --git a/doc/html/inherit_graph_40.md5 b/doc/html/inherit_graph_40.md5
index 353d6e5..77ada4a 100644
--- a/doc/html/inherit_graph_40.md5
+++ b/doc/html/inherit_graph_40.md5
@@ -1 +1 @@
-7b410ece4435bb5898273f794141ca12
\ No newline at end of file
+eb536ae09518c9401a3cc68fe8336845
\ No newline at end of file
diff --git a/doc/html/inherit_graph_40.png b/doc/html/inherit_graph_40.png
index 74ce854..6157226 100644
Binary files a/doc/html/inherit_graph_40.png and b/doc/html/inherit_graph_40.png differ
diff --git a/doc/html/inherit_graph_41.map b/doc/html/inherit_graph_41.map
index 7b61c83..38dc8ea 100644
--- a/doc/html/inherit_graph_41.map
+++ b/doc/html/inherit_graph_41.map
@@ -1,3 +1,3 @@
 <map id="Graphical Class Hierarchy" name="Graphical Class Hierarchy">
-<area shape="rect" id="node1" href="$structsvm__node.html" title="svm_node" alt="" coords="5,5,88,32"/>
+<area shape="rect" id="node1" href="$classstatfactory_1_1StatFactory.html" title="statfactory::StatFactory" alt="" coords="5,5,165,32"/>
 </map>
diff --git a/doc/html/inherit_graph_41.md5 b/doc/html/inherit_graph_41.md5
index c429b4a..12d0f53 100644
--- a/doc/html/inherit_graph_41.md5
+++ b/doc/html/inherit_graph_41.md5
@@ -1 +1 @@
-2af511324d18119462e473d0dca2ff4c
\ No newline at end of file
+87aa7d801c4fb0d24fa9d29992fafeb1
\ No newline at end of file
diff --git a/doc/html/inherit_graph_41.png b/doc/html/inherit_graph_41.png
index 24bc575..8414ef4 100644
Binary files a/doc/html/inherit_graph_41.png and b/doc/html/inherit_graph_41.png differ
diff --git a/doc/html/inherit_graph_42.map b/doc/html/inherit_graph_42.map
index ce31d5f..db2638c 100644
--- a/doc/html/inherit_graph_42.map
+++ b/doc/html/inherit_graph_42.map
@@ -1,3 +1,3 @@
 <map id="Graphical Class Hierarchy" name="Graphical Class Hierarchy">
-<area shape="rect" id="node1" href="$structsvm__parameter.html" title="svm_parameter" alt="" coords="5,5,117,32"/>
+<area shape="rect" id="node1" href="$structsvm__model.html" title="svm_model" alt="" coords="6,5,95,32"/>
 </map>
diff --git a/doc/html/inherit_graph_42.md5 b/doc/html/inherit_graph_42.md5
index 484819e..353d6e5 100644
--- a/doc/html/inherit_graph_42.md5
+++ b/doc/html/inherit_graph_42.md5
@@ -1 +1 @@
-9c46a02da171be2dc8c99dffaea9ef17
\ No newline at end of file
+7b410ece4435bb5898273f794141ca12
\ No newline at end of file
diff --git a/doc/html/inherit_graph_42.png b/doc/html/inherit_graph_42.png
index bf8a624..74ce854 100644
Binary files a/doc/html/inherit_graph_42.png and b/doc/html/inherit_graph_42.png differ
diff --git a/doc/html/inherit_graph_43.map b/doc/html/inherit_graph_43.map
index 3f7b1ce..7b61c83 100644
--- a/doc/html/inherit_graph_43.map
+++ b/doc/html/inherit_graph_43.map
@@ -1,3 +1,3 @@
 <map id="Graphical Class Hierarchy" name="Graphical Class Hierarchy">
-<area shape="rect" id="node1" href="$structsvm__problem.html" title="svm_problem" alt="" coords="6,5,106,32"/>
+<area shape="rect" id="node1" href="$structsvm__node.html" title="svm_node" alt="" coords="5,5,88,32"/>
 </map>
diff --git a/doc/html/inherit_graph_43.md5 b/doc/html/inherit_graph_43.md5
index ee30b79..c429b4a 100644
--- a/doc/html/inherit_graph_43.md5
+++ b/doc/html/inherit_graph_43.md5
@@ -1 +1 @@
-aadebe5d38499b3e0dfb844f4a073095
\ No newline at end of file
+2af511324d18119462e473d0dca2ff4c
\ No newline at end of file
diff --git a/doc/html/inherit_graph_43.png b/doc/html/inherit_graph_43.png
index 5411fdc..24bc575 100644
Binary files a/doc/html/inherit_graph_43.png and b/doc/html/inherit_graph_43.png differ
diff --git a/doc/html/inherit_graph_44.map b/doc/html/inherit_graph_44.map
index 242be84..ce31d5f 100644
--- a/doc/html/inherit_graph_44.map
+++ b/doc/html/inherit_graph_44.map
@@ -1,4 +1,3 @@
 <map id="Graphical Class Hierarchy" name="Graphical Class Hierarchy">
-<area shape="rect" id="node1" href="$classUi__MainWindow.html" title="Ui_MainWindow" alt="" coords="5,5,123,32"/>
-<area shape="rect" id="node2" href="$classUi_1_1MainWindow.html" title="Ui::MainWindow" alt="" coords="171,5,290,32"/>
+<area shape="rect" id="node1" href="$structsvm__parameter.html" title="svm_parameter" alt="" coords="5,5,117,32"/>
 </map>
diff --git a/doc/html/inherit_graph_44.md5 b/doc/html/inherit_graph_44.md5
index 4054bc0..484819e 100644
--- a/doc/html/inherit_graph_44.md5
+++ b/doc/html/inherit_graph_44.md5
@@ -1 +1 @@
-62ce278189506cc1c0752d729480526e
\ No newline at end of file
+9c46a02da171be2dc8c99dffaea9ef17
\ No newline at end of file
diff --git a/doc/html/inherit_graph_44.png b/doc/html/inherit_graph_44.png
index 4742656..bf8a624 100644
Binary files a/doc/html/inherit_graph_44.png and b/doc/html/inherit_graph_44.png differ
diff --git a/doc/html/inherit_graph_43.map b/doc/html/inherit_graph_45.map
similarity index 100%
copy from doc/html/inherit_graph_43.map
copy to doc/html/inherit_graph_45.map
diff --git a/doc/html/inherit_graph_43.md5 b/doc/html/inherit_graph_45.md5
similarity index 100%
copy from doc/html/inherit_graph_43.md5
copy to doc/html/inherit_graph_45.md5
diff --git a/doc/html/inherit_graph_43.png b/doc/html/inherit_graph_45.png
similarity index 100%
copy from doc/html/inherit_graph_43.png
copy to doc/html/inherit_graph_45.png
diff --git a/doc/html/inherit_graph_44.map b/doc/html/inherit_graph_46.map
similarity index 100%
copy from doc/html/inherit_graph_44.map
copy to doc/html/inherit_graph_46.map
diff --git a/doc/html/inherit_graph_44.md5 b/doc/html/inherit_graph_46.md5
similarity index 100%
copy from doc/html/inherit_graph_44.md5
copy to doc/html/inherit_graph_46.md5
diff --git a/doc/html/inherit_graph_44.png b/doc/html/inherit_graph_46.png
similarity index 100%
copy from doc/html/inherit_graph_44.png
copy to doc/html/inherit_graph_46.png
diff --git a/doc/html/inherits.html b/doc/html/inherits.html
index f3bce51..6e456fe 100644
--- a/doc/html/inherits.html
+++ b/doc/html/inherits.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.3</span>
+    <span id="projectnumber">2.6.4</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -180,57 +180,65 @@
 </td></tr>
 <tr><td><img src="inherit_graph_31.png" border="0" alt="" usemap="#qgis_8pkcomposite_8pkcomposite"/>
 <map name="qgis_8pkcomposite_8pkcomposite" id="qgis_8pkcomposite_8pkcomposite">
-<area shape="rect" id="node2" href="classqgis_1_1pkcomposite_1_1pkcomposite.html" title="qgis.pkcomposite.pkcomposite" alt="" coords="181,5,384,32"/><area shape="rect" id="node3" href="classqgis_1_1pkcrop_1_1pkcrop.html" title="qgis.pkcrop.pkcrop" alt="" coords="217,56,349,83"/><area shape="rect" id="node4" href="classqgis_1_1pkdiff__accuracy_1_1pkdiff__accuracy.html" title="qgis.pkdiff_accuracy.pkdiff\l_accuracy" alt="" coords="193,107,372,149"/><area shape="rect" id="node5" href="class [...]
+<area shape="rect" id="node2" href="classqgis_1_1pkcomposite_1_1pkcomposite.html" title="qgis.pkcomposite.pkcomposite" alt="" coords="196,5,399,32"/><area shape="rect" id="node3" href="classqgis_1_1pkcrop_1_1pkcrop.html" title="qgis.pkcrop.pkcrop" alt="" coords="231,56,363,83"/><area shape="rect" id="node4" href="classqgis_1_1pkdiff__accuracy_1_1pkdiff__accuracy.html" title="qgis.pkdiff_accuracy.pkdiff\l_accuracy" alt="" coords="208,107,387,149"/><area shape="rect" id="node5" href="class [...]
 </td></tr>
-<tr><td><img src="inherit_graph_32.png" border="0" alt="" usemap="#qgis_8pktoolsAlgorithm_8pktoolsAlgorithm"/>
-<map name="qgis_8pktoolsAlgorithm_8pktoolsAlgorithm" id="qgis_8pktoolsAlgorithm_8pktoolsAlgorithm">
-<area shape="rect" id="node2" href="classqgis_1_1pktoolsAlgorithm_1_1pktoolsAlgorithm.html" title="qgis.pktoolsAlgorithm.pktools\lAlgorithm" alt="" coords="155,5,349,46"/></map>
+<tr><td><img src="inherit_graph_32.png" border="0" alt="" usemap="#qgis_8pktools_8pktoolsAlgorithm_8pktoolsAlgorithm"/>
+<map name="qgis_8pktools_8pktoolsAlgorithm_8pktoolsAlgorithm" id="qgis_8pktools_8pktoolsAlgorithm_8pktoolsAlgorithm">
+<area shape="rect" id="node2" href="classqgis_1_1pktools_1_1pktoolsAlgorithm_1_1pktoolsAlgorithm.html" title="qgis.pktools.pktoolsAlgorithm.pktools\lAlgorithm" alt="" coords="155,5,394,46"/><area shape="rect" id="node3" href="classqgis_1_1pktoolsAlgorithm_1_1pktoolsAlgorithm.html" title="qgis.pktoolsAlgorithm.pktools\lAlgorithm" alt="" coords="178,70,371,111"/></map>
 </td></tr>
-<tr><td><img src="inherit_graph_33.png" border="0" alt="" usemap="#qgis_8pktoolsAlgorithmProvider_8pktoolsAlgorithmProvider"/>
-<map name="qgis_8pktoolsAlgorithmProvider_8pktoolsAlgorithmProvider" id="qgis_8pktoolsAlgorithmProvider_8pktoolsAlgorithmProvider">
-<area shape="rect" id="node2" href="classqgis_1_1pktoolsAlgorithmProvider_1_1pktoolsAlgorithmProvider.html" title="qgis.pktoolsAlgorithmProvider.pktools\lAlgorithmProvider" alt="" coords="179,5,421,46"/></map>
+<tr><td><img src="inherit_graph_33.png" border="0" alt="" usemap="#qgis_8pktools_8pktoolsAlgorithmProvider_8pktoolsAlgorithmProvider"/>
+<map name="qgis_8pktools_8pktoolsAlgorithmProvider_8pktoolsAlgorithmProvider" id="qgis_8pktools_8pktoolsAlgorithmProvider_8pktoolsAlgorithmProvider">
+<area shape="rect" id="node2" href="classqgis_1_1pktools_1_1pktoolsAlgorithmProvider_1_1pktoolsAlgorithmProvider.html" title="qgis.pktools.pktoolsAlgorithm\lProvider.pktoolsAlgorithmProvider" alt="" coords="191,5,409,46"/><area shape="rect" id="node3" href="classqgis_1_1pktoolsAlgorithmProvider_1_1pktoolsAlgorithmProvider.html" title="qgis.pktoolsAlgorithmProvider.pktools\lAlgorithmProvider" alt="" coords="179,70,421,111"/></map>
 </td></tr>
-<tr><td><img src="inherit_graph_34.png" border="0" alt="" usemap="#qgis_8pktoolsUtils_8pktoolsUtils"/>
+<tr><td><img src="inherit_graph_34.png" border="0" alt="" usemap="#qgis_8pktools_8pktoolsUtils_8pktoolsUtils"/>
+<map name="qgis_8pktools_8pktoolsUtils_8pktoolsUtils" id="qgis_8pktools_8pktoolsUtils_8pktoolsUtils">
+<area shape="rect" id="node1" href="classqgis_1_1pktools_1_1pktoolsUtils_1_1pktoolsUtils.html" title="qgis.pktools.pktoolsUtils.pktools\lUtils" alt="" coords="5,5,216,46"/></map>
+</td></tr>
+<tr><td><img src="inherit_graph_35.png" border="0" alt="" usemap="#qgis_8pktools_8ProcessingPktoolsPlugin_8ProcessingPktoolsPlugin"/>
+<map name="qgis_8pktools_8ProcessingPktoolsPlugin_8ProcessingPktoolsPlugin" id="qgis_8pktools_8ProcessingPktoolsPlugin_8ProcessingPktoolsPlugin">
+<area shape="rect" id="node1" href="classqgis_1_1pktools_1_1ProcessingPktoolsPlugin_1_1ProcessingPktoolsPlugin.html" title="qgis.pktools.ProcessingPktools\lPlugin.ProcessingPktoolsPlugin" alt="" coords="6,5,213,46"/></map>
+</td></tr>
+<tr><td><img src="inherit_graph_36.png" border="0" alt="" usemap="#qgis_8pktoolsUtils_8pktoolsUtils"/>
 <map name="qgis_8pktoolsUtils_8pktoolsUtils" id="qgis_8pktoolsUtils_8pktoolsUtils">
 <area shape="rect" id="node1" href="classqgis_1_1pktoolsUtils_1_1pktoolsUtils.html" title="qgis.pktoolsUtils.pktools\lUtils" alt="" coords="5,5,171,46"/></map>
 </td></tr>
-<tr><td><img src="inherit_graph_35.png" border="0" alt="" usemap="#qgis_8ProcessingPktoolsPlugin_8ProcessingPktoolsPlugin"/>
+<tr><td><img src="inherit_graph_37.png" border="0" alt="" usemap="#qgis_8ProcessingPktoolsPlugin_8ProcessingPktoolsPlugin"/>
 <map name="qgis_8ProcessingPktoolsPlugin_8ProcessingPktoolsPlugin" id="qgis_8ProcessingPktoolsPlugin_8ProcessingPktoolsPlugin">
 <area shape="rect" id="node1" href="classqgis_1_1ProcessingPktoolsPlugin_1_1ProcessingPktoolsPlugin.html" title="qgis.ProcessingPktoolsPlugin.\lProcessingPktoolsPlugin" alt="" coords="6,5,205,46"/></map>
 </td></tr>
-<tr><td><img src="inherit_graph_36.png" border="0" alt="" usemap="#QMatrix"/>
+<tr><td><img src="inherit_graph_38.png" border="0" alt="" usemap="#QMatrix"/>
 <map name="QMatrix" id="QMatrix">
 <area shape="rect" id="node1" href="classQMatrix.html" title="QMatrix" alt="" coords="6,56,74,83"/><area shape="rect" id="node2" href="classKernel.html" title="Kernel" alt="" coords="123,56,181,83"/><area shape="rect" id="node3" href="classONE__CLASS__Q.html" title="ONE_CLASS_Q" alt="" coords="230,5,349,32"/><area shape="rect" id="node4" href="classSVC__Q.html" title="SVC_Q" alt="" coords="256,56,323,83"/><area shape="rect" id="node5" href="classSVR__Q.html" title="SVR_Q" alt="" coords=" [...]
 </td></tr>
-<tr><td><img src="inherit_graph_37.png" border="0" alt="" usemap="#Solver"/>
+<tr><td><img src="inherit_graph_39.png" border="0" alt="" usemap="#Solver"/>
 <map name="Solver" id="Solver">
 <area shape="rect" id="node1" href="classSolver.html" title="Solver" alt="" coords="5,5,64,32"/><area shape="rect" id="node2" href="classSolver__NU.html" title="Solver_NU" alt="" coords="113,5,199,32"/></map>
 </td></tr>
-<tr><td><img src="inherit_graph_38.png" border="0" alt="" usemap="#Solver_1_1SolutionInfo"/>
+<tr><td><img src="inherit_graph_40.png" border="0" alt="" usemap="#Solver_1_1SolutionInfo"/>
 <map name="Solver_1_1SolutionInfo" id="Solver_1_1SolutionInfo">
 <area shape="rect" id="node1" href="structSolver_1_1SolutionInfo.html" title="Solver::SolutionInfo" alt="" coords="5,5,141,32"/></map>
 </td></tr>
-<tr><td><img src="inherit_graph_39.png" border="0" alt="" usemap="#statfactory_1_1StatFactory"/>
+<tr><td><img src="inherit_graph_41.png" border="0" alt="" usemap="#statfactory_1_1StatFactory"/>
 <map name="statfactory_1_1StatFactory" id="statfactory_1_1StatFactory">
 <area shape="rect" id="node1" href="classstatfactory_1_1StatFactory.html" title="statfactory::StatFactory" alt="" coords="5,5,165,32"/></map>
 </td></tr>
-<tr><td><img src="inherit_graph_40.png" border="0" alt="" usemap="#svm__model"/>
+<tr><td><img src="inherit_graph_42.png" border="0" alt="" usemap="#svm__model"/>
 <map name="svm__model" id="svm__model">
 <area shape="rect" id="node1" href="structsvm__model.html" title="svm_model" alt="" coords="6,5,95,32"/></map>
 </td></tr>
-<tr><td><img src="inherit_graph_41.png" border="0" alt="" usemap="#svm__node"/>
+<tr><td><img src="inherit_graph_43.png" border="0" alt="" usemap="#svm__node"/>
 <map name="svm__node" id="svm__node">
 <area shape="rect" id="node1" href="structsvm__node.html" title="svm_node" alt="" coords="5,5,88,32"/></map>
 </td></tr>
-<tr><td><img src="inherit_graph_42.png" border="0" alt="" usemap="#svm__parameter"/>
+<tr><td><img src="inherit_graph_44.png" border="0" alt="" usemap="#svm__parameter"/>
 <map name="svm__parameter" id="svm__parameter">
 <area shape="rect" id="node1" href="structsvm__parameter.html" title="svm_parameter" alt="" coords="5,5,117,32"/></map>
 </td></tr>
-<tr><td><img src="inherit_graph_43.png" border="0" alt="" usemap="#svm__problem"/>
+<tr><td><img src="inherit_graph_45.png" border="0" alt="" usemap="#svm__problem"/>
 <map name="svm__problem" id="svm__problem">
 <area shape="rect" id="node1" href="structsvm__problem.html" title="svm_problem" alt="" coords="6,5,106,32"/></map>
 </td></tr>
-<tr><td><img src="inherit_graph_44.png" border="0" alt="" usemap="#Ui__MainWindow"/>
+<tr><td><img src="inherit_graph_46.png" border="0" alt="" usemap="#Ui__MainWindow"/>
 <map name="Ui__MainWindow" id="Ui__MainWindow">
 <area shape="rect" id="node1" href="classUi__MainWindow.html" title="Ui_MainWindow" alt="" coords="5,5,123,32"/><area shape="rect" id="node2" href="classUi_1_1MainWindow.html" title="Ui::MainWindow" alt="" coords="171,5,290,32"/></map>
 </td></tr>
@@ -239,7 +247,7 @@
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Jun 23 2015 17:09:37 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/md_apps.html b/doc/html/md_apps.html
index 79d7a8e..b64416a 100644
--- a/doc/html/md_apps.html
+++ b/doc/html/md_apps.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.3</span>
+    <span id="projectnumber">2.6.4</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -82,7 +82,7 @@ Available tools</h1>
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Jun 23 2015 17:09:37 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/md_mainpage.html b/doc/html/md_description_pkstat.html
similarity index 90%
copy from doc/html/md_mainpage.html
copy to doc/html/md_description_pkstat.html
index d610bbc..4d6fd69 100644
--- a/doc/html/md_mainpage.html
+++ b/doc/html/md_description_pkstat.html
@@ -4,7 +4,7 @@
 <meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
 <meta http-equiv="X-UA-Compatible" content="IE=9"/>
 <meta name="generator" content="Doxygen 1.8.6"/>
-<title>pktools: mainpage</title>
+<title>pktools: description_pkstat</title>
 <link href="tabs.css" rel="stylesheet" type="text/css"/>
 <script type="text/javascript" src="jquery.js"></script>
 <script type="text/javascript" src="dynsections.js"></script>
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.3</span>
+    <span id="projectnumber">2.6.4</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -40,14 +40,14 @@
 </div><!-- top -->
 <div class="header">
   <div class="headertitle">
-<div class="title">mainpage </div>  </div>
+<div class="title">description_pkstat </div>  </div>
 </div><!--header-->
 <div class="contents">
 <div class="textblock"></div></div><!-- contents -->
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Jun 23 2015 17:09:37 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/md_examples_pkann.html b/doc/html/md_examples_pkann.html
index 1bb4bfd..7bc0a82 100644
--- a/doc/html/md_examples_pkann.html
+++ b/doc/html/md_examples_pkann.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.3</span>
+    <span id="projectnumber">2.6.4</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -53,7 +53,7 @@ Examples of pkann</h1>
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Jun 23 2015 17:09:37 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/md_examples_pkascii2img.html b/doc/html/md_examples_pkascii2img.html
index 48d0423..ee62cdd 100644
--- a/doc/html/md_examples_pkascii2img.html
+++ b/doc/html/md_examples_pkascii2img.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.3</span>
+    <span id="projectnumber">2.6.4</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -100,7 +100,7 @@ Examples of pkascii2img</h1>
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Jun 23 2015 17:09:37 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/md_examples_pkascii2ogr.html b/doc/html/md_examples_pkascii2ogr.html
index 9f67b38..c933ba8 100644
--- a/doc/html/md_examples_pkascii2ogr.html
+++ b/doc/html/md_examples_pkascii2ogr.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.3</span>
+    <span id="projectnumber">2.6.4</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -51,7 +51,7 @@ Examples of pkascii2ogr</h1>
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Jun 23 2015 17:09:37 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/md_examples_pkcomposite.html b/doc/html/md_examples_pkcomposite.html
index 77ca524..bc2e827 100644
--- a/doc/html/md_examples_pkcomposite.html
+++ b/doc/html/md_examples_pkcomposite.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.3</span>
+    <span id="projectnumber">2.6.4</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -59,7 +59,7 @@ Examples of pkcomposite</h1>
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Jun 23 2015 17:09:37 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/md_examples_pkcreatect.html b/doc/html/md_examples_pkcreatect.html
index 3a2d66b..6f72842 100644
--- a/doc/html/md_examples_pkcreatect.html
+++ b/doc/html/md_examples_pkcreatect.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.3</span>
+    <span id="projectnumber">2.6.4</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -64,7 +64,7 @@ Examples of pkcreatect</h1>
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Jun 23 2015 17:09:37 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/md_examples_pkcrop.html b/doc/html/md_examples_pkcrop.html
index 531d992..cde7b09 100644
--- a/doc/html/md_examples_pkcrop.html
+++ b/doc/html/md_examples_pkcrop.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.3</span>
+    <span id="projectnumber">2.6.4</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -62,7 +62,7 @@ Examples of pkcrop</h1>
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Jun 23 2015 17:09:37 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/md_examples_pkdiff.html b/doc/html/md_examples_pkdiff.html
index 835ea9d..fb3bc1f 100644
--- a/doc/html/md_examples_pkdiff.html
+++ b/doc/html/md_examples_pkdiff.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.3</span>
+    <span id="projectnumber">2.6.4</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -53,7 +53,7 @@ Examples of pkdiff</h1>
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Jun 23 2015 17:09:37 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/md_examples_pkdsm2shadow.html b/doc/html/md_examples_pkdsm2shadow.html
index 07cce14..e8e43db 100644
--- a/doc/html/md_examples_pkdsm2shadow.html
+++ b/doc/html/md_examples_pkdsm2shadow.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.3</span>
+    <span id="projectnumber">2.6.4</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -51,7 +51,7 @@ Examples of pkdsm2shadow</h1>
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Jun 23 2015 17:09:37 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/md_examples_pkdumpimg.html b/doc/html/md_examples_pkdumpimg.html
index 7802292..bce8e7e 100644
--- a/doc/html/md_examples_pkdumpimg.html
+++ b/doc/html/md_examples_pkdumpimg.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.3</span>
+    <span id="projectnumber">2.6.4</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -66,7 +66,7 @@ Examples of pkdumpimg</h1>
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Jun 23 2015 17:09:37 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/md_examples_pkdumpogr.html b/doc/html/md_examples_pkdumpogr.html
index 0b7f8db..0495d1b 100644
--- a/doc/html/md_examples_pkdumpogr.html
+++ b/doc/html/md_examples_pkdumpogr.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.3</span>
+    <span id="projectnumber">2.6.4</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -71,7 +71,7 @@ Examples of pkdumpogr</h1>
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Jun 23 2015 17:09:37 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/md_examples_pkextract.html b/doc/html/md_examples_pkextract.html
index 851881e..e3e3e5c 100644
--- a/doc/html/md_examples_pkextract.html
+++ b/doc/html/md_examples_pkextract.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.3</span>
+    <span id="projectnumber">2.6.4</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -79,7 +79,7 @@ Using raster samples</h2>
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Jun 23 2015 17:09:37 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/md_examples_pkfilter.html b/doc/html/md_examples_pkfilter.html
index 7c88391..599c894 100644
--- a/doc/html/md_examples_pkfilter.html
+++ b/doc/html/md_examples_pkfilter.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.3</span>
+    <span id="projectnumber">2.6.4</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -57,12 +57,12 @@ Filtering in spectral/temporal domain</h2>
 Applications with moving window</h3>
 <p>Calculate the median value for each pixel, calculated on a moving window of width 3 (-dz 3) over all input bands. The output raster dataset will contain as many bands as the input raster dataset.</p>
 <div class="fragment"><div class="line">pkfilter -i input.tif -o filter_stdev.tif -dz 3 -f median</div>
-</div><!-- fragment --><h3><a class="anchor" id="examples_pkfilter_spectral_no_moving_window"></a>
-Applications without moving window</h3>
+</div><!-- fragment --><h3><a class="anchor" id="examples_pkfilter_spectral_statistics"></a>
+Applications of statistical functions in spectral domain</h3>
 <p>Calculate the standard deviation for each pixel, calculated on all input bands. The output raster dataset will contain a single band only, no moving window is used (-dz 1).</p>
 <div class="fragment"><div class="line">pkfilter -i input.tif -o filter_stdev.tif -dz 1 -f stdev</div>
 </div><!-- fragment --><p>"Smooth" (interpolate) nodata in spectral/temporal domain (-dz 1), using a linear interpolation. The following interpolation types are supported: akima (default), linear, polynomial, cspline, cspline_periodic, akima_periodic (please check <a href="http://www.gnu.org/software/gsl/manual/html_node/Interpolation-Types.html">gsl</a> page for more information on the interpolation types).</p>
-<div class="fragment"><div class="line">pkfilter -i input.tif -o input_smoothed.tif -dz 1 -f smoothnodata -interp linear</div>
+<div class="fragment"><div class="line">pkfilter -i input.tif -o smoothed.tif -dz 1 -f smoothnodata -interp linear</div>
 </div><!-- fragment --><h3><a class="anchor" id="examples_pkfilter_srf"></a>
 Filter with spectral response functions</h3>
 <p>The following two examples show how to use pkfilter for spectral filtering a high dimensional input (hyperspectral image) to a lower dimensional output (multi-spectral image). Notice that the input wavelenghts must be provided as -win value1 -win value2 -win value3 ... To save typing, we assume the input wavelengths are listed in a text file wavelengths.txt (single column ASCII file with all wavelenghts listed in nanometer).</p>
@@ -72,11 +72,32 @@ Filter with spectral response functions</h3>
 <div class="fragment"><div class="line">pkfilter -i hyperspectral.tif -o multispectral.tif -srf srf1.txt -srf srf2.txt -srf srf3.txt $(cat wavelengths.txt | <span class="keywordflow">while</span> read W;<span class="keywordflow">do</span> echo <span class="stringliteral">" -win $W"</span>;done)</div>
 </div><!-- fragment --><p>The next example is similar to the previous. Instead of providing a spectral response function for each output band, you can also provide the center wavelengths and full width half max values. Here, a three band (red, green, blue) output image is produced.</p>
 <div class="fragment"><div class="line">pkfilter -i hyperspectral.tif -o multispectral.tif -wout 650 -wout 510 -wout 475 -fwhm 50 -fwhm 50  -fwhm 50 $(cat wavelengths.txt | <span class="keywordflow">while</span> read W;<span class="keywordflow">do</span> echo <span class="stringliteral">" -win $W"</span>;done)</div>
-</div><!-- fragment --> </div></div><!-- contents -->
+</div><!-- fragment --><h3><a class="anchor" id="examples_pkfilter_savgolay"></a>
+Applying the Savitzky-Golay filter to reconstruct a time-series data set</h3>
+<p>The following example reconstructs a time-series data set based on the Savitzky–Golay filter, as suggested by <a href="http://www.sciencedirect.com/science/article/pii/S003442570400080X">J. Chen 2004</a>.</p>
+<p>Input is a multi-band (Byte) raster dataset containing a noisy time series, e.g., a normalized difference vegetation index (NDVI) with cloud contaminated (low) NDVI values. Output is the reconstructed time-series data set, which approaches the upper NDVI enveloppe. Please refer to <a href="http://www.sciencedirect.com/science/article/pii/S003442570400080X">J. Chen 2004</a> for more details.</p>
+<h3><a class="anchor" id="savgolay_preparation"></a>
+Preparation</h3>
+<p>Create a long-term change trend fitting (lta.tif) using the Savitzky-Golay filter. Choose the number of lefward (past) and rightward (future) data points (e.g., 7). The order of smoothing polynomial in the Savitzky-Golay filter is set to 2. </p>
+<div class="fragment"><div class="line">pkfilter -i input.tif -o lta.tif -f savgolay -nl 7 -nr 7 -m 2 -pad replicate</div>
+</div><!-- fragment --><h3><a class="anchor" id="savgolay_initialization"></a>
+Initialization</h3>
+<p>Decrease the number of lefward (past) and rightward (future) data points to 4. The order of smoothing polynomial in the Savitzky-Golay filter is set to 6. Valid data are from 0 to 250 (nodata is set to 250). </p>
+<div class="fragment"><div class="line">pkcomposite -i lta.tif -i input.tif -o iter1.tif -cr maxallbands -max 250 -dstnodata 250</div>
+<div class="line">pkfilter -i iter1.tif -o savgolay1.tif -f savgolay -nl 4 -nr 4 -m 6 -pad replicate</div>
+</div><!-- fragment --><h3><a class="anchor" id="savgolay_iteration"></a>
+Iterative process (repeat, e.g., 5-10 times)</h3>
+<div class="fragment"><div class="line">pkcomposite -i input.tif -i savgolay1.tif -o iter2.tif -cr maxallbands -max 250 -dstnodata </div>
+<div class="line">pkfilter -i iter2.tif -o savgolay2.tif -f savgolay -nl 4 -nr 4 -m 6 -pad replicate</div>
+</div><!-- fragment --><div class="fragment"><div class="line">pkcomposite -i input.tif -i savgolay2.tif -o iter3.tif -cr maxallbands -max 250 -dstnodata </div>
+<div class="line">pkfilter -i iter3.tif -o savgolay3.tif -f savgolay -nl 4 -nr 4 -m 6 -pad replicate</div>
+</div><!-- fragment --> <div class="fragment"><div class="line">etc.</div>
+</div><!-- fragment --><p>Output savgolay<n>.tif is the reconstructed time-series data set. </p>
+</div></div><!-- contents -->
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Jun 23 2015 17:09:37 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/md_examples_pkgetmask.html b/doc/html/md_examples_pkgetmask.html
index 6a4ba14..884d8bb 100644
--- a/doc/html/md_examples_pkgetmask.html
+++ b/doc/html/md_examples_pkgetmask.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.3</span>
+    <span id="projectnumber">2.6.4</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -53,7 +53,7 @@ Examples of pkgetmask</h1>
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Jun 23 2015 17:09:37 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/md_examples_pkinfo.html b/doc/html/md_examples_pkinfo.html
index a9a9422..57b1c8d 100644
--- a/doc/html/md_examples_pkinfo.html
+++ b/doc/html/md_examples_pkinfo.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.3</span>
+    <span id="projectnumber">2.6.4</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -67,7 +67,7 @@ Examples of pkinfo</h1>
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Jun 23 2015 17:09:37 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/md_examples_pkpolygonize.html b/doc/html/md_examples_pkpolygonize.html
index c6116ec..58625e9 100644
--- a/doc/html/md_examples_pkpolygonize.html
+++ b/doc/html/md_examples_pkpolygonize.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.3</span>
+    <span id="projectnumber">2.6.4</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -51,7 +51,7 @@ Examples of pkpolygonize</h1>
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Jun 23 2015 17:09:37 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/md_examples_pkreclass.html b/doc/html/md_examples_pkreclass.html
index 5b1dea6..0775686 100644
--- a/doc/html/md_examples_pkreclass.html
+++ b/doc/html/md_examples_pkreclass.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.3</span>
+    <span id="projectnumber">2.6.4</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -57,7 +57,7 @@ Examples of pkreclass</h1>
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Jun 23 2015 17:09:37 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/md_examples_pksetmask.html b/doc/html/md_examples_pksetmask.html
index 5769763..0a59651 100644
--- a/doc/html/md_examples_pksetmask.html
+++ b/doc/html/md_examples_pksetmask.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.3</span>
+    <span id="projectnumber">2.6.4</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -73,7 +73,7 @@ More examples</h1>
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Jun 23 2015 17:09:37 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/md_examples_pksieve.html b/doc/html/md_examples_pksieve.html
index c3e2e91..d34b359 100644
--- a/doc/html/md_examples_pksieve.html
+++ b/doc/html/md_examples_pksieve.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.3</span>
+    <span id="projectnumber">2.6.4</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -51,7 +51,7 @@ Examples of pksieve</h1>
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Jun 23 2015 17:09:37 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/md_examples_pkstatogr.html b/doc/html/md_examples_pkstatogr.html
index b9d1046..2d1b686 100644
--- a/doc/html/md_examples_pkstatogr.html
+++ b/doc/html/md_examples_pkstatogr.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.3</span>
+    <span id="projectnumber">2.6.4</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -53,7 +53,7 @@ Examples of pkstatogr</h1>
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Jun 23 2015 17:09:37 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/md_examples_pksvm.html b/doc/html/md_examples_pksvm.html
index ff0264a..81df54d 100644
--- a/doc/html/md_examples_pksvm.html
+++ b/doc/html/md_examples_pksvm.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.3</span>
+    <span id="projectnumber">2.6.4</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -55,7 +55,7 @@ Examples of pksvm</h1>
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Jun 23 2015 17:09:37 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/md_faq_pkcomposite.html b/doc/html/md_faq_pkcomposite.html
index 9c0d537..6a0a6dc 100644
--- a/doc/html/md_faq_pkcomposite.html
+++ b/doc/html/md_faq_pkcomposite.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.3</span>
+    <span id="projectnumber">2.6.4</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -71,7 +71,7 @@ Frequently asked questions about pkcomposite</h1>
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Jun 23 2015 17:09:37 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/md_faq_pksetmask.html b/doc/html/md_faq_pksetmask.html
index 9fe130a..a5ddc98 100644
--- a/doc/html/md_faq_pksetmask.html
+++ b/doc/html/md_faq_pksetmask.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.3</span>
+    <span id="projectnumber">2.6.4</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -52,7 +52,7 @@ Frequently asked questions about pksetmask</h1>
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Jun 23 2015 17:09:37 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/md_header.html b/doc/html/md_header.html
index df02cb8..93a97a3 100644
--- a/doc/html/md_header.html
+++ b/doc/html/md_header.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.3</span>
+    <span id="projectnumber">2.6.4</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -59,7 +59,7 @@ thetool</h1>
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Jun 23 2015 17:09:37 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/md_installation_linux.html b/doc/html/md_installation_linux.html
index 3c0ecd7..91bbded 100644
--- a/doc/html/md_installation_linux.html
+++ b/doc/html/md_installation_linux.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.3</span>
+    <span id="projectnumber">2.6.4</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -145,7 +145,7 @@ Optional dependences</h3>
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Jun 23 2015 17:09:37 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/md_examples_pkstatogr.html b/doc/html/md_installation_plugins.html
similarity index 72%
copy from doc/html/md_examples_pkstatogr.html
copy to doc/html/md_installation_plugins.html
index b9d1046..2eb4d41 100644
--- a/doc/html/md_examples_pkstatogr.html
+++ b/doc/html/md_installation_plugins.html
@@ -4,7 +4,7 @@
 <meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
 <meta http-equiv="X-UA-Compatible" content="IE=9"/>
 <meta name="generator" content="Doxygen 1.8.6"/>
-<title>pktools: examples_pkstatogr</title>
+<title>pktools: installation_plugins</title>
 <link href="tabs.css" rel="stylesheet" type="text/css"/>
 <script type="text/javascript" src="jquery.js"></script>
 <script type="text/javascript" src="dynsections.js"></script>
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.3</span>
+    <span id="projectnumber">2.6.4</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -40,20 +40,21 @@
 </div><!-- top -->
 <div class="header">
   <div class="headertitle">
-<div class="title">examples_pkstatogr </div>  </div>
+<div class="title">installation_plugins </div>  </div>
 </div><!--header-->
 <div class="contents">
-<div class="textblock"><h1><a class="anchor" id="examples_pkstatogr"></a>
-Examples of pkstatogr</h1>
-<div class="fragment"><div class="line">pkstatogr -i input.shp -f FIELDID -n 100</div>
-</div><!-- fragment --><p> report histogram of values in FIELDID (to standard output)</p>
-<div class="fragment"><div class="line">pkstatogr -i input.shp -f FIELDID -min -max -mean -stdev</div>
-</div><!-- fragment --><p> report min, max, mean and standard deviation of values in FIELDID (to standard output) </p>
+<div class="textblock"><h1><a class="anchor" id="qgis_plugin"></a>
+QGIS plugin</h1>
+<p>A selection of the pktools utiltities can be run from within QGIS, via the Processing Toolbox.</p>
+<p>Make sure pktools is installed on your system first. Then, you can install the pktools Plugin via the QGIS menu:</p>
+<p>Plugins, Manage and Install Plugins...</p>
+<p>Then set the appropriate path of the pktools bin folder via Processing Options, Providers, pktools, pktools folder.</p>
+<p>Click OK and open the Processing Toolbox. The pktools utilities should appear when the Advanced interface is selected. </p>
 </div></div><!-- contents -->
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Jun 23 2015 17:09:37 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/md_installation_windows.html b/doc/html/md_installation_windows.html
index 68dd581..4ee3f7e 100644
--- a/doc/html/md_installation_windows.html
+++ b/doc/html/md_installation_windows.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.3</span>
+    <span id="projectnumber">2.6.4</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -55,10 +55,6 @@ pktools</h2>
 <h2><a class="anchor" id="Installation_windows_cli"></a>
 Command line interface</h2>
 <p>The pktools utilities can be run from the command line using a command prompt window (from the Start button, click All Programs, Accessories, and then Command Prompt). First add the bin directory extracted from the pktools zip archive to the environment variable PATH (from the Start button, click on control panel, then System, Advanced system settings, select Environment Variables and edit PATH)</p>
-<h2><a class="anchor" id="Installation_windows_qgis"></a>
-QGIS plugin</h2>
-<p>A selection of the pktools utiltities can be run from within QGIS, via the Processing Toolbox. First install the pktools plugin via Plugins, Manage and Install Plugins...</p>
-<p>Currently, the pktools <a href="http://plugins.qgis.org/plugins/pktools/">plugin</a> is experimental, so do tick the experimental plugins under Settings. Then set the appropriate path of the pktools bin folder via Processing Options, Providers, pktools, pktools folder. Click OK and open the Processing Toolbox. The pktools utilities should appear when the Advanced interface is selected.</p>
 <h2><a class="anchor" id="Uninstall_windows"></a>
 Older versions of pktools</h2>
 <p>Please make sure the latest version of pktools is always installed. Changes with respect to the previous versions can be checked in the text file <a href="http://git.savannah.gnu.org/cgit/pktools.git/tree/ChangeLog">Changelog</a>. Older versions of pktools were installed with a setup exe file. They should be uninstalled first via Programs and Features in Control Panel. </p>
@@ -66,7 +62,7 @@ Older versions of pktools</h2>
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Jun 23 2015 17:09:37 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/md_mainpage.html b/doc/html/md_mainpage.html
index d610bbc..90aa5c9 100644
--- a/doc/html/md_mainpage.html
+++ b/doc/html/md_mainpage.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.3</span>
+    <span id="projectnumber">2.6.4</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -47,7 +47,7 @@
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Jun 23 2015 17:09:37 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/myfann__cpp_8h_source.html b/doc/html/myfann__cpp_8h_source.html
index 605f9d2..5d21e30 100644
--- a/doc/html/myfann__cpp_8h_source.html
+++ b/doc/html/myfann__cpp_8h_source.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.3</span>
+    <span id="projectnumber">2.6.4</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -4045,7 +4045,7 @@
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Jun 23 2015 17:09:36 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Tue Nov 3 2015 15:58:26 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/pages.html b/doc/html/pages.html
index 65a84a6..5da8986 100644
--- a/doc/html/pages.html
+++ b/doc/html/pages.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.3</span>
+    <span id="projectnumber">2.6.4</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -46,71 +46,73 @@
 <div class="textblock">Here is a list of all related documentation pages:</div><div class="directory">
 <table class="directory">
 <tr id="row_0_" class="even"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><a class="el" href="md_apps.html" target="_self">apps</a></td><td class="desc"></td></tr>
-<tr id="row_1_"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><a class="el" href="md_examples_pkann.html" target="_self">examples_pkann</a></td><td class="desc"></td></tr>
-<tr id="row_2_" class="even"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><a class="el" href="md_examples_pkascii2img.html" target="_self">examples_pkascii2img</a></td><td class="desc"></td></tr>
-<tr id="row_3_"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><a class="el" href="md_examples_pkascii2ogr.html" target="_self">examples_pkascii2ogr</a></td><td class="desc"></td></tr>
-<tr id="row_4_" class="even"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><a class="el" href="md_examples_pkcomposite.html" target="_self">examples_pkcomposite</a></td><td class="desc"></td></tr>
-<tr id="row_5_"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><a class="el" href="md_examples_pkcreatect.html" target="_self">examples_pkcreatect</a></td><td class="desc"></td></tr>
-<tr id="row_6_" class="even"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><a class="el" href="md_examples_pkcrop.html" target="_self">examples_pkcrop</a></td><td class="desc"></td></tr>
-<tr id="row_7_"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><a class="el" href="md_examples_pkdiff.html" target="_self">examples_pkdiff</a></td><td class="desc"></td></tr>
-<tr id="row_8_" class="even"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><a class="el" href="md_examples_pkdsm2shadow.html" target="_self">examples_pkdsm2shadow</a></td><td class="desc"></td></tr>
-<tr id="row_9_"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><a class="el" href="md_examples_pkdumpimg.html" target="_self">examples_pkdumpimg</a></td><td class="desc"></td></tr>
-<tr id="row_10_" class="even"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><a class="el" href="md_examples_pkdumpogr.html" target="_self">examples_pkdumpogr</a></td><td class="desc"></td></tr>
-<tr id="row_11_"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><a class="el" href="md_examples_pkextract.html" target="_self">examples_pkextract</a></td><td class="desc"></td></tr>
-<tr id="row_12_" class="even"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><a class="el" href="md_examples_pkfilter.html" target="_self">examples_pkfilter</a></td><td class="desc"></td></tr>
-<tr id="row_13_"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><a class="el" href="md_examples_pkgetmask.html" target="_self">examples_pkgetmask</a></td><td class="desc"></td></tr>
-<tr id="row_14_" class="even"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><a class="el" href="md_examples_pkinfo.html" target="_self">examples_pkinfo</a></td><td class="desc"></td></tr>
-<tr id="row_15_"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><a class="el" href="md_examples_pkpolygonize.html" target="_self">examples_pkpolygonize</a></td><td class="desc"></td></tr>
-<tr id="row_16_" class="even"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><a class="el" href="md_examples_pkreclass.html" target="_self">examples_pkreclass</a></td><td class="desc"></td></tr>
-<tr id="row_17_"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><a class="el" href="md_examples_pksetmask.html" target="_self">examples_pksetmask</a></td><td class="desc"></td></tr>
-<tr id="row_18_" class="even"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><a class="el" href="md_examples_pksieve.html" target="_self">examples_pksieve</a></td><td class="desc"></td></tr>
-<tr id="row_19_"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><a class="el" href="md_examples_pkstatogr.html" target="_self">examples_pkstatogr</a></td><td class="desc"></td></tr>
-<tr id="row_20_" class="even"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><a class="el" href="md_examples_pksvm.html" target="_self">examples_pksvm</a></td><td class="desc"></td></tr>
-<tr id="row_21_"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><a class="el" href="md_faq_pkcomposite.html" target="_self">faq_pkcomposite</a></td><td class="desc"></td></tr>
-<tr id="row_22_" class="even"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><a class="el" href="md_faq_pksetmask.html" target="_self">faq_pksetmask</a></td><td class="desc"></td></tr>
-<tr id="row_23_"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><a class="el" href="md_header.html" target="_self">header</a></td><td class="desc"></td></tr>
-<tr id="row_24_" class="even"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><a class="el" href="md_installation_linux.html" target="_self">installation_linux</a></td><td class="desc"></td></tr>
-<tr id="row_25_"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><a class="el" href="md_installation_windows.html" target="_self">installation_windows</a></td><td class="desc"></td></tr>
-<tr id="row_26_" class="even"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><a class="el" href="md_mainpage.html" target="_self">mainpage</a></td><td class="desc"></td></tr>
-<tr id="row_27_"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><a class="el" href="pkann.html" target="_self">pkann</a></td><td class="desc"></td></tr>
-<tr id="row_28_" class="even"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><a class="el" href="pkascii2img.html" target="_self">pkascii2img</a></td><td class="desc"></td></tr>
-<tr id="row_29_"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><a class="el" href="pkascii2ogr.html" target="_self">pkascii2ogr</a></td><td class="desc"></td></tr>
-<tr id="row_30_" class="even"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><a class="el" href="pkcomposite.html" target="_self">pkcomposite</a></td><td class="desc"></td></tr>
-<tr id="row_31_"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><a class="el" href="pkcreatect.html" target="_self">pkcreatect</a></td><td class="desc"></td></tr>
-<tr id="row_32_" class="even"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><a class="el" href="pkcrop.html" target="_self">pkcrop</a></td><td class="desc"></td></tr>
-<tr id="row_33_"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><a class="el" href="pkdiff.html" target="_self">pkdiff</a></td><td class="desc"></td></tr>
-<tr id="row_34_" class="even"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><a class="el" href="pkdsm2shadow.html" target="_self">pkdsm2shadow</a></td><td class="desc"></td></tr>
-<tr id="row_35_"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><a class="el" href="pkdumpimg.html" target="_self">pkdumpimg</a></td><td class="desc"></td></tr>
-<tr id="row_36_" class="even"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><a class="el" href="pkdumpogr.html" target="_self">pkdumpogr</a></td><td class="desc"></td></tr>
-<tr id="row_37_"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><a class="el" href="pkegcs.html" target="_self">pkegcs</a></td><td class="desc"></td></tr>
-<tr id="row_38_" class="even"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><a class="el" href="pkextract.html" target="_self">pkextract</a></td><td class="desc"></td></tr>
-<tr id="row_39_"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><a class="el" href="pkfillnodata.html" target="_self">pkfillnodata</a></td><td class="desc"></td></tr>
-<tr id="row_40_" class="even"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><a class="el" href="pkfilter.html" target="_self">pkfilter</a></td><td class="desc"></td></tr>
-<tr id="row_41_"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><a class="el" href="pkfilterascii.html" target="_self">pkfilterascii</a></td><td class="desc"></td></tr>
-<tr id="row_42_" class="even"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><a class="el" href="pkfilterdem.html" target="_self">pkfilterdem</a></td><td class="desc"></td></tr>
-<tr id="row_43_"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><a class="el" href="pkfsann.html" target="_self">pkfsann</a></td><td class="desc"></td></tr>
-<tr id="row_44_" class="even"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><a class="el" href="pkfssvm.html" target="_self">pkfssvm</a></td><td class="desc"></td></tr>
-<tr id="row_45_"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><a class="el" href="pkgetmask.html" target="_self">pkgetmask</a></td><td class="desc"></td></tr>
-<tr id="row_46_" class="even"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><a class="el" href="pkinfo.html" target="_self">pkinfo</a></td><td class="desc"></td></tr>
-<tr id="row_47_"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><a class="el" href="pkkalman.html" target="_self">pkkalman</a></td><td class="desc"></td></tr>
-<tr id="row_48_" class="even"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><a class="el" href="pklas2img.html" target="_self">pklas2img</a></td><td class="desc"></td></tr>
-<tr id="row_49_"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><a class="el" href="pkoptsvm.html" target="_self">pkoptsvm</a></td><td class="desc"></td></tr>
-<tr id="row_50_" class="even"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><a class="el" href="pkpolygonize.html" target="_self">pkpolygonize</a></td><td class="desc"></td></tr>
-<tr id="row_51_"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><a class="el" href="pkreclass.html" target="_self">pkreclass</a></td><td class="desc"></td></tr>
-<tr id="row_52_" class="even"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><a class="el" href="pkregann.html" target="_self">pkregann</a></td><td class="desc"></td></tr>
-<tr id="row_53_"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><a class="el" href="pksetmask.html" target="_self">pksetmask</a></td><td class="desc"></td></tr>
-<tr id="row_54_" class="even"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><a class="el" href="pksieve.html" target="_self">pksieve</a></td><td class="desc"></td></tr>
-<tr id="row_55_"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><a class="el" href="pkstat.html" target="_self">pkstat</a></td><td class="desc"></td></tr>
-<tr id="row_56_" class="even"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><a class="el" href="pkstatascii.html" target="_self">pkstatascii</a></td><td class="desc"></td></tr>
-<tr id="row_57_"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><a class="el" href="pkstatogr.html" target="_self">pkstatogr</a></td><td class="desc"></td></tr>
-<tr id="row_58_" class="even"><td class="entry"><img src="ftv2lastnode.png" alt="\" width="16" height="22" /><a class="el" href="pksvm.html" target="_self">pksvm</a></td><td class="desc"></td></tr>
+<tr id="row_1_"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><a class="el" href="md_description_pkstat.html" target="_self">description_pkstat</a></td><td class="desc"></td></tr>
+<tr id="row_2_" class="even"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><a class="el" href="md_examples_pkann.html" target="_self">examples_pkann</a></td><td class="desc"></td></tr>
+<tr id="row_3_"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><a class="el" href="md_examples_pkascii2img.html" target="_self">examples_pkascii2img</a></td><td class="desc"></td></tr>
+<tr id="row_4_" class="even"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><a class="el" href="md_examples_pkascii2ogr.html" target="_self">examples_pkascii2ogr</a></td><td class="desc"></td></tr>
+<tr id="row_5_"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><a class="el" href="md_examples_pkcomposite.html" target="_self">examples_pkcomposite</a></td><td class="desc"></td></tr>
+<tr id="row_6_" class="even"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><a class="el" href="md_examples_pkcreatect.html" target="_self">examples_pkcreatect</a></td><td class="desc"></td></tr>
+<tr id="row_7_"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><a class="el" href="md_examples_pkcrop.html" target="_self">examples_pkcrop</a></td><td class="desc"></td></tr>
+<tr id="row_8_" class="even"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><a class="el" href="md_examples_pkdiff.html" target="_self">examples_pkdiff</a></td><td class="desc"></td></tr>
+<tr id="row_9_"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><a class="el" href="md_examples_pkdsm2shadow.html" target="_self">examples_pkdsm2shadow</a></td><td class="desc"></td></tr>
+<tr id="row_10_" class="even"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><a class="el" href="md_examples_pkdumpimg.html" target="_self">examples_pkdumpimg</a></td><td class="desc"></td></tr>
+<tr id="row_11_"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><a class="el" href="md_examples_pkdumpogr.html" target="_self">examples_pkdumpogr</a></td><td class="desc"></td></tr>
+<tr id="row_12_" class="even"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><a class="el" href="md_examples_pkextract.html" target="_self">examples_pkextract</a></td><td class="desc"></td></tr>
+<tr id="row_13_"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><a class="el" href="md_examples_pkfilter.html" target="_self">examples_pkfilter</a></td><td class="desc"></td></tr>
+<tr id="row_14_" class="even"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><a class="el" href="md_examples_pkgetmask.html" target="_self">examples_pkgetmask</a></td><td class="desc"></td></tr>
+<tr id="row_15_"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><a class="el" href="md_examples_pkinfo.html" target="_self">examples_pkinfo</a></td><td class="desc"></td></tr>
+<tr id="row_16_" class="even"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><a class="el" href="md_examples_pkpolygonize.html" target="_self">examples_pkpolygonize</a></td><td class="desc"></td></tr>
+<tr id="row_17_"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><a class="el" href="md_examples_pkreclass.html" target="_self">examples_pkreclass</a></td><td class="desc"></td></tr>
+<tr id="row_18_" class="even"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><a class="el" href="md_examples_pksetmask.html" target="_self">examples_pksetmask</a></td><td class="desc"></td></tr>
+<tr id="row_19_"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><a class="el" href="md_examples_pksieve.html" target="_self">examples_pksieve</a></td><td class="desc"></td></tr>
+<tr id="row_20_" class="even"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><a class="el" href="md_examples_pkstatogr.html" target="_self">examples_pkstatogr</a></td><td class="desc"></td></tr>
+<tr id="row_21_"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><a class="el" href="md_examples_pksvm.html" target="_self">examples_pksvm</a></td><td class="desc"></td></tr>
+<tr id="row_22_" class="even"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><a class="el" href="md_faq_pkcomposite.html" target="_self">faq_pkcomposite</a></td><td class="desc"></td></tr>
+<tr id="row_23_"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><a class="el" href="md_faq_pksetmask.html" target="_self">faq_pksetmask</a></td><td class="desc"></td></tr>
+<tr id="row_24_" class="even"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><a class="el" href="md_header.html" target="_self">header</a></td><td class="desc"></td></tr>
+<tr id="row_25_"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><a class="el" href="md_installation_linux.html" target="_self">installation_linux</a></td><td class="desc"></td></tr>
+<tr id="row_26_" class="even"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><a class="el" href="md_installation_plugins.html" target="_self">installation_plugins</a></td><td class="desc"></td></tr>
+<tr id="row_27_"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><a class="el" href="md_installation_windows.html" target="_self">installation_windows</a></td><td class="desc"></td></tr>
+<tr id="row_28_" class="even"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><a class="el" href="md_mainpage.html" target="_self">mainpage</a></td><td class="desc"></td></tr>
+<tr id="row_29_"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><a class="el" href="pkann.html" target="_self">pkann</a></td><td class="desc"></td></tr>
+<tr id="row_30_" class="even"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><a class="el" href="pkascii2img.html" target="_self">pkascii2img</a></td><td class="desc"></td></tr>
+<tr id="row_31_"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><a class="el" href="pkascii2ogr.html" target="_self">pkascii2ogr</a></td><td class="desc"></td></tr>
+<tr id="row_32_" class="even"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><a class="el" href="pkcomposite.html" target="_self">pkcomposite</a></td><td class="desc"></td></tr>
+<tr id="row_33_"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><a class="el" href="pkcreatect.html" target="_self">pkcreatect</a></td><td class="desc"></td></tr>
+<tr id="row_34_" class="even"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><a class="el" href="pkcrop.html" target="_self">pkcrop</a></td><td class="desc"></td></tr>
+<tr id="row_35_"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><a class="el" href="pkdiff.html" target="_self">pkdiff</a></td><td class="desc"></td></tr>
+<tr id="row_36_" class="even"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><a class="el" href="pkdsm2shadow.html" target="_self">pkdsm2shadow</a></td><td class="desc"></td></tr>
+<tr id="row_37_"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><a class="el" href="pkdumpimg.html" target="_self">pkdumpimg</a></td><td class="desc"></td></tr>
+<tr id="row_38_" class="even"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><a class="el" href="pkdumpogr.html" target="_self">pkdumpogr</a></td><td class="desc"></td></tr>
+<tr id="row_39_"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><a class="el" href="pkegcs.html" target="_self">pkegcs</a></td><td class="desc"></td></tr>
+<tr id="row_40_" class="even"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><a class="el" href="pkextract.html" target="_self">pkextract</a></td><td class="desc"></td></tr>
+<tr id="row_41_"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><a class="el" href="pkfillnodata.html" target="_self">pkfillnodata</a></td><td class="desc"></td></tr>
+<tr id="row_42_" class="even"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><a class="el" href="pkfilter.html" target="_self">pkfilter</a></td><td class="desc"></td></tr>
+<tr id="row_43_"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><a class="el" href="pkfilterascii.html" target="_self">pkfilterascii</a></td><td class="desc"></td></tr>
+<tr id="row_44_" class="even"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><a class="el" href="pkfilterdem.html" target="_self">pkfilterdem</a></td><td class="desc"></td></tr>
+<tr id="row_45_"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><a class="el" href="pkfsann.html" target="_self">pkfsann</a></td><td class="desc"></td></tr>
+<tr id="row_46_" class="even"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><a class="el" href="pkfssvm.html" target="_self">pkfssvm</a></td><td class="desc"></td></tr>
+<tr id="row_47_"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><a class="el" href="pkgetmask.html" target="_self">pkgetmask</a></td><td class="desc"></td></tr>
+<tr id="row_48_" class="even"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><a class="el" href="pkinfo.html" target="_self">pkinfo</a></td><td class="desc"></td></tr>
+<tr id="row_49_"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><a class="el" href="pkkalman.html" target="_self">pkkalman</a></td><td class="desc"></td></tr>
+<tr id="row_50_" class="even"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><a class="el" href="pklas2img.html" target="_self">pklas2img</a></td><td class="desc"></td></tr>
+<tr id="row_51_"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><a class="el" href="pkoptsvm.html" target="_self">pkoptsvm</a></td><td class="desc"></td></tr>
+<tr id="row_52_" class="even"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><a class="el" href="pkpolygonize.html" target="_self">pkpolygonize</a></td><td class="desc"></td></tr>
+<tr id="row_53_"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><a class="el" href="pkreclass.html" target="_self">pkreclass</a></td><td class="desc"></td></tr>
+<tr id="row_54_" class="even"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><a class="el" href="pkregann.html" target="_self">pkregann</a></td><td class="desc"></td></tr>
+<tr id="row_55_"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><a class="el" href="pksetmask.html" target="_self">pksetmask</a></td><td class="desc"></td></tr>
+<tr id="row_56_" class="even"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><a class="el" href="pksieve.html" target="_self">pksieve</a></td><td class="desc"></td></tr>
+<tr id="row_57_"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><a class="el" href="pkstat.html" target="_self">pkstat</a></td><td class="desc"></td></tr>
+<tr id="row_58_" class="even"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><a class="el" href="pkstatascii.html" target="_self">pkstatascii</a></td><td class="desc"></td></tr>
+<tr id="row_59_"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><a class="el" href="pkstatogr.html" target="_self">pkstatogr</a></td><td class="desc"></td></tr>
+<tr id="row_60_" class="even"><td class="entry"><img src="ftv2lastnode.png" alt="\" width="16" height="22" /><a class="el" href="pksvm.html" target="_self">pksvm</a></td><td class="desc"></td></tr>
 </table>
 </div><!-- directory -->
 </div><!-- contents -->
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Jun 23 2015 17:09:37 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/pkann.html b/doc/html/pkann.html
index e3b75fe..b62398a 100644
--- a/doc/html/pkann.html
+++ b/doc/html/pkann.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.3</span>
+    <span id="projectnumber">2.6.4</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -48,7 +48,7 @@
 <p><code> Usage: pkann -t training [-i input -o output] [-cv value] </code></p>
 <p><code></code></p>
 <p><code> Options: [-tln layer]* [-c name -r value]* [-of GDALformat|-f OGRformat] [-co NAME=VALUE]* [-ct filename] [-label attribute] [-prior value]* [-nn number]* [-m filename [-msknodata value]*] [-nodata value]</code></p>
-<p><code> Advanced options: [-b band] [-s band] [-e band] [-bal size]* [-min] [-bag value] [-bs value] [-comb rule] [-cb filename] [-prob filename] [-pim priorimage] [–offset value] [–scale value] [–connection 0|1] [-w weights]* [–learning rate] [–maxit number] </code></p>
+<p><code> Advanced options: [-b band] [-sband band -eband band]* [-bal size]* [-min] [-bag value] [-bs value] [-comb rule] [-cb filename] [-prob filename] [-pim priorimage] [–offset value] [–scale value] [–connection 0|1] [-w weights]* [–learning rate] [–maxit number] </code></p>
 <h1><a class="anchor" id="pkann_description"></a>
 Description</h1>
 <p>The utility pkann implements an artificial neural network (ANN) to solve a supervised classification problem. The implementation is based on the open source C++ library <a href="http://leenissen.dk/fann/wp/">fann</a>). Both raster and vector files are supported as input. The output will contain the classification result, either in raster or vector format, corresponding to the format of the input. A training sample must be provided as an OGR vector dataset that contains the class label [...]
@@ -74,13 +74,13 @@ Options</h1>
 <tr>
 <td>b </td><td>band </td><td>short </td><td></td><td>band index (starting from 0, either use band option or use start to end) </td></tr>
 <tr>
-<td>s </td><td>start </td><td>double </td><td>0 </td><td>start band sequence number </td></tr>
+<td>sband </td><td>startband </td><td>unsigned short </td><td></td><td>Start band sequence number </td></tr>
 <tr>
-<td>e </td><td>end </td><td>double </td><td>0 </td><td>end band sequence number (set to 0 to include bands) </td></tr>
+<td>eband </td><td>endband </td><td>unsigned short </td><td></td><td>End band sequence number </td></tr>
 <tr>
 <td></td><td>offset </td><td>double </td><td>0 </td><td>offset value for each spectral band input features: refl[band]=(DN[band]-offset[band])/scale[band] </td></tr>
 <tr>
-<td></td><td>scale </td><td>double </td><td>0 </td><td>scale value for each spectral band input features: refl=(DN[band]-offset[band])/scale<a href="use 0 if scale min and max in each band to -1.0 and 1.0">band</a> </td></tr>
+<td>scale </td><td>scale </td><td>double </td><td>0 </td><td>scale value for each spectral band input features: refl=(DN[band]-offset[band])/scale<a href="use 0 if scale min and max in each band to -1.0 and 1.0">band</a> </td></tr>
 <tr>
 <td>a </td><td>aggreg </td><td>unsigned short </td><td>1 </td><td>how to combine aggregated classifiers, see also rc option (1: sum rule, 2: max rule). </td></tr>
 <tr>
@@ -110,7 +110,7 @@ Options</h1>
 <tr>
 <td>cb </td><td>classbag </td><td>std::string </td><td></td><td>output for each individual bootstrap aggregation (default is blank) </td></tr>
 <tr>
-<td>m </td><td>mask </td><td>std::string </td><td></td><td>Use the first band of the specified file as a validity mask. Nodata values can be set with the option msknodata. </td></tr>
+<td>m </td><td>mask </td><td>std::string </td><td></td><td>Only classify within specified mask (vector or raster). For raster mask, set nodata values with the option msknodata. </td></tr>
 <tr>
 <td>msknodata </td><td>msknodata </td><td>short </td><td>0 </td><td>mask value(s) not to consider for classification (use negative values if only these values should be taken into account). Values will be taken over in classification image. Default is 0 </td></tr>
 <tr>
@@ -144,7 +144,7 @@ Usage: pkann -t training [-i input -o output] [-cv value]</li>
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Jun 23 2015 17:09:37 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/pkann_8cc_source.html b/doc/html/pkann_8cc_source.html
index c37ad08..5361980 100644
--- a/doc/html/pkann_8cc_source.html
+++ b/doc/html/pkann_8cc_source.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.3</span>
+    <span id="projectnumber">2.6.4</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -100,11 +100,11 @@
 <div class="line"><a name="l00119"></a><span class="lineno">  119</span>   <a class="code" href="classOptionpk.html">Optionpk<unsigned int></a> balance_opt(<span class="stringliteral">"bal"</span>, <span class="stringliteral">"balance"</span>, <span class="stringliteral">"balance the input data to this number of samples for each class"</span>, 0);</div>
 <div class="line"><a name="l00120"></a><span class="lineno">  120</span>   <a class="code" href="classOptionpk.html">Optionpk<bool></a> random_opt(<span class="stringliteral">"random"</span>, <span class="stringliteral">"random"</span>, <span class="stringliteral">"in case of balance, randomize input data"</span>, <span class="keyword">true</span>,2);</div>
 <div class="line"><a name="l00121"></a><span class="lineno">  121</span>   <a class="code" href="classOptionpk.html">Optionpk<int></a> minSize_opt(<span class="stringliteral">"min"</span>, <span class="stringliteral">"min"</span>, <span class="stringliteral">"if number of training pixels is less then min, do not take this class into account (0: consider all classes)"</span>, 0);</div>
-<div class="line"><a name="l00122"></a><span class="lineno">  122</span>   <a class="code" href="classOptionpk.html">Optionpk<short></a> band_opt(<span class="stringliteral">"b"</span>, <span class="stringliteral">"band"</span>, <span class="stringliteral">"band index (starting from 0, either use band option or use start to end)"</span>);</div>
-<div class="line"><a name="l00123"></a><span class="lineno">  123</span>   <a class="code" href="classOptionpk.html">Optionpk<double></a> bstart_opt(<span class="stringliteral">"s"</span>, <span class="stringliteral">"start"</span>, <span class="stringliteral">"start band sequence number"</span>,0); </div>
-<div class="line"><a name="l00124"></a><span class="lineno">  124</span>   <a class="code" href="classOptionpk.html">Optionpk<double></a> bend_opt(<span class="stringliteral">"e"</span>, <span class="stringliteral">"end"</span>, <span class="stringliteral">"end band sequence number (set to 0 to include bands)"</span>, 0); </div>
-<div class="line"><a name="l00125"></a><span class="lineno">  125</span>   <a class="code" href="classOptionpk.html">Optionpk<double></a> offset_opt(<span class="stringliteral">"\0"</span>, <span class="stringliteral">"offset"</span>, <span class="stringliteral">"offset value for each spectral band input features: refl[band]=(DN[band]-offset[band])/scale[band]"</span>, 0.0);</div>
-<div class="line"><a name="l00126"></a><span class="lineno">  126</span>   <a class="code" href="classOptionpk.html">Optionpk<double></a> scale_opt(<span class="stringliteral">"\0"</span>, <span class="stringliteral">"scale"</span>, <span class="stringliteral">"scale value for each spectral band input features: refl=(DN[band]-offset[band])/scale[band] (use 0 if scale min and max in each band to -1.0 and 1.0)"</span>, 0.0);</div>
+<div class="line"><a name="l00122"></a><span class="lineno">  122</span>   <a class="code" href="classOptionpk.html">Optionpk<unsigned short></a> band_opt(<span class="stringliteral">"b"</span>, <span class="stringliteral">"band"</span>, <span class="stringliteral">"band index (starting from 0, either use band option or use start to end)"</span>);</div>
+<div class="line"><a name="l00123"></a><span class="lineno">  123</span>   <a class="code" href="classOptionpk.html">Optionpk<unsigned short></a> bstart_opt(<span class="stringliteral">"sband"</span>, <span class="stringliteral">"startband"</span>, <span class="stringliteral">"Start band sequence number"</span>); </div>
+<div class="line"><a name="l00124"></a><span class="lineno">  124</span>   <a class="code" href="classOptionpk.html">Optionpk<unsigned short></a> bend_opt(<span class="stringliteral">"eband"</span>, <span class="stringliteral">"endband"</span>, <span class="stringliteral">"End band sequence number"</span>); </div>
+<div class="line"><a name="l00125"></a><span class="lineno">  125</span>   <a class="code" href="classOptionpk.html">Optionpk<double></a> offset_opt(<span class="stringliteral">"offset"</span>, <span class="stringliteral">"offset"</span>, <span class="stringliteral">"offset value for each spectral band input features: refl[band]=(DN[band]-offset[band])/scale[band]"</span>, 0.0);</div>
+<div class="line"><a name="l00126"></a><span class="lineno">  126</span>   <a class="code" href="classOptionpk.html">Optionpk<double></a> scale_opt(<span class="stringliteral">"scale"</span>, <span class="stringliteral">"scale"</span>, <span class="stringliteral">"scale value for each spectral band input features: refl=(DN[band]-offset[band])/scale[band] (use 0 if scale min and max in each band to -1.0 and 1.0)"</span>, 0.0);</div>
 <div class="line"><a name="l00127"></a><span class="lineno">  127</span>   <a class="code" href="classOptionpk.html">Optionpk<unsigned short></a> aggreg_opt(<span class="stringliteral">"a"</span>, <span class="stringliteral">"aggreg"</span>, <span class="stringliteral">"how to combine aggregated classifiers, see also rc option (1: sum rule, 2: max rule)."</span>,1);</div>
 <div class="line"><a name="l00128"></a><span class="lineno">  128</span>   <a class="code" href="classOptionpk.html">Optionpk<double></a> priors_opt(<span class="stringliteral">"prior"</span>, <span class="stringliteral">"prior"</span>, <span class="stringliteral">"prior probabilities for each class (e.g., -p 0.3 -p 0.3 -p 0.2 )"</span>, 0.0); </div>
 <div class="line"><a name="l00129"></a><span class="lineno">  129</span>   <a class="code" href="classOptionpk.html">Optionpk<string></a> priorimg_opt(<span class="stringliteral">"pim"</span>, <span class="stringliteral">"priorimg"</span>, <span class="stringliteral">"prior probability image (multi-band img with band for each class"</span>,<span class="stringliteral">""</span>,2); </div>
@@ -119,7 +119,7 @@
 <div class="line"><a name="l00138"></a><span class="lineno">  138</span>   <a class="code" href="classOptionpk.html">Optionpk<unsigned short></a> bag_opt(<span class="stringliteral">"bag"</span>, <span class="stringliteral">"bag"</span>, <span class="stringliteral">"Number of bootstrap aggregations (default is no bagging: 1)"</span>, 1);</div>
 <div class="line"><a name="l00139"></a><span class="lineno">  139</span>   <a class="code" href="classOptionpk.html">Optionpk<int></a> bagSize_opt(<span class="stringliteral">"bs"</span>, <span class="stringliteral">"bsize"</span>, <span class="stringliteral">"Percentage of features used from available training features for each bootstrap aggregation (one size for all classes, or a different size for each class respectively"</span>, 100);</div>
 <div class="line"><a name="l00140"></a><span class="lineno">  140</span>   <a class="code" href="classOptionpk.html">Optionpk<string></a> classBag_opt(<span class="stringliteral">"cb"</span>, <span class="stringliteral">"classbag"</span>, <span class="stringliteral">"output for each individual bootstrap aggregation (default is blank)"</span>); </div>
-<div class="line"><a name="l00141"></a><span class="lineno">  141</span>   <a class="code" href="classOptionpk.html">Optionpk<string></a> mask_opt(<span class="stringliteral">"m"</span>, <span class="stringliteral">"mask"</span>, <span class="stringliteral">"Use the first band of the specified file as a validity mask. Nodata values can be set with the option msknodata."</span>);</div>
+<div class="line"><a name="l00141"></a><span class="lineno">  141</span>   <a class="code" href="classOptionpk.html">Optionpk<string></a> mask_opt(<span class="stringliteral">"m"</span>, <span class="stringliteral">"mask"</span>, <span class="stringliteral">"Only classify within specified mask (vector or raster). For raster mask, set nodata values with the option msknodata."</span>);</div>
 <div class="line"><a name="l00142"></a><span class="lineno">  142</span>   <a class="code" href="classOptionpk.html">Optionpk<short></a> msknodata_opt(<span class="stringliteral">"msknodata"</span>, <span class="stringliteral">"msknodata"</span>, <span class="stringliteral">"mask value(s) not to consider for classification (use negative values if only these values should be taken into account). Values will be taken over in classification image. Default [...]
 <div class="line"><a name="l00143"></a><span class="lineno">  143</span>   <a class="code" href="classOptionpk.html">Optionpk<unsigned short></a> nodata_opt(<span class="stringliteral">"nodata"</span>, <span class="stringliteral">"nodata"</span>, <span class="stringliteral">"nodata value to put where image is masked as nodata"</span>, 0);</div>
 <div class="line"><a name="l00144"></a><span class="lineno">  144</span>   <a class="code" href="classOptionpk.html">Optionpk<string></a> output_opt(<span class="stringliteral">"o"</span>, <span class="stringliteral">"output"</span>, <span class="stringliteral">"output classification image"</span>); </div>
@@ -156,1096 +156,1181 @@
 <div class="line"><a name="l00175"></a><span class="lineno">  175</span>   maxit_opt.setHide(1);</div>
 <div class="line"><a name="l00176"></a><span class="lineno">  176</span>   learning_opt.setHide(1);</div>
 <div class="line"><a name="l00177"></a><span class="lineno">  177</span> </div>
-<div class="line"><a name="l00178"></a><span class="lineno">  178</span>   <span class="keywordtype">bool</span> doProcess;<span class="comment">//stop process when program was invoked with help option (-h --help)</span></div>
-<div class="line"><a name="l00179"></a><span class="lineno">  179</span>   <span class="keywordflow">try</span>{</div>
-<div class="line"><a name="l00180"></a><span class="lineno">  180</span>     doProcess=input_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00181"></a><span class="lineno">  181</span>     training_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00182"></a><span class="lineno">  182</span>     tlayer_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00183"></a><span class="lineno">  183</span>     label_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00184"></a><span class="lineno">  184</span>     balance_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00185"></a><span class="lineno">  185</span>     random_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00186"></a><span class="lineno">  186</span>     minSize_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00187"></a><span class="lineno">  187</span>     band_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00188"></a><span class="lineno">  188</span>     bstart_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00189"></a><span class="lineno">  189</span>     bend_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00190"></a><span class="lineno">  190</span>     offset_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00191"></a><span class="lineno">  191</span>     scale_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00192"></a><span class="lineno">  192</span>     aggreg_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00193"></a><span class="lineno">  193</span>     priors_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00194"></a><span class="lineno">  194</span>     priorimg_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00195"></a><span class="lineno">  195</span>     cv_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00196"></a><span class="lineno">  196</span>     cmformat_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00197"></a><span class="lineno">  197</span>     nneuron_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00198"></a><span class="lineno">  198</span>     connection_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00199"></a><span class="lineno">  199</span>     weights_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00200"></a><span class="lineno">  200</span>     learning_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00201"></a><span class="lineno">  201</span>     maxit_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00202"></a><span class="lineno">  202</span>     comb_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00203"></a><span class="lineno">  203</span>     bag_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00204"></a><span class="lineno">  204</span>     bagSize_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00205"></a><span class="lineno">  205</span>     classBag_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00206"></a><span class="lineno">  206</span>     mask_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00207"></a><span class="lineno">  207</span>     msknodata_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00208"></a><span class="lineno">  208</span>     nodata_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00209"></a><span class="lineno">  209</span>     output_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00210"></a><span class="lineno">  210</span>     otype_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00211"></a><span class="lineno">  211</span>     oformat_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00212"></a><span class="lineno">  212</span>     colorTable_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00213"></a><span class="lineno">  213</span>     option_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00214"></a><span class="lineno">  214</span>     prob_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00215"></a><span class="lineno">  215</span>     entropy_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00216"></a><span class="lineno">  216</span>     active_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00217"></a><span class="lineno">  217</span>     ogrformat_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00218"></a><span class="lineno">  218</span>     nactive_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00219"></a><span class="lineno">  219</span>     classname_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00220"></a><span class="lineno">  220</span>     classvalue_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00221"></a><span class="lineno">  221</span>     verbose_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00222"></a><span class="lineno">  222</span>   }</div>
-<div class="line"><a name="l00223"></a><span class="lineno">  223</span>   <span class="keywordflow">catch</span>(<span class="keywordtype">string</span> predefinedString){</div>
-<div class="line"><a name="l00224"></a><span class="lineno">  224</span>     std::cout << predefinedString << std::endl;</div>
-<div class="line"><a name="l00225"></a><span class="lineno">  225</span>     exit(0);</div>
-<div class="line"><a name="l00226"></a><span class="lineno">  226</span>   }</div>
-<div class="line"><a name="l00227"></a><span class="lineno">  227</span>   <span class="keywordflow">if</span>(!doProcess){</div>
-<div class="line"><a name="l00228"></a><span class="lineno">  228</span>     cout << endl;</div>
-<div class="line"><a name="l00229"></a><span class="lineno">  229</span>     cout << <span class="stringliteral">"Usage: pkann -t training [-i input -o output] [-cv value]"</span> << endl;</div>
+<div class="line"><a name="l00178"></a><span class="lineno">  178</span>   verbose_opt.setHide(2);</div>
+<div class="line"><a name="l00179"></a><span class="lineno">  179</span> </div>
+<div class="line"><a name="l00180"></a><span class="lineno">  180</span>   <span class="keywordtype">bool</span> doProcess;<span class="comment">//stop process when program was invoked with help option (-h --help)</span></div>
+<div class="line"><a name="l00181"></a><span class="lineno">  181</span>   <span class="keywordflow">try</span>{</div>
+<div class="line"><a name="l00182"></a><span class="lineno">  182</span>     doProcess=input_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00183"></a><span class="lineno">  183</span>     training_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00184"></a><span class="lineno">  184</span>     tlayer_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00185"></a><span class="lineno">  185</span>     label_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00186"></a><span class="lineno">  186</span>     balance_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00187"></a><span class="lineno">  187</span>     random_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00188"></a><span class="lineno">  188</span>     minSize_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00189"></a><span class="lineno">  189</span>     band_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00190"></a><span class="lineno">  190</span>     bstart_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00191"></a><span class="lineno">  191</span>     bend_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00192"></a><span class="lineno">  192</span>     offset_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00193"></a><span class="lineno">  193</span>     scale_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00194"></a><span class="lineno">  194</span>     aggreg_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00195"></a><span class="lineno">  195</span>     priors_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00196"></a><span class="lineno">  196</span>     priorimg_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00197"></a><span class="lineno">  197</span>     cv_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00198"></a><span class="lineno">  198</span>     cmformat_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00199"></a><span class="lineno">  199</span>     nneuron_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00200"></a><span class="lineno">  200</span>     connection_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00201"></a><span class="lineno">  201</span>     weights_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00202"></a><span class="lineno">  202</span>     learning_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00203"></a><span class="lineno">  203</span>     maxit_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00204"></a><span class="lineno">  204</span>     comb_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00205"></a><span class="lineno">  205</span>     bag_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00206"></a><span class="lineno">  206</span>     bagSize_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00207"></a><span class="lineno">  207</span>     classBag_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00208"></a><span class="lineno">  208</span>     mask_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00209"></a><span class="lineno">  209</span>     msknodata_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00210"></a><span class="lineno">  210</span>     nodata_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00211"></a><span class="lineno">  211</span>     output_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00212"></a><span class="lineno">  212</span>     otype_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00213"></a><span class="lineno">  213</span>     oformat_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00214"></a><span class="lineno">  214</span>     colorTable_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00215"></a><span class="lineno">  215</span>     option_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00216"></a><span class="lineno">  216</span>     prob_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00217"></a><span class="lineno">  217</span>     entropy_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00218"></a><span class="lineno">  218</span>     active_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00219"></a><span class="lineno">  219</span>     ogrformat_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00220"></a><span class="lineno">  220</span>     nactive_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00221"></a><span class="lineno">  221</span>     classname_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00222"></a><span class="lineno">  222</span>     classvalue_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00223"></a><span class="lineno">  223</span>     verbose_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00224"></a><span class="lineno">  224</span>   }</div>
+<div class="line"><a name="l00225"></a><span class="lineno">  225</span>   <span class="keywordflow">catch</span>(<span class="keywordtype">string</span> predefinedString){</div>
+<div class="line"><a name="l00226"></a><span class="lineno">  226</span>     std::cout << predefinedString << std::endl;</div>
+<div class="line"><a name="l00227"></a><span class="lineno">  227</span>     exit(0);</div>
+<div class="line"><a name="l00228"></a><span class="lineno">  228</span>   }</div>
+<div class="line"><a name="l00229"></a><span class="lineno">  229</span>   <span class="keywordflow">if</span>(!doProcess){</div>
 <div class="line"><a name="l00230"></a><span class="lineno">  230</span>     cout << endl;</div>
-<div class="line"><a name="l00231"></a><span class="lineno">  231</span>     cout << <span class="stringliteral">"short option -h shows basic options only, use long option --help to show all options"</span> << endl;</div>
-<div class="line"><a name="l00232"></a><span class="lineno">  232</span>     exit(0);<span class="comment">//help was invoked, stop processing</span></div>
-<div class="line"><a name="l00233"></a><span class="lineno">  233</span>   }</div>
-<div class="line"><a name="l00234"></a><span class="lineno">  234</span> </div>
-<div class="line"><a name="l00235"></a><span class="lineno">  235</span>   <span class="keywordflow">if</span>(entropy_opt[0]==<span class="stringliteral">""</span>)</div>
-<div class="line"><a name="l00236"></a><span class="lineno">  236</span>     entropy_opt.clear();</div>
-<div class="line"><a name="l00237"></a><span class="lineno">  237</span>   <span class="keywordflow">if</span>(active_opt[0]==<span class="stringliteral">""</span>)</div>
-<div class="line"><a name="l00238"></a><span class="lineno">  238</span>     active_opt.clear();</div>
-<div class="line"><a name="l00239"></a><span class="lineno">  239</span>   <span class="keywordflow">if</span>(priorimg_opt[0]==<span class="stringliteral">""</span>)</div>
-<div class="line"><a name="l00240"></a><span class="lineno">  240</span>     priorimg_opt.clear();</div>
-<div class="line"><a name="l00241"></a><span class="lineno">  241</span> </div>
-<div class="line"><a name="l00242"></a><span class="lineno">  242</span>   <span class="keywordflow">if</span>(verbose_opt[0]>=1){</div>
-<div class="line"><a name="l00243"></a><span class="lineno">  243</span>     <span class="keywordflow">if</span>(input_opt.size())</div>
-<div class="line"><a name="l00244"></a><span class="lineno">  244</span>       cout << <span class="stringliteral">"image filename: "</span> << input_opt[0] << endl;</div>
-<div class="line"><a name="l00245"></a><span class="lineno">  245</span>     <span class="keywordflow">if</span>(mask_opt.size())</div>
-<div class="line"><a name="l00246"></a><span class="lineno">  246</span>       cout << <span class="stringliteral">"mask filename: "</span> << mask_opt[0] << endl;</div>
-<div class="line"><a name="l00247"></a><span class="lineno">  247</span>     <span class="keywordflow">if</span>(training_opt.size()){</div>
-<div class="line"><a name="l00248"></a><span class="lineno">  248</span>       cout << <span class="stringliteral">"training vector file: "</span> << endl;</div>
-<div class="line"><a name="l00249"></a><span class="lineno">  249</span>       <span class="keywordflow">for</span>(<span class="keywordtype">int</span> ifile=0;ifile<training_opt.size();++ifile)</div>
-<div class="line"><a name="l00250"></a><span class="lineno">  250</span>         cout << training_opt[ifile] << endl;</div>
-<div class="line"><a name="l00251"></a><span class="lineno">  251</span>     }</div>
-<div class="line"><a name="l00252"></a><span class="lineno">  252</span>     <span class="keywordflow">else</span></div>
-<div class="line"><a name="l00253"></a><span class="lineno">  253</span>       cerr << <span class="stringliteral">"no training file set!"</span> << endl;</div>
-<div class="line"><a name="l00254"></a><span class="lineno">  254</span>     cout << <span class="stringliteral">"verbose: "</span> << verbose_opt[0] << endl;</div>
-<div class="line"><a name="l00255"></a><span class="lineno">  255</span>   }</div>
-<div class="line"><a name="l00256"></a><span class="lineno">  256</span>   <span class="keywordtype">unsigned</span> <span class="keywordtype">short</span> nbag=(training_opt.size()>1)?training_opt.size():bag_opt[0];</div>
-<div class="line"><a name="l00257"></a><span class="lineno">  257</span>   <span class="keywordflow">if</span>(verbose_opt[0]>=1)</div>
-<div class="line"><a name="l00258"></a><span class="lineno">  258</span>     cout << <span class="stringliteral">"number of bootstrap aggregations: "</span> << nbag << endl;</div>
-<div class="line"><a name="l00259"></a><span class="lineno">  259</span>   </div>
-<div class="line"><a name="l00260"></a><span class="lineno">  260</span>   <a class="code" href="classImgWriterOgr.html">ImgWriterOgr</a> activeWriter;</div>
-<div class="line"><a name="l00261"></a><span class="lineno">  261</span>   <span class="keywordflow">if</span>(active_opt.size()){</div>
-<div class="line"><a name="l00262"></a><span class="lineno">  262</span>     <a class="code" href="classImgReaderOgr.html">ImgReaderOgr</a> trainingReader(training_opt[0]);</div>
-<div class="line"><a name="l00263"></a><span class="lineno">  263</span>     activeWriter.open(active_opt[0],ogrformat_opt[0]);</div>
-<div class="line"><a name="l00264"></a><span class="lineno">  264</span>     activeWriter.createLayer(active_opt[0],trainingReader.getProjection(),wkbPoint,NULL);</div>
-<div class="line"><a name="l00265"></a><span class="lineno">  265</span>     activeWriter.copyFields(trainingReader);</div>
-<div class="line"><a name="l00266"></a><span class="lineno">  266</span>   }</div>
-<div class="line"><a name="l00267"></a><span class="lineno">  267</span>   vector<PosValue> activePoints(nactive_opt[0]);</div>
-<div class="line"><a name="l00268"></a><span class="lineno">  268</span>   <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iactive=0;iactive<activePoints.size();++iactive){</div>
-<div class="line"><a name="l00269"></a><span class="lineno">  269</span>     activePoints[iactive].value=1.0;</div>
-<div class="line"><a name="l00270"></a><span class="lineno">  270</span>     activePoints[iactive].posx=0.0;</div>
-<div class="line"><a name="l00271"></a><span class="lineno">  271</span>     activePoints[iactive].posy=0.0;</div>
-<div class="line"><a name="l00272"></a><span class="lineno">  272</span>   }</div>
-<div class="line"><a name="l00273"></a><span class="lineno">  273</span> </div>
-<div class="line"><a name="l00274"></a><span class="lineno">  274</span>   <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> totalSamples=0;</div>
-<div class="line"><a name="l00275"></a><span class="lineno">  275</span>   <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> nactive=0;</div>
-<div class="line"><a name="l00276"></a><span class="lineno">  276</span>   vector<FANN::neural_net> net(nbag);<span class="comment">//the neural network</span></div>
-<div class="line"><a name="l00277"></a><span class="lineno">  277</span> </div>
-<div class="line"><a name="l00278"></a><span class="lineno">  278</span>   <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> nclass=0;</div>
-<div class="line"><a name="l00279"></a><span class="lineno">  279</span>   <span class="keywordtype">int</span> nband=0;</div>
-<div class="line"><a name="l00280"></a><span class="lineno">  280</span>   <span class="keywordtype">int</span> startBand=2;<span class="comment">//first two bands represent X and Y pos</span></div>
-<div class="line"><a name="l00281"></a><span class="lineno">  281</span> </div>
-<div class="line"><a name="l00282"></a><span class="lineno">  282</span>   <span class="keywordflow">if</span>(priors_opt.size()>1){<span class="comment">//priors from argument list</span></div>
-<div class="line"><a name="l00283"></a><span class="lineno">  283</span>     priors.resize(priors_opt.size());</div>
-<div class="line"><a name="l00284"></a><span class="lineno">  284</span>     <span class="keywordtype">double</span> normPrior=0;</div>
-<div class="line"><a name="l00285"></a><span class="lineno">  285</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iclass=0;iclass<priors_opt.size();++iclass){</div>
-<div class="line"><a name="l00286"></a><span class="lineno">  286</span>       priors[iclass]=priors_opt[iclass];</div>
-<div class="line"><a name="l00287"></a><span class="lineno">  287</span>       normPrior+=priors[iclass];</div>
-<div class="line"><a name="l00288"></a><span class="lineno">  288</span>     }</div>
-<div class="line"><a name="l00289"></a><span class="lineno">  289</span>     <span class="comment">//normalize</span></div>
-<div class="line"><a name="l00290"></a><span class="lineno">  290</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iclass=0;iclass<priors_opt.size();++iclass)</div>
-<div class="line"><a name="l00291"></a><span class="lineno">  291</span>       priors[iclass]/=normPrior;</div>
+<div class="line"><a name="l00231"></a><span class="lineno">  231</span>     cout << <span class="stringliteral">"Usage: pkann -t training [-i input -o output] [-cv value]"</span> << endl;</div>
+<div class="line"><a name="l00232"></a><span class="lineno">  232</span>     cout << endl;</div>
+<div class="line"><a name="l00233"></a><span class="lineno">  233</span>     cout << <span class="stringliteral">"short option -h shows basic options only, use long option --help to show all options"</span> << endl;</div>
+<div class="line"><a name="l00234"></a><span class="lineno">  234</span>     exit(0);<span class="comment">//help was invoked, stop processing</span></div>
+<div class="line"><a name="l00235"></a><span class="lineno">  235</span>   }</div>
+<div class="line"><a name="l00236"></a><span class="lineno">  236</span> </div>
+<div class="line"><a name="l00237"></a><span class="lineno">  237</span>   <span class="keywordflow">if</span>(entropy_opt[0]==<span class="stringliteral">""</span>)</div>
+<div class="line"><a name="l00238"></a><span class="lineno">  238</span>     entropy_opt.clear();</div>
+<div class="line"><a name="l00239"></a><span class="lineno">  239</span>   <span class="keywordflow">if</span>(active_opt[0]==<span class="stringliteral">""</span>)</div>
+<div class="line"><a name="l00240"></a><span class="lineno">  240</span>     active_opt.clear();</div>
+<div class="line"><a name="l00241"></a><span class="lineno">  241</span>   <span class="keywordflow">if</span>(priorimg_opt[0]==<span class="stringliteral">""</span>)</div>
+<div class="line"><a name="l00242"></a><span class="lineno">  242</span>     priorimg_opt.clear();</div>
+<div class="line"><a name="l00243"></a><span class="lineno">  243</span> </div>
+<div class="line"><a name="l00244"></a><span class="lineno">  244</span>   <span class="keywordflow">if</span>(verbose_opt[0]>=1){</div>
+<div class="line"><a name="l00245"></a><span class="lineno">  245</span>     <span class="keywordflow">if</span>(input_opt.size())</div>
+<div class="line"><a name="l00246"></a><span class="lineno">  246</span>       cout << <span class="stringliteral">"image filename: "</span> << input_opt[0] << endl;</div>
+<div class="line"><a name="l00247"></a><span class="lineno">  247</span>     <span class="keywordflow">if</span>(mask_opt.size())</div>
+<div class="line"><a name="l00248"></a><span class="lineno">  248</span>       cout << <span class="stringliteral">"mask filename: "</span> << mask_opt[0] << endl;</div>
+<div class="line"><a name="l00249"></a><span class="lineno">  249</span>     <span class="keywordflow">if</span>(training_opt.size()){</div>
+<div class="line"><a name="l00250"></a><span class="lineno">  250</span>       cout << <span class="stringliteral">"training vector file: "</span> << endl;</div>
+<div class="line"><a name="l00251"></a><span class="lineno">  251</span>       <span class="keywordflow">for</span>(<span class="keywordtype">int</span> ifile=0;ifile<training_opt.size();++ifile)</div>
+<div class="line"><a name="l00252"></a><span class="lineno">  252</span>         cout << training_opt[ifile] << endl;</div>
+<div class="line"><a name="l00253"></a><span class="lineno">  253</span>     }</div>
+<div class="line"><a name="l00254"></a><span class="lineno">  254</span>     <span class="keywordflow">else</span></div>
+<div class="line"><a name="l00255"></a><span class="lineno">  255</span>       cerr << <span class="stringliteral">"no training file set!"</span> << endl;</div>
+<div class="line"><a name="l00256"></a><span class="lineno">  256</span>     cout << <span class="stringliteral">"verbose: "</span> << verbose_opt[0] << endl;</div>
+<div class="line"><a name="l00257"></a><span class="lineno">  257</span>   }</div>
+<div class="line"><a name="l00258"></a><span class="lineno">  258</span>   <span class="keywordtype">unsigned</span> <span class="keywordtype">short</span> nbag=(training_opt.size()>1)?training_opt.size():bag_opt[0];</div>
+<div class="line"><a name="l00259"></a><span class="lineno">  259</span>   <span class="keywordflow">if</span>(verbose_opt[0]>=1)</div>
+<div class="line"><a name="l00260"></a><span class="lineno">  260</span>     cout << <span class="stringliteral">"number of bootstrap aggregations: "</span> << nbag << endl;</div>
+<div class="line"><a name="l00261"></a><span class="lineno">  261</span>   </div>
+<div class="line"><a name="l00262"></a><span class="lineno">  262</span>   <a class="code" href="classImgReaderOgr.html">ImgReaderOgr</a> extentReader;</div>
+<div class="line"><a name="l00263"></a><span class="lineno">  263</span>   OGRLayer  *readLayer;</div>
+<div class="line"><a name="l00264"></a><span class="lineno">  264</span> </div>
+<div class="line"><a name="l00265"></a><span class="lineno">  265</span>   <span class="keywordtype">double</span> ulx=0;</div>
+<div class="line"><a name="l00266"></a><span class="lineno">  266</span>   <span class="keywordtype">double</span> uly=0;</div>
+<div class="line"><a name="l00267"></a><span class="lineno">  267</span>   <span class="keywordtype">double</span> lrx=0;</div>
+<div class="line"><a name="l00268"></a><span class="lineno">  268</span>   <span class="keywordtype">double</span> lry=0;</div>
+<div class="line"><a name="l00269"></a><span class="lineno">  269</span> </div>
+<div class="line"><a name="l00270"></a><span class="lineno">  270</span>   <span class="keywordtype">bool</span> maskIsVector=<span class="keyword">false</span>;</div>
+<div class="line"><a name="l00271"></a><span class="lineno">  271</span>   <span class="keywordflow">if</span>(mask_opt.size()){</div>
+<div class="line"><a name="l00272"></a><span class="lineno">  272</span>     <span class="keywordflow">try</span>{</div>
+<div class="line"><a name="l00273"></a><span class="lineno">  273</span>       extentReader.open(mask_opt[0]);</div>
+<div class="line"><a name="l00274"></a><span class="lineno">  274</span>       maskIsVector=<span class="keyword">true</span>;</div>
+<div class="line"><a name="l00275"></a><span class="lineno">  275</span>       readLayer = extentReader.getDataSource()->GetLayer(0);</div>
+<div class="line"><a name="l00276"></a><span class="lineno">  276</span>       <span class="keywordflow">if</span>(!(extentReader.getExtent(ulx,uly,lrx,lry))){</div>
+<div class="line"><a name="l00277"></a><span class="lineno">  277</span>     cerr << <span class="stringliteral">"Error: could not get extent from "</span> << mask_opt[0] << endl;</div>
+<div class="line"><a name="l00278"></a><span class="lineno">  278</span>     exit(1);</div>
+<div class="line"><a name="l00279"></a><span class="lineno">  279</span>       }</div>
+<div class="line"><a name="l00280"></a><span class="lineno">  280</span>     }</div>
+<div class="line"><a name="l00281"></a><span class="lineno">  281</span>     <span class="keywordflow">catch</span>(<span class="keywordtype">string</span> errorString){</div>
+<div class="line"><a name="l00282"></a><span class="lineno">  282</span>       maskIsVector=<span class="keyword">false</span>;</div>
+<div class="line"><a name="l00283"></a><span class="lineno">  283</span>     }</div>
+<div class="line"><a name="l00284"></a><span class="lineno">  284</span>   }</div>
+<div class="line"><a name="l00285"></a><span class="lineno">  285</span> </div>
+<div class="line"><a name="l00286"></a><span class="lineno">  286</span>   <a class="code" href="classImgWriterOgr.html">ImgWriterOgr</a> activeWriter;</div>
+<div class="line"><a name="l00287"></a><span class="lineno">  287</span>   <span class="keywordflow">if</span>(active_opt.size()){</div>
+<div class="line"><a name="l00288"></a><span class="lineno">  288</span>     <a class="code" href="classImgReaderOgr.html">ImgReaderOgr</a> trainingReader(training_opt[0]);</div>
+<div class="line"><a name="l00289"></a><span class="lineno">  289</span>     activeWriter.open(active_opt[0],ogrformat_opt[0]);</div>
+<div class="line"><a name="l00290"></a><span class="lineno">  290</span>     activeWriter.createLayer(active_opt[0],trainingReader.getProjection(),wkbPoint,NULL);</div>
+<div class="line"><a name="l00291"></a><span class="lineno">  291</span>     activeWriter.copyFields(trainingReader);</div>
 <div class="line"><a name="l00292"></a><span class="lineno">  292</span>   }</div>
-<div class="line"><a name="l00293"></a><span class="lineno">  293</span> </div>
-<div class="line"><a name="l00294"></a><span class="lineno">  294</span>   <span class="comment">//sort bands</span></div>
-<div class="line"><a name="l00295"></a><span class="lineno">  295</span>   <span class="keywordflow">if</span>(band_opt.size())</div>
-<div class="line"><a name="l00296"></a><span class="lineno">  296</span>     std::sort(band_opt.begin(),band_opt.end());</div>
-<div class="line"><a name="l00297"></a><span class="lineno">  297</span> </div>
-<div class="line"><a name="l00298"></a><span class="lineno">  298</span>   map<string,short> classValueMap;</div>
-<div class="line"><a name="l00299"></a><span class="lineno">  299</span>   vector<std::string> nameVector;</div>
-<div class="line"><a name="l00300"></a><span class="lineno">  300</span>   <span class="keywordflow">if</span>(classname_opt.size()){</div>
-<div class="line"><a name="l00301"></a><span class="lineno">  301</span>     assert(classname_opt.size()==classvalue_opt.size());</div>
-<div class="line"><a name="l00302"></a><span class="lineno">  302</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iclass=0;iclass<classname_opt.size();++iclass)</div>
-<div class="line"><a name="l00303"></a><span class="lineno">  303</span>       classValueMap[classname_opt[iclass]]=classvalue_opt[iclass];</div>
-<div class="line"><a name="l00304"></a><span class="lineno">  304</span>   }</div>
-<div class="line"><a name="l00305"></a><span class="lineno">  305</span>   <span class="comment">//----------------------------------- Training -------------------------------</span></div>
-<div class="line"><a name="l00306"></a><span class="lineno">  306</span>   <a class="code" href="classconfusionmatrix_1_1ConfusionMatrix.html">confusionmatrix::ConfusionMatrix</a> cm;</div>
-<div class="line"><a name="l00307"></a><span class="lineno">  307</span>   vector< vector<double> > offset(nbag);</div>
-<div class="line"><a name="l00308"></a><span class="lineno">  308</span>   vector< vector<double> > scale(nbag);</div>
-<div class="line"><a name="l00309"></a><span class="lineno">  309</span>   map<string,Vector2d<float> > trainingMap;</div>
-<div class="line"><a name="l00310"></a><span class="lineno">  310</span>   vector< Vector2d<float> > trainingPixels;<span class="comment">//[class][sample][band]</span></div>
-<div class="line"><a name="l00311"></a><span class="lineno">  311</span>   vector<string> fields;</div>
-<div class="line"><a name="l00312"></a><span class="lineno">  312</span>   <span class="keywordflow">for</span>(<span class="keywordtype">int</span> ibag=0;ibag<nbag;++ibag){</div>
-<div class="line"><a name="l00313"></a><span class="lineno">  313</span>     <span class="comment">//organize training data</span></div>
-<div class="line"><a name="l00314"></a><span class="lineno">  314</span>     <span class="keywordflow">if</span>(ibag<training_opt.size()){<span class="comment">//if bag contains new training pixels</span></div>
-<div class="line"><a name="l00315"></a><span class="lineno">  315</span>       trainingMap.clear();</div>
-<div class="line"><a name="l00316"></a><span class="lineno">  316</span>       trainingPixels.clear();</div>
-<div class="line"><a name="l00317"></a><span class="lineno">  317</span>       <span class="keywordflow">if</span>(verbose_opt[0]>=1)</div>
-<div class="line"><a name="l00318"></a><span class="lineno">  318</span>         cout << <span class="stringliteral">"reading imageVector file "</span> << training_opt[0] << endl;</div>
-<div class="line"><a name="l00319"></a><span class="lineno">  319</span>       <span class="keywordflow">try</span>{</div>
-<div class="line"><a name="l00320"></a><span class="lineno">  320</span>     <a class="code" href="classImgReaderOgr.html">ImgReaderOgr</a> trainingReaderBag(training_opt[ibag]);</div>
-<div class="line"><a name="l00321"></a><span class="lineno">  321</span>         <span class="keywordflow">if</span>(band_opt.size())</div>
-<div class="line"><a name="l00322"></a><span class="lineno">  322</span>           totalSamples=trainingReaderBag.readDataImageOgr(trainingMap,fields,band_opt,label_opt[0],tlayer_opt,verbose_opt[0]);</div>
-<div class="line"><a name="l00323"></a><span class="lineno">  323</span>         <span class="keywordflow">else</span></div>
-<div class="line"><a name="l00324"></a><span class="lineno">  324</span>           totalSamples=trainingReaderBag.readDataImageOgr(trainingMap,fields,bstart_opt[0],bend_opt[0],label_opt[0],tlayer_opt,verbose_opt[0]);</div>
-<div class="line"><a name="l00325"></a><span class="lineno">  325</span>         <span class="keywordflow">if</span>(trainingMap.size()<2){</div>
-<div class="line"><a name="l00326"></a><span class="lineno">  326</span>           <span class="keywordtype">string</span> errorstring=<span class="stringliteral">"Error: could not read at least two classes from training file, did you provide class labels in training sample (see option label)?"</span>;</div>
-<div class="line"><a name="l00327"></a><span class="lineno">  327</span>           <span class="keywordflow">throw</span>(errorstring);</div>
-<div class="line"><a name="l00328"></a><span class="lineno">  328</span>         }</div>
-<div class="line"><a name="l00329"></a><span class="lineno">  329</span>     trainingReaderBag.close();</div>
-<div class="line"><a name="l00330"></a><span class="lineno">  330</span>       }</div>
-<div class="line"><a name="l00331"></a><span class="lineno">  331</span>       <span class="keywordflow">catch</span>(<span class="keywordtype">string</span> error){</div>
-<div class="line"><a name="l00332"></a><span class="lineno">  332</span>         cerr << error << std::endl;</div>
-<div class="line"><a name="l00333"></a><span class="lineno">  333</span>         exit(1);</div>
-<div class="line"><a name="l00334"></a><span class="lineno">  334</span>       }</div>
-<div class="line"><a name="l00335"></a><span class="lineno">  335</span>       <span class="keywordflow">catch</span>(...){</div>
-<div class="line"><a name="l00336"></a><span class="lineno">  336</span>         cerr << <span class="stringliteral">"error catched"</span> << std::endl;</div>
-<div class="line"><a name="l00337"></a><span class="lineno">  337</span>         exit(1);</div>
-<div class="line"><a name="l00338"></a><span class="lineno">  338</span>       }</div>
-<div class="line"><a name="l00339"></a><span class="lineno">  339</span>       <span class="comment">//delete class 0 ?</span></div>
-<div class="line"><a name="l00340"></a><span class="lineno">  340</span>       <span class="comment">// if(verbose_opt[0]>=1)</span></div>
-<div class="line"><a name="l00341"></a><span class="lineno">  341</span>       <span class="comment">//   std::cout << "erasing class 0 from training set (" << trainingMap[0].size() << " from " << totalSamples << ") samples" << std::endl;</span></div>
-<div class="line"><a name="l00342"></a><span class="lineno">  342</span>       <span class="comment">// totalSamples-=trainingMap[0].size();</span></div>
-<div class="line"><a name="l00343"></a><span class="lineno">  343</span>       <span class="comment">// trainingMap.erase(0);</span></div>
-<div class="line"><a name="l00344"></a><span class="lineno">  344</span>       <span class="comment">//convert map to vector</span></div>
-<div class="line"><a name="l00345"></a><span class="lineno">  345</span>       <span class="keywordflow">if</span>(verbose_opt[0]>1)</div>
-<div class="line"><a name="l00346"></a><span class="lineno">  346</span>         std::cout << <span class="stringliteral">"training pixels: "</span> << std::endl;</div>
-<div class="line"><a name="l00347"></a><span class="lineno">  347</span>       map<string,Vector2d<float> >::iterator mapit=trainingMap.begin();</div>
-<div class="line"><a name="l00348"></a><span class="lineno">  348</span>       <span class="keywordflow">while</span>(mapit!=trainingMap.end()){</div>
-<div class="line"><a name="l00349"></a><span class="lineno">  349</span>         <span class="comment">//delete small classes</span></div>
-<div class="line"><a name="l00350"></a><span class="lineno">  350</span>         <span class="keywordflow">if</span>((mapit->second).size()<minSize_opt[0]){</div>
-<div class="line"><a name="l00351"></a><span class="lineno">  351</span>           trainingMap.erase(mapit);</div>
-<div class="line"><a name="l00352"></a><span class="lineno">  352</span>           <span class="keywordflow">continue</span>;</div>
-<div class="line"><a name="l00353"></a><span class="lineno">  353</span>         }</div>
-<div class="line"><a name="l00354"></a><span class="lineno">  354</span>         trainingPixels.push_back(mapit->second);</div>
-<div class="line"><a name="l00355"></a><span class="lineno">  355</span>         <span class="keywordflow">if</span>(verbose_opt[0]>1)</div>
-<div class="line"><a name="l00356"></a><span class="lineno">  356</span>           std::cout << mapit->first << <span class="stringliteral">": "</span> << (mapit->second).size() << <span class="stringliteral">" samples"</span> << std::endl;</div>
-<div class="line"><a name="l00357"></a><span class="lineno">  357</span>         ++mapit;</div>
-<div class="line"><a name="l00358"></a><span class="lineno">  358</span>         }</div>
-<div class="line"><a name="l00359"></a><span class="lineno">  359</span>       <span class="keywordflow">if</span>(!ibag){</div>
-<div class="line"><a name="l00360"></a><span class="lineno">  360</span>         nclass=trainingPixels.size();</div>
-<div class="line"><a name="l00361"></a><span class="lineno">  361</span>     <span class="keywordflow">if</span>(classname_opt.size())</div>
-<div class="line"><a name="l00362"></a><span class="lineno">  362</span>       assert(nclass==classname_opt.size());</div>
-<div class="line"><a name="l00363"></a><span class="lineno">  363</span>         nband=(training_opt.size())?trainingPixels[0][0].size()-2:trainingPixels[0][0].size();<span class="comment">//X and Y</span></div>
-<div class="line"><a name="l00364"></a><span class="lineno">  364</span>       }</div>
-<div class="line"><a name="l00365"></a><span class="lineno">  365</span>       <span class="keywordflow">else</span>{</div>
-<div class="line"><a name="l00366"></a><span class="lineno">  366</span>         assert(nclass==trainingPixels.size());</div>
-<div class="line"><a name="l00367"></a><span class="lineno">  367</span>         assert(nband==(training_opt.size())?trainingPixels[0][0].size()-2:trainingPixels[0][0].size());</div>
-<div class="line"><a name="l00368"></a><span class="lineno">  368</span>       }</div>
-<div class="line"><a name="l00369"></a><span class="lineno">  369</span> </div>
-<div class="line"><a name="l00370"></a><span class="lineno">  370</span>       <span class="comment">//do not remove outliers here: could easily be obtained through ogr2ogr -where 'B2<110' output.shp input.shp</span></div>
-<div class="line"><a name="l00371"></a><span class="lineno">  371</span>       <span class="comment">//balance training data</span></div>
-<div class="line"><a name="l00372"></a><span class="lineno">  372</span>       <span class="keywordflow">if</span>(balance_opt[0]>0){</div>
-<div class="line"><a name="l00373"></a><span class="lineno">  373</span>         <span class="keywordflow">while</span>(balance_opt.size()<nclass)</div>
-<div class="line"><a name="l00374"></a><span class="lineno">  374</span>           balance_opt.push_back(balance_opt.back());</div>
-<div class="line"><a name="l00375"></a><span class="lineno">  375</span>         <span class="keywordflow">if</span>(random_opt[0])</div>
-<div class="line"><a name="l00376"></a><span class="lineno">  376</span>           srand(time(NULL));</div>
-<div class="line"><a name="l00377"></a><span class="lineno">  377</span>         totalSamples=0;</div>
-<div class="line"><a name="l00378"></a><span class="lineno">  378</span>         <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iclass=0;iclass<nclass;++iclass){</div>
-<div class="line"><a name="l00379"></a><span class="lineno">  379</span>           <span class="keywordflow">if</span>(trainingPixels[iclass].size()>balance_opt[iclass]){</div>
-<div class="line"><a name="l00380"></a><span class="lineno">  380</span>             <span class="keywordflow">while</span>(trainingPixels[iclass].size()>balance_opt[iclass]){</div>
-<div class="line"><a name="l00381"></a><span class="lineno">  381</span>               <span class="keywordtype">int</span> index=rand()%trainingPixels[iclass].size();</div>
-<div class="line"><a name="l00382"></a><span class="lineno">  382</span>               trainingPixels[iclass].erase(trainingPixels[iclass].begin()+index);</div>
-<div class="line"><a name="l00383"></a><span class="lineno">  383</span>             }</div>
-<div class="line"><a name="l00384"></a><span class="lineno">  384</span>           }</div>
-<div class="line"><a name="l00385"></a><span class="lineno">  385</span>           <span class="keywordflow">else</span>{</div>
-<div class="line"><a name="l00386"></a><span class="lineno">  386</span>             <span class="keywordtype">int</span> oldsize=trainingPixels[iclass].size();</div>
-<div class="line"><a name="l00387"></a><span class="lineno">  387</span>             <span class="keywordflow">for</span>(<span class="keywordtype">int</span> isample=trainingPixels[iclass].size();isample<balance_opt[iclass];++isample){</div>
-<div class="line"><a name="l00388"></a><span class="lineno">  388</span>               <span class="keywordtype">int</span> index = rand()%oldsize;</div>
-<div class="line"><a name="l00389"></a><span class="lineno">  389</span>               trainingPixels[iclass].push_back(trainingPixels[iclass][index]);</div>
-<div class="line"><a name="l00390"></a><span class="lineno">  390</span>             }</div>
-<div class="line"><a name="l00391"></a><span class="lineno">  391</span>           }</div>
-<div class="line"><a name="l00392"></a><span class="lineno">  392</span>           totalSamples+=trainingPixels[iclass].size();</div>
-<div class="line"><a name="l00393"></a><span class="lineno">  393</span>         }</div>
-<div class="line"><a name="l00394"></a><span class="lineno">  394</span>       }</div>
-<div class="line"><a name="l00395"></a><span class="lineno">  395</span>     </div>
-<div class="line"><a name="l00396"></a><span class="lineno">  396</span>       <span class="comment">//set scale and offset</span></div>
-<div class="line"><a name="l00397"></a><span class="lineno">  397</span>       offset[ibag].resize(nband);</div>
-<div class="line"><a name="l00398"></a><span class="lineno">  398</span>       scale[ibag].resize(nband);</div>
-<div class="line"><a name="l00399"></a><span class="lineno">  399</span>       <span class="keywordflow">if</span>(offset_opt.size()>1)</div>
-<div class="line"><a name="l00400"></a><span class="lineno">  400</span>         assert(offset_opt.size()==nband);</div>
-<div class="line"><a name="l00401"></a><span class="lineno">  401</span>       <span class="keywordflow">if</span>(scale_opt.size()>1)</div>
-<div class="line"><a name="l00402"></a><span class="lineno">  402</span>         assert(scale_opt.size()==nband);</div>
-<div class="line"><a name="l00403"></a><span class="lineno">  403</span>       <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iband=0;iband<nband;++iband){</div>
-<div class="line"><a name="l00404"></a><span class="lineno">  404</span>         <span class="keywordflow">if</span>(verbose_opt[0]>=1)</div>
-<div class="line"><a name="l00405"></a><span class="lineno">  405</span>           cout << <span class="stringliteral">"scaling for band"</span> << iband << endl;</div>
-<div class="line"><a name="l00406"></a><span class="lineno">  406</span>         offset[ibag][iband]=(offset_opt.size()==1)?offset_opt[0]:offset_opt[iband];</div>
-<div class="line"><a name="l00407"></a><span class="lineno">  407</span>         scale[ibag][iband]=(scale_opt.size()==1)?scale_opt[0]:scale_opt[iband];</div>
-<div class="line"><a name="l00408"></a><span class="lineno">  408</span>         <span class="comment">//search for min and maximum</span></div>
-<div class="line"><a name="l00409"></a><span class="lineno">  409</span>         <span class="keywordflow">if</span>(scale[ibag][iband]<=0){</div>
-<div class="line"><a name="l00410"></a><span class="lineno">  410</span>           <span class="keywordtype">float</span> theMin=trainingPixels[0][0][iband+startBand];</div>
-<div class="line"><a name="l00411"></a><span class="lineno">  411</span>           <span class="keywordtype">float</span> theMax=trainingPixels[0][0][iband+startBand];</div>
-<div class="line"><a name="l00412"></a><span class="lineno">  412</span>           <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iclass=0;iclass<nclass;++iclass){</div>
-<div class="line"><a name="l00413"></a><span class="lineno">  413</span>             <span class="keywordflow">for</span>(<span class="keywordtype">int</span> isample=0;isample<trainingPixels[iclass].size();++isample){</div>
-<div class="line"><a name="l00414"></a><span class="lineno">  414</span>               <span class="keywordflow">if</span>(theMin>trainingPixels[iclass][isample][iband+startBand])</div>
-<div class="line"><a name="l00415"></a><span class="lineno">  415</span>                 theMin=trainingPixels[iclass][isample][iband+startBand];</div>
-<div class="line"><a name="l00416"></a><span class="lineno">  416</span>               <span class="keywordflow">if</span>(theMax<trainingPixels[iclass][isample][iband+startBand])</div>
-<div class="line"><a name="l00417"></a><span class="lineno">  417</span>                 theMax=trainingPixels[iclass][isample][iband+startBand];</div>
-<div class="line"><a name="l00418"></a><span class="lineno">  418</span>             }</div>
-<div class="line"><a name="l00419"></a><span class="lineno">  419</span>           }</div>
-<div class="line"><a name="l00420"></a><span class="lineno">  420</span>           offset[ibag][iband]=theMin+(theMax-theMin)/2.0;</div>
-<div class="line"><a name="l00421"></a><span class="lineno">  421</span>           scale[ibag][iband]=(theMax-theMin)/2.0;</div>
-<div class="line"><a name="l00422"></a><span class="lineno">  422</span>           <span class="keywordflow">if</span>(verbose_opt[0]>=1){</div>
-<div class="line"><a name="l00423"></a><span class="lineno">  423</span>             std::cout << <span class="stringliteral">"Extreme image values for band "</span> << iband << <span class="stringliteral">": ["</span> << theMin << <span class="stringliteral">","</span> << theMax << <span class="stringliteral">"]"</span> << std::endl;</div>
-<div class="line"><a name="l00424"></a><span class="lineno">  424</span>             std::cout << <span class="stringliteral">"Using offset, scale: "</span> << offset[ibag][iband] << <span class="stringliteral">", "</span> << scale[ibag][iband] << std::endl;</div>
-<div class="line"><a name="l00425"></a><span class="lineno">  425</span>             std::cout << <span class="stringliteral">"scaled values for band "</span> << iband << <span class="stringliteral">": ["</span> << (theMin-offset[ibag][iband])/scale[ibag][iband] << <span class="stringliteral">","</span> << (theMax-offset[ibag][iband])/scale[ibag][iband] << <span class="stringliteral">"]"</span> <&lt [...]
-<div class="line"><a name="l00426"></a><span class="lineno">  426</span>           }</div>
-<div class="line"><a name="l00427"></a><span class="lineno">  427</span>         }</div>
-<div class="line"><a name="l00428"></a><span class="lineno">  428</span>       }</div>
-<div class="line"><a name="l00429"></a><span class="lineno">  429</span>     }</div>
-<div class="line"><a name="l00430"></a><span class="lineno">  430</span>     <span class="keywordflow">else</span>{<span class="comment">//use same offset and scale </span></div>
-<div class="line"><a name="l00431"></a><span class="lineno">  431</span>       offset[ibag].resize(nband);</div>
-<div class="line"><a name="l00432"></a><span class="lineno">  432</span>       scale[ibag].resize(nband);</div>
-<div class="line"><a name="l00433"></a><span class="lineno">  433</span>       <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iband=0;iband<nband;++iband){</div>
-<div class="line"><a name="l00434"></a><span class="lineno">  434</span>         offset[ibag][iband]=offset[0][iband];</div>
-<div class="line"><a name="l00435"></a><span class="lineno">  435</span>         scale[ibag][iband]=scale[0][iband];</div>
-<div class="line"><a name="l00436"></a><span class="lineno">  436</span>       }</div>
-<div class="line"><a name="l00437"></a><span class="lineno">  437</span>     }</div>
-<div class="line"><a name="l00438"></a><span class="lineno">  438</span>       </div>
-<div class="line"><a name="l00439"></a><span class="lineno">  439</span>     <span class="keywordflow">if</span>(!ibag){</div>
-<div class="line"><a name="l00440"></a><span class="lineno">  440</span>       <span class="keywordflow">if</span>(priors_opt.size()==1){<span class="comment">//default: equal priors for each class</span></div>
-<div class="line"><a name="l00441"></a><span class="lineno">  441</span>         priors.resize(nclass);</div>
-<div class="line"><a name="l00442"></a><span class="lineno">  442</span>         <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iclass=0;iclass<nclass;++iclass)</div>
-<div class="line"><a name="l00443"></a><span class="lineno">  443</span>           priors[iclass]=1.0/nclass;</div>
-<div class="line"><a name="l00444"></a><span class="lineno">  444</span>       }</div>
-<div class="line"><a name="l00445"></a><span class="lineno">  445</span>       assert(priors_opt.size()==1||priors_opt.size()==nclass);</div>
-<div class="line"><a name="l00446"></a><span class="lineno">  446</span>     </div>
-<div class="line"><a name="l00447"></a><span class="lineno">  447</span>       <span class="comment">//set bagsize for each class if not done already via command line</span></div>
-<div class="line"><a name="l00448"></a><span class="lineno">  448</span>       <span class="keywordflow">while</span>(bagSize_opt.size()<nclass)</div>
-<div class="line"><a name="l00449"></a><span class="lineno">  449</span>         bagSize_opt.push_back(bagSize_opt.back());</div>
-<div class="line"><a name="l00450"></a><span class="lineno">  450</span> </div>
-<div class="line"><a name="l00451"></a><span class="lineno">  451</span>       <span class="keywordflow">if</span>(verbose_opt[0]>=1){</div>
-<div class="line"><a name="l00452"></a><span class="lineno">  452</span>         std::cout << <span class="stringliteral">"number of bands: "</span> << nband << std::endl;</div>
-<div class="line"><a name="l00453"></a><span class="lineno">  453</span>         std::cout << <span class="stringliteral">"number of classes: "</span> << nclass << std::endl;</div>
-<div class="line"><a name="l00454"></a><span class="lineno">  454</span>         std::cout << <span class="stringliteral">"priors:"</span>;</div>
-<div class="line"><a name="l00455"></a><span class="lineno">  455</span>     <span class="keywordflow">if</span>(priorimg_opt.empty()){</div>
-<div class="line"><a name="l00456"></a><span class="lineno">  456</span>           <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iclass=0;iclass<nclass;++iclass)</div>
-<div class="line"><a name="l00457"></a><span class="lineno">  457</span>             std::cout << <span class="stringliteral">" "</span> << priors[iclass];</div>
-<div class="line"><a name="l00458"></a><span class="lineno">  458</span>           std::cout << std::endl;</div>
-<div class="line"><a name="l00459"></a><span class="lineno">  459</span>         }</div>
-<div class="line"><a name="l00460"></a><span class="lineno">  460</span>       }</div>
-<div class="line"><a name="l00461"></a><span class="lineno">  461</span>       map<string,Vector2d<float> >::iterator mapit=trainingMap.begin();</div>
-<div class="line"><a name="l00462"></a><span class="lineno">  462</span>       <span class="keywordtype">bool</span> doSort=<span class="keyword">true</span>;</div>
-<div class="line"><a name="l00463"></a><span class="lineno">  463</span>       <span class="keywordflow">while</span>(mapit!=trainingMap.end()){</div>
-<div class="line"><a name="l00464"></a><span class="lineno">  464</span>     nameVector.push_back(mapit->first);</div>
-<div class="line"><a name="l00465"></a><span class="lineno">  465</span>     <span class="keywordflow">if</span>(classValueMap.size()){</div>
-<div class="line"><a name="l00466"></a><span class="lineno">  466</span>       <span class="comment">//check if name in training is covered by classname_opt (values can not be 0)</span></div>
-<div class="line"><a name="l00467"></a><span class="lineno">  467</span>       <span class="keywordflow">if</span>(classValueMap[mapit->first]>0){</div>
-<div class="line"><a name="l00468"></a><span class="lineno">  468</span>         <span class="keywordflow">if</span>(cm.getClassIndex(type2string<short>(classValueMap[mapit->first]))<0)</div>
-<div class="line"><a name="l00469"></a><span class="lineno">  469</span>           cm.pushBackClassName(type2string<short>(classValueMap[mapit->first]),doSort);</div>
-<div class="line"><a name="l00470"></a><span class="lineno">  470</span>       }</div>
-<div class="line"><a name="l00471"></a><span class="lineno">  471</span>       <span class="keywordflow">else</span>{</div>
-<div class="line"><a name="l00472"></a><span class="lineno">  472</span>         std::cerr << <span class="stringliteral">"Error: names in classname option are not complete, please check names in training vector and make sure classvalue is > 0"</span> << std::endl;</div>
-<div class="line"><a name="l00473"></a><span class="lineno">  473</span>         exit(1);</div>
-<div class="line"><a name="l00474"></a><span class="lineno">  474</span>       }</div>
-<div class="line"><a name="l00475"></a><span class="lineno">  475</span>     }</div>
-<div class="line"><a name="l00476"></a><span class="lineno">  476</span>     <span class="keywordflow">else</span></div>
-<div class="line"><a name="l00477"></a><span class="lineno">  477</span>       cm.pushBackClassName(mapit->first,doSort);</div>
-<div class="line"><a name="l00478"></a><span class="lineno">  478</span>     ++mapit;</div>
-<div class="line"><a name="l00479"></a><span class="lineno">  479</span>       }</div>
-<div class="line"><a name="l00480"></a><span class="lineno">  480</span>       <span class="keywordflow">if</span>(classname_opt.empty()){</div>
-<div class="line"><a name="l00481"></a><span class="lineno">  481</span>         <span class="comment">//std::cerr << "Warning: no class name and value pair provided for all " << nclass << " classes, using string2type<int> instead!" << std::endl;</span></div>
-<div class="line"><a name="l00482"></a><span class="lineno">  482</span>         <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iclass=0;iclass<nclass;++iclass){</div>
-<div class="line"><a name="l00483"></a><span class="lineno">  483</span>           <span class="keywordflow">if</span>(verbose_opt[0])</div>
-<div class="line"><a name="l00484"></a><span class="lineno">  484</span>             std::cout << iclass << <span class="stringliteral">" "</span> << cm.getClass(iclass) << <span class="stringliteral">" -> "</span> << string2type<short>(cm.getClass(iclass)) << std::endl;</div>
-<div class="line"><a name="l00485"></a><span class="lineno">  485</span>           classValueMap[cm.getClass(iclass)]=string2type<short>(cm.getClass(iclass));</div>
-<div class="line"><a name="l00486"></a><span class="lineno">  486</span>         }</div>
-<div class="line"><a name="l00487"></a><span class="lineno">  487</span>       }</div>
-<div class="line"><a name="l00488"></a><span class="lineno">  488</span>       <span class="keywordflow">if</span>(priors_opt.size()==nameVector.size()){</div>
-<div class="line"><a name="l00489"></a><span class="lineno">  489</span>     std::cerr << <span class="stringliteral">"Warning: please check if priors are provided in correct order!!!"</span> << std::endl;</div>
-<div class="line"><a name="l00490"></a><span class="lineno">  490</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iclass=0;iclass<nameVector.size();++iclass)</div>
-<div class="line"><a name="l00491"></a><span class="lineno">  491</span>       std::cerr << nameVector[iclass] << <span class="stringliteral">" "</span> << priors_opt[iclass] << std::endl;</div>
+<div class="line"><a name="l00293"></a><span class="lineno">  293</span>   vector<PosValue> activePoints(nactive_opt[0]);</div>
+<div class="line"><a name="l00294"></a><span class="lineno">  294</span>   <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iactive=0;iactive<activePoints.size();++iactive){</div>
+<div class="line"><a name="l00295"></a><span class="lineno">  295</span>     activePoints[iactive].value=1.0;</div>
+<div class="line"><a name="l00296"></a><span class="lineno">  296</span>     activePoints[iactive].posx=0.0;</div>
+<div class="line"><a name="l00297"></a><span class="lineno">  297</span>     activePoints[iactive].posy=0.0;</div>
+<div class="line"><a name="l00298"></a><span class="lineno">  298</span>   }</div>
+<div class="line"><a name="l00299"></a><span class="lineno">  299</span> </div>
+<div class="line"><a name="l00300"></a><span class="lineno">  300</span>   <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> totalSamples=0;</div>
+<div class="line"><a name="l00301"></a><span class="lineno">  301</span>   <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> nactive=0;</div>
+<div class="line"><a name="l00302"></a><span class="lineno">  302</span>   vector<FANN::neural_net> net(nbag);<span class="comment">//the neural network</span></div>
+<div class="line"><a name="l00303"></a><span class="lineno">  303</span> </div>
+<div class="line"><a name="l00304"></a><span class="lineno">  304</span>   <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> nclass=0;</div>
+<div class="line"><a name="l00305"></a><span class="lineno">  305</span>   <span class="keywordtype">int</span> nband=0;</div>
+<div class="line"><a name="l00306"></a><span class="lineno">  306</span>   <span class="keywordtype">int</span> startBand=2;<span class="comment">//first two bands represent X and Y pos</span></div>
+<div class="line"><a name="l00307"></a><span class="lineno">  307</span> </div>
+<div class="line"><a name="l00308"></a><span class="lineno">  308</span>   <span class="keywordflow">if</span>(priors_opt.size()>1){<span class="comment">//priors from argument list</span></div>
+<div class="line"><a name="l00309"></a><span class="lineno">  309</span>     priors.resize(priors_opt.size());</div>
+<div class="line"><a name="l00310"></a><span class="lineno">  310</span>     <span class="keywordtype">double</span> normPrior=0;</div>
+<div class="line"><a name="l00311"></a><span class="lineno">  311</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iclass=0;iclass<priors_opt.size();++iclass){</div>
+<div class="line"><a name="l00312"></a><span class="lineno">  312</span>       priors[iclass]=priors_opt[iclass];</div>
+<div class="line"><a name="l00313"></a><span class="lineno">  313</span>       normPrior+=priors[iclass];</div>
+<div class="line"><a name="l00314"></a><span class="lineno">  314</span>     }</div>
+<div class="line"><a name="l00315"></a><span class="lineno">  315</span>     <span class="comment">//normalize</span></div>
+<div class="line"><a name="l00316"></a><span class="lineno">  316</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iclass=0;iclass<priors_opt.size();++iclass)</div>
+<div class="line"><a name="l00317"></a><span class="lineno">  317</span>       priors[iclass]/=normPrior;</div>
+<div class="line"><a name="l00318"></a><span class="lineno">  318</span>   }</div>
+<div class="line"><a name="l00319"></a><span class="lineno">  319</span> </div>
+<div class="line"><a name="l00320"></a><span class="lineno">  320</span>   <span class="comment">//convert start and end band options to vector of band indexes</span></div>
+<div class="line"><a name="l00321"></a><span class="lineno">  321</span>   <span class="keywordflow">try</span>{</div>
+<div class="line"><a name="l00322"></a><span class="lineno">  322</span>     <span class="keywordflow">if</span>(bstart_opt.size()){</div>
+<div class="line"><a name="l00323"></a><span class="lineno">  323</span>       <span class="keywordflow">if</span>(bend_opt.size()!=bstart_opt.size()){</div>
+<div class="line"><a name="l00324"></a><span class="lineno">  324</span>     <span class="keywordtype">string</span> errorstring=<span class="stringliteral">"Error: options for start and end band indexes must be provided as pairs, missing end band"</span>;</div>
+<div class="line"><a name="l00325"></a><span class="lineno">  325</span>     <span class="keywordflow">throw</span>(errorstring);</div>
+<div class="line"><a name="l00326"></a><span class="lineno">  326</span>       }</div>
+<div class="line"><a name="l00327"></a><span class="lineno">  327</span>       band_opt.clear();</div>
+<div class="line"><a name="l00328"></a><span class="lineno">  328</span>       <span class="keywordflow">for</span>(<span class="keywordtype">int</span> ipair=0;ipair<bstart_opt.size();++ipair){</div>
+<div class="line"><a name="l00329"></a><span class="lineno">  329</span>     <span class="keywordflow">if</span>(bend_opt[ipair]<=bstart_opt[ipair]){</div>
+<div class="line"><a name="l00330"></a><span class="lineno">  330</span>       <span class="keywordtype">string</span> errorstring=<span class="stringliteral">"Error: index for end band must be smaller then start band"</span>;</div>
+<div class="line"><a name="l00331"></a><span class="lineno">  331</span>       <span class="keywordflow">throw</span>(errorstring);</div>
+<div class="line"><a name="l00332"></a><span class="lineno">  332</span>     }</div>
+<div class="line"><a name="l00333"></a><span class="lineno">  333</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iband=bstart_opt[ipair];iband<=bend_opt[ipair];++iband)</div>
+<div class="line"><a name="l00334"></a><span class="lineno">  334</span>       band_opt.push_back(iband);</div>
+<div class="line"><a name="l00335"></a><span class="lineno">  335</span>       }</div>
+<div class="line"><a name="l00336"></a><span class="lineno">  336</span>     }</div>
+<div class="line"><a name="l00337"></a><span class="lineno">  337</span>   }</div>
+<div class="line"><a name="l00338"></a><span class="lineno">  338</span>   <span class="keywordflow">catch</span>(<span class="keywordtype">string</span> error){</div>
+<div class="line"><a name="l00339"></a><span class="lineno">  339</span>     cerr << error << std::endl;</div>
+<div class="line"><a name="l00340"></a><span class="lineno">  340</span>     exit(1);</div>
+<div class="line"><a name="l00341"></a><span class="lineno">  341</span>   }</div>
+<div class="line"><a name="l00342"></a><span class="lineno">  342</span>   <span class="comment">//sort bands</span></div>
+<div class="line"><a name="l00343"></a><span class="lineno">  343</span>   <span class="keywordflow">if</span>(band_opt.size())</div>
+<div class="line"><a name="l00344"></a><span class="lineno">  344</span>     std::sort(band_opt.begin(),band_opt.end());</div>
+<div class="line"><a name="l00345"></a><span class="lineno">  345</span> </div>
+<div class="line"><a name="l00346"></a><span class="lineno">  346</span>   map<string,short> classValueMap;</div>
+<div class="line"><a name="l00347"></a><span class="lineno">  347</span>   vector<std::string> nameVector;</div>
+<div class="line"><a name="l00348"></a><span class="lineno">  348</span>   <span class="keywordflow">if</span>(classname_opt.size()){</div>
+<div class="line"><a name="l00349"></a><span class="lineno">  349</span>     assert(classname_opt.size()==classvalue_opt.size());</div>
+<div class="line"><a name="l00350"></a><span class="lineno">  350</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iclass=0;iclass<classname_opt.size();++iclass)</div>
+<div class="line"><a name="l00351"></a><span class="lineno">  351</span>       classValueMap[classname_opt[iclass]]=classvalue_opt[iclass];</div>
+<div class="line"><a name="l00352"></a><span class="lineno">  352</span>   }</div>
+<div class="line"><a name="l00353"></a><span class="lineno">  353</span>   <span class="comment">//----------------------------------- Training -------------------------------</span></div>
+<div class="line"><a name="l00354"></a><span class="lineno">  354</span>   <a class="code" href="classconfusionmatrix_1_1ConfusionMatrix.html">confusionmatrix::ConfusionMatrix</a> cm;</div>
+<div class="line"><a name="l00355"></a><span class="lineno">  355</span>   vector< vector<double> > offset(nbag);</div>
+<div class="line"><a name="l00356"></a><span class="lineno">  356</span>   vector< vector<double> > scale(nbag);</div>
+<div class="line"><a name="l00357"></a><span class="lineno">  357</span>   map<string,Vector2d<float> > trainingMap;</div>
+<div class="line"><a name="l00358"></a><span class="lineno">  358</span>   vector< Vector2d<float> > trainingPixels;<span class="comment">//[class][sample][band]</span></div>
+<div class="line"><a name="l00359"></a><span class="lineno">  359</span>   vector<string> fields;</div>
+<div class="line"><a name="l00360"></a><span class="lineno">  360</span>   <span class="keywordflow">for</span>(<span class="keywordtype">int</span> ibag=0;ibag<nbag;++ibag){</div>
+<div class="line"><a name="l00361"></a><span class="lineno">  361</span>     <span class="comment">//organize training data</span></div>
+<div class="line"><a name="l00362"></a><span class="lineno">  362</span>     <span class="keywordflow">if</span>(ibag<training_opt.size()){<span class="comment">//if bag contains new training pixels</span></div>
+<div class="line"><a name="l00363"></a><span class="lineno">  363</span>       trainingMap.clear();</div>
+<div class="line"><a name="l00364"></a><span class="lineno">  364</span>       trainingPixels.clear();</div>
+<div class="line"><a name="l00365"></a><span class="lineno">  365</span>       <span class="keywordflow">if</span>(verbose_opt[0]>=1)</div>
+<div class="line"><a name="l00366"></a><span class="lineno">  366</span>         cout << <span class="stringliteral">"reading imageVector file "</span> << training_opt[0] << endl;</div>
+<div class="line"><a name="l00367"></a><span class="lineno">  367</span>       <span class="keywordflow">try</span>{</div>
+<div class="line"><a name="l00368"></a><span class="lineno">  368</span>     <a class="code" href="classImgReaderOgr.html">ImgReaderOgr</a> trainingReaderBag(training_opt[ibag]);</div>
+<div class="line"><a name="l00369"></a><span class="lineno">  369</span>         <span class="keywordflow">if</span>(band_opt.size())</div>
+<div class="line"><a name="l00370"></a><span class="lineno">  370</span>           totalSamples=trainingReaderBag.readDataImageOgr(trainingMap,fields,band_opt,label_opt[0],tlayer_opt,verbose_opt[0]);</div>
+<div class="line"><a name="l00371"></a><span class="lineno">  371</span>         <span class="keywordflow">else</span></div>
+<div class="line"><a name="l00372"></a><span class="lineno">  372</span>           totalSamples=trainingReaderBag.readDataImageOgr(trainingMap,fields,0,0,label_opt[0],tlayer_opt,verbose_opt[0]);</div>
+<div class="line"><a name="l00373"></a><span class="lineno">  373</span>         <span class="keywordflow">if</span>(trainingMap.size()<2){</div>
+<div class="line"><a name="l00374"></a><span class="lineno">  374</span>           <span class="keywordtype">string</span> errorstring=<span class="stringliteral">"Error: could not read at least two classes from training file, did you provide class labels in training sample (see option label)?"</span>;</div>
+<div class="line"><a name="l00375"></a><span class="lineno">  375</span>           <span class="keywordflow">throw</span>(errorstring);</div>
+<div class="line"><a name="l00376"></a><span class="lineno">  376</span>         }</div>
+<div class="line"><a name="l00377"></a><span class="lineno">  377</span>     trainingReaderBag.close();</div>
+<div class="line"><a name="l00378"></a><span class="lineno">  378</span>       }</div>
+<div class="line"><a name="l00379"></a><span class="lineno">  379</span>       <span class="keywordflow">catch</span>(<span class="keywordtype">string</span> error){</div>
+<div class="line"><a name="l00380"></a><span class="lineno">  380</span>         cerr << error << std::endl;</div>
+<div class="line"><a name="l00381"></a><span class="lineno">  381</span>         exit(1);</div>
+<div class="line"><a name="l00382"></a><span class="lineno">  382</span>       }</div>
+<div class="line"><a name="l00383"></a><span class="lineno">  383</span>       <span class="keywordflow">catch</span>(...){</div>
+<div class="line"><a name="l00384"></a><span class="lineno">  384</span>         cerr << <span class="stringliteral">"error catched"</span> << std::endl;</div>
+<div class="line"><a name="l00385"></a><span class="lineno">  385</span>         exit(1);</div>
+<div class="line"><a name="l00386"></a><span class="lineno">  386</span>       }</div>
+<div class="line"><a name="l00387"></a><span class="lineno">  387</span>       <span class="comment">//delete class 0 ?</span></div>
+<div class="line"><a name="l00388"></a><span class="lineno">  388</span>       <span class="comment">// if(verbose_opt[0]>=1)</span></div>
+<div class="line"><a name="l00389"></a><span class="lineno">  389</span>       <span class="comment">//   std::cout << "erasing class 0 from training set (" << trainingMap[0].size() << " from " << totalSamples << ") samples" << std::endl;</span></div>
+<div class="line"><a name="l00390"></a><span class="lineno">  390</span>       <span class="comment">// totalSamples-=trainingMap[0].size();</span></div>
+<div class="line"><a name="l00391"></a><span class="lineno">  391</span>       <span class="comment">// trainingMap.erase(0);</span></div>
+<div class="line"><a name="l00392"></a><span class="lineno">  392</span>       <span class="comment">//convert map to vector</span></div>
+<div class="line"><a name="l00393"></a><span class="lineno">  393</span>       <span class="keywordflow">if</span>(verbose_opt[0]>1)</div>
+<div class="line"><a name="l00394"></a><span class="lineno">  394</span>         std::cout << <span class="stringliteral">"training pixels: "</span> << std::endl;</div>
+<div class="line"><a name="l00395"></a><span class="lineno">  395</span>       map<string,Vector2d<float> >::iterator mapit=trainingMap.begin();</div>
+<div class="line"><a name="l00396"></a><span class="lineno">  396</span>       <span class="keywordflow">while</span>(mapit!=trainingMap.end()){</div>
+<div class="line"><a name="l00397"></a><span class="lineno">  397</span>         <span class="comment">//delete small classes</span></div>
+<div class="line"><a name="l00398"></a><span class="lineno">  398</span>         <span class="keywordflow">if</span>((mapit->second).size()<minSize_opt[0]){</div>
+<div class="line"><a name="l00399"></a><span class="lineno">  399</span>           trainingMap.erase(mapit);</div>
+<div class="line"><a name="l00400"></a><span class="lineno">  400</span>           <span class="keywordflow">continue</span>;</div>
+<div class="line"><a name="l00401"></a><span class="lineno">  401</span>         }</div>
+<div class="line"><a name="l00402"></a><span class="lineno">  402</span>         trainingPixels.push_back(mapit->second);</div>
+<div class="line"><a name="l00403"></a><span class="lineno">  403</span>         <span class="keywordflow">if</span>(verbose_opt[0]>1)</div>
+<div class="line"><a name="l00404"></a><span class="lineno">  404</span>           std::cout << mapit->first << <span class="stringliteral">": "</span> << (mapit->second).size() << <span class="stringliteral">" samples"</span> << std::endl;</div>
+<div class="line"><a name="l00405"></a><span class="lineno">  405</span>         ++mapit;</div>
+<div class="line"><a name="l00406"></a><span class="lineno">  406</span>         }</div>
+<div class="line"><a name="l00407"></a><span class="lineno">  407</span>       <span class="keywordflow">if</span>(!ibag){</div>
+<div class="line"><a name="l00408"></a><span class="lineno">  408</span>         nclass=trainingPixels.size();</div>
+<div class="line"><a name="l00409"></a><span class="lineno">  409</span>     <span class="keywordflow">if</span>(classname_opt.size())</div>
+<div class="line"><a name="l00410"></a><span class="lineno">  410</span>       assert(nclass==classname_opt.size());</div>
+<div class="line"><a name="l00411"></a><span class="lineno">  411</span>         nband=(training_opt.size())?trainingPixels[0][0].size()-2:trainingPixels[0][0].size();<span class="comment">//X and Y</span></div>
+<div class="line"><a name="l00412"></a><span class="lineno">  412</span>       }</div>
+<div class="line"><a name="l00413"></a><span class="lineno">  413</span>       <span class="keywordflow">else</span>{</div>
+<div class="line"><a name="l00414"></a><span class="lineno">  414</span>         assert(nclass==trainingPixels.size());</div>
+<div class="line"><a name="l00415"></a><span class="lineno">  415</span>         assert(nband==(training_opt.size())?trainingPixels[0][0].size()-2:trainingPixels[0][0].size());</div>
+<div class="line"><a name="l00416"></a><span class="lineno">  416</span>       }</div>
+<div class="line"><a name="l00417"></a><span class="lineno">  417</span> </div>
+<div class="line"><a name="l00418"></a><span class="lineno">  418</span>       <span class="comment">//do not remove outliers here: could easily be obtained through ogr2ogr -where 'B2<110' output.shp input.shp</span></div>
+<div class="line"><a name="l00419"></a><span class="lineno">  419</span>       <span class="comment">//balance training data</span></div>
+<div class="line"><a name="l00420"></a><span class="lineno">  420</span>       <span class="keywordflow">if</span>(balance_opt[0]>0){</div>
+<div class="line"><a name="l00421"></a><span class="lineno">  421</span>         <span class="keywordflow">while</span>(balance_opt.size()<nclass)</div>
+<div class="line"><a name="l00422"></a><span class="lineno">  422</span>           balance_opt.push_back(balance_opt.back());</div>
+<div class="line"><a name="l00423"></a><span class="lineno">  423</span>         <span class="keywordflow">if</span>(random_opt[0])</div>
+<div class="line"><a name="l00424"></a><span class="lineno">  424</span>           srand(time(NULL));</div>
+<div class="line"><a name="l00425"></a><span class="lineno">  425</span>         totalSamples=0;</div>
+<div class="line"><a name="l00426"></a><span class="lineno">  426</span>         <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iclass=0;iclass<nclass;++iclass){</div>
+<div class="line"><a name="l00427"></a><span class="lineno">  427</span>           <span class="keywordflow">if</span>(trainingPixels[iclass].size()>balance_opt[iclass]){</div>
+<div class="line"><a name="l00428"></a><span class="lineno">  428</span>             <span class="keywordflow">while</span>(trainingPixels[iclass].size()>balance_opt[iclass]){</div>
+<div class="line"><a name="l00429"></a><span class="lineno">  429</span>               <span class="keywordtype">int</span> index=rand()%trainingPixels[iclass].size();</div>
+<div class="line"><a name="l00430"></a><span class="lineno">  430</span>               trainingPixels[iclass].erase(trainingPixels[iclass].begin()+index);</div>
+<div class="line"><a name="l00431"></a><span class="lineno">  431</span>             }</div>
+<div class="line"><a name="l00432"></a><span class="lineno">  432</span>           }</div>
+<div class="line"><a name="l00433"></a><span class="lineno">  433</span>           <span class="keywordflow">else</span>{</div>
+<div class="line"><a name="l00434"></a><span class="lineno">  434</span>             <span class="keywordtype">int</span> oldsize=trainingPixels[iclass].size();</div>
+<div class="line"><a name="l00435"></a><span class="lineno">  435</span>             <span class="keywordflow">for</span>(<span class="keywordtype">int</span> isample=trainingPixels[iclass].size();isample<balance_opt[iclass];++isample){</div>
+<div class="line"><a name="l00436"></a><span class="lineno">  436</span>               <span class="keywordtype">int</span> index = rand()%oldsize;</div>
+<div class="line"><a name="l00437"></a><span class="lineno">  437</span>               trainingPixels[iclass].push_back(trainingPixels[iclass][index]);</div>
+<div class="line"><a name="l00438"></a><span class="lineno">  438</span>             }</div>
+<div class="line"><a name="l00439"></a><span class="lineno">  439</span>           }</div>
+<div class="line"><a name="l00440"></a><span class="lineno">  440</span>           totalSamples+=trainingPixels[iclass].size();</div>
+<div class="line"><a name="l00441"></a><span class="lineno">  441</span>         }</div>
+<div class="line"><a name="l00442"></a><span class="lineno">  442</span>       }</div>
+<div class="line"><a name="l00443"></a><span class="lineno">  443</span>     </div>
+<div class="line"><a name="l00444"></a><span class="lineno">  444</span>       <span class="comment">//set scale and offset</span></div>
+<div class="line"><a name="l00445"></a><span class="lineno">  445</span>       offset[ibag].resize(nband);</div>
+<div class="line"><a name="l00446"></a><span class="lineno">  446</span>       scale[ibag].resize(nband);</div>
+<div class="line"><a name="l00447"></a><span class="lineno">  447</span>       <span class="keywordflow">if</span>(offset_opt.size()>1)</div>
+<div class="line"><a name="l00448"></a><span class="lineno">  448</span>         assert(offset_opt.size()==nband);</div>
+<div class="line"><a name="l00449"></a><span class="lineno">  449</span>       <span class="keywordflow">if</span>(scale_opt.size()>1)</div>
+<div class="line"><a name="l00450"></a><span class="lineno">  450</span>         assert(scale_opt.size()==nband);</div>
+<div class="line"><a name="l00451"></a><span class="lineno">  451</span>       <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iband=0;iband<nband;++iband){</div>
+<div class="line"><a name="l00452"></a><span class="lineno">  452</span>         <span class="keywordflow">if</span>(verbose_opt[0]>=1)</div>
+<div class="line"><a name="l00453"></a><span class="lineno">  453</span>           cout << <span class="stringliteral">"scaling for band"</span> << iband << endl;</div>
+<div class="line"><a name="l00454"></a><span class="lineno">  454</span>         offset[ibag][iband]=(offset_opt.size()==1)?offset_opt[0]:offset_opt[iband];</div>
+<div class="line"><a name="l00455"></a><span class="lineno">  455</span>         scale[ibag][iband]=(scale_opt.size()==1)?scale_opt[0]:scale_opt[iband];</div>
+<div class="line"><a name="l00456"></a><span class="lineno">  456</span>         <span class="comment">//search for min and maximum</span></div>
+<div class="line"><a name="l00457"></a><span class="lineno">  457</span>         <span class="keywordflow">if</span>(scale[ibag][iband]<=0){</div>
+<div class="line"><a name="l00458"></a><span class="lineno">  458</span>           <span class="keywordtype">float</span> theMin=trainingPixels[0][0][iband+startBand];</div>
+<div class="line"><a name="l00459"></a><span class="lineno">  459</span>           <span class="keywordtype">float</span> theMax=trainingPixels[0][0][iband+startBand];</div>
+<div class="line"><a name="l00460"></a><span class="lineno">  460</span>           <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iclass=0;iclass<nclass;++iclass){</div>
+<div class="line"><a name="l00461"></a><span class="lineno">  461</span>             <span class="keywordflow">for</span>(<span class="keywordtype">int</span> isample=0;isample<trainingPixels[iclass].size();++isample){</div>
+<div class="line"><a name="l00462"></a><span class="lineno">  462</span>               <span class="keywordflow">if</span>(theMin>trainingPixels[iclass][isample][iband+startBand])</div>
+<div class="line"><a name="l00463"></a><span class="lineno">  463</span>                 theMin=trainingPixels[iclass][isample][iband+startBand];</div>
+<div class="line"><a name="l00464"></a><span class="lineno">  464</span>               <span class="keywordflow">if</span>(theMax<trainingPixels[iclass][isample][iband+startBand])</div>
+<div class="line"><a name="l00465"></a><span class="lineno">  465</span>                 theMax=trainingPixels[iclass][isample][iband+startBand];</div>
+<div class="line"><a name="l00466"></a><span class="lineno">  466</span>             }</div>
+<div class="line"><a name="l00467"></a><span class="lineno">  467</span>           }</div>
+<div class="line"><a name="l00468"></a><span class="lineno">  468</span>           offset[ibag][iband]=theMin+(theMax-theMin)/2.0;</div>
+<div class="line"><a name="l00469"></a><span class="lineno">  469</span>           scale[ibag][iband]=(theMax-theMin)/2.0;</div>
+<div class="line"><a name="l00470"></a><span class="lineno">  470</span>           <span class="keywordflow">if</span>(verbose_opt[0]>=1){</div>
+<div class="line"><a name="l00471"></a><span class="lineno">  471</span>             std::cout << <span class="stringliteral">"Extreme image values for band "</span> << iband << <span class="stringliteral">": ["</span> << theMin << <span class="stringliteral">","</span> << theMax << <span class="stringliteral">"]"</span> << std::endl;</div>
+<div class="line"><a name="l00472"></a><span class="lineno">  472</span>             std::cout << <span class="stringliteral">"Using offset, scale: "</span> << offset[ibag][iband] << <span class="stringliteral">", "</span> << scale[ibag][iband] << std::endl;</div>
+<div class="line"><a name="l00473"></a><span class="lineno">  473</span>             std::cout << <span class="stringliteral">"scaled values for band "</span> << iband << <span class="stringliteral">": ["</span> << (theMin-offset[ibag][iband])/scale[ibag][iband] << <span class="stringliteral">","</span> << (theMax-offset[ibag][iband])/scale[ibag][iband] << <span class="stringliteral">"]"</span> <&lt [...]
+<div class="line"><a name="l00474"></a><span class="lineno">  474</span>           }</div>
+<div class="line"><a name="l00475"></a><span class="lineno">  475</span>         }</div>
+<div class="line"><a name="l00476"></a><span class="lineno">  476</span>       }</div>
+<div class="line"><a name="l00477"></a><span class="lineno">  477</span>     }</div>
+<div class="line"><a name="l00478"></a><span class="lineno">  478</span>     <span class="keywordflow">else</span>{<span class="comment">//use same offset and scale </span></div>
+<div class="line"><a name="l00479"></a><span class="lineno">  479</span>       offset[ibag].resize(nband);</div>
+<div class="line"><a name="l00480"></a><span class="lineno">  480</span>       scale[ibag].resize(nband);</div>
+<div class="line"><a name="l00481"></a><span class="lineno">  481</span>       <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iband=0;iband<nband;++iband){</div>
+<div class="line"><a name="l00482"></a><span class="lineno">  482</span>         offset[ibag][iband]=offset[0][iband];</div>
+<div class="line"><a name="l00483"></a><span class="lineno">  483</span>         scale[ibag][iband]=scale[0][iband];</div>
+<div class="line"><a name="l00484"></a><span class="lineno">  484</span>       }</div>
+<div class="line"><a name="l00485"></a><span class="lineno">  485</span>     }</div>
+<div class="line"><a name="l00486"></a><span class="lineno">  486</span>       </div>
+<div class="line"><a name="l00487"></a><span class="lineno">  487</span>     <span class="keywordflow">if</span>(!ibag){</div>
+<div class="line"><a name="l00488"></a><span class="lineno">  488</span>       <span class="keywordflow">if</span>(priors_opt.size()==1){<span class="comment">//default: equal priors for each class</span></div>
+<div class="line"><a name="l00489"></a><span class="lineno">  489</span>         priors.resize(nclass);</div>
+<div class="line"><a name="l00490"></a><span class="lineno">  490</span>         <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iclass=0;iclass<nclass;++iclass)</div>
+<div class="line"><a name="l00491"></a><span class="lineno">  491</span>           priors[iclass]=1.0/nclass;</div>
 <div class="line"><a name="l00492"></a><span class="lineno">  492</span>       }</div>
-<div class="line"><a name="l00493"></a><span class="lineno">  493</span>     }<span class="comment">//if(!ibag)</span></div>
-<div class="line"><a name="l00494"></a><span class="lineno">  494</span> </div>
-<div class="line"><a name="l00495"></a><span class="lineno">  495</span>     <span class="comment">//Calculate features of training set</span></div>
-<div class="line"><a name="l00496"></a><span class="lineno">  496</span>     vector< Vector2d<float> > trainingFeatures(nclass);</div>
-<div class="line"><a name="l00497"></a><span class="lineno">  497</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iclass=0;iclass<nclass;++iclass){</div>
-<div class="line"><a name="l00498"></a><span class="lineno">  498</span>       <span class="keywordtype">int</span> nctraining=0;</div>
-<div class="line"><a name="l00499"></a><span class="lineno">  499</span>       <span class="keywordflow">if</span>(verbose_opt[0]>=1)</div>
-<div class="line"><a name="l00500"></a><span class="lineno">  500</span>         cout << <span class="stringliteral">"calculating features for class "</span> << iclass << endl;</div>
-<div class="line"><a name="l00501"></a><span class="lineno">  501</span>       <span class="keywordflow">if</span>(random_opt[0])</div>
-<div class="line"><a name="l00502"></a><span class="lineno">  502</span>         srand(time(NULL));</div>
-<div class="line"><a name="l00503"></a><span class="lineno">  503</span>       nctraining=(bagSize_opt[iclass]<100)? trainingPixels[iclass].size()/100.0*bagSize_opt[iclass] : trainingPixels[iclass].size();<span class="comment">//bagSize_opt[iclass] given in % of training size</span></div>
-<div class="line"><a name="l00504"></a><span class="lineno">  504</span>       <span class="keywordflow">if</span>(nctraining<=0)</div>
-<div class="line"><a name="l00505"></a><span class="lineno">  505</span>         nctraining=1;</div>
-<div class="line"><a name="l00506"></a><span class="lineno">  506</span>       assert(nctraining<=trainingPixels[iclass].size());</div>
-<div class="line"><a name="l00507"></a><span class="lineno">  507</span>       <span class="keywordtype">int</span> index=0;</div>
-<div class="line"><a name="l00508"></a><span class="lineno">  508</span>       <span class="keywordflow">if</span>(bagSize_opt[iclass]<100)</div>
-<div class="line"><a name="l00509"></a><span class="lineno">  509</span>         random_shuffle(trainingPixels[iclass].begin(),trainingPixels[iclass].end());</div>
-<div class="line"><a name="l00510"></a><span class="lineno">  510</span>       </div>
-<div class="line"><a name="l00511"></a><span class="lineno">  511</span>       trainingFeatures[iclass].resize(nctraining);</div>
-<div class="line"><a name="l00512"></a><span class="lineno">  512</span>       <span class="keywordflow">for</span>(<span class="keywordtype">int</span> isample=0;isample<nctraining;++isample){</div>
-<div class="line"><a name="l00513"></a><span class="lineno">  513</span>         <span class="comment">//scale pixel values according to scale and offset!!!</span></div>
-<div class="line"><a name="l00514"></a><span class="lineno">  514</span>         <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iband=0;iband<nband;++iband){</div>
-<div class="line"><a name="l00515"></a><span class="lineno">  515</span>           <span class="keywordtype">float</span> value=trainingPixels[iclass][isample][iband+startBand];</div>
-<div class="line"><a name="l00516"></a><span class="lineno">  516</span>           trainingFeatures[iclass][isample].push_back((value-offset[ibag][iband])/scale[ibag][iband]);</div>
-<div class="line"><a name="l00517"></a><span class="lineno">  517</span>         }</div>
+<div class="line"><a name="l00493"></a><span class="lineno">  493</span>       assert(priors_opt.size()==1||priors_opt.size()==nclass);</div>
+<div class="line"><a name="l00494"></a><span class="lineno">  494</span>     </div>
+<div class="line"><a name="l00495"></a><span class="lineno">  495</span>       <span class="comment">//set bagsize for each class if not done already via command line</span></div>
+<div class="line"><a name="l00496"></a><span class="lineno">  496</span>       <span class="keywordflow">while</span>(bagSize_opt.size()<nclass)</div>
+<div class="line"><a name="l00497"></a><span class="lineno">  497</span>         bagSize_opt.push_back(bagSize_opt.back());</div>
+<div class="line"><a name="l00498"></a><span class="lineno">  498</span> </div>
+<div class="line"><a name="l00499"></a><span class="lineno">  499</span>       <span class="keywordflow">if</span>(verbose_opt[0]>=1){</div>
+<div class="line"><a name="l00500"></a><span class="lineno">  500</span>         std::cout << <span class="stringliteral">"number of bands: "</span> << nband << std::endl;</div>
+<div class="line"><a name="l00501"></a><span class="lineno">  501</span>         std::cout << <span class="stringliteral">"number of classes: "</span> << nclass << std::endl;</div>
+<div class="line"><a name="l00502"></a><span class="lineno">  502</span>         std::cout << <span class="stringliteral">"priors:"</span>;</div>
+<div class="line"><a name="l00503"></a><span class="lineno">  503</span>     <span class="keywordflow">if</span>(priorimg_opt.empty()){</div>
+<div class="line"><a name="l00504"></a><span class="lineno">  504</span>           <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iclass=0;iclass<nclass;++iclass)</div>
+<div class="line"><a name="l00505"></a><span class="lineno">  505</span>             std::cout << <span class="stringliteral">" "</span> << priors[iclass];</div>
+<div class="line"><a name="l00506"></a><span class="lineno">  506</span>           std::cout << std::endl;</div>
+<div class="line"><a name="l00507"></a><span class="lineno">  507</span>         }</div>
+<div class="line"><a name="l00508"></a><span class="lineno">  508</span>       }</div>
+<div class="line"><a name="l00509"></a><span class="lineno">  509</span>       map<string,Vector2d<float> >::iterator mapit=trainingMap.begin();</div>
+<div class="line"><a name="l00510"></a><span class="lineno">  510</span>       <span class="keywordtype">bool</span> doSort=<span class="keyword">true</span>;</div>
+<div class="line"><a name="l00511"></a><span class="lineno">  511</span>       <span class="keywordflow">while</span>(mapit!=trainingMap.end()){</div>
+<div class="line"><a name="l00512"></a><span class="lineno">  512</span>     nameVector.push_back(mapit->first);</div>
+<div class="line"><a name="l00513"></a><span class="lineno">  513</span>     <span class="keywordflow">if</span>(classValueMap.size()){</div>
+<div class="line"><a name="l00514"></a><span class="lineno">  514</span>       <span class="comment">//check if name in training is covered by classname_opt (values can not be 0)</span></div>
+<div class="line"><a name="l00515"></a><span class="lineno">  515</span>       <span class="keywordflow">if</span>(classValueMap[mapit->first]>0){</div>
+<div class="line"><a name="l00516"></a><span class="lineno">  516</span>         <span class="keywordflow">if</span>(cm.getClassIndex(type2string<short>(classValueMap[mapit->first]))<0)</div>
+<div class="line"><a name="l00517"></a><span class="lineno">  517</span>           cm.pushBackClassName(type2string<short>(classValueMap[mapit->first]),doSort);</div>
 <div class="line"><a name="l00518"></a><span class="lineno">  518</span>       }</div>
-<div class="line"><a name="l00519"></a><span class="lineno">  519</span>       assert(trainingFeatures[iclass].size()==nctraining);</div>
-<div class="line"><a name="l00520"></a><span class="lineno">  520</span>     }</div>
-<div class="line"><a name="l00521"></a><span class="lineno">  521</span>     </div>
-<div class="line"><a name="l00522"></a><span class="lineno">  522</span>     <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> nFeatures=trainingFeatures[0][0].size();</div>
-<div class="line"><a name="l00523"></a><span class="lineno">  523</span>     <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> ntraining=0;</div>
-<div class="line"><a name="l00524"></a><span class="lineno">  524</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iclass=0;iclass<nclass;++iclass)</div>
-<div class="line"><a name="l00525"></a><span class="lineno">  525</span>       ntraining+=trainingFeatures[iclass].size();</div>
-<div class="line"><a name="l00526"></a><span class="lineno">  526</span> </div>
-<div class="line"><a name="l00527"></a><span class="lineno">  527</span>     <span class="keyword">const</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> num_layers = nneuron_opt.size()+2;</div>
-<div class="line"><a name="l00528"></a><span class="lineno">  528</span>     <span class="keyword">const</span> <span class="keywordtype">float</span> desired_error = 0.0003;</div>
-<div class="line"><a name="l00529"></a><span class="lineno">  529</span>     <span class="keyword">const</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> iterations_between_reports = (verbose_opt[0])? maxit_opt[0]+1:0;</div>
-<div class="line"><a name="l00530"></a><span class="lineno">  530</span>     <span class="keywordflow">if</span>(verbose_opt[0]>=1){</div>
-<div class="line"><a name="l00531"></a><span class="lineno">  531</span>       cout << <span class="stringliteral">"number of features: "</span> << nFeatures << endl;</div>
-<div class="line"><a name="l00532"></a><span class="lineno">  532</span>       cout << <span class="stringliteral">"creating artificial neural network with "</span> << nneuron_opt.size() << <span class="stringliteral">" hidden layer, having "</span> << endl;</div>
-<div class="line"><a name="l00533"></a><span class="lineno">  533</span>       <span class="keywordflow">for</span>(<span class="keywordtype">int</span> ilayer=0;ilayer<nneuron_opt.size();++ilayer)</div>
-<div class="line"><a name="l00534"></a><span class="lineno">  534</span>         cout << nneuron_opt[ilayer] << <span class="stringliteral">" "</span>;</div>
-<div class="line"><a name="l00535"></a><span class="lineno">  535</span>       cout << <span class="stringliteral">"neurons"</span> << endl;</div>
-<div class="line"><a name="l00536"></a><span class="lineno">  536</span>       cout << <span class="stringliteral">"connection_opt[0]: "</span> << connection_opt[0] << std::endl;</div>
-<div class="line"><a name="l00537"></a><span class="lineno">  537</span>       cout << <span class="stringliteral">"num_layers: "</span> << num_layers << std::endl;</div>
-<div class="line"><a name="l00538"></a><span class="lineno">  538</span>       cout << <span class="stringliteral">"nFeatures: "</span> << nFeatures << std::endl;</div>
-<div class="line"><a name="l00539"></a><span class="lineno">  539</span>       cout << <span class="stringliteral">"nneuron_opt[0]: "</span> << nneuron_opt[0] << std::endl;</div>
-<div class="line"><a name="l00540"></a><span class="lineno">  540</span>       cout << <span class="stringliteral">"number of classes (nclass): "</span> << nclass << std::endl;</div>
-<div class="line"><a name="l00541"></a><span class="lineno">  541</span>     }</div>
-<div class="line"><a name="l00542"></a><span class="lineno">  542</span>     <span class="keywordflow">switch</span>(num_layers){</div>
-<div class="line"><a name="l00543"></a><span class="lineno">  543</span>     <span class="keywordflow">case</span>(3):{</div>
-<div class="line"><a name="l00544"></a><span class="lineno">  544</span>       <span class="comment">// net[ibag].create_sparse(connection_opt[0],num_layers, nFeatures, nneuron_opt[0], nclass);//replace all create_sparse with create_sparse_array due to bug in FANN!</span></div>
-<div class="line"><a name="l00545"></a><span class="lineno">  545</span>       <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> layers[3];</div>
-<div class="line"><a name="l00546"></a><span class="lineno">  546</span>       layers[0]=nFeatures;</div>
-<div class="line"><a name="l00547"></a><span class="lineno">  547</span>       layers[1]=nneuron_opt[0];</div>
-<div class="line"><a name="l00548"></a><span class="lineno">  548</span>       layers[2]=nclass;</div>
-<div class="line"><a name="l00549"></a><span class="lineno">  549</span>       net[ibag].create_sparse_array(connection_opt[0],num_layers,layers);</div>
-<div class="line"><a name="l00550"></a><span class="lineno">  550</span>       <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l00551"></a><span class="lineno">  551</span>     }</div>
-<div class="line"><a name="l00552"></a><span class="lineno">  552</span>     <span class="keywordflow">case</span>(4):{</div>
-<div class="line"><a name="l00553"></a><span class="lineno">  553</span>       <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> layers[4];</div>
-<div class="line"><a name="l00554"></a><span class="lineno">  554</span>       layers[0]=nFeatures;</div>
-<div class="line"><a name="l00555"></a><span class="lineno">  555</span>       layers[1]=nneuron_opt[0];</div>
-<div class="line"><a name="l00556"></a><span class="lineno">  556</span>       layers[2]=nneuron_opt[1];</div>
-<div class="line"><a name="l00557"></a><span class="lineno">  557</span>       layers[3]=nclass;</div>
-<div class="line"><a name="l00558"></a><span class="lineno">  558</span>       <span class="comment">// layers.push_back(nFeatures);</span></div>
-<div class="line"><a name="l00559"></a><span class="lineno">  559</span>       <span class="comment">// for(int ihidden=0;ihidden<nneuron_opt.size();++ihidden)</span></div>
-<div class="line"><a name="l00560"></a><span class="lineno">  560</span>       <span class="comment">//    layers.push_back(nneuron_opt[ihidden]);</span></div>
-<div class="line"><a name="l00561"></a><span class="lineno">  561</span>       <span class="comment">// layers.push_back(nclass);</span></div>
-<div class="line"><a name="l00562"></a><span class="lineno">  562</span>       net[ibag].create_sparse_array(connection_opt[0],num_layers,layers);</div>
-<div class="line"><a name="l00563"></a><span class="lineno">  563</span>       <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l00564"></a><span class="lineno">  564</span>     }</div>
-<div class="line"><a name="l00565"></a><span class="lineno">  565</span>     <span class="keywordflow">default</span>:</div>
-<div class="line"><a name="l00566"></a><span class="lineno">  566</span>       cerr << <span class="stringliteral">"Only 1 or 2 hidden layers are supported!"</span> << endl;</div>
-<div class="line"><a name="l00567"></a><span class="lineno">  567</span>       exit(1);</div>
-<div class="line"><a name="l00568"></a><span class="lineno">  568</span>       <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l00569"></a><span class="lineno">  569</span>     }</div>
-<div class="line"><a name="l00570"></a><span class="lineno">  570</span>     <span class="keywordflow">if</span>(verbose_opt[0]>=1)</div>
-<div class="line"><a name="l00571"></a><span class="lineno">  571</span>       cout << <span class="stringliteral">"network created"</span> << endl;</div>
-<div class="line"><a name="l00572"></a><span class="lineno">  572</span>   </div>
-<div class="line"><a name="l00573"></a><span class="lineno">  573</span>     net[ibag].set_learning_rate(learning_opt[0]);</div>
+<div class="line"><a name="l00519"></a><span class="lineno">  519</span>       <span class="keywordflow">else</span>{</div>
+<div class="line"><a name="l00520"></a><span class="lineno">  520</span>         std::cerr << <span class="stringliteral">"Error: names in classname option are not complete, please check names in training vector and make sure classvalue is > 0"</span> << std::endl;</div>
+<div class="line"><a name="l00521"></a><span class="lineno">  521</span>         exit(1);</div>
+<div class="line"><a name="l00522"></a><span class="lineno">  522</span>       }</div>
+<div class="line"><a name="l00523"></a><span class="lineno">  523</span>     }</div>
+<div class="line"><a name="l00524"></a><span class="lineno">  524</span>     <span class="keywordflow">else</span></div>
+<div class="line"><a name="l00525"></a><span class="lineno">  525</span>       cm.pushBackClassName(mapit->first,doSort);</div>
+<div class="line"><a name="l00526"></a><span class="lineno">  526</span>     ++mapit;</div>
+<div class="line"><a name="l00527"></a><span class="lineno">  527</span>       }</div>
+<div class="line"><a name="l00528"></a><span class="lineno">  528</span>       <span class="keywordflow">if</span>(classname_opt.empty()){</div>
+<div class="line"><a name="l00529"></a><span class="lineno">  529</span>         <span class="comment">//std::cerr << "Warning: no class name and value pair provided for all " << nclass << " classes, using string2type<int> instead!" << std::endl;</span></div>
+<div class="line"><a name="l00530"></a><span class="lineno">  530</span>         <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iclass=0;iclass<nclass;++iclass){</div>
+<div class="line"><a name="l00531"></a><span class="lineno">  531</span>           <span class="keywordflow">if</span>(verbose_opt[0])</div>
+<div class="line"><a name="l00532"></a><span class="lineno">  532</span>             std::cout << iclass << <span class="stringliteral">" "</span> << cm.getClass(iclass) << <span class="stringliteral">" -> "</span> << string2type<short>(cm.getClass(iclass)) << std::endl;</div>
+<div class="line"><a name="l00533"></a><span class="lineno">  533</span>           classValueMap[cm.getClass(iclass)]=string2type<short>(cm.getClass(iclass));</div>
+<div class="line"><a name="l00534"></a><span class="lineno">  534</span>         }</div>
+<div class="line"><a name="l00535"></a><span class="lineno">  535</span>       }</div>
+<div class="line"><a name="l00536"></a><span class="lineno">  536</span>       <span class="keywordflow">if</span>(priors_opt.size()==nameVector.size()){</div>
+<div class="line"><a name="l00537"></a><span class="lineno">  537</span>     std::cerr << <span class="stringliteral">"Warning: please check if priors are provided in correct order!!!"</span> << std::endl;</div>
+<div class="line"><a name="l00538"></a><span class="lineno">  538</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iclass=0;iclass<nameVector.size();++iclass)</div>
+<div class="line"><a name="l00539"></a><span class="lineno">  539</span>       std::cerr << nameVector[iclass] << <span class="stringliteral">" "</span> << priors_opt[iclass] << std::endl;</div>
+<div class="line"><a name="l00540"></a><span class="lineno">  540</span>       }</div>
+<div class="line"><a name="l00541"></a><span class="lineno">  541</span>     }<span class="comment">//if(!ibag)</span></div>
+<div class="line"><a name="l00542"></a><span class="lineno">  542</span> </div>
+<div class="line"><a name="l00543"></a><span class="lineno">  543</span>     <span class="comment">//Calculate features of training set</span></div>
+<div class="line"><a name="l00544"></a><span class="lineno">  544</span>     vector< Vector2d<float> > trainingFeatures(nclass);</div>
+<div class="line"><a name="l00545"></a><span class="lineno">  545</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iclass=0;iclass<nclass;++iclass){</div>
+<div class="line"><a name="l00546"></a><span class="lineno">  546</span>       <span class="keywordtype">int</span> nctraining=0;</div>
+<div class="line"><a name="l00547"></a><span class="lineno">  547</span>       <span class="keywordflow">if</span>(verbose_opt[0]>=1)</div>
+<div class="line"><a name="l00548"></a><span class="lineno">  548</span>         cout << <span class="stringliteral">"calculating features for class "</span> << iclass << endl;</div>
+<div class="line"><a name="l00549"></a><span class="lineno">  549</span>       <span class="keywordflow">if</span>(random_opt[0])</div>
+<div class="line"><a name="l00550"></a><span class="lineno">  550</span>         srand(time(NULL));</div>
+<div class="line"><a name="l00551"></a><span class="lineno">  551</span>       nctraining=(bagSize_opt[iclass]<100)? trainingPixels[iclass].size()/100.0*bagSize_opt[iclass] : trainingPixels[iclass].size();<span class="comment">//bagSize_opt[iclass] given in % of training size</span></div>
+<div class="line"><a name="l00552"></a><span class="lineno">  552</span>       <span class="keywordflow">if</span>(nctraining<=0)</div>
+<div class="line"><a name="l00553"></a><span class="lineno">  553</span>         nctraining=1;</div>
+<div class="line"><a name="l00554"></a><span class="lineno">  554</span>       assert(nctraining<=trainingPixels[iclass].size());</div>
+<div class="line"><a name="l00555"></a><span class="lineno">  555</span>       <span class="keywordtype">int</span> index=0;</div>
+<div class="line"><a name="l00556"></a><span class="lineno">  556</span>       <span class="keywordflow">if</span>(bagSize_opt[iclass]<100)</div>
+<div class="line"><a name="l00557"></a><span class="lineno">  557</span>         random_shuffle(trainingPixels[iclass].begin(),trainingPixels[iclass].end());</div>
+<div class="line"><a name="l00558"></a><span class="lineno">  558</span>       </div>
+<div class="line"><a name="l00559"></a><span class="lineno">  559</span>       trainingFeatures[iclass].resize(nctraining);</div>
+<div class="line"><a name="l00560"></a><span class="lineno">  560</span>       <span class="keywordflow">for</span>(<span class="keywordtype">int</span> isample=0;isample<nctraining;++isample){</div>
+<div class="line"><a name="l00561"></a><span class="lineno">  561</span>         <span class="comment">//scale pixel values according to scale and offset!!!</span></div>
+<div class="line"><a name="l00562"></a><span class="lineno">  562</span>         <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iband=0;iband<nband;++iband){</div>
+<div class="line"><a name="l00563"></a><span class="lineno">  563</span>           <span class="keywordtype">float</span> value=trainingPixels[iclass][isample][iband+startBand];</div>
+<div class="line"><a name="l00564"></a><span class="lineno">  564</span>           trainingFeatures[iclass][isample].push_back((value-offset[ibag][iband])/scale[ibag][iband]);</div>
+<div class="line"><a name="l00565"></a><span class="lineno">  565</span>         }</div>
+<div class="line"><a name="l00566"></a><span class="lineno">  566</span>       }</div>
+<div class="line"><a name="l00567"></a><span class="lineno">  567</span>       assert(trainingFeatures[iclass].size()==nctraining);</div>
+<div class="line"><a name="l00568"></a><span class="lineno">  568</span>     }</div>
+<div class="line"><a name="l00569"></a><span class="lineno">  569</span>     </div>
+<div class="line"><a name="l00570"></a><span class="lineno">  570</span>     <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> nFeatures=trainingFeatures[0][0].size();</div>
+<div class="line"><a name="l00571"></a><span class="lineno">  571</span>     <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> ntraining=0;</div>
+<div class="line"><a name="l00572"></a><span class="lineno">  572</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iclass=0;iclass<nclass;++iclass)</div>
+<div class="line"><a name="l00573"></a><span class="lineno">  573</span>       ntraining+=trainingFeatures[iclass].size();</div>
 <div class="line"><a name="l00574"></a><span class="lineno">  574</span> </div>
-<div class="line"><a name="l00575"></a><span class="lineno">  575</span>     <span class="comment">//   net.set_activation_steepness_hidden(1.0);</span></div>
-<div class="line"><a name="l00576"></a><span class="lineno">  576</span>     <span class="comment">//   net.set_activation_steepness_output(1.0);</span></div>
-<div class="line"><a name="l00577"></a><span class="lineno">  577</span>     </div>
-<div class="line"><a name="l00578"></a><span class="lineno">  578</span>     net[ibag].set_activation_function_hidden(FANN::SIGMOID_SYMMETRIC_STEPWISE);</div>
-<div class="line"><a name="l00579"></a><span class="lineno">  579</span>     net[ibag].set_activation_function_output(FANN::SIGMOID_SYMMETRIC_STEPWISE);</div>
-<div class="line"><a name="l00580"></a><span class="lineno">  580</span> </div>
-<div class="line"><a name="l00581"></a><span class="lineno">  581</span>     <span class="comment">// Set additional properties such as the training algorithm</span></div>
-<div class="line"><a name="l00582"></a><span class="lineno">  582</span>     <span class="comment">//   net.set_training_algorithm(FANN::TRAIN_QUICKPROP);</span></div>
-<div class="line"><a name="l00583"></a><span class="lineno">  583</span> </div>
-<div class="line"><a name="l00584"></a><span class="lineno">  584</span>     <span class="comment">// Output network type and parameters</span></div>
-<div class="line"><a name="l00585"></a><span class="lineno">  585</span>     <span class="keywordflow">if</span>(verbose_opt[0]>=1){</div>
-<div class="line"><a name="l00586"></a><span class="lineno">  586</span>       cout << endl << <span class="stringliteral">"Network Type                         :  "</span>;</div>
-<div class="line"><a name="l00587"></a><span class="lineno">  587</span>       <span class="keywordflow">switch</span> (net[ibag].get_network_type())</div>
-<div class="line"><a name="l00588"></a><span class="lineno">  588</span>         {</div>
-<div class="line"><a name="l00589"></a><span class="lineno">  589</span>         <span class="keywordflow">case</span> FANN::LAYER:</div>
-<div class="line"><a name="l00590"></a><span class="lineno">  590</span>           cout << <span class="stringliteral">"LAYER"</span> << endl;</div>
-<div class="line"><a name="l00591"></a><span class="lineno">  591</span>           <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l00592"></a><span class="lineno">  592</span>         <span class="keywordflow">case</span> FANN::SHORTCUT:</div>
-<div class="line"><a name="l00593"></a><span class="lineno">  593</span>           cout << <span class="stringliteral">"SHORTCUT"</span> << endl;</div>
-<div class="line"><a name="l00594"></a><span class="lineno">  594</span>           <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l00595"></a><span class="lineno">  595</span>         <span class="keywordflow">default</span>:</div>
-<div class="line"><a name="l00596"></a><span class="lineno">  596</span>           cout << <span class="stringliteral">"UNKNOWN"</span> << endl;</div>
-<div class="line"><a name="l00597"></a><span class="lineno">  597</span>           <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l00598"></a><span class="lineno">  598</span>         }</div>
-<div class="line"><a name="l00599"></a><span class="lineno">  599</span>       net[ibag].print_parameters();</div>
-<div class="line"><a name="l00600"></a><span class="lineno">  600</span>     }</div>
-<div class="line"><a name="l00601"></a><span class="lineno">  601</span>       </div>
-<div class="line"><a name="l00602"></a><span class="lineno">  602</span>     <span class="keywordflow">if</span>(cv_opt[0]>1){</div>
-<div class="line"><a name="l00603"></a><span class="lineno">  603</span>       <span class="keywordflow">if</span>(verbose_opt[0])</div>
-<div class="line"><a name="l00604"></a><span class="lineno">  604</span>         std::cout << <span class="stringliteral">"cross validation"</span> << std::endl;</div>
-<div class="line"><a name="l00605"></a><span class="lineno">  605</span>       vector<unsigned short> referenceVector;</div>
-<div class="line"><a name="l00606"></a><span class="lineno">  606</span>       vector<unsigned short> outputVector;</div>
-<div class="line"><a name="l00607"></a><span class="lineno">  607</span>       <span class="keywordtype">float</span> rmse=net[ibag].cross_validation(trainingFeatures,</div>
-<div class="line"><a name="l00608"></a><span class="lineno">  608</span>                                             ntraining,</div>
-<div class="line"><a name="l00609"></a><span class="lineno">  609</span>                                             cv_opt[0],</div>
-<div class="line"><a name="l00610"></a><span class="lineno">  610</span>                                             maxit_opt[0],</div>
-<div class="line"><a name="l00611"></a><span class="lineno">  611</span>                                             desired_error,</div>
-<div class="line"><a name="l00612"></a><span class="lineno">  612</span>                                             referenceVector,</div>
-<div class="line"><a name="l00613"></a><span class="lineno">  613</span>                                             outputVector,</div>
-<div class="line"><a name="l00614"></a><span class="lineno">  614</span>                                             verbose_opt[0]);</div>
-<div class="line"><a name="l00615"></a><span class="lineno">  615</span>       map<string,Vector2d<float> >::iterator mapit=trainingMap.begin();</div>
-<div class="line"><a name="l00616"></a><span class="lineno">  616</span>       <span class="keywordflow">for</span>(<span class="keywordtype">int</span> isample=0;isample<referenceVector.size();++isample){</div>
-<div class="line"><a name="l00617"></a><span class="lineno">  617</span>     <span class="keywordtype">string</span> refClassName=nameVector[referenceVector[isample]];</div>
-<div class="line"><a name="l00618"></a><span class="lineno">  618</span>     <span class="keywordtype">string</span> className=nameVector[outputVector[isample]];</div>
-<div class="line"><a name="l00619"></a><span class="lineno">  619</span>     <span class="keywordflow">if</span>(classValueMap.size())</div>
-<div class="line"><a name="l00620"></a><span class="lineno">  620</span>       cm.incrementResult(type2string<short>(classValueMap[refClassName]),type2string<short>(classValueMap[className]),1.0/nbag);</div>
-<div class="line"><a name="l00621"></a><span class="lineno">  621</span>     <span class="keywordflow">else</span></div>
-<div class="line"><a name="l00622"></a><span class="lineno">  622</span>       cm.incrementResult(cm.getClass(referenceVector[isample]),cm.getClass(outputVector[isample]),1.0/nbag);</div>
-<div class="line"><a name="l00623"></a><span class="lineno">  623</span>       }        </div>
-<div class="line"><a name="l00624"></a><span class="lineno">  624</span>     }</div>
-<div class="line"><a name="l00625"></a><span class="lineno">  625</span>   </div>
-<div class="line"><a name="l00626"></a><span class="lineno">  626</span>     <span class="keywordflow">if</span>(verbose_opt[0]>=1)</div>
-<div class="line"><a name="l00627"></a><span class="lineno">  627</span>       cout << endl << <span class="stringliteral">"Set training data"</span> << endl;</div>
+<div class="line"><a name="l00575"></a><span class="lineno">  575</span>     <span class="keyword">const</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> num_layers = nneuron_opt.size()+2;</div>
+<div class="line"><a name="l00576"></a><span class="lineno">  576</span>     <span class="keyword">const</span> <span class="keywordtype">float</span> desired_error = 0.0003;</div>
+<div class="line"><a name="l00577"></a><span class="lineno">  577</span>     <span class="keyword">const</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> iterations_between_reports = (verbose_opt[0])? maxit_opt[0]+1:0;</div>
+<div class="line"><a name="l00578"></a><span class="lineno">  578</span>     <span class="keywordflow">if</span>(verbose_opt[0]>=1){</div>
+<div class="line"><a name="l00579"></a><span class="lineno">  579</span>       cout << <span class="stringliteral">"number of features: "</span> << nFeatures << endl;</div>
+<div class="line"><a name="l00580"></a><span class="lineno">  580</span>       cout << <span class="stringliteral">"creating artificial neural network with "</span> << nneuron_opt.size() << <span class="stringliteral">" hidden layer, having "</span> << endl;</div>
+<div class="line"><a name="l00581"></a><span class="lineno">  581</span>       <span class="keywordflow">for</span>(<span class="keywordtype">int</span> ilayer=0;ilayer<nneuron_opt.size();++ilayer)</div>
+<div class="line"><a name="l00582"></a><span class="lineno">  582</span>         cout << nneuron_opt[ilayer] << <span class="stringliteral">" "</span>;</div>
+<div class="line"><a name="l00583"></a><span class="lineno">  583</span>       cout << <span class="stringliteral">"neurons"</span> << endl;</div>
+<div class="line"><a name="l00584"></a><span class="lineno">  584</span>       cout << <span class="stringliteral">"connection_opt[0]: "</span> << connection_opt[0] << std::endl;</div>
+<div class="line"><a name="l00585"></a><span class="lineno">  585</span>       cout << <span class="stringliteral">"num_layers: "</span> << num_layers << std::endl;</div>
+<div class="line"><a name="l00586"></a><span class="lineno">  586</span>       cout << <span class="stringliteral">"nFeatures: "</span> << nFeatures << std::endl;</div>
+<div class="line"><a name="l00587"></a><span class="lineno">  587</span>       cout << <span class="stringliteral">"nneuron_opt[0]: "</span> << nneuron_opt[0] << std::endl;</div>
+<div class="line"><a name="l00588"></a><span class="lineno">  588</span>       cout << <span class="stringliteral">"number of classes (nclass): "</span> << nclass << std::endl;</div>
+<div class="line"><a name="l00589"></a><span class="lineno">  589</span>     }</div>
+<div class="line"><a name="l00590"></a><span class="lineno">  590</span>     <span class="keywordflow">switch</span>(num_layers){</div>
+<div class="line"><a name="l00591"></a><span class="lineno">  591</span>     <span class="keywordflow">case</span>(3):{</div>
+<div class="line"><a name="l00592"></a><span class="lineno">  592</span>       <span class="comment">// net[ibag].create_sparse(connection_opt[0],num_layers, nFeatures, nneuron_opt[0], nclass);//replace all create_sparse with create_sparse_array due to bug in FANN!</span></div>
+<div class="line"><a name="l00593"></a><span class="lineno">  593</span>       <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> layers[3];</div>
+<div class="line"><a name="l00594"></a><span class="lineno">  594</span>       layers[0]=nFeatures;</div>
+<div class="line"><a name="l00595"></a><span class="lineno">  595</span>       layers[1]=nneuron_opt[0];</div>
+<div class="line"><a name="l00596"></a><span class="lineno">  596</span>       layers[2]=nclass;</div>
+<div class="line"><a name="l00597"></a><span class="lineno">  597</span>       net[ibag].create_sparse_array(connection_opt[0],num_layers,layers);</div>
+<div class="line"><a name="l00598"></a><span class="lineno">  598</span>       <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l00599"></a><span class="lineno">  599</span>     }</div>
+<div class="line"><a name="l00600"></a><span class="lineno">  600</span>     <span class="keywordflow">case</span>(4):{</div>
+<div class="line"><a name="l00601"></a><span class="lineno">  601</span>       <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> layers[4];</div>
+<div class="line"><a name="l00602"></a><span class="lineno">  602</span>       layers[0]=nFeatures;</div>
+<div class="line"><a name="l00603"></a><span class="lineno">  603</span>       layers[1]=nneuron_opt[0];</div>
+<div class="line"><a name="l00604"></a><span class="lineno">  604</span>       layers[2]=nneuron_opt[1];</div>
+<div class="line"><a name="l00605"></a><span class="lineno">  605</span>       layers[3]=nclass;</div>
+<div class="line"><a name="l00606"></a><span class="lineno">  606</span>       <span class="comment">// layers.push_back(nFeatures);</span></div>
+<div class="line"><a name="l00607"></a><span class="lineno">  607</span>       <span class="comment">// for(int ihidden=0;ihidden<nneuron_opt.size();++ihidden)</span></div>
+<div class="line"><a name="l00608"></a><span class="lineno">  608</span>       <span class="comment">//    layers.push_back(nneuron_opt[ihidden]);</span></div>
+<div class="line"><a name="l00609"></a><span class="lineno">  609</span>       <span class="comment">// layers.push_back(nclass);</span></div>
+<div class="line"><a name="l00610"></a><span class="lineno">  610</span>       net[ibag].create_sparse_array(connection_opt[0],num_layers,layers);</div>
+<div class="line"><a name="l00611"></a><span class="lineno">  611</span>       <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l00612"></a><span class="lineno">  612</span>     }</div>
+<div class="line"><a name="l00613"></a><span class="lineno">  613</span>     <span class="keywordflow">default</span>:</div>
+<div class="line"><a name="l00614"></a><span class="lineno">  614</span>       cerr << <span class="stringliteral">"Only 1 or 2 hidden layers are supported!"</span> << endl;</div>
+<div class="line"><a name="l00615"></a><span class="lineno">  615</span>       exit(1);</div>
+<div class="line"><a name="l00616"></a><span class="lineno">  616</span>       <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l00617"></a><span class="lineno">  617</span>     }</div>
+<div class="line"><a name="l00618"></a><span class="lineno">  618</span>     <span class="keywordflow">if</span>(verbose_opt[0]>=1)</div>
+<div class="line"><a name="l00619"></a><span class="lineno">  619</span>       cout << <span class="stringliteral">"network created"</span> << endl;</div>
+<div class="line"><a name="l00620"></a><span class="lineno">  620</span>   </div>
+<div class="line"><a name="l00621"></a><span class="lineno">  621</span>     net[ibag].set_learning_rate(learning_opt[0]);</div>
+<div class="line"><a name="l00622"></a><span class="lineno">  622</span> </div>
+<div class="line"><a name="l00623"></a><span class="lineno">  623</span>     <span class="comment">//   net.set_activation_steepness_hidden(1.0);</span></div>
+<div class="line"><a name="l00624"></a><span class="lineno">  624</span>     <span class="comment">//   net.set_activation_steepness_output(1.0);</span></div>
+<div class="line"><a name="l00625"></a><span class="lineno">  625</span>     </div>
+<div class="line"><a name="l00626"></a><span class="lineno">  626</span>     net[ibag].set_activation_function_hidden(FANN::SIGMOID_SYMMETRIC_STEPWISE);</div>
+<div class="line"><a name="l00627"></a><span class="lineno">  627</span>     net[ibag].set_activation_function_output(FANN::SIGMOID_SYMMETRIC_STEPWISE);</div>
 <div class="line"><a name="l00628"></a><span class="lineno">  628</span> </div>
-<div class="line"><a name="l00629"></a><span class="lineno">  629</span>     <span class="keywordflow">if</span>(verbose_opt[0]>=1)</div>
-<div class="line"><a name="l00630"></a><span class="lineno">  630</span>       cout << endl << <span class="stringliteral">"Training network"</span> << endl;</div>
-<div class="line"><a name="l00631"></a><span class="lineno">  631</span>     </div>
-<div class="line"><a name="l00632"></a><span class="lineno">  632</span>     <span class="keywordflow">if</span>(verbose_opt[0]>=1){</div>
-<div class="line"><a name="l00633"></a><span class="lineno">  633</span>       cout << <span class="stringliteral">"Max Epochs "</span> << setw(8) << maxit_opt[0] << <span class="stringliteral">". "</span></div>
-<div class="line"><a name="l00634"></a><span class="lineno">  634</span>            << <span class="stringliteral">"Desired Error: "</span> << left << desired_error << right << endl;</div>
-<div class="line"><a name="l00635"></a><span class="lineno">  635</span>     }</div>
-<div class="line"><a name="l00636"></a><span class="lineno">  636</span>     <span class="keywordflow">if</span>(weights_opt.size()==net[ibag].get_total_connections()){<span class="comment">//no new training needed (same training sample)</span></div>
-<div class="line"><a name="l00637"></a><span class="lineno">  637</span>       vector<fann_connection> convector;</div>
-<div class="line"><a name="l00638"></a><span class="lineno">  638</span>       net[ibag].get_connection_array(convector);</div>
-<div class="line"><a name="l00639"></a><span class="lineno">  639</span>       <span class="keywordflow">for</span>(<span class="keywordtype">int</span> i_connection=0;i_connection<net[ibag].get_total_connections();++i_connection)</div>
-<div class="line"><a name="l00640"></a><span class="lineno">  640</span>         convector[i_connection].weight=weights_opt[i_connection];</div>
-<div class="line"><a name="l00641"></a><span class="lineno">  641</span>       net[ibag].set_weight_array(convector);</div>
-<div class="line"><a name="l00642"></a><span class="lineno">  642</span>     }</div>
-<div class="line"><a name="l00643"></a><span class="lineno">  643</span>     <span class="keywordflow">else</span>{</div>
-<div class="line"><a name="l00644"></a><span class="lineno">  644</span>       <span class="keywordtype">bool</span> initWeights=<span class="keyword">true</span>;</div>
-<div class="line"><a name="l00645"></a><span class="lineno">  645</span>       net[ibag].train_on_data(trainingFeatures,ntraining,initWeights, maxit_opt[0],</div>
-<div class="line"><a name="l00646"></a><span class="lineno">  646</span>                               iterations_between_reports, desired_error);</div>
-<div class="line"><a name="l00647"></a><span class="lineno">  647</span>     }</div>
-<div class="line"><a name="l00648"></a><span class="lineno">  648</span> </div>
-<div class="line"><a name="l00649"></a><span class="lineno">  649</span> </div>
-<div class="line"><a name="l00650"></a><span class="lineno">  650</span>     <span class="keywordflow">if</span>(verbose_opt[0]>=2){</div>
-<div class="line"><a name="l00651"></a><span class="lineno">  651</span>       net[ibag].print_connections();</div>
-<div class="line"><a name="l00652"></a><span class="lineno">  652</span>       vector<fann_connection> convector;</div>
-<div class="line"><a name="l00653"></a><span class="lineno">  653</span>       net[ibag].get_connection_array(convector);</div>
-<div class="line"><a name="l00654"></a><span class="lineno">  654</span>       <span class="keywordflow">for</span>(<span class="keywordtype">int</span> i_connection=0;i_connection<net[ibag].get_total_connections();++i_connection)</div>
-<div class="line"><a name="l00655"></a><span class="lineno">  655</span>         cout << <span class="stringliteral">"connection "</span> << i_connection << <span class="stringliteral">": "</span> << convector[i_connection].weight << endl;</div>
-<div class="line"><a name="l00656"></a><span class="lineno">  656</span> </div>
-<div class="line"><a name="l00657"></a><span class="lineno">  657</span>     }</div>
-<div class="line"><a name="l00658"></a><span class="lineno">  658</span>   }<span class="comment">//for ibag</span></div>
-<div class="line"><a name="l00659"></a><span class="lineno">  659</span>   <span class="keywordflow">if</span>(cv_opt[0]>1){</div>
-<div class="line"><a name="l00660"></a><span class="lineno">  660</span>     assert(cm.nReference());</div>
-<div class="line"><a name="l00661"></a><span class="lineno">  661</span>     cm.setFormat(cmformat_opt[0]);</div>
-<div class="line"><a name="l00662"></a><span class="lineno">  662</span>     cm.reportSE95(<span class="keyword">false</span>);</div>
-<div class="line"><a name="l00663"></a><span class="lineno">  663</span>     std::cout << cm << std::endl;</div>
-<div class="line"><a name="l00664"></a><span class="lineno">  664</span>     cout << <span class="stringliteral">"class #samples userAcc prodAcc"</span> << endl;</div>
-<div class="line"><a name="l00665"></a><span class="lineno">  665</span>     <span class="keywordtype">double</span> se95_ua=0;</div>
-<div class="line"><a name="l00666"></a><span class="lineno">  666</span>     <span class="keywordtype">double</span> se95_pa=0;</div>
-<div class="line"><a name="l00667"></a><span class="lineno">  667</span>     <span class="keywordtype">double</span> se95_oa=0;</div>
-<div class="line"><a name="l00668"></a><span class="lineno">  668</span>     <span class="keywordtype">double</span> dua=0;</div>
-<div class="line"><a name="l00669"></a><span class="lineno">  669</span>     <span class="keywordtype">double</span> dpa=0;</div>
-<div class="line"><a name="l00670"></a><span class="lineno">  670</span>     <span class="keywordtype">double</span> doa=0;</div>
-<div class="line"><a name="l00671"></a><span class="lineno">  671</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iclass=0;iclass<cm.nClasses();++iclass){</div>
-<div class="line"><a name="l00672"></a><span class="lineno">  672</span>       dua=cm.ua_pct(cm.getClass(iclass),&se95_ua);</div>
-<div class="line"><a name="l00673"></a><span class="lineno">  673</span>       dpa=cm.pa_pct(cm.getClass(iclass),&se95_pa);</div>
-<div class="line"><a name="l00674"></a><span class="lineno">  674</span>       cout << cm.getClass(iclass) << <span class="stringliteral">" "</span> << cm.nReference(cm.getClass(iclass)) << <span class="stringliteral">" "</span> << dua << <span class="stringliteral">" ("</span> << se95_ua << <span class="stringliteral">")"</span> << <span class="stringliteral">" "</span> <<  [...]
-<div class="line"><a name="l00675"></a><span class="lineno">  675</span>     }</div>
-<div class="line"><a name="l00676"></a><span class="lineno">  676</span>     std::cout << <span class="stringliteral">"Kappa: "</span> << cm.kappa() << std::endl;</div>
-<div class="line"><a name="l00677"></a><span class="lineno">  677</span>     doa=cm.oa_pct(&se95_oa);</div>
-<div class="line"><a name="l00678"></a><span class="lineno">  678</span>     std::cout << <span class="stringliteral">"Overall Accuracy: "</span> << doa << <span class="stringliteral">" ("</span> << se95_oa << <span class="stringliteral">")"</span>  << std::endl;</div>
-<div class="line"><a name="l00679"></a><span class="lineno">  679</span>   }</div>
-<div class="line"><a name="l00680"></a><span class="lineno">  680</span>   <span class="comment">//--------------------------------- end of training -----------------------------------</span></div>
-<div class="line"><a name="l00681"></a><span class="lineno">  681</span>   <span class="keywordflow">if</span>(input_opt.empty())</div>
-<div class="line"><a name="l00682"></a><span class="lineno">  682</span>     exit(0);</div>
-<div class="line"><a name="l00683"></a><span class="lineno">  683</span> </div>
-<div class="line"><a name="l00684"></a><span class="lineno">  684</span>     <span class="keyword">const</span> <span class="keywordtype">char</span>* pszMessage;</div>
-<div class="line"><a name="l00685"></a><span class="lineno">  685</span>     <span class="keywordtype">void</span>* pProgressArg=NULL;</div>
-<div class="line"><a name="l00686"></a><span class="lineno">  686</span>     GDALProgressFunc pfnProgress=GDALTermProgress;</div>
-<div class="line"><a name="l00687"></a><span class="lineno">  687</span>     <span class="keywordtype">float</span> progress=0;</div>
-<div class="line"><a name="l00688"></a><span class="lineno">  688</span>   <span class="comment">//-------------------------------- open image file ------------------------------------</span></div>
-<div class="line"><a name="l00689"></a><span class="lineno">  689</span>   <span class="keywordtype">bool</span> inputIsRaster=<span class="keyword">false</span>;</div>
-<div class="line"><a name="l00690"></a><span class="lineno">  690</span>   <a class="code" href="classImgReaderOgr.html">ImgReaderOgr</a> imgReaderOgr;</div>
-<div class="line"><a name="l00691"></a><span class="lineno">  691</span>   <span class="keywordflow">try</span>{</div>
-<div class="line"><a name="l00692"></a><span class="lineno">  692</span>     imgReaderOgr.open(input_opt[0]);</div>
-<div class="line"><a name="l00693"></a><span class="lineno">  693</span>     imgReaderOgr.close();</div>
-<div class="line"><a name="l00694"></a><span class="lineno">  694</span>   }</div>
-<div class="line"><a name="l00695"></a><span class="lineno">  695</span>   <span class="keywordflow">catch</span>(<span class="keywordtype">string</span> errorString){</div>
-<div class="line"><a name="l00696"></a><span class="lineno">  696</span>     inputIsRaster=<span class="keyword">true</span>;</div>
-<div class="line"><a name="l00697"></a><span class="lineno">  697</span>   }</div>
-<div class="line"><a name="l00698"></a><span class="lineno">  698</span>   <span class="keywordflow">if</span>(inputIsRaster){</div>
-<div class="line"><a name="l00699"></a><span class="lineno">  699</span>   <span class="comment">// if(input_opt[0].find(".shp")==string::npos){</span></div>
-<div class="line"><a name="l00700"></a><span class="lineno">  700</span>     <a class="code" href="classImgReaderGdal.html">ImgReaderGdal</a> testImage;</div>
-<div class="line"><a name="l00701"></a><span class="lineno">  701</span>     <span class="keywordflow">try</span>{</div>
-<div class="line"><a name="l00702"></a><span class="lineno">  702</span>       <span class="keywordflow">if</span>(verbose_opt[0]>=1)</div>
-<div class="line"><a name="l00703"></a><span class="lineno">  703</span>         cout << <span class="stringliteral">"opening image "</span> << input_opt[0] << endl; </div>
-<div class="line"><a name="l00704"></a><span class="lineno">  704</span>       testImage.open(input_opt[0]);</div>
+<div class="line"><a name="l00629"></a><span class="lineno">  629</span>     <span class="comment">// Set additional properties such as the training algorithm</span></div>
+<div class="line"><a name="l00630"></a><span class="lineno">  630</span>     <span class="comment">//   net.set_training_algorithm(FANN::TRAIN_QUICKPROP);</span></div>
+<div class="line"><a name="l00631"></a><span class="lineno">  631</span> </div>
+<div class="line"><a name="l00632"></a><span class="lineno">  632</span>     <span class="comment">// Output network type and parameters</span></div>
+<div class="line"><a name="l00633"></a><span class="lineno">  633</span>     <span class="keywordflow">if</span>(verbose_opt[0]>=1){</div>
+<div class="line"><a name="l00634"></a><span class="lineno">  634</span>       cout << endl << <span class="stringliteral">"Network Type                         :  "</span>;</div>
+<div class="line"><a name="l00635"></a><span class="lineno">  635</span>       <span class="keywordflow">switch</span> (net[ibag].get_network_type())</div>
+<div class="line"><a name="l00636"></a><span class="lineno">  636</span>         {</div>
+<div class="line"><a name="l00637"></a><span class="lineno">  637</span>         <span class="keywordflow">case</span> FANN::LAYER:</div>
+<div class="line"><a name="l00638"></a><span class="lineno">  638</span>           cout << <span class="stringliteral">"LAYER"</span> << endl;</div>
+<div class="line"><a name="l00639"></a><span class="lineno">  639</span>           <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l00640"></a><span class="lineno">  640</span>         <span class="keywordflow">case</span> FANN::SHORTCUT:</div>
+<div class="line"><a name="l00641"></a><span class="lineno">  641</span>           cout << <span class="stringliteral">"SHORTCUT"</span> << endl;</div>
+<div class="line"><a name="l00642"></a><span class="lineno">  642</span>           <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l00643"></a><span class="lineno">  643</span>         <span class="keywordflow">default</span>:</div>
+<div class="line"><a name="l00644"></a><span class="lineno">  644</span>           cout << <span class="stringliteral">"UNKNOWN"</span> << endl;</div>
+<div class="line"><a name="l00645"></a><span class="lineno">  645</span>           <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l00646"></a><span class="lineno">  646</span>         }</div>
+<div class="line"><a name="l00647"></a><span class="lineno">  647</span>       net[ibag].print_parameters();</div>
+<div class="line"><a name="l00648"></a><span class="lineno">  648</span>     }</div>
+<div class="line"><a name="l00649"></a><span class="lineno">  649</span>       </div>
+<div class="line"><a name="l00650"></a><span class="lineno">  650</span>     <span class="keywordflow">if</span>(cv_opt[0]>1){</div>
+<div class="line"><a name="l00651"></a><span class="lineno">  651</span>       <span class="keywordflow">if</span>(verbose_opt[0])</div>
+<div class="line"><a name="l00652"></a><span class="lineno">  652</span>         std::cout << <span class="stringliteral">"cross validation"</span> << std::endl;</div>
+<div class="line"><a name="l00653"></a><span class="lineno">  653</span>       vector<unsigned short> referenceVector;</div>
+<div class="line"><a name="l00654"></a><span class="lineno">  654</span>       vector<unsigned short> outputVector;</div>
+<div class="line"><a name="l00655"></a><span class="lineno">  655</span>       <span class="keywordtype">float</span> rmse=net[ibag].cross_validation(trainingFeatures,</div>
+<div class="line"><a name="l00656"></a><span class="lineno">  656</span>                                             ntraining,</div>
+<div class="line"><a name="l00657"></a><span class="lineno">  657</span>                                             cv_opt[0],</div>
+<div class="line"><a name="l00658"></a><span class="lineno">  658</span>                                             maxit_opt[0],</div>
+<div class="line"><a name="l00659"></a><span class="lineno">  659</span>                                             desired_error,</div>
+<div class="line"><a name="l00660"></a><span class="lineno">  660</span>                                             referenceVector,</div>
+<div class="line"><a name="l00661"></a><span class="lineno">  661</span>                                             outputVector,</div>
+<div class="line"><a name="l00662"></a><span class="lineno">  662</span>                                             verbose_opt[0]);</div>
+<div class="line"><a name="l00663"></a><span class="lineno">  663</span>       map<string,Vector2d<float> >::iterator mapit=trainingMap.begin();</div>
+<div class="line"><a name="l00664"></a><span class="lineno">  664</span>       <span class="keywordflow">for</span>(<span class="keywordtype">int</span> isample=0;isample<referenceVector.size();++isample){</div>
+<div class="line"><a name="l00665"></a><span class="lineno">  665</span>     <span class="keywordtype">string</span> refClassName=nameVector[referenceVector[isample]];</div>
+<div class="line"><a name="l00666"></a><span class="lineno">  666</span>     <span class="keywordtype">string</span> className=nameVector[outputVector[isample]];</div>
+<div class="line"><a name="l00667"></a><span class="lineno">  667</span>     <span class="keywordflow">if</span>(classValueMap.size())</div>
+<div class="line"><a name="l00668"></a><span class="lineno">  668</span>       cm.incrementResult(type2string<short>(classValueMap[refClassName]),type2string<short>(classValueMap[className]),1.0/nbag);</div>
+<div class="line"><a name="l00669"></a><span class="lineno">  669</span>     <span class="keywordflow">else</span></div>
+<div class="line"><a name="l00670"></a><span class="lineno">  670</span>       cm.incrementResult(cm.getClass(referenceVector[isample]),cm.getClass(outputVector[isample]),1.0/nbag);</div>
+<div class="line"><a name="l00671"></a><span class="lineno">  671</span>       }        </div>
+<div class="line"><a name="l00672"></a><span class="lineno">  672</span>     }</div>
+<div class="line"><a name="l00673"></a><span class="lineno">  673</span>   </div>
+<div class="line"><a name="l00674"></a><span class="lineno">  674</span>     <span class="keywordflow">if</span>(verbose_opt[0]>=1)</div>
+<div class="line"><a name="l00675"></a><span class="lineno">  675</span>       cout << endl << <span class="stringliteral">"Set training data"</span> << endl;</div>
+<div class="line"><a name="l00676"></a><span class="lineno">  676</span> </div>
+<div class="line"><a name="l00677"></a><span class="lineno">  677</span>     <span class="keywordflow">if</span>(verbose_opt[0]>=1)</div>
+<div class="line"><a name="l00678"></a><span class="lineno">  678</span>       cout << endl << <span class="stringliteral">"Training network"</span> << endl;</div>
+<div class="line"><a name="l00679"></a><span class="lineno">  679</span>     </div>
+<div class="line"><a name="l00680"></a><span class="lineno">  680</span>     <span class="keywordflow">if</span>(verbose_opt[0]>=1){</div>
+<div class="line"><a name="l00681"></a><span class="lineno">  681</span>       cout << <span class="stringliteral">"Max Epochs "</span> << setw(8) << maxit_opt[0] << <span class="stringliteral">". "</span></div>
+<div class="line"><a name="l00682"></a><span class="lineno">  682</span>            << <span class="stringliteral">"Desired Error: "</span> << left << desired_error << right << endl;</div>
+<div class="line"><a name="l00683"></a><span class="lineno">  683</span>     }</div>
+<div class="line"><a name="l00684"></a><span class="lineno">  684</span>     <span class="keywordflow">if</span>(weights_opt.size()==net[ibag].get_total_connections()){<span class="comment">//no new training needed (same training sample)</span></div>
+<div class="line"><a name="l00685"></a><span class="lineno">  685</span>       vector<fann_connection> convector;</div>
+<div class="line"><a name="l00686"></a><span class="lineno">  686</span>       net[ibag].get_connection_array(convector);</div>
+<div class="line"><a name="l00687"></a><span class="lineno">  687</span>       <span class="keywordflow">for</span>(<span class="keywordtype">int</span> i_connection=0;i_connection<net[ibag].get_total_connections();++i_connection)</div>
+<div class="line"><a name="l00688"></a><span class="lineno">  688</span>         convector[i_connection].weight=weights_opt[i_connection];</div>
+<div class="line"><a name="l00689"></a><span class="lineno">  689</span>       net[ibag].set_weight_array(convector);</div>
+<div class="line"><a name="l00690"></a><span class="lineno">  690</span>     }</div>
+<div class="line"><a name="l00691"></a><span class="lineno">  691</span>     <span class="keywordflow">else</span>{</div>
+<div class="line"><a name="l00692"></a><span class="lineno">  692</span>       <span class="keywordtype">bool</span> initWeights=<span class="keyword">true</span>;</div>
+<div class="line"><a name="l00693"></a><span class="lineno">  693</span>       net[ibag].train_on_data(trainingFeatures,ntraining,initWeights, maxit_opt[0],</div>
+<div class="line"><a name="l00694"></a><span class="lineno">  694</span>                               iterations_between_reports, desired_error);</div>
+<div class="line"><a name="l00695"></a><span class="lineno">  695</span>     }</div>
+<div class="line"><a name="l00696"></a><span class="lineno">  696</span> </div>
+<div class="line"><a name="l00697"></a><span class="lineno">  697</span> </div>
+<div class="line"><a name="l00698"></a><span class="lineno">  698</span>     <span class="keywordflow">if</span>(verbose_opt[0]>=2){</div>
+<div class="line"><a name="l00699"></a><span class="lineno">  699</span>       net[ibag].print_connections();</div>
+<div class="line"><a name="l00700"></a><span class="lineno">  700</span>       vector<fann_connection> convector;</div>
+<div class="line"><a name="l00701"></a><span class="lineno">  701</span>       net[ibag].get_connection_array(convector);</div>
+<div class="line"><a name="l00702"></a><span class="lineno">  702</span>       <span class="keywordflow">for</span>(<span class="keywordtype">int</span> i_connection=0;i_connection<net[ibag].get_total_connections();++i_connection)</div>
+<div class="line"><a name="l00703"></a><span class="lineno">  703</span>         cout << <span class="stringliteral">"connection "</span> << i_connection << <span class="stringliteral">": "</span> << convector[i_connection].weight << endl;</div>
+<div class="line"><a name="l00704"></a><span class="lineno">  704</span> </div>
 <div class="line"><a name="l00705"></a><span class="lineno">  705</span>     }</div>
-<div class="line"><a name="l00706"></a><span class="lineno">  706</span>     <span class="keywordflow">catch</span>(<span class="keywordtype">string</span> error){</div>
-<div class="line"><a name="l00707"></a><span class="lineno">  707</span>       cerr << error << endl;</div>
-<div class="line"><a name="l00708"></a><span class="lineno">  708</span>       exit(2);</div>
-<div class="line"><a name="l00709"></a><span class="lineno">  709</span>     }</div>
-<div class="line"><a name="l00710"></a><span class="lineno">  710</span>     <a class="code" href="classImgReaderGdal.html">ImgReaderGdal</a> maskReader;</div>
-<div class="line"><a name="l00711"></a><span class="lineno">  711</span>     <span class="keywordflow">if</span>(mask_opt.size()){</div>
-<div class="line"><a name="l00712"></a><span class="lineno">  712</span>       <span class="keywordflow">try</span>{</div>
-<div class="line"><a name="l00713"></a><span class="lineno">  713</span>         <span class="keywordflow">if</span>(verbose_opt[0]>=1)</div>
-<div class="line"><a name="l00714"></a><span class="lineno">  714</span>           std::cout << <span class="stringliteral">"opening mask image file "</span> << mask_opt[0] << std::endl;</div>
-<div class="line"><a name="l00715"></a><span class="lineno">  715</span>         maskReader.open(mask_opt[0]);</div>
-<div class="line"><a name="l00716"></a><span class="lineno">  716</span>       }</div>
-<div class="line"><a name="l00717"></a><span class="lineno">  717</span>       <span class="keywordflow">catch</span>(<span class="keywordtype">string</span> error){</div>
-<div class="line"><a name="l00718"></a><span class="lineno">  718</span>         cerr << error << endl;</div>
-<div class="line"><a name="l00719"></a><span class="lineno">  719</span>         exit(2);</div>
-<div class="line"><a name="l00720"></a><span class="lineno">  720</span>       }</div>
-<div class="line"><a name="l00721"></a><span class="lineno">  721</span>       <span class="keywordflow">catch</span>(...){</div>
-<div class="line"><a name="l00722"></a><span class="lineno">  722</span>         cerr << <span class="stringliteral">"error catched"</span> << endl;</div>
-<div class="line"><a name="l00723"></a><span class="lineno">  723</span>         exit(1);</div>
-<div class="line"><a name="l00724"></a><span class="lineno">  724</span>       }</div>
-<div class="line"><a name="l00725"></a><span class="lineno">  725</span>     }</div>
-<div class="line"><a name="l00726"></a><span class="lineno">  726</span>     <a class="code" href="classImgReaderGdal.html">ImgReaderGdal</a> priorReader;</div>
-<div class="line"><a name="l00727"></a><span class="lineno">  727</span>     <span class="keywordflow">if</span>(priorimg_opt.size()){</div>
-<div class="line"><a name="l00728"></a><span class="lineno">  728</span>       <span class="keywordflow">try</span>{</div>
-<div class="line"><a name="l00729"></a><span class="lineno">  729</span>     <span class="keywordflow">if</span>(verbose_opt[0]>=1)</div>
-<div class="line"><a name="l00730"></a><span class="lineno">  730</span>           std::cout << <span class="stringliteral">"opening prior image "</span> << priorimg_opt[0] << std::endl;</div>
-<div class="line"><a name="l00731"></a><span class="lineno">  731</span>         priorReader.open(priorimg_opt[0]);</div>
-<div class="line"><a name="l00732"></a><span class="lineno">  732</span>         assert(priorReader.nrOfCol()==testImage.nrOfCol());</div>
-<div class="line"><a name="l00733"></a><span class="lineno">  733</span>         assert(priorReader.nrOfRow()==testImage.nrOfRow());</div>
-<div class="line"><a name="l00734"></a><span class="lineno">  734</span>       }</div>
-<div class="line"><a name="l00735"></a><span class="lineno">  735</span>       <span class="keywordflow">catch</span>(<span class="keywordtype">string</span> error){</div>
-<div class="line"><a name="l00736"></a><span class="lineno">  736</span>         cerr << error << std::endl;</div>
-<div class="line"><a name="l00737"></a><span class="lineno">  737</span>         exit(2);</div>
-<div class="line"><a name="l00738"></a><span class="lineno">  738</span>       }</div>
-<div class="line"><a name="l00739"></a><span class="lineno">  739</span>       <span class="keywordflow">catch</span>(...){</div>
-<div class="line"><a name="l00740"></a><span class="lineno">  740</span>         cerr << <span class="stringliteral">"error catched"</span> << std::endl;</div>
-<div class="line"><a name="l00741"></a><span class="lineno">  741</span>         exit(1);</div>
-<div class="line"><a name="l00742"></a><span class="lineno">  742</span>       }</div>
-<div class="line"><a name="l00743"></a><span class="lineno">  743</span>     }</div>
-<div class="line"><a name="l00744"></a><span class="lineno">  744</span> </div>
-<div class="line"><a name="l00745"></a><span class="lineno">  745</span>     <span class="keywordtype">int</span> nrow=testImage.nrOfRow();</div>
-<div class="line"><a name="l00746"></a><span class="lineno">  746</span>     <span class="keywordtype">int</span> ncol=testImage.nrOfCol();</div>
-<div class="line"><a name="l00747"></a><span class="lineno">  747</span>     <span class="keywordflow">if</span>(option_opt.findSubstring(<span class="stringliteral">"INTERLEAVE="</span>)==option_opt.end()){</div>
-<div class="line"><a name="l00748"></a><span class="lineno">  748</span>       <span class="keywordtype">string</span> theInterleave=<span class="stringliteral">"INTERLEAVE="</span>;</div>
-<div class="line"><a name="l00749"></a><span class="lineno">  749</span>       theInterleave+=testImage.getInterleave();</div>
-<div class="line"><a name="l00750"></a><span class="lineno">  750</span>       option_opt.push_back(theInterleave);</div>
-<div class="line"><a name="l00751"></a><span class="lineno">  751</span>     }</div>
-<div class="line"><a name="l00752"></a><span class="lineno">  752</span>     vector<char> classOut(ncol);<span class="comment">//classified line for writing to image file</span></div>
-<div class="line"><a name="l00753"></a><span class="lineno">  753</span> </div>
-<div class="line"><a name="l00754"></a><span class="lineno">  754</span>     <span class="comment">//   assert(nband==testImage.nrOfBand());</span></div>
-<div class="line"><a name="l00755"></a><span class="lineno">  755</span>     <a class="code" href="classImgWriterGdal.html">ImgWriterGdal</a> classImageBag;</div>
-<div class="line"><a name="l00756"></a><span class="lineno">  756</span>     <a class="code" href="classImgWriterGdal.html">ImgWriterGdal</a> classImageOut;</div>
-<div class="line"><a name="l00757"></a><span class="lineno">  757</span>     <a class="code" href="classImgWriterGdal.html">ImgWriterGdal</a> probImage;</div>
-<div class="line"><a name="l00758"></a><span class="lineno">  758</span>     <a class="code" href="classImgWriterGdal.html">ImgWriterGdal</a> entropyImage;</div>
-<div class="line"><a name="l00759"></a><span class="lineno">  759</span> </div>
-<div class="line"><a name="l00760"></a><span class="lineno">  760</span>     <span class="keywordtype">string</span> imageType=testImage.getImageType();</div>
-<div class="line"><a name="l00761"></a><span class="lineno">  761</span>     <span class="keywordflow">if</span>(oformat_opt.size())<span class="comment">//default</span></div>
-<div class="line"><a name="l00762"></a><span class="lineno">  762</span>       imageType=oformat_opt[0];</div>
-<div class="line"><a name="l00763"></a><span class="lineno">  763</span>     <span class="keywordflow">try</span>{</div>
-<div class="line"><a name="l00764"></a><span class="lineno">  764</span> </div>
-<div class="line"><a name="l00765"></a><span class="lineno">  765</span>       <span class="keywordflow">if</span>(verbose_opt[0]>=1)</div>
-<div class="line"><a name="l00766"></a><span class="lineno">  766</span>         cout << <span class="stringliteral">"opening class image for writing output "</span> << output_opt[0] << endl;</div>
-<div class="line"><a name="l00767"></a><span class="lineno">  767</span>       <span class="keywordflow">if</span>(classBag_opt.size()){</div>
-<div class="line"><a name="l00768"></a><span class="lineno">  768</span>         classImageBag.open(classBag_opt[0],ncol,nrow,nbag,GDT_Byte,imageType,option_opt);</div>
-<div class="line"><a name="l00769"></a><span class="lineno">  769</span>     classImageBag.GDALSetNoDataValue(nodata_opt[0]);</div>
-<div class="line"><a name="l00770"></a><span class="lineno">  770</span>         classImageBag.copyGeoTransform(testImage);</div>
-<div class="line"><a name="l00771"></a><span class="lineno">  771</span>         classImageBag.setProjection(testImage.getProjection());</div>
-<div class="line"><a name="l00772"></a><span class="lineno">  772</span>       }</div>
-<div class="line"><a name="l00773"></a><span class="lineno">  773</span>       classImageOut.open(output_opt[0],ncol,nrow,1,GDT_Byte,imageType,option_opt);</div>
-<div class="line"><a name="l00774"></a><span class="lineno">  774</span>       classImageOut.GDALSetNoDataValue(nodata_opt[0]);</div>
-<div class="line"><a name="l00775"></a><span class="lineno">  775</span>       classImageOut.copyGeoTransform(testImage);</div>
-<div class="line"><a name="l00776"></a><span class="lineno">  776</span>       classImageOut.setProjection(testImage.getProjection());</div>
-<div class="line"><a name="l00777"></a><span class="lineno">  777</span>       <span class="keywordflow">if</span>(colorTable_opt.size())</div>
-<div class="line"><a name="l00778"></a><span class="lineno">  778</span>         classImageOut.setColorTable(colorTable_opt[0],0);</div>
-<div class="line"><a name="l00779"></a><span class="lineno">  779</span>       <span class="keywordflow">if</span>(prob_opt.size()){</div>
-<div class="line"><a name="l00780"></a><span class="lineno">  780</span>         probImage.open(prob_opt[0],ncol,nrow,nclass,GDT_Byte,imageType,option_opt);</div>
-<div class="line"><a name="l00781"></a><span class="lineno">  781</span>     probImage.GDALSetNoDataValue(nodata_opt[0]);</div>
-<div class="line"><a name="l00782"></a><span class="lineno">  782</span>         probImage.copyGeoTransform(testImage);</div>
-<div class="line"><a name="l00783"></a><span class="lineno">  783</span>         probImage.setProjection(testImage.getProjection());</div>
-<div class="line"><a name="l00784"></a><span class="lineno">  784</span>       }</div>
-<div class="line"><a name="l00785"></a><span class="lineno">  785</span>       <span class="keywordflow">if</span>(entropy_opt.size()){</div>
-<div class="line"><a name="l00786"></a><span class="lineno">  786</span>         entropyImage.open(entropy_opt[0],ncol,nrow,1,GDT_Byte,imageType,option_opt);</div>
-<div class="line"><a name="l00787"></a><span class="lineno">  787</span>     entropyImage.GDALSetNoDataValue(nodata_opt[0]);</div>
-<div class="line"><a name="l00788"></a><span class="lineno">  788</span>         entropyImage.copyGeoTransform(testImage);</div>
-<div class="line"><a name="l00789"></a><span class="lineno">  789</span>         entropyImage.setProjection(testImage.getProjection());</div>
-<div class="line"><a name="l00790"></a><span class="lineno">  790</span>       }</div>
-<div class="line"><a name="l00791"></a><span class="lineno">  791</span>     }</div>
-<div class="line"><a name="l00792"></a><span class="lineno">  792</span>     <span class="keywordflow">catch</span>(<span class="keywordtype">string</span> error){</div>
-<div class="line"><a name="l00793"></a><span class="lineno">  793</span>       cerr << error << endl;</div>
-<div class="line"><a name="l00794"></a><span class="lineno">  794</span>     }</div>
-<div class="line"><a name="l00795"></a><span class="lineno">  795</span>   </div>
-<div class="line"><a name="l00796"></a><span class="lineno">  796</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iline=0;iline<nrow;++iline){</div>
-<div class="line"><a name="l00797"></a><span class="lineno">  797</span>       vector<float> buffer(ncol);</div>
-<div class="line"><a name="l00798"></a><span class="lineno">  798</span>       vector<short> lineMask;</div>
-<div class="line"><a name="l00799"></a><span class="lineno">  799</span>       <span class="keywordflow">if</span>(mask_opt.size())</div>
-<div class="line"><a name="l00800"></a><span class="lineno">  800</span>         lineMask.resize(maskReader.nrOfCol());</div>
-<div class="line"><a name="l00801"></a><span class="lineno">  801</span>       <a class="code" href="classVector2d.html">Vector2d<float></a> linePrior;</div>
-<div class="line"><a name="l00802"></a><span class="lineno">  802</span>       <span class="keywordflow">if</span>(priorimg_opt.size())</div>
-<div class="line"><a name="l00803"></a><span class="lineno">  803</span>      linePrior.resize(nclass,ncol);<span class="comment">//prior prob for each class</span></div>
-<div class="line"><a name="l00804"></a><span class="lineno">  804</span>       <a class="code" href="classVector2d.html">Vector2d<float></a> hpixel(ncol);</div>
-<div class="line"><a name="l00805"></a><span class="lineno">  805</span>       <a class="code" href="classVector2d.html">Vector2d<float></a> fpixel(ncol);</div>
-<div class="line"><a name="l00806"></a><span class="lineno">  806</span>       <a class="code" href="classVector2d.html">Vector2d<float></a> probOut(nclass,ncol);<span class="comment">//posterior prob for each (internal) class</span></div>
-<div class="line"><a name="l00807"></a><span class="lineno">  807</span>       vector<float> entropy(ncol);</div>
-<div class="line"><a name="l00808"></a><span class="lineno">  808</span>       <a class="code" href="classVector2d.html">Vector2d<char></a> classBag;<span class="comment">//classified line for writing to image file</span></div>
-<div class="line"><a name="l00809"></a><span class="lineno">  809</span>       <span class="keywordflow">if</span>(classBag_opt.size())</div>
-<div class="line"><a name="l00810"></a><span class="lineno">  810</span>         classBag.resize(nbag,ncol);</div>
-<div class="line"><a name="l00811"></a><span class="lineno">  811</span>       <span class="comment">//read all bands of all pixels in this line in hline</span></div>
-<div class="line"><a name="l00812"></a><span class="lineno">  812</span>       <span class="keywordflow">try</span>{</div>
-<div class="line"><a name="l00813"></a><span class="lineno">  813</span>         <span class="keywordflow">if</span>(band_opt.size()){</div>
-<div class="line"><a name="l00814"></a><span class="lineno">  814</span>           <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iband=0;iband<band_opt.size();++iband){</div>
-<div class="line"><a name="l00815"></a><span class="lineno">  815</span>             <span class="keywordflow">if</span>(verbose_opt[0]==2)</div>
-<div class="line"><a name="l00816"></a><span class="lineno">  816</span>               std::cout << <span class="stringliteral">"reading band "</span> << band_opt[iband] << std::endl;</div>
-<div class="line"><a name="l00817"></a><span class="lineno">  817</span>             assert(band_opt[iband]>=0);</div>
-<div class="line"><a name="l00818"></a><span class="lineno">  818</span>             assert(band_opt[iband]<testImage.nrOfBand());</div>
-<div class="line"><a name="l00819"></a><span class="lineno">  819</span>             testImage.readData(buffer,GDT_Float32,iline,band_opt[iband]);</div>
-<div class="line"><a name="l00820"></a><span class="lineno">  820</span>             <span class="keywordflow">for</span>(<span class="keywordtype">int</span> icol=0;icol<ncol;++icol)</div>
-<div class="line"><a name="l00821"></a><span class="lineno">  821</span>               hpixel[icol].push_back(buffer[icol]);</div>
-<div class="line"><a name="l00822"></a><span class="lineno">  822</span>           }</div>
-<div class="line"><a name="l00823"></a><span class="lineno">  823</span>         }</div>
-<div class="line"><a name="l00824"></a><span class="lineno">  824</span>         <span class="keywordflow">else</span>{</div>
-<div class="line"><a name="l00825"></a><span class="lineno">  825</span>           <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iband=bstart_opt[0];iband<bstart_opt[0]+nband;++iband){</div>
-<div class="line"><a name="l00826"></a><span class="lineno">  826</span>             <span class="keywordflow">if</span>(verbose_opt[0]==2)</div>
-<div class="line"><a name="l00827"></a><span class="lineno">  827</span>               std::cout << <span class="stringliteral">"reading band "</span> << iband << std::endl;</div>
-<div class="line"><a name="l00828"></a><span class="lineno">  828</span>             assert(iband>=0);</div>
-<div class="line"><a name="l00829"></a><span class="lineno">  829</span>             assert(iband<testImage.nrOfBand());</div>
-<div class="line"><a name="l00830"></a><span class="lineno">  830</span>             testImage.readData(buffer,GDT_Float32,iline,iband);</div>
-<div class="line"><a name="l00831"></a><span class="lineno">  831</span>             <span class="keywordflow">for</span>(<span class="keywordtype">int</span> icol=0;icol<ncol;++icol)</div>
-<div class="line"><a name="l00832"></a><span class="lineno">  832</span>               hpixel[icol].push_back(buffer[icol]);</div>
-<div class="line"><a name="l00833"></a><span class="lineno">  833</span>           }</div>
-<div class="line"><a name="l00834"></a><span class="lineno">  834</span>         }</div>
-<div class="line"><a name="l00835"></a><span class="lineno">  835</span>       }</div>
-<div class="line"><a name="l00836"></a><span class="lineno">  836</span>       <span class="keywordflow">catch</span>(<span class="keywordtype">string</span> theError){</div>
-<div class="line"><a name="l00837"></a><span class="lineno">  837</span>         cerr << <span class="stringliteral">"Error reading "</span> << input_opt[0] << <span class="stringliteral">": "</span> << theError << std::endl;</div>
-<div class="line"><a name="l00838"></a><span class="lineno">  838</span>         exit(3);</div>
-<div class="line"><a name="l00839"></a><span class="lineno">  839</span>       }</div>
-<div class="line"><a name="l00840"></a><span class="lineno">  840</span>       <span class="keywordflow">catch</span>(...){</div>
-<div class="line"><a name="l00841"></a><span class="lineno">  841</span>         cerr << <span class="stringliteral">"error catched"</span> << std::endl;</div>
-<div class="line"><a name="l00842"></a><span class="lineno">  842</span>         exit(3);</div>
-<div class="line"><a name="l00843"></a><span class="lineno">  843</span>       }</div>
-<div class="line"><a name="l00844"></a><span class="lineno">  844</span>       assert(nband==hpixel[0].size());</div>
-<div class="line"><a name="l00845"></a><span class="lineno">  845</span>       <span class="keywordflow">if</span>(verbose_opt[0]==2)</div>
-<div class="line"><a name="l00846"></a><span class="lineno">  846</span>         cout << <span class="stringliteral">"used bands: "</span> << nband << endl;</div>
-<div class="line"><a name="l00847"></a><span class="lineno">  847</span>       <span class="comment">//read prior</span></div>
-<div class="line"><a name="l00848"></a><span class="lineno">  848</span>       <span class="keywordflow">if</span>(priorimg_opt.size()){</div>
-<div class="line"><a name="l00849"></a><span class="lineno">  849</span>         <span class="keywordflow">try</span>{</div>
-<div class="line"><a name="l00850"></a><span class="lineno">  850</span>       <span class="keywordflow">for</span>(<span class="keywordtype">short</span> iclass=0;iclass<nclass;++iclass){</div>
-<div class="line"><a name="l00851"></a><span class="lineno">  851</span>         <span class="keywordflow">if</span>(verbose_opt.size()>1)</div>
-<div class="line"><a name="l00852"></a><span class="lineno">  852</span>           std::cout << <span class="stringliteral">"Reading "</span> << priorimg_opt[0] << <span class="stringliteral">" band "</span> << iclass << <span class="stringliteral">" line "</span> << iline << std::endl;</div>
-<div class="line"><a name="l00853"></a><span class="lineno">  853</span>         priorReader.readData(linePrior[iclass],GDT_Float32,iline,iclass);</div>
-<div class="line"><a name="l00854"></a><span class="lineno">  854</span>       }</div>
-<div class="line"><a name="l00855"></a><span class="lineno">  855</span>         }</div>
-<div class="line"><a name="l00856"></a><span class="lineno">  856</span>         <span class="keywordflow">catch</span>(<span class="keywordtype">string</span> theError){</div>
-<div class="line"><a name="l00857"></a><span class="lineno">  857</span>       std::cerr << <span class="stringliteral">"Error reading "</span> << priorimg_opt[0] << <span class="stringliteral">": "</span> << theError << std::endl;</div>
-<div class="line"><a name="l00858"></a><span class="lineno">  858</span>           exit(3);</div>
-<div class="line"><a name="l00859"></a><span class="lineno">  859</span>         }</div>
-<div class="line"><a name="l00860"></a><span class="lineno">  860</span>         <span class="keywordflow">catch</span>(...){</div>
-<div class="line"><a name="l00861"></a><span class="lineno">  861</span>           cerr << <span class="stringliteral">"error catched"</span> << std::endl;</div>
-<div class="line"><a name="l00862"></a><span class="lineno">  862</span>           exit(3);</div>
-<div class="line"><a name="l00863"></a><span class="lineno">  863</span>         }</div>
-<div class="line"><a name="l00864"></a><span class="lineno">  864</span>       }</div>
-<div class="line"><a name="l00865"></a><span class="lineno">  865</span>       <span class="keywordtype">double</span> oldRowMask=-1;<span class="comment">//keep track of row mask to optimize number of line readings</span></div>
-<div class="line"><a name="l00866"></a><span class="lineno">  866</span>       <span class="comment">//process per pixel</span></div>
-<div class="line"><a name="l00867"></a><span class="lineno">  867</span>       <span class="keywordflow">for</span>(<span class="keywordtype">int</span> icol=0;icol<ncol;++icol){</div>
-<div class="line"><a name="l00868"></a><span class="lineno">  868</span>         assert(hpixel[icol].size()==nband);</div>
-<div class="line"><a name="l00869"></a><span class="lineno">  869</span>         <span class="keywordtype">bool</span> masked=<span class="keyword">false</span>;</div>
-<div class="line"><a name="l00870"></a><span class="lineno">  870</span>         <span class="keywordflow">if</span>(mask_opt.size()){</div>
-<div class="line"><a name="l00871"></a><span class="lineno">  871</span>       <span class="comment">//read mask</span></div>
-<div class="line"><a name="l00872"></a><span class="lineno">  872</span>       <span class="keywordtype">double</span> colMask=0;</div>
-<div class="line"><a name="l00873"></a><span class="lineno">  873</span>       <span class="keywordtype">double</span> rowMask=0;</div>
-<div class="line"><a name="l00874"></a><span class="lineno">  874</span>       <span class="keywordtype">double</span> geox=0;</div>
-<div class="line"><a name="l00875"></a><span class="lineno">  875</span>       <span class="keywordtype">double</span> geoy=0;</div>
-<div class="line"><a name="l00876"></a><span class="lineno">  876</span> </div>
-<div class="line"><a name="l00877"></a><span class="lineno">  877</span>       testImage.image2geo(icol,iline,geox,geoy);</div>
-<div class="line"><a name="l00878"></a><span class="lineno">  878</span>       maskReader.geo2image(geox,geoy,colMask,rowMask);</div>
-<div class="line"><a name="l00879"></a><span class="lineno">  879</span>       colMask=<span class="keyword">static_cast<</span><span class="keywordtype">int</span><span class="keyword">></span>(colMask);</div>
-<div class="line"><a name="l00880"></a><span class="lineno">  880</span>       rowMask=<span class="keyword">static_cast<</span><span class="keywordtype">int</span><span class="keyword">></span>(rowMask);</div>
-<div class="line"><a name="l00881"></a><span class="lineno">  881</span>       <span class="keywordflow">if</span>(rowMask>=0&&rowMask<maskReader.nrOfRow()&&colMask>=0&&colMask<maskReader.nrOfCol()){</div>
-<div class="line"><a name="l00882"></a><span class="lineno">  882</span>         <span class="keywordflow">if</span>(static_cast<int>(rowMask)!=<span class="keyword">static_cast<</span><span class="keywordtype">int</span><span class="keyword">></span>(oldRowMask)){</div>
-<div class="line"><a name="l00883"></a><span class="lineno">  883</span>           assert(rowMask>=0&&rowMask<maskReader.nrOfRow());</div>
-<div class="line"><a name="l00884"></a><span class="lineno">  884</span>           <span class="keywordflow">try</span>{</div>
-<div class="line"><a name="l00885"></a><span class="lineno">  885</span>         <span class="comment">// maskReader.readData(lineMask[imask],GDT_Int32,static_cast<int>(rowMask));</span></div>
-<div class="line"><a name="l00886"></a><span class="lineno">  886</span>         maskReader.readData(lineMask,GDT_Int16,static_cast<int>(rowMask));</div>
-<div class="line"><a name="l00887"></a><span class="lineno">  887</span>           }</div>
-<div class="line"><a name="l00888"></a><span class="lineno">  888</span>           <span class="keywordflow">catch</span>(<span class="keywordtype">string</span> errorstring){</div>
-<div class="line"><a name="l00889"></a><span class="lineno">  889</span>         cerr << errorstring << endl;</div>
-<div class="line"><a name="l00890"></a><span class="lineno">  890</span>         exit(1);</div>
-<div class="line"><a name="l00891"></a><span class="lineno">  891</span>           }</div>
-<div class="line"><a name="l00892"></a><span class="lineno">  892</span>           <span class="keywordflow">catch</span>(...){</div>
-<div class="line"><a name="l00893"></a><span class="lineno">  893</span>         cerr << <span class="stringliteral">"error catched"</span> << std::endl;</div>
-<div class="line"><a name="l00894"></a><span class="lineno">  894</span>         exit(3);</div>
+<div class="line"><a name="l00706"></a><span class="lineno">  706</span>   }<span class="comment">//for ibag</span></div>
+<div class="line"><a name="l00707"></a><span class="lineno">  707</span>   <span class="keywordflow">if</span>(cv_opt[0]>1){</div>
+<div class="line"><a name="l00708"></a><span class="lineno">  708</span>     assert(cm.nReference());</div>
+<div class="line"><a name="l00709"></a><span class="lineno">  709</span>     cm.setFormat(cmformat_opt[0]);</div>
+<div class="line"><a name="l00710"></a><span class="lineno">  710</span>     cm.reportSE95(<span class="keyword">false</span>);</div>
+<div class="line"><a name="l00711"></a><span class="lineno">  711</span>     std::cout << cm << std::endl;</div>
+<div class="line"><a name="l00712"></a><span class="lineno">  712</span>     cout << <span class="stringliteral">"class #samples userAcc prodAcc"</span> << endl;</div>
+<div class="line"><a name="l00713"></a><span class="lineno">  713</span>     <span class="keywordtype">double</span> se95_ua=0;</div>
+<div class="line"><a name="l00714"></a><span class="lineno">  714</span>     <span class="keywordtype">double</span> se95_pa=0;</div>
+<div class="line"><a name="l00715"></a><span class="lineno">  715</span>     <span class="keywordtype">double</span> se95_oa=0;</div>
+<div class="line"><a name="l00716"></a><span class="lineno">  716</span>     <span class="keywordtype">double</span> dua=0;</div>
+<div class="line"><a name="l00717"></a><span class="lineno">  717</span>     <span class="keywordtype">double</span> dpa=0;</div>
+<div class="line"><a name="l00718"></a><span class="lineno">  718</span>     <span class="keywordtype">double</span> doa=0;</div>
+<div class="line"><a name="l00719"></a><span class="lineno">  719</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iclass=0;iclass<cm.nClasses();++iclass){</div>
+<div class="line"><a name="l00720"></a><span class="lineno">  720</span>       dua=cm.ua_pct(cm.getClass(iclass),&se95_ua);</div>
+<div class="line"><a name="l00721"></a><span class="lineno">  721</span>       dpa=cm.pa_pct(cm.getClass(iclass),&se95_pa);</div>
+<div class="line"><a name="l00722"></a><span class="lineno">  722</span>       cout << cm.getClass(iclass) << <span class="stringliteral">" "</span> << cm.nReference(cm.getClass(iclass)) << <span class="stringliteral">" "</span> << dua << <span class="stringliteral">" ("</span> << se95_ua << <span class="stringliteral">")"</span> << <span class="stringliteral">" "</span> <<  [...]
+<div class="line"><a name="l00723"></a><span class="lineno">  723</span>     }</div>
+<div class="line"><a name="l00724"></a><span class="lineno">  724</span>     std::cout << <span class="stringliteral">"Kappa: "</span> << cm.kappa() << std::endl;</div>
+<div class="line"><a name="l00725"></a><span class="lineno">  725</span>     doa=cm.oa_pct(&se95_oa);</div>
+<div class="line"><a name="l00726"></a><span class="lineno">  726</span>     std::cout << <span class="stringliteral">"Overall Accuracy: "</span> << doa << <span class="stringliteral">" ("</span> << se95_oa << <span class="stringliteral">")"</span>  << std::endl;</div>
+<div class="line"><a name="l00727"></a><span class="lineno">  727</span>   }</div>
+<div class="line"><a name="l00728"></a><span class="lineno">  728</span>   <span class="comment">//--------------------------------- end of training -----------------------------------</span></div>
+<div class="line"><a name="l00729"></a><span class="lineno">  729</span>   <span class="keywordflow">if</span>(input_opt.empty())</div>
+<div class="line"><a name="l00730"></a><span class="lineno">  730</span>     exit(0);</div>
+<div class="line"><a name="l00731"></a><span class="lineno">  731</span> </div>
+<div class="line"><a name="l00732"></a><span class="lineno">  732</span>     <span class="keyword">const</span> <span class="keywordtype">char</span>* pszMessage;</div>
+<div class="line"><a name="l00733"></a><span class="lineno">  733</span>     <span class="keywordtype">void</span>* pProgressArg=NULL;</div>
+<div class="line"><a name="l00734"></a><span class="lineno">  734</span>     GDALProgressFunc pfnProgress=GDALTermProgress;</div>
+<div class="line"><a name="l00735"></a><span class="lineno">  735</span>     <span class="keywordtype">float</span> progress=0;</div>
+<div class="line"><a name="l00736"></a><span class="lineno">  736</span>   <span class="comment">//-------------------------------- open image file ------------------------------------</span></div>
+<div class="line"><a name="l00737"></a><span class="lineno">  737</span>   <span class="keywordtype">bool</span> inputIsRaster=<span class="keyword">false</span>;</div>
+<div class="line"><a name="l00738"></a><span class="lineno">  738</span>   <a class="code" href="classImgReaderOgr.html">ImgReaderOgr</a> imgReaderOgr;</div>
+<div class="line"><a name="l00739"></a><span class="lineno">  739</span>   <span class="keywordflow">try</span>{</div>
+<div class="line"><a name="l00740"></a><span class="lineno">  740</span>     imgReaderOgr.open(input_opt[0]);</div>
+<div class="line"><a name="l00741"></a><span class="lineno">  741</span>     imgReaderOgr.close();</div>
+<div class="line"><a name="l00742"></a><span class="lineno">  742</span>   }</div>
+<div class="line"><a name="l00743"></a><span class="lineno">  743</span>   <span class="keywordflow">catch</span>(<span class="keywordtype">string</span> errorString){</div>
+<div class="line"><a name="l00744"></a><span class="lineno">  744</span>     inputIsRaster=<span class="keyword">true</span>;</div>
+<div class="line"><a name="l00745"></a><span class="lineno">  745</span>   }</div>
+<div class="line"><a name="l00746"></a><span class="lineno">  746</span>   <span class="keywordflow">if</span>(inputIsRaster){</div>
+<div class="line"><a name="l00747"></a><span class="lineno">  747</span>   <span class="comment">// if(input_opt[0].find(".shp")==string::npos){</span></div>
+<div class="line"><a name="l00748"></a><span class="lineno">  748</span>     <a class="code" href="classImgReaderGdal.html">ImgReaderGdal</a> testImage;</div>
+<div class="line"><a name="l00749"></a><span class="lineno">  749</span>     <span class="keywordflow">try</span>{</div>
+<div class="line"><a name="l00750"></a><span class="lineno">  750</span>       <span class="keywordflow">if</span>(verbose_opt[0]>=1)</div>
+<div class="line"><a name="l00751"></a><span class="lineno">  751</span>         cout << <span class="stringliteral">"opening image "</span> << input_opt[0] << endl; </div>
+<div class="line"><a name="l00752"></a><span class="lineno">  752</span>       testImage.open(input_opt[0]);</div>
+<div class="line"><a name="l00753"></a><span class="lineno">  753</span>     }</div>
+<div class="line"><a name="l00754"></a><span class="lineno">  754</span>     <span class="keywordflow">catch</span>(<span class="keywordtype">string</span> error){</div>
+<div class="line"><a name="l00755"></a><span class="lineno">  755</span>       cerr << error << endl;</div>
+<div class="line"><a name="l00756"></a><span class="lineno">  756</span>       exit(2);</div>
+<div class="line"><a name="l00757"></a><span class="lineno">  757</span>     }</div>
+<div class="line"><a name="l00758"></a><span class="lineno">  758</span>     <a class="code" href="classImgReaderGdal.html">ImgReaderGdal</a> priorReader;</div>
+<div class="line"><a name="l00759"></a><span class="lineno">  759</span>     <span class="keywordflow">if</span>(priorimg_opt.size()){</div>
+<div class="line"><a name="l00760"></a><span class="lineno">  760</span>       <span class="keywordflow">try</span>{</div>
+<div class="line"><a name="l00761"></a><span class="lineno">  761</span>     <span class="keywordflow">if</span>(verbose_opt[0]>=1)</div>
+<div class="line"><a name="l00762"></a><span class="lineno">  762</span>           std::cout << <span class="stringliteral">"opening prior image "</span> << priorimg_opt[0] << std::endl;</div>
+<div class="line"><a name="l00763"></a><span class="lineno">  763</span>         priorReader.open(priorimg_opt[0]);</div>
+<div class="line"><a name="l00764"></a><span class="lineno">  764</span>         assert(priorReader.nrOfCol()==testImage.nrOfCol());</div>
+<div class="line"><a name="l00765"></a><span class="lineno">  765</span>         assert(priorReader.nrOfRow()==testImage.nrOfRow());</div>
+<div class="line"><a name="l00766"></a><span class="lineno">  766</span>       }</div>
+<div class="line"><a name="l00767"></a><span class="lineno">  767</span>       <span class="keywordflow">catch</span>(<span class="keywordtype">string</span> error){</div>
+<div class="line"><a name="l00768"></a><span class="lineno">  768</span>         cerr << error << std::endl;</div>
+<div class="line"><a name="l00769"></a><span class="lineno">  769</span>         exit(2);</div>
+<div class="line"><a name="l00770"></a><span class="lineno">  770</span>       }</div>
+<div class="line"><a name="l00771"></a><span class="lineno">  771</span>       <span class="keywordflow">catch</span>(...){</div>
+<div class="line"><a name="l00772"></a><span class="lineno">  772</span>         cerr << <span class="stringliteral">"error catched"</span> << std::endl;</div>
+<div class="line"><a name="l00773"></a><span class="lineno">  773</span>         exit(1);</div>
+<div class="line"><a name="l00774"></a><span class="lineno">  774</span>       }</div>
+<div class="line"><a name="l00775"></a><span class="lineno">  775</span>     }</div>
+<div class="line"><a name="l00776"></a><span class="lineno">  776</span> </div>
+<div class="line"><a name="l00777"></a><span class="lineno">  777</span>     <span class="keywordtype">int</span> nrow=testImage.nrOfRow();</div>
+<div class="line"><a name="l00778"></a><span class="lineno">  778</span>     <span class="keywordtype">int</span> ncol=testImage.nrOfCol();</div>
+<div class="line"><a name="l00779"></a><span class="lineno">  779</span>     <span class="keywordflow">if</span>(option_opt.findSubstring(<span class="stringliteral">"INTERLEAVE="</span>)==option_opt.end()){</div>
+<div class="line"><a name="l00780"></a><span class="lineno">  780</span>       <span class="keywordtype">string</span> theInterleave=<span class="stringliteral">"INTERLEAVE="</span>;</div>
+<div class="line"><a name="l00781"></a><span class="lineno">  781</span>       theInterleave+=testImage.getInterleave();</div>
+<div class="line"><a name="l00782"></a><span class="lineno">  782</span>       option_opt.push_back(theInterleave);</div>
+<div class="line"><a name="l00783"></a><span class="lineno">  783</span>     }</div>
+<div class="line"><a name="l00784"></a><span class="lineno">  784</span>     vector<char> classOut(ncol);<span class="comment">//classified line for writing to image file</span></div>
+<div class="line"><a name="l00785"></a><span class="lineno">  785</span> </div>
+<div class="line"><a name="l00786"></a><span class="lineno">  786</span>     <span class="comment">//   assert(nband==testImage.nrOfBand());</span></div>
+<div class="line"><a name="l00787"></a><span class="lineno">  787</span>     <a class="code" href="classImgWriterGdal.html">ImgWriterGdal</a> classImageBag;</div>
+<div class="line"><a name="l00788"></a><span class="lineno">  788</span>     <a class="code" href="classImgWriterGdal.html">ImgWriterGdal</a> classImageOut;</div>
+<div class="line"><a name="l00789"></a><span class="lineno">  789</span>     <a class="code" href="classImgWriterGdal.html">ImgWriterGdal</a> probImage;</div>
+<div class="line"><a name="l00790"></a><span class="lineno">  790</span>     <a class="code" href="classImgWriterGdal.html">ImgWriterGdal</a> entropyImage;</div>
+<div class="line"><a name="l00791"></a><span class="lineno">  791</span> </div>
+<div class="line"><a name="l00792"></a><span class="lineno">  792</span>     <span class="keywordtype">string</span> imageType=testImage.getImageType();</div>
+<div class="line"><a name="l00793"></a><span class="lineno">  793</span>     <span class="keywordflow">if</span>(oformat_opt.size())<span class="comment">//default</span></div>
+<div class="line"><a name="l00794"></a><span class="lineno">  794</span>       imageType=oformat_opt[0];</div>
+<div class="line"><a name="l00795"></a><span class="lineno">  795</span>     <span class="keywordflow">try</span>{</div>
+<div class="line"><a name="l00796"></a><span class="lineno">  796</span> </div>
+<div class="line"><a name="l00797"></a><span class="lineno">  797</span>       <span class="keywordflow">if</span>(verbose_opt[0]>=1)</div>
+<div class="line"><a name="l00798"></a><span class="lineno">  798</span>         cout << <span class="stringliteral">"opening class image for writing output "</span> << output_opt[0] << endl;</div>
+<div class="line"><a name="l00799"></a><span class="lineno">  799</span>       <span class="keywordflow">if</span>(classBag_opt.size()){</div>
+<div class="line"><a name="l00800"></a><span class="lineno">  800</span>         classImageBag.open(classBag_opt[0],ncol,nrow,nbag,GDT_Byte,imageType,option_opt);</div>
+<div class="line"><a name="l00801"></a><span class="lineno">  801</span>     classImageBag.GDALSetNoDataValue(nodata_opt[0]);</div>
+<div class="line"><a name="l00802"></a><span class="lineno">  802</span>         classImageBag.copyGeoTransform(testImage);</div>
+<div class="line"><a name="l00803"></a><span class="lineno">  803</span>         classImageBag.setProjection(testImage.getProjection());</div>
+<div class="line"><a name="l00804"></a><span class="lineno">  804</span>       }</div>
+<div class="line"><a name="l00805"></a><span class="lineno">  805</span>       classImageOut.open(output_opt[0],ncol,nrow,1,GDT_Byte,imageType,option_opt);</div>
+<div class="line"><a name="l00806"></a><span class="lineno">  806</span>       classImageOut.GDALSetNoDataValue(nodata_opt[0]);</div>
+<div class="line"><a name="l00807"></a><span class="lineno">  807</span>       classImageOut.copyGeoTransform(testImage);</div>
+<div class="line"><a name="l00808"></a><span class="lineno">  808</span>       classImageOut.setProjection(testImage.getProjection());</div>
+<div class="line"><a name="l00809"></a><span class="lineno">  809</span>       <span class="keywordflow">if</span>(colorTable_opt.size())</div>
+<div class="line"><a name="l00810"></a><span class="lineno">  810</span>         classImageOut.setColorTable(colorTable_opt[0],0);</div>
+<div class="line"><a name="l00811"></a><span class="lineno">  811</span>       <span class="keywordflow">if</span>(prob_opt.size()){</div>
+<div class="line"><a name="l00812"></a><span class="lineno">  812</span>         probImage.open(prob_opt[0],ncol,nrow,nclass,GDT_Byte,imageType,option_opt);</div>
+<div class="line"><a name="l00813"></a><span class="lineno">  813</span>     probImage.GDALSetNoDataValue(nodata_opt[0]);</div>
+<div class="line"><a name="l00814"></a><span class="lineno">  814</span>         probImage.copyGeoTransform(testImage);</div>
+<div class="line"><a name="l00815"></a><span class="lineno">  815</span>         probImage.setProjection(testImage.getProjection());</div>
+<div class="line"><a name="l00816"></a><span class="lineno">  816</span>       }</div>
+<div class="line"><a name="l00817"></a><span class="lineno">  817</span>       <span class="keywordflow">if</span>(entropy_opt.size()){</div>
+<div class="line"><a name="l00818"></a><span class="lineno">  818</span>         entropyImage.open(entropy_opt[0],ncol,nrow,1,GDT_Byte,imageType,option_opt);</div>
+<div class="line"><a name="l00819"></a><span class="lineno">  819</span>     entropyImage.GDALSetNoDataValue(nodata_opt[0]);</div>
+<div class="line"><a name="l00820"></a><span class="lineno">  820</span>         entropyImage.copyGeoTransform(testImage);</div>
+<div class="line"><a name="l00821"></a><span class="lineno">  821</span>         entropyImage.setProjection(testImage.getProjection());</div>
+<div class="line"><a name="l00822"></a><span class="lineno">  822</span>       }</div>
+<div class="line"><a name="l00823"></a><span class="lineno">  823</span>     }</div>
+<div class="line"><a name="l00824"></a><span class="lineno">  824</span>     <span class="keywordflow">catch</span>(<span class="keywordtype">string</span> error){</div>
+<div class="line"><a name="l00825"></a><span class="lineno">  825</span>       cerr << error << endl;</div>
+<div class="line"><a name="l00826"></a><span class="lineno">  826</span>     }</div>
+<div class="line"><a name="l00827"></a><span class="lineno">  827</span>   </div>
+<div class="line"><a name="l00828"></a><span class="lineno">  828</span>     <a class="code" href="classImgWriterGdal.html">ImgWriterGdal</a> maskWriter;</div>
+<div class="line"><a name="l00829"></a><span class="lineno">  829</span> </div>
+<div class="line"><a name="l00830"></a><span class="lineno">  830</span>     <span class="keywordflow">if</span>(maskIsVector){</div>
+<div class="line"><a name="l00831"></a><span class="lineno">  831</span>       <span class="keywordflow">try</span>{</div>
+<div class="line"><a name="l00832"></a><span class="lineno">  832</span>     maskWriter.open(<span class="stringliteral">"/vsimem/mask.tif"</span>,ncol,nrow,1,GDT_Float32,imageType,option_opt);</div>
+<div class="line"><a name="l00833"></a><span class="lineno">  833</span>     maskWriter.GDALSetNoDataValue(nodata_opt[0]);</div>
+<div class="line"><a name="l00834"></a><span class="lineno">  834</span>         maskWriter.copyGeoTransform(testImage);</div>
+<div class="line"><a name="l00835"></a><span class="lineno">  835</span>         maskWriter.setProjection(testImage.getProjection());</div>
+<div class="line"><a name="l00836"></a><span class="lineno">  836</span>     vector<double> burnValues(1,1);<span class="comment">//burn value is 1 (single band)</span></div>
+<div class="line"><a name="l00837"></a><span class="lineno">  837</span>     maskWriter.rasterizeOgr(extentReader,burnValues);</div>
+<div class="line"><a name="l00838"></a><span class="lineno">  838</span>     extentReader.close();</div>
+<div class="line"><a name="l00839"></a><span class="lineno">  839</span>     maskWriter.close();</div>
+<div class="line"><a name="l00840"></a><span class="lineno">  840</span>       }</div>
+<div class="line"><a name="l00841"></a><span class="lineno">  841</span>       <span class="keywordflow">catch</span>(<span class="keywordtype">string</span> error){</div>
+<div class="line"><a name="l00842"></a><span class="lineno">  842</span>         cerr << error << std::endl;</div>
+<div class="line"><a name="l00843"></a><span class="lineno">  843</span>         exit(2);</div>
+<div class="line"><a name="l00844"></a><span class="lineno">  844</span>       }</div>
+<div class="line"><a name="l00845"></a><span class="lineno">  845</span>       <span class="keywordflow">catch</span>(...){</div>
+<div class="line"><a name="l00846"></a><span class="lineno">  846</span>         cerr << <span class="stringliteral">"error catched"</span> << std::endl;</div>
+<div class="line"><a name="l00847"></a><span class="lineno">  847</span>         exit(1);</div>
+<div class="line"><a name="l00848"></a><span class="lineno">  848</span>       }</div>
+<div class="line"><a name="l00849"></a><span class="lineno">  849</span>       mask_opt.clear();</div>
+<div class="line"><a name="l00850"></a><span class="lineno">  850</span>       mask_opt.push_back(<span class="stringliteral">"/vsimem/mask.tif"</span>);</div>
+<div class="line"><a name="l00851"></a><span class="lineno">  851</span>     }</div>
+<div class="line"><a name="l00852"></a><span class="lineno">  852</span>     <a class="code" href="classImgReaderGdal.html">ImgReaderGdal</a> maskReader;</div>
+<div class="line"><a name="l00853"></a><span class="lineno">  853</span>     <span class="keywordflow">if</span>(mask_opt.size()){</div>
+<div class="line"><a name="l00854"></a><span class="lineno">  854</span>       <span class="keywordflow">try</span>{</div>
+<div class="line"><a name="l00855"></a><span class="lineno">  855</span>         <span class="keywordflow">if</span>(verbose_opt[0]>=1)</div>
+<div class="line"><a name="l00856"></a><span class="lineno">  856</span>           std::cout << <span class="stringliteral">"opening mask image file "</span> << mask_opt[0] << std::endl;</div>
+<div class="line"><a name="l00857"></a><span class="lineno">  857</span>         maskReader.open(mask_opt[0]);</div>
+<div class="line"><a name="l00858"></a><span class="lineno">  858</span>       }</div>
+<div class="line"><a name="l00859"></a><span class="lineno">  859</span>       <span class="keywordflow">catch</span>(<span class="keywordtype">string</span> error){</div>
+<div class="line"><a name="l00860"></a><span class="lineno">  860</span>         cerr << error << std::endl;</div>
+<div class="line"><a name="l00861"></a><span class="lineno">  861</span>         exit(2);</div>
+<div class="line"><a name="l00862"></a><span class="lineno">  862</span>       }</div>
+<div class="line"><a name="l00863"></a><span class="lineno">  863</span>       <span class="keywordflow">catch</span>(...){</div>
+<div class="line"><a name="l00864"></a><span class="lineno">  864</span>         cerr << <span class="stringliteral">"error catched"</span> << std::endl;</div>
+<div class="line"><a name="l00865"></a><span class="lineno">  865</span>         exit(1);</div>
+<div class="line"><a name="l00866"></a><span class="lineno">  866</span>       }</div>
+<div class="line"><a name="l00867"></a><span class="lineno">  867</span>     }</div>
+<div class="line"><a name="l00868"></a><span class="lineno">  868</span> </div>
+<div class="line"><a name="l00869"></a><span class="lineno">  869</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iline=0;iline<nrow;++iline){</div>
+<div class="line"><a name="l00870"></a><span class="lineno">  870</span>       vector<float> buffer(ncol);</div>
+<div class="line"><a name="l00871"></a><span class="lineno">  871</span>       vector<short> lineMask;</div>
+<div class="line"><a name="l00872"></a><span class="lineno">  872</span>       <span class="keywordflow">if</span>(mask_opt.size())</div>
+<div class="line"><a name="l00873"></a><span class="lineno">  873</span>         lineMask.resize(maskReader.nrOfCol());</div>
+<div class="line"><a name="l00874"></a><span class="lineno">  874</span>       <a class="code" href="classVector2d.html">Vector2d<float></a> linePrior;</div>
+<div class="line"><a name="l00875"></a><span class="lineno">  875</span>       <span class="keywordflow">if</span>(priorimg_opt.size())</div>
+<div class="line"><a name="l00876"></a><span class="lineno">  876</span>      linePrior.resize(nclass,ncol);<span class="comment">//prior prob for each class</span></div>
+<div class="line"><a name="l00877"></a><span class="lineno">  877</span>       <a class="code" href="classVector2d.html">Vector2d<float></a> hpixel(ncol);</div>
+<div class="line"><a name="l00878"></a><span class="lineno">  878</span>       <a class="code" href="classVector2d.html">Vector2d<float></a> fpixel(ncol);</div>
+<div class="line"><a name="l00879"></a><span class="lineno">  879</span>       <a class="code" href="classVector2d.html">Vector2d<float></a> probOut(nclass,ncol);<span class="comment">//posterior prob for each (internal) class</span></div>
+<div class="line"><a name="l00880"></a><span class="lineno">  880</span>       vector<float> entropy(ncol);</div>
+<div class="line"><a name="l00881"></a><span class="lineno">  881</span>       <a class="code" href="classVector2d.html">Vector2d<char></a> classBag;<span class="comment">//classified line for writing to image file</span></div>
+<div class="line"><a name="l00882"></a><span class="lineno">  882</span>       <span class="keywordflow">if</span>(classBag_opt.size())</div>
+<div class="line"><a name="l00883"></a><span class="lineno">  883</span>         classBag.resize(nbag,ncol);</div>
+<div class="line"><a name="l00884"></a><span class="lineno">  884</span>       <span class="comment">//read all bands of all pixels in this line in hline</span></div>
+<div class="line"><a name="l00885"></a><span class="lineno">  885</span>       <span class="keywordflow">try</span>{</div>
+<div class="line"><a name="l00886"></a><span class="lineno">  886</span>         <span class="keywordflow">if</span>(band_opt.size()){</div>
+<div class="line"><a name="l00887"></a><span class="lineno">  887</span>           <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iband=0;iband<band_opt.size();++iband){</div>
+<div class="line"><a name="l00888"></a><span class="lineno">  888</span>             <span class="keywordflow">if</span>(verbose_opt[0]==2)</div>
+<div class="line"><a name="l00889"></a><span class="lineno">  889</span>               std::cout << <span class="stringliteral">"reading band "</span> << band_opt[iband] << std::endl;</div>
+<div class="line"><a name="l00890"></a><span class="lineno">  890</span>             assert(band_opt[iband]>=0);</div>
+<div class="line"><a name="l00891"></a><span class="lineno">  891</span>             assert(band_opt[iband]<testImage.nrOfBand());</div>
+<div class="line"><a name="l00892"></a><span class="lineno">  892</span>             testImage.readData(buffer,GDT_Float32,iline,band_opt[iband]);</div>
+<div class="line"><a name="l00893"></a><span class="lineno">  893</span>             <span class="keywordflow">for</span>(<span class="keywordtype">int</span> icol=0;icol<ncol;++icol)</div>
+<div class="line"><a name="l00894"></a><span class="lineno">  894</span>               hpixel[icol].push_back(buffer[icol]);</div>
 <div class="line"><a name="l00895"></a><span class="lineno">  895</span>           }</div>
-<div class="line"><a name="l00896"></a><span class="lineno">  896</span>           oldRowMask=rowMask;</div>
-<div class="line"><a name="l00897"></a><span class="lineno">  897</span>         }</div>
-<div class="line"><a name="l00898"></a><span class="lineno">  898</span>         <span class="keywordtype">short</span> theMask=0;</div>
-<div class="line"><a name="l00899"></a><span class="lineno">  899</span>         <span class="keywordflow">for</span>(<span class="keywordtype">short</span> ivalue=0;ivalue<msknodata_opt.size();++ivalue){</div>
-<div class="line"><a name="l00900"></a><span class="lineno">  900</span>           <span class="keywordflow">if</span>(msknodata_opt[ivalue]>=0){<span class="comment">//values set in msknodata_opt are invalid</span></div>
-<div class="line"><a name="l00901"></a><span class="lineno">  901</span>         <span class="keywordflow">if</span>(lineMask[colMask]==msknodata_opt[ivalue]){</div>
-<div class="line"><a name="l00902"></a><span class="lineno">  902</span>           theMask=lineMask[colMask];</div>
-<div class="line"><a name="l00903"></a><span class="lineno">  903</span>           masked=<span class="keyword">true</span>;</div>
-<div class="line"><a name="l00904"></a><span class="lineno">  904</span>           <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l00905"></a><span class="lineno">  905</span>         }</div>
+<div class="line"><a name="l00896"></a><span class="lineno">  896</span>         }</div>
+<div class="line"><a name="l00897"></a><span class="lineno">  897</span>         <span class="keywordflow">else</span>{</div>
+<div class="line"><a name="l00898"></a><span class="lineno">  898</span>           <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iband=0;iband<nband;++iband){</div>
+<div class="line"><a name="l00899"></a><span class="lineno">  899</span>             <span class="keywordflow">if</span>(verbose_opt[0]==2)</div>
+<div class="line"><a name="l00900"></a><span class="lineno">  900</span>               std::cout << <span class="stringliteral">"reading band "</span> << iband << std::endl;</div>
+<div class="line"><a name="l00901"></a><span class="lineno">  901</span>             assert(iband>=0);</div>
+<div class="line"><a name="l00902"></a><span class="lineno">  902</span>             assert(iband<testImage.nrOfBand());</div>
+<div class="line"><a name="l00903"></a><span class="lineno">  903</span>             testImage.readData(buffer,GDT_Float32,iline,iband);</div>
+<div class="line"><a name="l00904"></a><span class="lineno">  904</span>             <span class="keywordflow">for</span>(<span class="keywordtype">int</span> icol=0;icol<ncol;++icol)</div>
+<div class="line"><a name="l00905"></a><span class="lineno">  905</span>               hpixel[icol].push_back(buffer[icol]);</div>
 <div class="line"><a name="l00906"></a><span class="lineno">  906</span>           }</div>
-<div class="line"><a name="l00907"></a><span class="lineno">  907</span>           <span class="keywordflow">else</span>{<span class="comment">//only values set in msknodata_opt are valid</span></div>
-<div class="line"><a name="l00908"></a><span class="lineno">  908</span>         <span class="keywordflow">if</span>(lineMask[colMask]!=-msknodata_opt[ivalue]){</div>
-<div class="line"><a name="l00909"></a><span class="lineno">  909</span>           theMask=lineMask[colMask];</div>
-<div class="line"><a name="l00910"></a><span class="lineno">  910</span>           masked=<span class="keyword">true</span>;</div>
-<div class="line"><a name="l00911"></a><span class="lineno">  911</span>         }</div>
-<div class="line"><a name="l00912"></a><span class="lineno">  912</span>         <span class="keywordflow">else</span>{</div>
-<div class="line"><a name="l00913"></a><span class="lineno">  913</span>           masked=<span class="keyword">false</span>;</div>
-<div class="line"><a name="l00914"></a><span class="lineno">  914</span>           <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l00915"></a><span class="lineno">  915</span>         }</div>
-<div class="line"><a name="l00916"></a><span class="lineno">  916</span>           }</div>
-<div class="line"><a name="l00917"></a><span class="lineno">  917</span>         }</div>
-<div class="line"><a name="l00918"></a><span class="lineno">  918</span>         <span class="keywordflow">if</span>(masked){</div>
-<div class="line"><a name="l00919"></a><span class="lineno">  919</span>           <span class="keywordflow">if</span>(classBag_opt.size())</div>
-<div class="line"><a name="l00920"></a><span class="lineno">  920</span>         <span class="keywordflow">for</span>(<span class="keywordtype">int</span> ibag=0;ibag<nbag;++ibag)</div>
-<div class="line"><a name="l00921"></a><span class="lineno">  921</span>           classBag[ibag][icol]=theMask;</div>
-<div class="line"><a name="l00922"></a><span class="lineno">  922</span>           classOut[icol]=theMask;</div>
-<div class="line"><a name="l00923"></a><span class="lineno">  923</span>           <span class="keywordflow">continue</span>;</div>
-<div class="line"><a name="l00924"></a><span class="lineno">  924</span>         }</div>
-<div class="line"><a name="l00925"></a><span class="lineno">  925</span>       }</div>
-<div class="line"><a name="l00926"></a><span class="lineno">  926</span>       <span class="keywordtype">bool</span> valid=<span class="keyword">false</span>;</div>
-<div class="line"><a name="l00927"></a><span class="lineno">  927</span>       <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iband=0;iband<nband;++iband){</div>
-<div class="line"><a name="l00928"></a><span class="lineno">  928</span>         <span class="keywordflow">if</span>(hpixel[icol][iband]){</div>
-<div class="line"><a name="l00929"></a><span class="lineno">  929</span>           valid=<span class="keyword">true</span>;</div>
-<div class="line"><a name="l00930"></a><span class="lineno">  930</span>           <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l00931"></a><span class="lineno">  931</span>         }</div>
-<div class="line"><a name="l00932"></a><span class="lineno">  932</span>       }</div>
-<div class="line"><a name="l00933"></a><span class="lineno">  933</span>       <span class="keywordflow">if</span>(!valid){</div>
-<div class="line"><a name="l00934"></a><span class="lineno">  934</span>         <span class="keywordflow">if</span>(classBag_opt.size())</div>
-<div class="line"><a name="l00935"></a><span class="lineno">  935</span>           <span class="keywordflow">for</span>(<span class="keywordtype">int</span> ibag=0;ibag<nbag;++ibag)</div>
-<div class="line"><a name="l00936"></a><span class="lineno">  936</span>         classBag[ibag][icol]=nodata_opt[0];</div>
-<div class="line"><a name="l00937"></a><span class="lineno">  937</span>         classOut[icol]=nodata_opt[0];</div>
-<div class="line"><a name="l00938"></a><span class="lineno">  938</span>         <span class="keywordflow">continue</span>;<span class="comment">//next column</span></div>
-<div class="line"><a name="l00939"></a><span class="lineno">  939</span>       }</div>
-<div class="line"><a name="l00940"></a><span class="lineno">  940</span>     }</div>
-<div class="line"><a name="l00941"></a><span class="lineno">  941</span>         <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iclass=0;iclass<nclass;++iclass)</div>
-<div class="line"><a name="l00942"></a><span class="lineno">  942</span>           probOut[iclass][icol]=0;</div>
-<div class="line"><a name="l00943"></a><span class="lineno">  943</span>     <span class="keywordflow">if</span>(verbose_opt[0]>1)</div>
-<div class="line"><a name="l00944"></a><span class="lineno">  944</span>       std::cout << <span class="stringliteral">"begin classification "</span> << std::endl;</div>
-<div class="line"><a name="l00945"></a><span class="lineno">  945</span>         <span class="comment">//----------------------------------- classification -------------------</span></div>
-<div class="line"><a name="l00946"></a><span class="lineno">  946</span>         <span class="keywordflow">for</span>(<span class="keywordtype">int</span> ibag=0;ibag<nbag;++ibag){</div>
-<div class="line"><a name="l00947"></a><span class="lineno">  947</span>           <span class="comment">//calculate image features</span></div>
-<div class="line"><a name="l00948"></a><span class="lineno">  948</span>           fpixel[icol].clear();</div>
-<div class="line"><a name="l00949"></a><span class="lineno">  949</span>           <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iband=0;iband<nband;++iband)</div>
-<div class="line"><a name="l00950"></a><span class="lineno">  950</span>             fpixel[icol].push_back((hpixel[icol][iband]-offset[ibag][iband])/scale[ibag][iband]);</div>
-<div class="line"><a name="l00951"></a><span class="lineno">  951</span>           vector<float> result(nclass);</div>
-<div class="line"><a name="l00952"></a><span class="lineno">  952</span>           result=net[ibag].run(fpixel[icol]);</div>
-<div class="line"><a name="l00953"></a><span class="lineno">  953</span>           <span class="keywordtype">int</span> maxClass=0;</div>
-<div class="line"><a name="l00954"></a><span class="lineno">  954</span>           vector<float> prValues(nclass);</div>
-<div class="line"><a name="l00955"></a><span class="lineno">  955</span>           <span class="keywordtype">float</span> maxP=0;</div>
-<div class="line"><a name="l00956"></a><span class="lineno">  956</span> </div>
-<div class="line"><a name="l00957"></a><span class="lineno">  957</span>           <span class="comment">//calculate posterior prob of bag </span></div>
-<div class="line"><a name="l00958"></a><span class="lineno">  958</span>           <span class="keywordflow">if</span>(classBag_opt.size()){</div>
-<div class="line"><a name="l00959"></a><span class="lineno">  959</span>             <span class="comment">//search for max prob within bag</span></div>
-<div class="line"><a name="l00960"></a><span class="lineno">  960</span>             maxP=0;</div>
-<div class="line"><a name="l00961"></a><span class="lineno">  961</span>             classBag[ibag][icol]=0;</div>
-<div class="line"><a name="l00962"></a><span class="lineno">  962</span>           }</div>
-<div class="line"><a name="l00963"></a><span class="lineno">  963</span>       <span class="keywordtype">double</span> normPrior=0;</div>
-<div class="line"><a name="l00964"></a><span class="lineno">  964</span>       <span class="keywordflow">if</span>(priorimg_opt.size()){</div>
-<div class="line"><a name="l00965"></a><span class="lineno">  965</span>         <span class="keywordflow">for</span>(<span class="keywordtype">short</span> iclass=0;iclass<nclass;++iclass)</div>
-<div class="line"><a name="l00966"></a><span class="lineno">  966</span>           normPrior+=linePrior[iclass][icol];</div>
-<div class="line"><a name="l00967"></a><span class="lineno">  967</span>       }</div>
-<div class="line"><a name="l00968"></a><span class="lineno">  968</span>           <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iclass=0;iclass<nclass;++iclass){</div>
-<div class="line"><a name="l00969"></a><span class="lineno">  969</span>         result[iclass]=(result[iclass]+1.0)/2.0;<span class="comment">//bring back to scale [0,1]</span></div>
-<div class="line"><a name="l00970"></a><span class="lineno">  970</span>         <span class="keywordflow">if</span>(priorimg_opt.size())</div>
-<div class="line"><a name="l00971"></a><span class="lineno">  971</span>           priors[iclass]=linePrior[iclass][icol]/normPrior;<span class="comment">//todo: check if correct for all cases... (automatic classValueMap and manual input for names and values)</span></div>
-<div class="line"><a name="l00972"></a><span class="lineno">  972</span>             <span class="keywordflow">switch</span>(comb_opt[0]){</div>
-<div class="line"><a name="l00973"></a><span class="lineno">  973</span>             <span class="keywordflow">default</span>:</div>
-<div class="line"><a name="l00974"></a><span class="lineno">  974</span>             <span class="keywordflow">case</span>(0):<span class="comment">//sum rule</span></div>
-<div class="line"><a name="l00975"></a><span class="lineno">  975</span>               probOut[iclass][icol]+=result[iclass]*priors[iclass];<span class="comment">//add probabilities for each bag</span></div>
-<div class="line"><a name="l00976"></a><span class="lineno">  976</span>               <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l00977"></a><span class="lineno">  977</span>             <span class="keywordflow">case</span>(1):<span class="comment">//product rule</span></div>
-<div class="line"><a name="l00978"></a><span class="lineno">  978</span>               probOut[iclass][icol]*=pow(static_cast<float>(priors[iclass]),static_cast<float>(1.0-nbag)/nbag)*result[iclass];<span class="comment">//multiply probabilities for each bag</span></div>
-<div class="line"><a name="l00979"></a><span class="lineno">  979</span>               <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l00980"></a><span class="lineno">  980</span>             <span class="keywordflow">case</span>(2):<span class="comment">//max rule</span></div>
-<div class="line"><a name="l00981"></a><span class="lineno">  981</span>               <span class="keywordflow">if</span>(priors[iclass]*result[iclass]>probOut[iclass][icol])</div>
-<div class="line"><a name="l00982"></a><span class="lineno">  982</span>                 probOut[iclass][icol]=priors[iclass]*result[iclass];</div>
-<div class="line"><a name="l00983"></a><span class="lineno">  983</span>               <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l00984"></a><span class="lineno">  984</span>             }</div>
-<div class="line"><a name="l00985"></a><span class="lineno">  985</span>             <span class="keywordflow">if</span>(classBag_opt.size()){</div>
-<div class="line"><a name="l00986"></a><span class="lineno">  986</span>               <span class="comment">//search for max prob within bag</span></div>
-<div class="line"><a name="l00987"></a><span class="lineno">  987</span>               <span class="comment">// if(prValues[iclass]>maxP){</span></div>
-<div class="line"><a name="l00988"></a><span class="lineno">  988</span>               <span class="comment">//   maxP=prValues[iclass];</span></div>
-<div class="line"><a name="l00989"></a><span class="lineno">  989</span>               <span class="comment">//   classBag[ibag][icol]=vcode[iclass];</span></div>
-<div class="line"><a name="l00990"></a><span class="lineno">  990</span>               <span class="comment">// }</span></div>
-<div class="line"><a name="l00991"></a><span class="lineno">  991</span>               <span class="keywordflow">if</span>(result[iclass]>maxP){</div>
-<div class="line"><a name="l00992"></a><span class="lineno">  992</span>                 maxP=result[iclass];</div>
-<div class="line"><a name="l00993"></a><span class="lineno">  993</span>                 classBag[ibag][icol]=iclass;</div>
-<div class="line"><a name="l00994"></a><span class="lineno">  994</span>               }</div>
-<div class="line"><a name="l00995"></a><span class="lineno">  995</span>             }</div>
-<div class="line"><a name="l00996"></a><span class="lineno">  996</span>           }</div>
-<div class="line"><a name="l00997"></a><span class="lineno">  997</span>         }<span class="comment">//ibag</span></div>
-<div class="line"><a name="l00998"></a><span class="lineno">  998</span> </div>
-<div class="line"><a name="l00999"></a><span class="lineno">  999</span>         <span class="comment">//search for max class prob</span></div>
-<div class="line"><a name="l01000"></a><span class="lineno"> 1000</span>         <span class="keywordtype">float</span> maxBag1=0;<span class="comment">//max probability</span></div>
-<div class="line"><a name="l01001"></a><span class="lineno"> 1001</span>         <span class="keywordtype">float</span> maxBag2=0;<span class="comment">//second max probability</span></div>
-<div class="line"><a name="l01002"></a><span class="lineno"> 1002</span>         <span class="keywordtype">float</span> normBag=0;</div>
-<div class="line"><a name="l01003"></a><span class="lineno"> 1003</span>         <span class="keywordflow">for</span>(<span class="keywordtype">short</span> iclass=0;iclass<nclass;++iclass){</div>
-<div class="line"><a name="l01004"></a><span class="lineno"> 1004</span>           <span class="keywordflow">if</span>(probOut[iclass][icol]>maxBag1){</div>
-<div class="line"><a name="l01005"></a><span class="lineno"> 1005</span>             maxBag1=probOut[iclass][icol];</div>
-<div class="line"><a name="l01006"></a><span class="lineno"> 1006</span>             classOut[icol]=classValueMap[nameVector[iclass]];</div>
-<div class="line"><a name="l01007"></a><span class="lineno"> 1007</span>           }</div>
-<div class="line"><a name="l01008"></a><span class="lineno"> 1008</span>       <span class="keywordflow">else</span> <span class="keywordflow">if</span>(probOut[iclass][icol]>maxBag2)</div>
-<div class="line"><a name="l01009"></a><span class="lineno"> 1009</span>             maxBag2=probOut[iclass][icol];</div>
-<div class="line"><a name="l01010"></a><span class="lineno"> 1010</span>           normBag+=probOut[iclass][icol];</div>
-<div class="line"><a name="l01011"></a><span class="lineno"> 1011</span>         }</div>
-<div class="line"><a name="l01012"></a><span class="lineno"> 1012</span>         <span class="comment">//normalize probOut and convert to percentage</span></div>
-<div class="line"><a name="l01013"></a><span class="lineno"> 1013</span>         entropy[icol]=0;</div>
-<div class="line"><a name="l01014"></a><span class="lineno"> 1014</span>         <span class="keywordflow">for</span>(<span class="keywordtype">short</span> iclass=0;iclass<nclass;++iclass){</div>
-<div class="line"><a name="l01015"></a><span class="lineno"> 1015</span>           <span class="keywordtype">float</span> prv=probOut[iclass][icol];</div>
-<div class="line"><a name="l01016"></a><span class="lineno"> 1016</span>           prv/=normBag;</div>
-<div class="line"><a name="l01017"></a><span class="lineno"> 1017</span>           entropy[icol]-=prv*log(prv)/log(2.0);</div>
-<div class="line"><a name="l01018"></a><span class="lineno"> 1018</span>           prv*=100.0;</div>
-<div class="line"><a name="l01019"></a><span class="lineno"> 1019</span>             </div>
-<div class="line"><a name="l01020"></a><span class="lineno"> 1020</span>           probOut[iclass][icol]=<span class="keyword">static_cast<</span><span class="keywordtype">short</span><span class="keyword">></span>(prv+0.5);</div>
-<div class="line"><a name="l01021"></a><span class="lineno"> 1021</span>           <span class="comment">// assert(classValueMap[nameVector[iclass]]<probOut.size());</span></div>
-<div class="line"><a name="l01022"></a><span class="lineno"> 1022</span>           <span class="comment">// assert(classValueMap[nameVector[iclass]]>=0);</span></div>
-<div class="line"><a name="l01023"></a><span class="lineno"> 1023</span>           <span class="comment">// probOut[classValueMap[nameVector[iclass]]][icol]=static_cast<short>(prv+0.5);</span></div>
-<div class="line"><a name="l01024"></a><span class="lineno"> 1024</span>         }</div>
-<div class="line"><a name="l01025"></a><span class="lineno"> 1025</span>         entropy[icol]/=log(static_cast<double>(nclass))/log(2.0);</div>
-<div class="line"><a name="l01026"></a><span class="lineno"> 1026</span>         entropy[icol]=<span class="keyword">static_cast<</span><span class="keywordtype">short</span><span class="keyword">></span>(100*entropy[icol]+0.5);</div>
-<div class="line"><a name="l01027"></a><span class="lineno"> 1027</span>     <span class="keywordflow">if</span>(active_opt.size()){</div>
-<div class="line"><a name="l01028"></a><span class="lineno"> 1028</span>       <span class="keywordflow">if</span>(entropy[icol]>activePoints.back().value){</div>
-<div class="line"><a name="l01029"></a><span class="lineno"> 1029</span>         activePoints.back().value=entropy[icol];<span class="comment">//replace largest value (last)</span></div>
-<div class="line"><a name="l01030"></a><span class="lineno"> 1030</span>         activePoints.back().posx=icol;</div>
-<div class="line"><a name="l01031"></a><span class="lineno"> 1031</span>         activePoints.back().posy=iline;</div>
-<div class="line"><a name="l01032"></a><span class="lineno"> 1032</span>         std::sort(activePoints.begin(),activePoints.end(),<a class="code" href="classDecrease__PosValue.html">Decrease_PosValue</a>());<span class="comment">//sort in descending order (largest first, smallest last)</span></div>
-<div class="line"><a name="l01033"></a><span class="lineno"> 1033</span>         <span class="keywordflow">if</span>(verbose_opt[0])</div>
-<div class="line"><a name="l01034"></a><span class="lineno"> 1034</span>           std::cout << activePoints.back().posx << <span class="stringliteral">" "</span> << activePoints.back().posy << <span class="stringliteral">" "</span> << activePoints.back().value << std::endl;</div>
-<div class="line"><a name="l01035"></a><span class="lineno"> 1035</span>       }</div>
-<div class="line"><a name="l01036"></a><span class="lineno"> 1036</span>         }</div>
-<div class="line"><a name="l01037"></a><span class="lineno"> 1037</span>       }<span class="comment">//icol</span></div>
-<div class="line"><a name="l01038"></a><span class="lineno"> 1038</span>       <span class="comment">//----------------------------------- write output ------------------------------------------</span></div>
-<div class="line"><a name="l01039"></a><span class="lineno"> 1039</span>       <span class="keywordflow">if</span>(classBag_opt.size())</div>
-<div class="line"><a name="l01040"></a><span class="lineno"> 1040</span>         <span class="keywordflow">for</span>(<span class="keywordtype">int</span> ibag=0;ibag<nbag;++ibag)</div>
-<div class="line"><a name="l01041"></a><span class="lineno"> 1041</span>           classImageBag.writeData(classBag[ibag],GDT_Byte,iline,ibag);</div>
-<div class="line"><a name="l01042"></a><span class="lineno"> 1042</span>       <span class="keywordflow">if</span>(prob_opt.size()){</div>
-<div class="line"><a name="l01043"></a><span class="lineno"> 1043</span>         <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iclass=0;iclass<nclass;++iclass)</div>
-<div class="line"><a name="l01044"></a><span class="lineno"> 1044</span>           probImage.writeData(probOut[iclass],GDT_Float32,iline,iclass);</div>
-<div class="line"><a name="l01045"></a><span class="lineno"> 1045</span>       }</div>
-<div class="line"><a name="l01046"></a><span class="lineno"> 1046</span>       <span class="keywordflow">if</span>(entropy_opt.size()){</div>
-<div class="line"><a name="l01047"></a><span class="lineno"> 1047</span>         entropyImage.writeData(entropy,GDT_Float32,iline);</div>
-<div class="line"><a name="l01048"></a><span class="lineno"> 1048</span>       }</div>
-<div class="line"><a name="l01049"></a><span class="lineno"> 1049</span>       classImageOut.writeData(classOut,GDT_Byte,iline);</div>
-<div class="line"><a name="l01050"></a><span class="lineno"> 1050</span>       <span class="keywordflow">if</span>(!verbose_opt[0]){</div>
-<div class="line"><a name="l01051"></a><span class="lineno"> 1051</span>         progress=<span class="keyword">static_cast<</span><span class="keywordtype">float</span><span class="keyword">></span>(iline+1.0)/classImageOut.nrOfRow();</div>
-<div class="line"><a name="l01052"></a><span class="lineno"> 1052</span>         pfnProgress(progress,pszMessage,pProgressArg);</div>
-<div class="line"><a name="l01053"></a><span class="lineno"> 1053</span>       }</div>
-<div class="line"><a name="l01054"></a><span class="lineno"> 1054</span>     }</div>
-<div class="line"><a name="l01055"></a><span class="lineno"> 1055</span>     <span class="comment">//write active learning points</span></div>
-<div class="line"><a name="l01056"></a><span class="lineno"> 1056</span>     <span class="keywordflow">if</span>(active_opt.size()){</div>
-<div class="line"><a name="l01057"></a><span class="lineno"> 1057</span>       <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iactive=0;iactive<activePoints.size();++iactive){</div>
-<div class="line"><a name="l01058"></a><span class="lineno"> 1058</span>     std::map<string,double> pointMap;</div>
-<div class="line"><a name="l01059"></a><span class="lineno"> 1059</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iband=0;iband<testImage.nrOfBand();++iband){</div>
-<div class="line"><a name="l01060"></a><span class="lineno"> 1060</span>       <span class="keywordtype">double</span> value;</div>
-<div class="line"><a name="l01061"></a><span class="lineno"> 1061</span>       testImage.readData(value,GDT_Float64,static_cast<int>(activePoints[iactive].posx),static_cast<int>(activePoints[iactive].posy),iband);</div>
-<div class="line"><a name="l01062"></a><span class="lineno"> 1062</span>       ostringstream fs;</div>
-<div class="line"><a name="l01063"></a><span class="lineno"> 1063</span>       fs << <span class="stringliteral">"B"</span> << iband;</div>
-<div class="line"><a name="l01064"></a><span class="lineno"> 1064</span>       pointMap[fs.str()]=value;</div>
-<div class="line"><a name="l01065"></a><span class="lineno"> 1065</span>     }</div>
-<div class="line"><a name="l01066"></a><span class="lineno"> 1066</span>     pointMap[label_opt[0]]=0;</div>
-<div class="line"><a name="l01067"></a><span class="lineno"> 1067</span>     <span class="keywordtype">double</span> x, y;</div>
-<div class="line"><a name="l01068"></a><span class="lineno"> 1068</span>     testImage.image2geo(activePoints[iactive].posx,activePoints[iactive].posy,x,y);</div>
-<div class="line"><a name="l01069"></a><span class="lineno"> 1069</span>         std::string fieldname=<span class="stringliteral">"id"</span>;<span class="comment">//number of the point</span></div>
-<div class="line"><a name="l01070"></a><span class="lineno"> 1070</span>     activeWriter.addPoint(x,y,pointMap,fieldname,++nactive);</div>
-<div class="line"><a name="l01071"></a><span class="lineno"> 1071</span>       }</div>
-<div class="line"><a name="l01072"></a><span class="lineno"> 1072</span>     }</div>
-<div class="line"><a name="l01073"></a><span class="lineno"> 1073</span> </div>
-<div class="line"><a name="l01074"></a><span class="lineno"> 1074</span>     testImage.close();</div>
-<div class="line"><a name="l01075"></a><span class="lineno"> 1075</span>     <span class="keywordflow">if</span>(mask_opt.size())</div>
-<div class="line"><a name="l01076"></a><span class="lineno"> 1076</span>       maskReader.close();</div>
-<div class="line"><a name="l01077"></a><span class="lineno"> 1077</span>     <span class="keywordflow">if</span>(priorimg_opt.size())</div>
-<div class="line"><a name="l01078"></a><span class="lineno"> 1078</span>       priorReader.close();</div>
-<div class="line"><a name="l01079"></a><span class="lineno"> 1079</span>     <span class="keywordflow">if</span>(prob_opt.size())</div>
-<div class="line"><a name="l01080"></a><span class="lineno"> 1080</span>       probImage.close();</div>
-<div class="line"><a name="l01081"></a><span class="lineno"> 1081</span>     <span class="keywordflow">if</span>(entropy_opt.size())</div>
-<div class="line"><a name="l01082"></a><span class="lineno"> 1082</span>       entropyImage.close();</div>
-<div class="line"><a name="l01083"></a><span class="lineno"> 1083</span>     <span class="keywordflow">if</span>(classBag_opt.size())</div>
-<div class="line"><a name="l01084"></a><span class="lineno"> 1084</span>       classImageBag.close();</div>
-<div class="line"><a name="l01085"></a><span class="lineno"> 1085</span>     classImageOut.close();</div>
-<div class="line"><a name="l01086"></a><span class="lineno"> 1086</span>   }</div>
-<div class="line"><a name="l01087"></a><span class="lineno"> 1087</span>   <span class="keywordflow">else</span>{<span class="comment">//classify vector file</span></div>
-<div class="line"><a name="l01088"></a><span class="lineno"> 1088</span>     cm.clearResults();</div>
-<div class="line"><a name="l01089"></a><span class="lineno"> 1089</span>     <span class="comment">//notice that fields have already been set by readDataImageOgr (taking into account appropriate bands)</span></div>
-<div class="line"><a name="l01090"></a><span class="lineno"> 1090</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> ivalidation=0;ivalidation<input_opt.size();++ivalidation){</div>
-<div class="line"><a name="l01091"></a><span class="lineno"> 1091</span>       <span class="keywordflow">if</span>(output_opt.size())</div>
-<div class="line"><a name="l01092"></a><span class="lineno"> 1092</span>         assert(output_opt.size()==input_opt.size());</div>
-<div class="line"><a name="l01093"></a><span class="lineno"> 1093</span>       <span class="keywordflow">if</span>(verbose_opt[0])</div>
-<div class="line"><a name="l01094"></a><span class="lineno"> 1094</span>         cout << <span class="stringliteral">"opening img reader "</span> << input_opt[ivalidation] << endl;</div>
-<div class="line"><a name="l01095"></a><span class="lineno"> 1095</span>       imgReaderOgr.open(input_opt[ivalidation]);</div>
-<div class="line"><a name="l01096"></a><span class="lineno"> 1096</span>       <a class="code" href="classImgWriterOgr.html">ImgWriterOgr</a> imgWriterOgr;</div>
-<div class="line"><a name="l01097"></a><span class="lineno"> 1097</span> </div>
-<div class="line"><a name="l01098"></a><span class="lineno"> 1098</span>       <span class="keywordflow">if</span>(output_opt.size()){</div>
-<div class="line"><a name="l01099"></a><span class="lineno"> 1099</span>     <span class="keywordflow">if</span>(verbose_opt[0])</div>
-<div class="line"><a name="l01100"></a><span class="lineno"> 1100</span>       std::cout << <span class="stringliteral">"opening img writer and copying fields from img reader"</span> << output_opt[ivalidation] << std::endl;</div>
-<div class="line"><a name="l01101"></a><span class="lineno"> 1101</span>     imgWriterOgr.open(output_opt[ivalidation],imgReaderOgr);</div>
-<div class="line"><a name="l01102"></a><span class="lineno"> 1102</span>       }</div>
-<div class="line"><a name="l01103"></a><span class="lineno"> 1103</span>       <span class="keywordflow">if</span>(verbose_opt[0])</div>
-<div class="line"><a name="l01104"></a><span class="lineno"> 1104</span>     cout << <span class="stringliteral">"number of layers in input ogr file: "</span> << imgReaderOgr.getLayerCount() << endl;</div>
-<div class="line"><a name="l01105"></a><span class="lineno"> 1105</span>       <span class="keywordflow">for</span>(<span class="keywordtype">int</span> ilayer=0;ilayer<imgReaderOgr.getLayerCount();++ilayer){</div>
-<div class="line"><a name="l01106"></a><span class="lineno"> 1106</span>     <span class="keywordflow">if</span>(verbose_opt[0])</div>
-<div class="line"><a name="l01107"></a><span class="lineno"> 1107</span>       cout << <span class="stringliteral">"processing input layer "</span> << ilayer << endl;</div>
-<div class="line"><a name="l01108"></a><span class="lineno"> 1108</span>     <span class="keywordflow">if</span>(output_opt.size()){</div>
-<div class="line"><a name="l01109"></a><span class="lineno"> 1109</span>       <span class="keywordflow">if</span>(verbose_opt[0])</div>
-<div class="line"><a name="l01110"></a><span class="lineno"> 1110</span>         std::cout << <span class="stringliteral">"creating field class"</span> << std::endl;</div>
-<div class="line"><a name="l01111"></a><span class="lineno"> 1111</span>       <span class="keywordflow">if</span>(classValueMap.size())</div>
-<div class="line"><a name="l01112"></a><span class="lineno"> 1112</span>         imgWriterOgr.createField(<span class="stringliteral">"class"</span>,OFTInteger,ilayer);</div>
-<div class="line"><a name="l01113"></a><span class="lineno"> 1113</span>       <span class="keywordflow">else</span></div>
-<div class="line"><a name="l01114"></a><span class="lineno"> 1114</span>         imgWriterOgr.createField(<span class="stringliteral">"class"</span>,OFTString,ilayer);</div>
-<div class="line"><a name="l01115"></a><span class="lineno"> 1115</span>     }</div>
-<div class="line"><a name="l01116"></a><span class="lineno"> 1116</span>     <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> nFeatures=imgReaderOgr.getFeatureCount(ilayer);</div>
-<div class="line"><a name="l01117"></a><span class="lineno"> 1117</span>     <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> ifeature=0;</div>
-<div class="line"><a name="l01118"></a><span class="lineno"> 1118</span>     progress=0;</div>
-<div class="line"><a name="l01119"></a><span class="lineno"> 1119</span>     pfnProgress(progress,pszMessage,pProgressArg);</div>
-<div class="line"><a name="l01120"></a><span class="lineno"> 1120</span>     OGRFeature *poFeature;</div>
-<div class="line"><a name="l01121"></a><span class="lineno"> 1121</span>     <span class="keywordflow">while</span>( (poFeature = imgReaderOgr.getLayer(ilayer)->GetNextFeature()) != NULL ){</div>
-<div class="line"><a name="l01122"></a><span class="lineno"> 1122</span>       <span class="keywordflow">if</span>(verbose_opt[0]>1)</div>
-<div class="line"><a name="l01123"></a><span class="lineno"> 1123</span>         cout << <span class="stringliteral">"feature "</span> << ifeature << endl;</div>
-<div class="line"><a name="l01124"></a><span class="lineno"> 1124</span>       <span class="keywordflow">if</span>( poFeature == NULL ){</div>
-<div class="line"><a name="l01125"></a><span class="lineno"> 1125</span>         cout << <span class="stringliteral">"Warning: could not read feature "</span> << ifeature << <span class="stringliteral">" in layer "</span> << imgReaderOgr.getLayerName(ilayer) << endl;</div>
-<div class="line"><a name="l01126"></a><span class="lineno"> 1126</span>         <span class="keywordflow">continue</span>;</div>
-<div class="line"><a name="l01127"></a><span class="lineno"> 1127</span>       }</div>
-<div class="line"><a name="l01128"></a><span class="lineno"> 1128</span>       OGRFeature *poDstFeature = NULL;</div>
-<div class="line"><a name="l01129"></a><span class="lineno"> 1129</span>       <span class="keywordflow">if</span>(output_opt.size()){</div>
-<div class="line"><a name="l01130"></a><span class="lineno"> 1130</span>         poDstFeature=imgWriterOgr.createFeature(ilayer);</div>
-<div class="line"><a name="l01131"></a><span class="lineno"> 1131</span>         <span class="keywordflow">if</span>( poDstFeature->SetFrom( poFeature, TRUE ) != OGRERR_NONE ){</div>
-<div class="line"><a name="l01132"></a><span class="lineno"> 1132</span>           CPLError( CE_Failure, CPLE_AppDefined,</div>
-<div class="line"><a name="l01133"></a><span class="lineno"> 1133</span>             <span class="stringliteral">"Unable to translate feature %d from layer %s.\n"</span>,</div>
-<div class="line"><a name="l01134"></a><span class="lineno"> 1134</span>             poFeature->GetFID(), imgWriterOgr.getLayerName(ilayer).c_str() );</div>
-<div class="line"><a name="l01135"></a><span class="lineno"> 1135</span>           OGRFeature::DestroyFeature( poFeature );</div>
-<div class="line"><a name="l01136"></a><span class="lineno"> 1136</span>           OGRFeature::DestroyFeature( poDstFeature );</div>
-<div class="line"><a name="l01137"></a><span class="lineno"> 1137</span>         }</div>
+<div class="line"><a name="l00907"></a><span class="lineno">  907</span>         }</div>
+<div class="line"><a name="l00908"></a><span class="lineno">  908</span>       }</div>
+<div class="line"><a name="l00909"></a><span class="lineno">  909</span>       <span class="keywordflow">catch</span>(<span class="keywordtype">string</span> theError){</div>
+<div class="line"><a name="l00910"></a><span class="lineno">  910</span>         cerr << <span class="stringliteral">"Error reading "</span> << input_opt[0] << <span class="stringliteral">": "</span> << theError << std::endl;</div>
+<div class="line"><a name="l00911"></a><span class="lineno">  911</span>         exit(3);</div>
+<div class="line"><a name="l00912"></a><span class="lineno">  912</span>       }</div>
+<div class="line"><a name="l00913"></a><span class="lineno">  913</span>       <span class="keywordflow">catch</span>(...){</div>
+<div class="line"><a name="l00914"></a><span class="lineno">  914</span>         cerr << <span class="stringliteral">"error catched"</span> << std::endl;</div>
+<div class="line"><a name="l00915"></a><span class="lineno">  915</span>         exit(3);</div>
+<div class="line"><a name="l00916"></a><span class="lineno">  916</span>       }</div>
+<div class="line"><a name="l00917"></a><span class="lineno">  917</span>       assert(nband==hpixel[0].size());</div>
+<div class="line"><a name="l00918"></a><span class="lineno">  918</span>       <span class="keywordflow">if</span>(verbose_opt[0]==2)</div>
+<div class="line"><a name="l00919"></a><span class="lineno">  919</span>         cout << <span class="stringliteral">"used bands: "</span> << nband << endl;</div>
+<div class="line"><a name="l00920"></a><span class="lineno">  920</span>       <span class="comment">//read prior</span></div>
+<div class="line"><a name="l00921"></a><span class="lineno">  921</span>       <span class="keywordflow">if</span>(priorimg_opt.size()){</div>
+<div class="line"><a name="l00922"></a><span class="lineno">  922</span>         <span class="keywordflow">try</span>{</div>
+<div class="line"><a name="l00923"></a><span class="lineno">  923</span>       <span class="keywordflow">for</span>(<span class="keywordtype">short</span> iclass=0;iclass<nclass;++iclass){</div>
+<div class="line"><a name="l00924"></a><span class="lineno">  924</span>         <span class="keywordflow">if</span>(verbose_opt.size()>1)</div>
+<div class="line"><a name="l00925"></a><span class="lineno">  925</span>           std::cout << <span class="stringliteral">"Reading "</span> << priorimg_opt[0] << <span class="stringliteral">" band "</span> << iclass << <span class="stringliteral">" line "</span> << iline << std::endl;</div>
+<div class="line"><a name="l00926"></a><span class="lineno">  926</span>         priorReader.readData(linePrior[iclass],GDT_Float32,iline,iclass);</div>
+<div class="line"><a name="l00927"></a><span class="lineno">  927</span>       }</div>
+<div class="line"><a name="l00928"></a><span class="lineno">  928</span>         }</div>
+<div class="line"><a name="l00929"></a><span class="lineno">  929</span>         <span class="keywordflow">catch</span>(<span class="keywordtype">string</span> theError){</div>
+<div class="line"><a name="l00930"></a><span class="lineno">  930</span>       std::cerr << <span class="stringliteral">"Error reading "</span> << priorimg_opt[0] << <span class="stringliteral">": "</span> << theError << std::endl;</div>
+<div class="line"><a name="l00931"></a><span class="lineno">  931</span>           exit(3);</div>
+<div class="line"><a name="l00932"></a><span class="lineno">  932</span>         }</div>
+<div class="line"><a name="l00933"></a><span class="lineno">  933</span>         <span class="keywordflow">catch</span>(...){</div>
+<div class="line"><a name="l00934"></a><span class="lineno">  934</span>           cerr << <span class="stringliteral">"error catched"</span> << std::endl;</div>
+<div class="line"><a name="l00935"></a><span class="lineno">  935</span>           exit(3);</div>
+<div class="line"><a name="l00936"></a><span class="lineno">  936</span>         }</div>
+<div class="line"><a name="l00937"></a><span class="lineno">  937</span>       }</div>
+<div class="line"><a name="l00938"></a><span class="lineno">  938</span>       <span class="keywordtype">double</span> oldRowMask=-1;<span class="comment">//keep track of row mask to optimize number of line readings</span></div>
+<div class="line"><a name="l00939"></a><span class="lineno">  939</span>       <span class="comment">//process per pixel</span></div>
+<div class="line"><a name="l00940"></a><span class="lineno">  940</span>       <span class="keywordflow">for</span>(<span class="keywordtype">int</span> icol=0;icol<ncol;++icol){</div>
+<div class="line"><a name="l00941"></a><span class="lineno">  941</span>         assert(hpixel[icol].size()==nband);</div>
+<div class="line"><a name="l00942"></a><span class="lineno">  942</span>     <span class="keywordtype">bool</span> doClassify=<span class="keyword">true</span>;</div>
+<div class="line"><a name="l00943"></a><span class="lineno">  943</span>         <span class="keywordtype">bool</span> masked=<span class="keyword">false</span>;</div>
+<div class="line"><a name="l00944"></a><span class="lineno">  944</span>     <span class="keywordtype">double</span> geox=0;</div>
+<div class="line"><a name="l00945"></a><span class="lineno">  945</span>     <span class="keywordtype">double</span> geoy=0;</div>
+<div class="line"><a name="l00946"></a><span class="lineno">  946</span>         <span class="keywordflow">if</span>(maskIsVector){</div>
+<div class="line"><a name="l00947"></a><span class="lineno">  947</span>       doClassify=<span class="keyword">false</span>;</div>
+<div class="line"><a name="l00948"></a><span class="lineno">  948</span>       testImage.image2geo(icol,iline,geox,geoy);</div>
+<div class="line"><a name="l00949"></a><span class="lineno">  949</span>       <span class="comment">//check enveloppe first</span></div>
+<div class="line"><a name="l00950"></a><span class="lineno">  950</span>       <span class="keywordflow">if</span>(uly>=geoy&&lry<=geoy&&ulx<=geox&&lrx>=geox){</div>
+<div class="line"><a name="l00951"></a><span class="lineno">  951</span>         doClassify=<span class="keyword">true</span>;</div>
+<div class="line"><a name="l00952"></a><span class="lineno">  952</span>       }</div>
+<div class="line"><a name="l00953"></a><span class="lineno">  953</span>     }</div>
+<div class="line"><a name="l00954"></a><span class="lineno">  954</span>         <span class="keywordflow">if</span>(mask_opt.size()){</div>
+<div class="line"><a name="l00955"></a><span class="lineno">  955</span>       <span class="comment">//read mask</span></div>
+<div class="line"><a name="l00956"></a><span class="lineno">  956</span>       <span class="keywordtype">double</span> colMask=0;</div>
+<div class="line"><a name="l00957"></a><span class="lineno">  957</span>       <span class="keywordtype">double</span> rowMask=0;</div>
+<div class="line"><a name="l00958"></a><span class="lineno">  958</span> </div>
+<div class="line"><a name="l00959"></a><span class="lineno">  959</span>       testImage.image2geo(icol,iline,geox,geoy);</div>
+<div class="line"><a name="l00960"></a><span class="lineno">  960</span>       maskReader.geo2image(geox,geoy,colMask,rowMask);</div>
+<div class="line"><a name="l00961"></a><span class="lineno">  961</span>       colMask=<span class="keyword">static_cast<</span><span class="keywordtype">int</span><span class="keyword">></span>(colMask);</div>
+<div class="line"><a name="l00962"></a><span class="lineno">  962</span>       rowMask=<span class="keyword">static_cast<</span><span class="keywordtype">int</span><span class="keyword">></span>(rowMask);</div>
+<div class="line"><a name="l00963"></a><span class="lineno">  963</span>       <span class="keywordflow">if</span>(rowMask>=0&&rowMask<maskReader.nrOfRow()&&colMask>=0&&colMask<maskReader.nrOfCol()){</div>
+<div class="line"><a name="l00964"></a><span class="lineno">  964</span>         <span class="keywordflow">if</span>(static_cast<int>(rowMask)!=<span class="keyword">static_cast<</span><span class="keywordtype">int</span><span class="keyword">></span>(oldRowMask)){</div>
+<div class="line"><a name="l00965"></a><span class="lineno">  965</span>           assert(rowMask>=0&&rowMask<maskReader.nrOfRow());</div>
+<div class="line"><a name="l00966"></a><span class="lineno">  966</span>           <span class="keywordflow">try</span>{</div>
+<div class="line"><a name="l00967"></a><span class="lineno">  967</span>         <span class="comment">// maskReader.readData(lineMask[imask],GDT_Int32,static_cast<int>(rowMask));</span></div>
+<div class="line"><a name="l00968"></a><span class="lineno">  968</span>         maskReader.readData(lineMask,GDT_Int16,static_cast<int>(rowMask));</div>
+<div class="line"><a name="l00969"></a><span class="lineno">  969</span>           }</div>
+<div class="line"><a name="l00970"></a><span class="lineno">  970</span>           <span class="keywordflow">catch</span>(<span class="keywordtype">string</span> errorstring){</div>
+<div class="line"><a name="l00971"></a><span class="lineno">  971</span>         cerr << errorstring << endl;</div>
+<div class="line"><a name="l00972"></a><span class="lineno">  972</span>         exit(1);</div>
+<div class="line"><a name="l00973"></a><span class="lineno">  973</span>           }</div>
+<div class="line"><a name="l00974"></a><span class="lineno">  974</span>           <span class="keywordflow">catch</span>(...){</div>
+<div class="line"><a name="l00975"></a><span class="lineno">  975</span>         cerr << <span class="stringliteral">"error catched"</span> << std::endl;</div>
+<div class="line"><a name="l00976"></a><span class="lineno">  976</span>         exit(3);</div>
+<div class="line"><a name="l00977"></a><span class="lineno">  977</span>           }</div>
+<div class="line"><a name="l00978"></a><span class="lineno">  978</span>           oldRowMask=rowMask;</div>
+<div class="line"><a name="l00979"></a><span class="lineno">  979</span>         }</div>
+<div class="line"><a name="l00980"></a><span class="lineno">  980</span>         <span class="keywordtype">short</span> theMask=0;</div>
+<div class="line"><a name="l00981"></a><span class="lineno">  981</span>         <span class="keywordflow">for</span>(<span class="keywordtype">short</span> ivalue=0;ivalue<msknodata_opt.size();++ivalue){</div>
+<div class="line"><a name="l00982"></a><span class="lineno">  982</span>           <span class="keywordflow">if</span>(msknodata_opt[ivalue]>=0){<span class="comment">//values set in msknodata_opt are invalid</span></div>
+<div class="line"><a name="l00983"></a><span class="lineno">  983</span>         <span class="keywordflow">if</span>(lineMask[colMask]==msknodata_opt[ivalue]){</div>
+<div class="line"><a name="l00984"></a><span class="lineno">  984</span>           theMask=lineMask[colMask];</div>
+<div class="line"><a name="l00985"></a><span class="lineno">  985</span>           masked=<span class="keyword">true</span>;</div>
+<div class="line"><a name="l00986"></a><span class="lineno">  986</span>           <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l00987"></a><span class="lineno">  987</span>         }</div>
+<div class="line"><a name="l00988"></a><span class="lineno">  988</span>           }</div>
+<div class="line"><a name="l00989"></a><span class="lineno">  989</span>           <span class="keywordflow">else</span>{<span class="comment">//only values set in msknodata_opt are valid</span></div>
+<div class="line"><a name="l00990"></a><span class="lineno">  990</span>         <span class="keywordflow">if</span>(lineMask[colMask]!=-msknodata_opt[ivalue]){</div>
+<div class="line"><a name="l00991"></a><span class="lineno">  991</span>           theMask=lineMask[colMask];</div>
+<div class="line"><a name="l00992"></a><span class="lineno">  992</span>           masked=<span class="keyword">true</span>;</div>
+<div class="line"><a name="l00993"></a><span class="lineno">  993</span>         }</div>
+<div class="line"><a name="l00994"></a><span class="lineno">  994</span>         <span class="keywordflow">else</span>{</div>
+<div class="line"><a name="l00995"></a><span class="lineno">  995</span>           masked=<span class="keyword">false</span>;</div>
+<div class="line"><a name="l00996"></a><span class="lineno">  996</span>           <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l00997"></a><span class="lineno">  997</span>         }</div>
+<div class="line"><a name="l00998"></a><span class="lineno">  998</span>           }</div>
+<div class="line"><a name="l00999"></a><span class="lineno">  999</span>         }</div>
+<div class="line"><a name="l01000"></a><span class="lineno"> 1000</span>         <span class="keywordflow">if</span>(masked){</div>
+<div class="line"><a name="l01001"></a><span class="lineno"> 1001</span>           <span class="keywordflow">if</span>(classBag_opt.size())</div>
+<div class="line"><a name="l01002"></a><span class="lineno"> 1002</span>         <span class="keywordflow">for</span>(<span class="keywordtype">int</span> ibag=0;ibag<nbag;++ibag)</div>
+<div class="line"><a name="l01003"></a><span class="lineno"> 1003</span>           classBag[ibag][icol]=theMask;</div>
+<div class="line"><a name="l01004"></a><span class="lineno"> 1004</span>           classOut[icol]=theMask;</div>
+<div class="line"><a name="l01005"></a><span class="lineno"> 1005</span>           <span class="keywordflow">continue</span>;</div>
+<div class="line"><a name="l01006"></a><span class="lineno"> 1006</span>         }</div>
+<div class="line"><a name="l01007"></a><span class="lineno"> 1007</span>       }</div>
+<div class="line"><a name="l01008"></a><span class="lineno"> 1008</span>       <span class="keywordtype">bool</span> valid=<span class="keyword">false</span>;</div>
+<div class="line"><a name="l01009"></a><span class="lineno"> 1009</span>       <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iband=0;iband<hpixel[icol].size();++iband){</div>
+<div class="line"><a name="l01010"></a><span class="lineno"> 1010</span>         <span class="keywordflow">if</span>(hpixel[icol][iband]){</div>
+<div class="line"><a name="l01011"></a><span class="lineno"> 1011</span>           valid=<span class="keyword">true</span>;</div>
+<div class="line"><a name="l01012"></a><span class="lineno"> 1012</span>           <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l01013"></a><span class="lineno"> 1013</span>         }</div>
+<div class="line"><a name="l01014"></a><span class="lineno"> 1014</span>       }</div>
+<div class="line"><a name="l01015"></a><span class="lineno"> 1015</span>       <span class="keywordflow">if</span>(!valid)</div>
+<div class="line"><a name="l01016"></a><span class="lineno"> 1016</span>         doClassify=<span class="keyword">false</span>;</div>
+<div class="line"><a name="l01017"></a><span class="lineno"> 1017</span> </div>
+<div class="line"><a name="l01018"></a><span class="lineno"> 1018</span>     }</div>
+<div class="line"><a name="l01019"></a><span class="lineno"> 1019</span>         <span class="keywordflow">for</span>(<span class="keywordtype">short</span> iclass=0;iclass<nclass;++iclass)</div>
+<div class="line"><a name="l01020"></a><span class="lineno"> 1020</span>           probOut[iclass][icol]=0;</div>
+<div class="line"><a name="l01021"></a><span class="lineno"> 1021</span>     <span class="keywordflow">if</span>(!doClassify){</div>
+<div class="line"><a name="l01022"></a><span class="lineno"> 1022</span>       <span class="keywordflow">if</span>(classBag_opt.size())</div>
+<div class="line"><a name="l01023"></a><span class="lineno"> 1023</span>         <span class="keywordflow">for</span>(<span class="keywordtype">int</span> ibag=0;ibag<nbag;++ibag)</div>
+<div class="line"><a name="l01024"></a><span class="lineno"> 1024</span>           classBag[ibag][icol]=nodata_opt[0];</div>
+<div class="line"><a name="l01025"></a><span class="lineno"> 1025</span>       classOut[icol]=nodata_opt[0];</div>
+<div class="line"><a name="l01026"></a><span class="lineno"> 1026</span>       <span class="keywordflow">continue</span>;<span class="comment">//next column</span></div>
+<div class="line"><a name="l01027"></a><span class="lineno"> 1027</span>     }</div>
+<div class="line"><a name="l01028"></a><span class="lineno"> 1028</span>     <span class="keywordflow">if</span>(verbose_opt[0]>1)</div>
+<div class="line"><a name="l01029"></a><span class="lineno"> 1029</span>       std::cout << <span class="stringliteral">"begin classification "</span> << std::endl;</div>
+<div class="line"><a name="l01030"></a><span class="lineno"> 1030</span>         <span class="comment">//----------------------------------- classification -------------------</span></div>
+<div class="line"><a name="l01031"></a><span class="lineno"> 1031</span>         <span class="keywordflow">for</span>(<span class="keywordtype">int</span> ibag=0;ibag<nbag;++ibag){</div>
+<div class="line"><a name="l01032"></a><span class="lineno"> 1032</span>           <span class="comment">//calculate image features</span></div>
+<div class="line"><a name="l01033"></a><span class="lineno"> 1033</span>           fpixel[icol].clear();</div>
+<div class="line"><a name="l01034"></a><span class="lineno"> 1034</span>           <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iband=0;iband<nband;++iband)</div>
+<div class="line"><a name="l01035"></a><span class="lineno"> 1035</span>             fpixel[icol].push_back((hpixel[icol][iband]-offset[ibag][iband])/scale[ibag][iband]);</div>
+<div class="line"><a name="l01036"></a><span class="lineno"> 1036</span>           vector<float> result(nclass);</div>
+<div class="line"><a name="l01037"></a><span class="lineno"> 1037</span>           result=net[ibag].run(fpixel[icol]);</div>
+<div class="line"><a name="l01038"></a><span class="lineno"> 1038</span>           <span class="keywordtype">int</span> maxClass=0;</div>
+<div class="line"><a name="l01039"></a><span class="lineno"> 1039</span>           vector<float> prValues(nclass);</div>
+<div class="line"><a name="l01040"></a><span class="lineno"> 1040</span>           <span class="keywordtype">float</span> maxP=0;</div>
+<div class="line"><a name="l01041"></a><span class="lineno"> 1041</span> </div>
+<div class="line"><a name="l01042"></a><span class="lineno"> 1042</span>           <span class="comment">//calculate posterior prob of bag </span></div>
+<div class="line"><a name="l01043"></a><span class="lineno"> 1043</span>           <span class="keywordflow">if</span>(classBag_opt.size()){</div>
+<div class="line"><a name="l01044"></a><span class="lineno"> 1044</span>             <span class="comment">//search for max prob within bag</span></div>
+<div class="line"><a name="l01045"></a><span class="lineno"> 1045</span>             maxP=0;</div>
+<div class="line"><a name="l01046"></a><span class="lineno"> 1046</span>             classBag[ibag][icol]=0;</div>
+<div class="line"><a name="l01047"></a><span class="lineno"> 1047</span>           }</div>
+<div class="line"><a name="l01048"></a><span class="lineno"> 1048</span>       <span class="keywordtype">double</span> normPrior=0;</div>
+<div class="line"><a name="l01049"></a><span class="lineno"> 1049</span>       <span class="keywordflow">if</span>(priorimg_opt.size()){</div>
+<div class="line"><a name="l01050"></a><span class="lineno"> 1050</span>         <span class="keywordflow">for</span>(<span class="keywordtype">short</span> iclass=0;iclass<nclass;++iclass)</div>
+<div class="line"><a name="l01051"></a><span class="lineno"> 1051</span>           normPrior+=linePrior[iclass][icol];</div>
+<div class="line"><a name="l01052"></a><span class="lineno"> 1052</span>       }</div>
+<div class="line"><a name="l01053"></a><span class="lineno"> 1053</span>           <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iclass=0;iclass<nclass;++iclass){</div>
+<div class="line"><a name="l01054"></a><span class="lineno"> 1054</span>         result[iclass]=(result[iclass]+1.0)/2.0;<span class="comment">//bring back to scale [0,1]</span></div>
+<div class="line"><a name="l01055"></a><span class="lineno"> 1055</span>         <span class="keywordflow">if</span>(priorimg_opt.size())</div>
+<div class="line"><a name="l01056"></a><span class="lineno"> 1056</span>           priors[iclass]=linePrior[iclass][icol]/normPrior;<span class="comment">//todo: check if correct for all cases... (automatic classValueMap and manual input for names and values)</span></div>
+<div class="line"><a name="l01057"></a><span class="lineno"> 1057</span>             <span class="keywordflow">switch</span>(comb_opt[0]){</div>
+<div class="line"><a name="l01058"></a><span class="lineno"> 1058</span>             <span class="keywordflow">default</span>:</div>
+<div class="line"><a name="l01059"></a><span class="lineno"> 1059</span>             <span class="keywordflow">case</span>(0):<span class="comment">//sum rule</span></div>
+<div class="line"><a name="l01060"></a><span class="lineno"> 1060</span>               probOut[iclass][icol]+=result[iclass]*priors[iclass];<span class="comment">//add probabilities for each bag</span></div>
+<div class="line"><a name="l01061"></a><span class="lineno"> 1061</span>               <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l01062"></a><span class="lineno"> 1062</span>             <span class="keywordflow">case</span>(1):<span class="comment">//product rule</span></div>
+<div class="line"><a name="l01063"></a><span class="lineno"> 1063</span>               probOut[iclass][icol]*=pow(static_cast<float>(priors[iclass]),static_cast<float>(1.0-nbag)/nbag)*result[iclass];<span class="comment">//multiply probabilities for each bag</span></div>
+<div class="line"><a name="l01064"></a><span class="lineno"> 1064</span>               <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l01065"></a><span class="lineno"> 1065</span>             <span class="keywordflow">case</span>(2):<span class="comment">//max rule</span></div>
+<div class="line"><a name="l01066"></a><span class="lineno"> 1066</span>               <span class="keywordflow">if</span>(priors[iclass]*result[iclass]>probOut[iclass][icol])</div>
+<div class="line"><a name="l01067"></a><span class="lineno"> 1067</span>                 probOut[iclass][icol]=priors[iclass]*result[iclass];</div>
+<div class="line"><a name="l01068"></a><span class="lineno"> 1068</span>               <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l01069"></a><span class="lineno"> 1069</span>             }</div>
+<div class="line"><a name="l01070"></a><span class="lineno"> 1070</span>             <span class="keywordflow">if</span>(classBag_opt.size()){</div>
+<div class="line"><a name="l01071"></a><span class="lineno"> 1071</span>               <span class="comment">//search for max prob within bag</span></div>
+<div class="line"><a name="l01072"></a><span class="lineno"> 1072</span>               <span class="comment">// if(prValues[iclass]>maxP){</span></div>
+<div class="line"><a name="l01073"></a><span class="lineno"> 1073</span>               <span class="comment">//   maxP=prValues[iclass];</span></div>
+<div class="line"><a name="l01074"></a><span class="lineno"> 1074</span>               <span class="comment">//   classBag[ibag][icol]=vcode[iclass];</span></div>
+<div class="line"><a name="l01075"></a><span class="lineno"> 1075</span>               <span class="comment">// }</span></div>
+<div class="line"><a name="l01076"></a><span class="lineno"> 1076</span>               <span class="keywordflow">if</span>(result[iclass]>maxP){</div>
+<div class="line"><a name="l01077"></a><span class="lineno"> 1077</span>                 maxP=result[iclass];</div>
+<div class="line"><a name="l01078"></a><span class="lineno"> 1078</span>                 classBag[ibag][icol]=iclass;</div>
+<div class="line"><a name="l01079"></a><span class="lineno"> 1079</span>               }</div>
+<div class="line"><a name="l01080"></a><span class="lineno"> 1080</span>             }</div>
+<div class="line"><a name="l01081"></a><span class="lineno"> 1081</span>           }</div>
+<div class="line"><a name="l01082"></a><span class="lineno"> 1082</span>         }<span class="comment">//ibag</span></div>
+<div class="line"><a name="l01083"></a><span class="lineno"> 1083</span> </div>
+<div class="line"><a name="l01084"></a><span class="lineno"> 1084</span>         <span class="comment">//search for max class prob</span></div>
+<div class="line"><a name="l01085"></a><span class="lineno"> 1085</span>         <span class="keywordtype">float</span> maxBag1=0;<span class="comment">//max probability</span></div>
+<div class="line"><a name="l01086"></a><span class="lineno"> 1086</span>         <span class="keywordtype">float</span> maxBag2=0;<span class="comment">//second max probability</span></div>
+<div class="line"><a name="l01087"></a><span class="lineno"> 1087</span>         <span class="keywordtype">float</span> normBag=0;</div>
+<div class="line"><a name="l01088"></a><span class="lineno"> 1088</span>         <span class="keywordflow">for</span>(<span class="keywordtype">short</span> iclass=0;iclass<nclass;++iclass){</div>
+<div class="line"><a name="l01089"></a><span class="lineno"> 1089</span>           <span class="keywordflow">if</span>(probOut[iclass][icol]>maxBag1){</div>
+<div class="line"><a name="l01090"></a><span class="lineno"> 1090</span>             maxBag1=probOut[iclass][icol];</div>
+<div class="line"><a name="l01091"></a><span class="lineno"> 1091</span>             classOut[icol]=classValueMap[nameVector[iclass]];</div>
+<div class="line"><a name="l01092"></a><span class="lineno"> 1092</span>           }</div>
+<div class="line"><a name="l01093"></a><span class="lineno"> 1093</span>       <span class="keywordflow">else</span> <span class="keywordflow">if</span>(probOut[iclass][icol]>maxBag2)</div>
+<div class="line"><a name="l01094"></a><span class="lineno"> 1094</span>             maxBag2=probOut[iclass][icol];</div>
+<div class="line"><a name="l01095"></a><span class="lineno"> 1095</span>           normBag+=probOut[iclass][icol];</div>
+<div class="line"><a name="l01096"></a><span class="lineno"> 1096</span>         }</div>
+<div class="line"><a name="l01097"></a><span class="lineno"> 1097</span>         <span class="comment">//normalize probOut and convert to percentage</span></div>
+<div class="line"><a name="l01098"></a><span class="lineno"> 1098</span>         entropy[icol]=0;</div>
+<div class="line"><a name="l01099"></a><span class="lineno"> 1099</span>         <span class="keywordflow">for</span>(<span class="keywordtype">short</span> iclass=0;iclass<nclass;++iclass){</div>
+<div class="line"><a name="l01100"></a><span class="lineno"> 1100</span>           <span class="keywordtype">float</span> prv=probOut[iclass][icol];</div>
+<div class="line"><a name="l01101"></a><span class="lineno"> 1101</span>           prv/=normBag;</div>
+<div class="line"><a name="l01102"></a><span class="lineno"> 1102</span>           entropy[icol]-=prv*log(prv)/log(2.0);</div>
+<div class="line"><a name="l01103"></a><span class="lineno"> 1103</span>           prv*=100.0;</div>
+<div class="line"><a name="l01104"></a><span class="lineno"> 1104</span>             </div>
+<div class="line"><a name="l01105"></a><span class="lineno"> 1105</span>           probOut[iclass][icol]=<span class="keyword">static_cast<</span><span class="keywordtype">short</span><span class="keyword">></span>(prv+0.5);</div>
+<div class="line"><a name="l01106"></a><span class="lineno"> 1106</span>           <span class="comment">// assert(classValueMap[nameVector[iclass]]<probOut.size());</span></div>
+<div class="line"><a name="l01107"></a><span class="lineno"> 1107</span>           <span class="comment">// assert(classValueMap[nameVector[iclass]]>=0);</span></div>
+<div class="line"><a name="l01108"></a><span class="lineno"> 1108</span>           <span class="comment">// probOut[classValueMap[nameVector[iclass]]][icol]=static_cast<short>(prv+0.5);</span></div>
+<div class="line"><a name="l01109"></a><span class="lineno"> 1109</span>         }</div>
+<div class="line"><a name="l01110"></a><span class="lineno"> 1110</span>         entropy[icol]/=log(static_cast<double>(nclass))/log(2.0);</div>
+<div class="line"><a name="l01111"></a><span class="lineno"> 1111</span>         entropy[icol]=<span class="keyword">static_cast<</span><span class="keywordtype">short</span><span class="keyword">></span>(100*entropy[icol]+0.5);</div>
+<div class="line"><a name="l01112"></a><span class="lineno"> 1112</span>     <span class="keywordflow">if</span>(active_opt.size()){</div>
+<div class="line"><a name="l01113"></a><span class="lineno"> 1113</span>       <span class="keywordflow">if</span>(entropy[icol]>activePoints.back().value){</div>
+<div class="line"><a name="l01114"></a><span class="lineno"> 1114</span>         activePoints.back().value=entropy[icol];<span class="comment">//replace largest value (last)</span></div>
+<div class="line"><a name="l01115"></a><span class="lineno"> 1115</span>         activePoints.back().posx=icol;</div>
+<div class="line"><a name="l01116"></a><span class="lineno"> 1116</span>         activePoints.back().posy=iline;</div>
+<div class="line"><a name="l01117"></a><span class="lineno"> 1117</span>         std::sort(activePoints.begin(),activePoints.end(),<a class="code" href="classDecrease__PosValue.html">Decrease_PosValue</a>());<span class="comment">//sort in descending order (largest first, smallest last)</span></div>
+<div class="line"><a name="l01118"></a><span class="lineno"> 1118</span>         <span class="keywordflow">if</span>(verbose_opt[0])</div>
+<div class="line"><a name="l01119"></a><span class="lineno"> 1119</span>           std::cout << activePoints.back().posx << <span class="stringliteral">" "</span> << activePoints.back().posy << <span class="stringliteral">" "</span> << activePoints.back().value << std::endl;</div>
+<div class="line"><a name="l01120"></a><span class="lineno"> 1120</span>       }</div>
+<div class="line"><a name="l01121"></a><span class="lineno"> 1121</span>         }</div>
+<div class="line"><a name="l01122"></a><span class="lineno"> 1122</span>       }<span class="comment">//icol</span></div>
+<div class="line"><a name="l01123"></a><span class="lineno"> 1123</span>       <span class="comment">//----------------------------------- write output ------------------------------------------</span></div>
+<div class="line"><a name="l01124"></a><span class="lineno"> 1124</span>       <span class="keywordflow">if</span>(classBag_opt.size())</div>
+<div class="line"><a name="l01125"></a><span class="lineno"> 1125</span>         <span class="keywordflow">for</span>(<span class="keywordtype">int</span> ibag=0;ibag<nbag;++ibag)</div>
+<div class="line"><a name="l01126"></a><span class="lineno"> 1126</span>           classImageBag.writeData(classBag[ibag],GDT_Byte,iline,ibag);</div>
+<div class="line"><a name="l01127"></a><span class="lineno"> 1127</span>       <span class="keywordflow">if</span>(prob_opt.size()){</div>
+<div class="line"><a name="l01128"></a><span class="lineno"> 1128</span>         <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iclass=0;iclass<nclass;++iclass)</div>
+<div class="line"><a name="l01129"></a><span class="lineno"> 1129</span>           probImage.writeData(probOut[iclass],GDT_Float32,iline,iclass);</div>
+<div class="line"><a name="l01130"></a><span class="lineno"> 1130</span>       }</div>
+<div class="line"><a name="l01131"></a><span class="lineno"> 1131</span>       <span class="keywordflow">if</span>(entropy_opt.size()){</div>
+<div class="line"><a name="l01132"></a><span class="lineno"> 1132</span>         entropyImage.writeData(entropy,GDT_Float32,iline);</div>
+<div class="line"><a name="l01133"></a><span class="lineno"> 1133</span>       }</div>
+<div class="line"><a name="l01134"></a><span class="lineno"> 1134</span>       classImageOut.writeData(classOut,GDT_Byte,iline);</div>
+<div class="line"><a name="l01135"></a><span class="lineno"> 1135</span>       <span class="keywordflow">if</span>(!verbose_opt[0]){</div>
+<div class="line"><a name="l01136"></a><span class="lineno"> 1136</span>         progress=<span class="keyword">static_cast<</span><span class="keywordtype">float</span><span class="keyword">></span>(iline+1.0)/classImageOut.nrOfRow();</div>
+<div class="line"><a name="l01137"></a><span class="lineno"> 1137</span>         pfnProgress(progress,pszMessage,pProgressArg);</div>
 <div class="line"><a name="l01138"></a><span class="lineno"> 1138</span>       }</div>
-<div class="line"><a name="l01139"></a><span class="lineno"> 1139</span>       vector<float> validationPixel;</div>
-<div class="line"><a name="l01140"></a><span class="lineno"> 1140</span>       vector<float> validationFeature;</div>
-<div class="line"><a name="l01141"></a><span class="lineno"> 1141</span>         </div>
-<div class="line"><a name="l01142"></a><span class="lineno"> 1142</span>       imgReaderOgr.readData(validationPixel,OFTReal,fields,poFeature,ilayer);</div>
-<div class="line"><a name="l01143"></a><span class="lineno"> 1143</span>       assert(validationPixel.size()==nband);</div>
-<div class="line"><a name="l01144"></a><span class="lineno"> 1144</span>       vector<float> probOut(nclass);<span class="comment">//posterior prob for each class</span></div>
-<div class="line"><a name="l01145"></a><span class="lineno"> 1145</span>       <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iclass=0;iclass<nclass;++iclass)</div>
-<div class="line"><a name="l01146"></a><span class="lineno"> 1146</span>         probOut[iclass]=0;</div>
-<div class="line"><a name="l01147"></a><span class="lineno"> 1147</span>       <span class="keywordflow">for</span>(<span class="keywordtype">int</span> ibag=0;ibag<nbag;++ibag){</div>
-<div class="line"><a name="l01148"></a><span class="lineno"> 1148</span>         <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iband=0;iband<nband;++iband){</div>
-<div class="line"><a name="l01149"></a><span class="lineno"> 1149</span>           validationFeature.push_back((validationPixel[iband]-offset[ibag][iband])/scale[ibag][iband]);</div>
-<div class="line"><a name="l01150"></a><span class="lineno"> 1150</span>           <span class="keywordflow">if</span>(verbose_opt[0]==2)</div>
-<div class="line"><a name="l01151"></a><span class="lineno"> 1151</span>         std:: cout << <span class="stringliteral">" "</span> << validationFeature.back();</div>
-<div class="line"><a name="l01152"></a><span class="lineno"> 1152</span>         }</div>
-<div class="line"><a name="l01153"></a><span class="lineno"> 1153</span>         <span class="keywordflow">if</span>(verbose_opt[0]==2)</div>
-<div class="line"><a name="l01154"></a><span class="lineno"> 1154</span>           std::cout << std:: endl;</div>
-<div class="line"><a name="l01155"></a><span class="lineno"> 1155</span>         vector<float> result(nclass);</div>
-<div class="line"><a name="l01156"></a><span class="lineno"> 1156</span>         result=net[ibag].run(validationFeature);</div>
-<div class="line"><a name="l01157"></a><span class="lineno"> 1157</span> </div>
-<div class="line"><a name="l01158"></a><span class="lineno"> 1158</span>         <span class="keywordflow">if</span>(verbose_opt[0]>1){</div>
-<div class="line"><a name="l01159"></a><span class="lineno"> 1159</span>           <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iclass=0;iclass<result.size();++iclass)</div>
-<div class="line"><a name="l01160"></a><span class="lineno"> 1160</span>         std::cout << result[iclass] << <span class="stringliteral">" "</span>;</div>
-<div class="line"><a name="l01161"></a><span class="lineno"> 1161</span>           std::cout << std::endl;</div>
-<div class="line"><a name="l01162"></a><span class="lineno"> 1162</span>         }</div>
-<div class="line"><a name="l01163"></a><span class="lineno"> 1163</span>         <span class="comment">//calculate posterior prob of bag </span></div>
-<div class="line"><a name="l01164"></a><span class="lineno"> 1164</span>         <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iclass=0;iclass<nclass;++iclass){</div>
-<div class="line"><a name="l01165"></a><span class="lineno"> 1165</span>           result[iclass]=(result[iclass]+1.0)/2.0;<span class="comment">//bring back to scale [0,1]</span></div>
-<div class="line"><a name="l01166"></a><span class="lineno"> 1166</span>           <span class="keywordflow">switch</span>(comb_opt[0]){</div>
-<div class="line"><a name="l01167"></a><span class="lineno"> 1167</span>           <span class="keywordflow">default</span>:</div>
-<div class="line"><a name="l01168"></a><span class="lineno"> 1168</span>           <span class="keywordflow">case</span>(0):<span class="comment">//sum rule</span></div>
-<div class="line"><a name="l01169"></a><span class="lineno"> 1169</span>         probOut[iclass]+=result[iclass]*priors[iclass];<span class="comment">//add probabilities for each bag</span></div>
-<div class="line"><a name="l01170"></a><span class="lineno"> 1170</span>               <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l01171"></a><span class="lineno"> 1171</span>           <span class="keywordflow">case</span>(1):<span class="comment">//product rule</span></div>
-<div class="line"><a name="l01172"></a><span class="lineno"> 1172</span>         probOut[iclass]*=pow(static_cast<float>(priors[iclass]),static_cast<float>(1.0-nbag)/nbag)*result[iclass];<span class="comment">//multiply probabilities for each bag</span></div>
-<div class="line"><a name="l01173"></a><span class="lineno"> 1173</span>         <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l01174"></a><span class="lineno"> 1174</span>           <span class="keywordflow">case</span>(2):<span class="comment">//max rule</span></div>
-<div class="line"><a name="l01175"></a><span class="lineno"> 1175</span>         <span class="keywordflow">if</span>(priors[iclass]*result[iclass]>probOut[iclass])</div>
-<div class="line"><a name="l01176"></a><span class="lineno"> 1176</span>           probOut[iclass]=priors[iclass]*result[iclass];</div>
-<div class="line"><a name="l01177"></a><span class="lineno"> 1177</span>         <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l01178"></a><span class="lineno"> 1178</span>           }</div>
-<div class="line"><a name="l01179"></a><span class="lineno"> 1179</span>         }</div>
-<div class="line"><a name="l01180"></a><span class="lineno"> 1180</span>       }<span class="comment">//for ibag</span></div>
-<div class="line"><a name="l01181"></a><span class="lineno"> 1181</span>       <span class="comment">//search for max class prob</span></div>
-<div class="line"><a name="l01182"></a><span class="lineno"> 1182</span>       <span class="keywordtype">float</span> maxBag=0;</div>
-<div class="line"><a name="l01183"></a><span class="lineno"> 1183</span>       <span class="keywordtype">float</span> normBag=0;</div>
-<div class="line"><a name="l01184"></a><span class="lineno"> 1184</span>       <span class="keywordtype">string</span> classOut=<span class="stringliteral">"Unclassified"</span>;</div>
-<div class="line"><a name="l01185"></a><span class="lineno"> 1185</span>       <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iclass=0;iclass<nclass;++iclass){</div>
-<div class="line"><a name="l01186"></a><span class="lineno"> 1186</span>         <span class="keywordflow">if</span>(verbose_opt[0]>1)</div>
-<div class="line"><a name="l01187"></a><span class="lineno"> 1187</span>           std::cout << probOut[iclass] << <span class="stringliteral">" "</span>;</div>
-<div class="line"><a name="l01188"></a><span class="lineno"> 1188</span>         <span class="keywordflow">if</span>(probOut[iclass]>maxBag){</div>
-<div class="line"><a name="l01189"></a><span class="lineno"> 1189</span>           maxBag=probOut[iclass];</div>
-<div class="line"><a name="l01190"></a><span class="lineno"> 1190</span>           classOut=nameVector[iclass];</div>
-<div class="line"><a name="l01191"></a><span class="lineno"> 1191</span>         }</div>
-<div class="line"><a name="l01192"></a><span class="lineno"> 1192</span>       }</div>
-<div class="line"><a name="l01193"></a><span class="lineno"> 1193</span>       <span class="comment">//look for class name</span></div>
-<div class="line"><a name="l01194"></a><span class="lineno"> 1194</span>       <span class="keywordflow">if</span>(verbose_opt[0]>1){</div>
-<div class="line"><a name="l01195"></a><span class="lineno"> 1195</span>         <span class="keywordflow">if</span>(classValueMap.size())</div>
-<div class="line"><a name="l01196"></a><span class="lineno"> 1196</span>           std::cout << <span class="stringliteral">"->"</span> << classValueMap[classOut] << std::endl;</div>
-<div class="line"><a name="l01197"></a><span class="lineno"> 1197</span>         <span class="keywordflow">else</span>        </div>
-<div class="line"><a name="l01198"></a><span class="lineno"> 1198</span>           std::cout << <span class="stringliteral">"->"</span> << classOut << std::endl;</div>
-<div class="line"><a name="l01199"></a><span class="lineno"> 1199</span>       }</div>
-<div class="line"><a name="l01200"></a><span class="lineno"> 1200</span>       <span class="keywordflow">if</span>(output_opt.size()){</div>
-<div class="line"><a name="l01201"></a><span class="lineno"> 1201</span>         <span class="keywordflow">if</span>(classValueMap.size())</div>
-<div class="line"><a name="l01202"></a><span class="lineno"> 1202</span>           poDstFeature->SetField(<span class="stringliteral">"class"</span>,classValueMap[classOut]);</div>
-<div class="line"><a name="l01203"></a><span class="lineno"> 1203</span>         <span class="keywordflow">else</span>        </div>
-<div class="line"><a name="l01204"></a><span class="lineno"> 1204</span>           poDstFeature->SetField(<span class="stringliteral">"class"</span>,classOut.c_str());</div>
-<div class="line"><a name="l01205"></a><span class="lineno"> 1205</span>         poDstFeature->SetFID( poFeature->GetFID() );</div>
-<div class="line"><a name="l01206"></a><span class="lineno"> 1206</span>       }</div>
-<div class="line"><a name="l01207"></a><span class="lineno"> 1207</span>       <span class="keywordtype">int</span> labelIndex=poFeature->GetFieldIndex(label_opt[0].c_str());</div>
-<div class="line"><a name="l01208"></a><span class="lineno"> 1208</span>       <span class="keywordflow">if</span>(labelIndex>=0){</div>
-<div class="line"><a name="l01209"></a><span class="lineno"> 1209</span>         <span class="keywordtype">string</span> classRef=poFeature->GetFieldAsString(labelIndex);</div>
-<div class="line"><a name="l01210"></a><span class="lineno"> 1210</span>         <span class="keywordflow">if</span>(classRef!=<span class="stringliteral">"0"</span>){</div>
-<div class="line"><a name="l01211"></a><span class="lineno"> 1211</span>           <span class="keywordflow">if</span>(classValueMap.size())</div>
-<div class="line"><a name="l01212"></a><span class="lineno"> 1212</span>         cm.incrementResult(type2string<short>(classValueMap[classRef]),type2string<short>(classValueMap[classOut]),1);</div>
-<div class="line"><a name="l01213"></a><span class="lineno"> 1213</span>           <span class="keywordflow">else</span></div>
-<div class="line"><a name="l01214"></a><span class="lineno"> 1214</span>         cm.incrementResult(classRef,classOut,1);</div>
-<div class="line"><a name="l01215"></a><span class="lineno"> 1215</span>         }</div>
-<div class="line"><a name="l01216"></a><span class="lineno"> 1216</span>       }</div>
-<div class="line"><a name="l01217"></a><span class="lineno"> 1217</span>       CPLErrorReset();</div>
-<div class="line"><a name="l01218"></a><span class="lineno"> 1218</span>       <span class="keywordflow">if</span>(output_opt.size()){</div>
-<div class="line"><a name="l01219"></a><span class="lineno"> 1219</span>         <span class="keywordflow">if</span>(imgWriterOgr.createFeature(poDstFeature,ilayer) != OGRERR_NONE){</div>
-<div class="line"><a name="l01220"></a><span class="lineno"> 1220</span>           CPLError( CE_Failure, CPLE_AppDefined,</div>
-<div class="line"><a name="l01221"></a><span class="lineno"> 1221</span>             <span class="stringliteral">"Unable to translate feature %d from layer %s.\n"</span>,</div>
-<div class="line"><a name="l01222"></a><span class="lineno"> 1222</span>             poFeature->GetFID(), imgWriterOgr.getLayerName(ilayer).c_str() );</div>
-<div class="line"><a name="l01223"></a><span class="lineno"> 1223</span>           OGRFeature::DestroyFeature( poDstFeature );</div>
-<div class="line"><a name="l01224"></a><span class="lineno"> 1224</span>           OGRFeature::DestroyFeature( poDstFeature );</div>
-<div class="line"><a name="l01225"></a><span class="lineno"> 1225</span>         }</div>
-<div class="line"><a name="l01226"></a><span class="lineno"> 1226</span>       }</div>
-<div class="line"><a name="l01227"></a><span class="lineno"> 1227</span>       ++ifeature;</div>
-<div class="line"><a name="l01228"></a><span class="lineno"> 1228</span>       <span class="keywordflow">if</span>(!verbose_opt[0]){</div>
-<div class="line"><a name="l01229"></a><span class="lineno"> 1229</span>         progress=<span class="keyword">static_cast<</span><span class="keywordtype">float</span><span class="keyword">></span>(ifeature+1.0)/nFeatures;</div>
-<div class="line"><a name="l01230"></a><span class="lineno"> 1230</span>         pfnProgress(progress,pszMessage,pProgressArg);</div>
-<div class="line"><a name="l01231"></a><span class="lineno"> 1231</span>       }</div>
-<div class="line"><a name="l01232"></a><span class="lineno"> 1232</span>       OGRFeature::DestroyFeature( poFeature );</div>
-<div class="line"><a name="l01233"></a><span class="lineno"> 1233</span>       OGRFeature::DestroyFeature( poDstFeature );</div>
-<div class="line"><a name="l01234"></a><span class="lineno"> 1234</span>     }<span class="comment">//get next feature</span></div>
-<div class="line"><a name="l01235"></a><span class="lineno"> 1235</span>       }<span class="comment">//next layer</span></div>
-<div class="line"><a name="l01236"></a><span class="lineno"> 1236</span>       imgReaderOgr.close();</div>
-<div class="line"><a name="l01237"></a><span class="lineno"> 1237</span>       <span class="keywordflow">if</span>(output_opt.size())</div>
-<div class="line"><a name="l01238"></a><span class="lineno"> 1238</span>       imgWriterOgr.close();</div>
-<div class="line"><a name="l01239"></a><span class="lineno"> 1239</span>     }</div>
-<div class="line"><a name="l01240"></a><span class="lineno"> 1240</span>     <span class="keywordflow">if</span>(cm.nReference()){</div>
-<div class="line"><a name="l01241"></a><span class="lineno"> 1241</span>       std::cout << cm << std::endl;</div>
-<div class="line"><a name="l01242"></a><span class="lineno"> 1242</span>       <span class="comment">// cout << "class #samples userAcc prodAcc" << endl;</span></div>
-<div class="line"><a name="l01243"></a><span class="lineno"> 1243</span>       <span class="comment">// double se95_ua=0;</span></div>
-<div class="line"><a name="l01244"></a><span class="lineno"> 1244</span>       <span class="comment">// double se95_pa=0;</span></div>
-<div class="line"><a name="l01245"></a><span class="lineno"> 1245</span>       <span class="comment">// double se95_oa=0;</span></div>
-<div class="line"><a name="l01246"></a><span class="lineno"> 1246</span>       <span class="comment">// double dua=0;</span></div>
-<div class="line"><a name="l01247"></a><span class="lineno"> 1247</span>       <span class="comment">// double dpa=0;</span></div>
-<div class="line"><a name="l01248"></a><span class="lineno"> 1248</span>       <span class="comment">// double doa=0;</span></div>
-<div class="line"><a name="l01249"></a><span class="lineno"> 1249</span>       <span class="comment">// for(short iclass=0;iclass<cm.nClasses();++iclass){</span></div>
-<div class="line"><a name="l01250"></a><span class="lineno"> 1250</span>       <span class="comment">//    dua=cm.ua_pct(cm.getClass(iclass),&se95_ua);</span></div>
-<div class="line"><a name="l01251"></a><span class="lineno"> 1251</span>       <span class="comment">//    dpa=cm.pa_pct(cm.getClass(iclass),&se95_pa);</span></div>
-<div class="line"><a name="l01252"></a><span class="lineno"> 1252</span>       <span class="comment">//    cout << cm.getClass(iclass) << " " << cm.nReference(cm.getClass(iclass)) << " " << dua << " (" << se95_ua << ")" << " " << dpa << " (" << se95_pa << ")" << endl;</span></div>
-<div class="line"><a name="l01253"></a><span class="lineno"> 1253</span>       <span class="comment">// }</span></div>
-<div class="line"><a name="l01254"></a><span class="lineno"> 1254</span>       <span class="comment">// std::cout << "Kappa: " << cm.kappa() << std::endl;</span></div>
-<div class="line"><a name="l01255"></a><span class="lineno"> 1255</span>       <span class="comment">// doa=cm.oa_pct(&se95_oa);</span></div>
-<div class="line"><a name="l01256"></a><span class="lineno"> 1256</span>       <span class="comment">// std::cout << "Overall Accuracy: " << doa << " (" << se95_oa << ")"  << std::endl;</span></div>
-<div class="line"><a name="l01257"></a><span class="lineno"> 1257</span>     }</div>
-<div class="line"><a name="l01258"></a><span class="lineno"> 1258</span>   }</div>
-<div class="line"><a name="l01259"></a><span class="lineno"> 1259</span>   <span class="keywordflow">try</span>{</div>
-<div class="line"><a name="l01260"></a><span class="lineno"> 1260</span>     <span class="keywordflow">if</span>(active_opt.size())</div>
-<div class="line"><a name="l01261"></a><span class="lineno"> 1261</span>       activeWriter.close();</div>
-<div class="line"><a name="l01262"></a><span class="lineno"> 1262</span>   }</div>
-<div class="line"><a name="l01263"></a><span class="lineno"> 1263</span>   <span class="keywordflow">catch</span>(<span class="keywordtype">string</span> errorString){</div>
-<div class="line"><a name="l01264"></a><span class="lineno"> 1264</span>     std::cerr << <span class="stringliteral">"Error: errorString"</span> << std::endl;</div>
-<div class="line"><a name="l01265"></a><span class="lineno"> 1265</span>   }</div>
-<div class="line"><a name="l01266"></a><span class="lineno"> 1266</span>   <span class="keywordflow">return</span> 0;</div>
-<div class="line"><a name="l01267"></a><span class="lineno"> 1267</span> }</div>
+<div class="line"><a name="l01139"></a><span class="lineno"> 1139</span>     }</div>
+<div class="line"><a name="l01140"></a><span class="lineno"> 1140</span>     <span class="comment">//write active learning points</span></div>
+<div class="line"><a name="l01141"></a><span class="lineno"> 1141</span>     <span class="keywordflow">if</span>(active_opt.size()){</div>
+<div class="line"><a name="l01142"></a><span class="lineno"> 1142</span>       <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iactive=0;iactive<activePoints.size();++iactive){</div>
+<div class="line"><a name="l01143"></a><span class="lineno"> 1143</span>     std::map<string,double> pointMap;</div>
+<div class="line"><a name="l01144"></a><span class="lineno"> 1144</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iband=0;iband<testImage.nrOfBand();++iband){</div>
+<div class="line"><a name="l01145"></a><span class="lineno"> 1145</span>       <span class="keywordtype">double</span> value;</div>
+<div class="line"><a name="l01146"></a><span class="lineno"> 1146</span>       testImage.readData(value,GDT_Float64,static_cast<int>(activePoints[iactive].posx),static_cast<int>(activePoints[iactive].posy),iband);</div>
+<div class="line"><a name="l01147"></a><span class="lineno"> 1147</span>       ostringstream fs;</div>
+<div class="line"><a name="l01148"></a><span class="lineno"> 1148</span>       fs << <span class="stringliteral">"B"</span> << iband;</div>
+<div class="line"><a name="l01149"></a><span class="lineno"> 1149</span>       pointMap[fs.str()]=value;</div>
+<div class="line"><a name="l01150"></a><span class="lineno"> 1150</span>     }</div>
+<div class="line"><a name="l01151"></a><span class="lineno"> 1151</span>     pointMap[label_opt[0]]=0;</div>
+<div class="line"><a name="l01152"></a><span class="lineno"> 1152</span>     <span class="keywordtype">double</span> x, y;</div>
+<div class="line"><a name="l01153"></a><span class="lineno"> 1153</span>     testImage.image2geo(activePoints[iactive].posx,activePoints[iactive].posy,x,y);</div>
+<div class="line"><a name="l01154"></a><span class="lineno"> 1154</span>         std::string fieldname=<span class="stringliteral">"id"</span>;<span class="comment">//number of the point</span></div>
+<div class="line"><a name="l01155"></a><span class="lineno"> 1155</span>     activeWriter.addPoint(x,y,pointMap,fieldname,++nactive);</div>
+<div class="line"><a name="l01156"></a><span class="lineno"> 1156</span>       }</div>
+<div class="line"><a name="l01157"></a><span class="lineno"> 1157</span>     }</div>
+<div class="line"><a name="l01158"></a><span class="lineno"> 1158</span> </div>
+<div class="line"><a name="l01159"></a><span class="lineno"> 1159</span>     testImage.close();</div>
+<div class="line"><a name="l01160"></a><span class="lineno"> 1160</span>     <span class="keywordflow">if</span>(mask_opt.size())</div>
+<div class="line"><a name="l01161"></a><span class="lineno"> 1161</span>       maskReader.close();</div>
+<div class="line"><a name="l01162"></a><span class="lineno"> 1162</span>     <span class="keywordflow">if</span>(priorimg_opt.size())</div>
+<div class="line"><a name="l01163"></a><span class="lineno"> 1163</span>       priorReader.close();</div>
+<div class="line"><a name="l01164"></a><span class="lineno"> 1164</span>     <span class="keywordflow">if</span>(prob_opt.size())</div>
+<div class="line"><a name="l01165"></a><span class="lineno"> 1165</span>       probImage.close();</div>
+<div class="line"><a name="l01166"></a><span class="lineno"> 1166</span>     <span class="keywordflow">if</span>(entropy_opt.size())</div>
+<div class="line"><a name="l01167"></a><span class="lineno"> 1167</span>       entropyImage.close();</div>
+<div class="line"><a name="l01168"></a><span class="lineno"> 1168</span>     <span class="keywordflow">if</span>(classBag_opt.size())</div>
+<div class="line"><a name="l01169"></a><span class="lineno"> 1169</span>       classImageBag.close();</div>
+<div class="line"><a name="l01170"></a><span class="lineno"> 1170</span>     classImageOut.close();</div>
+<div class="line"><a name="l01171"></a><span class="lineno"> 1171</span>   }</div>
+<div class="line"><a name="l01172"></a><span class="lineno"> 1172</span>   <span class="keywordflow">else</span>{<span class="comment">//classify vector file</span></div>
+<div class="line"><a name="l01173"></a><span class="lineno"> 1173</span>     cm.clearResults();</div>
+<div class="line"><a name="l01174"></a><span class="lineno"> 1174</span>     <span class="comment">//notice that fields have already been set by readDataImageOgr (taking into account appropriate bands)</span></div>
+<div class="line"><a name="l01175"></a><span class="lineno"> 1175</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> ivalidation=0;ivalidation<input_opt.size();++ivalidation){</div>
+<div class="line"><a name="l01176"></a><span class="lineno"> 1176</span>       <span class="keywordflow">if</span>(output_opt.size())</div>
+<div class="line"><a name="l01177"></a><span class="lineno"> 1177</span>         assert(output_opt.size()==input_opt.size());</div>
+<div class="line"><a name="l01178"></a><span class="lineno"> 1178</span>       <span class="keywordflow">if</span>(verbose_opt[0])</div>
+<div class="line"><a name="l01179"></a><span class="lineno"> 1179</span>         cout << <span class="stringliteral">"opening img reader "</span> << input_opt[ivalidation] << endl;</div>
+<div class="line"><a name="l01180"></a><span class="lineno"> 1180</span>       imgReaderOgr.open(input_opt[ivalidation]);</div>
+<div class="line"><a name="l01181"></a><span class="lineno"> 1181</span>       <a class="code" href="classImgWriterOgr.html">ImgWriterOgr</a> imgWriterOgr;</div>
+<div class="line"><a name="l01182"></a><span class="lineno"> 1182</span> </div>
+<div class="line"><a name="l01183"></a><span class="lineno"> 1183</span>       <span class="keywordflow">if</span>(output_opt.size()){</div>
+<div class="line"><a name="l01184"></a><span class="lineno"> 1184</span>     <span class="keywordflow">if</span>(verbose_opt[0])</div>
+<div class="line"><a name="l01185"></a><span class="lineno"> 1185</span>       std::cout << <span class="stringliteral">"opening img writer and copying fields from img reader"</span> << output_opt[ivalidation] << std::endl;</div>
+<div class="line"><a name="l01186"></a><span class="lineno"> 1186</span>     imgWriterOgr.open(output_opt[ivalidation],imgReaderOgr);</div>
+<div class="line"><a name="l01187"></a><span class="lineno"> 1187</span>       }</div>
+<div class="line"><a name="l01188"></a><span class="lineno"> 1188</span>       <span class="keywordflow">if</span>(verbose_opt[0])</div>
+<div class="line"><a name="l01189"></a><span class="lineno"> 1189</span>     cout << <span class="stringliteral">"number of layers in input ogr file: "</span> << imgReaderOgr.getLayerCount() << endl;</div>
+<div class="line"><a name="l01190"></a><span class="lineno"> 1190</span>       <span class="keywordflow">for</span>(<span class="keywordtype">int</span> ilayer=0;ilayer<imgReaderOgr.getLayerCount();++ilayer){</div>
+<div class="line"><a name="l01191"></a><span class="lineno"> 1191</span>     <span class="keywordflow">if</span>(verbose_opt[0])</div>
+<div class="line"><a name="l01192"></a><span class="lineno"> 1192</span>       cout << <span class="stringliteral">"processing input layer "</span> << ilayer << endl;</div>
+<div class="line"><a name="l01193"></a><span class="lineno"> 1193</span>     <span class="keywordflow">if</span>(output_opt.size()){</div>
+<div class="line"><a name="l01194"></a><span class="lineno"> 1194</span>       <span class="keywordflow">if</span>(verbose_opt[0])</div>
+<div class="line"><a name="l01195"></a><span class="lineno"> 1195</span>         std::cout << <span class="stringliteral">"creating field class"</span> << std::endl;</div>
+<div class="line"><a name="l01196"></a><span class="lineno"> 1196</span>       <span class="keywordflow">if</span>(classValueMap.size())</div>
+<div class="line"><a name="l01197"></a><span class="lineno"> 1197</span>         imgWriterOgr.createField(<span class="stringliteral">"class"</span>,OFTInteger,ilayer);</div>
+<div class="line"><a name="l01198"></a><span class="lineno"> 1198</span>       <span class="keywordflow">else</span></div>
+<div class="line"><a name="l01199"></a><span class="lineno"> 1199</span>         imgWriterOgr.createField(<span class="stringliteral">"class"</span>,OFTString,ilayer);</div>
+<div class="line"><a name="l01200"></a><span class="lineno"> 1200</span>     }</div>
+<div class="line"><a name="l01201"></a><span class="lineno"> 1201</span>     <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> nFeatures=imgReaderOgr.getFeatureCount(ilayer);</div>
+<div class="line"><a name="l01202"></a><span class="lineno"> 1202</span>     <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> ifeature=0;</div>
+<div class="line"><a name="l01203"></a><span class="lineno"> 1203</span>     progress=0;</div>
+<div class="line"><a name="l01204"></a><span class="lineno"> 1204</span>     pfnProgress(progress,pszMessage,pProgressArg);</div>
+<div class="line"><a name="l01205"></a><span class="lineno"> 1205</span>     OGRFeature *poFeature;</div>
+<div class="line"><a name="l01206"></a><span class="lineno"> 1206</span>     <span class="keywordflow">while</span>( (poFeature = imgReaderOgr.getLayer(ilayer)->GetNextFeature()) != NULL ){</div>
+<div class="line"><a name="l01207"></a><span class="lineno"> 1207</span>       <span class="keywordflow">if</span>(verbose_opt[0]>1)</div>
+<div class="line"><a name="l01208"></a><span class="lineno"> 1208</span>         cout << <span class="stringliteral">"feature "</span> << ifeature << endl;</div>
+<div class="line"><a name="l01209"></a><span class="lineno"> 1209</span>       <span class="keywordflow">if</span>( poFeature == NULL ){</div>
+<div class="line"><a name="l01210"></a><span class="lineno"> 1210</span>         cout << <span class="stringliteral">"Warning: could not read feature "</span> << ifeature << <span class="stringliteral">" in layer "</span> << imgReaderOgr.getLayerName(ilayer) << endl;</div>
+<div class="line"><a name="l01211"></a><span class="lineno"> 1211</span>         <span class="keywordflow">continue</span>;</div>
+<div class="line"><a name="l01212"></a><span class="lineno"> 1212</span>       }</div>
+<div class="line"><a name="l01213"></a><span class="lineno"> 1213</span>       OGRFeature *poDstFeature = NULL;</div>
+<div class="line"><a name="l01214"></a><span class="lineno"> 1214</span>       <span class="keywordflow">if</span>(output_opt.size()){</div>
+<div class="line"><a name="l01215"></a><span class="lineno"> 1215</span>         poDstFeature=imgWriterOgr.createFeature(ilayer);</div>
+<div class="line"><a name="l01216"></a><span class="lineno"> 1216</span>         <span class="keywordflow">if</span>( poDstFeature->SetFrom( poFeature, TRUE ) != OGRERR_NONE ){</div>
+<div class="line"><a name="l01217"></a><span class="lineno"> 1217</span>           CPLError( CE_Failure, CPLE_AppDefined,</div>
+<div class="line"><a name="l01218"></a><span class="lineno"> 1218</span>             <span class="stringliteral">"Unable to translate feature %d from layer %s.\n"</span>,</div>
+<div class="line"><a name="l01219"></a><span class="lineno"> 1219</span>             poFeature->GetFID(), imgWriterOgr.getLayerName(ilayer).c_str() );</div>
+<div class="line"><a name="l01220"></a><span class="lineno"> 1220</span>           OGRFeature::DestroyFeature( poFeature );</div>
+<div class="line"><a name="l01221"></a><span class="lineno"> 1221</span>           OGRFeature::DestroyFeature( poDstFeature );</div>
+<div class="line"><a name="l01222"></a><span class="lineno"> 1222</span>         }</div>
+<div class="line"><a name="l01223"></a><span class="lineno"> 1223</span>       }</div>
+<div class="line"><a name="l01224"></a><span class="lineno"> 1224</span>       vector<float> validationPixel;</div>
+<div class="line"><a name="l01225"></a><span class="lineno"> 1225</span>       vector<float> validationFeature;</div>
+<div class="line"><a name="l01226"></a><span class="lineno"> 1226</span>         </div>
+<div class="line"><a name="l01227"></a><span class="lineno"> 1227</span>       imgReaderOgr.readData(validationPixel,OFTReal,fields,poFeature,ilayer);</div>
+<div class="line"><a name="l01228"></a><span class="lineno"> 1228</span>       assert(validationPixel.size()==nband);</div>
+<div class="line"><a name="l01229"></a><span class="lineno"> 1229</span>       vector<float> probOut(nclass);<span class="comment">//posterior prob for each class</span></div>
+<div class="line"><a name="l01230"></a><span class="lineno"> 1230</span>       <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iclass=0;iclass<nclass;++iclass)</div>
+<div class="line"><a name="l01231"></a><span class="lineno"> 1231</span>         probOut[iclass]=0;</div>
+<div class="line"><a name="l01232"></a><span class="lineno"> 1232</span>       <span class="keywordflow">for</span>(<span class="keywordtype">int</span> ibag=0;ibag<nbag;++ibag){</div>
+<div class="line"><a name="l01233"></a><span class="lineno"> 1233</span>         <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iband=0;iband<nband;++iband){</div>
+<div class="line"><a name="l01234"></a><span class="lineno"> 1234</span>           validationFeature.push_back((validationPixel[iband]-offset[ibag][iband])/scale[ibag][iband]);</div>
+<div class="line"><a name="l01235"></a><span class="lineno"> 1235</span>           <span class="keywordflow">if</span>(verbose_opt[0]==2)</div>
+<div class="line"><a name="l01236"></a><span class="lineno"> 1236</span>         std:: cout << <span class="stringliteral">" "</span> << validationFeature.back();</div>
+<div class="line"><a name="l01237"></a><span class="lineno"> 1237</span>         }</div>
+<div class="line"><a name="l01238"></a><span class="lineno"> 1238</span>         <span class="keywordflow">if</span>(verbose_opt[0]==2)</div>
+<div class="line"><a name="l01239"></a><span class="lineno"> 1239</span>           std::cout << std:: endl;</div>
+<div class="line"><a name="l01240"></a><span class="lineno"> 1240</span>         vector<float> result(nclass);</div>
+<div class="line"><a name="l01241"></a><span class="lineno"> 1241</span>         result=net[ibag].run(validationFeature);</div>
+<div class="line"><a name="l01242"></a><span class="lineno"> 1242</span> </div>
+<div class="line"><a name="l01243"></a><span class="lineno"> 1243</span>         <span class="keywordflow">if</span>(verbose_opt[0]>1){</div>
+<div class="line"><a name="l01244"></a><span class="lineno"> 1244</span>           <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iclass=0;iclass<result.size();++iclass)</div>
+<div class="line"><a name="l01245"></a><span class="lineno"> 1245</span>         std::cout << result[iclass] << <span class="stringliteral">" "</span>;</div>
+<div class="line"><a name="l01246"></a><span class="lineno"> 1246</span>           std::cout << std::endl;</div>
+<div class="line"><a name="l01247"></a><span class="lineno"> 1247</span>         }</div>
+<div class="line"><a name="l01248"></a><span class="lineno"> 1248</span>         <span class="comment">//calculate posterior prob of bag </span></div>
+<div class="line"><a name="l01249"></a><span class="lineno"> 1249</span>         <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iclass=0;iclass<nclass;++iclass){</div>
+<div class="line"><a name="l01250"></a><span class="lineno"> 1250</span>           result[iclass]=(result[iclass]+1.0)/2.0;<span class="comment">//bring back to scale [0,1]</span></div>
+<div class="line"><a name="l01251"></a><span class="lineno"> 1251</span>           <span class="keywordflow">switch</span>(comb_opt[0]){</div>
+<div class="line"><a name="l01252"></a><span class="lineno"> 1252</span>           <span class="keywordflow">default</span>:</div>
+<div class="line"><a name="l01253"></a><span class="lineno"> 1253</span>           <span class="keywordflow">case</span>(0):<span class="comment">//sum rule</span></div>
+<div class="line"><a name="l01254"></a><span class="lineno"> 1254</span>         probOut[iclass]+=result[iclass]*priors[iclass];<span class="comment">//add probabilities for each bag</span></div>
+<div class="line"><a name="l01255"></a><span class="lineno"> 1255</span>               <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l01256"></a><span class="lineno"> 1256</span>           <span class="keywordflow">case</span>(1):<span class="comment">//product rule</span></div>
+<div class="line"><a name="l01257"></a><span class="lineno"> 1257</span>         probOut[iclass]*=pow(static_cast<float>(priors[iclass]),static_cast<float>(1.0-nbag)/nbag)*result[iclass];<span class="comment">//multiply probabilities for each bag</span></div>
+<div class="line"><a name="l01258"></a><span class="lineno"> 1258</span>         <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l01259"></a><span class="lineno"> 1259</span>           <span class="keywordflow">case</span>(2):<span class="comment">//max rule</span></div>
+<div class="line"><a name="l01260"></a><span class="lineno"> 1260</span>         <span class="keywordflow">if</span>(priors[iclass]*result[iclass]>probOut[iclass])</div>
+<div class="line"><a name="l01261"></a><span class="lineno"> 1261</span>           probOut[iclass]=priors[iclass]*result[iclass];</div>
+<div class="line"><a name="l01262"></a><span class="lineno"> 1262</span>         <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l01263"></a><span class="lineno"> 1263</span>           }</div>
+<div class="line"><a name="l01264"></a><span class="lineno"> 1264</span>         }</div>
+<div class="line"><a name="l01265"></a><span class="lineno"> 1265</span>       }<span class="comment">//for ibag</span></div>
+<div class="line"><a name="l01266"></a><span class="lineno"> 1266</span>       <span class="comment">//search for max class prob</span></div>
+<div class="line"><a name="l01267"></a><span class="lineno"> 1267</span>       <span class="keywordtype">float</span> maxBag=0;</div>
+<div class="line"><a name="l01268"></a><span class="lineno"> 1268</span>       <span class="keywordtype">float</span> normBag=0;</div>
+<div class="line"><a name="l01269"></a><span class="lineno"> 1269</span>       <span class="keywordtype">string</span> classOut=<span class="stringliteral">"Unclassified"</span>;</div>
+<div class="line"><a name="l01270"></a><span class="lineno"> 1270</span>       <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iclass=0;iclass<nclass;++iclass){</div>
+<div class="line"><a name="l01271"></a><span class="lineno"> 1271</span>         <span class="keywordflow">if</span>(verbose_opt[0]>1)</div>
+<div class="line"><a name="l01272"></a><span class="lineno"> 1272</span>           std::cout << probOut[iclass] << <span class="stringliteral">" "</span>;</div>
+<div class="line"><a name="l01273"></a><span class="lineno"> 1273</span>         <span class="keywordflow">if</span>(probOut[iclass]>maxBag){</div>
+<div class="line"><a name="l01274"></a><span class="lineno"> 1274</span>           maxBag=probOut[iclass];</div>
+<div class="line"><a name="l01275"></a><span class="lineno"> 1275</span>           classOut=nameVector[iclass];</div>
+<div class="line"><a name="l01276"></a><span class="lineno"> 1276</span>         }</div>
+<div class="line"><a name="l01277"></a><span class="lineno"> 1277</span>       }</div>
+<div class="line"><a name="l01278"></a><span class="lineno"> 1278</span>       <span class="comment">//look for class name</span></div>
+<div class="line"><a name="l01279"></a><span class="lineno"> 1279</span>       <span class="keywordflow">if</span>(verbose_opt[0]>1){</div>
+<div class="line"><a name="l01280"></a><span class="lineno"> 1280</span>         <span class="keywordflow">if</span>(classValueMap.size())</div>
+<div class="line"><a name="l01281"></a><span class="lineno"> 1281</span>           std::cout << <span class="stringliteral">"->"</span> << classValueMap[classOut] << std::endl;</div>
+<div class="line"><a name="l01282"></a><span class="lineno"> 1282</span>         <span class="keywordflow">else</span>        </div>
+<div class="line"><a name="l01283"></a><span class="lineno"> 1283</span>           std::cout << <span class="stringliteral">"->"</span> << classOut << std::endl;</div>
+<div class="line"><a name="l01284"></a><span class="lineno"> 1284</span>       }</div>
+<div class="line"><a name="l01285"></a><span class="lineno"> 1285</span>       <span class="keywordflow">if</span>(output_opt.size()){</div>
+<div class="line"><a name="l01286"></a><span class="lineno"> 1286</span>         <span class="keywordflow">if</span>(classValueMap.size())</div>
+<div class="line"><a name="l01287"></a><span class="lineno"> 1287</span>           poDstFeature->SetField(<span class="stringliteral">"class"</span>,classValueMap[classOut]);</div>
+<div class="line"><a name="l01288"></a><span class="lineno"> 1288</span>         <span class="keywordflow">else</span>        </div>
+<div class="line"><a name="l01289"></a><span class="lineno"> 1289</span>           poDstFeature->SetField(<span class="stringliteral">"class"</span>,classOut.c_str());</div>
+<div class="line"><a name="l01290"></a><span class="lineno"> 1290</span>         poDstFeature->SetFID( poFeature->GetFID() );</div>
+<div class="line"><a name="l01291"></a><span class="lineno"> 1291</span>       }</div>
+<div class="line"><a name="l01292"></a><span class="lineno"> 1292</span>       <span class="keywordtype">int</span> labelIndex=poFeature->GetFieldIndex(label_opt[0].c_str());</div>
+<div class="line"><a name="l01293"></a><span class="lineno"> 1293</span>       <span class="keywordflow">if</span>(labelIndex>=0){</div>
+<div class="line"><a name="l01294"></a><span class="lineno"> 1294</span>         <span class="keywordtype">string</span> classRef=poFeature->GetFieldAsString(labelIndex);</div>
+<div class="line"><a name="l01295"></a><span class="lineno"> 1295</span>         <span class="keywordflow">if</span>(classRef!=<span class="stringliteral">"0"</span>){</div>
+<div class="line"><a name="l01296"></a><span class="lineno"> 1296</span>           <span class="keywordflow">if</span>(classValueMap.size())</div>
+<div class="line"><a name="l01297"></a><span class="lineno"> 1297</span>         cm.incrementResult(type2string<short>(classValueMap[classRef]),type2string<short>(classValueMap[classOut]),1);</div>
+<div class="line"><a name="l01298"></a><span class="lineno"> 1298</span>           <span class="keywordflow">else</span></div>
+<div class="line"><a name="l01299"></a><span class="lineno"> 1299</span>         cm.incrementResult(classRef,classOut,1);</div>
+<div class="line"><a name="l01300"></a><span class="lineno"> 1300</span>         }</div>
+<div class="line"><a name="l01301"></a><span class="lineno"> 1301</span>       }</div>
+<div class="line"><a name="l01302"></a><span class="lineno"> 1302</span>       CPLErrorReset();</div>
+<div class="line"><a name="l01303"></a><span class="lineno"> 1303</span>       <span class="keywordflow">if</span>(output_opt.size()){</div>
+<div class="line"><a name="l01304"></a><span class="lineno"> 1304</span>         <span class="keywordflow">if</span>(imgWriterOgr.createFeature(poDstFeature,ilayer) != OGRERR_NONE){</div>
+<div class="line"><a name="l01305"></a><span class="lineno"> 1305</span>           CPLError( CE_Failure, CPLE_AppDefined,</div>
+<div class="line"><a name="l01306"></a><span class="lineno"> 1306</span>             <span class="stringliteral">"Unable to translate feature %d from layer %s.\n"</span>,</div>
+<div class="line"><a name="l01307"></a><span class="lineno"> 1307</span>             poFeature->GetFID(), imgWriterOgr.getLayerName(ilayer).c_str() );</div>
+<div class="line"><a name="l01308"></a><span class="lineno"> 1308</span>           OGRFeature::DestroyFeature( poDstFeature );</div>
+<div class="line"><a name="l01309"></a><span class="lineno"> 1309</span>           OGRFeature::DestroyFeature( poDstFeature );</div>
+<div class="line"><a name="l01310"></a><span class="lineno"> 1310</span>         }</div>
+<div class="line"><a name="l01311"></a><span class="lineno"> 1311</span>       }</div>
+<div class="line"><a name="l01312"></a><span class="lineno"> 1312</span>       ++ifeature;</div>
+<div class="line"><a name="l01313"></a><span class="lineno"> 1313</span>       <span class="keywordflow">if</span>(!verbose_opt[0]){</div>
+<div class="line"><a name="l01314"></a><span class="lineno"> 1314</span>         progress=<span class="keyword">static_cast<</span><span class="keywordtype">float</span><span class="keyword">></span>(ifeature+1.0)/nFeatures;</div>
+<div class="line"><a name="l01315"></a><span class="lineno"> 1315</span>         pfnProgress(progress,pszMessage,pProgressArg);</div>
+<div class="line"><a name="l01316"></a><span class="lineno"> 1316</span>       }</div>
+<div class="line"><a name="l01317"></a><span class="lineno"> 1317</span>       OGRFeature::DestroyFeature( poFeature );</div>
+<div class="line"><a name="l01318"></a><span class="lineno"> 1318</span>       OGRFeature::DestroyFeature( poDstFeature );</div>
+<div class="line"><a name="l01319"></a><span class="lineno"> 1319</span>     }<span class="comment">//get next feature</span></div>
+<div class="line"><a name="l01320"></a><span class="lineno"> 1320</span>       }<span class="comment">//next layer</span></div>
+<div class="line"><a name="l01321"></a><span class="lineno"> 1321</span>       imgReaderOgr.close();</div>
+<div class="line"><a name="l01322"></a><span class="lineno"> 1322</span>       <span class="keywordflow">if</span>(output_opt.size())</div>
+<div class="line"><a name="l01323"></a><span class="lineno"> 1323</span>       imgWriterOgr.close();</div>
+<div class="line"><a name="l01324"></a><span class="lineno"> 1324</span>     }</div>
+<div class="line"><a name="l01325"></a><span class="lineno"> 1325</span>     <span class="keywordflow">if</span>(cm.nReference()){</div>
+<div class="line"><a name="l01326"></a><span class="lineno"> 1326</span>       std::cout << cm << std::endl;</div>
+<div class="line"><a name="l01327"></a><span class="lineno"> 1327</span>       <span class="comment">// cout << "class #samples userAcc prodAcc" << endl;</span></div>
+<div class="line"><a name="l01328"></a><span class="lineno"> 1328</span>       <span class="comment">// double se95_ua=0;</span></div>
+<div class="line"><a name="l01329"></a><span class="lineno"> 1329</span>       <span class="comment">// double se95_pa=0;</span></div>
+<div class="line"><a name="l01330"></a><span class="lineno"> 1330</span>       <span class="comment">// double se95_oa=0;</span></div>
+<div class="line"><a name="l01331"></a><span class="lineno"> 1331</span>       <span class="comment">// double dua=0;</span></div>
+<div class="line"><a name="l01332"></a><span class="lineno"> 1332</span>       <span class="comment">// double dpa=0;</span></div>
+<div class="line"><a name="l01333"></a><span class="lineno"> 1333</span>       <span class="comment">// double doa=0;</span></div>
+<div class="line"><a name="l01334"></a><span class="lineno"> 1334</span>       <span class="comment">// for(short iclass=0;iclass<cm.nClasses();++iclass){</span></div>
+<div class="line"><a name="l01335"></a><span class="lineno"> 1335</span>       <span class="comment">//    dua=cm.ua_pct(cm.getClass(iclass),&se95_ua);</span></div>
+<div class="line"><a name="l01336"></a><span class="lineno"> 1336</span>       <span class="comment">//    dpa=cm.pa_pct(cm.getClass(iclass),&se95_pa);</span></div>
+<div class="line"><a name="l01337"></a><span class="lineno"> 1337</span>       <span class="comment">//    cout << cm.getClass(iclass) << " " << cm.nReference(cm.getClass(iclass)) << " " << dua << " (" << se95_ua << ")" << " " << dpa << " (" << se95_pa << ")" << endl;</span></div>
+<div class="line"><a name="l01338"></a><span class="lineno"> 1338</span>       <span class="comment">// }</span></div>
+<div class="line"><a name="l01339"></a><span class="lineno"> 1339</span>       <span class="comment">// std::cout << "Kappa: " << cm.kappa() << std::endl;</span></div>
+<div class="line"><a name="l01340"></a><span class="lineno"> 1340</span>       <span class="comment">// doa=cm.oa_pct(&se95_oa);</span></div>
+<div class="line"><a name="l01341"></a><span class="lineno"> 1341</span>       <span class="comment">// std::cout << "Overall Accuracy: " << doa << " (" << se95_oa << ")"  << std::endl;</span></div>
+<div class="line"><a name="l01342"></a><span class="lineno"> 1342</span>     }</div>
+<div class="line"><a name="l01343"></a><span class="lineno"> 1343</span>   }</div>
+<div class="line"><a name="l01344"></a><span class="lineno"> 1344</span>   <span class="keywordflow">try</span>{</div>
+<div class="line"><a name="l01345"></a><span class="lineno"> 1345</span>     <span class="keywordflow">if</span>(active_opt.size())</div>
+<div class="line"><a name="l01346"></a><span class="lineno"> 1346</span>       activeWriter.close();</div>
+<div class="line"><a name="l01347"></a><span class="lineno"> 1347</span>   }</div>
+<div class="line"><a name="l01348"></a><span class="lineno"> 1348</span>   <span class="keywordflow">catch</span>(<span class="keywordtype">string</span> errorString){</div>
+<div class="line"><a name="l01349"></a><span class="lineno"> 1349</span>     std::cerr << <span class="stringliteral">"Error: errorString"</span> << std::endl;</div>
+<div class="line"><a name="l01350"></a><span class="lineno"> 1350</span>   }</div>
+<div class="line"><a name="l01351"></a><span class="lineno"> 1351</span>   <span class="keywordflow">return</span> 0;</div>
+<div class="line"><a name="l01352"></a><span class="lineno"> 1352</span> }</div>
 <div class="ttc" id="classImgReaderGdal_html"><div class="ttname"><a href="classImgReaderGdal.html">ImgReaderGdal</a></div><div class="ttdef"><b>Definition:</b> <a href="ImgReaderGdal_8h_source.html#l00033">ImgReaderGdal.h:33</a></div></div>
 <div class="ttc" id="classImgWriterGdal_html"><div class="ttname"><a href="classImgWriterGdal.html">ImgWriterGdal</a></div><div class="ttdef"><b>Definition:</b> <a href="ImgWriterGdal_8h_source.html#l00032">ImgWriterGdal.h:32</a></div></div>
 <div class="ttc" id="classDecrease__PosValue_html"><div class="ttname"><a href="classDecrease__PosValue.html">Decrease_PosValue</a></div><div class="ttdef"><b>Definition:</b> <a href="PosValue_8h_source.html#l00034">PosValue.h:34</a></div></div>
@@ -1258,7 +1343,7 @@
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Jun 23 2015 17:09:36 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Tue Nov 3 2015 15:58:26 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/pkascii2img.html b/doc/html/pkascii2img.html
index b0b75a4..d3435be 100644
--- a/doc/html/pkascii2img.html
+++ b/doc/html/pkascii2img.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.3</span>
+    <span id="projectnumber">2.6.4</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -92,7 +92,7 @@ Usage: pkascii2img -i input.txt -o output</li>
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Jun 23 2015 17:09:37 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/pkascii2img_8cc_source.html b/doc/html/pkascii2img_8cc_source.html
index 8de75e3..2013918 100644
--- a/doc/html/pkascii2img_8cc_source.html
+++ b/doc/html/pkascii2img_8cc_source.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.3</span>
+    <span id="projectnumber">2.6.4</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -228,7 +228,7 @@
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Jun 23 2015 17:09:36 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Tue Nov 3 2015 15:58:26 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/pkascii2ogr.html b/doc/html/pkascii2ogr.html
index 08690a2..5c970cf 100644
--- a/doc/html/pkascii2ogr.html
+++ b/doc/html/pkascii2ogr.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.3</span>
+    <span id="projectnumber">2.6.4</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -90,7 +90,7 @@ Usage: pkascii2ogr -i input.txt -o output</li>
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Jun 23 2015 17:09:37 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/pkascii2ogr_8cc_source.html b/doc/html/pkascii2ogr_8cc_source.html
index d98631b..99fa631 100644
--- a/doc/html/pkascii2ogr_8cc_source.html
+++ b/doc/html/pkascii2ogr_8cc_source.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.3</span>
+    <span id="projectnumber">2.6.4</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -175,7 +175,7 @@
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Jun 23 2015 17:09:36 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Tue Nov 3 2015 15:58:26 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/pkcomposite.html b/doc/html/pkcomposite.html
index bebf0c4..3550f88 100644
--- a/doc/html/pkcomposite.html
+++ b/doc/html/pkcomposite.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.3</span>
+    <span id="projectnumber">2.6.4</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -79,7 +79,13 @@ Description</h1>
 <tr>
 <td>minallbands </td><td>For each individual band, assign the minimum value found in all overlapping pixels. Unlike minband, output band values cannot be attributed to a single (date) pixel in the input time series </td></tr>
 </table>
-<h1><a class="anchor" id="pkcomposite_options"></a>
+<p>Example: Calculate the maximum NDVI composite of two multispectral input images (e.g., red is band 0 and near infrared is band 1)</p>
+<div class="fragment"><div class="line">pkcomposite -i input1.tif -i input2.tif -o output.tif -cr maxndvi -cb 0 -cb 1</div>
+</div><!-- fragment --><p>Example: Calculate the minimum nadir composite of two input images, where the forth band (b=3) contains the view zenith angle</p>
+<div class="fragment"><div class="line">pkcomposite -i input1.tif -i input2.tif -o minzenith.tif -cr minband -cb 3</div>
+</div><!-- fragment --><p>Example: Calculate the minimum of two input images</p>
+<div class="fragment"><div class="line">pkcomposite -i input1.tif -i input2.tif -o minimum.tif -cr minallbands</div>
+</div><!-- fragment --><h1><a class="anchor" id="pkcomposite_options"></a>
 Options</h1>
 <ul>
 <li>use either <code>-short</code> or <code>--long</code> options (both <code>--long=value</code> and <code>--long value</code> are supported)</li>
@@ -101,6 +107,14 @@ Options</h1>
 <tr>
 <td>e </td><td>extent </td><td>std::string </td><td></td><td>get boundary from extent from polygons in vector file </td></tr>
 <tr>
+<td>cut </td><td>crop_to_cutline </td><td>bool </td><td>false </td><td>Crop the extent of the target dataset to the extent of the cutline </td></tr>
+<tr>
+<td>m </td><td>mask </td><td>std::string </td><td></td><td>Use the first band of the specified file as a validity mask (0 is nodata) </td></tr>
+<tr>
+<td>msknodata </td><td>msknodata </td><td>float </td><td>0 </td><td>Mask value not to consider for composite </td></tr>
+<tr>
+<td>mskband </td><td>mskband </td><td>short </td><td>0 </td><td>Mask band to read (0 indexed). Provide band for each mask. </td></tr>
+<tr>
 <td>ulx </td><td>ulx </td><td>double </td><td>0 </td><td>Upper left x value bounding box </td></tr>
 <tr>
 <td>uly </td><td>uly </td><td>double </td><td>0 </td><td>Upper left y value bounding box </td></tr>
@@ -151,7 +165,7 @@ Options</h1>
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Jun 23 2015 17:09:37 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/pkcomposite_8cc_source.html b/doc/html/pkcomposite_8cc_source.html
index 6cca9f7..ddea49e 100644
--- a/doc/html/pkcomposite_8cc_source.html
+++ b/doc/html/pkcomposite_8cc_source.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.3</span>
+    <span id="projectnumber">2.6.4</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -83,998 +83,1151 @@
 <div class="line"><a name="l00029"></a><span class="lineno">   29</span> <span class="preprocessor">#include "algorithms/StatFactory.h"</span></div>
 <div class="line"><a name="l00030"></a><span class="lineno">   30</span> </div>
 <div class="line"><a name="l00031"></a><span class="lineno">   31</span> <span class="comment">/******************************************************************************/</span></div>
-<div class="line"><a name="l00111"></a><span class="lineno">  111</span> <span class="keyword">namespace </span>crule{</div>
-<div class="line"><a name="l00112"></a><span class="lineno">  112</span>   <span class="keyword">enum</span> CRULE_TYPE {overwrite=0, maxndvi=1, maxband=2, minband=3, validband=4, mean=5, mode=6, median=7,sum=8,minallbands=9,maxallbands=10,stdev=11};</div>
-<div class="line"><a name="l00113"></a><span class="lineno">  113</span> }</div>
-<div class="line"><a name="l00114"></a><span class="lineno">  114</span> </div>
-<div class="line"><a name="l00115"></a><span class="lineno">  115</span> <span class="keyword">using namespace </span>std;</div>
-<div class="line"><a name="l00116"></a><span class="lineno">  116</span> </div>
-<div class="line"><a name="l00117"></a><span class="lineno">  117</span> <span class="keywordtype">int</span> main(<span class="keywordtype">int</span> argc, <span class="keywordtype">char</span> *argv[])</div>
-<div class="line"><a name="l00118"></a><span class="lineno">  118</span> {</div>
-<div class="line"><a name="l00119"></a><span class="lineno">  119</span>   <a class="code" href="classOptionpk.html">Optionpk<string></a>  input_opt(<span class="stringliteral">"i"</span>, <span class="stringliteral">"input"</span>, <span class="stringliteral">"Input image file(s). If input contains multiple images, a multi-band output is created"</span>);</div>
-<div class="line"><a name="l00120"></a><span class="lineno">  120</span>   <a class="code" href="classOptionpk.html">Optionpk<string></a>  output_opt(<span class="stringliteral">"o"</span>, <span class="stringliteral">"output"</span>, <span class="stringliteral">"Output image file"</span>);</div>
-<div class="line"><a name="l00121"></a><span class="lineno">  121</span>   <a class="code" href="classOptionpk.html">Optionpk<int></a>  band_opt(<span class="stringliteral">"b"</span>, <span class="stringliteral">"band"</span>, <span class="stringliteral">"band index(es) to crop (leave empty if all bands must be retained)"</span>);</div>
-<div class="line"><a name="l00122"></a><span class="lineno">  122</span>   <a class="code" href="classOptionpk.html">Optionpk<double></a>  dx_opt(<span class="stringliteral">"dx"</span>, <span class="stringliteral">"dx"</span>, <span class="stringliteral">"Output resolution in x (in meter) (empty: keep original resolution)"</span>);</div>
-<div class="line"><a name="l00123"></a><span class="lineno">  123</span>   <a class="code" href="classOptionpk.html">Optionpk<double></a>  dy_opt(<span class="stringliteral">"dy"</span>, <span class="stringliteral">"dy"</span>, <span class="stringliteral">"Output resolution in y (in meter) (empty: keep original resolution)"</span>);</div>
-<div class="line"><a name="l00124"></a><span class="lineno">  124</span>   <a class="code" href="classOptionpk.html">Optionpk<string></a>  extent_opt(<span class="stringliteral">"e"</span>, <span class="stringliteral">"extent"</span>, <span class="stringliteral">"get boundary from extent from polygons in vector file"</span>);</div>
-<div class="line"><a name="l00125"></a><span class="lineno">  125</span>   <a class="code" href="classOptionpk.html">Optionpk<double></a>  ulx_opt(<span class="stringliteral">"ulx"</span>, <span class="stringliteral">"ulx"</span>, <span class="stringliteral">"Upper left x value bounding box"</span>, 0.0);</div>
-<div class="line"><a name="l00126"></a><span class="lineno">  126</span>   <a class="code" href="classOptionpk.html">Optionpk<double></a>  uly_opt(<span class="stringliteral">"uly"</span>, <span class="stringliteral">"uly"</span>, <span class="stringliteral">"Upper left y value bounding box"</span>, 0.0);</div>
-<div class="line"><a name="l00127"></a><span class="lineno">  127</span>   <a class="code" href="classOptionpk.html">Optionpk<double></a>  lrx_opt(<span class="stringliteral">"lrx"</span>, <span class="stringliteral">"lrx"</span>, <span class="stringliteral">"Lower right x value bounding box"</span>, 0.0);</div>
-<div class="line"><a name="l00128"></a><span class="lineno">  128</span>   <a class="code" href="classOptionpk.html">Optionpk<double></a>  lry_opt(<span class="stringliteral">"lry"</span>, <span class="stringliteral">"lry"</span>, <span class="stringliteral">"Lower right y value bounding box"</span>, 0.0);</div>
-<div class="line"><a name="l00129"></a><span class="lineno">  129</span>   <a class="code" href="classOptionpk.html">Optionpk<string></a> crule_opt(<span class="stringliteral">"cr"</span>, <span class="stringliteral">"crule"</span>, <span class="stringliteral">"Composite rule (overwrite, maxndvi, maxband, minband, mean, mode (only for byte images), median, sum, maxallbands, minallbands, stdev"</span>, <span class="stringliteral">"overwrite&qu [...]
-<div class="line"><a name="l00130"></a><span class="lineno">  130</span>   <a class="code" href="classOptionpk.html">Optionpk<int></a> ruleBand_opt(<span class="stringliteral">"cb"</span>, <span class="stringliteral">"cband"</span>, <span class="stringliteral">"band index used for the composite rule (e.g., for ndvi, use --cband=0 --cband=1 with 0 and 1 indices for red and nir band respectively"</span>, 0);</div>
-<div class="line"><a name="l00131"></a><span class="lineno">  131</span>   <a class="code" href="classOptionpk.html">Optionpk<double></a> srcnodata_opt(<span class="stringliteral">"srcnodata"</span>, <span class="stringliteral">"srcnodata"</span>, <span class="stringliteral">"invalid value(s) for input raster dataset"</span>);</div>
-<div class="line"><a name="l00132"></a><span class="lineno">  132</span>   <a class="code" href="classOptionpk.html">Optionpk<int></a> bndnodata_opt(<span class="stringliteral">"bndnodata"</span>, <span class="stringliteral">"bndnodata"</span>, <span class="stringliteral">"Band(s) in input image to check if pixel is valid (used for srcnodata, min and max options)"</span>, 0);</div>
-<div class="line"><a name="l00133"></a><span class="lineno">  133</span>   <a class="code" href="classOptionpk.html">Optionpk<double></a> minValue_opt(<span class="stringliteral">"min"</span>, <span class="stringliteral">"min"</span>, <span class="stringliteral">"flag values smaller or equal to this value as invalid."</span>);</div>
-<div class="line"><a name="l00134"></a><span class="lineno">  134</span>   <a class="code" href="classOptionpk.html">Optionpk<double></a> maxValue_opt(<span class="stringliteral">"max"</span>, <span class="stringliteral">"max"</span>, <span class="stringliteral">"flag values larger or equal to this value as invalid."</span>);</div>
-<div class="line"><a name="l00135"></a><span class="lineno">  135</span>   <a class="code" href="classOptionpk.html">Optionpk<double></a>  dstnodata_opt(<span class="stringliteral">"dstnodata"</span>, <span class="stringliteral">"dstnodata"</span>, <span class="stringliteral">"nodata value to put in output raster dataset if not valid or out of bounds."</span>, 0);</div>
-<div class="line"><a name="l00136"></a><span class="lineno">  136</span>   <a class="code" href="classOptionpk.html">Optionpk<string></a>  resample_opt(<span class="stringliteral">"r"</span>, <span class="stringliteral">"resampling-method"</span>, <span class="stringliteral">"Resampling method (near: nearest neighbor, bilinear: bi-linear interpolation)."</span>, <span class="stringliteral">"near"</span>);</div>
-<div class="line"><a name="l00137"></a><span class="lineno">  137</span>   <a class="code" href="classOptionpk.html">Optionpk<string></a>  otype_opt(<span class="stringliteral">"ot"</span>, <span class="stringliteral">"otype"</span>, <span class="stringliteral">"Data type for output image ({Byte/Int16/UInt16/UInt32/Int32/Float32/Float64/CInt16/CInt32/CFloat32/CFloat64}). Empty string: inherit type from input image"</span>, <span class="stringliter [...]
-<div class="line"><a name="l00138"></a><span class="lineno">  138</span>   <a class="code" href="classOptionpk.html">Optionpk<string></a>  oformat_opt(<span class="stringliteral">"of"</span>, <span class="stringliteral">"oformat"</span>, <span class="stringliteral">"Output image format (see also gdal_translate). Empty string: inherit from input image"</span>);</div>
-<div class="line"><a name="l00139"></a><span class="lineno">  139</span>   <a class="code" href="classOptionpk.html">Optionpk<string></a> option_opt(<span class="stringliteral">"co"</span>, <span class="stringliteral">"co"</span>, <span class="stringliteral">"Creation option for output file. Multiple options can be specified."</span>);</div>
-<div class="line"><a name="l00140"></a><span class="lineno">  140</span>   <a class="code" href="classOptionpk.html">Optionpk<string></a>  projection_opt(<span class="stringliteral">"a_srs"</span>, <span class="stringliteral">"a_srs"</span>, <span class="stringliteral">"Override the spatial reference for the output file (leave blank to copy from input file, use epsg:3035 to use European projection and force to European grid"</span>);</div>
-<div class="line"><a name="l00141"></a><span class="lineno">  141</span>   <a class="code" href="classOptionpk.html">Optionpk<short></a> file_opt(<span class="stringliteral">"file"</span>, <span class="stringliteral">"file"</span>, <span class="stringliteral">"write number of observations (1) or sequence nr of selected file (2) for each pixels as additional layer in composite"</span>, 0);</div>
-<div class="line"><a name="l00142"></a><span class="lineno">  142</span>   <a class="code" href="classOptionpk.html">Optionpk<short></a> weight_opt(<span class="stringliteral">"w"</span>, <span class="stringliteral">"weight"</span>, <span class="stringliteral">"Weights (type: short) for the composite, use one weight for each input file in same order as input files are provided). Use value 1 for equal weights."</span>, 1);</div>
-<div class="line"><a name="l00143"></a><span class="lineno">  143</span>   <a class="code" href="classOptionpk.html">Optionpk<short></a> class_opt(<span class="stringliteral">"c"</span>, <span class="stringliteral">"class"</span>, <span class="stringliteral">"classes for multi-band output image: each band represents the number of observations for one specific class. Use value 0 for no multi-band output image."</span>, 0);</div>
-<div class="line"><a name="l00144"></a><span class="lineno">  144</span>   <a class="code" href="classOptionpk.html">Optionpk<string></a>  colorTable_opt(<span class="stringliteral">"ct"</span>, <span class="stringliteral">"ct"</span>, <span class="stringliteral">"color table file with 5 columns: id R G B ALFA (0: transparent, 255: solid)"</span>);</div>
-<div class="line"><a name="l00145"></a><span class="lineno">  145</span>   <a class="code" href="classOptionpk.html">Optionpk<string></a>  description_opt(<span class="stringliteral">"d"</span>, <span class="stringliteral">"description"</span>, <span class="stringliteral">"Set image description"</span>);</div>
-<div class="line"><a name="l00146"></a><span class="lineno">  146</span>   <a class="code" href="classOptionpk.html">Optionpk<short></a>  verbose_opt(<span class="stringliteral">"v"</span>, <span class="stringliteral">"verbose"</span>, <span class="stringliteral">"verbose"</span>, 0,2);</div>
-<div class="line"><a name="l00147"></a><span class="lineno">  147</span> </div>
-<div class="line"><a name="l00148"></a><span class="lineno">  148</span>   file_opt.setHide(1);</div>
-<div class="line"><a name="l00149"></a><span class="lineno">  149</span>   weight_opt.setHide(1);</div>
-<div class="line"><a name="l00150"></a><span class="lineno">  150</span>   class_opt.setHide(1);</div>
-<div class="line"><a name="l00151"></a><span class="lineno">  151</span>   colorTable_opt.setHide(1);</div>
-<div class="line"><a name="l00152"></a><span class="lineno">  152</span>   description_opt.setHide(1);</div>
-<div class="line"><a name="l00153"></a><span class="lineno">  153</span> </div>
-<div class="line"><a name="l00154"></a><span class="lineno">  154</span>   <span class="keywordtype">bool</span> doProcess;<span class="comment">//stop process when program was invoked with help option (-h --help)</span></div>
-<div class="line"><a name="l00155"></a><span class="lineno">  155</span>   <span class="keywordflow">try</span>{</div>
-<div class="line"><a name="l00156"></a><span class="lineno">  156</span>     doProcess=input_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00157"></a><span class="lineno">  157</span>     output_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00158"></a><span class="lineno">  158</span>     band_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00159"></a><span class="lineno">  159</span>     dx_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00160"></a><span class="lineno">  160</span>     dy_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00161"></a><span class="lineno">  161</span>     extent_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00162"></a><span class="lineno">  162</span>     ulx_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00163"></a><span class="lineno">  163</span>     uly_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00164"></a><span class="lineno">  164</span>     lrx_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00165"></a><span class="lineno">  165</span>     lry_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00166"></a><span class="lineno">  166</span>     crule_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00167"></a><span class="lineno">  167</span>     ruleBand_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00168"></a><span class="lineno">  168</span>     srcnodata_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00169"></a><span class="lineno">  169</span>     bndnodata_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00170"></a><span class="lineno">  170</span>     minValue_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00171"></a><span class="lineno">  171</span>     maxValue_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00172"></a><span class="lineno">  172</span>     dstnodata_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00173"></a><span class="lineno">  173</span>     resample_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00174"></a><span class="lineno">  174</span>     otype_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00175"></a><span class="lineno">  175</span>     oformat_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00176"></a><span class="lineno">  176</span>     option_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00177"></a><span class="lineno">  177</span>     projection_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00178"></a><span class="lineno">  178</span>     file_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00179"></a><span class="lineno">  179</span>     weight_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00180"></a><span class="lineno">  180</span>     class_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00181"></a><span class="lineno">  181</span>     colorTable_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00182"></a><span class="lineno">  182</span>     description_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00183"></a><span class="lineno">  183</span>     verbose_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00184"></a><span class="lineno">  184</span>   }</div>
-<div class="line"><a name="l00185"></a><span class="lineno">  185</span>   <span class="keywordflow">catch</span>(<span class="keywordtype">string</span> predefinedString){</div>
-<div class="line"><a name="l00186"></a><span class="lineno">  186</span>     std::cout << predefinedString << std::endl;</div>
-<div class="line"><a name="l00187"></a><span class="lineno">  187</span>     exit(0);</div>
-<div class="line"><a name="l00188"></a><span class="lineno">  188</span>   }</div>
-<div class="line"><a name="l00189"></a><span class="lineno">  189</span>   <span class="keywordflow">if</span>(!doProcess){</div>
-<div class="line"><a name="l00190"></a><span class="lineno">  190</span>     cout << endl;</div>
-<div class="line"><a name="l00191"></a><span class="lineno">  191</span>     cout << <span class="stringliteral">"Usage: pkcomposite -i input [-i input]* -o output"</span> << endl;</div>
-<div class="line"><a name="l00192"></a><span class="lineno">  192</span>     cout << endl;</div>
-<div class="line"><a name="l00193"></a><span class="lineno">  193</span>     std::cout << <span class="stringliteral">"short option -h shows basic options only, use long option --help to show all options"</span> << std::endl;</div>
-<div class="line"><a name="l00194"></a><span class="lineno">  194</span>     exit(0);<span class="comment">//help was invoked, stop processing</span></div>
-<div class="line"><a name="l00195"></a><span class="lineno">  195</span>   }</div>
-<div class="line"><a name="l00196"></a><span class="lineno">  196</span> </div>
-<div class="line"><a name="l00197"></a><span class="lineno">  197</span>   std::map<std::string, crule::CRULE_TYPE> cruleMap;</div>
-<div class="line"><a name="l00198"></a><span class="lineno">  198</span>   <span class="comment">// //initialize cruleMap</span></div>
-<div class="line"><a name="l00199"></a><span class="lineno">  199</span>   <span class="comment">// enum CRULE_TYPE {overwrite=0, maxndvi=1, maxband=2, minband=3, validband=4, mean=5, mode=6, median=7,sum=8};</span></div>
-<div class="line"><a name="l00200"></a><span class="lineno">  200</span> </div>
-<div class="line"><a name="l00201"></a><span class="lineno">  201</span>   cruleMap[<span class="stringliteral">"overwrite"</span>]=crule::overwrite;</div>
-<div class="line"><a name="l00202"></a><span class="lineno">  202</span>   cruleMap[<span class="stringliteral">"maxndvi"</span>]=crule::maxndvi;</div>
-<div class="line"><a name="l00203"></a><span class="lineno">  203</span>   cruleMap[<span class="stringliteral">"maxband"</span>]=crule::maxband;</div>
-<div class="line"><a name="l00204"></a><span class="lineno">  204</span>   cruleMap[<span class="stringliteral">"minband"</span>]=crule::minband;</div>
-<div class="line"><a name="l00205"></a><span class="lineno">  205</span>   cruleMap[<span class="stringliteral">"validband"</span>]=crule::validband;</div>
-<div class="line"><a name="l00206"></a><span class="lineno">  206</span>   cruleMap[<span class="stringliteral">"mean"</span>]=crule::mean;</div>
-<div class="line"><a name="l00207"></a><span class="lineno">  207</span>   cruleMap[<span class="stringliteral">"mode"</span>]=crule::mode;</div>
-<div class="line"><a name="l00208"></a><span class="lineno">  208</span>   cruleMap[<span class="stringliteral">"median"</span>]=crule::median;</div>
-<div class="line"><a name="l00209"></a><span class="lineno">  209</span>   cruleMap[<span class="stringliteral">"sum"</span>]=crule::sum;</div>
-<div class="line"><a name="l00210"></a><span class="lineno">  210</span>   cruleMap[<span class="stringliteral">"maxallbands"</span>]=crule::maxallbands;</div>
-<div class="line"><a name="l00211"></a><span class="lineno">  211</span>   cruleMap[<span class="stringliteral">"minallbands"</span>]=crule::minallbands;</div>
-<div class="line"><a name="l00212"></a><span class="lineno">  212</span>   cruleMap[<span class="stringliteral">"stdev"</span>]=crule::stdev;</div>
-<div class="line"><a name="l00213"></a><span class="lineno">  213</span> </div>
-<div class="line"><a name="l00214"></a><span class="lineno">  214</span>   <span class="keywordflow">if</span>(srcnodata_opt.size()){</div>
-<div class="line"><a name="l00215"></a><span class="lineno">  215</span>     <span class="keywordflow">while</span>(srcnodata_opt.size()<bndnodata_opt.size())</div>
-<div class="line"><a name="l00216"></a><span class="lineno">  216</span>       srcnodata_opt.push_back(srcnodata_opt[0]);</div>
-<div class="line"><a name="l00217"></a><span class="lineno">  217</span>   }</div>
-<div class="line"><a name="l00218"></a><span class="lineno">  218</span>   <span class="keywordflow">while</span>(bndnodata_opt.size()<srcnodata_opt.size())</div>
-<div class="line"><a name="l00219"></a><span class="lineno">  219</span>     bndnodata_opt.push_back(bndnodata_opt[0]);</div>
-<div class="line"><a name="l00220"></a><span class="lineno">  220</span>   <span class="keywordflow">if</span>(minValue_opt.size()){</div>
-<div class="line"><a name="l00221"></a><span class="lineno">  221</span>     <span class="keywordflow">while</span>(minValue_opt.size()<bndnodata_opt.size())</div>
-<div class="line"><a name="l00222"></a><span class="lineno">  222</span>       minValue_opt.push_back(minValue_opt[0]);</div>
-<div class="line"><a name="l00223"></a><span class="lineno">  223</span>     <span class="keywordflow">while</span>(bndnodata_opt.size()<minValue_opt.size())</div>
-<div class="line"><a name="l00224"></a><span class="lineno">  224</span>       bndnodata_opt.push_back(bndnodata_opt[0]);</div>
+<div class="line"><a name="l00134"></a><span class="lineno">  134</span> <span class="keyword">namespace </span>crule{</div>
+<div class="line"><a name="l00135"></a><span class="lineno">  135</span>   <span class="keyword">enum</span> CRULE_TYPE {overwrite=0, maxndvi=1, maxband=2, minband=3, validband=4, mean=5, mode=6, median=7,sum=8,minallbands=9,maxallbands=10,stdev=11};</div>
+<div class="line"><a name="l00136"></a><span class="lineno">  136</span> }</div>
+<div class="line"><a name="l00137"></a><span class="lineno">  137</span> </div>
+<div class="line"><a name="l00138"></a><span class="lineno">  138</span> <span class="keyword">using namespace </span>std;</div>
+<div class="line"><a name="l00139"></a><span class="lineno">  139</span> </div>
+<div class="line"><a name="l00140"></a><span class="lineno">  140</span> <span class="keywordtype">int</span> main(<span class="keywordtype">int</span> argc, <span class="keywordtype">char</span> *argv[])</div>
+<div class="line"><a name="l00141"></a><span class="lineno">  141</span> {</div>
+<div class="line"><a name="l00142"></a><span class="lineno">  142</span>   <a class="code" href="classOptionpk.html">Optionpk<string></a>  input_opt(<span class="stringliteral">"i"</span>, <span class="stringliteral">"input"</span>, <span class="stringliteral">"Input image file(s). If input contains multiple images, a multi-band output is created"</span>);</div>
+<div class="line"><a name="l00143"></a><span class="lineno">  143</span>   <a class="code" href="classOptionpk.html">Optionpk<string></a>  output_opt(<span class="stringliteral">"o"</span>, <span class="stringliteral">"output"</span>, <span class="stringliteral">"Output image file"</span>);</div>
+<div class="line"><a name="l00144"></a><span class="lineno">  144</span>   <a class="code" href="classOptionpk.html">Optionpk<int></a>  band_opt(<span class="stringliteral">"b"</span>, <span class="stringliteral">"band"</span>, <span class="stringliteral">"band index(es) to crop (leave empty if all bands must be retained)"</span>);</div>
+<div class="line"><a name="l00145"></a><span class="lineno">  145</span>   <a class="code" href="classOptionpk.html">Optionpk<double></a>  dx_opt(<span class="stringliteral">"dx"</span>, <span class="stringliteral">"dx"</span>, <span class="stringliteral">"Output resolution in x (in meter) (empty: keep original resolution)"</span>);</div>
+<div class="line"><a name="l00146"></a><span class="lineno">  146</span>   <a class="code" href="classOptionpk.html">Optionpk<double></a>  dy_opt(<span class="stringliteral">"dy"</span>, <span class="stringliteral">"dy"</span>, <span class="stringliteral">"Output resolution in y (in meter) (empty: keep original resolution)"</span>);</div>
+<div class="line"><a name="l00147"></a><span class="lineno">  147</span>   <a class="code" href="classOptionpk.html">Optionpk<string></a>  extent_opt(<span class="stringliteral">"e"</span>, <span class="stringliteral">"extent"</span>, <span class="stringliteral">"get boundary from extent from polygons in vector file"</span>);</div>
+<div class="line"><a name="l00148"></a><span class="lineno">  148</span>   <a class="code" href="classOptionpk.html">Optionpk<bool></a> cut_opt(<span class="stringliteral">"cut"</span>, <span class="stringliteral">"crop_to_cutline"</span>, <span class="stringliteral">"Crop the extent of the target dataset to the extent of the cutline."</span>,<span class="keyword">false</span>);</div>
+<div class="line"><a name="l00149"></a><span class="lineno">  149</span>   <a class="code" href="classOptionpk.html">Optionpk<string></a> mask_opt(<span class="stringliteral">"m"</span>, <span class="stringliteral">"mask"</span>, <span class="stringliteral">"Use the first band of the specified file as a validity mask (0 is nodata)."</span>);</div>
+<div class="line"><a name="l00150"></a><span class="lineno">  150</span>   <a class="code" href="classOptionpk.html">Optionpk<float></a> msknodata_opt(<span class="stringliteral">"msknodata"</span>, <span class="stringliteral">"msknodata"</span>, <span class="stringliteral">"Mask value not to consider for composite."</span>, 0);</div>
+<div class="line"><a name="l00151"></a><span class="lineno">  151</span>   <a class="code" href="classOptionpk.html">Optionpk<short></a> mskband_opt(<span class="stringliteral">"mskband"</span>, <span class="stringliteral">"mskband"</span>, <span class="stringliteral">"Mask band to read (0 indexed). Provide band for each mask."</span>, 0);</div>
+<div class="line"><a name="l00152"></a><span class="lineno">  152</span>   <a class="code" href="classOptionpk.html">Optionpk<double></a>  ulx_opt(<span class="stringliteral">"ulx"</span>, <span class="stringliteral">"ulx"</span>, <span class="stringliteral">"Upper left x value bounding box"</span>, 0.0);</div>
+<div class="line"><a name="l00153"></a><span class="lineno">  153</span>   <a class="code" href="classOptionpk.html">Optionpk<double></a>  uly_opt(<span class="stringliteral">"uly"</span>, <span class="stringliteral">"uly"</span>, <span class="stringliteral">"Upper left y value bounding box"</span>, 0.0);</div>
+<div class="line"><a name="l00154"></a><span class="lineno">  154</span>   <a class="code" href="classOptionpk.html">Optionpk<double></a>  lrx_opt(<span class="stringliteral">"lrx"</span>, <span class="stringliteral">"lrx"</span>, <span class="stringliteral">"Lower right x value bounding box"</span>, 0.0);</div>
+<div class="line"><a name="l00155"></a><span class="lineno">  155</span>   <a class="code" href="classOptionpk.html">Optionpk<double></a>  lry_opt(<span class="stringliteral">"lry"</span>, <span class="stringliteral">"lry"</span>, <span class="stringliteral">"Lower right y value bounding box"</span>, 0.0);</div>
+<div class="line"><a name="l00156"></a><span class="lineno">  156</span>   <a class="code" href="classOptionpk.html">Optionpk<string></a> crule_opt(<span class="stringliteral">"cr"</span>, <span class="stringliteral">"crule"</span>, <span class="stringliteral">"Composite rule (overwrite, maxndvi, maxband, minband, mean, mode (only for byte images), median, sum, maxallbands, minallbands, stdev"</span>, <span class="stringliteral">"overwrite&qu [...]
+<div class="line"><a name="l00157"></a><span class="lineno">  157</span>   <a class="code" href="classOptionpk.html">Optionpk<int></a> ruleBand_opt(<span class="stringliteral">"cb"</span>, <span class="stringliteral">"cband"</span>, <span class="stringliteral">"band index used for the composite rule (e.g., for ndvi, use --cband=0 --cband=1 with 0 and 1 indices for red and nir band respectively"</span>, 0);</div>
+<div class="line"><a name="l00158"></a><span class="lineno">  158</span>   <a class="code" href="classOptionpk.html">Optionpk<double></a> srcnodata_opt(<span class="stringliteral">"srcnodata"</span>, <span class="stringliteral">"srcnodata"</span>, <span class="stringliteral">"invalid value(s) for input raster dataset"</span>);</div>
+<div class="line"><a name="l00159"></a><span class="lineno">  159</span>   <a class="code" href="classOptionpk.html">Optionpk<int></a> bndnodata_opt(<span class="stringliteral">"bndnodata"</span>, <span class="stringliteral">"bndnodata"</span>, <span class="stringliteral">"Band(s) in input image to check if pixel is valid (used for srcnodata, min and max options)"</span>, 0);</div>
+<div class="line"><a name="l00160"></a><span class="lineno">  160</span>   <a class="code" href="classOptionpk.html">Optionpk<double></a> minValue_opt(<span class="stringliteral">"min"</span>, <span class="stringliteral">"min"</span>, <span class="stringliteral">"flag values smaller or equal to this value as invalid."</span>);</div>
+<div class="line"><a name="l00161"></a><span class="lineno">  161</span>   <a class="code" href="classOptionpk.html">Optionpk<double></a> maxValue_opt(<span class="stringliteral">"max"</span>, <span class="stringliteral">"max"</span>, <span class="stringliteral">"flag values larger or equal to this value as invalid."</span>);</div>
+<div class="line"><a name="l00162"></a><span class="lineno">  162</span>   <a class="code" href="classOptionpk.html">Optionpk<double></a>  dstnodata_opt(<span class="stringliteral">"dstnodata"</span>, <span class="stringliteral">"dstnodata"</span>, <span class="stringliteral">"nodata value to put in output raster dataset if not valid or out of bounds."</span>, 0);</div>
+<div class="line"><a name="l00163"></a><span class="lineno">  163</span>   <a class="code" href="classOptionpk.html">Optionpk<string></a>  resample_opt(<span class="stringliteral">"r"</span>, <span class="stringliteral">"resampling-method"</span>, <span class="stringliteral">"Resampling method (near: nearest neighbor, bilinear: bi-linear interpolation)."</span>, <span class="stringliteral">"near"</span>);</div>
+<div class="line"><a name="l00164"></a><span class="lineno">  164</span>   <a class="code" href="classOptionpk.html">Optionpk<string></a>  otype_opt(<span class="stringliteral">"ot"</span>, <span class="stringliteral">"otype"</span>, <span class="stringliteral">"Data type for output image ({Byte/Int16/UInt16/UInt32/Int32/Float32/Float64/CInt16/CInt32/CFloat32/CFloat64}). Empty string: inherit type from input image"</span>, <span class="stringliter [...]
+<div class="line"><a name="l00165"></a><span class="lineno">  165</span>   <a class="code" href="classOptionpk.html">Optionpk<string></a>  oformat_opt(<span class="stringliteral">"of"</span>, <span class="stringliteral">"oformat"</span>, <span class="stringliteral">"Output image format (see also gdal_translate). Empty string: inherit from input image"</span>);</div>
+<div class="line"><a name="l00166"></a><span class="lineno">  166</span>   <a class="code" href="classOptionpk.html">Optionpk<string></a> option_opt(<span class="stringliteral">"co"</span>, <span class="stringliteral">"co"</span>, <span class="stringliteral">"Creation option for output file. Multiple options can be specified."</span>);</div>
+<div class="line"><a name="l00167"></a><span class="lineno">  167</span>   <a class="code" href="classOptionpk.html">Optionpk<string></a>  projection_opt(<span class="stringliteral">"a_srs"</span>, <span class="stringliteral">"a_srs"</span>, <span class="stringliteral">"Override the spatial reference for the output file (leave blank to copy from input file, use epsg:3035 to use European projection and force to European grid"</span>);</div>
+<div class="line"><a name="l00168"></a><span class="lineno">  168</span>   <a class="code" href="classOptionpk.html">Optionpk<short></a> file_opt(<span class="stringliteral">"file"</span>, <span class="stringliteral">"file"</span>, <span class="stringliteral">"write number of observations (1) or sequence nr of selected file (2) for each pixels as additional layer in composite"</span>, 0);</div>
+<div class="line"><a name="l00169"></a><span class="lineno">  169</span>   <a class="code" href="classOptionpk.html">Optionpk<short></a> weight_opt(<span class="stringliteral">"w"</span>, <span class="stringliteral">"weight"</span>, <span class="stringliteral">"Weights (type: short) for the composite, use one weight for each input file in same order as input files are provided). Use value 1 for equal weights."</span>, 1);</div>
+<div class="line"><a name="l00170"></a><span class="lineno">  170</span>   <a class="code" href="classOptionpk.html">Optionpk<short></a> class_opt(<span class="stringliteral">"c"</span>, <span class="stringliteral">"class"</span>, <span class="stringliteral">"classes for multi-band output image: each band represents the number of observations for one specific class. Use value 0 for no multi-band output image."</span>, 0);</div>
+<div class="line"><a name="l00171"></a><span class="lineno">  171</span>   <a class="code" href="classOptionpk.html">Optionpk<string></a>  colorTable_opt(<span class="stringliteral">"ct"</span>, <span class="stringliteral">"ct"</span>, <span class="stringliteral">"color table file with 5 columns: id R G B ALFA (0: transparent, 255: solid)"</span>);</div>
+<div class="line"><a name="l00172"></a><span class="lineno">  172</span>   <a class="code" href="classOptionpk.html">Optionpk<string></a>  description_opt(<span class="stringliteral">"d"</span>, <span class="stringliteral">"description"</span>, <span class="stringliteral">"Set image description"</span>);</div>
+<div class="line"><a name="l00173"></a><span class="lineno">  173</span>   <a class="code" href="classOptionpk.html">Optionpk<short></a>  verbose_opt(<span class="stringliteral">"v"</span>, <span class="stringliteral">"verbose"</span>, <span class="stringliteral">"verbose"</span>, 0,2);</div>
+<div class="line"><a name="l00174"></a><span class="lineno">  174</span> </div>
+<div class="line"><a name="l00175"></a><span class="lineno">  175</span>   extent_opt.setHide(1);</div>
+<div class="line"><a name="l00176"></a><span class="lineno">  176</span>   cut_opt.setHide(1);</div>
+<div class="line"><a name="l00177"></a><span class="lineno">  177</span>   mask_opt.setHide(1);</div>
+<div class="line"><a name="l00178"></a><span class="lineno">  178</span>   msknodata_opt.setHide(1);</div>
+<div class="line"><a name="l00179"></a><span class="lineno">  179</span>   mskband_opt.setHide(1);</div>
+<div class="line"><a name="l00180"></a><span class="lineno">  180</span>   option_opt.setHide(1);</div>
+<div class="line"><a name="l00181"></a><span class="lineno">  181</span>   file_opt.setHide(1);</div>
+<div class="line"><a name="l00182"></a><span class="lineno">  182</span>   weight_opt.setHide(1);</div>
+<div class="line"><a name="l00183"></a><span class="lineno">  183</span>   class_opt.setHide(1);</div>
+<div class="line"><a name="l00184"></a><span class="lineno">  184</span>   colorTable_opt.setHide(1);</div>
+<div class="line"><a name="l00185"></a><span class="lineno">  185</span>   description_opt.setHide(1);</div>
+<div class="line"><a name="l00186"></a><span class="lineno">  186</span> </div>
+<div class="line"><a name="l00187"></a><span class="lineno">  187</span>   <span class="keywordtype">bool</span> doProcess;<span class="comment">//stop process when program was invoked with help option (-h --help)</span></div>
+<div class="line"><a name="l00188"></a><span class="lineno">  188</span>   <span class="keywordflow">try</span>{</div>
+<div class="line"><a name="l00189"></a><span class="lineno">  189</span>     doProcess=input_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00190"></a><span class="lineno">  190</span>     output_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00191"></a><span class="lineno">  191</span>     band_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00192"></a><span class="lineno">  192</span>     dx_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00193"></a><span class="lineno">  193</span>     dy_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00194"></a><span class="lineno">  194</span>     extent_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00195"></a><span class="lineno">  195</span>     cut_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00196"></a><span class="lineno">  196</span>     mask_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00197"></a><span class="lineno">  197</span>     msknodata_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00198"></a><span class="lineno">  198</span>     mskband_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00199"></a><span class="lineno">  199</span>     ulx_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00200"></a><span class="lineno">  200</span>     uly_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00201"></a><span class="lineno">  201</span>     lrx_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00202"></a><span class="lineno">  202</span>     lry_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00203"></a><span class="lineno">  203</span>     crule_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00204"></a><span class="lineno">  204</span>     ruleBand_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00205"></a><span class="lineno">  205</span>     srcnodata_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00206"></a><span class="lineno">  206</span>     bndnodata_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00207"></a><span class="lineno">  207</span>     minValue_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00208"></a><span class="lineno">  208</span>     maxValue_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00209"></a><span class="lineno">  209</span>     dstnodata_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00210"></a><span class="lineno">  210</span>     resample_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00211"></a><span class="lineno">  211</span>     otype_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00212"></a><span class="lineno">  212</span>     oformat_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00213"></a><span class="lineno">  213</span>     option_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00214"></a><span class="lineno">  214</span>     projection_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00215"></a><span class="lineno">  215</span>     file_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00216"></a><span class="lineno">  216</span>     weight_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00217"></a><span class="lineno">  217</span>     class_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00218"></a><span class="lineno">  218</span>     colorTable_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00219"></a><span class="lineno">  219</span>     description_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00220"></a><span class="lineno">  220</span>     verbose_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00221"></a><span class="lineno">  221</span>   }</div>
+<div class="line"><a name="l00222"></a><span class="lineno">  222</span>   <span class="keywordflow">catch</span>(<span class="keywordtype">string</span> predefinedString){</div>
+<div class="line"><a name="l00223"></a><span class="lineno">  223</span>     std::cout << predefinedString << std::endl;</div>
+<div class="line"><a name="l00224"></a><span class="lineno">  224</span>     exit(0);</div>
 <div class="line"><a name="l00225"></a><span class="lineno">  225</span>   }</div>
-<div class="line"><a name="l00226"></a><span class="lineno">  226</span>   <span class="keywordflow">if</span>(maxValue_opt.size()){</div>
-<div class="line"><a name="l00227"></a><span class="lineno">  227</span>     <span class="keywordflow">while</span>(maxValue_opt.size()<bndnodata_opt.size())</div>
-<div class="line"><a name="l00228"></a><span class="lineno">  228</span>       maxValue_opt.push_back(maxValue_opt[0]);</div>
-<div class="line"><a name="l00229"></a><span class="lineno">  229</span>     <span class="keywordflow">while</span>(bndnodata_opt.size()<maxValue_opt.size())</div>
-<div class="line"><a name="l00230"></a><span class="lineno">  230</span>       bndnodata_opt.push_back(bndnodata_opt[0]);</div>
-<div class="line"><a name="l00231"></a><span class="lineno">  231</span>   }</div>
-<div class="line"><a name="l00232"></a><span class="lineno">  232</span>   RESAMPLE theResample;</div>
-<div class="line"><a name="l00233"></a><span class="lineno">  233</span>   <span class="keywordflow">if</span>(resample_opt[0]==<span class="stringliteral">"near"</span>){</div>
-<div class="line"><a name="l00234"></a><span class="lineno">  234</span>     theResample=NEAR;</div>
-<div class="line"><a name="l00235"></a><span class="lineno">  235</span>     <span class="keywordflow">if</span>(verbose_opt[0])</div>
-<div class="line"><a name="l00236"></a><span class="lineno">  236</span>       cout << <span class="stringliteral">"resampling: nearest neighbor"</span> << endl;</div>
-<div class="line"><a name="l00237"></a><span class="lineno">  237</span>   }</div>
-<div class="line"><a name="l00238"></a><span class="lineno">  238</span>   <span class="keywordflow">else</span> <span class="keywordflow">if</span>(resample_opt[0]==<span class="stringliteral">"bilinear"</span>){</div>
-<div class="line"><a name="l00239"></a><span class="lineno">  239</span>     theResample=BILINEAR;</div>
-<div class="line"><a name="l00240"></a><span class="lineno">  240</span>     <span class="keywordflow">if</span>(verbose_opt[0])</div>
-<div class="line"><a name="l00241"></a><span class="lineno">  241</span>       cout << <span class="stringliteral">"resampling: bilinear interpolation"</span> << endl;</div>
-<div class="line"><a name="l00242"></a><span class="lineno">  242</span>   }</div>
-<div class="line"><a name="l00243"></a><span class="lineno">  243</span>   <span class="keywordflow">else</span>{</div>
-<div class="line"><a name="l00244"></a><span class="lineno">  244</span>     std::cout << <span class="stringliteral">"Error: resampling method "</span> << resample_opt[0] << <span class="stringliteral">" not supported"</span> << std::endl;</div>
-<div class="line"><a name="l00245"></a><span class="lineno">  245</span>     exit(1);</div>
-<div class="line"><a name="l00246"></a><span class="lineno">  246</span>   }</div>
-<div class="line"><a name="l00247"></a><span class="lineno">  247</span>   </div>
-<div class="line"><a name="l00248"></a><span class="lineno">  248</span>   <span class="keywordflow">if</span>(input_opt.empty()){</div>
-<div class="line"><a name="l00249"></a><span class="lineno">  249</span>     std::cerr << <span class="stringliteral">"No input file provided (use option -i). Use --help for help information"</span> << std::endl;</div>
-<div class="line"><a name="l00250"></a><span class="lineno">  250</span>     exit(0);</div>
-<div class="line"><a name="l00251"></a><span class="lineno">  251</span>   }</div>
-<div class="line"><a name="l00252"></a><span class="lineno">  252</span>   <span class="keywordtype">int</span> nband=0;</div>
-<div class="line"><a name="l00253"></a><span class="lineno">  253</span>   <span class="keywordtype">int</span> nwriteBand=0;</div>
-<div class="line"><a name="l00254"></a><span class="lineno">  254</span>   <span class="keywordtype">int</span> writeBand=0;</div>
-<div class="line"><a name="l00255"></a><span class="lineno">  255</span>   vector<short> bands;</div>
-<div class="line"><a name="l00256"></a><span class="lineno">  256</span>   </div>
-<div class="line"><a name="l00257"></a><span class="lineno">  257</span>   <span class="comment">//get bounding box</span></div>
-<div class="line"><a name="l00258"></a><span class="lineno">  258</span>   <span class="keywordtype">double</span> maxLRX=0;</div>
-<div class="line"><a name="l00259"></a><span class="lineno">  259</span>   <span class="keywordtype">double</span> maxULY=0;</div>
-<div class="line"><a name="l00260"></a><span class="lineno">  260</span>   <span class="keywordtype">double</span> minULX=0;</div>
-<div class="line"><a name="l00261"></a><span class="lineno">  261</span>   <span class="keywordtype">double</span> minLRY=0;</div>
-<div class="line"><a name="l00262"></a><span class="lineno">  262</span>   <span class="keywordtype">double</span> magic_x=1,magic_y=1;<span class="comment">//magic pixel for GDAL map info</span></div>
-<div class="line"><a name="l00263"></a><span class="lineno">  263</span> </div>
-<div class="line"><a name="l00264"></a><span class="lineno">  264</span>   GDALDataType theType=GDT_Unknown;</div>
-<div class="line"><a name="l00265"></a><span class="lineno">  265</span>   <span class="keywordflow">if</span>(verbose_opt[0])</div>
-<div class="line"><a name="l00266"></a><span class="lineno">  266</span>     cout << <span class="stringliteral">"possible output data types: "</span>;</div>
-<div class="line"><a name="l00267"></a><span class="lineno">  267</span>   <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iType = 0; iType < GDT_TypeCount; ++iType){</div>
-<div class="line"><a name="l00268"></a><span class="lineno">  268</span>     <span class="keywordflow">if</span>(verbose_opt[0])</div>
-<div class="line"><a name="l00269"></a><span class="lineno">  269</span>       cout << <span class="stringliteral">" "</span> << GDALGetDataTypeName((GDALDataType)iType);</div>
-<div class="line"><a name="l00270"></a><span class="lineno">  270</span>     <span class="keywordflow">if</span>( GDALGetDataTypeName((GDALDataType)iType) != NULL</div>
-<div class="line"><a name="l00271"></a><span class="lineno">  271</span>         && EQUAL(GDALGetDataTypeName((GDALDataType)iType),</div>
-<div class="line"><a name="l00272"></a><span class="lineno">  272</span>                  otype_opt[0].c_str()))</div>
-<div class="line"><a name="l00273"></a><span class="lineno">  273</span>       theType=(GDALDataType) iType;</div>
+<div class="line"><a name="l00226"></a><span class="lineno">  226</span>   <span class="keywordflow">if</span>(!doProcess){</div>
+<div class="line"><a name="l00227"></a><span class="lineno">  227</span>     cout << endl;</div>
+<div class="line"><a name="l00228"></a><span class="lineno">  228</span>     cout << <span class="stringliteral">"Usage: pkcomposite -i input [-i input]* -o output"</span> << endl;</div>
+<div class="line"><a name="l00229"></a><span class="lineno">  229</span>     cout << endl;</div>
+<div class="line"><a name="l00230"></a><span class="lineno">  230</span>     std::cout << <span class="stringliteral">"short option -h shows basic options only, use long option --help to show all options"</span> << std::endl;</div>
+<div class="line"><a name="l00231"></a><span class="lineno">  231</span>     exit(0);<span class="comment">//help was invoked, stop processing</span></div>
+<div class="line"><a name="l00232"></a><span class="lineno">  232</span>   }</div>
+<div class="line"><a name="l00233"></a><span class="lineno">  233</span> </div>
+<div class="line"><a name="l00234"></a><span class="lineno">  234</span>   std::map<std::string, crule::CRULE_TYPE> cruleMap;</div>
+<div class="line"><a name="l00235"></a><span class="lineno">  235</span>   <span class="comment">// //initialize cruleMap</span></div>
+<div class="line"><a name="l00236"></a><span class="lineno">  236</span>   <span class="comment">// enum CRULE_TYPE {overwrite=0, maxndvi=1, maxband=2, minband=3, validband=4, mean=5, mode=6, median=7,sum=8};</span></div>
+<div class="line"><a name="l00237"></a><span class="lineno">  237</span> </div>
+<div class="line"><a name="l00238"></a><span class="lineno">  238</span>   cruleMap[<span class="stringliteral">"overwrite"</span>]=crule::overwrite;</div>
+<div class="line"><a name="l00239"></a><span class="lineno">  239</span>   cruleMap[<span class="stringliteral">"maxndvi"</span>]=crule::maxndvi;</div>
+<div class="line"><a name="l00240"></a><span class="lineno">  240</span>   cruleMap[<span class="stringliteral">"maxband"</span>]=crule::maxband;</div>
+<div class="line"><a name="l00241"></a><span class="lineno">  241</span>   cruleMap[<span class="stringliteral">"minband"</span>]=crule::minband;</div>
+<div class="line"><a name="l00242"></a><span class="lineno">  242</span>   cruleMap[<span class="stringliteral">"validband"</span>]=crule::validband;</div>
+<div class="line"><a name="l00243"></a><span class="lineno">  243</span>   cruleMap[<span class="stringliteral">"mean"</span>]=crule::mean;</div>
+<div class="line"><a name="l00244"></a><span class="lineno">  244</span>   cruleMap[<span class="stringliteral">"mode"</span>]=crule::mode;</div>
+<div class="line"><a name="l00245"></a><span class="lineno">  245</span>   cruleMap[<span class="stringliteral">"median"</span>]=crule::median;</div>
+<div class="line"><a name="l00246"></a><span class="lineno">  246</span>   cruleMap[<span class="stringliteral">"sum"</span>]=crule::sum;</div>
+<div class="line"><a name="l00247"></a><span class="lineno">  247</span>   cruleMap[<span class="stringliteral">"maxallbands"</span>]=crule::maxallbands;</div>
+<div class="line"><a name="l00248"></a><span class="lineno">  248</span>   cruleMap[<span class="stringliteral">"minallbands"</span>]=crule::minallbands;</div>
+<div class="line"><a name="l00249"></a><span class="lineno">  249</span>   cruleMap[<span class="stringliteral">"stdev"</span>]=crule::stdev;</div>
+<div class="line"><a name="l00250"></a><span class="lineno">  250</span> </div>
+<div class="line"><a name="l00251"></a><span class="lineno">  251</span>   <span class="keywordflow">if</span>(srcnodata_opt.size()){</div>
+<div class="line"><a name="l00252"></a><span class="lineno">  252</span>     <span class="keywordflow">while</span>(srcnodata_opt.size()<bndnodata_opt.size())</div>
+<div class="line"><a name="l00253"></a><span class="lineno">  253</span>       srcnodata_opt.push_back(srcnodata_opt[0]);</div>
+<div class="line"><a name="l00254"></a><span class="lineno">  254</span>   }</div>
+<div class="line"><a name="l00255"></a><span class="lineno">  255</span>   <span class="keywordflow">while</span>(bndnodata_opt.size()<srcnodata_opt.size())</div>
+<div class="line"><a name="l00256"></a><span class="lineno">  256</span>     bndnodata_opt.push_back(bndnodata_opt[0]);</div>
+<div class="line"><a name="l00257"></a><span class="lineno">  257</span>   <span class="keywordflow">if</span>(minValue_opt.size()){</div>
+<div class="line"><a name="l00258"></a><span class="lineno">  258</span>     <span class="keywordflow">while</span>(minValue_opt.size()<bndnodata_opt.size())</div>
+<div class="line"><a name="l00259"></a><span class="lineno">  259</span>       minValue_opt.push_back(minValue_opt[0]);</div>
+<div class="line"><a name="l00260"></a><span class="lineno">  260</span>     <span class="keywordflow">while</span>(bndnodata_opt.size()<minValue_opt.size())</div>
+<div class="line"><a name="l00261"></a><span class="lineno">  261</span>       bndnodata_opt.push_back(bndnodata_opt[0]);</div>
+<div class="line"><a name="l00262"></a><span class="lineno">  262</span>   }</div>
+<div class="line"><a name="l00263"></a><span class="lineno">  263</span>   <span class="keywordflow">if</span>(maxValue_opt.size()){</div>
+<div class="line"><a name="l00264"></a><span class="lineno">  264</span>     <span class="keywordflow">while</span>(maxValue_opt.size()<bndnodata_opt.size())</div>
+<div class="line"><a name="l00265"></a><span class="lineno">  265</span>       maxValue_opt.push_back(maxValue_opt[0]);</div>
+<div class="line"><a name="l00266"></a><span class="lineno">  266</span>     <span class="keywordflow">while</span>(bndnodata_opt.size()<maxValue_opt.size())</div>
+<div class="line"><a name="l00267"></a><span class="lineno">  267</span>       bndnodata_opt.push_back(bndnodata_opt[0]);</div>
+<div class="line"><a name="l00268"></a><span class="lineno">  268</span>   }</div>
+<div class="line"><a name="l00269"></a><span class="lineno">  269</span>   RESAMPLE theResample;</div>
+<div class="line"><a name="l00270"></a><span class="lineno">  270</span>   <span class="keywordflow">if</span>(resample_opt[0]==<span class="stringliteral">"near"</span>){</div>
+<div class="line"><a name="l00271"></a><span class="lineno">  271</span>     theResample=NEAR;</div>
+<div class="line"><a name="l00272"></a><span class="lineno">  272</span>     <span class="keywordflow">if</span>(verbose_opt[0])</div>
+<div class="line"><a name="l00273"></a><span class="lineno">  273</span>       cout << <span class="stringliteral">"resampling: nearest neighbor"</span> << endl;</div>
 <div class="line"><a name="l00274"></a><span class="lineno">  274</span>   }</div>
-<div class="line"><a name="l00275"></a><span class="lineno">  275</span>   <span class="keywordflow">if</span>(verbose_opt[0]){</div>
-<div class="line"><a name="l00276"></a><span class="lineno">  276</span>     cout << endl;</div>
-<div class="line"><a name="l00277"></a><span class="lineno">  277</span>     <span class="keywordflow">if</span>(theType==GDT_Unknown)</div>
-<div class="line"><a name="l00278"></a><span class="lineno">  278</span>       cout << <span class="stringliteral">"Unknown output pixel type: "</span> << otype_opt[0] << endl;</div>
-<div class="line"><a name="l00279"></a><span class="lineno">  279</span>     <span class="keywordflow">else</span></div>
-<div class="line"><a name="l00280"></a><span class="lineno">  280</span>       cout << <span class="stringliteral">"Output pixel type:  "</span> << GDALGetDataTypeName(theType) << endl;</div>
-<div class="line"><a name="l00281"></a><span class="lineno">  281</span>   }</div>
-<div class="line"><a name="l00282"></a><span class="lineno">  282</span> </div>
-<div class="line"><a name="l00283"></a><span class="lineno">  283</span>   <span class="keywordtype">double</span> dx=0;</div>
-<div class="line"><a name="l00284"></a><span class="lineno">  284</span>   <span class="keywordtype">double</span> dy=0;</div>
-<div class="line"><a name="l00285"></a><span class="lineno">  285</span>   <span class="comment">//get bounding box from extentReader if defined</span></div>
-<div class="line"><a name="l00286"></a><span class="lineno">  286</span>   <a class="code" href="classImgReaderOgr.html">ImgReaderOgr</a> extentReader;</div>
-<div class="line"><a name="l00287"></a><span class="lineno">  287</span>   <span class="keywordflow">if</span>(extent_opt.size()){</div>
-<div class="line"><a name="l00288"></a><span class="lineno">  288</span>     extentReader.open(extent_opt[0]);</div>
-<div class="line"><a name="l00289"></a><span class="lineno">  289</span>     <span class="keywordflow">if</span>(!(extentReader.getExtent(ulx_opt[0],uly_opt[0],lrx_opt[0],lry_opt[0]))){</div>
-<div class="line"><a name="l00290"></a><span class="lineno">  290</span>        cerr << <span class="stringliteral">"Error: could not get extent from "</span> << extent_opt[0] << endl;</div>
-<div class="line"><a name="l00291"></a><span class="lineno">  291</span>        exit(1);</div>
-<div class="line"><a name="l00292"></a><span class="lineno">  292</span>       }</div>
-<div class="line"><a name="l00293"></a><span class="lineno">  293</span>     <span class="keywordflow">else</span> <span class="keywordflow">if</span>(verbose_opt[0])</div>
-<div class="line"><a name="l00294"></a><span class="lineno">  294</span>       cout << <span class="stringliteral">"--ulx="</span> << ulx_opt[0] << <span class="stringliteral">" --uly="</span> << uly_opt[0] << <span class="stringliteral">" --lrx="</span> << lrx_opt[0] << <span class="stringliteral">" --lry="</span> << lry_opt[0] << endl;</div>
-<div class="line"><a name="l00295"></a><span class="lineno">  295</span>   }</div>
-<div class="line"><a name="l00296"></a><span class="lineno">  296</span> </div>
-<div class="line"><a name="l00297"></a><span class="lineno">  297</span>   <a class="code" href="classImgReaderGdal.html">ImgReaderGdal</a> imgReader;</div>
-<div class="line"><a name="l00298"></a><span class="lineno">  298</span>   <span class="keywordtype">string</span> theProjection=<span class="stringliteral">""</span>;</div>
-<div class="line"><a name="l00299"></a><span class="lineno">  299</span>   GDALColorTable* theColorTable=NULL;</div>
-<div class="line"><a name="l00300"></a><span class="lineno">  300</span>   <span class="keywordtype">string</span> imageType;</div>
-<div class="line"><a name="l00301"></a><span class="lineno">  301</span>   <span class="keywordtype">bool</span> init=<span class="keyword">false</span>;</div>
-<div class="line"><a name="l00302"></a><span class="lineno">  302</span>   <span class="keywordflow">for</span>(<span class="keywordtype">int</span> ifile=0;ifile<input_opt.size();++ifile){</div>
-<div class="line"><a name="l00303"></a><span class="lineno">  303</span>     <span class="keywordflow">try</span>{</div>
-<div class="line"><a name="l00304"></a><span class="lineno">  304</span>       imgReader.open(input_opt[ifile]);</div>
-<div class="line"><a name="l00305"></a><span class="lineno">  305</span>     }</div>
-<div class="line"><a name="l00306"></a><span class="lineno">  306</span>     <span class="keywordflow">catch</span>(<span class="keywordtype">string</span> errorstring){</div>
-<div class="line"><a name="l00307"></a><span class="lineno">  307</span>       cerr << errorstring << <span class="stringliteral">" "</span> << input_opt[ifile] << endl;</div>
-<div class="line"><a name="l00308"></a><span class="lineno">  308</span>     }</div>
-<div class="line"><a name="l00309"></a><span class="lineno">  309</span>     <span class="keywordflow">if</span>(colorTable_opt.empty())</div>
-<div class="line"><a name="l00310"></a><span class="lineno">  310</span>       <span class="keywordflow">if</span>(imgReader.getColorTable())</div>
-<div class="line"><a name="l00311"></a><span class="lineno">  311</span>         theColorTable=(imgReader.getColorTable()->Clone());</div>
-<div class="line"><a name="l00312"></a><span class="lineno">  312</span>     <span class="keywordflow">if</span>(projection_opt.empty())</div>
-<div class="line"><a name="l00313"></a><span class="lineno">  313</span>       theProjection=imgReader.getProjection();</div>
-<div class="line"><a name="l00314"></a><span class="lineno">  314</span>     <span class="keywordflow">if</span>(option_opt.findSubstring(<span class="stringliteral">"INTERLEAVE="</span>)==option_opt.end()){</div>
-<div class="line"><a name="l00315"></a><span class="lineno">  315</span>       <span class="keywordtype">string</span> theInterleave=<span class="stringliteral">"INTERLEAVE="</span>;</div>
-<div class="line"><a name="l00316"></a><span class="lineno">  316</span>       theInterleave+=imgReader.getInterleave();</div>
-<div class="line"><a name="l00317"></a><span class="lineno">  317</span>       option_opt.push_back(theInterleave);</div>
-<div class="line"><a name="l00318"></a><span class="lineno">  318</span>     }</div>
+<div class="line"><a name="l00275"></a><span class="lineno">  275</span>   <span class="keywordflow">else</span> <span class="keywordflow">if</span>(resample_opt[0]==<span class="stringliteral">"bilinear"</span>){</div>
+<div class="line"><a name="l00276"></a><span class="lineno">  276</span>     theResample=BILINEAR;</div>
+<div class="line"><a name="l00277"></a><span class="lineno">  277</span>     <span class="keywordflow">if</span>(verbose_opt[0])</div>
+<div class="line"><a name="l00278"></a><span class="lineno">  278</span>       cout << <span class="stringliteral">"resampling: bilinear interpolation"</span> << endl;</div>
+<div class="line"><a name="l00279"></a><span class="lineno">  279</span>   }</div>
+<div class="line"><a name="l00280"></a><span class="lineno">  280</span>   <span class="keywordflow">else</span>{</div>
+<div class="line"><a name="l00281"></a><span class="lineno">  281</span>     std::cout << <span class="stringliteral">"Error: resampling method "</span> << resample_opt[0] << <span class="stringliteral">" not supported"</span> << std::endl;</div>
+<div class="line"><a name="l00282"></a><span class="lineno">  282</span>     exit(1);</div>
+<div class="line"><a name="l00283"></a><span class="lineno">  283</span>   }</div>
+<div class="line"><a name="l00284"></a><span class="lineno">  284</span>   </div>
+<div class="line"><a name="l00285"></a><span class="lineno">  285</span>   <span class="keywordflow">if</span>(input_opt.empty()){</div>
+<div class="line"><a name="l00286"></a><span class="lineno">  286</span>     std::cerr << <span class="stringliteral">"No input file provided (use option -i). Use --help for help information"</span> << std::endl;</div>
+<div class="line"><a name="l00287"></a><span class="lineno">  287</span>     exit(0);</div>
+<div class="line"><a name="l00288"></a><span class="lineno">  288</span>   }</div>
+<div class="line"><a name="l00289"></a><span class="lineno">  289</span>   <span class="keywordtype">int</span> nband=0;</div>
+<div class="line"><a name="l00290"></a><span class="lineno">  290</span>   <span class="keywordtype">int</span> nwriteBand=0;</div>
+<div class="line"><a name="l00291"></a><span class="lineno">  291</span>   <span class="keywordtype">int</span> writeBand=0;</div>
+<div class="line"><a name="l00292"></a><span class="lineno">  292</span>   vector<short> bands;</div>
+<div class="line"><a name="l00293"></a><span class="lineno">  293</span>   </div>
+<div class="line"><a name="l00294"></a><span class="lineno">  294</span>   <span class="comment">//get bounding box</span></div>
+<div class="line"><a name="l00295"></a><span class="lineno">  295</span>   <span class="keywordtype">double</span> maxLRX=0;</div>
+<div class="line"><a name="l00296"></a><span class="lineno">  296</span>   <span class="keywordtype">double</span> maxULY=0;</div>
+<div class="line"><a name="l00297"></a><span class="lineno">  297</span>   <span class="keywordtype">double</span> minULX=0;</div>
+<div class="line"><a name="l00298"></a><span class="lineno">  298</span>   <span class="keywordtype">double</span> minLRY=0;</div>
+<div class="line"><a name="l00299"></a><span class="lineno">  299</span>   <span class="keywordtype">double</span> magic_x=1,magic_y=1;<span class="comment">//magic pixel for GDAL map info</span></div>
+<div class="line"><a name="l00300"></a><span class="lineno">  300</span> </div>
+<div class="line"><a name="l00301"></a><span class="lineno">  301</span>   GDALDataType theType=GDT_Unknown;</div>
+<div class="line"><a name="l00302"></a><span class="lineno">  302</span>   <span class="keywordflow">if</span>(verbose_opt[0])</div>
+<div class="line"><a name="l00303"></a><span class="lineno">  303</span>     cout << <span class="stringliteral">"possible output data types: "</span>;</div>
+<div class="line"><a name="l00304"></a><span class="lineno">  304</span>   <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iType = 0; iType < GDT_TypeCount; ++iType){</div>
+<div class="line"><a name="l00305"></a><span class="lineno">  305</span>     <span class="keywordflow">if</span>(verbose_opt[0])</div>
+<div class="line"><a name="l00306"></a><span class="lineno">  306</span>       cout << <span class="stringliteral">" "</span> << GDALGetDataTypeName((GDALDataType)iType);</div>
+<div class="line"><a name="l00307"></a><span class="lineno">  307</span>     <span class="keywordflow">if</span>( GDALGetDataTypeName((GDALDataType)iType) != NULL</div>
+<div class="line"><a name="l00308"></a><span class="lineno">  308</span>         && EQUAL(GDALGetDataTypeName((GDALDataType)iType),</div>
+<div class="line"><a name="l00309"></a><span class="lineno">  309</span>                  otype_opt[0].c_str()))</div>
+<div class="line"><a name="l00310"></a><span class="lineno">  310</span>       theType=(GDALDataType) iType;</div>
+<div class="line"><a name="l00311"></a><span class="lineno">  311</span>   }</div>
+<div class="line"><a name="l00312"></a><span class="lineno">  312</span>   <span class="keywordflow">if</span>(verbose_opt[0]){</div>
+<div class="line"><a name="l00313"></a><span class="lineno">  313</span>     cout << endl;</div>
+<div class="line"><a name="l00314"></a><span class="lineno">  314</span>     <span class="keywordflow">if</span>(theType==GDT_Unknown)</div>
+<div class="line"><a name="l00315"></a><span class="lineno">  315</span>       cout << <span class="stringliteral">"Unknown output pixel type: "</span> << otype_opt[0] << endl;</div>
+<div class="line"><a name="l00316"></a><span class="lineno">  316</span>     <span class="keywordflow">else</span></div>
+<div class="line"><a name="l00317"></a><span class="lineno">  317</span>       cout << <span class="stringliteral">"Output pixel type:  "</span> << GDALGetDataTypeName(theType) << endl;</div>
+<div class="line"><a name="l00318"></a><span class="lineno">  318</span>   }</div>
 <div class="line"><a name="l00319"></a><span class="lineno">  319</span> </div>
-<div class="line"><a name="l00320"></a><span class="lineno">  320</span>     <span class="keywordflow">if</span>((ulx_opt[0]||uly_opt[0]||lrx_opt[0]||lry_opt[0])&&(!imgReader.covers(ulx_opt[0],uly_opt[0],lrx_opt[0],lry_opt[0]))){</div>
-<div class="line"><a name="l00321"></a><span class="lineno">  321</span>       <span class="keywordflow">if</span>(verbose_opt[0])</div>
-<div class="line"><a name="l00322"></a><span class="lineno">  322</span>     cout << input_opt[ifile] << <span class="stringliteral">" not within bounding box, skipping..."</span> << endl;</div>
-<div class="line"><a name="l00323"></a><span class="lineno">  323</span>       imgReader.close();</div>
-<div class="line"><a name="l00324"></a><span class="lineno">  324</span>       <span class="keywordflow">continue</span>;</div>
-<div class="line"><a name="l00325"></a><span class="lineno">  325</span>     }</div>
-<div class="line"><a name="l00326"></a><span class="lineno">  326</span>     <span class="keywordtype">double</span> theULX, theULY, theLRX, theLRY;</div>
-<div class="line"><a name="l00327"></a><span class="lineno">  327</span>     imgReader.getBoundingBox(theULX,theULY,theLRX,theLRY);</div>
-<div class="line"><a name="l00328"></a><span class="lineno">  328</span>     <span class="keywordflow">if</span>(theLRY>theULY){</div>
-<div class="line"><a name="l00329"></a><span class="lineno">  329</span>       cerr << <span class="stringliteral">"Error: "</span> << input_opt[ifile] << <span class="stringliteral">" is not georeferenced, only referenced images are supported for pkcomposite "</span> << endl;</div>
-<div class="line"><a name="l00330"></a><span class="lineno">  330</span>       exit(1);</div>
-<div class="line"><a name="l00331"></a><span class="lineno">  331</span>     }</div>
-<div class="line"><a name="l00332"></a><span class="lineno">  332</span>     <span class="keywordflow">if</span>(verbose_opt[0])</div>
-<div class="line"><a name="l00333"></a><span class="lineno">  333</span>       cout << <span class="stringliteral">"Bounding Box (ULX ULY LRX LRY): "</span> << fixed << setprecision(6) << theULX << <span class="stringliteral">" "</span> << theULY << <span class="stringliteral">" "</span> << theLRX << <span class="stringliteral">" "</span> << theLRY << endl;</div>
-<div class="line"><a name="l00334"></a><span class="lineno">  334</span>     <span class="keywordflow">if</span>(!init){</div>
-<div class="line"><a name="l00335"></a><span class="lineno">  335</span>       <span class="keywordflow">if</span>(verbose_opt[0]){</div>
-<div class="line"><a name="l00336"></a><span class="lineno">  336</span>         <span class="keywordflow">switch</span>(cruleMap[crule_opt[0]]){</div>
-<div class="line"><a name="l00337"></a><span class="lineno">  337</span>         <span class="keywordflow">default</span>:</div>
-<div class="line"><a name="l00338"></a><span class="lineno">  338</span>         <span class="keywordflow">case</span>(crule::overwrite):</div>
-<div class="line"><a name="l00339"></a><span class="lineno">  339</span>           cout << <span class="stringliteral">"Composite rule: overwrite"</span> << endl;</div>
-<div class="line"><a name="l00340"></a><span class="lineno">  340</span>           <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l00341"></a><span class="lineno">  341</span>         <span class="keywordflow">case</span>(crule::maxndvi):</div>
-<div class="line"><a name="l00342"></a><span class="lineno">  342</span>           cout << <span class="stringliteral">"Composite rule: max ndvi"</span> << endl;</div>
-<div class="line"><a name="l00343"></a><span class="lineno">  343</span>           <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l00344"></a><span class="lineno">  344</span>         <span class="keywordflow">case</span>(crule::maxband):</div>
-<div class="line"><a name="l00345"></a><span class="lineno">  345</span>           cout << <span class="stringliteral">"Composite rule: max band"</span> << endl;</div>
-<div class="line"><a name="l00346"></a><span class="lineno">  346</span>           <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l00347"></a><span class="lineno">  347</span>         <span class="keywordflow">case</span>(crule::minband):</div>
-<div class="line"><a name="l00348"></a><span class="lineno">  348</span>           cout << <span class="stringliteral">"Composite rule: min band"</span> << endl;</div>
-<div class="line"><a name="l00349"></a><span class="lineno">  349</span>           <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l00350"></a><span class="lineno">  350</span>         <span class="keywordflow">case</span>(crule::validband):</div>
-<div class="line"><a name="l00351"></a><span class="lineno">  351</span>           cout << <span class="stringliteral">"Composite rule: valid band"</span> << endl;</div>
-<div class="line"><a name="l00352"></a><span class="lineno">  352</span>           <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l00353"></a><span class="lineno">  353</span>         <span class="keywordflow">case</span>(crule::mean):</div>
-<div class="line"><a name="l00354"></a><span class="lineno">  354</span>           cout << <span class="stringliteral">"Composite rule: mean value"</span> << endl;</div>
-<div class="line"><a name="l00355"></a><span class="lineno">  355</span>           <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l00356"></a><span class="lineno">  356</span>         <span class="keywordflow">case</span>(crule::mode):</div>
-<div class="line"><a name="l00357"></a><span class="lineno">  357</span>           cout << <span class="stringliteral">"Composite rule: max voting (only for byte images)"</span> << endl;</div>
-<div class="line"><a name="l00358"></a><span class="lineno">  358</span>           <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l00359"></a><span class="lineno">  359</span>         <span class="keywordflow">case</span>(crule::median):</div>
-<div class="line"><a name="l00360"></a><span class="lineno">  360</span>           cout << <span class="stringliteral">"Composite rule: median"</span> << endl;</div>
-<div class="line"><a name="l00361"></a><span class="lineno">  361</span>           <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l00362"></a><span class="lineno">  362</span>         <span class="keywordflow">case</span>(crule::stdev):</div>
-<div class="line"><a name="l00363"></a><span class="lineno">  363</span>           cout << <span class="stringliteral">"Composite rule: stdev"</span> << endl;</div>
-<div class="line"><a name="l00364"></a><span class="lineno">  364</span>           <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l00365"></a><span class="lineno">  365</span>         <span class="keywordflow">case</span>(crule::sum):</div>
-<div class="line"><a name="l00366"></a><span class="lineno">  366</span>           cout << <span class="stringliteral">"Composite rule: sum"</span> << endl;</div>
-<div class="line"><a name="l00367"></a><span class="lineno">  367</span>           <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l00368"></a><span class="lineno">  368</span>         <span class="keywordflow">case</span>(crule::minallbands):</div>
-<div class="line"><a name="l00369"></a><span class="lineno">  369</span>           cout << <span class="stringliteral">"Composite rule: minallbands"</span> << endl;</div>
-<div class="line"><a name="l00370"></a><span class="lineno">  370</span>           <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l00371"></a><span class="lineno">  371</span>         <span class="keywordflow">case</span>(crule::maxallbands):</div>
-<div class="line"><a name="l00372"></a><span class="lineno">  372</span>           cout << <span class="stringliteral">"Composite rule: maxallbands"</span> << endl;</div>
-<div class="line"><a name="l00373"></a><span class="lineno">  373</span>           <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l00374"></a><span class="lineno">  374</span>         }</div>
-<div class="line"><a name="l00375"></a><span class="lineno">  375</span>       }</div>
-<div class="line"><a name="l00376"></a><span class="lineno">  376</span>       <span class="keywordflow">if</span>(band_opt.size()){</div>
-<div class="line"><a name="l00377"></a><span class="lineno">  377</span>     nband=band_opt.size();</div>
-<div class="line"><a name="l00378"></a><span class="lineno">  378</span>         bands.resize(band_opt.size());</div>
-<div class="line"><a name="l00379"></a><span class="lineno">  379</span>         <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iband=0;iband<band_opt.size();++iband){</div>
-<div class="line"><a name="l00380"></a><span class="lineno">  380</span>           bands[iband]=band_opt[iband];</div>
-<div class="line"><a name="l00381"></a><span class="lineno">  381</span>           assert(bands[iband]<imgReader.nrOfBand());</div>
-<div class="line"><a name="l00382"></a><span class="lineno">  382</span>         }</div>
-<div class="line"><a name="l00383"></a><span class="lineno">  383</span>       }</div>
-<div class="line"><a name="l00384"></a><span class="lineno">  384</span>       <span class="keywordflow">else</span>{</div>
-<div class="line"><a name="l00385"></a><span class="lineno">  385</span>     nband=imgReader.nrOfBand();</div>
-<div class="line"><a name="l00386"></a><span class="lineno">  386</span>         bands.resize(nband);</div>
-<div class="line"><a name="l00387"></a><span class="lineno">  387</span>         <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iband=0;iband<nband;++iband)</div>
-<div class="line"><a name="l00388"></a><span class="lineno">  388</span>           bands[iband]=iband;</div>
-<div class="line"><a name="l00389"></a><span class="lineno">  389</span>       }</div>
-<div class="line"><a name="l00390"></a><span class="lineno">  390</span>       <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iband=0;iband<bndnodata_opt.size();++iband){</div>
-<div class="line"><a name="l00391"></a><span class="lineno">  391</span>         assert(bndnodata_opt[iband]>=0&&bndnodata_opt[iband]<nband);</div>
-<div class="line"><a name="l00392"></a><span class="lineno">  392</span>       }</div>
-<div class="line"><a name="l00393"></a><span class="lineno">  393</span>       <span class="comment">//if output type not set, get type from input image</span></div>
-<div class="line"><a name="l00394"></a><span class="lineno">  394</span>       <span class="keywordflow">if</span>(theType==GDT_Unknown){</div>
-<div class="line"><a name="l00395"></a><span class="lineno">  395</span>         theType=imgReader.getDataType();</div>
-<div class="line"><a name="l00396"></a><span class="lineno">  396</span>         <span class="keywordflow">if</span>(verbose_opt[0])</div>
-<div class="line"><a name="l00397"></a><span class="lineno">  397</span>           cout << <span class="stringliteral">"Using data type from input image: "</span> << GDALGetDataTypeName(theType) << endl;</div>
-<div class="line"><a name="l00398"></a><span class="lineno">  398</span>       }</div>
-<div class="line"><a name="l00399"></a><span class="lineno">  399</span> </div>
-<div class="line"><a name="l00400"></a><span class="lineno">  400</span>       <span class="keywordflow">if</span>(oformat_opt.size())<span class="comment">//default</span></div>
-<div class="line"><a name="l00401"></a><span class="lineno">  401</span>         imageType=oformat_opt[0];</div>
-<div class="line"><a name="l00402"></a><span class="lineno">  402</span>       <span class="keywordflow">else</span></div>
-<div class="line"><a name="l00403"></a><span class="lineno">  403</span>         imageType=imgReader.getImageType();</div>
-<div class="line"><a name="l00404"></a><span class="lineno">  404</span> </div>
-<div class="line"><a name="l00405"></a><span class="lineno">  405</span>       <span class="comment">// dataType=imgReader.getDataType(0);</span></div>
-<div class="line"><a name="l00406"></a><span class="lineno">  406</span>       <span class="keywordflow">if</span>(verbose_opt[0]){</div>
-<div class="line"><a name="l00407"></a><span class="lineno">  407</span>         cout << <span class="stringliteral">"type of data for "</span> << input_opt[ifile] << <span class="stringliteral">": "</span> << theType << endl;</div>
-<div class="line"><a name="l00408"></a><span class="lineno">  408</span>         cout << <span class="stringliteral">"nband: "</span> << nband << endl;</div>
-<div class="line"><a name="l00409"></a><span class="lineno">  409</span>       }</div>
-<div class="line"><a name="l00410"></a><span class="lineno">  410</span>       </div>
-<div class="line"><a name="l00411"></a><span class="lineno">  411</span>       maxLRX=theLRX;</div>
-<div class="line"><a name="l00412"></a><span class="lineno">  412</span>       maxULY=theULY;</div>
-<div class="line"><a name="l00413"></a><span class="lineno">  413</span>       minULX=theULX;</div>
-<div class="line"><a name="l00414"></a><span class="lineno">  414</span>       minLRY=theLRY;</div>
-<div class="line"><a name="l00415"></a><span class="lineno">  415</span>       <span class="keywordflow">if</span>(dx_opt.size())</div>
-<div class="line"><a name="l00416"></a><span class="lineno">  416</span>     dx=dx_opt[0];</div>
-<div class="line"><a name="l00417"></a><span class="lineno">  417</span>       <span class="keywordflow">else</span></div>
-<div class="line"><a name="l00418"></a><span class="lineno">  418</span>         dx=imgReader.getDeltaX();</div>
-<div class="line"><a name="l00419"></a><span class="lineno">  419</span>       <span class="keywordflow">if</span>(dy_opt.size())</div>
-<div class="line"><a name="l00420"></a><span class="lineno">  420</span>     dy=dy_opt[0];</div>
-<div class="line"><a name="l00421"></a><span class="lineno">  421</span>       <span class="keywordflow">else</span></div>
-<div class="line"><a name="l00422"></a><span class="lineno">  422</span>         dy=imgReader.getDeltaY();</div>
-<div class="line"><a name="l00423"></a><span class="lineno">  423</span>       <span class="comment">// imgReader.getMagicPixel(magic_x,magic_y);</span></div>
-<div class="line"><a name="l00424"></a><span class="lineno">  424</span>       init=<span class="keyword">true</span>;</div>
-<div class="line"><a name="l00425"></a><span class="lineno">  425</span>     }</div>
-<div class="line"><a name="l00426"></a><span class="lineno">  426</span>     <span class="keywordflow">else</span>{</div>
-<div class="line"><a name="l00427"></a><span class="lineno">  427</span>       <span class="comment">//convert bounding box to magic coordinates</span></div>
-<div class="line"><a name="l00428"></a><span class="lineno">  428</span>       <span class="comment">//check uniformity magic pixel</span></div>
-<div class="line"><a name="l00429"></a><span class="lineno">  429</span>       <span class="comment">// double test_x,test_y;</span></div>
-<div class="line"><a name="l00430"></a><span class="lineno">  430</span>       <span class="comment">// imgReader.getMagicPixel(test_x,test_y);</span></div>
-<div class="line"><a name="l00431"></a><span class="lineno">  431</span>       <span class="comment">// if(verbose_opt[0]){</span></div>
-<div class="line"><a name="l00432"></a><span class="lineno">  432</span>       <span class="comment">//   cout << "magic_x, magic_y: " << magic_x << ", " << magic_y << endl;</span></div>
-<div class="line"><a name="l00433"></a><span class="lineno">  433</span>       <span class="comment">// }</span></div>
-<div class="line"><a name="l00434"></a><span class="lineno">  434</span>       <span class="comment">// assert(magic_x==test_x);</span></div>
-<div class="line"><a name="l00435"></a><span class="lineno">  435</span>       <span class="comment">// assert(magic_y==test_y);</span></div>
-<div class="line"><a name="l00436"></a><span class="lineno">  436</span>       maxLRX=(theLRX>maxLRX)?theLRX:maxLRX;</div>
-<div class="line"><a name="l00437"></a><span class="lineno">  437</span>       maxULY=(theULY>maxULY)?theULY:maxULY;</div>
-<div class="line"><a name="l00438"></a><span class="lineno">  438</span>       minULX=(theULX<minULX)?theULX:minULX;</div>
-<div class="line"><a name="l00439"></a><span class="lineno">  439</span>       minLRY=(theLRY<minLRY)?theLRY:minLRY;</div>
-<div class="line"><a name="l00440"></a><span class="lineno">  440</span>     }</div>
-<div class="line"><a name="l00441"></a><span class="lineno">  441</span>     imgReader.close();</div>
-<div class="line"><a name="l00442"></a><span class="lineno">  442</span>   }</div>
-<div class="line"><a name="l00443"></a><span class="lineno">  443</span>   <span class="keywordflow">if</span>(verbose_opt[0])</div>
-<div class="line"><a name="l00444"></a><span class="lineno">  444</span>     cout << <span class="stringliteral">"bounding box input images (ULX ULY LRX LRY): "</span> << fixed << setprecision(6) << minULX << <span class="stringliteral">" "</span> << maxULY << <span class="stringliteral">" "</span> << maxLRX << <span class="stringliteral">" "</span> << minLRY << endl;</div>
-<div class="line"><a name="l00445"></a><span class="lineno">  445</span>   <span class="keywordflow">if</span>(ulx_opt[0]||uly_opt[0]||lrx_opt[0]||lry_opt[0]){</div>
-<div class="line"><a name="l00446"></a><span class="lineno">  446</span>     maxLRX=lrx_opt[0];</div>
-<div class="line"><a name="l00447"></a><span class="lineno">  447</span>     maxULY=uly_opt[0];</div>
-<div class="line"><a name="l00448"></a><span class="lineno">  448</span>     minULX=ulx_opt[0];</div>
-<div class="line"><a name="l00449"></a><span class="lineno">  449</span>     minLRY=lry_opt[0];</div>
-<div class="line"><a name="l00450"></a><span class="lineno">  450</span>   }</div>
-<div class="line"><a name="l00451"></a><span class="lineno">  451</span>   </div>
-<div class="line"><a name="l00452"></a><span class="lineno">  452</span>   <span class="keywordtype">bool</span> forceEUgrid=<span class="keyword">false</span>;</div>
-<div class="line"><a name="l00453"></a><span class="lineno">  453</span>   <span class="keywordflow">if</span>(projection_opt.size())</div>
-<div class="line"><a name="l00454"></a><span class="lineno">  454</span>     forceEUgrid=(!(projection_opt[0].compare(<span class="stringliteral">"EPSG:3035"</span>))||!(projection_opt[0].compare(<span class="stringliteral">"EPSG:3035"</span>))||projection_opt[0].find(<span class="stringliteral">"ETRS-LAEA"</span>)!=string::npos);</div>
-<div class="line"><a name="l00455"></a><span class="lineno">  455</span>   <span class="keywordflow">if</span>(forceEUgrid){</div>
-<div class="line"><a name="l00456"></a><span class="lineno">  456</span>     <span class="comment">//force to LAEA grid</span></div>
-<div class="line"><a name="l00457"></a><span class="lineno">  457</span>     minULX=floor(minULX);</div>
-<div class="line"><a name="l00458"></a><span class="lineno">  458</span>     minULX-=<span class="keyword">static_cast<</span><span class="keywordtype">int</span><span class="keyword">></span>(minULX)%(static_cast<int>(dx));</div>
-<div class="line"><a name="l00459"></a><span class="lineno">  459</span>     maxULY=ceil(maxULY);</div>
-<div class="line"><a name="l00460"></a><span class="lineno">  460</span>     <span class="keywordflow">if</span>(static_cast<int>(maxULY)%static_cast<int>(dy))</div>
-<div class="line"><a name="l00461"></a><span class="lineno">  461</span>       maxULY+=dy;</div>
-<div class="line"><a name="l00462"></a><span class="lineno">  462</span>     maxULY-=<span class="keyword">static_cast<</span><span class="keywordtype">int</span><span class="keyword">></span>(maxULY)%(static_cast<int>(dy));</div>
-<div class="line"><a name="l00463"></a><span class="lineno">  463</span>     maxLRX=ceil(maxLRX);</div>
-<div class="line"><a name="l00464"></a><span class="lineno">  464</span>     <span class="keywordflow">if</span>(static_cast<int>(maxLRX)%static_cast<int>(dx))</div>
-<div class="line"><a name="l00465"></a><span class="lineno">  465</span>       maxLRX+=dx;</div>
-<div class="line"><a name="l00466"></a><span class="lineno">  466</span>     maxLRX-=<span class="keyword">static_cast<</span><span class="keywordtype">int</span><span class="keyword">></span>(maxLRX)%(static_cast<int>(dx));</div>
-<div class="line"><a name="l00467"></a><span class="lineno">  467</span>     minLRY=floor(minLRY);</div>
-<div class="line"><a name="l00468"></a><span class="lineno">  468</span>     minLRY-=<span class="keyword">static_cast<</span><span class="keywordtype">int</span><span class="keyword">></span>(minLRY)%(static_cast<int>(dy));</div>
-<div class="line"><a name="l00469"></a><span class="lineno">  469</span>   }</div>
-<div class="line"><a name="l00470"></a><span class="lineno">  470</span> </div>
-<div class="line"><a name="l00471"></a><span class="lineno">  471</span>   <span class="keywordflow">if</span>(verbose_opt[0])</div>
-<div class="line"><a name="l00472"></a><span class="lineno">  472</span>     cout << <span class="stringliteral">"bounding box composite image (ULX ULY LRX LRY): "</span> << fixed << setprecision(6) << minULX << <span class="stringliteral">" "</span> << maxULY << <span class="stringliteral">" "</span> << maxLRX << <span class="stringliteral">" "</span> << minLRY << endl;</div>
-<div class="line"><a name="l00473"></a><span class="lineno">  473</span>   <span class="comment">//initialize image</span></div>
-<div class="line"><a name="l00474"></a><span class="lineno">  474</span>   <span class="keywordflow">if</span>(verbose_opt[0])</div>
-<div class="line"><a name="l00475"></a><span class="lineno">  475</span>     cout << <span class="stringliteral">"initializing composite image..."</span> << endl;</div>
-<div class="line"><a name="l00476"></a><span class="lineno">  476</span> <span class="comment">//   double dcol=(maxLRX-minULX+dx-1)/dx;</span></div>
-<div class="line"><a name="l00477"></a><span class="lineno">  477</span> <span class="comment">//   double drow=(maxULY-minLRY+dy-1)/dy;</span></div>
-<div class="line"><a name="l00478"></a><span class="lineno">  478</span> <span class="comment">//   int ncol=static_cast<int>(dcol);</span></div>
-<div class="line"><a name="l00479"></a><span class="lineno">  479</span> <span class="comment">//   int nrow=static_cast<int>(drow);</span></div>
-<div class="line"><a name="l00480"></a><span class="lineno">  480</span> </div>
-<div class="line"><a name="l00481"></a><span class="lineno">  481</span>   <span class="keywordtype">int</span> ncol=ceil((maxLRX-minULX)/dx);</div>
-<div class="line"><a name="l00482"></a><span class="lineno">  482</span>   <span class="keywordtype">int</span> nrow=ceil((maxULY-minLRY)/dy);</div>
-<div class="line"><a name="l00483"></a><span class="lineno">  483</span> </div>
-<div class="line"><a name="l00484"></a><span class="lineno">  484</span>   <span class="keywordflow">if</span>(verbose_opt[0])</div>
-<div class="line"><a name="l00485"></a><span class="lineno">  485</span>     cout << <span class="stringliteral">"composite image dim (nrow x ncol): "</span> << nrow << <span class="stringliteral">" x "</span> << ncol << endl;</div>
-<div class="line"><a name="l00486"></a><span class="lineno">  486</span>   <a class="code" href="classImgWriterGdal.html">ImgWriterGdal</a> imgWriter;</div>
-<div class="line"><a name="l00487"></a><span class="lineno">  487</span>   <span class="keywordflow">while</span>(weight_opt.size()<input_opt.size())</div>
-<div class="line"><a name="l00488"></a><span class="lineno">  488</span>     weight_opt.push_back(weight_opt[0]);</div>
-<div class="line"><a name="l00489"></a><span class="lineno">  489</span>   <span class="keywordflow">if</span>(verbose_opt[0]){</div>
-<div class="line"><a name="l00490"></a><span class="lineno">  490</span>     std::cout << weight_opt << std::endl;</div>
-<div class="line"><a name="l00491"></a><span class="lineno">  491</span>   }</div>
-<div class="line"><a name="l00492"></a><span class="lineno">  492</span>   <span class="keywordflow">if</span>(cruleMap[crule_opt[0]]==crule::mode){</div>
-<div class="line"><a name="l00493"></a><span class="lineno">  493</span>     nwriteBand=(file_opt[0])? class_opt.size()+1:class_opt.size();</div>
-<div class="line"><a name="l00494"></a><span class="lineno">  494</span>   }</div>
-<div class="line"><a name="l00495"></a><span class="lineno">  495</span>   <span class="keywordflow">else</span></div>
-<div class="line"><a name="l00496"></a><span class="lineno">  496</span>     nwriteBand=(file_opt[0])? bands.size()+1:bands.size();</div>
-<div class="line"><a name="l00497"></a><span class="lineno">  497</span>   <span class="keywordflow">if</span>(output_opt.empty()){</div>
-<div class="line"><a name="l00498"></a><span class="lineno">  498</span>     std::cerr << <span class="stringliteral">"No output file provided (use option -o). Use --help for help information"</span> << std::endl;</div>
-<div class="line"><a name="l00499"></a><span class="lineno">  499</span>     exit(0);</div>
-<div class="line"><a name="l00500"></a><span class="lineno">  500</span>   }</div>
-<div class="line"><a name="l00501"></a><span class="lineno">  501</span>   <span class="keywordflow">if</span>(verbose_opt[0])</div>
-<div class="line"><a name="l00502"></a><span class="lineno">  502</span>     cout << <span class="stringliteral">"open output image "</span> << output_opt[0] << <span class="stringliteral">" with "</span> << nwriteBand << <span class="stringliteral">" bands"</span> << endl << flush;</div>
-<div class="line"><a name="l00503"></a><span class="lineno">  503</span>   <span class="keywordflow">try</span>{</div>
-<div class="line"><a name="l00504"></a><span class="lineno">  504</span>     imgWriter.open(output_opt[0],ncol,nrow,nwriteBand,theType,imageType,option_opt);</div>
-<div class="line"><a name="l00505"></a><span class="lineno">  505</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iband=0;iband<nwriteBand;++iband)</div>
-<div class="line"><a name="l00506"></a><span class="lineno">  506</span>       imgWriter.GDALSetNoDataValue(dstnodata_opt[0],iband);</div>
+<div class="line"><a name="l00320"></a><span class="lineno">  320</span>   <span class="keywordtype">double</span> dx=0;</div>
+<div class="line"><a name="l00321"></a><span class="lineno">  321</span>   <span class="keywordtype">double</span> dy=0;</div>
+<div class="line"><a name="l00322"></a><span class="lineno">  322</span>   <span class="comment">//get bounding box from extentReader if defined</span></div>
+<div class="line"><a name="l00323"></a><span class="lineno">  323</span>   <a class="code" href="classImgReaderOgr.html">ImgReaderOgr</a> extentReader;</div>
+<div class="line"><a name="l00324"></a><span class="lineno">  324</span>   <span class="keywordflow">if</span>(extent_opt.size()){</div>
+<div class="line"><a name="l00325"></a><span class="lineno">  325</span>     <span class="keywordtype">double</span> e_ulx;</div>
+<div class="line"><a name="l00326"></a><span class="lineno">  326</span>     <span class="keywordtype">double</span> e_uly;</div>
+<div class="line"><a name="l00327"></a><span class="lineno">  327</span>     <span class="keywordtype">double</span> e_lrx;</div>
+<div class="line"><a name="l00328"></a><span class="lineno">  328</span>     <span class="keywordtype">double</span> e_lry;</div>
+<div class="line"><a name="l00329"></a><span class="lineno">  329</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iextent=0;iextent<extent_opt.size();++iextent){</div>
+<div class="line"><a name="l00330"></a><span class="lineno">  330</span>       extentReader.open(extent_opt[iextent]);</div>
+<div class="line"><a name="l00331"></a><span class="lineno">  331</span>       <span class="keywordflow">if</span>(!(extentReader.getExtent(e_ulx,e_uly,e_lrx,e_lry))){</div>
+<div class="line"><a name="l00332"></a><span class="lineno">  332</span>         cerr << <span class="stringliteral">"Error: could not get extent from "</span> << extent_opt[0] << endl;</div>
+<div class="line"><a name="l00333"></a><span class="lineno">  333</span>         exit(1);</div>
+<div class="line"><a name="l00334"></a><span class="lineno">  334</span>       }</div>
+<div class="line"><a name="l00335"></a><span class="lineno">  335</span>       <span class="keywordflow">if</span>(!iextent){</div>
+<div class="line"><a name="l00336"></a><span class="lineno">  336</span>     ulx_opt[0]=e_ulx;</div>
+<div class="line"><a name="l00337"></a><span class="lineno">  337</span>     uly_opt[0]=e_uly;</div>
+<div class="line"><a name="l00338"></a><span class="lineno">  338</span>     lrx_opt[0]=e_lrx;</div>
+<div class="line"><a name="l00339"></a><span class="lineno">  339</span>     lry_opt[0]=e_lry;</div>
+<div class="line"><a name="l00340"></a><span class="lineno">  340</span>       }</div>
+<div class="line"><a name="l00341"></a><span class="lineno">  341</span>       <span class="keywordflow">else</span>{</div>
+<div class="line"><a name="l00342"></a><span class="lineno">  342</span>     <span class="keywordflow">if</span>(e_ulx<ulx_opt[0])</div>
+<div class="line"><a name="l00343"></a><span class="lineno">  343</span>       ulx_opt[0]=e_ulx;</div>
+<div class="line"><a name="l00344"></a><span class="lineno">  344</span>     <span class="keywordflow">if</span>(e_uly>uly_opt[0])</div>
+<div class="line"><a name="l00345"></a><span class="lineno">  345</span>       uly_opt[0]=e_uly;</div>
+<div class="line"><a name="l00346"></a><span class="lineno">  346</span>     <span class="keywordflow">if</span>(e_lrx>lrx_opt[0])</div>
+<div class="line"><a name="l00347"></a><span class="lineno">  347</span>       lrx_opt[0]=e_lrx;</div>
+<div class="line"><a name="l00348"></a><span class="lineno">  348</span>     <span class="keywordflow">if</span>(e_lry<lry_opt[0])</div>
+<div class="line"><a name="l00349"></a><span class="lineno">  349</span>       lry_opt[0]=e_lry;</div>
+<div class="line"><a name="l00350"></a><span class="lineno">  350</span>       }</div>
+<div class="line"><a name="l00351"></a><span class="lineno">  351</span>       extentReader.close();</div>
+<div class="line"><a name="l00352"></a><span class="lineno">  352</span>     }</div>
+<div class="line"><a name="l00353"></a><span class="lineno">  353</span>     <span class="keywordflow">if</span>(cut_opt.size())</div>
+<div class="line"><a name="l00354"></a><span class="lineno">  354</span>       extentReader.open(extent_opt[0]);</div>
+<div class="line"><a name="l00355"></a><span class="lineno">  355</span>   }</div>
+<div class="line"><a name="l00356"></a><span class="lineno">  356</span> </div>
+<div class="line"><a name="l00357"></a><span class="lineno">  357</span>   <span class="keywordflow">if</span>(verbose_opt[0])</div>
+<div class="line"><a name="l00358"></a><span class="lineno">  358</span>     cout << <span class="stringliteral">"--ulx="</span> << ulx_opt[0] << <span class="stringliteral">" --uly="</span> << uly_opt[0] << <span class="stringliteral">" --lrx="</span> << lrx_opt[0] << <span class="stringliteral">" --lry="</span> << lry_opt[0] << endl;</div>
+<div class="line"><a name="l00359"></a><span class="lineno">  359</span> </div>
+<div class="line"><a name="l00360"></a><span class="lineno">  360</span>   vector<ImgReaderGdal> imgReader(input_opt.size());</div>
+<div class="line"><a name="l00361"></a><span class="lineno">  361</span>   <span class="keywordtype">string</span> theProjection=<span class="stringliteral">""</span>;</div>
+<div class="line"><a name="l00362"></a><span class="lineno">  362</span>   GDALColorTable* theColorTable=NULL;</div>
+<div class="line"><a name="l00363"></a><span class="lineno">  363</span>   <span class="keywordtype">string</span> imageType;</div>
+<div class="line"><a name="l00364"></a><span class="lineno">  364</span>   <span class="keywordtype">bool</span> init=<span class="keyword">false</span>;</div>
+<div class="line"><a name="l00365"></a><span class="lineno">  365</span>   <span class="keywordflow">for</span>(<span class="keywordtype">int</span> ifile=0;ifile<input_opt.size();++ifile){</div>
+<div class="line"><a name="l00366"></a><span class="lineno">  366</span>     <span class="keywordflow">try</span>{</div>
+<div class="line"><a name="l00367"></a><span class="lineno">  367</span>       imgReader[ifile].open(input_opt[ifile]);</div>
+<div class="line"><a name="l00368"></a><span class="lineno">  368</span>     }</div>
+<div class="line"><a name="l00369"></a><span class="lineno">  369</span>     <span class="keywordflow">catch</span>(<span class="keywordtype">string</span> errorstring){</div>
+<div class="line"><a name="l00370"></a><span class="lineno">  370</span>       cerr << errorstring << <span class="stringliteral">" "</span> << input_opt[ifile] << endl;</div>
+<div class="line"><a name="l00371"></a><span class="lineno">  371</span>     }</div>
+<div class="line"><a name="l00372"></a><span class="lineno">  372</span> </div>
+<div class="line"><a name="l00373"></a><span class="lineno">  373</span>     <span class="comment">//todo: must be in init part only?</span></div>
+<div class="line"><a name="l00374"></a><span class="lineno">  374</span>     <span class="keywordflow">if</span>(colorTable_opt.empty())</div>
+<div class="line"><a name="l00375"></a><span class="lineno">  375</span>       <span class="keywordflow">if</span>(imgReader[ifile].getColorTable())</div>
+<div class="line"><a name="l00376"></a><span class="lineno">  376</span>     theColorTable=(imgReader[ifile].getColorTable()->Clone());</div>
+<div class="line"><a name="l00377"></a><span class="lineno">  377</span>     <span class="keywordflow">if</span>(projection_opt.empty())</div>
+<div class="line"><a name="l00378"></a><span class="lineno">  378</span>       theProjection=imgReader[ifile].getProjection();</div>
+<div class="line"><a name="l00379"></a><span class="lineno">  379</span>     <span class="keywordflow">if</span>(option_opt.findSubstring(<span class="stringliteral">"INTERLEAVE="</span>)==option_opt.end()){</div>
+<div class="line"><a name="l00380"></a><span class="lineno">  380</span>       <span class="keywordtype">string</span> theInterleave=<span class="stringliteral">"INTERLEAVE="</span>;</div>
+<div class="line"><a name="l00381"></a><span class="lineno">  381</span>       theInterleave+=imgReader[ifile].getInterleave();</div>
+<div class="line"><a name="l00382"></a><span class="lineno">  382</span>       option_opt.push_back(theInterleave);</div>
+<div class="line"><a name="l00383"></a><span class="lineno">  383</span>     }</div>
+<div class="line"><a name="l00384"></a><span class="lineno">  384</span> </div>
+<div class="line"><a name="l00385"></a><span class="lineno">  385</span>     <span class="keywordflow">if</span>((ulx_opt[0]||uly_opt[0]||lrx_opt[0]||lry_opt[0])&&(!imgReader[ifile].covers(ulx_opt[0],uly_opt[0],lrx_opt[0],lry_opt[0]))){</div>
+<div class="line"><a name="l00386"></a><span class="lineno">  386</span>       <span class="keywordflow">if</span>(verbose_opt[0])</div>
+<div class="line"><a name="l00387"></a><span class="lineno">  387</span>     cout << input_opt[ifile] << <span class="stringliteral">" not within bounding box, skipping..."</span> << endl;</div>
+<div class="line"><a name="l00388"></a><span class="lineno">  388</span>       <span class="comment">// imgReader.close();</span></div>
+<div class="line"><a name="l00389"></a><span class="lineno">  389</span>       <span class="keywordflow">continue</span>;</div>
+<div class="line"><a name="l00390"></a><span class="lineno">  390</span>     }</div>
+<div class="line"><a name="l00391"></a><span class="lineno">  391</span>     <span class="keywordtype">double</span> theULX, theULY, theLRX, theLRY;</div>
+<div class="line"><a name="l00392"></a><span class="lineno">  392</span>     imgReader[ifile].getBoundingBox(theULX,theULY,theLRX,theLRY);</div>
+<div class="line"><a name="l00393"></a><span class="lineno">  393</span>     <span class="keywordflow">if</span>(theLRY>theULY){</div>
+<div class="line"><a name="l00394"></a><span class="lineno">  394</span>       cerr << <span class="stringliteral">"Error: "</span> << input_opt[ifile] << <span class="stringliteral">" is not georeferenced, only referenced images are supported for pkcomposite "</span> << endl;</div>
+<div class="line"><a name="l00395"></a><span class="lineno">  395</span>       exit(1);</div>
+<div class="line"><a name="l00396"></a><span class="lineno">  396</span>     }</div>
+<div class="line"><a name="l00397"></a><span class="lineno">  397</span>     <span class="keywordflow">if</span>(verbose_opt[0])</div>
+<div class="line"><a name="l00398"></a><span class="lineno">  398</span>       cout << <span class="stringliteral">"Bounding Box (ULX ULY LRX LRY): "</span> << fixed << setprecision(6) << theULX << <span class="stringliteral">" "</span> << theULY << <span class="stringliteral">" "</span> << theLRX << <span class="stringliteral">" "</span> << theLRY << endl;</div>
+<div class="line"><a name="l00399"></a><span class="lineno">  399</span>     <span class="keywordflow">if</span>(!init){</div>
+<div class="line"><a name="l00400"></a><span class="lineno">  400</span>       <span class="keywordflow">if</span>(verbose_opt[0]){</div>
+<div class="line"><a name="l00401"></a><span class="lineno">  401</span>         <span class="keywordflow">switch</span>(cruleMap[crule_opt[0]]){</div>
+<div class="line"><a name="l00402"></a><span class="lineno">  402</span>         <span class="keywordflow">default</span>:</div>
+<div class="line"><a name="l00403"></a><span class="lineno">  403</span>         <span class="keywordflow">case</span>(crule::overwrite):</div>
+<div class="line"><a name="l00404"></a><span class="lineno">  404</span>           cout << <span class="stringliteral">"Composite rule: overwrite"</span> << endl;</div>
+<div class="line"><a name="l00405"></a><span class="lineno">  405</span>           <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l00406"></a><span class="lineno">  406</span>         <span class="keywordflow">case</span>(crule::maxndvi):</div>
+<div class="line"><a name="l00407"></a><span class="lineno">  407</span>           cout << <span class="stringliteral">"Composite rule: max ndvi"</span> << endl;</div>
+<div class="line"><a name="l00408"></a><span class="lineno">  408</span>           <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l00409"></a><span class="lineno">  409</span>         <span class="keywordflow">case</span>(crule::maxband):</div>
+<div class="line"><a name="l00410"></a><span class="lineno">  410</span>           cout << <span class="stringliteral">"Composite rule: max band"</span> << endl;</div>
+<div class="line"><a name="l00411"></a><span class="lineno">  411</span>           <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l00412"></a><span class="lineno">  412</span>         <span class="keywordflow">case</span>(crule::minband):</div>
+<div class="line"><a name="l00413"></a><span class="lineno">  413</span>           cout << <span class="stringliteral">"Composite rule: min band"</span> << endl;</div>
+<div class="line"><a name="l00414"></a><span class="lineno">  414</span>           <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l00415"></a><span class="lineno">  415</span>         <span class="keywordflow">case</span>(crule::validband):</div>
+<div class="line"><a name="l00416"></a><span class="lineno">  416</span>           cout << <span class="stringliteral">"Composite rule: valid band"</span> << endl;</div>
+<div class="line"><a name="l00417"></a><span class="lineno">  417</span>           <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l00418"></a><span class="lineno">  418</span>         <span class="keywordflow">case</span>(crule::mean):</div>
+<div class="line"><a name="l00419"></a><span class="lineno">  419</span>           cout << <span class="stringliteral">"Composite rule: mean value"</span> << endl;</div>
+<div class="line"><a name="l00420"></a><span class="lineno">  420</span>           <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l00421"></a><span class="lineno">  421</span>         <span class="keywordflow">case</span>(crule::mode):</div>
+<div class="line"><a name="l00422"></a><span class="lineno">  422</span>           cout << <span class="stringliteral">"Composite rule: max voting (only for byte images)"</span> << endl;</div>
+<div class="line"><a name="l00423"></a><span class="lineno">  423</span>           <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l00424"></a><span class="lineno">  424</span>         <span class="keywordflow">case</span>(crule::median):</div>
+<div class="line"><a name="l00425"></a><span class="lineno">  425</span>           cout << <span class="stringliteral">"Composite rule: median"</span> << endl;</div>
+<div class="line"><a name="l00426"></a><span class="lineno">  426</span>           <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l00427"></a><span class="lineno">  427</span>         <span class="keywordflow">case</span>(crule::stdev):</div>
+<div class="line"><a name="l00428"></a><span class="lineno">  428</span>           cout << <span class="stringliteral">"Composite rule: stdev"</span> << endl;</div>
+<div class="line"><a name="l00429"></a><span class="lineno">  429</span>           <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l00430"></a><span class="lineno">  430</span>         <span class="keywordflow">case</span>(crule::sum):</div>
+<div class="line"><a name="l00431"></a><span class="lineno">  431</span>           cout << <span class="stringliteral">"Composite rule: sum"</span> << endl;</div>
+<div class="line"><a name="l00432"></a><span class="lineno">  432</span>           <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l00433"></a><span class="lineno">  433</span>         <span class="keywordflow">case</span>(crule::minallbands):</div>
+<div class="line"><a name="l00434"></a><span class="lineno">  434</span>           cout << <span class="stringliteral">"Composite rule: minallbands"</span> << endl;</div>
+<div class="line"><a name="l00435"></a><span class="lineno">  435</span>           <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l00436"></a><span class="lineno">  436</span>         <span class="keywordflow">case</span>(crule::maxallbands):</div>
+<div class="line"><a name="l00437"></a><span class="lineno">  437</span>           cout << <span class="stringliteral">"Composite rule: maxallbands"</span> << endl;</div>
+<div class="line"><a name="l00438"></a><span class="lineno">  438</span>           <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l00439"></a><span class="lineno">  439</span>         }</div>
+<div class="line"><a name="l00440"></a><span class="lineno">  440</span>       }</div>
+<div class="line"><a name="l00441"></a><span class="lineno">  441</span>       <span class="keywordflow">if</span>(band_opt.size()){</div>
+<div class="line"><a name="l00442"></a><span class="lineno">  442</span>     nband=band_opt.size();</div>
+<div class="line"><a name="l00443"></a><span class="lineno">  443</span>         bands.resize(band_opt.size());</div>
+<div class="line"><a name="l00444"></a><span class="lineno">  444</span>         <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iband=0;iband<band_opt.size();++iband){</div>
+<div class="line"><a name="l00445"></a><span class="lineno">  445</span>           bands[iband]=band_opt[iband];</div>
+<div class="line"><a name="l00446"></a><span class="lineno">  446</span>           assert(bands[iband]<imgReader[ifile].nrOfBand());</div>
+<div class="line"><a name="l00447"></a><span class="lineno">  447</span>         }</div>
+<div class="line"><a name="l00448"></a><span class="lineno">  448</span>       }</div>
+<div class="line"><a name="l00449"></a><span class="lineno">  449</span>       <span class="keywordflow">else</span>{</div>
+<div class="line"><a name="l00450"></a><span class="lineno">  450</span>     nband=imgReader[ifile].nrOfBand();</div>
+<div class="line"><a name="l00451"></a><span class="lineno">  451</span>         bands.resize(nband);</div>
+<div class="line"><a name="l00452"></a><span class="lineno">  452</span>         <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iband=0;iband<nband;++iband)</div>
+<div class="line"><a name="l00453"></a><span class="lineno">  453</span>           bands[iband]=iband;</div>
+<div class="line"><a name="l00454"></a><span class="lineno">  454</span>       }</div>
+<div class="line"><a name="l00455"></a><span class="lineno">  455</span>       <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iband=0;iband<bndnodata_opt.size();++iband){</div>
+<div class="line"><a name="l00456"></a><span class="lineno">  456</span>         assert(bndnodata_opt[iband]>=0&&bndnodata_opt[iband]<nband);</div>
+<div class="line"><a name="l00457"></a><span class="lineno">  457</span>       }</div>
+<div class="line"><a name="l00458"></a><span class="lineno">  458</span>       <span class="comment">//if output type not set, get type from input image</span></div>
+<div class="line"><a name="l00459"></a><span class="lineno">  459</span>       <span class="keywordflow">if</span>(theType==GDT_Unknown){</div>
+<div class="line"><a name="l00460"></a><span class="lineno">  460</span>         theType=imgReader[ifile].getDataType();</div>
+<div class="line"><a name="l00461"></a><span class="lineno">  461</span>         <span class="keywordflow">if</span>(verbose_opt[0])</div>
+<div class="line"><a name="l00462"></a><span class="lineno">  462</span>           cout << <span class="stringliteral">"Using data type from input image: "</span> << GDALGetDataTypeName(theType) << endl;</div>
+<div class="line"><a name="l00463"></a><span class="lineno">  463</span>       }</div>
+<div class="line"><a name="l00464"></a><span class="lineno">  464</span> </div>
+<div class="line"><a name="l00465"></a><span class="lineno">  465</span>       <span class="keywordflow">if</span>(oformat_opt.size())<span class="comment">//default</span></div>
+<div class="line"><a name="l00466"></a><span class="lineno">  466</span>         imageType=oformat_opt[0];</div>
+<div class="line"><a name="l00467"></a><span class="lineno">  467</span>       <span class="keywordflow">else</span></div>
+<div class="line"><a name="l00468"></a><span class="lineno">  468</span>         imageType=imgReader[ifile].getImageType();</div>
+<div class="line"><a name="l00469"></a><span class="lineno">  469</span> </div>
+<div class="line"><a name="l00470"></a><span class="lineno">  470</span>       <span class="comment">// dataType=imgReader.getDataType(0);</span></div>
+<div class="line"><a name="l00471"></a><span class="lineno">  471</span>       <span class="keywordflow">if</span>(verbose_opt[0]){</div>
+<div class="line"><a name="l00472"></a><span class="lineno">  472</span>         cout << <span class="stringliteral">"type of data for "</span> << input_opt[ifile] << <span class="stringliteral">": "</span> << theType << endl;</div>
+<div class="line"><a name="l00473"></a><span class="lineno">  473</span>         cout << <span class="stringliteral">"nband: "</span> << nband << endl;</div>
+<div class="line"><a name="l00474"></a><span class="lineno">  474</span>       }</div>
+<div class="line"><a name="l00475"></a><span class="lineno">  475</span>       </div>
+<div class="line"><a name="l00476"></a><span class="lineno">  476</span>       maxLRX=theLRX;</div>
+<div class="line"><a name="l00477"></a><span class="lineno">  477</span>       maxULY=theULY;</div>
+<div class="line"><a name="l00478"></a><span class="lineno">  478</span>       minULX=theULX;</div>
+<div class="line"><a name="l00479"></a><span class="lineno">  479</span>       minLRY=theLRY;</div>
+<div class="line"><a name="l00480"></a><span class="lineno">  480</span>       <span class="keywordflow">if</span>(dx_opt.size())</div>
+<div class="line"><a name="l00481"></a><span class="lineno">  481</span>     dx=dx_opt[0];</div>
+<div class="line"><a name="l00482"></a><span class="lineno">  482</span>       <span class="keywordflow">else</span></div>
+<div class="line"><a name="l00483"></a><span class="lineno">  483</span>         dx=imgReader[ifile].getDeltaX();</div>
+<div class="line"><a name="l00484"></a><span class="lineno">  484</span>       <span class="keywordflow">if</span>(dy_opt.size())</div>
+<div class="line"><a name="l00485"></a><span class="lineno">  485</span>     dy=dy_opt[0];</div>
+<div class="line"><a name="l00486"></a><span class="lineno">  486</span>       <span class="keywordflow">else</span></div>
+<div class="line"><a name="l00487"></a><span class="lineno">  487</span>         dy=imgReader[ifile].getDeltaY();</div>
+<div class="line"><a name="l00488"></a><span class="lineno">  488</span>       <span class="comment">// imgReader.getMagicPixel(magic_x,magic_y);</span></div>
+<div class="line"><a name="l00489"></a><span class="lineno">  489</span>       init=<span class="keyword">true</span>;</div>
+<div class="line"><a name="l00490"></a><span class="lineno">  490</span>     }</div>
+<div class="line"><a name="l00491"></a><span class="lineno">  491</span>     <span class="keywordflow">else</span>{</div>
+<div class="line"><a name="l00492"></a><span class="lineno">  492</span>       <span class="comment">//convert bounding box to magic coordinates</span></div>
+<div class="line"><a name="l00493"></a><span class="lineno">  493</span>       <span class="comment">//check uniformity magic pixel</span></div>
+<div class="line"><a name="l00494"></a><span class="lineno">  494</span>       <span class="comment">// double test_x,test_y;</span></div>
+<div class="line"><a name="l00495"></a><span class="lineno">  495</span>       <span class="comment">// imgReader.getMagicPixel(test_x,test_y);</span></div>
+<div class="line"><a name="l00496"></a><span class="lineno">  496</span>       <span class="comment">// if(verbose_opt[0]){</span></div>
+<div class="line"><a name="l00497"></a><span class="lineno">  497</span>       <span class="comment">//   cout << "magic_x, magic_y: " << magic_x << ", " << magic_y << endl;</span></div>
+<div class="line"><a name="l00498"></a><span class="lineno">  498</span>       <span class="comment">// }</span></div>
+<div class="line"><a name="l00499"></a><span class="lineno">  499</span>       <span class="comment">// assert(magic_x==test_x);</span></div>
+<div class="line"><a name="l00500"></a><span class="lineno">  500</span>       <span class="comment">// assert(magic_y==test_y);</span></div>
+<div class="line"><a name="l00501"></a><span class="lineno">  501</span>       maxLRX=(theLRX>maxLRX)?theLRX:maxLRX;</div>
+<div class="line"><a name="l00502"></a><span class="lineno">  502</span>       maxULY=(theULY>maxULY)?theULY:maxULY;</div>
+<div class="line"><a name="l00503"></a><span class="lineno">  503</span>       minULX=(theULX<minULX)?theULX:minULX;</div>
+<div class="line"><a name="l00504"></a><span class="lineno">  504</span>       minLRY=(theLRY<minLRY)?theLRY:minLRY;</div>
+<div class="line"><a name="l00505"></a><span class="lineno">  505</span>     }</div>
+<div class="line"><a name="l00506"></a><span class="lineno">  506</span>     <span class="comment">// imgReader.close();</span></div>
 <div class="line"><a name="l00507"></a><span class="lineno">  507</span>   }</div>
-<div class="line"><a name="l00508"></a><span class="lineno">  508</span>   <span class="keywordflow">catch</span>(<span class="keywordtype">string</span> error){</div>
-<div class="line"><a name="l00509"></a><span class="lineno">  509</span>     cout << error << endl;</div>
-<div class="line"><a name="l00510"></a><span class="lineno">  510</span>   }</div>
-<div class="line"><a name="l00511"></a><span class="lineno">  511</span>   <span class="keywordflow">if</span>(description_opt.size())</div>
-<div class="line"><a name="l00512"></a><span class="lineno">  512</span>     imgWriter.setImageDescription(description_opt[0]);</div>
-<div class="line"><a name="l00513"></a><span class="lineno">  513</span>   <span class="keywordtype">double</span> gt[6];</div>
-<div class="line"><a name="l00514"></a><span class="lineno">  514</span>   gt[0]=minULX;</div>
-<div class="line"><a name="l00515"></a><span class="lineno">  515</span>   gt[1]=dx;</div>
-<div class="line"><a name="l00516"></a><span class="lineno">  516</span>   gt[2]=0;</div>
-<div class="line"><a name="l00517"></a><span class="lineno">  517</span>   gt[3]=maxULY;</div>
-<div class="line"><a name="l00518"></a><span class="lineno">  518</span>   gt[4]=0;</div>
-<div class="line"><a name="l00519"></a><span class="lineno">  519</span>   gt[5]=-dy;</div>
-<div class="line"><a name="l00520"></a><span class="lineno">  520</span>   imgWriter.setGeoTransform(gt);</div>
-<div class="line"><a name="l00521"></a><span class="lineno">  521</span>   <span class="comment">// imgWriter.setGeoTransform(minULX,maxULY,dx,dy,0,0);</span></div>
-<div class="line"><a name="l00522"></a><span class="lineno">  522</span>   <span class="keywordflow">if</span>(projection_opt.size()){</div>
-<div class="line"><a name="l00523"></a><span class="lineno">  523</span>     <span class="keywordflow">if</span>(verbose_opt[0])</div>
-<div class="line"><a name="l00524"></a><span class="lineno">  524</span>       cout << <span class="stringliteral">"projection: "</span> << projection_opt[0] << endl;</div>
-<div class="line"><a name="l00525"></a><span class="lineno">  525</span>     imgWriter.setProjectionProj4(projection_opt[0]);</div>
-<div class="line"><a name="l00526"></a><span class="lineno">  526</span>   }</div>
-<div class="line"><a name="l00527"></a><span class="lineno">  527</span>   <span class="keywordflow">else</span> <span class="keywordflow">if</span>(theProjection!=<span class="stringliteral">""</span>){</div>
-<div class="line"><a name="l00528"></a><span class="lineno">  528</span>     <span class="keywordflow">if</span>(verbose_opt[0])</div>
-<div class="line"><a name="l00529"></a><span class="lineno">  529</span>       cout << <span class="stringliteral">"projection: "</span> << theProjection << endl;</div>
-<div class="line"><a name="l00530"></a><span class="lineno">  530</span>     imgWriter.setProjection(theProjection);</div>
-<div class="line"><a name="l00531"></a><span class="lineno">  531</span>   }</div>
-<div class="line"><a name="l00532"></a><span class="lineno">  532</span>   <span class="keywordflow">if</span>(imgWriter.getDataType()==GDT_Byte){</div>
-<div class="line"><a name="l00533"></a><span class="lineno">  533</span>     <span class="keywordflow">if</span>(colorTable_opt.size()){</div>
-<div class="line"><a name="l00534"></a><span class="lineno">  534</span>       <span class="keywordflow">if</span>(colorTable_opt[0]!=<span class="stringliteral">"none"</span>)</div>
-<div class="line"><a name="l00535"></a><span class="lineno">  535</span>     imgWriter.setColorTable(colorTable_opt[0]);</div>
-<div class="line"><a name="l00536"></a><span class="lineno">  536</span>     }</div>
-<div class="line"><a name="l00537"></a><span class="lineno">  537</span>     <span class="keywordflow">else</span> <span class="keywordflow">if</span>(theColorTable)</div>
-<div class="line"><a name="l00538"></a><span class="lineno">  538</span>       imgWriter.setColorTable(theColorTable);</div>
-<div class="line"><a name="l00539"></a><span class="lineno">  539</span>   }</div>
-<div class="line"><a name="l00540"></a><span class="lineno">  540</span>   <span class="comment">//create composite image</span></div>
-<div class="line"><a name="l00541"></a><span class="lineno">  541</span>   <span class="keywordflow">if</span>(verbose_opt[0])</div>
-<div class="line"><a name="l00542"></a><span class="lineno">  542</span>      cout << <span class="stringliteral">"creating composite image"</span> << endl;</div>
-<div class="line"><a name="l00543"></a><span class="lineno">  543</span>   <a class="code" href="classVector2d.html">Vector2d<double></a> writeBuffer(nband,imgWriter.nrOfCol());</div>
-<div class="line"><a name="l00544"></a><span class="lineno">  544</span>   vector<short> fileBuffer(ncol);<span class="comment">//holds the number of used files</span></div>
-<div class="line"><a name="l00545"></a><span class="lineno">  545</span>   <a class="code" href="classVector2d.html">Vector2d<short></a> maxBuffer;<span class="comment">//buffer used for maximum voting</span></div>
-<div class="line"><a name="l00546"></a><span class="lineno">  546</span>   <a class="code" href="classVector2d.html">Vector2d<double></a> readBuffer(nband);</div>
-<div class="line"><a name="l00547"></a><span class="lineno">  547</span>   <a class="code" href="classstatfactory_1_1StatFactory.html">statfactory::StatFactory</a> stat;</div>
-<div class="line"><a name="l00548"></a><span class="lineno">  548</span>   <span class="keywordflow">if</span>(cruleMap[crule_opt[0]]==crule::maxndvi)<span class="comment">//ndvi</span></div>
-<div class="line"><a name="l00549"></a><span class="lineno">  549</span>     assert(ruleBand_opt.size()==2);</div>
-<div class="line"><a name="l00550"></a><span class="lineno">  550</span>   <span class="keywordflow">if</span>(cruleMap[crule_opt[0]]==crule::mode){<span class="comment">//max voting</span></div>
-<div class="line"><a name="l00551"></a><span class="lineno">  551</span>     maxBuffer.resize(imgWriter.nrOfCol(),256);<span class="comment">//use only byte images for max voting</span></div>
-<div class="line"><a name="l00552"></a><span class="lineno">  552</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iclass=0;iclass<class_opt.size();++iclass)</div>
-<div class="line"><a name="l00553"></a><span class="lineno">  553</span>       assert(class_opt[iclass]<maxBuffer.size());</div>
-<div class="line"><a name="l00554"></a><span class="lineno">  554</span>   }</div>
-<div class="line"><a name="l00555"></a><span class="lineno">  555</span>   <span class="keywordtype">int</span> jb=0;</div>
-<div class="line"><a name="l00556"></a><span class="lineno">  556</span>   <span class="keywordtype">double</span> readRow=0;</div>
-<div class="line"><a name="l00557"></a><span class="lineno">  557</span>   <span class="keywordtype">double</span> readCol=0;</div>
-<div class="line"><a name="l00558"></a><span class="lineno">  558</span>   <span class="keywordtype">double</span> lowerCol=0;</div>
-<div class="line"><a name="l00559"></a><span class="lineno">  559</span>   <span class="keywordtype">double</span> upperCol=0;</div>
-<div class="line"><a name="l00560"></a><span class="lineno">  560</span>   <span class="keyword">const</span> <span class="keywordtype">char</span>* pszMessage;</div>
-<div class="line"><a name="l00561"></a><span class="lineno">  561</span>   <span class="keywordtype">void</span>* pProgressArg=NULL;</div>
-<div class="line"><a name="l00562"></a><span class="lineno">  562</span>   GDALProgressFunc pfnProgress=GDALTermProgress;</div>
-<div class="line"><a name="l00563"></a><span class="lineno">  563</span>   <span class="keywordtype">double</span> progress=0;</div>
-<div class="line"><a name="l00564"></a><span class="lineno">  564</span>   pfnProgress(progress,pszMessage,pProgressArg);</div>
-<div class="line"><a name="l00565"></a><span class="lineno">  565</span>   <span class="keywordflow">for</span>(<span class="keywordtype">int</span> irow=0;irow<imgWriter.nrOfRow();++irow){</div>
-<div class="line"><a name="l00566"></a><span class="lineno">  566</span>     <a class="code" href="classVector2d.html">Vector2d< vector<double></a> > storeBuffer;</div>
-<div class="line"><a name="l00567"></a><span class="lineno">  567</span>     vector<bool> writeValid(ncol);</div>
-<div class="line"><a name="l00568"></a><span class="lineno">  568</span> </div>
-<div class="line"><a name="l00569"></a><span class="lineno">  569</span>     <span class="keywordflow">if</span>(cruleMap[crule_opt[0]]==crule::mean ||</div>
-<div class="line"><a name="l00570"></a><span class="lineno">  570</span>        cruleMap[crule_opt[0]]==crule::median ||</div>
-<div class="line"><a name="l00571"></a><span class="lineno">  571</span>        cruleMap[crule_opt[0]]==crule::sum ||</div>
-<div class="line"><a name="l00572"></a><span class="lineno">  572</span>        cruleMap[crule_opt[0]]==crule::minallbands ||</div>
-<div class="line"><a name="l00573"></a><span class="lineno">  573</span>        cruleMap[crule_opt[0]]==crule::maxallbands ||</div>
-<div class="line"><a name="l00574"></a><span class="lineno">  574</span>        cruleMap[crule_opt[0]]==crule::stdev)</div>
-<div class="line"><a name="l00575"></a><span class="lineno">  575</span>       storeBuffer.resize(nband,ncol);</div>
-<div class="line"><a name="l00576"></a><span class="lineno">  576</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> icol=0;icol<imgWriter.nrOfCol();++icol){</div>
-<div class="line"><a name="l00577"></a><span class="lineno">  577</span>       writeValid[icol]=<span class="keyword">false</span>;</div>
-<div class="line"><a name="l00578"></a><span class="lineno">  578</span>       fileBuffer[icol]=0;</div>
-<div class="line"><a name="l00579"></a><span class="lineno">  579</span>       <span class="keywordflow">if</span>(cruleMap[crule_opt[0]]==crule::mode){<span class="comment">//max voting</span></div>
-<div class="line"><a name="l00580"></a><span class="lineno">  580</span>         <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iclass=0;iclass<256;++iclass)</div>
-<div class="line"><a name="l00581"></a><span class="lineno">  581</span>           maxBuffer[icol][iclass]=0;</div>
-<div class="line"><a name="l00582"></a><span class="lineno">  582</span>       }</div>
-<div class="line"><a name="l00583"></a><span class="lineno">  583</span>       <span class="keywordflow">else</span>{</div>
-<div class="line"><a name="l00584"></a><span class="lineno">  584</span>         <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iband=0;iband<nband;++iband)</div>
-<div class="line"><a name="l00585"></a><span class="lineno">  585</span>           writeBuffer[iband][icol]=dstnodata_opt[0];</div>
-<div class="line"><a name="l00586"></a><span class="lineno">  586</span>       }</div>
-<div class="line"><a name="l00587"></a><span class="lineno">  587</span>     }</div>
-<div class="line"><a name="l00588"></a><span class="lineno">  588</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> ifile=0;ifile<input_opt.size();++ifile){</div>
-<div class="line"><a name="l00589"></a><span class="lineno">  589</span>       <span class="keywordflow">try</span>{</div>
-<div class="line"><a name="l00590"></a><span class="lineno">  590</span>         imgReader.open(input_opt[ifile]);</div>
-<div class="line"><a name="l00591"></a><span class="lineno">  591</span>       }</div>
-<div class="line"><a name="l00592"></a><span class="lineno">  592</span>       <span class="keywordflow">catch</span>(<span class="keywordtype">string</span> error){</div>
-<div class="line"><a name="l00593"></a><span class="lineno">  593</span>         cout << error << endl;</div>
-<div class="line"><a name="l00594"></a><span class="lineno">  594</span>       }</div>
-<div class="line"><a name="l00595"></a><span class="lineno">  595</span>       <span class="comment">// assert(imgReader.getDataType()==theType);</span></div>
-<div class="line"><a name="l00596"></a><span class="lineno">  596</span>       assert(imgReader.nrOfBand()>=nband);</div>
-<div class="line"><a name="l00597"></a><span class="lineno">  597</span>       <span class="keywordflow">if</span>(!imgReader.covers(minULX,maxULY,maxLRX,minLRY)){</div>
-<div class="line"><a name="l00598"></a><span class="lineno">  598</span>         imgReader.close();</div>
-<div class="line"><a name="l00599"></a><span class="lineno">  599</span>         <span class="keywordflow">continue</span>;</div>
-<div class="line"><a name="l00600"></a><span class="lineno">  600</span>       }</div>
-<div class="line"><a name="l00601"></a><span class="lineno">  601</span>       <span class="keywordtype">double</span> uli,ulj,lri,lrj;</div>
-<div class="line"><a name="l00602"></a><span class="lineno">  602</span>       imgReader.geo2image(minULX+(magic_x-1.0)*imgReader.getDeltaX(),maxULY-(magic_y-1.0)*imgReader.getDeltaY(),uli,ulj);</div>
-<div class="line"><a name="l00603"></a><span class="lineno">  603</span>       imgReader.geo2image(maxLRX+(magic_x-2.0)*imgReader.getDeltaX(),minLRY-(magic_y-2.0)*imgReader.getDeltaY(),lri,lrj);</div>
-<div class="line"><a name="l00604"></a><span class="lineno">  604</span>       uli=floor(uli);</div>
-<div class="line"><a name="l00605"></a><span class="lineno">  605</span>       ulj=floor(ulj);</div>
-<div class="line"><a name="l00606"></a><span class="lineno">  606</span>       lri=floor(lri);</div>
-<div class="line"><a name="l00607"></a><span class="lineno">  607</span>       lrj=floor(lrj);</div>
-<div class="line"><a name="l00608"></a><span class="lineno">  608</span>         </div>
-<div class="line"><a name="l00609"></a><span class="lineno">  609</span>       <span class="keywordtype">double</span> startCol=uli;</div>
-<div class="line"><a name="l00610"></a><span class="lineno">  610</span>       <span class="keywordtype">double</span> endCol=lri;</div>
-<div class="line"><a name="l00611"></a><span class="lineno">  611</span>       <span class="keywordflow">if</span>(uli<0)</div>
-<div class="line"><a name="l00612"></a><span class="lineno">  612</span>         startCol=0;</div>
-<div class="line"><a name="l00613"></a><span class="lineno">  613</span>       <span class="keywordflow">else</span> <span class="keywordflow">if</span>(uli>=imgReader.nrOfCol())</div>
-<div class="line"><a name="l00614"></a><span class="lineno">  614</span>         startCol=imgReader.nrOfCol()-1;</div>
-<div class="line"><a name="l00615"></a><span class="lineno">  615</span>       <span class="keywordflow">if</span>(lri<0)</div>
-<div class="line"><a name="l00616"></a><span class="lineno">  616</span>         endCol=0;</div>
-<div class="line"><a name="l00617"></a><span class="lineno">  617</span>       <span class="keywordflow">else</span> <span class="keywordflow">if</span>(lri>=imgReader.nrOfCol())</div>
-<div class="line"><a name="l00618"></a><span class="lineno">  618</span>         endCol=imgReader.nrOfCol()-1;</div>
-<div class="line"><a name="l00619"></a><span class="lineno">  619</span>       <span class="keywordtype">int</span> readncol=endCol-startCol+1;</div>
-<div class="line"><a name="l00620"></a><span class="lineno">  620</span> </div>
-<div class="line"><a name="l00621"></a><span class="lineno">  621</span>       <span class="comment">//convert irow to geo</span></div>
-<div class="line"><a name="l00622"></a><span class="lineno">  622</span>       <span class="keywordtype">double</span> x=0;</div>
-<div class="line"><a name="l00623"></a><span class="lineno">  623</span>       <span class="keywordtype">double</span> y=0;</div>
-<div class="line"><a name="l00624"></a><span class="lineno">  624</span>       imgWriter.image2geo(0,irow,x,y);</div>
-<div class="line"><a name="l00625"></a><span class="lineno">  625</span>       <span class="comment">//lookup corresponding row for irow in this file</span></div>
-<div class="line"><a name="l00626"></a><span class="lineno">  626</span>       imgReader.geo2image(x,y,readCol,readRow);</div>
-<div class="line"><a name="l00627"></a><span class="lineno">  627</span>       <span class="keywordflow">if</span>(readRow<0||readRow>=imgReader.nrOfRow()){</div>
-<div class="line"><a name="l00628"></a><span class="lineno">  628</span>         imgReader.close();</div>
-<div class="line"><a name="l00629"></a><span class="lineno">  629</span>         <span class="keywordflow">continue</span>;</div>
-<div class="line"><a name="l00630"></a><span class="lineno">  630</span>       }</div>
-<div class="line"><a name="l00631"></a><span class="lineno">  631</span>       <span class="comment">// for(int iband=0;iband<imgReader.nrOfBand();++iband){</span></div>
-<div class="line"><a name="l00632"></a><span class="lineno">  632</span>       <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iband=0;iband<nband;++iband){</div>
-<div class="line"><a name="l00633"></a><span class="lineno">  633</span>     <span class="keywordtype">int</span> readBand=(band_opt.size()>iband)? band_opt[iband] : iband;</div>
-<div class="line"><a name="l00634"></a><span class="lineno">  634</span>         readBuffer[iband].resize(readncol);</div>
-<div class="line"><a name="l00635"></a><span class="lineno">  635</span>     <span class="keywordflow">try</span>{</div>
-<div class="line"><a name="l00636"></a><span class="lineno">  636</span>           imgReader.readData(readBuffer[iband],GDT_Float64,startCol,endCol,readRow,readBand,theResample);</div>
-<div class="line"><a name="l00637"></a><span class="lineno">  637</span>     }</div>
-<div class="line"><a name="l00638"></a><span class="lineno">  638</span>     <span class="keywordflow">catch</span>(<span class="keywordtype">string</span> error){</div>
-<div class="line"><a name="l00639"></a><span class="lineno">  639</span>       cerr << <span class="stringliteral">"error reading image "</span> << input_opt[ifile] << <span class="stringliteral">": "</span> << endl;</div>
-<div class="line"><a name="l00640"></a><span class="lineno">  640</span>       <span class="keywordflow">throw</span>;</div>
-<div class="line"><a name="l00641"></a><span class="lineno">  641</span>     }</div>
-<div class="line"><a name="l00642"></a><span class="lineno">  642</span>       }</div>
-<div class="line"><a name="l00643"></a><span class="lineno">  643</span>         </div>
-<div class="line"><a name="l00644"></a><span class="lineno">  644</span>       <span class="keywordflow">for</span>(<span class="keywordtype">int</span> ib=0;ib<ncol;++ib){</div>
-<div class="line"><a name="l00645"></a><span class="lineno">  645</span>         assert(imgWriter.image2geo(ib,irow,x,y));</div>
-<div class="line"><a name="l00646"></a><span class="lineno">  646</span>         <span class="comment">//lookup corresponding row for irow in this file</span></div>
-<div class="line"><a name="l00647"></a><span class="lineno">  647</span>         imgReader.geo2image(x,y,readCol,readRow);</div>
-<div class="line"><a name="l00648"></a><span class="lineno">  648</span>         <span class="keywordflow">if</span>(readCol<0||readCol>=imgReader.nrOfCol())</div>
-<div class="line"><a name="l00649"></a><span class="lineno">  649</span>           <span class="keywordflow">continue</span>;</div>
-<div class="line"><a name="l00650"></a><span class="lineno">  650</span>         <span class="keywordtype">double</span> val_current=0;</div>
-<div class="line"><a name="l00651"></a><span class="lineno">  651</span>         <span class="keywordtype">double</span> val_new=0;</div>
-<div class="line"><a name="l00652"></a><span class="lineno">  652</span>         <span class="keywordtype">bool</span> readValid=<span class="keyword">true</span>;</div>
-<div class="line"><a name="l00653"></a><span class="lineno">  653</span>         <span class="keywordflow">switch</span>(theResample){</div>
-<div class="line"><a name="l00654"></a><span class="lineno">  654</span>         <span class="keywordflow">case</span>(BILINEAR):</div>
-<div class="line"><a name="l00655"></a><span class="lineno">  655</span>           lowerCol=readCol-0.5;</div>
-<div class="line"><a name="l00656"></a><span class="lineno">  656</span>           lowerCol=<span class="keyword">static_cast<</span><span class="keywordtype">int</span><span class="keyword">></span>(lowerCol);</div>
-<div class="line"><a name="l00657"></a><span class="lineno">  657</span>           upperCol=readCol+0.5;</div>
-<div class="line"><a name="l00658"></a><span class="lineno">  658</span>           upperCol=<span class="keyword">static_cast<</span><span class="keywordtype">int</span><span class="keyword">></span>(upperCol);</div>
-<div class="line"><a name="l00659"></a><span class="lineno">  659</span>           <span class="keywordflow">if</span>(lowerCol<0)</div>
-<div class="line"><a name="l00660"></a><span class="lineno">  660</span>             lowerCol=0;</div>
-<div class="line"><a name="l00661"></a><span class="lineno">  661</span>           <span class="keywordflow">if</span>(upperCol>=imgReader.nrOfCol())</div>
-<div class="line"><a name="l00662"></a><span class="lineno">  662</span>             upperCol=imgReader.nrOfCol()-1;</div>
-<div class="line"><a name="l00663"></a><span class="lineno">  663</span>           <span class="keywordflow">for</span>(<span class="keywordtype">int</span> vband=0;vband<bndnodata_opt.size();++vband){</div>
-<div class="line"><a name="l00664"></a><span class="lineno">  664</span>             val_new=(readCol-0.5-lowerCol)*readBuffer[bndnodata_opt[vband]][upperCol-startCol]+(1-readCol+0.5+lowerCol)*readBuffer[bndnodata_opt[vband]][lowerCol-startCol];</div>
-<div class="line"><a name="l00665"></a><span class="lineno">  665</span>         <span class="keywordflow">if</span>(minValue_opt.size()>vband){</div>
-<div class="line"><a name="l00666"></a><span class="lineno">  666</span>           <span class="keywordflow">if</span>(val_new<=minValue_opt[vband]){</div>
-<div class="line"><a name="l00667"></a><span class="lineno">  667</span>         readValid=<span class="keyword">false</span>;</div>
-<div class="line"><a name="l00668"></a><span class="lineno">  668</span>         <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l00669"></a><span class="lineno">  669</span>           }</div>
-<div class="line"><a name="l00670"></a><span class="lineno">  670</span>         }</div>
-<div class="line"><a name="l00671"></a><span class="lineno">  671</span>         <span class="keywordflow">if</span>(maxValue_opt.size()>vband){</div>
-<div class="line"><a name="l00672"></a><span class="lineno">  672</span>           <span class="keywordflow">if</span>(val_new>=maxValue_opt[vband]){</div>
-<div class="line"><a name="l00673"></a><span class="lineno">  673</span>         readValid=<span class="keyword">false</span>;</div>
-<div class="line"><a name="l00674"></a><span class="lineno">  674</span>         <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l00675"></a><span class="lineno">  675</span>           }</div>
-<div class="line"><a name="l00676"></a><span class="lineno">  676</span>         }</div>
-<div class="line"><a name="l00677"></a><span class="lineno">  677</span>         <span class="keywordflow">if</span>(srcnodata_opt.size()>vband){</div>
-<div class="line"><a name="l00678"></a><span class="lineno">  678</span>           <span class="keywordflow">if</span>(val_new==srcnodata_opt[vband]){</div>
-<div class="line"><a name="l00679"></a><span class="lineno">  679</span>         readValid=<span class="keyword">false</span>;</div>
-<div class="line"><a name="l00680"></a><span class="lineno">  680</span>         <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l00681"></a><span class="lineno">  681</span>           }</div>
-<div class="line"><a name="l00682"></a><span class="lineno">  682</span>         }</div>
-<div class="line"><a name="l00683"></a><span class="lineno">  683</span>       }</div>
-<div class="line"><a name="l00684"></a><span class="lineno">  684</span>           <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l00685"></a><span class="lineno">  685</span>         <span class="keywordflow">default</span>:</div>
-<div class="line"><a name="l00686"></a><span class="lineno">  686</span>           readCol=<span class="keyword">static_cast<</span><span class="keywordtype">int</span><span class="keyword">></span>(readCol);</div>
-<div class="line"><a name="l00687"></a><span class="lineno">  687</span>           <span class="keywordflow">for</span>(<span class="keywordtype">int</span> vband=0;vband<bndnodata_opt.size();++vband){</div>
-<div class="line"><a name="l00688"></a><span class="lineno">  688</span>             val_new=readBuffer[bndnodata_opt[vband]][readCol-startCol];</div>
-<div class="line"><a name="l00689"></a><span class="lineno">  689</span>         <span class="keywordflow">if</span>(minValue_opt.size()>vband){</div>
-<div class="line"><a name="l00690"></a><span class="lineno">  690</span>           <span class="keywordflow">if</span>(val_new<=minValue_opt[vband]){</div>
-<div class="line"><a name="l00691"></a><span class="lineno">  691</span>         readValid=<span class="keyword">false</span>;</div>
-<div class="line"><a name="l00692"></a><span class="lineno">  692</span>         <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l00693"></a><span class="lineno">  693</span>           }</div>
-<div class="line"><a name="l00694"></a><span class="lineno">  694</span>         }</div>
-<div class="line"><a name="l00695"></a><span class="lineno">  695</span>         <span class="keywordflow">if</span>(maxValue_opt.size()>vband){</div>
-<div class="line"><a name="l00696"></a><span class="lineno">  696</span>           <span class="keywordflow">if</span>(val_new>=maxValue_opt[vband]){</div>
-<div class="line"><a name="l00697"></a><span class="lineno">  697</span>         readValid=<span class="keyword">false</span>;</div>
-<div class="line"><a name="l00698"></a><span class="lineno">  698</span>         <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l00699"></a><span class="lineno">  699</span>           }</div>
-<div class="line"><a name="l00700"></a><span class="lineno">  700</span>         }</div>
-<div class="line"><a name="l00701"></a><span class="lineno">  701</span>         <span class="keywordflow">if</span>(srcnodata_opt.size()>vband){</div>
-<div class="line"><a name="l00702"></a><span class="lineno">  702</span>           <span class="keywordflow">if</span>(val_new==srcnodata_opt[vband]){</div>
-<div class="line"><a name="l00703"></a><span class="lineno">  703</span>         readValid=<span class="keyword">false</span>;</div>
-<div class="line"><a name="l00704"></a><span class="lineno">  704</span>         <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l00705"></a><span class="lineno">  705</span>           }</div>
-<div class="line"><a name="l00706"></a><span class="lineno">  706</span>         }</div>
-<div class="line"><a name="l00707"></a><span class="lineno">  707</span>       }</div>
-<div class="line"><a name="l00708"></a><span class="lineno">  708</span>           <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l00709"></a><span class="lineno">  709</span>     }</div>
-<div class="line"><a name="l00710"></a><span class="lineno">  710</span>     <span class="keywordflow">if</span>(readValid){</div>
-<div class="line"><a name="l00711"></a><span class="lineno">  711</span>       <span class="keywordflow">if</span>(file_opt[0]==1)</div>
-<div class="line"><a name="l00712"></a><span class="lineno">  712</span>         ++fileBuffer[ib];</div>
-<div class="line"><a name="l00713"></a><span class="lineno">  713</span>           <span class="keywordflow">if</span>(writeValid[ib]){</div>
-<div class="line"><a name="l00714"></a><span class="lineno">  714</span>             <span class="keywordtype">int</span> iband=0;</div>
-<div class="line"><a name="l00715"></a><span class="lineno">  715</span>         <span class="keywordflow">switch</span>(cruleMap[crule_opt[0]]){</div>
-<div class="line"><a name="l00716"></a><span class="lineno">  716</span>         <span class="keywordflow">case</span>(crule::maxndvi):{<span class="comment">//max ndvi</span></div>
-<div class="line"><a name="l00717"></a><span class="lineno">  717</span>               <span class="keywordtype">double</span> red_current=writeBuffer[ruleBand_opt[0]][ib];</div>
-<div class="line"><a name="l00718"></a><span class="lineno">  718</span>               <span class="keywordtype">double</span> nir_current=writeBuffer[ruleBand_opt[1]][ib];</div>
-<div class="line"><a name="l00719"></a><span class="lineno">  719</span>           <span class="keywordtype">double</span> ndvi_current=0;</div>
-<div class="line"><a name="l00720"></a><span class="lineno">  720</span>               <span class="keywordflow">if</span>(red_current+nir_current>0&&red_current>=0&&nir_current>=0)</div>
-<div class="line"><a name="l00721"></a><span class="lineno">  721</span>                 ndvi_current=(nir_current-red_current)/(nir_current+red_current);</div>
-<div class="line"><a name="l00722"></a><span class="lineno">  722</span>           <span class="keywordtype">double</span> ndvi_new=0;</div>
-<div class="line"><a name="l00723"></a><span class="lineno">  723</span>               <span class="keywordtype">double</span> red_new=0;</div>
-<div class="line"><a name="l00724"></a><span class="lineno">  724</span>               <span class="keywordtype">double</span> nir_new=0;</div>
-<div class="line"><a name="l00725"></a><span class="lineno">  725</span>               <span class="keywordflow">switch</span>(theResample){</div>
-<div class="line"><a name="l00726"></a><span class="lineno">  726</span>               <span class="keywordflow">case</span>(BILINEAR):</div>
-<div class="line"><a name="l00727"></a><span class="lineno">  727</span>                 lowerCol=readCol-0.5;</div>
-<div class="line"><a name="l00728"></a><span class="lineno">  728</span>                 lowerCol=<span class="keyword">static_cast<</span><span class="keywordtype">int</span><span class="keyword">></span>(lowerCol);</div>
-<div class="line"><a name="l00729"></a><span class="lineno">  729</span>                 upperCol=readCol+0.5;</div>
-<div class="line"><a name="l00730"></a><span class="lineno">  730</span>                 upperCol=<span class="keyword">static_cast<</span><span class="keywordtype">int</span><span class="keyword">></span>(upperCol);</div>
-<div class="line"><a name="l00731"></a><span class="lineno">  731</span>                 <span class="keywordflow">if</span>(lowerCol<0)</div>
-<div class="line"><a name="l00732"></a><span class="lineno">  732</span>                   lowerCol=0;</div>
-<div class="line"><a name="l00733"></a><span class="lineno">  733</span>                 <span class="keywordflow">if</span>(upperCol>=imgReader.nrOfCol())</div>
-<div class="line"><a name="l00734"></a><span class="lineno">  734</span>                   upperCol=imgReader.nrOfCol()-1;</div>
-<div class="line"><a name="l00735"></a><span class="lineno">  735</span>                 red_new=(readCol-0.5-lowerCol)*readBuffer[ruleBand_opt[0]][upperCol-startCol]+(1-readCol+0.5+lowerCol)*readBuffer[ruleBand_opt[0]][lowerCol-startCol];</div>
-<div class="line"><a name="l00736"></a><span class="lineno">  736</span>                 nir_new=(readCol-0.5-lowerCol)*readBuffer[ruleBand_opt[1]][upperCol-startCol]+(1-readCol+0.5+lowerCol)*readBuffer[ruleBand_opt[1]][lowerCol-startCol];</div>
-<div class="line"><a name="l00737"></a><span class="lineno">  737</span>                 <span class="keywordflow">if</span>(red_new+nir_new>0&&red_new>=0&&nir_new>=0)</div>
-<div class="line"><a name="l00738"></a><span class="lineno">  738</span>                   ndvi_new=(nir_new-red_new)/(nir_new+red_new);</div>
-<div class="line"><a name="l00739"></a><span class="lineno">  739</span>                 <span class="keywordflow">if</span>(ndvi_new>=ndvi_current){</div>
-<div class="line"><a name="l00740"></a><span class="lineno">  740</span>                   <span class="keywordflow">for</span>(iband=0;iband<nband;++iband){</div>
-<div class="line"><a name="l00741"></a><span class="lineno">  741</span>                     val_new=(readCol-0.5-lowerCol)*readBuffer[iband][upperCol-startCol]+(1-readCol+0.5+lowerCol)*readBuffer[iband][lowerCol-startCol];</div>
-<div class="line"><a name="l00742"></a><span class="lineno">  742</span>                     writeBuffer[iband][ib]=val_new;</div>
-<div class="line"><a name="l00743"></a><span class="lineno">  743</span>                   }</div>
-<div class="line"><a name="l00744"></a><span class="lineno">  744</span>           <span class="keywordflow">if</span>(file_opt[0]>1)</div>
-<div class="line"><a name="l00745"></a><span class="lineno">  745</span>             fileBuffer[ib]=ifile;</div>
-<div class="line"><a name="l00746"></a><span class="lineno">  746</span>                 }</div>
-<div class="line"><a name="l00747"></a><span class="lineno">  747</span>                 <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l00748"></a><span class="lineno">  748</span>               <span class="keywordflow">default</span>:</div>
-<div class="line"><a name="l00749"></a><span class="lineno">  749</span>                 readCol=<span class="keyword">static_cast<</span><span class="keywordtype">int</span><span class="keyword">></span>(readCol);</div>
-<div class="line"><a name="l00750"></a><span class="lineno">  750</span>                 red_new=readBuffer[ruleBand_opt[0]][readCol-startCol];</div>
-<div class="line"><a name="l00751"></a><span class="lineno">  751</span>                 nir_new=readBuffer[ruleBand_opt[1]][readCol-startCol];</div>
-<div class="line"><a name="l00752"></a><span class="lineno">  752</span>                 <span class="keywordflow">if</span>(red_new+nir_new>0&&red_new>=0&&nir_new>=0)</div>
-<div class="line"><a name="l00753"></a><span class="lineno">  753</span>                   ndvi_new=(nir_new-red_new)/(nir_new+red_new);</div>
-<div class="line"><a name="l00754"></a><span class="lineno">  754</span>                 <span class="keywordflow">if</span>(ndvi_new>=ndvi_current){</div>
-<div class="line"><a name="l00755"></a><span class="lineno">  755</span>                   <span class="keywordflow">for</span>(iband=0;iband<nband;++iband){</div>
-<div class="line"><a name="l00756"></a><span class="lineno">  756</span>                     val_new=readBuffer[iband][readCol-startCol];</div>
-<div class="line"><a name="l00757"></a><span class="lineno">  757</span>                     writeBuffer[iband][ib]=val_new;</div>
-<div class="line"><a name="l00758"></a><span class="lineno">  758</span>                   }</div>
-<div class="line"><a name="l00759"></a><span class="lineno">  759</span>           <span class="keywordflow">if</span>(file_opt[0]>1)</div>
-<div class="line"><a name="l00760"></a><span class="lineno">  760</span>             fileBuffer[ib]=ifile;</div>
-<div class="line"><a name="l00761"></a><span class="lineno">  761</span>                 }</div>
-<div class="line"><a name="l00762"></a><span class="lineno">  762</span>                 <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l00763"></a><span class="lineno">  763</span>               }</div>
-<div class="line"><a name="l00764"></a><span class="lineno">  764</span>           <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l00765"></a><span class="lineno">  765</span>             }</div>
-<div class="line"><a name="l00766"></a><span class="lineno">  766</span>         <span class="keywordflow">case</span>(crule::maxband):</div>
-<div class="line"><a name="l00767"></a><span class="lineno">  767</span>             <span class="keywordflow">case</span>(crule::minband):</div>
-<div class="line"><a name="l00768"></a><span class="lineno">  768</span>             <span class="keywordflow">case</span>(crule::validband):<span class="comment">//max,min,valid band</span></div>
-<div class="line"><a name="l00769"></a><span class="lineno">  769</span>               val_current=writeBuffer[ruleBand_opt[0]][ib];</div>
-<div class="line"><a name="l00770"></a><span class="lineno">  770</span>               <span class="keywordflow">switch</span>(theResample){</div>
-<div class="line"><a name="l00771"></a><span class="lineno">  771</span>               <span class="keywordflow">case</span>(BILINEAR):</div>
-<div class="line"><a name="l00772"></a><span class="lineno">  772</span>                 lowerCol=readCol-0.5;</div>
-<div class="line"><a name="l00773"></a><span class="lineno">  773</span>                 lowerCol=<span class="keyword">static_cast<</span><span class="keywordtype">int</span><span class="keyword">></span>(lowerCol);</div>
-<div class="line"><a name="l00774"></a><span class="lineno">  774</span>                 upperCol=readCol+0.5;</div>
-<div class="line"><a name="l00775"></a><span class="lineno">  775</span>                 upperCol=<span class="keyword">static_cast<</span><span class="keywordtype">int</span><span class="keyword">></span>(upperCol);</div>
-<div class="line"><a name="l00776"></a><span class="lineno">  776</span>                 <span class="keywordflow">if</span>(lowerCol<0)</div>
-<div class="line"><a name="l00777"></a><span class="lineno">  777</span>                   lowerCol=0;</div>
-<div class="line"><a name="l00778"></a><span class="lineno">  778</span>                 <span class="keywordflow">if</span>(upperCol>=imgReader.nrOfCol())</div>
-<div class="line"><a name="l00779"></a><span class="lineno">  779</span>                   upperCol=imgReader.nrOfCol()-1;</div>
-<div class="line"><a name="l00780"></a><span class="lineno">  780</span>                 val_new=(readCol-0.5-lowerCol)*readBuffer[ruleBand_opt[0]][upperCol-startCol]+(1-readCol+0.5+lowerCol)*readBuffer[ruleBand_opt[0]][lowerCol-startCol];</div>
-<div class="line"><a name="l00781"></a><span class="lineno">  781</span>                 val_new*=weight_opt[ifile];</div>
-<div class="line"><a name="l00782"></a><span class="lineno">  782</span>                 <span class="keywordflow">if</span>((cruleMap[crule_opt[0]]==crule::maxband&&val_new>val_current)||(cruleMap[crule_opt[0]]==crule::minband&&val_new<val_current)||(cruleMap[crule_opt[0]]==crule::validband)){<span class="comment">//&&val_new>minValue_opt[0]&&val_new<maxValue_opt[0])){</span></div>
-<div class="line"><a name="l00783"></a><span class="lineno">  783</span>                   <span class="keywordflow">for</span>(iband=0;iband<nband;++iband){</div>
-<div class="line"><a name="l00784"></a><span class="lineno">  784</span>                     val_new=(readCol-0.5-lowerCol)*readBuffer[iband][upperCol-startCol]+(1-readCol+0.5+lowerCol)*readBuffer[iband][lowerCol-startCol];</div>
-<div class="line"><a name="l00785"></a><span class="lineno">  785</span>                     val_new*=weight_opt[ifile];</div>
-<div class="line"><a name="l00786"></a><span class="lineno">  786</span>                     writeBuffer[iband][ib]=val_new;</div>
-<div class="line"><a name="l00787"></a><span class="lineno">  787</span>                   }</div>
-<div class="line"><a name="l00788"></a><span class="lineno">  788</span>           <span class="keywordflow">if</span>(file_opt[0]>1)</div>
-<div class="line"><a name="l00789"></a><span class="lineno">  789</span>             fileBuffer[ib]=ifile;</div>
-<div class="line"><a name="l00790"></a><span class="lineno">  790</span>                 }</div>
-<div class="line"><a name="l00791"></a><span class="lineno">  791</span>                 <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l00792"></a><span class="lineno">  792</span>               <span class="keywordflow">default</span>:</div>
-<div class="line"><a name="l00793"></a><span class="lineno">  793</span>                 readCol=<span class="keyword">static_cast<</span><span class="keywordtype">int</span><span class="keyword">></span>(readCol);</div>
-<div class="line"><a name="l00794"></a><span class="lineno">  794</span>                 val_new=readBuffer[ruleBand_opt[0]][readCol-startCol];</div>
-<div class="line"><a name="l00795"></a><span class="lineno">  795</span>                 val_new*=weight_opt[ifile];</div>
-<div class="line"><a name="l00796"></a><span class="lineno">  796</span>                 <span class="keywordflow">if</span>((cruleMap[crule_opt[0]]==crule::maxband&&val_new>val_current)||(cruleMap[crule_opt[0]]==crule::minband&&val_new<val_current)||(cruleMap[crule_opt[0]]==crule::validband)){<span class="comment">//&&val_new>minValue_opt[0]&&val_new<maxValue_opt[0])){</span></div>
-<div class="line"><a name="l00797"></a><span class="lineno">  797</span>                   <span class="keywordflow">for</span>(iband=0;iband<nband;++iband){</div>
-<div class="line"><a name="l00798"></a><span class="lineno">  798</span>                     val_new=readBuffer[iband][readCol-startCol];</div>
-<div class="line"><a name="l00799"></a><span class="lineno">  799</span>                     val_new*=weight_opt[ifile];</div>
-<div class="line"><a name="l00800"></a><span class="lineno">  800</span>                     writeBuffer[iband][ib]=val_new;</div>
-<div class="line"><a name="l00801"></a><span class="lineno">  801</span>                   }</div>
-<div class="line"><a name="l00802"></a><span class="lineno">  802</span>           <span class="keywordflow">if</span>(file_opt[0]>1)</div>
-<div class="line"><a name="l00803"></a><span class="lineno">  803</span>             fileBuffer[ib]=ifile;</div>
-<div class="line"><a name="l00804"></a><span class="lineno">  804</span>                 }</div>
-<div class="line"><a name="l00805"></a><span class="lineno">  805</span>                 <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l00806"></a><span class="lineno">  806</span>               }</div>
-<div class="line"><a name="l00807"></a><span class="lineno">  807</span>           <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l00808"></a><span class="lineno">  808</span>             <span class="keywordflow">case</span>(crule::mode):<span class="comment">//max voting (only for Byte images)</span></div>
-<div class="line"><a name="l00809"></a><span class="lineno">  809</span>               <span class="keywordflow">switch</span>(theResample){</div>
-<div class="line"><a name="l00810"></a><span class="lineno">  810</span>               <span class="keywordflow">case</span>(BILINEAR):</div>
-<div class="line"><a name="l00811"></a><span class="lineno">  811</span>                 lowerCol=readCol-0.5;</div>
-<div class="line"><a name="l00812"></a><span class="lineno">  812</span>                 lowerCol=<span class="keyword">static_cast<</span><span class="keywordtype">int</span><span class="keyword">></span>(lowerCol);</div>
-<div class="line"><a name="l00813"></a><span class="lineno">  813</span>                 upperCol=readCol+0.5;</div>
-<div class="line"><a name="l00814"></a><span class="lineno">  814</span>                 upperCol=<span class="keyword">static_cast<</span><span class="keywordtype">int</span><span class="keyword">></span>(upperCol);</div>
-<div class="line"><a name="l00815"></a><span class="lineno">  815</span>                 <span class="keywordflow">if</span>(lowerCol<0)</div>
-<div class="line"><a name="l00816"></a><span class="lineno">  816</span>                   lowerCol=0;</div>
-<div class="line"><a name="l00817"></a><span class="lineno">  817</span>                 <span class="keywordflow">if</span>(upperCol>=imgReader.nrOfCol())</div>
-<div class="line"><a name="l00818"></a><span class="lineno">  818</span>                   upperCol=imgReader.nrOfCol()-1;</div>
-<div class="line"><a name="l00819"></a><span class="lineno">  819</span>                 <span class="keywordflow">for</span>(iband=0;iband<nband;++iband){</div>
-<div class="line"><a name="l00820"></a><span class="lineno">  820</span>                   val_new=(readCol-0.5-lowerCol)*readBuffer[iband][upperCol-startCol]+(1-readCol+0.5+lowerCol)*readBuffer[iband][lowerCol-startCol];</div>
-<div class="line"><a name="l00821"></a><span class="lineno">  821</span>           maxBuffer[ib][val_new]=maxBuffer[ib][val_new]+weight_opt[ifile];</div>
-<div class="line"><a name="l00822"></a><span class="lineno">  822</span>                   <span class="comment">// ++(maxBuffer[ib][val_new]);</span></div>
-<div class="line"><a name="l00823"></a><span class="lineno">  823</span>                 }</div>
-<div class="line"><a name="l00824"></a><span class="lineno">  824</span>                 <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l00825"></a><span class="lineno">  825</span>               <span class="keywordflow">default</span>:</div>
-<div class="line"><a name="l00826"></a><span class="lineno">  826</span>                 readCol=<span class="keyword">static_cast<</span><span class="keywordtype">int</span><span class="keyword">></span>(readCol);</div>
-<div class="line"><a name="l00827"></a><span class="lineno">  827</span>                 <span class="keywordflow">for</span>(iband=0;iband<nband;++iband){</div>
-<div class="line"><a name="l00828"></a><span class="lineno">  828</span>                   val_new=readBuffer[iband][readCol-startCol];</div>
-<div class="line"><a name="l00829"></a><span class="lineno">  829</span>           maxBuffer[ib][val_new]=maxBuffer[ib][val_new]+weight_opt[ifile];</div>
-<div class="line"><a name="l00830"></a><span class="lineno">  830</span>         }</div>
-<div class="line"><a name="l00831"></a><span class="lineno">  831</span>                 <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l00832"></a><span class="lineno">  832</span>           }</div>
-<div class="line"><a name="l00833"></a><span class="lineno">  833</span>               <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l00834"></a><span class="lineno">  834</span>             <span class="keywordflow">case</span>(crule::mean):<span class="comment">//mean value</span></div>
-<div class="line"><a name="l00835"></a><span class="lineno">  835</span>         <span class="keywordflow">case</span>(crule::median):<span class="comment">//median value</span></div>
-<div class="line"><a name="l00836"></a><span class="lineno">  836</span>         <span class="keywordflow">case</span>(crule::sum):<span class="comment">//sum value</span></div>
-<div class="line"><a name="l00837"></a><span class="lineno">  837</span>         <span class="keywordflow">case</span>(crule::minallbands):<span class="comment">//minimum for each and every band</span></div>
-<div class="line"><a name="l00838"></a><span class="lineno">  838</span>         <span class="keywordflow">case</span>(crule::maxallbands):<span class="comment">//maximum for each and every band</span></div>
-<div class="line"><a name="l00839"></a><span class="lineno">  839</span>         <span class="keywordflow">case</span>(crule::stdev):<span class="comment">//maximum for each and every band</span></div>
-<div class="line"><a name="l00840"></a><span class="lineno">  840</span>               <span class="keywordflow">switch</span>(theResample){</div>
-<div class="line"><a name="l00841"></a><span class="lineno">  841</span>               <span class="keywordflow">case</span>(BILINEAR):</div>
-<div class="line"><a name="l00842"></a><span class="lineno">  842</span>                 lowerCol=readCol-0.5;</div>
-<div class="line"><a name="l00843"></a><span class="lineno">  843</span>                 lowerCol=<span class="keyword">static_cast<</span><span class="keywordtype">int</span><span class="keyword">></span>(lowerCol);</div>
-<div class="line"><a name="l00844"></a><span class="lineno">  844</span>                 upperCol=readCol+0.5;</div>
-<div class="line"><a name="l00845"></a><span class="lineno">  845</span>                 upperCol=<span class="keyword">static_cast<</span><span class="keywordtype">int</span><span class="keyword">></span>(upperCol);</div>
-<div class="line"><a name="l00846"></a><span class="lineno">  846</span>                 <span class="keywordflow">if</span>(lowerCol<0)</div>
-<div class="line"><a name="l00847"></a><span class="lineno">  847</span>                   lowerCol=0;</div>
-<div class="line"><a name="l00848"></a><span class="lineno">  848</span>                 <span class="keywordflow">if</span>(upperCol>=imgReader.nrOfCol())</div>
-<div class="line"><a name="l00849"></a><span class="lineno">  849</span>                   upperCol=imgReader.nrOfCol()-1;</div>
-<div class="line"><a name="l00850"></a><span class="lineno">  850</span>                 <span class="keywordflow">for</span>(iband=0;iband<nband;++iband){</div>
-<div class="line"><a name="l00851"></a><span class="lineno">  851</span>                   val_new=(readCol-0.5-lowerCol)*readBuffer[iband][upperCol-startCol]+(1-readCol+0.5+lowerCol)*readBuffer[iband][lowerCol-startCol];</div>
-<div class="line"><a name="l00852"></a><span class="lineno">  852</span>                   val_new*=weight_opt[ifile];</div>
-<div class="line"><a name="l00853"></a><span class="lineno">  853</span>                   storeBuffer[iband][ib].push_back(val_new);</div>
-<div class="line"><a name="l00854"></a><span class="lineno">  854</span>                 }</div>
-<div class="line"><a name="l00855"></a><span class="lineno">  855</span>                 <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l00856"></a><span class="lineno">  856</span>               <span class="keywordflow">default</span>:</div>
-<div class="line"><a name="l00857"></a><span class="lineno">  857</span>                 readCol=<span class="keyword">static_cast<</span><span class="keywordtype">int</span><span class="keyword">></span>(readCol);</div>
-<div class="line"><a name="l00858"></a><span class="lineno">  858</span>                 <span class="keywordflow">for</span>(iband=0;iband<nband;++iband){</div>
-<div class="line"><a name="l00859"></a><span class="lineno">  859</span>                   val_new=readBuffer[iband][readCol-startCol];</div>
-<div class="line"><a name="l00860"></a><span class="lineno">  860</span>                   val_new*=weight_opt[ifile];</div>
-<div class="line"><a name="l00861"></a><span class="lineno">  861</span>                   storeBuffer[iband][ib].push_back(val_new);</div>
-<div class="line"><a name="l00862"></a><span class="lineno">  862</span>                   assert(ifile>0);</div>
-<div class="line"><a name="l00863"></a><span class="lineno">  863</span>                   <span class="comment">// assert(weight_opt[ifile]>=0);</span></div>
-<div class="line"><a name="l00864"></a><span class="lineno">  864</span>                   <span class="comment">// assert(storeBuffer[iband][ib].back()>=0);</span></div>
-<div class="line"><a name="l00865"></a><span class="lineno">  865</span>                 }</div>
-<div class="line"><a name="l00866"></a><span class="lineno">  866</span>                 <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l00867"></a><span class="lineno">  867</span>               }</div>
-<div class="line"><a name="l00868"></a><span class="lineno">  868</span>         <span class="keywordflow">if</span>(file_opt[0]>1)</div>
-<div class="line"><a name="l00869"></a><span class="lineno">  869</span>           fileBuffer[ib]=ifile;</div>
-<div class="line"><a name="l00870"></a><span class="lineno">  870</span>           <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l00871"></a><span class="lineno">  871</span>         <span class="keywordflow">case</span>(crule::overwrite):</div>
-<div class="line"><a name="l00872"></a><span class="lineno">  872</span>         <span class="keywordflow">default</span>:</div>
-<div class="line"><a name="l00873"></a><span class="lineno">  873</span>               <span class="keywordflow">switch</span>(theResample){</div>
-<div class="line"><a name="l00874"></a><span class="lineno">  874</span>               <span class="keywordflow">case</span>(BILINEAR):</div>
-<div class="line"><a name="l00875"></a><span class="lineno">  875</span>                 lowerCol=readCol-0.5;</div>
-<div class="line"><a name="l00876"></a><span class="lineno">  876</span>                 lowerCol=<span class="keyword">static_cast<</span><span class="keywordtype">int</span><span class="keyword">></span>(lowerCol);</div>
-<div class="line"><a name="l00877"></a><span class="lineno">  877</span>                 upperCol=readCol+0.5;</div>
-<div class="line"><a name="l00878"></a><span class="lineno">  878</span>                 upperCol=<span class="keyword">static_cast<</span><span class="keywordtype">int</span><span class="keyword">></span>(upperCol);</div>
-<div class="line"><a name="l00879"></a><span class="lineno">  879</span>                 <span class="keywordflow">if</span>(lowerCol<0)</div>
-<div class="line"><a name="l00880"></a><span class="lineno">  880</span>                   lowerCol=0;</div>
-<div class="line"><a name="l00881"></a><span class="lineno">  881</span>                 <span class="keywordflow">if</span>(upperCol>=imgReader.nrOfCol())</div>
-<div class="line"><a name="l00882"></a><span class="lineno">  882</span>                   upperCol=imgReader.nrOfCol()-1;</div>
-<div class="line"><a name="l00883"></a><span class="lineno">  883</span>                 <span class="keywordflow">for</span>(iband=0;iband<nband;++iband){</div>
-<div class="line"><a name="l00884"></a><span class="lineno">  884</span>                   val_new=(readCol-0.5-lowerCol)*readBuffer[iband][upperCol-startCol]+(1-readCol+0.5+lowerCol)*readBuffer[iband][lowerCol-startCol];</div>
-<div class="line"><a name="l00885"></a><span class="lineno">  885</span>                   val_new*=weight_opt[ifile];</div>
-<div class="line"><a name="l00886"></a><span class="lineno">  886</span>                   writeBuffer[iband][ib]=val_new;</div>
-<div class="line"><a name="l00887"></a><span class="lineno">  887</span>                 }</div>
-<div class="line"><a name="l00888"></a><span class="lineno">  888</span>                 <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l00889"></a><span class="lineno">  889</span>               <span class="keywordflow">default</span>:</div>
-<div class="line"><a name="l00890"></a><span class="lineno">  890</span>                 readCol=<span class="keyword">static_cast<</span><span class="keywordtype">int</span><span class="keyword">></span>(readCol);</div>
-<div class="line"><a name="l00891"></a><span class="lineno">  891</span>                 <span class="keywordflow">for</span>(iband=0;iband<nband;++iband){</div>
-<div class="line"><a name="l00892"></a><span class="lineno">  892</span>                   val_new=readBuffer[iband][readCol-startCol];</div>
-<div class="line"><a name="l00893"></a><span class="lineno">  893</span>                   val_new*=weight_opt[ifile];</div>
-<div class="line"><a name="l00894"></a><span class="lineno">  894</span>                   writeBuffer[iband][ib]=val_new;</div>
-<div class="line"><a name="l00895"></a><span class="lineno">  895</span>                 }</div>
-<div class="line"><a name="l00896"></a><span class="lineno">  896</span>                 <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l00897"></a><span class="lineno">  897</span>               }</div>
-<div class="line"><a name="l00898"></a><span class="lineno">  898</span>         <span class="keywordflow">if</span>(file_opt[0]>1)</div>
-<div class="line"><a name="l00899"></a><span class="lineno">  899</span>           fileBuffer[ib]=ifile;</div>
-<div class="line"><a name="l00900"></a><span class="lineno">  900</span>             <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l00901"></a><span class="lineno">  901</span>         }</div>
-<div class="line"><a name="l00902"></a><span class="lineno">  902</span>       }</div>
-<div class="line"><a name="l00903"></a><span class="lineno">  903</span>       <span class="keywordflow">else</span>{</div>
-<div class="line"><a name="l00904"></a><span class="lineno">  904</span>             writeValid[ib]=<span class="keyword">true</span>;<span class="comment">//readValid was true</span></div>
-<div class="line"><a name="l00905"></a><span class="lineno">  905</span>             <span class="keywordtype">int</span> iband=0;</div>
-<div class="line"><a name="l00906"></a><span class="lineno">  906</span>         <span class="keywordflow">switch</span>(cruleMap[crule_opt[0]]){</div>
-<div class="line"><a name="l00907"></a><span class="lineno">  907</span>             <span class="keywordflow">case</span>(crule::mean):</div>
-<div class="line"><a name="l00908"></a><span class="lineno">  908</span>             <span class="keywordflow">case</span>(crule::median):</div>
-<div class="line"><a name="l00909"></a><span class="lineno">  909</span>             <span class="keywordflow">case</span>(crule::sum):</div>
-<div class="line"><a name="l00910"></a><span class="lineno">  910</span>             <span class="keywordflow">case</span>(crule::minallbands):</div>
-<div class="line"><a name="l00911"></a><span class="lineno">  911</span>             <span class="keywordflow">case</span>(crule::maxallbands):</div>
-<div class="line"><a name="l00912"></a><span class="lineno">  912</span>             <span class="keywordflow">case</span>(crule::stdev):</div>
-<div class="line"><a name="l00913"></a><span class="lineno">  913</span>               <span class="keywordflow">switch</span>(theResample){</div>
-<div class="line"><a name="l00914"></a><span class="lineno">  914</span>               <span class="keywordflow">case</span>(BILINEAR):</div>
-<div class="line"><a name="l00915"></a><span class="lineno">  915</span>                 lowerCol=readCol-0.5;</div>
-<div class="line"><a name="l00916"></a><span class="lineno">  916</span>                 lowerCol=<span class="keyword">static_cast<</span><span class="keywordtype">int</span><span class="keyword">></span>(lowerCol);</div>
-<div class="line"><a name="l00917"></a><span class="lineno">  917</span>                 upperCol=readCol+0.5;</div>
-<div class="line"><a name="l00918"></a><span class="lineno">  918</span>                 upperCol=<span class="keyword">static_cast<</span><span class="keywordtype">int</span><span class="keyword">></span>(upperCol);</div>
-<div class="line"><a name="l00919"></a><span class="lineno">  919</span>                 <span class="keywordflow">if</span>(lowerCol<0)</div>
-<div class="line"><a name="l00920"></a><span class="lineno">  920</span>                   lowerCol=0;</div>
-<div class="line"><a name="l00921"></a><span class="lineno">  921</span>                 <span class="keywordflow">if</span>(upperCol>=imgReader.nrOfCol())</div>
-<div class="line"><a name="l00922"></a><span class="lineno">  922</span>                   upperCol=imgReader.nrOfCol()-1;</div>
-<div class="line"><a name="l00923"></a><span class="lineno">  923</span>                 <span class="keywordflow">for</span>(iband=0;iband<nband;++iband){</div>
-<div class="line"><a name="l00924"></a><span class="lineno">  924</span>                   val_new=(readCol-0.5-lowerCol)*readBuffer[iband][upperCol-startCol]+(1-readCol+0.5+lowerCol)*readBuffer[iband][lowerCol-startCol];</div>
-<div class="line"><a name="l00925"></a><span class="lineno">  925</span>                   val_new*=weight_opt[ifile];</div>
-<div class="line"><a name="l00926"></a><span class="lineno">  926</span>                   storeBuffer[iband][ib].push_back(val_new);</div>
-<div class="line"><a name="l00927"></a><span class="lineno">  927</span>                 }</div>
-<div class="line"><a name="l00928"></a><span class="lineno">  928</span>                 <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l00929"></a><span class="lineno">  929</span>               <span class="keywordflow">default</span>:</div>
-<div class="line"><a name="l00930"></a><span class="lineno">  930</span>                 readCol=<span class="keyword">static_cast<</span><span class="keywordtype">int</span><span class="keyword">></span>(readCol);</div>
-<div class="line"><a name="l00931"></a><span class="lineno">  931</span>                 <span class="keywordflow">for</span>(iband=0;iband<nband;++iband){</div>
-<div class="line"><a name="l00932"></a><span class="lineno">  932</span>                   val_new=readBuffer[iband][readCol-startCol];</div>
-<div class="line"><a name="l00933"></a><span class="lineno">  933</span>                   val_new*=weight_opt[ifile];</div>
-<div class="line"><a name="l00934"></a><span class="lineno">  934</span>                   storeBuffer[iband][ib].push_back(val_new);</div>
-<div class="line"><a name="l00935"></a><span class="lineno">  935</span>                 }</div>
-<div class="line"><a name="l00936"></a><span class="lineno">  936</span>                 <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l00937"></a><span class="lineno">  937</span>               }</div>
-<div class="line"><a name="l00938"></a><span class="lineno">  938</span>         <span class="keywordflow">if</span>(file_opt[0]>1)</div>
-<div class="line"><a name="l00939"></a><span class="lineno">  939</span>           fileBuffer[ib]=ifile;</div>
-<div class="line"><a name="l00940"></a><span class="lineno">  940</span>         <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l00941"></a><span class="lineno">  941</span>             <span class="keywordflow">case</span>(crule::mode):</div>
-<div class="line"><a name="l00942"></a><span class="lineno">  942</span>               <span class="keywordflow">switch</span>(theResample){</div>
-<div class="line"><a name="l00943"></a><span class="lineno">  943</span>               <span class="keywordflow">case</span>(BILINEAR):</div>
-<div class="line"><a name="l00944"></a><span class="lineno">  944</span>                 lowerCol=readCol-0.5;</div>
-<div class="line"><a name="l00945"></a><span class="lineno">  945</span>                 lowerCol=<span class="keyword">static_cast<</span><span class="keywordtype">int</span><span class="keyword">></span>(lowerCol);</div>
-<div class="line"><a name="l00946"></a><span class="lineno">  946</span>                 upperCol=readCol+0.5;</div>
-<div class="line"><a name="l00947"></a><span class="lineno">  947</span>                 upperCol=<span class="keyword">static_cast<</span><span class="keywordtype">int</span><span class="keyword">></span>(upperCol);</div>
-<div class="line"><a name="l00948"></a><span class="lineno">  948</span>                 <span class="keywordflow">if</span>(lowerCol<0)</div>
-<div class="line"><a name="l00949"></a><span class="lineno">  949</span>                   lowerCol=0;</div>
-<div class="line"><a name="l00950"></a><span class="lineno">  950</span>                 <span class="keywordflow">if</span>(upperCol>=imgReader.nrOfCol())</div>
-<div class="line"><a name="l00951"></a><span class="lineno">  951</span>                   upperCol=imgReader.nrOfCol()-1;</div>
-<div class="line"><a name="l00952"></a><span class="lineno">  952</span>                 <span class="keywordflow">for</span>(iband=0;iband<nband;++iband){</div>
-<div class="line"><a name="l00953"></a><span class="lineno">  953</span>                   val_new=(readCol-0.5-lowerCol)*readBuffer[iband][upperCol-startCol]+(1-readCol+0.5+lowerCol)*readBuffer[iband][lowerCol-startCol];</div>
-<div class="line"><a name="l00954"></a><span class="lineno">  954</span>           maxBuffer[ib][val_new]=maxBuffer[ib][val_new]+weight_opt[ifile];</div>
-<div class="line"><a name="l00955"></a><span class="lineno">  955</span>                   <span class="comment">// ++(maxBuffer[ib][val_new]);</span></div>
-<div class="line"><a name="l00956"></a><span class="lineno">  956</span>         }</div>
-<div class="line"><a name="l00957"></a><span class="lineno">  957</span>                 <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l00958"></a><span class="lineno">  958</span>               <span class="keywordflow">default</span>:</div>
-<div class="line"><a name="l00959"></a><span class="lineno">  959</span>                 readCol=<span class="keyword">static_cast<</span><span class="keywordtype">int</span><span class="keyword">></span>(readCol);</div>
-<div class="line"><a name="l00960"></a><span class="lineno">  960</span>                 <span class="keywordflow">for</span>(iband=0;iband<nband;++iband){</div>
-<div class="line"><a name="l00961"></a><span class="lineno">  961</span>           val_new=readBuffer[iband][readCol-startCol];</div>
-<div class="line"><a name="l00962"></a><span class="lineno">  962</span>           maxBuffer[ib][val_new]=maxBuffer[ib][val_new]+weight_opt[ifile];</div>
-<div class="line"><a name="l00963"></a><span class="lineno">  963</span>         }</div>
-<div class="line"><a name="l00964"></a><span class="lineno">  964</span>                   <span class="comment">// ++(maxBuffer[ib][val_new]);</span></div>
-<div class="line"><a name="l00965"></a><span class="lineno">  965</span>                 <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l00966"></a><span class="lineno">  966</span>               }</div>
-<div class="line"><a name="l00967"></a><span class="lineno">  967</span>               <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l00968"></a><span class="lineno">  968</span>             <span class="keywordflow">default</span>:</div>
-<div class="line"><a name="l00969"></a><span class="lineno">  969</span>               <span class="keywordflow">switch</span>(theResample){</div>
-<div class="line"><a name="l00970"></a><span class="lineno">  970</span>               <span class="keywordflow">case</span>(BILINEAR):</div>
-<div class="line"><a name="l00971"></a><span class="lineno">  971</span>                 lowerCol=readCol-0.5;</div>
-<div class="line"><a name="l00972"></a><span class="lineno">  972</span>                 lowerCol=<span class="keyword">static_cast<</span><span class="keywordtype">int</span><span class="keyword">></span>(lowerCol);</div>
-<div class="line"><a name="l00973"></a><span class="lineno">  973</span>                 upperCol=readCol+0.5;</div>
-<div class="line"><a name="l00974"></a><span class="lineno">  974</span>                 upperCol=<span class="keyword">static_cast<</span><span class="keywordtype">int</span><span class="keyword">></span>(upperCol);</div>
-<div class="line"><a name="l00975"></a><span class="lineno">  975</span>                 <span class="keywordflow">if</span>(lowerCol<0)</div>
-<div class="line"><a name="l00976"></a><span class="lineno">  976</span>                   lowerCol=0;</div>
-<div class="line"><a name="l00977"></a><span class="lineno">  977</span>                 <span class="keywordflow">if</span>(upperCol>=imgReader.nrOfCol())</div>
-<div class="line"><a name="l00978"></a><span class="lineno">  978</span>                   upperCol=imgReader.nrOfCol()-1;</div>
-<div class="line"><a name="l00979"></a><span class="lineno">  979</span>                 <span class="keywordflow">for</span>(iband=0;iband<nband;++iband){</div>
-<div class="line"><a name="l00980"></a><span class="lineno">  980</span>                   val_new=(readCol-0.5-lowerCol)*readBuffer[iband][upperCol-startCol]+(1-readCol+0.5+lowerCol)*readBuffer[iband][lowerCol-startCol];</div>
-<div class="line"><a name="l00981"></a><span class="lineno">  981</span>                   val_new*=weight_opt[ifile];</div>
-<div class="line"><a name="l00982"></a><span class="lineno">  982</span>                   writeBuffer[iband][ib]=val_new;</div>
-<div class="line"><a name="l00983"></a><span class="lineno">  983</span>                 }</div>
-<div class="line"><a name="l00984"></a><span class="lineno">  984</span>                 <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l00985"></a><span class="lineno">  985</span>               <span class="keywordflow">default</span>:</div>
-<div class="line"><a name="l00986"></a><span class="lineno">  986</span>                 readCol=<span class="keyword">static_cast<</span><span class="keywordtype">int</span><span class="keyword">></span>(readCol);</div>
-<div class="line"><a name="l00987"></a><span class="lineno">  987</span>                 <span class="keywordflow">for</span>(iband=0;iband<nband;++iband){</div>
-<div class="line"><a name="l00988"></a><span class="lineno">  988</span>                   val_new=readBuffer[iband][readCol-startCol];</div>
-<div class="line"><a name="l00989"></a><span class="lineno">  989</span>                   val_new*=weight_opt[ifile];</div>
-<div class="line"><a name="l00990"></a><span class="lineno">  990</span>                   writeBuffer[iband][ib]=val_new;</div>
-<div class="line"><a name="l00991"></a><span class="lineno">  991</span>                 }</div>
-<div class="line"><a name="l00992"></a><span class="lineno">  992</span>                 <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l00993"></a><span class="lineno">  993</span>               }</div>
-<div class="line"><a name="l00994"></a><span class="lineno">  994</span>           <span class="keywordflow">if</span>(file_opt[0]>1)</div>
-<div class="line"><a name="l00995"></a><span class="lineno">  995</span>         fileBuffer[ib]=ifile;</div>
-<div class="line"><a name="l00996"></a><span class="lineno">  996</span>               <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l00997"></a><span class="lineno">  997</span>             }</div>
-<div class="line"><a name="l00998"></a><span class="lineno">  998</span>           }</div>
+<div class="line"><a name="l00508"></a><span class="lineno">  508</span>   <span class="keywordflow">if</span>(verbose_opt[0])</div>
+<div class="line"><a name="l00509"></a><span class="lineno">  509</span>     cout << <span class="stringliteral">"bounding box input images (ULX ULY LRX LRY): "</span> << fixed << setprecision(6) << minULX << <span class="stringliteral">" "</span> << maxULY << <span class="stringliteral">" "</span> << maxLRX << <span class="stringliteral">" "</span> << minLRY << endl;</div>
+<div class="line"><a name="l00510"></a><span class="lineno">  510</span>   <span class="keywordflow">if</span>(ulx_opt[0]||uly_opt[0]||lrx_opt[0]||lry_opt[0]){</div>
+<div class="line"><a name="l00511"></a><span class="lineno">  511</span>     maxLRX=lrx_opt[0];</div>
+<div class="line"><a name="l00512"></a><span class="lineno">  512</span>     maxULY=uly_opt[0];</div>
+<div class="line"><a name="l00513"></a><span class="lineno">  513</span>     minULX=ulx_opt[0];</div>
+<div class="line"><a name="l00514"></a><span class="lineno">  514</span>     minLRY=lry_opt[0];</div>
+<div class="line"><a name="l00515"></a><span class="lineno">  515</span>   }</div>
+<div class="line"><a name="l00516"></a><span class="lineno">  516</span>   </div>
+<div class="line"><a name="l00517"></a><span class="lineno">  517</span>   <span class="keywordtype">bool</span> forceEUgrid=<span class="keyword">false</span>;</div>
+<div class="line"><a name="l00518"></a><span class="lineno">  518</span>   <span class="keywordflow">if</span>(projection_opt.size())</div>
+<div class="line"><a name="l00519"></a><span class="lineno">  519</span>     forceEUgrid=(!(projection_opt[0].compare(<span class="stringliteral">"EPSG:3035"</span>))||!(projection_opt[0].compare(<span class="stringliteral">"EPSG:3035"</span>))||projection_opt[0].find(<span class="stringliteral">"ETRS-LAEA"</span>)!=string::npos);</div>
+<div class="line"><a name="l00520"></a><span class="lineno">  520</span>   <span class="keywordflow">if</span>(forceEUgrid){</div>
+<div class="line"><a name="l00521"></a><span class="lineno">  521</span>     <span class="comment">//force to LAEA grid</span></div>
+<div class="line"><a name="l00522"></a><span class="lineno">  522</span>     minULX=floor(minULX);</div>
+<div class="line"><a name="l00523"></a><span class="lineno">  523</span>     minULX-=<span class="keyword">static_cast<</span><span class="keywordtype">int</span><span class="keyword">></span>(minULX)%(static_cast<int>(dx));</div>
+<div class="line"><a name="l00524"></a><span class="lineno">  524</span>     maxULY=ceil(maxULY);</div>
+<div class="line"><a name="l00525"></a><span class="lineno">  525</span>     <span class="keywordflow">if</span>(static_cast<int>(maxULY)%static_cast<int>(dy))</div>
+<div class="line"><a name="l00526"></a><span class="lineno">  526</span>       maxULY+=dy;</div>
+<div class="line"><a name="l00527"></a><span class="lineno">  527</span>     maxULY-=<span class="keyword">static_cast<</span><span class="keywordtype">int</span><span class="keyword">></span>(maxULY)%(static_cast<int>(dy));</div>
+<div class="line"><a name="l00528"></a><span class="lineno">  528</span>     maxLRX=ceil(maxLRX);</div>
+<div class="line"><a name="l00529"></a><span class="lineno">  529</span>     <span class="keywordflow">if</span>(static_cast<int>(maxLRX)%static_cast<int>(dx))</div>
+<div class="line"><a name="l00530"></a><span class="lineno">  530</span>       maxLRX+=dx;</div>
+<div class="line"><a name="l00531"></a><span class="lineno">  531</span>     maxLRX-=<span class="keyword">static_cast<</span><span class="keywordtype">int</span><span class="keyword">></span>(maxLRX)%(static_cast<int>(dx));</div>
+<div class="line"><a name="l00532"></a><span class="lineno">  532</span>     minLRY=floor(minLRY);</div>
+<div class="line"><a name="l00533"></a><span class="lineno">  533</span>     minLRY-=<span class="keyword">static_cast<</span><span class="keywordtype">int</span><span class="keyword">></span>(minLRY)%(static_cast<int>(dy));</div>
+<div class="line"><a name="l00534"></a><span class="lineno">  534</span>   }</div>
+<div class="line"><a name="l00535"></a><span class="lineno">  535</span> </div>
+<div class="line"><a name="l00536"></a><span class="lineno">  536</span>   <span class="keywordflow">if</span>(verbose_opt[0])</div>
+<div class="line"><a name="l00537"></a><span class="lineno">  537</span>     cout << <span class="stringliteral">"bounding box composite image (ULX ULY LRX LRY): "</span> << fixed << setprecision(6) << minULX << <span class="stringliteral">" "</span> << maxULY << <span class="stringliteral">" "</span> << maxLRX << <span class="stringliteral">" "</span> << minLRY << endl;</div>
+<div class="line"><a name="l00538"></a><span class="lineno">  538</span>   <span class="comment">//initialize image</span></div>
+<div class="line"><a name="l00539"></a><span class="lineno">  539</span>   <span class="keywordflow">if</span>(verbose_opt[0])</div>
+<div class="line"><a name="l00540"></a><span class="lineno">  540</span>     cout << <span class="stringliteral">"initializing composite image..."</span> << endl;</div>
+<div class="line"><a name="l00541"></a><span class="lineno">  541</span> <span class="comment">//   double dcol=(maxLRX-minULX+dx-1)/dx;</span></div>
+<div class="line"><a name="l00542"></a><span class="lineno">  542</span> <span class="comment">//   double drow=(maxULY-minLRY+dy-1)/dy;</span></div>
+<div class="line"><a name="l00543"></a><span class="lineno">  543</span> <span class="comment">//   int ncol=static_cast<int>(dcol);</span></div>
+<div class="line"><a name="l00544"></a><span class="lineno">  544</span> <span class="comment">//   int nrow=static_cast<int>(drow);</span></div>
+<div class="line"><a name="l00545"></a><span class="lineno">  545</span> </div>
+<div class="line"><a name="l00546"></a><span class="lineno">  546</span>   <span class="keywordtype">int</span> ncol=ceil((maxLRX-minULX)/dx);</div>
+<div class="line"><a name="l00547"></a><span class="lineno">  547</span>   <span class="keywordtype">int</span> nrow=ceil((maxULY-minLRY)/dy);</div>
+<div class="line"><a name="l00548"></a><span class="lineno">  548</span> </div>
+<div class="line"><a name="l00549"></a><span class="lineno">  549</span>   <span class="keywordflow">if</span>(verbose_opt[0])</div>
+<div class="line"><a name="l00550"></a><span class="lineno">  550</span>     cout << <span class="stringliteral">"composite image dim (nrow x ncol): "</span> << nrow << <span class="stringliteral">" x "</span> << ncol << endl;</div>
+<div class="line"><a name="l00551"></a><span class="lineno">  551</span>   <a class="code" href="classImgWriterGdal.html">ImgWriterGdal</a> imgWriter;</div>
+<div class="line"><a name="l00552"></a><span class="lineno">  552</span>   <span class="keywordflow">while</span>(weight_opt.size()<input_opt.size())</div>
+<div class="line"><a name="l00553"></a><span class="lineno">  553</span>     weight_opt.push_back(weight_opt[0]);</div>
+<div class="line"><a name="l00554"></a><span class="lineno">  554</span>   <span class="keywordflow">if</span>(verbose_opt[0]){</div>
+<div class="line"><a name="l00555"></a><span class="lineno">  555</span>     std::cout << weight_opt << std::endl;</div>
+<div class="line"><a name="l00556"></a><span class="lineno">  556</span>   }</div>
+<div class="line"><a name="l00557"></a><span class="lineno">  557</span>   <span class="keywordflow">if</span>(cruleMap[crule_opt[0]]==crule::mode){</div>
+<div class="line"><a name="l00558"></a><span class="lineno">  558</span>     nwriteBand=(file_opt[0])? class_opt.size()+1:class_opt.size();</div>
+<div class="line"><a name="l00559"></a><span class="lineno">  559</span>   }</div>
+<div class="line"><a name="l00560"></a><span class="lineno">  560</span>   <span class="keywordflow">else</span></div>
+<div class="line"><a name="l00561"></a><span class="lineno">  561</span>     nwriteBand=(file_opt[0])? bands.size()+1:bands.size();</div>
+<div class="line"><a name="l00562"></a><span class="lineno">  562</span>   <span class="keywordflow">if</span>(output_opt.empty()){</div>
+<div class="line"><a name="l00563"></a><span class="lineno">  563</span>     std::cerr << <span class="stringliteral">"No output file provided (use option -o). Use --help for help information"</span> << std::endl;</div>
+<div class="line"><a name="l00564"></a><span class="lineno">  564</span>     exit(0);</div>
+<div class="line"><a name="l00565"></a><span class="lineno">  565</span>   }</div>
+<div class="line"><a name="l00566"></a><span class="lineno">  566</span>   <span class="keywordflow">if</span>(verbose_opt[0])</div>
+<div class="line"><a name="l00567"></a><span class="lineno">  567</span>     cout << <span class="stringliteral">"open output image "</span> << output_opt[0] << <span class="stringliteral">" with "</span> << nwriteBand << <span class="stringliteral">" bands"</span> << endl << flush;</div>
+<div class="line"><a name="l00568"></a><span class="lineno">  568</span>   <span class="keywordflow">try</span>{</div>
+<div class="line"><a name="l00569"></a><span class="lineno">  569</span>     imgWriter.open(output_opt[0],ncol,nrow,nwriteBand,theType,imageType,option_opt);</div>
+<div class="line"><a name="l00570"></a><span class="lineno">  570</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iband=0;iband<nwriteBand;++iband)</div>
+<div class="line"><a name="l00571"></a><span class="lineno">  571</span>       imgWriter.GDALSetNoDataValue(dstnodata_opt[0],iband);</div>
+<div class="line"><a name="l00572"></a><span class="lineno">  572</span>   }</div>
+<div class="line"><a name="l00573"></a><span class="lineno">  573</span>   <span class="keywordflow">catch</span>(<span class="keywordtype">string</span> error){</div>
+<div class="line"><a name="l00574"></a><span class="lineno">  574</span>     cout << error << endl;</div>
+<div class="line"><a name="l00575"></a><span class="lineno">  575</span>   }</div>
+<div class="line"><a name="l00576"></a><span class="lineno">  576</span>   <span class="keywordflow">if</span>(description_opt.size())</div>
+<div class="line"><a name="l00577"></a><span class="lineno">  577</span>     imgWriter.setImageDescription(description_opt[0]);</div>
+<div class="line"><a name="l00578"></a><span class="lineno">  578</span>   <span class="keywordtype">double</span> gt[6];</div>
+<div class="line"><a name="l00579"></a><span class="lineno">  579</span>   gt[0]=minULX;</div>
+<div class="line"><a name="l00580"></a><span class="lineno">  580</span>   gt[1]=dx;</div>
+<div class="line"><a name="l00581"></a><span class="lineno">  581</span>   gt[2]=0;</div>
+<div class="line"><a name="l00582"></a><span class="lineno">  582</span>   gt[3]=maxULY;</div>
+<div class="line"><a name="l00583"></a><span class="lineno">  583</span>   gt[4]=0;</div>
+<div class="line"><a name="l00584"></a><span class="lineno">  584</span>   gt[5]=-dy;</div>
+<div class="line"><a name="l00585"></a><span class="lineno">  585</span>   imgWriter.setGeoTransform(gt);</div>
+<div class="line"><a name="l00586"></a><span class="lineno">  586</span>   <span class="comment">// imgWriter.setGeoTransform(minULX,maxULY,dx,dy,0,0);</span></div>
+<div class="line"><a name="l00587"></a><span class="lineno">  587</span>   <span class="keywordflow">if</span>(projection_opt.size()){</div>
+<div class="line"><a name="l00588"></a><span class="lineno">  588</span>     <span class="keywordflow">if</span>(verbose_opt[0])</div>
+<div class="line"><a name="l00589"></a><span class="lineno">  589</span>       cout << <span class="stringliteral">"projection: "</span> << projection_opt[0] << endl;</div>
+<div class="line"><a name="l00590"></a><span class="lineno">  590</span>     imgWriter.setProjectionProj4(projection_opt[0]);</div>
+<div class="line"><a name="l00591"></a><span class="lineno">  591</span>   }</div>
+<div class="line"><a name="l00592"></a><span class="lineno">  592</span>   <span class="keywordflow">else</span> <span class="keywordflow">if</span>(theProjection!=<span class="stringliteral">""</span>){</div>
+<div class="line"><a name="l00593"></a><span class="lineno">  593</span>     <span class="keywordflow">if</span>(verbose_opt[0])</div>
+<div class="line"><a name="l00594"></a><span class="lineno">  594</span>       cout << <span class="stringliteral">"projection: "</span> << theProjection << endl;</div>
+<div class="line"><a name="l00595"></a><span class="lineno">  595</span>     imgWriter.setProjection(theProjection);</div>
+<div class="line"><a name="l00596"></a><span class="lineno">  596</span>   }</div>
+<div class="line"><a name="l00597"></a><span class="lineno">  597</span>   <span class="keywordflow">if</span>(imgWriter.getDataType()==GDT_Byte){</div>
+<div class="line"><a name="l00598"></a><span class="lineno">  598</span>     <span class="keywordflow">if</span>(colorTable_opt.size()){</div>
+<div class="line"><a name="l00599"></a><span class="lineno">  599</span>       <span class="keywordflow">if</span>(colorTable_opt[0]!=<span class="stringliteral">"none"</span>)</div>
+<div class="line"><a name="l00600"></a><span class="lineno">  600</span>     imgWriter.setColorTable(colorTable_opt[0]);</div>
+<div class="line"><a name="l00601"></a><span class="lineno">  601</span>     }</div>
+<div class="line"><a name="l00602"></a><span class="lineno">  602</span>     <span class="keywordflow">else</span> <span class="keywordflow">if</span>(theColorTable)</div>
+<div class="line"><a name="l00603"></a><span class="lineno">  603</span>       imgWriter.setColorTable(theColorTable);</div>
+<div class="line"><a name="l00604"></a><span class="lineno">  604</span>   }</div>
+<div class="line"><a name="l00605"></a><span class="lineno">  605</span> </div>
+<div class="line"><a name="l00606"></a><span class="lineno">  606</span>   <a class="code" href="classImgWriterGdal.html">ImgWriterGdal</a> maskWriter;</div>
+<div class="line"><a name="l00607"></a><span class="lineno">  607</span>   <span class="keywordflow">if</span>(extent_opt.size()&&cut_opt[0]){</div>
+<div class="line"><a name="l00608"></a><span class="lineno">  608</span>     <span class="keywordflow">try</span>{</div>
+<div class="line"><a name="l00609"></a><span class="lineno">  609</span>       maskWriter.open(<span class="stringliteral">"/vsimem/mask.tif"</span>,ncol,nrow,1,GDT_Float32,<span class="stringliteral">"GTiff"</span>,option_opt);</div>
+<div class="line"><a name="l00610"></a><span class="lineno">  610</span>       <span class="keywordtype">double</span> gt[6];</div>
+<div class="line"><a name="l00611"></a><span class="lineno">  611</span>       gt[0]=minULX;</div>
+<div class="line"><a name="l00612"></a><span class="lineno">  612</span>       gt[1]=dx;</div>
+<div class="line"><a name="l00613"></a><span class="lineno">  613</span>       gt[2]=0;</div>
+<div class="line"><a name="l00614"></a><span class="lineno">  614</span>       gt[3]=maxULY;</div>
+<div class="line"><a name="l00615"></a><span class="lineno">  615</span>       gt[4]=0;</div>
+<div class="line"><a name="l00616"></a><span class="lineno">  616</span>       gt[5]=-dy;</div>
+<div class="line"><a name="l00617"></a><span class="lineno">  617</span>       maskWriter.setGeoTransform(gt);</div>
+<div class="line"><a name="l00618"></a><span class="lineno">  618</span>       <span class="keywordflow">if</span>(projection_opt.size())</div>
+<div class="line"><a name="l00619"></a><span class="lineno">  619</span>     maskWriter.setProjectionProj4(projection_opt[0]);</div>
+<div class="line"><a name="l00620"></a><span class="lineno">  620</span>       <span class="keywordflow">else</span> <span class="keywordflow">if</span>(theProjection!=<span class="stringliteral">""</span>){</div>
+<div class="line"><a name="l00621"></a><span class="lineno">  621</span>     <span class="keywordflow">if</span>(verbose_opt[0])</div>
+<div class="line"><a name="l00622"></a><span class="lineno">  622</span>       cout << <span class="stringliteral">"projection: "</span> << theProjection << endl;</div>
+<div class="line"><a name="l00623"></a><span class="lineno">  623</span>     maskWriter.setProjection(theProjection);</div>
+<div class="line"><a name="l00624"></a><span class="lineno">  624</span>       }</div>
+<div class="line"><a name="l00625"></a><span class="lineno">  625</span>     </div>
+<div class="line"><a name="l00626"></a><span class="lineno">  626</span>       <span class="comment">//todo: handle multiple extent options</span></div>
+<div class="line"><a name="l00627"></a><span class="lineno">  627</span>       vector<double> burnValues(1,1);<span class="comment">//burn value is 1 (single band)</span></div>
+<div class="line"><a name="l00628"></a><span class="lineno">  628</span>       maskWriter.rasterizeOgr(extentReader,burnValues);</div>
+<div class="line"><a name="l00629"></a><span class="lineno">  629</span>       maskWriter.close();</div>
+<div class="line"><a name="l00630"></a><span class="lineno">  630</span>     }</div>
+<div class="line"><a name="l00631"></a><span class="lineno">  631</span>     <span class="keywordflow">catch</span>(<span class="keywordtype">string</span> error){</div>
+<div class="line"><a name="l00632"></a><span class="lineno">  632</span>       cerr << error << std::endl;</div>
+<div class="line"><a name="l00633"></a><span class="lineno">  633</span>       exit(2);</div>
+<div class="line"><a name="l00634"></a><span class="lineno">  634</span>     }</div>
+<div class="line"><a name="l00635"></a><span class="lineno">  635</span>     <span class="keywordflow">catch</span>(...){</div>
+<div class="line"><a name="l00636"></a><span class="lineno">  636</span>       cerr << <span class="stringliteral">"error catched"</span> << std::endl;</div>
+<div class="line"><a name="l00637"></a><span class="lineno">  637</span>       exit(1);</div>
+<div class="line"><a name="l00638"></a><span class="lineno">  638</span>     }</div>
+<div class="line"><a name="l00639"></a><span class="lineno">  639</span>     <span class="comment">//todo: support multiple masks</span></div>
+<div class="line"><a name="l00640"></a><span class="lineno">  640</span>     mask_opt.clear();</div>
+<div class="line"><a name="l00641"></a><span class="lineno">  641</span>     mask_opt.push_back(<span class="stringliteral">"/vsimem/mask.tif"</span>);</div>
+<div class="line"><a name="l00642"></a><span class="lineno">  642</span>   }</div>
+<div class="line"><a name="l00643"></a><span class="lineno">  643</span>   <a class="code" href="classImgReaderGdal.html">ImgReaderGdal</a> maskReader;</div>
+<div class="line"><a name="l00644"></a><span class="lineno">  644</span>   <span class="keywordflow">if</span>(mask_opt.size()){</div>
+<div class="line"><a name="l00645"></a><span class="lineno">  645</span>     <span class="keywordflow">try</span>{</div>
+<div class="line"><a name="l00646"></a><span class="lineno">  646</span>       <span class="keywordflow">if</span>(verbose_opt[0]>=1)</div>
+<div class="line"><a name="l00647"></a><span class="lineno">  647</span>     std::cout << <span class="stringliteral">"opening mask image file "</span> << mask_opt[0] << std::endl;</div>
+<div class="line"><a name="l00648"></a><span class="lineno">  648</span>       maskReader.open(mask_opt[0]);</div>
+<div class="line"><a name="l00649"></a><span class="lineno">  649</span>       <span class="keywordflow">if</span>(mskband_opt[0]>=maskReader.nrOfBand()){</div>
+<div class="line"><a name="l00650"></a><span class="lineno">  650</span>     <span class="keywordtype">string</span> errorString=<span class="stringliteral">"Error: illegal mask band"</span>;</div>
+<div class="line"><a name="l00651"></a><span class="lineno">  651</span>     <span class="keywordflow">throw</span>(errorString);</div>
+<div class="line"><a name="l00652"></a><span class="lineno">  652</span>       }</div>
+<div class="line"><a name="l00653"></a><span class="lineno">  653</span>     }</div>
+<div class="line"><a name="l00654"></a><span class="lineno">  654</span>     <span class="keywordflow">catch</span>(<span class="keywordtype">string</span> error){</div>
+<div class="line"><a name="l00655"></a><span class="lineno">  655</span>       cerr << error << std::endl;</div>
+<div class="line"><a name="l00656"></a><span class="lineno">  656</span>       exit(2);</div>
+<div class="line"><a name="l00657"></a><span class="lineno">  657</span>     }</div>
+<div class="line"><a name="l00658"></a><span class="lineno">  658</span>     <span class="keywordflow">catch</span>(...){</div>
+<div class="line"><a name="l00659"></a><span class="lineno">  659</span>       cerr << <span class="stringliteral">"error catched"</span> << std::endl;</div>
+<div class="line"><a name="l00660"></a><span class="lineno">  660</span>       exit(1);</div>
+<div class="line"><a name="l00661"></a><span class="lineno">  661</span>     }</div>
+<div class="line"><a name="l00662"></a><span class="lineno">  662</span>   }</div>
+<div class="line"><a name="l00663"></a><span class="lineno">  663</span> </div>
+<div class="line"><a name="l00664"></a><span class="lineno">  664</span>   <span class="comment">//create composite image</span></div>
+<div class="line"><a name="l00665"></a><span class="lineno">  665</span>   <span class="keywordflow">if</span>(verbose_opt[0])</div>
+<div class="line"><a name="l00666"></a><span class="lineno">  666</span>      cout << <span class="stringliteral">"creating composite image"</span> << endl;</div>
+<div class="line"><a name="l00667"></a><span class="lineno">  667</span>   <a class="code" href="classVector2d.html">Vector2d<double></a> writeBuffer(nband,imgWriter.nrOfCol());</div>
+<div class="line"><a name="l00668"></a><span class="lineno">  668</span>   vector<short> fileBuffer(ncol);<span class="comment">//holds the number of used files</span></div>
+<div class="line"><a name="l00669"></a><span class="lineno">  669</span>   <a class="code" href="classVector2d.html">Vector2d<short></a> maxBuffer;<span class="comment">//buffer used for maximum voting</span></div>
+<div class="line"><a name="l00670"></a><span class="lineno">  670</span>   <span class="comment">// Vector2d<double> readBuffer(nband);</span></div>
+<div class="line"><a name="l00671"></a><span class="lineno">  671</span>   vector<Vector2d<double> > readBuffer(input_opt.size());</div>
+<div class="line"><a name="l00672"></a><span class="lineno">  672</span>   <span class="keywordflow">for</span>(<span class="keywordtype">int</span> ifile=0;ifile<input_opt.size();++ifile)</div>
+<div class="line"><a name="l00673"></a><span class="lineno">  673</span>     readBuffer[ifile].resize(imgReader[ifile].nrOfBand());</div>
+<div class="line"><a name="l00674"></a><span class="lineno">  674</span>   <a class="code" href="classstatfactory_1_1StatFactory.html">statfactory::StatFactory</a> stat;</div>
+<div class="line"><a name="l00675"></a><span class="lineno">  675</span>   <span class="keywordflow">if</span>(cruleMap[crule_opt[0]]==crule::maxndvi)<span class="comment">//ndvi</span></div>
+<div class="line"><a name="l00676"></a><span class="lineno">  676</span>     assert(ruleBand_opt.size()==2);</div>
+<div class="line"><a name="l00677"></a><span class="lineno">  677</span>   <span class="keywordflow">if</span>(cruleMap[crule_opt[0]]==crule::mode){<span class="comment">//max voting</span></div>
+<div class="line"><a name="l00678"></a><span class="lineno">  678</span>     maxBuffer.resize(imgWriter.nrOfCol(),256);<span class="comment">//use only byte images for max voting</span></div>
+<div class="line"><a name="l00679"></a><span class="lineno">  679</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iclass=0;iclass<class_opt.size();++iclass)</div>
+<div class="line"><a name="l00680"></a><span class="lineno">  680</span>       assert(class_opt[iclass]<maxBuffer.size());</div>
+<div class="line"><a name="l00681"></a><span class="lineno">  681</span>   }</div>
+<div class="line"><a name="l00682"></a><span class="lineno">  682</span>   <span class="keywordtype">int</span> jb=0;</div>
+<div class="line"><a name="l00683"></a><span class="lineno">  683</span>   <span class="keywordtype">double</span> readRow=0;</div>
+<div class="line"><a name="l00684"></a><span class="lineno">  684</span>   <span class="keywordtype">double</span> readCol=0;</div>
+<div class="line"><a name="l00685"></a><span class="lineno">  685</span>   <span class="keywordtype">double</span> lowerCol=0;</div>
+<div class="line"><a name="l00686"></a><span class="lineno">  686</span>   <span class="keywordtype">double</span> upperCol=0;</div>
+<div class="line"><a name="l00687"></a><span class="lineno">  687</span>   <span class="keyword">const</span> <span class="keywordtype">char</span>* pszMessage;</div>
+<div class="line"><a name="l00688"></a><span class="lineno">  688</span>   <span class="keywordtype">void</span>* pProgressArg=NULL;</div>
+<div class="line"><a name="l00689"></a><span class="lineno">  689</span>   GDALProgressFunc pfnProgress=GDALTermProgress;</div>
+<div class="line"><a name="l00690"></a><span class="lineno">  690</span>   <span class="keywordtype">double</span> progress=0;</div>
+<div class="line"><a name="l00691"></a><span class="lineno">  691</span>   pfnProgress(progress,pszMessage,pProgressArg);</div>
+<div class="line"><a name="l00692"></a><span class="lineno">  692</span>   <span class="keywordflow">for</span>(<span class="keywordtype">int</span> irow=0;irow<imgWriter.nrOfRow();++irow){</div>
+<div class="line"><a name="l00693"></a><span class="lineno">  693</span>     vector<float> lineMask;</div>
+<div class="line"><a name="l00694"></a><span class="lineno">  694</span>     <a class="code" href="classVector2d.html">Vector2d< vector<double></a> > storeBuffer;</div>
+<div class="line"><a name="l00695"></a><span class="lineno">  695</span>     vector<bool> writeValid(ncol);</div>
+<div class="line"><a name="l00696"></a><span class="lineno">  696</span> </div>
+<div class="line"><a name="l00697"></a><span class="lineno">  697</span>     <span class="comment">//convert irow to geo</span></div>
+<div class="line"><a name="l00698"></a><span class="lineno">  698</span>     <span class="keywordtype">double</span> x=0;</div>
+<div class="line"><a name="l00699"></a><span class="lineno">  699</span>     <span class="keywordtype">double</span> y=0;</div>
+<div class="line"><a name="l00700"></a><span class="lineno">  700</span>     imgWriter.image2geo(0,irow,x,y);</div>
+<div class="line"><a name="l00701"></a><span class="lineno">  701</span> </div>
+<div class="line"><a name="l00702"></a><span class="lineno">  702</span> </div>
+<div class="line"><a name="l00703"></a><span class="lineno">  703</span>     <span class="keywordflow">if</span>(cruleMap[crule_opt[0]]==crule::mean ||</div>
+<div class="line"><a name="l00704"></a><span class="lineno">  704</span>        cruleMap[crule_opt[0]]==crule::median ||</div>
+<div class="line"><a name="l00705"></a><span class="lineno">  705</span>        cruleMap[crule_opt[0]]==crule::sum ||</div>
+<div class="line"><a name="l00706"></a><span class="lineno">  706</span>        cruleMap[crule_opt[0]]==crule::minallbands ||</div>
+<div class="line"><a name="l00707"></a><span class="lineno">  707</span>        cruleMap[crule_opt[0]]==crule::maxallbands ||</div>
+<div class="line"><a name="l00708"></a><span class="lineno">  708</span>        cruleMap[crule_opt[0]]==crule::stdev)</div>
+<div class="line"><a name="l00709"></a><span class="lineno">  709</span>       storeBuffer.resize(nband,ncol);</div>
+<div class="line"><a name="l00710"></a><span class="lineno">  710</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> icol=0;icol<imgWriter.nrOfCol();++icol){</div>
+<div class="line"><a name="l00711"></a><span class="lineno">  711</span>       writeValid[icol]=<span class="keyword">false</span>;</div>
+<div class="line"><a name="l00712"></a><span class="lineno">  712</span>       fileBuffer[icol]=0;</div>
+<div class="line"><a name="l00713"></a><span class="lineno">  713</span>       <span class="keywordflow">if</span>(cruleMap[crule_opt[0]]==crule::mode){<span class="comment">//max voting</span></div>
+<div class="line"><a name="l00714"></a><span class="lineno">  714</span>         <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iclass=0;iclass<256;++iclass)</div>
+<div class="line"><a name="l00715"></a><span class="lineno">  715</span>           maxBuffer[icol][iclass]=0;</div>
+<div class="line"><a name="l00716"></a><span class="lineno">  716</span>       }</div>
+<div class="line"><a name="l00717"></a><span class="lineno">  717</span>       <span class="keywordflow">else</span>{</div>
+<div class="line"><a name="l00718"></a><span class="lineno">  718</span>         <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iband=0;iband<nband;++iband)</div>
+<div class="line"><a name="l00719"></a><span class="lineno">  719</span>           writeBuffer[iband][icol]=dstnodata_opt[0];</div>
+<div class="line"><a name="l00720"></a><span class="lineno">  720</span>       }</div>
+<div class="line"><a name="l00721"></a><span class="lineno">  721</span>     }</div>
+<div class="line"><a name="l00722"></a><span class="lineno">  722</span> </div>
+<div class="line"><a name="l00723"></a><span class="lineno">  723</span>     <span class="keywordtype">double</span> oldRowMask=-1;<span class="comment">//keep track of row mask to optimize number of line readings</span></div>
+<div class="line"><a name="l00724"></a><span class="lineno">  724</span> </div>
+<div class="line"><a name="l00725"></a><span class="lineno">  725</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> ifile=0;ifile<input_opt.size();++ifile){</div>
+<div class="line"><a name="l00726"></a><span class="lineno">  726</span>       <span class="comment">//imgReader already open...</span></div>
+<div class="line"><a name="l00727"></a><span class="lineno">  727</span>       <span class="comment">// try{</span></div>
+<div class="line"><a name="l00728"></a><span class="lineno">  728</span>       <span class="comment">//   imgReader.open(input_opt[ifile]);</span></div>
+<div class="line"><a name="l00729"></a><span class="lineno">  729</span>       <span class="comment">// }</span></div>
+<div class="line"><a name="l00730"></a><span class="lineno">  730</span>       <span class="comment">// catch(string error){</span></div>
+<div class="line"><a name="l00731"></a><span class="lineno">  731</span>       <span class="comment">//   cout << error << endl;</span></div>
+<div class="line"><a name="l00732"></a><span class="lineno">  732</span>       <span class="comment">// }</span></div>
+<div class="line"><a name="l00733"></a><span class="lineno">  733</span>       <span class="comment">// assert(imgReader.getDataType()==theType);</span></div>
+<div class="line"><a name="l00734"></a><span class="lineno">  734</span>       assert(imgReader[ifile].nrOfBand()>=nband);</div>
+<div class="line"><a name="l00735"></a><span class="lineno">  735</span>       <span class="keywordflow">if</span>(!imgReader[ifile].covers(minULX,maxULY,maxLRX,minLRY)){</div>
+<div class="line"><a name="l00736"></a><span class="lineno">  736</span>         <span class="comment">// imgReader.close();</span></div>
+<div class="line"><a name="l00737"></a><span class="lineno">  737</span>         <span class="keywordflow">continue</span>;</div>
+<div class="line"><a name="l00738"></a><span class="lineno">  738</span>       }</div>
+<div class="line"><a name="l00739"></a><span class="lineno">  739</span>       <span class="keywordtype">double</span> uli,ulj,lri,lrj;</div>
+<div class="line"><a name="l00740"></a><span class="lineno">  740</span>       imgReader[ifile].geo2image(minULX+(magic_x-1.0)*imgReader[ifile].getDeltaX(),maxULY-(magic_y-1.0)*imgReader[ifile].getDeltaY(),uli,ulj);</div>
+<div class="line"><a name="l00741"></a><span class="lineno">  741</span>       imgReader[ifile].geo2image(maxLRX+(magic_x-2.0)*imgReader[ifile].getDeltaX(),minLRY-(magic_y-2.0)*imgReader[ifile].getDeltaY(),lri,lrj);</div>
+<div class="line"><a name="l00742"></a><span class="lineno">  742</span>       uli=floor(uli);</div>
+<div class="line"><a name="l00743"></a><span class="lineno">  743</span>       ulj=floor(ulj);</div>
+<div class="line"><a name="l00744"></a><span class="lineno">  744</span>       lri=floor(lri);</div>
+<div class="line"><a name="l00745"></a><span class="lineno">  745</span>       lrj=floor(lrj);</div>
+<div class="line"><a name="l00746"></a><span class="lineno">  746</span>         </div>
+<div class="line"><a name="l00747"></a><span class="lineno">  747</span>       <span class="keywordtype">double</span> startCol=uli;</div>
+<div class="line"><a name="l00748"></a><span class="lineno">  748</span>       <span class="keywordtype">double</span> endCol=lri;</div>
+<div class="line"><a name="l00749"></a><span class="lineno">  749</span>       <span class="keywordflow">if</span>(uli<0)</div>
+<div class="line"><a name="l00750"></a><span class="lineno">  750</span>         startCol=0;</div>
+<div class="line"><a name="l00751"></a><span class="lineno">  751</span>       <span class="keywordflow">else</span> <span class="keywordflow">if</span>(uli>=imgReader[ifile].nrOfCol())</div>
+<div class="line"><a name="l00752"></a><span class="lineno">  752</span>         startCol=imgReader[ifile].nrOfCol()-1;</div>
+<div class="line"><a name="l00753"></a><span class="lineno">  753</span>       <span class="keywordflow">if</span>(lri<0)</div>
+<div class="line"><a name="l00754"></a><span class="lineno">  754</span>         endCol=0;</div>
+<div class="line"><a name="l00755"></a><span class="lineno">  755</span>       <span class="keywordflow">else</span> <span class="keywordflow">if</span>(lri>=imgReader[ifile].nrOfCol())</div>
+<div class="line"><a name="l00756"></a><span class="lineno">  756</span>         endCol=imgReader[ifile].nrOfCol()-1;</div>
+<div class="line"><a name="l00757"></a><span class="lineno">  757</span>       <span class="keywordtype">int</span> readncol=endCol-startCol+1;</div>
+<div class="line"><a name="l00758"></a><span class="lineno">  758</span> </div>
+<div class="line"><a name="l00759"></a><span class="lineno">  759</span>       <span class="comment">//lookup corresponding row for irow in this file</span></div>
+<div class="line"><a name="l00760"></a><span class="lineno">  760</span>       imgReader[ifile].geo2image(x,y,readCol,readRow);</div>
+<div class="line"><a name="l00761"></a><span class="lineno">  761</span>       <span class="keywordflow">if</span>(readRow<0||readRow>=imgReader[ifile].nrOfRow()){</div>
+<div class="line"><a name="l00762"></a><span class="lineno">  762</span>         <span class="comment">// imgReader.close();</span></div>
+<div class="line"><a name="l00763"></a><span class="lineno">  763</span>         <span class="keywordflow">continue</span>;</div>
+<div class="line"><a name="l00764"></a><span class="lineno">  764</span>       }</div>
+<div class="line"><a name="l00765"></a><span class="lineno">  765</span>       <span class="comment">// for(int iband=0;iband<imgReader.nrOfBand();++iband){</span></div>
+<div class="line"><a name="l00766"></a><span class="lineno">  766</span>       <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iband=0;iband<nband;++iband){</div>
+<div class="line"><a name="l00767"></a><span class="lineno">  767</span>     <span class="keywordtype">int</span> readBand=(band_opt.size()>iband)? band_opt[iband] : iband;</div>
+<div class="line"><a name="l00768"></a><span class="lineno">  768</span>         <span class="comment">// readBuffer[iband].resize(readncol);</span></div>
+<div class="line"><a name="l00769"></a><span class="lineno">  769</span>     <span class="keywordflow">try</span>{</div>
+<div class="line"><a name="l00770"></a><span class="lineno">  770</span>           imgReader[ifile].readData(readBuffer[ifile][iband],GDT_Float64,startCol,endCol,readRow,readBand,theResample);</div>
+<div class="line"><a name="l00771"></a><span class="lineno">  771</span>     }</div>
+<div class="line"><a name="l00772"></a><span class="lineno">  772</span>     <span class="keywordflow">catch</span>(<span class="keywordtype">string</span> error){</div>
+<div class="line"><a name="l00773"></a><span class="lineno">  773</span>       cerr << <span class="stringliteral">"error reading image "</span> << input_opt[ifile] << <span class="stringliteral">": "</span> << endl;</div>
+<div class="line"><a name="l00774"></a><span class="lineno">  774</span>       <span class="keywordflow">throw</span>;</div>
+<div class="line"><a name="l00775"></a><span class="lineno">  775</span>     }</div>
+<div class="line"><a name="l00776"></a><span class="lineno">  776</span>       }</div>
+<div class="line"><a name="l00777"></a><span class="lineno">  777</span>         </div>
+<div class="line"><a name="l00778"></a><span class="lineno">  778</span>       <span class="keywordflow">for</span>(<span class="keywordtype">int</span> ib=0;ib<ncol;++ib){</div>
+<div class="line"><a name="l00779"></a><span class="lineno">  779</span>         imgWriter.image2geo(ib,irow,x,y);</div>
+<div class="line"><a name="l00780"></a><span class="lineno">  780</span>     <span class="comment">//check mask first</span></div>
+<div class="line"><a name="l00781"></a><span class="lineno">  781</span>     <span class="keywordtype">bool</span> valid=<span class="keyword">true</span>;</div>
+<div class="line"><a name="l00782"></a><span class="lineno">  782</span>     <span class="keywordflow">if</span>(mask_opt.size()){</div>
+<div class="line"><a name="l00783"></a><span class="lineno">  783</span>       <span class="comment">//read mask</span></div>
+<div class="line"><a name="l00784"></a><span class="lineno">  784</span>       <span class="keywordtype">double</span> colMask=0;</div>
+<div class="line"><a name="l00785"></a><span class="lineno">  785</span>       <span class="keywordtype">double</span> rowMask=0;</div>
+<div class="line"><a name="l00786"></a><span class="lineno">  786</span> </div>
+<div class="line"><a name="l00787"></a><span class="lineno">  787</span>       maskReader.geo2image(x,y,colMask,rowMask);</div>
+<div class="line"><a name="l00788"></a><span class="lineno">  788</span>       colMask=<span class="keyword">static_cast<</span><span class="keywordtype">int</span><span class="keyword">></span>(colMask);</div>
+<div class="line"><a name="l00789"></a><span class="lineno">  789</span>       rowMask=<span class="keyword">static_cast<</span><span class="keywordtype">int</span><span class="keyword">></span>(rowMask);</div>
+<div class="line"><a name="l00790"></a><span class="lineno">  790</span>       <span class="keywordflow">if</span>(rowMask>=0&&rowMask<maskReader.nrOfRow()&&colMask>=0&&colMask<maskReader.nrOfCol()){</div>
+<div class="line"><a name="l00791"></a><span class="lineno">  791</span>         <span class="keywordflow">if</span>(static_cast<int>(rowMask)!=<span class="keyword">static_cast<</span><span class="keywordtype">int</span><span class="keyword">></span>(oldRowMask)){</div>
+<div class="line"><a name="l00792"></a><span class="lineno">  792</span> </div>
+<div class="line"><a name="l00793"></a><span class="lineno">  793</span>           assert(rowMask>=0&&rowMask<maskReader.nrOfRow());</div>
+<div class="line"><a name="l00794"></a><span class="lineno">  794</span>           <span class="keywordflow">try</span>{</div>
+<div class="line"><a name="l00795"></a><span class="lineno">  795</span>         maskReader.readData(lineMask,GDT_Float32,static_cast<int>(rowMask),mskband_opt[0]);</div>
+<div class="line"><a name="l00796"></a><span class="lineno">  796</span>           }</div>
+<div class="line"><a name="l00797"></a><span class="lineno">  797</span>           <span class="keywordflow">catch</span>(<span class="keywordtype">string</span> errorstring){</div>
+<div class="line"><a name="l00798"></a><span class="lineno">  798</span>         cerr << errorstring << endl;</div>
+<div class="line"><a name="l00799"></a><span class="lineno">  799</span>         exit(1);</div>
+<div class="line"><a name="l00800"></a><span class="lineno">  800</span>           }</div>
+<div class="line"><a name="l00801"></a><span class="lineno">  801</span>           <span class="keywordflow">catch</span>(...){</div>
+<div class="line"><a name="l00802"></a><span class="lineno">  802</span>         cerr << <span class="stringliteral">"error catched"</span> << std::endl;</div>
+<div class="line"><a name="l00803"></a><span class="lineno">  803</span>         exit(3);</div>
+<div class="line"><a name="l00804"></a><span class="lineno">  804</span>           }</div>
+<div class="line"><a name="l00805"></a><span class="lineno">  805</span>           oldRowMask=rowMask;</div>
+<div class="line"><a name="l00806"></a><span class="lineno">  806</span>         }</div>
+<div class="line"><a name="l00807"></a><span class="lineno">  807</span>         <span class="keywordflow">if</span>(lineMask[colMask]==msknodata_opt[0])</div>
+<div class="line"><a name="l00808"></a><span class="lineno">  808</span>           valid=<span class="keyword">false</span>;</div>
+<div class="line"><a name="l00809"></a><span class="lineno">  809</span>       }</div>
+<div class="line"><a name="l00810"></a><span class="lineno">  810</span>     }</div>
+<div class="line"><a name="l00811"></a><span class="lineno">  811</span> </div>
+<div class="line"><a name="l00812"></a><span class="lineno">  812</span>     <span class="keywordflow">if</span>(!valid)</div>
+<div class="line"><a name="l00813"></a><span class="lineno">  813</span>       <span class="keywordflow">continue</span>;</div>
+<div class="line"><a name="l00814"></a><span class="lineno">  814</span> </div>
+<div class="line"><a name="l00815"></a><span class="lineno">  815</span>         <span class="comment">//lookup corresponding row for irow in this file</span></div>
+<div class="line"><a name="l00816"></a><span class="lineno">  816</span>         imgReader[ifile].geo2image(x,y,readCol,readRow);</div>
+<div class="line"><a name="l00817"></a><span class="lineno">  817</span>         <span class="keywordflow">if</span>(readCol<0||readCol>=imgReader[ifile].nrOfCol())</div>
+<div class="line"><a name="l00818"></a><span class="lineno">  818</span>           <span class="keywordflow">continue</span>;</div>
+<div class="line"><a name="l00819"></a><span class="lineno">  819</span>         <span class="keywordtype">double</span> val_current=0;</div>
+<div class="line"><a name="l00820"></a><span class="lineno">  820</span>         <span class="keywordtype">double</span> val_new=0;</div>
+<div class="line"><a name="l00821"></a><span class="lineno">  821</span>         <span class="keywordtype">bool</span> readValid=<span class="keyword">true</span>;</div>
+<div class="line"><a name="l00822"></a><span class="lineno">  822</span>         <span class="keywordflow">switch</span>(theResample){</div>
+<div class="line"><a name="l00823"></a><span class="lineno">  823</span>         <span class="keywordflow">case</span>(BILINEAR):</div>
+<div class="line"><a name="l00824"></a><span class="lineno">  824</span>           lowerCol=readCol-0.5;</div>
+<div class="line"><a name="l00825"></a><span class="lineno">  825</span>           lowerCol=<span class="keyword">static_cast<</span><span class="keywordtype">int</span><span class="keyword">></span>(lowerCol);</div>
+<div class="line"><a name="l00826"></a><span class="lineno">  826</span>           upperCol=readCol+0.5;</div>
+<div class="line"><a name="l00827"></a><span class="lineno">  827</span>           upperCol=<span class="keyword">static_cast<</span><span class="keywordtype">int</span><span class="keyword">></span>(upperCol);</div>
+<div class="line"><a name="l00828"></a><span class="lineno">  828</span>           <span class="keywordflow">if</span>(lowerCol<0)</div>
+<div class="line"><a name="l00829"></a><span class="lineno">  829</span>             lowerCol=0;</div>
+<div class="line"><a name="l00830"></a><span class="lineno">  830</span>           <span class="keywordflow">if</span>(upperCol>=imgReader[ifile].nrOfCol())</div>
+<div class="line"><a name="l00831"></a><span class="lineno">  831</span>             upperCol=imgReader[ifile].nrOfCol()-1;</div>
+<div class="line"><a name="l00832"></a><span class="lineno">  832</span>           <span class="keywordflow">for</span>(<span class="keywordtype">int</span> vband=0;vband<bndnodata_opt.size();++vband){</div>
+<div class="line"><a name="l00833"></a><span class="lineno">  833</span>             val_new=(readCol-0.5-lowerCol)*readBuffer[ifile][bndnodata_opt[vband]][upperCol-startCol]+(1-readCol+0.5+lowerCol)*readBuffer[ifile][bndnodata_opt[vband]][lowerCol-startCol];</div>
+<div class="line"><a name="l00834"></a><span class="lineno">  834</span>         <span class="keywordflow">if</span>(minValue_opt.size()>vband){</div>
+<div class="line"><a name="l00835"></a><span class="lineno">  835</span>           <span class="keywordflow">if</span>(val_new<=minValue_opt[vband]){</div>
+<div class="line"><a name="l00836"></a><span class="lineno">  836</span>         readValid=<span class="keyword">false</span>;</div>
+<div class="line"><a name="l00837"></a><span class="lineno">  837</span>         <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l00838"></a><span class="lineno">  838</span>           }</div>
+<div class="line"><a name="l00839"></a><span class="lineno">  839</span>         }</div>
+<div class="line"><a name="l00840"></a><span class="lineno">  840</span>         <span class="keywordflow">if</span>(maxValue_opt.size()>vband){</div>
+<div class="line"><a name="l00841"></a><span class="lineno">  841</span>           <span class="keywordflow">if</span>(val_new>=maxValue_opt[vband]){</div>
+<div class="line"><a name="l00842"></a><span class="lineno">  842</span>         readValid=<span class="keyword">false</span>;</div>
+<div class="line"><a name="l00843"></a><span class="lineno">  843</span>         <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l00844"></a><span class="lineno">  844</span>           }</div>
+<div class="line"><a name="l00845"></a><span class="lineno">  845</span>         }</div>
+<div class="line"><a name="l00846"></a><span class="lineno">  846</span>         <span class="keywordflow">if</span>(srcnodata_opt.size()>vband){</div>
+<div class="line"><a name="l00847"></a><span class="lineno">  847</span>           <span class="keywordflow">if</span>(val_new==srcnodata_opt[vband]){</div>
+<div class="line"><a name="l00848"></a><span class="lineno">  848</span>         readValid=<span class="keyword">false</span>;</div>
+<div class="line"><a name="l00849"></a><span class="lineno">  849</span>         <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l00850"></a><span class="lineno">  850</span>           }</div>
+<div class="line"><a name="l00851"></a><span class="lineno">  851</span>         }</div>
+<div class="line"><a name="l00852"></a><span class="lineno">  852</span>       }</div>
+<div class="line"><a name="l00853"></a><span class="lineno">  853</span>           <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l00854"></a><span class="lineno">  854</span>         <span class="keywordflow">default</span>:</div>
+<div class="line"><a name="l00855"></a><span class="lineno">  855</span>           readCol=<span class="keyword">static_cast<</span><span class="keywordtype">int</span><span class="keyword">></span>(readCol);</div>
+<div class="line"><a name="l00856"></a><span class="lineno">  856</span>           <span class="keywordflow">for</span>(<span class="keywordtype">int</span> vband=0;vband<bndnodata_opt.size();++vband){</div>
+<div class="line"><a name="l00857"></a><span class="lineno">  857</span>             val_new=readBuffer[ifile][bndnodata_opt[vband]][readCol-startCol];</div>
+<div class="line"><a name="l00858"></a><span class="lineno">  858</span>         <span class="keywordflow">if</span>(minValue_opt.size()>vband){</div>
+<div class="line"><a name="l00859"></a><span class="lineno">  859</span>           <span class="keywordflow">if</span>(val_new<=minValue_opt[vband]){</div>
+<div class="line"><a name="l00860"></a><span class="lineno">  860</span>         readValid=<span class="keyword">false</span>;</div>
+<div class="line"><a name="l00861"></a><span class="lineno">  861</span>         <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l00862"></a><span class="lineno">  862</span>           }</div>
+<div class="line"><a name="l00863"></a><span class="lineno">  863</span>         }</div>
+<div class="line"><a name="l00864"></a><span class="lineno">  864</span>         <span class="keywordflow">if</span>(maxValue_opt.size()>vband){</div>
+<div class="line"><a name="l00865"></a><span class="lineno">  865</span>           <span class="keywordflow">if</span>(val_new>=maxValue_opt[vband]){</div>
+<div class="line"><a name="l00866"></a><span class="lineno">  866</span>         readValid=<span class="keyword">false</span>;</div>
+<div class="line"><a name="l00867"></a><span class="lineno">  867</span>         <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l00868"></a><span class="lineno">  868</span>           }</div>
+<div class="line"><a name="l00869"></a><span class="lineno">  869</span>         }</div>
+<div class="line"><a name="l00870"></a><span class="lineno">  870</span>         <span class="keywordflow">if</span>(srcnodata_opt.size()>vband){</div>
+<div class="line"><a name="l00871"></a><span class="lineno">  871</span>           <span class="keywordflow">if</span>(val_new==srcnodata_opt[vband]){</div>
+<div class="line"><a name="l00872"></a><span class="lineno">  872</span>         readValid=<span class="keyword">false</span>;</div>
+<div class="line"><a name="l00873"></a><span class="lineno">  873</span>         <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l00874"></a><span class="lineno">  874</span>           }</div>
+<div class="line"><a name="l00875"></a><span class="lineno">  875</span>         }</div>
+<div class="line"><a name="l00876"></a><span class="lineno">  876</span>       }</div>
+<div class="line"><a name="l00877"></a><span class="lineno">  877</span>           <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l00878"></a><span class="lineno">  878</span>     }</div>
+<div class="line"><a name="l00879"></a><span class="lineno">  879</span>     <span class="keywordflow">if</span>(readValid){</div>
+<div class="line"><a name="l00880"></a><span class="lineno">  880</span>       <span class="keywordflow">if</span>(file_opt[0]==1)</div>
+<div class="line"><a name="l00881"></a><span class="lineno">  881</span>         ++fileBuffer[ib];</div>
+<div class="line"><a name="l00882"></a><span class="lineno">  882</span>           <span class="keywordflow">if</span>(writeValid[ib]){</div>
+<div class="line"><a name="l00883"></a><span class="lineno">  883</span>             <span class="keywordtype">int</span> iband=0;</div>
+<div class="line"><a name="l00884"></a><span class="lineno">  884</span>         <span class="keywordflow">switch</span>(cruleMap[crule_opt[0]]){</div>
+<div class="line"><a name="l00885"></a><span class="lineno">  885</span>         <span class="keywordflow">case</span>(crule::maxndvi):{<span class="comment">//max ndvi</span></div>
+<div class="line"><a name="l00886"></a><span class="lineno">  886</span>               <span class="keywordtype">double</span> red_current=writeBuffer[ruleBand_opt[0]][ib];</div>
+<div class="line"><a name="l00887"></a><span class="lineno">  887</span>               <span class="keywordtype">double</span> nir_current=writeBuffer[ruleBand_opt[1]][ib];</div>
+<div class="line"><a name="l00888"></a><span class="lineno">  888</span>           <span class="keywordtype">double</span> ndvi_current=0;</div>
+<div class="line"><a name="l00889"></a><span class="lineno">  889</span>               <span class="keywordflow">if</span>(red_current+nir_current>0&&red_current>=0&&nir_current>=0)</div>
+<div class="line"><a name="l00890"></a><span class="lineno">  890</span>                 ndvi_current=(nir_current-red_current)/(nir_current+red_current);</div>
+<div class="line"><a name="l00891"></a><span class="lineno">  891</span>           <span class="keywordtype">double</span> ndvi_new=0;</div>
+<div class="line"><a name="l00892"></a><span class="lineno">  892</span>               <span class="keywordtype">double</span> red_new=0;</div>
+<div class="line"><a name="l00893"></a><span class="lineno">  893</span>               <span class="keywordtype">double</span> nir_new=0;</div>
+<div class="line"><a name="l00894"></a><span class="lineno">  894</span>               <span class="keywordflow">switch</span>(theResample){</div>
+<div class="line"><a name="l00895"></a><span class="lineno">  895</span>               <span class="keywordflow">case</span>(BILINEAR):</div>
+<div class="line"><a name="l00896"></a><span class="lineno">  896</span>                 lowerCol=readCol-0.5;</div>
+<div class="line"><a name="l00897"></a><span class="lineno">  897</span>                 lowerCol=<span class="keyword">static_cast<</span><span class="keywordtype">int</span><span class="keyword">></span>(lowerCol);</div>
+<div class="line"><a name="l00898"></a><span class="lineno">  898</span>                 upperCol=readCol+0.5;</div>
+<div class="line"><a name="l00899"></a><span class="lineno">  899</span>                 upperCol=<span class="keyword">static_cast<</span><span class="keywordtype">int</span><span class="keyword">></span>(upperCol);</div>
+<div class="line"><a name="l00900"></a><span class="lineno">  900</span>                 <span class="keywordflow">if</span>(lowerCol<0)</div>
+<div class="line"><a name="l00901"></a><span class="lineno">  901</span>                   lowerCol=0;</div>
+<div class="line"><a name="l00902"></a><span class="lineno">  902</span>                 <span class="keywordflow">if</span>(upperCol>=imgReader[ifile].nrOfCol())</div>
+<div class="line"><a name="l00903"></a><span class="lineno">  903</span>                   upperCol=imgReader[ifile].nrOfCol()-1;</div>
+<div class="line"><a name="l00904"></a><span class="lineno">  904</span>                 red_new=(readCol-0.5-lowerCol)*readBuffer[ifile][ruleBand_opt[0]][upperCol-startCol]+(1-readCol+0.5+lowerCol)*readBuffer[ifile][ruleBand_opt[0]][lowerCol-startCol];</div>
+<div class="line"><a name="l00905"></a><span class="lineno">  905</span>                 nir_new=(readCol-0.5-lowerCol)*readBuffer[ifile][ruleBand_opt[1]][upperCol-startCol]+(1-readCol+0.5+lowerCol)*readBuffer[ifile][ruleBand_opt[1]][lowerCol-startCol];</div>
+<div class="line"><a name="l00906"></a><span class="lineno">  906</span>                 <span class="keywordflow">if</span>(red_new+nir_new>0&&red_new>=0&&nir_new>=0)</div>
+<div class="line"><a name="l00907"></a><span class="lineno">  907</span>                   ndvi_new=(nir_new-red_new)/(nir_new+red_new);</div>
+<div class="line"><a name="l00908"></a><span class="lineno">  908</span>                 <span class="keywordflow">if</span>(ndvi_new>=ndvi_current){</div>
+<div class="line"><a name="l00909"></a><span class="lineno">  909</span>                   <span class="keywordflow">for</span>(iband=0;iband<nband;++iband){</div>
+<div class="line"><a name="l00910"></a><span class="lineno">  910</span>                     val_new=(readCol-0.5-lowerCol)*readBuffer[ifile][iband][upperCol-startCol]+(1-readCol+0.5+lowerCol)*readBuffer[ifile][iband][lowerCol-startCol];</div>
+<div class="line"><a name="l00911"></a><span class="lineno">  911</span>                     writeBuffer[iband][ib]=val_new;</div>
+<div class="line"><a name="l00912"></a><span class="lineno">  912</span>                   }</div>
+<div class="line"><a name="l00913"></a><span class="lineno">  913</span>           <span class="keywordflow">if</span>(file_opt[0]>1)</div>
+<div class="line"><a name="l00914"></a><span class="lineno">  914</span>             fileBuffer[ib]=ifile;</div>
+<div class="line"><a name="l00915"></a><span class="lineno">  915</span>                 }</div>
+<div class="line"><a name="l00916"></a><span class="lineno">  916</span>                 <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l00917"></a><span class="lineno">  917</span>               <span class="keywordflow">default</span>:</div>
+<div class="line"><a name="l00918"></a><span class="lineno">  918</span>                 readCol=<span class="keyword">static_cast<</span><span class="keywordtype">int</span><span class="keyword">></span>(readCol);</div>
+<div class="line"><a name="l00919"></a><span class="lineno">  919</span>                 red_new=readBuffer[ifile][ruleBand_opt[0]][readCol-startCol];</div>
+<div class="line"><a name="l00920"></a><span class="lineno">  920</span>                 nir_new=readBuffer[ifile][ruleBand_opt[1]][readCol-startCol];</div>
+<div class="line"><a name="l00921"></a><span class="lineno">  921</span>                 <span class="keywordflow">if</span>(red_new+nir_new>0&&red_new>=0&&nir_new>=0)</div>
+<div class="line"><a name="l00922"></a><span class="lineno">  922</span>                   ndvi_new=(nir_new-red_new)/(nir_new+red_new);</div>
+<div class="line"><a name="l00923"></a><span class="lineno">  923</span>                 <span class="keywordflow">if</span>(ndvi_new>=ndvi_current){</div>
+<div class="line"><a name="l00924"></a><span class="lineno">  924</span>                   <span class="keywordflow">for</span>(iband=0;iband<nband;++iband){</div>
+<div class="line"><a name="l00925"></a><span class="lineno">  925</span>                     val_new=readBuffer[ifile][iband][readCol-startCol];</div>
+<div class="line"><a name="l00926"></a><span class="lineno">  926</span>                     writeBuffer[iband][ib]=val_new;</div>
+<div class="line"><a name="l00927"></a><span class="lineno">  927</span>                   }</div>
+<div class="line"><a name="l00928"></a><span class="lineno">  928</span>           <span class="keywordflow">if</span>(file_opt[0]>1)</div>
+<div class="line"><a name="l00929"></a><span class="lineno">  929</span>             fileBuffer[ib]=ifile;</div>
+<div class="line"><a name="l00930"></a><span class="lineno">  930</span>                 }</div>
+<div class="line"><a name="l00931"></a><span class="lineno">  931</span>                 <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l00932"></a><span class="lineno">  932</span>               }</div>
+<div class="line"><a name="l00933"></a><span class="lineno">  933</span>           <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l00934"></a><span class="lineno">  934</span>             }</div>
+<div class="line"><a name="l00935"></a><span class="lineno">  935</span>         <span class="keywordflow">case</span>(crule::maxband):</div>
+<div class="line"><a name="l00936"></a><span class="lineno">  936</span>             <span class="keywordflow">case</span>(crule::minband):</div>
+<div class="line"><a name="l00937"></a><span class="lineno">  937</span>             <span class="keywordflow">case</span>(crule::validband):<span class="comment">//max,min,valid band</span></div>
+<div class="line"><a name="l00938"></a><span class="lineno">  938</span>               val_current=writeBuffer[ruleBand_opt[0]][ib];</div>
+<div class="line"><a name="l00939"></a><span class="lineno">  939</span>               <span class="keywordflow">switch</span>(theResample){</div>
+<div class="line"><a name="l00940"></a><span class="lineno">  940</span>               <span class="keywordflow">case</span>(BILINEAR):</div>
+<div class="line"><a name="l00941"></a><span class="lineno">  941</span>                 lowerCol=readCol-0.5;</div>
+<div class="line"><a name="l00942"></a><span class="lineno">  942</span>                 lowerCol=<span class="keyword">static_cast<</span><span class="keywordtype">int</span><span class="keyword">></span>(lowerCol);</div>
+<div class="line"><a name="l00943"></a><span class="lineno">  943</span>                 upperCol=readCol+0.5;</div>
+<div class="line"><a name="l00944"></a><span class="lineno">  944</span>                 upperCol=<span class="keyword">static_cast<</span><span class="keywordtype">int</span><span class="keyword">></span>(upperCol);</div>
+<div class="line"><a name="l00945"></a><span class="lineno">  945</span>                 <span class="keywordflow">if</span>(lowerCol<0)</div>
+<div class="line"><a name="l00946"></a><span class="lineno">  946</span>                   lowerCol=0;</div>
+<div class="line"><a name="l00947"></a><span class="lineno">  947</span>                 <span class="keywordflow">if</span>(upperCol>=imgReader[ifile].nrOfCol())</div>
+<div class="line"><a name="l00948"></a><span class="lineno">  948</span>                   upperCol=imgReader[ifile].nrOfCol()-1;</div>
+<div class="line"><a name="l00949"></a><span class="lineno">  949</span>                 val_new=(readCol-0.5-lowerCol)*readBuffer[ifile][ruleBand_opt[0]][upperCol-startCol]+(1-readCol+0.5+lowerCol)*readBuffer[ifile][ruleBand_opt[0]][lowerCol-startCol];</div>
+<div class="line"><a name="l00950"></a><span class="lineno">  950</span>                 val_new*=weight_opt[ifile];</div>
+<div class="line"><a name="l00951"></a><span class="lineno">  951</span>                 <span class="keywordflow">if</span>((cruleMap[crule_opt[0]]==crule::maxband&&val_new>val_current)||(cruleMap[crule_opt[0]]==crule::minband&&val_new<val_current)||(cruleMap[crule_opt[0]]==crule::validband)){<span class="comment">//&&val_new>minValue_opt[0]&&val_new<maxValue_opt[0])){</span></div>
+<div class="line"><a name="l00952"></a><span class="lineno">  952</span>                   <span class="keywordflow">for</span>(iband=0;iband<nband;++iband){</div>
+<div class="line"><a name="l00953"></a><span class="lineno">  953</span>                     val_new=(readCol-0.5-lowerCol)*readBuffer[ifile][iband][upperCol-startCol]+(1-readCol+0.5+lowerCol)*readBuffer[ifile][iband][lowerCol-startCol];</div>
+<div class="line"><a name="l00954"></a><span class="lineno">  954</span>                     val_new*=weight_opt[ifile];</div>
+<div class="line"><a name="l00955"></a><span class="lineno">  955</span>                     writeBuffer[iband][ib]=val_new;</div>
+<div class="line"><a name="l00956"></a><span class="lineno">  956</span>                   }</div>
+<div class="line"><a name="l00957"></a><span class="lineno">  957</span>           <span class="keywordflow">if</span>(file_opt[0]>1)</div>
+<div class="line"><a name="l00958"></a><span class="lineno">  958</span>             fileBuffer[ib]=ifile;</div>
+<div class="line"><a name="l00959"></a><span class="lineno">  959</span>                 }</div>
+<div class="line"><a name="l00960"></a><span class="lineno">  960</span>                 <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l00961"></a><span class="lineno">  961</span>               <span class="keywordflow">default</span>:</div>
+<div class="line"><a name="l00962"></a><span class="lineno">  962</span>                 readCol=<span class="keyword">static_cast<</span><span class="keywordtype">int</span><span class="keyword">></span>(readCol);</div>
+<div class="line"><a name="l00963"></a><span class="lineno">  963</span>                 val_new=readBuffer[ifile][ruleBand_opt[0]][readCol-startCol];</div>
+<div class="line"><a name="l00964"></a><span class="lineno">  964</span>                 val_new*=weight_opt[ifile];</div>
+<div class="line"><a name="l00965"></a><span class="lineno">  965</span>                 <span class="keywordflow">if</span>((cruleMap[crule_opt[0]]==crule::maxband&&val_new>val_current)||(cruleMap[crule_opt[0]]==crule::minband&&val_new<val_current)||(cruleMap[crule_opt[0]]==crule::validband)){<span class="comment">//&&val_new>minValue_opt[0]&&val_new<maxValue_opt[0])){</span></div>
+<div class="line"><a name="l00966"></a><span class="lineno">  966</span>                   <span class="keywordflow">for</span>(iband=0;iband<nband;++iband){</div>
+<div class="line"><a name="l00967"></a><span class="lineno">  967</span>                     val_new=readBuffer[ifile][iband][readCol-startCol];</div>
+<div class="line"><a name="l00968"></a><span class="lineno">  968</span>                     val_new*=weight_opt[ifile];</div>
+<div class="line"><a name="l00969"></a><span class="lineno">  969</span>                     writeBuffer[iband][ib]=val_new;</div>
+<div class="line"><a name="l00970"></a><span class="lineno">  970</span>                   }</div>
+<div class="line"><a name="l00971"></a><span class="lineno">  971</span>           <span class="keywordflow">if</span>(file_opt[0]>1)</div>
+<div class="line"><a name="l00972"></a><span class="lineno">  972</span>             fileBuffer[ib]=ifile;</div>
+<div class="line"><a name="l00973"></a><span class="lineno">  973</span>                 }</div>
+<div class="line"><a name="l00974"></a><span class="lineno">  974</span>                 <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l00975"></a><span class="lineno">  975</span>               }</div>
+<div class="line"><a name="l00976"></a><span class="lineno">  976</span>           <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l00977"></a><span class="lineno">  977</span>             <span class="keywordflow">case</span>(crule::mode):<span class="comment">//max voting (only for Byte images)</span></div>
+<div class="line"><a name="l00978"></a><span class="lineno">  978</span>               <span class="keywordflow">switch</span>(theResample){</div>
+<div class="line"><a name="l00979"></a><span class="lineno">  979</span>               <span class="keywordflow">case</span>(BILINEAR):</div>
+<div class="line"><a name="l00980"></a><span class="lineno">  980</span>                 lowerCol=readCol-0.5;</div>
+<div class="line"><a name="l00981"></a><span class="lineno">  981</span>                 lowerCol=<span class="keyword">static_cast<</span><span class="keywordtype">int</span><span class="keyword">></span>(lowerCol);</div>
+<div class="line"><a name="l00982"></a><span class="lineno">  982</span>                 upperCol=readCol+0.5;</div>
+<div class="line"><a name="l00983"></a><span class="lineno">  983</span>                 upperCol=<span class="keyword">static_cast<</span><span class="keywordtype">int</span><span class="keyword">></span>(upperCol);</div>
+<div class="line"><a name="l00984"></a><span class="lineno">  984</span>                 <span class="keywordflow">if</span>(lowerCol<0)</div>
+<div class="line"><a name="l00985"></a><span class="lineno">  985</span>                   lowerCol=0;</div>
+<div class="line"><a name="l00986"></a><span class="lineno">  986</span>                 <span class="keywordflow">if</span>(upperCol>=imgReader[ifile].nrOfCol())</div>
+<div class="line"><a name="l00987"></a><span class="lineno">  987</span>                   upperCol=imgReader[ifile].nrOfCol()-1;</div>
+<div class="line"><a name="l00988"></a><span class="lineno">  988</span>                 <span class="keywordflow">for</span>(iband=0;iband<nband;++iband){</div>
+<div class="line"><a name="l00989"></a><span class="lineno">  989</span>                   val_new=(readCol-0.5-lowerCol)*readBuffer[ifile][iband][upperCol-startCol]+(1-readCol+0.5+lowerCol)*readBuffer[ifile][iband][lowerCol-startCol];</div>
+<div class="line"><a name="l00990"></a><span class="lineno">  990</span>           maxBuffer[ib][val_new]=maxBuffer[ib][val_new]+weight_opt[ifile];</div>
+<div class="line"><a name="l00991"></a><span class="lineno">  991</span>                   <span class="comment">// ++(maxBuffer[ib][val_new]);</span></div>
+<div class="line"><a name="l00992"></a><span class="lineno">  992</span>                 }</div>
+<div class="line"><a name="l00993"></a><span class="lineno">  993</span>                 <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l00994"></a><span class="lineno">  994</span>               <span class="keywordflow">default</span>:</div>
+<div class="line"><a name="l00995"></a><span class="lineno">  995</span>                 readCol=<span class="keyword">static_cast<</span><span class="keywordtype">int</span><span class="keyword">></span>(readCol);</div>
+<div class="line"><a name="l00996"></a><span class="lineno">  996</span>                 <span class="keywordflow">for</span>(iband=0;iband<nband;++iband){</div>
+<div class="line"><a name="l00997"></a><span class="lineno">  997</span>                   val_new=readBuffer[ifile][iband][readCol-startCol];</div>
+<div class="line"><a name="l00998"></a><span class="lineno">  998</span>           maxBuffer[ib][val_new]=maxBuffer[ib][val_new]+weight_opt[ifile];</div>
 <div class="line"><a name="l00999"></a><span class="lineno">  999</span>         }</div>
-<div class="line"><a name="l01000"></a><span class="lineno"> 1000</span>       }</div>
-<div class="line"><a name="l01001"></a><span class="lineno"> 1001</span>       imgReader.close();</div>
-<div class="line"><a name="l01002"></a><span class="lineno"> 1002</span>     }</div>
-<div class="line"><a name="l01003"></a><span class="lineno"> 1003</span>     <span class="keywordflow">if</span>(cruleMap[crule_opt[0]]==crule::mode){</div>
-<div class="line"><a name="l01004"></a><span class="lineno"> 1004</span>       vector<short> classBuffer(imgWriter.nrOfCol());</div>
-<div class="line"><a name="l01005"></a><span class="lineno"> 1005</span>       <span class="keywordflow">if</span>(class_opt.size()>1){</div>
-<div class="line"><a name="l01006"></a><span class="lineno"> 1006</span>         <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iclass=0;iclass<class_opt.size();++iclass){</div>
-<div class="line"><a name="l01007"></a><span class="lineno"> 1007</span>           <span class="keywordflow">for</span>(<span class="keywordtype">int</span> icol=0;icol<imgWriter.nrOfCol();++icol)</div>
-<div class="line"><a name="l01008"></a><span class="lineno"> 1008</span>             classBuffer[icol]=maxBuffer[icol][class_opt[iclass]];</div>
-<div class="line"><a name="l01009"></a><span class="lineno"> 1009</span>           <span class="keywordflow">try</span>{</div>
-<div class="line"><a name="l01010"></a><span class="lineno"> 1010</span>             imgWriter.writeData(classBuffer,GDT_Int16,irow,iclass);</div>
-<div class="line"><a name="l01011"></a><span class="lineno"> 1011</span>           }</div>
-<div class="line"><a name="l01012"></a><span class="lineno"> 1012</span>           <span class="keywordflow">catch</span>(<span class="keywordtype">string</span> error){</div>
-<div class="line"><a name="l01013"></a><span class="lineno"> 1013</span>             cerr << <span class="stringliteral">"error writing image file "</span> << output_opt[0] << <span class="stringliteral">": "</span> << error << endl;</div>
-<div class="line"><a name="l01014"></a><span class="lineno"> 1014</span>             <span class="keywordflow">throw</span>;</div>
-<div class="line"><a name="l01015"></a><span class="lineno"> 1015</span>           }</div>
-<div class="line"><a name="l01016"></a><span class="lineno"> 1016</span>         }</div>
-<div class="line"><a name="l01017"></a><span class="lineno"> 1017</span>       }</div>
-<div class="line"><a name="l01018"></a><span class="lineno"> 1018</span>       <span class="keywordflow">else</span>{</div>
-<div class="line"><a name="l01019"></a><span class="lineno"> 1019</span>         <span class="keywordflow">for</span>(<span class="keywordtype">int</span> icol=0;icol<imgWriter.nrOfCol();++icol){</div>
-<div class="line"><a name="l01020"></a><span class="lineno"> 1020</span>           vector<short>::iterator maxit=maxBuffer[icol].begin();</div>
-<div class="line"><a name="l01021"></a><span class="lineno"> 1021</span>           maxit=stat.mymax(maxBuffer[icol],maxBuffer[icol].begin(),maxBuffer[icol].end());</div>
-<div class="line"><a name="l01022"></a><span class="lineno"> 1022</span>           writeBuffer[0][icol]=distance(maxBuffer[icol].begin(),maxit);</div>
-<div class="line"><a name="l01023"></a><span class="lineno"> 1023</span>       <span class="keywordflow">if</span>(file_opt[0]>1)</div>
-<div class="line"><a name="l01024"></a><span class="lineno"> 1024</span>         fileBuffer[icol]=*(maxit);</div>
-<div class="line"><a name="l01025"></a><span class="lineno"> 1025</span>         }</div>
-<div class="line"><a name="l01026"></a><span class="lineno"> 1026</span>         <span class="keywordflow">try</span>{</div>
-<div class="line"><a name="l01027"></a><span class="lineno"> 1027</span>           imgWriter.writeData(writeBuffer[0],GDT_Float64,irow,0);</div>
-<div class="line"><a name="l01028"></a><span class="lineno"> 1028</span>           <span class="keywordflow">if</span>(file_opt[0])</div>
-<div class="line"><a name="l01029"></a><span class="lineno"> 1029</span>             imgWriter.writeData(fileBuffer,GDT_Int16,irow,1);</div>
-<div class="line"><a name="l01030"></a><span class="lineno"> 1030</span>         }</div>
-<div class="line"><a name="l01031"></a><span class="lineno"> 1031</span>         <span class="keywordflow">catch</span>(<span class="keywordtype">string</span> error){</div>
-<div class="line"><a name="l01032"></a><span class="lineno"> 1032</span>           cerr << <span class="stringliteral">"error writing image file "</span> << output_opt[0] << <span class="stringliteral">": "</span> << error << endl;</div>
-<div class="line"><a name="l01033"></a><span class="lineno"> 1033</span>           <span class="keywordflow">throw</span>;</div>
-<div class="line"><a name="l01034"></a><span class="lineno"> 1034</span>         }</div>
-<div class="line"><a name="l01035"></a><span class="lineno"> 1035</span>       }</div>
-<div class="line"><a name="l01036"></a><span class="lineno"> 1036</span>     }</div>
-<div class="line"><a name="l01037"></a><span class="lineno"> 1037</span>     <span class="keywordflow">else</span>{</div>
-<div class="line"><a name="l01038"></a><span class="lineno"> 1038</span>       <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iband=0;iband<bands.size();++iband){</div>
-<div class="line"><a name="l01039"></a><span class="lineno"> 1039</span>         <span class="comment">// assert(writeBuffer[bands[iband]].size()==imgWriter.nrOfCol());</span></div>
-<div class="line"><a name="l01040"></a><span class="lineno"> 1040</span>         assert(writeBuffer[iband].size()==imgWriter.nrOfCol());</div>
-<div class="line"><a name="l01041"></a><span class="lineno"> 1041</span>         <span class="keywordflow">for</span>(<span class="keywordtype">int</span> icol=0;icol<imgWriter.nrOfCol();++icol){</div>
-<div class="line"><a name="l01042"></a><span class="lineno"> 1042</span>       <span class="keywordflow">try</span>{</div>
-<div class="line"><a name="l01043"></a><span class="lineno"> 1043</span>         <span class="keywordflow">switch</span>(cruleMap[crule_opt[0]]){</div>
-<div class="line"><a name="l01044"></a><span class="lineno"> 1044</span>         <span class="keywordflow">case</span>(crule::mean):</div>
-<div class="line"><a name="l01045"></a><span class="lineno"> 1045</span>           <span class="comment">// writeBuffer[iband][icol]=stat.mean(storeBuffer[bands[iband]][icol]);</span></div>
-<div class="line"><a name="l01046"></a><span class="lineno"> 1046</span>           writeBuffer[iband][icol]=stat.mean(storeBuffer[iband][icol]);</div>
-<div class="line"><a name="l01047"></a><span class="lineno"> 1047</span>           <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l01048"></a><span class="lineno"> 1048</span>         <span class="keywordflow">case</span>(crule::median):</div>
-<div class="line"><a name="l01049"></a><span class="lineno"> 1049</span>           <span class="comment">// writeBuffer[iband][icol]=stat.median(storeBuffer[bands[iband]][icol]);</span></div>
-<div class="line"><a name="l01050"></a><span class="lineno"> 1050</span>           writeBuffer[iband][icol]=stat.median(storeBuffer[iband][icol]);</div>
-<div class="line"><a name="l01051"></a><span class="lineno"> 1051</span>           <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l01052"></a><span class="lineno"> 1052</span>         <span class="keywordflow">case</span>(crule::sum):</div>
-<div class="line"><a name="l01053"></a><span class="lineno"> 1053</span>           <span class="comment">// writeBuffer[iband][icol]=stat.sum(storeBuffer[bands[iband]][icol]);</span></div>
-<div class="line"><a name="l01054"></a><span class="lineno"> 1054</span>           writeBuffer[iband][icol]=stat.sum(storeBuffer[iband][icol]);</div>
-<div class="line"><a name="l01055"></a><span class="lineno"> 1055</span>           <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l01056"></a><span class="lineno"> 1056</span>         <span class="keywordflow">case</span>(crule::minallbands):</div>
-<div class="line"><a name="l01057"></a><span class="lineno"> 1057</span>           <span class="comment">// writeBuffer[iband][icol]=stat.mymin(storeBuffer[bands[iband]][icol]);</span></div>
-<div class="line"><a name="l01058"></a><span class="lineno"> 1058</span>           writeBuffer[iband][icol]=stat.mymin(storeBuffer[iband][icol]);</div>
-<div class="line"><a name="l01059"></a><span class="lineno"> 1059</span>           <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l01060"></a><span class="lineno"> 1060</span>         <span class="keywordflow">case</span>(crule::maxallbands):</div>
-<div class="line"><a name="l01061"></a><span class="lineno"> 1061</span>           <span class="comment">// writeBuffer[iband][icol]=stat.mymax(storeBuffer[bands[iband]][icol]);</span></div>
-<div class="line"><a name="l01062"></a><span class="lineno"> 1062</span>           writeBuffer[iband][icol]=stat.mymax(storeBuffer[iband][icol]);</div>
-<div class="line"><a name="l01063"></a><span class="lineno"> 1063</span>           <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l01064"></a><span class="lineno"> 1064</span>         <span class="keywordflow">case</span>(crule::stdev):</div>
-<div class="line"><a name="l01065"></a><span class="lineno"> 1065</span>           <span class="comment">// writeBuffer[iband][icol]=sqrt(stat.var(storeBuffer[bands[iband]][icol]));</span></div>
-<div class="line"><a name="l01066"></a><span class="lineno"> 1066</span>           writeBuffer[iband][icol]=sqrt(stat.var(storeBuffer[iband][icol]));</div>
-<div class="line"><a name="l01067"></a><span class="lineno"> 1067</span>           <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l01068"></a><span class="lineno"> 1068</span>         <span class="keywordflow">default</span>:</div>
-<div class="line"><a name="l01069"></a><span class="lineno"> 1069</span>           <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l01000"></a><span class="lineno"> 1000</span>                 <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l01001"></a><span class="lineno"> 1001</span>           }</div>
+<div class="line"><a name="l01002"></a><span class="lineno"> 1002</span>               <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l01003"></a><span class="lineno"> 1003</span>             <span class="keywordflow">case</span>(crule::mean):<span class="comment">//mean value</span></div>
+<div class="line"><a name="l01004"></a><span class="lineno"> 1004</span>         <span class="keywordflow">case</span>(crule::median):<span class="comment">//median value</span></div>
+<div class="line"><a name="l01005"></a><span class="lineno"> 1005</span>         <span class="keywordflow">case</span>(crule::sum):<span class="comment">//sum value</span></div>
+<div class="line"><a name="l01006"></a><span class="lineno"> 1006</span>         <span class="keywordflow">case</span>(crule::minallbands):<span class="comment">//minimum for each and every band</span></div>
+<div class="line"><a name="l01007"></a><span class="lineno"> 1007</span>         <span class="keywordflow">case</span>(crule::maxallbands):<span class="comment">//maximum for each and every band</span></div>
+<div class="line"><a name="l01008"></a><span class="lineno"> 1008</span>         <span class="keywordflow">case</span>(crule::stdev):<span class="comment">//maximum for each and every band</span></div>
+<div class="line"><a name="l01009"></a><span class="lineno"> 1009</span>               <span class="keywordflow">switch</span>(theResample){</div>
+<div class="line"><a name="l01010"></a><span class="lineno"> 1010</span>               <span class="keywordflow">case</span>(BILINEAR):</div>
+<div class="line"><a name="l01011"></a><span class="lineno"> 1011</span>                 lowerCol=readCol-0.5;</div>
+<div class="line"><a name="l01012"></a><span class="lineno"> 1012</span>                 lowerCol=<span class="keyword">static_cast<</span><span class="keywordtype">int</span><span class="keyword">></span>(lowerCol);</div>
+<div class="line"><a name="l01013"></a><span class="lineno"> 1013</span>                 upperCol=readCol+0.5;</div>
+<div class="line"><a name="l01014"></a><span class="lineno"> 1014</span>                 upperCol=<span class="keyword">static_cast<</span><span class="keywordtype">int</span><span class="keyword">></span>(upperCol);</div>
+<div class="line"><a name="l01015"></a><span class="lineno"> 1015</span>                 <span class="keywordflow">if</span>(lowerCol<0)</div>
+<div class="line"><a name="l01016"></a><span class="lineno"> 1016</span>                   lowerCol=0;</div>
+<div class="line"><a name="l01017"></a><span class="lineno"> 1017</span>                 <span class="keywordflow">if</span>(upperCol>=imgReader[ifile].nrOfCol())</div>
+<div class="line"><a name="l01018"></a><span class="lineno"> 1018</span>                   upperCol=imgReader[ifile].nrOfCol()-1;</div>
+<div class="line"><a name="l01019"></a><span class="lineno"> 1019</span>                 <span class="keywordflow">for</span>(iband=0;iband<nband;++iband){</div>
+<div class="line"><a name="l01020"></a><span class="lineno"> 1020</span>                   val_new=(readCol-0.5-lowerCol)*readBuffer[ifile][iband][upperCol-startCol]+(1-readCol+0.5+lowerCol)*readBuffer[ifile][iband][lowerCol-startCol];</div>
+<div class="line"><a name="l01021"></a><span class="lineno"> 1021</span>                   val_new*=weight_opt[ifile];</div>
+<div class="line"><a name="l01022"></a><span class="lineno"> 1022</span>                   storeBuffer[iband][ib].push_back(val_new);</div>
+<div class="line"><a name="l01023"></a><span class="lineno"> 1023</span>                 }</div>
+<div class="line"><a name="l01024"></a><span class="lineno"> 1024</span>                 <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l01025"></a><span class="lineno"> 1025</span>               <span class="keywordflow">default</span>:</div>
+<div class="line"><a name="l01026"></a><span class="lineno"> 1026</span>                 readCol=<span class="keyword">static_cast<</span><span class="keywordtype">int</span><span class="keyword">></span>(readCol);</div>
+<div class="line"><a name="l01027"></a><span class="lineno"> 1027</span>                 <span class="keywordflow">for</span>(iband=0;iband<nband;++iband){</div>
+<div class="line"><a name="l01028"></a><span class="lineno"> 1028</span>                   val_new=readBuffer[ifile][iband][readCol-startCol];</div>
+<div class="line"><a name="l01029"></a><span class="lineno"> 1029</span>                   val_new*=weight_opt[ifile];</div>
+<div class="line"><a name="l01030"></a><span class="lineno"> 1030</span>                   storeBuffer[iband][ib].push_back(val_new);</div>
+<div class="line"><a name="l01031"></a><span class="lineno"> 1031</span>                   assert(ifile>0);</div>
+<div class="line"><a name="l01032"></a><span class="lineno"> 1032</span>                   <span class="comment">// assert(weight_opt[ifile]>=0);</span></div>
+<div class="line"><a name="l01033"></a><span class="lineno"> 1033</span>                   <span class="comment">// assert(storeBuffer[iband][ib].back()>=0);</span></div>
+<div class="line"><a name="l01034"></a><span class="lineno"> 1034</span>                 }</div>
+<div class="line"><a name="l01035"></a><span class="lineno"> 1035</span>                 <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l01036"></a><span class="lineno"> 1036</span>               }</div>
+<div class="line"><a name="l01037"></a><span class="lineno"> 1037</span>         <span class="keywordflow">if</span>(file_opt[0]>1)</div>
+<div class="line"><a name="l01038"></a><span class="lineno"> 1038</span>           fileBuffer[ib]=ifile;</div>
+<div class="line"><a name="l01039"></a><span class="lineno"> 1039</span>           <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l01040"></a><span class="lineno"> 1040</span>         <span class="keywordflow">case</span>(crule::overwrite):</div>
+<div class="line"><a name="l01041"></a><span class="lineno"> 1041</span>         <span class="keywordflow">default</span>:</div>
+<div class="line"><a name="l01042"></a><span class="lineno"> 1042</span>               <span class="keywordflow">switch</span>(theResample){</div>
+<div class="line"><a name="l01043"></a><span class="lineno"> 1043</span>               <span class="keywordflow">case</span>(BILINEAR):</div>
+<div class="line"><a name="l01044"></a><span class="lineno"> 1044</span>                 lowerCol=readCol-0.5;</div>
+<div class="line"><a name="l01045"></a><span class="lineno"> 1045</span>                 lowerCol=<span class="keyword">static_cast<</span><span class="keywordtype">int</span><span class="keyword">></span>(lowerCol);</div>
+<div class="line"><a name="l01046"></a><span class="lineno"> 1046</span>                 upperCol=readCol+0.5;</div>
+<div class="line"><a name="l01047"></a><span class="lineno"> 1047</span>                 upperCol=<span class="keyword">static_cast<</span><span class="keywordtype">int</span><span class="keyword">></span>(upperCol);</div>
+<div class="line"><a name="l01048"></a><span class="lineno"> 1048</span>                 <span class="keywordflow">if</span>(lowerCol<0)</div>
+<div class="line"><a name="l01049"></a><span class="lineno"> 1049</span>                   lowerCol=0;</div>
+<div class="line"><a name="l01050"></a><span class="lineno"> 1050</span>                 <span class="keywordflow">if</span>(upperCol>=imgReader[ifile].nrOfCol())</div>
+<div class="line"><a name="l01051"></a><span class="lineno"> 1051</span>                   upperCol=imgReader[ifile].nrOfCol()-1;</div>
+<div class="line"><a name="l01052"></a><span class="lineno"> 1052</span>                 <span class="keywordflow">for</span>(iband=0;iband<nband;++iband){</div>
+<div class="line"><a name="l01053"></a><span class="lineno"> 1053</span>                   val_new=(readCol-0.5-lowerCol)*readBuffer[ifile][iband][upperCol-startCol]+(1-readCol+0.5+lowerCol)*readBuffer[ifile][iband][lowerCol-startCol];</div>
+<div class="line"><a name="l01054"></a><span class="lineno"> 1054</span>                   val_new*=weight_opt[ifile];</div>
+<div class="line"><a name="l01055"></a><span class="lineno"> 1055</span>                   writeBuffer[iband][ib]=val_new;</div>
+<div class="line"><a name="l01056"></a><span class="lineno"> 1056</span>                 }</div>
+<div class="line"><a name="l01057"></a><span class="lineno"> 1057</span>                 <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l01058"></a><span class="lineno"> 1058</span>               <span class="keywordflow">default</span>:</div>
+<div class="line"><a name="l01059"></a><span class="lineno"> 1059</span>                 readCol=<span class="keyword">static_cast<</span><span class="keywordtype">int</span><span class="keyword">></span>(readCol);</div>
+<div class="line"><a name="l01060"></a><span class="lineno"> 1060</span>                 <span class="keywordflow">for</span>(iband=0;iband<nband;++iband){</div>
+<div class="line"><a name="l01061"></a><span class="lineno"> 1061</span>                   val_new=readBuffer[ifile][iband][readCol-startCol];</div>
+<div class="line"><a name="l01062"></a><span class="lineno"> 1062</span>                   val_new*=weight_opt[ifile];</div>
+<div class="line"><a name="l01063"></a><span class="lineno"> 1063</span>                   writeBuffer[iband][ib]=val_new;</div>
+<div class="line"><a name="l01064"></a><span class="lineno"> 1064</span>                 }</div>
+<div class="line"><a name="l01065"></a><span class="lineno"> 1065</span>                 <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l01066"></a><span class="lineno"> 1066</span>               }</div>
+<div class="line"><a name="l01067"></a><span class="lineno"> 1067</span>         <span class="keywordflow">if</span>(file_opt[0]>1)</div>
+<div class="line"><a name="l01068"></a><span class="lineno"> 1068</span>           fileBuffer[ib]=ifile;</div>
+<div class="line"><a name="l01069"></a><span class="lineno"> 1069</span>             <span class="keywordflow">break</span>;</div>
 <div class="line"><a name="l01070"></a><span class="lineno"> 1070</span>         }</div>
 <div class="line"><a name="l01071"></a><span class="lineno"> 1071</span>       }</div>
-<div class="line"><a name="l01072"></a><span class="lineno"> 1072</span>       <span class="keywordflow">catch</span>(<span class="keywordtype">string</span> error){</div>
-<div class="line"><a name="l01073"></a><span class="lineno"> 1073</span>         <span class="keywordflow">if</span>(verbose_opt[0])</div>
-<div class="line"><a name="l01074"></a><span class="lineno"> 1074</span>           cerr << error << endl;</div>
-<div class="line"><a name="l01075"></a><span class="lineno"> 1075</span>         writeBuffer[iband][icol]=dstnodata_opt[0];</div>
-<div class="line"><a name="l01076"></a><span class="lineno"> 1076</span>         <span class="keywordflow">continue</span>;</div>
-<div class="line"><a name="l01077"></a><span class="lineno"> 1077</span>       }</div>
-<div class="line"><a name="l01078"></a><span class="lineno"> 1078</span>         }</div>
-<div class="line"><a name="l01079"></a><span class="lineno"> 1079</span>         <span class="keywordflow">try</span>{</div>
-<div class="line"><a name="l01080"></a><span class="lineno"> 1080</span>           imgWriter.writeData(writeBuffer[iband],GDT_Float64,irow,iband);</div>
-<div class="line"><a name="l01081"></a><span class="lineno"> 1081</span>         }</div>
-<div class="line"><a name="l01082"></a><span class="lineno"> 1082</span>         <span class="keywordflow">catch</span>(<span class="keywordtype">string</span> error){</div>
-<div class="line"><a name="l01083"></a><span class="lineno"> 1083</span>           cerr << error << <span class="stringliteral">" in "</span> << output_opt[0] << endl;</div>
-<div class="line"><a name="l01084"></a><span class="lineno"> 1084</span>           <span class="keywordflow">throw</span>;</div>
-<div class="line"><a name="l01085"></a><span class="lineno"> 1085</span>         }</div>
-<div class="line"><a name="l01086"></a><span class="lineno"> 1086</span>       }</div>
-<div class="line"><a name="l01087"></a><span class="lineno"> 1087</span>       <span class="keywordflow">if</span>(file_opt[0]){</div>
-<div class="line"><a name="l01088"></a><span class="lineno"> 1088</span>         <span class="keywordflow">try</span>{</div>
-<div class="line"><a name="l01089"></a><span class="lineno"> 1089</span>           imgWriter.writeData(fileBuffer,GDT_Int16,irow,bands.size());</div>
-<div class="line"><a name="l01090"></a><span class="lineno"> 1090</span>         }</div>
-<div class="line"><a name="l01091"></a><span class="lineno"> 1091</span>         <span class="keywordflow">catch</span>(<span class="keywordtype">string</span> error){</div>
-<div class="line"><a name="l01092"></a><span class="lineno"> 1092</span>           cerr << error << <span class="stringliteral">" in "</span> << output_opt[0] << endl;</div>
-<div class="line"><a name="l01093"></a><span class="lineno"> 1093</span>           <span class="keywordflow">throw</span>;</div>
-<div class="line"><a name="l01094"></a><span class="lineno"> 1094</span>         }</div>
-<div class="line"><a name="l01095"></a><span class="lineno"> 1095</span>       }</div>
-<div class="line"><a name="l01096"></a><span class="lineno"> 1096</span>     }</div>
-<div class="line"><a name="l01097"></a><span class="lineno"> 1097</span>     progress=<span class="keyword">static_cast<</span><span class="keywordtype">float</span><span class="keyword">></span>(irow+1.0)/imgWriter.nrOfRow();</div>
-<div class="line"><a name="l01098"></a><span class="lineno"> 1098</span>     pfnProgress(progress,pszMessage,pProgressArg);</div>
-<div class="line"><a name="l01099"></a><span class="lineno"> 1099</span>   }</div>
-<div class="line"><a name="l01100"></a><span class="lineno"> 1100</span>   imgWriter.close();</div>
-<div class="line"><a name="l01101"></a><span class="lineno"> 1101</span> }</div>
-<div class="line"><a name="l01102"></a><span class="lineno"> 1102</span>   </div>
+<div class="line"><a name="l01072"></a><span class="lineno"> 1072</span>       <span class="keywordflow">else</span>{</div>
+<div class="line"><a name="l01073"></a><span class="lineno"> 1073</span>             writeValid[ib]=<span class="keyword">true</span>;<span class="comment">//readValid was true</span></div>
+<div class="line"><a name="l01074"></a><span class="lineno"> 1074</span>             <span class="keywordtype">int</span> iband=0;</div>
+<div class="line"><a name="l01075"></a><span class="lineno"> 1075</span>         <span class="keywordflow">switch</span>(cruleMap[crule_opt[0]]){</div>
+<div class="line"><a name="l01076"></a><span class="lineno"> 1076</span>             <span class="keywordflow">case</span>(crule::mean):</div>
+<div class="line"><a name="l01077"></a><span class="lineno"> 1077</span>             <span class="keywordflow">case</span>(crule::median):</div>
+<div class="line"><a name="l01078"></a><span class="lineno"> 1078</span>             <span class="keywordflow">case</span>(crule::sum):</div>
+<div class="line"><a name="l01079"></a><span class="lineno"> 1079</span>             <span class="keywordflow">case</span>(crule::minallbands):</div>
+<div class="line"><a name="l01080"></a><span class="lineno"> 1080</span>             <span class="keywordflow">case</span>(crule::maxallbands):</div>
+<div class="line"><a name="l01081"></a><span class="lineno"> 1081</span>             <span class="keywordflow">case</span>(crule::stdev):</div>
+<div class="line"><a name="l01082"></a><span class="lineno"> 1082</span>               <span class="keywordflow">switch</span>(theResample){</div>
+<div class="line"><a name="l01083"></a><span class="lineno"> 1083</span>               <span class="keywordflow">case</span>(BILINEAR):</div>
+<div class="line"><a name="l01084"></a><span class="lineno"> 1084</span>                 lowerCol=readCol-0.5;</div>
+<div class="line"><a name="l01085"></a><span class="lineno"> 1085</span>                 lowerCol=<span class="keyword">static_cast<</span><span class="keywordtype">int</span><span class="keyword">></span>(lowerCol);</div>
+<div class="line"><a name="l01086"></a><span class="lineno"> 1086</span>                 upperCol=readCol+0.5;</div>
+<div class="line"><a name="l01087"></a><span class="lineno"> 1087</span>                 upperCol=<span class="keyword">static_cast<</span><span class="keywordtype">int</span><span class="keyword">></span>(upperCol);</div>
+<div class="line"><a name="l01088"></a><span class="lineno"> 1088</span>                 <span class="keywordflow">if</span>(lowerCol<0)</div>
+<div class="line"><a name="l01089"></a><span class="lineno"> 1089</span>                   lowerCol=0;</div>
+<div class="line"><a name="l01090"></a><span class="lineno"> 1090</span>                 <span class="keywordflow">if</span>(upperCol>=imgReader[ifile].nrOfCol())</div>
+<div class="line"><a name="l01091"></a><span class="lineno"> 1091</span>                   upperCol=imgReader[ifile].nrOfCol()-1;</div>
+<div class="line"><a name="l01092"></a><span class="lineno"> 1092</span>                 <span class="keywordflow">for</span>(iband=0;iband<nband;++iband){</div>
+<div class="line"><a name="l01093"></a><span class="lineno"> 1093</span>                   val_new=(readCol-0.5-lowerCol)*readBuffer[ifile][iband][upperCol-startCol]+(1-readCol+0.5+lowerCol)*readBuffer[ifile][iband][lowerCol-startCol];</div>
+<div class="line"><a name="l01094"></a><span class="lineno"> 1094</span>                   val_new*=weight_opt[ifile];</div>
+<div class="line"><a name="l01095"></a><span class="lineno"> 1095</span>                   storeBuffer[iband][ib].push_back(val_new);</div>
+<div class="line"><a name="l01096"></a><span class="lineno"> 1096</span>                 }</div>
+<div class="line"><a name="l01097"></a><span class="lineno"> 1097</span>                 <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l01098"></a><span class="lineno"> 1098</span>               <span class="keywordflow">default</span>:</div>
+<div class="line"><a name="l01099"></a><span class="lineno"> 1099</span>                 readCol=<span class="keyword">static_cast<</span><span class="keywordtype">int</span><span class="keyword">></span>(readCol);</div>
+<div class="line"><a name="l01100"></a><span class="lineno"> 1100</span>                 <span class="keywordflow">for</span>(iband=0;iband<nband;++iband){</div>
+<div class="line"><a name="l01101"></a><span class="lineno"> 1101</span>                   val_new=readBuffer[ifile][iband][readCol-startCol];</div>
+<div class="line"><a name="l01102"></a><span class="lineno"> 1102</span>                   val_new*=weight_opt[ifile];</div>
+<div class="line"><a name="l01103"></a><span class="lineno"> 1103</span>                   storeBuffer[iband][ib].push_back(val_new);</div>
+<div class="line"><a name="l01104"></a><span class="lineno"> 1104</span>                 }</div>
+<div class="line"><a name="l01105"></a><span class="lineno"> 1105</span>                 <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l01106"></a><span class="lineno"> 1106</span>               }</div>
+<div class="line"><a name="l01107"></a><span class="lineno"> 1107</span>         <span class="keywordflow">if</span>(file_opt[0]>1)</div>
+<div class="line"><a name="l01108"></a><span class="lineno"> 1108</span>           fileBuffer[ib]=ifile;</div>
+<div class="line"><a name="l01109"></a><span class="lineno"> 1109</span>         <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l01110"></a><span class="lineno"> 1110</span>             <span class="keywordflow">case</span>(crule::mode):</div>
+<div class="line"><a name="l01111"></a><span class="lineno"> 1111</span>               <span class="keywordflow">switch</span>(theResample){</div>
+<div class="line"><a name="l01112"></a><span class="lineno"> 1112</span>               <span class="keywordflow">case</span>(BILINEAR):</div>
+<div class="line"><a name="l01113"></a><span class="lineno"> 1113</span>                 lowerCol=readCol-0.5;</div>
+<div class="line"><a name="l01114"></a><span class="lineno"> 1114</span>                 lowerCol=<span class="keyword">static_cast<</span><span class="keywordtype">int</span><span class="keyword">></span>(lowerCol);</div>
+<div class="line"><a name="l01115"></a><span class="lineno"> 1115</span>                 upperCol=readCol+0.5;</div>
+<div class="line"><a name="l01116"></a><span class="lineno"> 1116</span>                 upperCol=<span class="keyword">static_cast<</span><span class="keywordtype">int</span><span class="keyword">></span>(upperCol);</div>
+<div class="line"><a name="l01117"></a><span class="lineno"> 1117</span>                 <span class="keywordflow">if</span>(lowerCol<0)</div>
+<div class="line"><a name="l01118"></a><span class="lineno"> 1118</span>                   lowerCol=0;</div>
+<div class="line"><a name="l01119"></a><span class="lineno"> 1119</span>                 <span class="keywordflow">if</span>(upperCol>=imgReader[ifile].nrOfCol())</div>
+<div class="line"><a name="l01120"></a><span class="lineno"> 1120</span>                   upperCol=imgReader[ifile].nrOfCol()-1;</div>
+<div class="line"><a name="l01121"></a><span class="lineno"> 1121</span>                 <span class="keywordflow">for</span>(iband=0;iband<nband;++iband){</div>
+<div class="line"><a name="l01122"></a><span class="lineno"> 1122</span>                   val_new=(readCol-0.5-lowerCol)*readBuffer[ifile][iband][upperCol-startCol]+(1-readCol+0.5+lowerCol)*readBuffer[ifile][iband][lowerCol-startCol];</div>
+<div class="line"><a name="l01123"></a><span class="lineno"> 1123</span>           maxBuffer[ib][val_new]=maxBuffer[ib][val_new]+weight_opt[ifile];</div>
+<div class="line"><a name="l01124"></a><span class="lineno"> 1124</span>                   <span class="comment">// ++(maxBuffer[ib][val_new]);</span></div>
+<div class="line"><a name="l01125"></a><span class="lineno"> 1125</span>         }</div>
+<div class="line"><a name="l01126"></a><span class="lineno"> 1126</span>                 <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l01127"></a><span class="lineno"> 1127</span>               <span class="keywordflow">default</span>:</div>
+<div class="line"><a name="l01128"></a><span class="lineno"> 1128</span>                 readCol=<span class="keyword">static_cast<</span><span class="keywordtype">int</span><span class="keyword">></span>(readCol);</div>
+<div class="line"><a name="l01129"></a><span class="lineno"> 1129</span>                 <span class="keywordflow">for</span>(iband=0;iband<nband;++iband){</div>
+<div class="line"><a name="l01130"></a><span class="lineno"> 1130</span>           val_new=readBuffer[ifile][iband][readCol-startCol];</div>
+<div class="line"><a name="l01131"></a><span class="lineno"> 1131</span>           maxBuffer[ib][val_new]=maxBuffer[ib][val_new]+weight_opt[ifile];</div>
+<div class="line"><a name="l01132"></a><span class="lineno"> 1132</span>         }</div>
+<div class="line"><a name="l01133"></a><span class="lineno"> 1133</span>                   <span class="comment">// ++(maxBuffer[ib][val_new]);</span></div>
+<div class="line"><a name="l01134"></a><span class="lineno"> 1134</span>                 <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l01135"></a><span class="lineno"> 1135</span>               }</div>
+<div class="line"><a name="l01136"></a><span class="lineno"> 1136</span>               <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l01137"></a><span class="lineno"> 1137</span>             <span class="keywordflow">default</span>:</div>
+<div class="line"><a name="l01138"></a><span class="lineno"> 1138</span>               <span class="keywordflow">switch</span>(theResample){</div>
+<div class="line"><a name="l01139"></a><span class="lineno"> 1139</span>               <span class="keywordflow">case</span>(BILINEAR):</div>
+<div class="line"><a name="l01140"></a><span class="lineno"> 1140</span>                 lowerCol=readCol-0.5;</div>
+<div class="line"><a name="l01141"></a><span class="lineno"> 1141</span>                 lowerCol=<span class="keyword">static_cast<</span><span class="keywordtype">int</span><span class="keyword">></span>(lowerCol);</div>
+<div class="line"><a name="l01142"></a><span class="lineno"> 1142</span>                 upperCol=readCol+0.5;</div>
+<div class="line"><a name="l01143"></a><span class="lineno"> 1143</span>                 upperCol=<span class="keyword">static_cast<</span><span class="keywordtype">int</span><span class="keyword">></span>(upperCol);</div>
+<div class="line"><a name="l01144"></a><span class="lineno"> 1144</span>                 <span class="keywordflow">if</span>(lowerCol<0)</div>
+<div class="line"><a name="l01145"></a><span class="lineno"> 1145</span>                   lowerCol=0;</div>
+<div class="line"><a name="l01146"></a><span class="lineno"> 1146</span>                 <span class="keywordflow">if</span>(upperCol>=imgReader[ifile].nrOfCol())</div>
+<div class="line"><a name="l01147"></a><span class="lineno"> 1147</span>                   upperCol=imgReader[ifile].nrOfCol()-1;</div>
+<div class="line"><a name="l01148"></a><span class="lineno"> 1148</span>                 <span class="keywordflow">for</span>(iband=0;iband<nband;++iband){</div>
+<div class="line"><a name="l01149"></a><span class="lineno"> 1149</span>                   val_new=(readCol-0.5-lowerCol)*readBuffer[ifile][iband][upperCol-startCol]+(1-readCol+0.5+lowerCol)*readBuffer[ifile][iband][lowerCol-startCol];</div>
+<div class="line"><a name="l01150"></a><span class="lineno"> 1150</span>                   val_new*=weight_opt[ifile];</div>
+<div class="line"><a name="l01151"></a><span class="lineno"> 1151</span>                   writeBuffer[iband][ib]=val_new;</div>
+<div class="line"><a name="l01152"></a><span class="lineno"> 1152</span>                 }</div>
+<div class="line"><a name="l01153"></a><span class="lineno"> 1153</span>                 <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l01154"></a><span class="lineno"> 1154</span>               <span class="keywordflow">default</span>:</div>
+<div class="line"><a name="l01155"></a><span class="lineno"> 1155</span>                 readCol=<span class="keyword">static_cast<</span><span class="keywordtype">int</span><span class="keyword">></span>(readCol);</div>
+<div class="line"><a name="l01156"></a><span class="lineno"> 1156</span>                 <span class="keywordflow">for</span>(iband=0;iband<nband;++iband){</div>
+<div class="line"><a name="l01157"></a><span class="lineno"> 1157</span>                   val_new=readBuffer[ifile][iband][readCol-startCol];</div>
+<div class="line"><a name="l01158"></a><span class="lineno"> 1158</span>                   val_new*=weight_opt[ifile];</div>
+<div class="line"><a name="l01159"></a><span class="lineno"> 1159</span>                   writeBuffer[iband][ib]=val_new;</div>
+<div class="line"><a name="l01160"></a><span class="lineno"> 1160</span>                 }</div>
+<div class="line"><a name="l01161"></a><span class="lineno"> 1161</span>                 <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l01162"></a><span class="lineno"> 1162</span>               }</div>
+<div class="line"><a name="l01163"></a><span class="lineno"> 1163</span>           <span class="keywordflow">if</span>(file_opt[0]>1)</div>
+<div class="line"><a name="l01164"></a><span class="lineno"> 1164</span>         fileBuffer[ib]=ifile;</div>
+<div class="line"><a name="l01165"></a><span class="lineno"> 1165</span>               <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l01166"></a><span class="lineno"> 1166</span>             }</div>
+<div class="line"><a name="l01167"></a><span class="lineno"> 1167</span>           }</div>
+<div class="line"><a name="l01168"></a><span class="lineno"> 1168</span>         }</div>
+<div class="line"><a name="l01169"></a><span class="lineno"> 1169</span>       }</div>
+<div class="line"><a name="l01170"></a><span class="lineno"> 1170</span>       <span class="comment">// imgReader.close();</span></div>
+<div class="line"><a name="l01171"></a><span class="lineno"> 1171</span>     }</div>
+<div class="line"><a name="l01172"></a><span class="lineno"> 1172</span>     <span class="keywordflow">if</span>(cruleMap[crule_opt[0]]==crule::mode){</div>
+<div class="line"><a name="l01173"></a><span class="lineno"> 1173</span>       vector<short> classBuffer(imgWriter.nrOfCol());</div>
+<div class="line"><a name="l01174"></a><span class="lineno"> 1174</span>       <span class="keywordflow">if</span>(class_opt.size()>1){</div>
+<div class="line"><a name="l01175"></a><span class="lineno"> 1175</span>         <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iclass=0;iclass<class_opt.size();++iclass){</div>
+<div class="line"><a name="l01176"></a><span class="lineno"> 1176</span>           <span class="keywordflow">for</span>(<span class="keywordtype">int</span> icol=0;icol<imgWriter.nrOfCol();++icol)</div>
+<div class="line"><a name="l01177"></a><span class="lineno"> 1177</span>             classBuffer[icol]=maxBuffer[icol][class_opt[iclass]];</div>
+<div class="line"><a name="l01178"></a><span class="lineno"> 1178</span>           <span class="keywordflow">try</span>{</div>
+<div class="line"><a name="l01179"></a><span class="lineno"> 1179</span>             imgWriter.writeData(classBuffer,GDT_Int16,irow,iclass);</div>
+<div class="line"><a name="l01180"></a><span class="lineno"> 1180</span>           }</div>
+<div class="line"><a name="l01181"></a><span class="lineno"> 1181</span>           <span class="keywordflow">catch</span>(<span class="keywordtype">string</span> error){</div>
+<div class="line"><a name="l01182"></a><span class="lineno"> 1182</span>             cerr << <span class="stringliteral">"error writing image file "</span> << output_opt[0] << <span class="stringliteral">": "</span> << error << endl;</div>
+<div class="line"><a name="l01183"></a><span class="lineno"> 1183</span>             <span class="keywordflow">throw</span>;</div>
+<div class="line"><a name="l01184"></a><span class="lineno"> 1184</span>           }</div>
+<div class="line"><a name="l01185"></a><span class="lineno"> 1185</span>         }</div>
+<div class="line"><a name="l01186"></a><span class="lineno"> 1186</span>       }</div>
+<div class="line"><a name="l01187"></a><span class="lineno"> 1187</span>       <span class="keywordflow">else</span>{</div>
+<div class="line"><a name="l01188"></a><span class="lineno"> 1188</span>         <span class="keywordflow">for</span>(<span class="keywordtype">int</span> icol=0;icol<imgWriter.nrOfCol();++icol){</div>
+<div class="line"><a name="l01189"></a><span class="lineno"> 1189</span>           vector<short>::iterator maxit=maxBuffer[icol].begin();</div>
+<div class="line"><a name="l01190"></a><span class="lineno"> 1190</span>           maxit=stat.mymax(maxBuffer[icol],maxBuffer[icol].begin(),maxBuffer[icol].end());</div>
+<div class="line"><a name="l01191"></a><span class="lineno"> 1191</span>           writeBuffer[0][icol]=distance(maxBuffer[icol].begin(),maxit);</div>
+<div class="line"><a name="l01192"></a><span class="lineno"> 1192</span>       <span class="keywordflow">if</span>(file_opt[0]>1)</div>
+<div class="line"><a name="l01193"></a><span class="lineno"> 1193</span>         fileBuffer[icol]=*(maxit);</div>
+<div class="line"><a name="l01194"></a><span class="lineno"> 1194</span>         }</div>
+<div class="line"><a name="l01195"></a><span class="lineno"> 1195</span>         <span class="keywordflow">try</span>{</div>
+<div class="line"><a name="l01196"></a><span class="lineno"> 1196</span>           imgWriter.writeData(writeBuffer[0],GDT_Float64,irow,0);</div>
+<div class="line"><a name="l01197"></a><span class="lineno"> 1197</span>           <span class="keywordflow">if</span>(file_opt[0])</div>
+<div class="line"><a name="l01198"></a><span class="lineno"> 1198</span>             imgWriter.writeData(fileBuffer,GDT_Int16,irow,1);</div>
+<div class="line"><a name="l01199"></a><span class="lineno"> 1199</span>         }</div>
+<div class="line"><a name="l01200"></a><span class="lineno"> 1200</span>         <span class="keywordflow">catch</span>(<span class="keywordtype">string</span> error){</div>
+<div class="line"><a name="l01201"></a><span class="lineno"> 1201</span>           cerr << <span class="stringliteral">"error writing image file "</span> << output_opt[0] << <span class="stringliteral">": "</span> << error << endl;</div>
+<div class="line"><a name="l01202"></a><span class="lineno"> 1202</span>           <span class="keywordflow">throw</span>;</div>
+<div class="line"><a name="l01203"></a><span class="lineno"> 1203</span>         }</div>
+<div class="line"><a name="l01204"></a><span class="lineno"> 1204</span>       }</div>
+<div class="line"><a name="l01205"></a><span class="lineno"> 1205</span>     }</div>
+<div class="line"><a name="l01206"></a><span class="lineno"> 1206</span>     <span class="keywordflow">else</span>{</div>
+<div class="line"><a name="l01207"></a><span class="lineno"> 1207</span>       <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iband=0;iband<bands.size();++iband){</div>
+<div class="line"><a name="l01208"></a><span class="lineno"> 1208</span>         <span class="comment">// assert(writeBuffer[bands[iband]].size()==imgWriter.nrOfCol());</span></div>
+<div class="line"><a name="l01209"></a><span class="lineno"> 1209</span>         assert(writeBuffer[iband].size()==imgWriter.nrOfCol());</div>
+<div class="line"><a name="l01210"></a><span class="lineno"> 1210</span>         <span class="keywordflow">for</span>(<span class="keywordtype">int</span> icol=0;icol<imgWriter.nrOfCol();++icol){</div>
+<div class="line"><a name="l01211"></a><span class="lineno"> 1211</span>       <span class="keywordflow">try</span>{</div>
+<div class="line"><a name="l01212"></a><span class="lineno"> 1212</span>         <span class="keywordflow">switch</span>(cruleMap[crule_opt[0]]){</div>
+<div class="line"><a name="l01213"></a><span class="lineno"> 1213</span>         <span class="keywordflow">case</span>(crule::mean):</div>
+<div class="line"><a name="l01214"></a><span class="lineno"> 1214</span>           <span class="comment">// writeBuffer[iband][icol]=stat.mean(storeBuffer[bands[iband]][icol]);</span></div>
+<div class="line"><a name="l01215"></a><span class="lineno"> 1215</span>           writeBuffer[iband][icol]=stat.mean(storeBuffer[iband][icol]);</div>
+<div class="line"><a name="l01216"></a><span class="lineno"> 1216</span>           <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l01217"></a><span class="lineno"> 1217</span>         <span class="keywordflow">case</span>(crule::median):</div>
+<div class="line"><a name="l01218"></a><span class="lineno"> 1218</span>           <span class="comment">// writeBuffer[iband][icol]=stat.median(storeBuffer[bands[iband]][icol]);</span></div>
+<div class="line"><a name="l01219"></a><span class="lineno"> 1219</span>           writeBuffer[iband][icol]=stat.median(storeBuffer[iband][icol]);</div>
+<div class="line"><a name="l01220"></a><span class="lineno"> 1220</span>           <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l01221"></a><span class="lineno"> 1221</span>         <span class="keywordflow">case</span>(crule::sum):</div>
+<div class="line"><a name="l01222"></a><span class="lineno"> 1222</span>           <span class="comment">// writeBuffer[iband][icol]=stat.sum(storeBuffer[bands[iband]][icol]);</span></div>
+<div class="line"><a name="l01223"></a><span class="lineno"> 1223</span>           writeBuffer[iband][icol]=stat.sum(storeBuffer[iband][icol]);</div>
+<div class="line"><a name="l01224"></a><span class="lineno"> 1224</span>           <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l01225"></a><span class="lineno"> 1225</span>         <span class="keywordflow">case</span>(crule::minallbands):</div>
+<div class="line"><a name="l01226"></a><span class="lineno"> 1226</span>           <span class="comment">// writeBuffer[iband][icol]=stat.mymin(storeBuffer[bands[iband]][icol]);</span></div>
+<div class="line"><a name="l01227"></a><span class="lineno"> 1227</span>           writeBuffer[iband][icol]=stat.mymin(storeBuffer[iband][icol]);</div>
+<div class="line"><a name="l01228"></a><span class="lineno"> 1228</span>           <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l01229"></a><span class="lineno"> 1229</span>         <span class="keywordflow">case</span>(crule::maxallbands):</div>
+<div class="line"><a name="l01230"></a><span class="lineno"> 1230</span>           <span class="comment">// writeBuffer[iband][icol]=stat.mymax(storeBuffer[bands[iband]][icol]);</span></div>
+<div class="line"><a name="l01231"></a><span class="lineno"> 1231</span>           writeBuffer[iband][icol]=stat.mymax(storeBuffer[iband][icol]);</div>
+<div class="line"><a name="l01232"></a><span class="lineno"> 1232</span>           <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l01233"></a><span class="lineno"> 1233</span>         <span class="keywordflow">case</span>(crule::stdev):</div>
+<div class="line"><a name="l01234"></a><span class="lineno"> 1234</span>           <span class="comment">// writeBuffer[iband][icol]=sqrt(stat.var(storeBuffer[bands[iband]][icol]));</span></div>
+<div class="line"><a name="l01235"></a><span class="lineno"> 1235</span>           writeBuffer[iband][icol]=sqrt(stat.var(storeBuffer[iband][icol]));</div>
+<div class="line"><a name="l01236"></a><span class="lineno"> 1236</span>           <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l01237"></a><span class="lineno"> 1237</span>         <span class="keywordflow">default</span>:</div>
+<div class="line"><a name="l01238"></a><span class="lineno"> 1238</span>           <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l01239"></a><span class="lineno"> 1239</span>         }</div>
+<div class="line"><a name="l01240"></a><span class="lineno"> 1240</span>       }</div>
+<div class="line"><a name="l01241"></a><span class="lineno"> 1241</span>       <span class="keywordflow">catch</span>(<span class="keywordtype">string</span> error){</div>
+<div class="line"><a name="l01242"></a><span class="lineno"> 1242</span>         <span class="keywordflow">if</span>(verbose_opt[0])</div>
+<div class="line"><a name="l01243"></a><span class="lineno"> 1243</span>           cerr << error << endl;</div>
+<div class="line"><a name="l01244"></a><span class="lineno"> 1244</span>         writeBuffer[iband][icol]=dstnodata_opt[0];</div>
+<div class="line"><a name="l01245"></a><span class="lineno"> 1245</span>         <span class="keywordflow">continue</span>;</div>
+<div class="line"><a name="l01246"></a><span class="lineno"> 1246</span>       }</div>
+<div class="line"><a name="l01247"></a><span class="lineno"> 1247</span>         }</div>
+<div class="line"><a name="l01248"></a><span class="lineno"> 1248</span>         <span class="keywordflow">try</span>{</div>
+<div class="line"><a name="l01249"></a><span class="lineno"> 1249</span>           imgWriter.writeData(writeBuffer[iband],GDT_Float64,irow,iband);</div>
+<div class="line"><a name="l01250"></a><span class="lineno"> 1250</span>         }</div>
+<div class="line"><a name="l01251"></a><span class="lineno"> 1251</span>         <span class="keywordflow">catch</span>(<span class="keywordtype">string</span> error){</div>
+<div class="line"><a name="l01252"></a><span class="lineno"> 1252</span>           cerr << error << <span class="stringliteral">" in "</span> << output_opt[0] << endl;</div>
+<div class="line"><a name="l01253"></a><span class="lineno"> 1253</span>           <span class="keywordflow">throw</span>;</div>
+<div class="line"><a name="l01254"></a><span class="lineno"> 1254</span>         }</div>
+<div class="line"><a name="l01255"></a><span class="lineno"> 1255</span>       }</div>
+<div class="line"><a name="l01256"></a><span class="lineno"> 1256</span>       <span class="keywordflow">if</span>(file_opt[0]){</div>
+<div class="line"><a name="l01257"></a><span class="lineno"> 1257</span>         <span class="keywordflow">try</span>{</div>
+<div class="line"><a name="l01258"></a><span class="lineno"> 1258</span>           imgWriter.writeData(fileBuffer,GDT_Int16,irow,bands.size());</div>
+<div class="line"><a name="l01259"></a><span class="lineno"> 1259</span>         }</div>
+<div class="line"><a name="l01260"></a><span class="lineno"> 1260</span>         <span class="keywordflow">catch</span>(<span class="keywordtype">string</span> error){</div>
+<div class="line"><a name="l01261"></a><span class="lineno"> 1261</span>           cerr << error << <span class="stringliteral">" in "</span> << output_opt[0] << endl;</div>
+<div class="line"><a name="l01262"></a><span class="lineno"> 1262</span>           <span class="keywordflow">throw</span>;</div>
+<div class="line"><a name="l01263"></a><span class="lineno"> 1263</span>         }</div>
+<div class="line"><a name="l01264"></a><span class="lineno"> 1264</span>       }</div>
+<div class="line"><a name="l01265"></a><span class="lineno"> 1265</span>     }</div>
+<div class="line"><a name="l01266"></a><span class="lineno"> 1266</span>     progress=<span class="keyword">static_cast<</span><span class="keywordtype">float</span><span class="keyword">></span>(irow+1.0)/imgWriter.nrOfRow();</div>
+<div class="line"><a name="l01267"></a><span class="lineno"> 1267</span>     pfnProgress(progress,pszMessage,pProgressArg);</div>
+<div class="line"><a name="l01268"></a><span class="lineno"> 1268</span>   }</div>
+<div class="line"><a name="l01269"></a><span class="lineno"> 1269</span>   <span class="keywordflow">if</span>(extent_opt.size()&&cut_opt.size()){</div>
+<div class="line"><a name="l01270"></a><span class="lineno"> 1270</span>     extentReader.close();</div>
+<div class="line"><a name="l01271"></a><span class="lineno"> 1271</span>   }</div>
+<div class="line"><a name="l01272"></a><span class="lineno"> 1272</span>   <span class="keywordflow">for</span>(<span class="keywordtype">int</span> ifile=0;ifile<input_opt.size();++ifile)</div>
+<div class="line"><a name="l01273"></a><span class="lineno"> 1273</span>     imgReader[ifile].close();</div>
+<div class="line"><a name="l01274"></a><span class="lineno"> 1274</span>   <span class="keywordflow">if</span>(mask_opt.size())</div>
+<div class="line"><a name="l01275"></a><span class="lineno"> 1275</span>     maskReader.close();</div>
+<div class="line"><a name="l01276"></a><span class="lineno"> 1276</span>   imgWriter.close();</div>
+<div class="line"><a name="l01277"></a><span class="lineno"> 1277</span> }</div>
+<div class="line"><a name="l01278"></a><span class="lineno"> 1278</span>   </div>
 <div class="ttc" id="classImgReaderGdal_html"><div class="ttname"><a href="classImgReaderGdal.html">ImgReaderGdal</a></div><div class="ttdef"><b>Definition:</b> <a href="ImgReaderGdal_8h_source.html#l00033">ImgReaderGdal.h:33</a></div></div>
 <div class="ttc" id="classImgWriterGdal_html"><div class="ttname"><a href="classImgWriterGdal.html">ImgWriterGdal</a></div><div class="ttdef"><b>Definition:</b> <a href="ImgWriterGdal_8h_source.html#l00032">ImgWriterGdal.h:32</a></div></div>
 <div class="ttc" id="classVector2d_html"><div class="ttname"><a href="classVector2d.html">Vector2d< double ></a></div></div>
@@ -1085,7 +1238,7 @@
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Jun 23 2015 17:09:36 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Tue Nov 3 2015 15:58:26 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/pkcomposite_8py_source.html b/doc/html/pkcomposite_8py_source.html
index 4301673..34708be 100644
--- a/doc/html/pkcomposite_8py_source.html
+++ b/doc/html/pkcomposite_8py_source.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.3</span>
+    <span id="projectnumber">2.6.4</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -129,7 +129,7 @@
 <div class="line"><a name="l00075"></a><span class="lineno">   75</span>         self.addParameter(ParameterString(self.<a class="code" href="classqgis_1_1pkcomposite_1_1pkcomposite.html#a65825f1ecd8b707d842cdc9b6bef2722">BNDNODATA</a>, <span class="stringliteral">"Band(s) in input image to check if pixel is valid (e.g., 0;1)"</span>,<span class="stringliteral">"0"</span>))</div>
 <div class="line"><a name="l00076"></a><span class="lineno">   76</span>         self.addParameter(ParameterString(self.<a class="code" href="classqgis_1_1pkcomposite_1_1pkcomposite.html#a243d2bbaac6c49959b2117a4042fa219">DSTNODATA</a>, <span class="stringliteral">"nodata value to put in output raster dataset if not valid or out of bounds"</span>,<span class="stringliteral">"0"</span>))</div>
 <div class="line"><a name="l00077"></a><span class="lineno">   77</span>         self.addParameter(ParameterString(self.<a class="code" href="classqgis_1_1pkcomposite_1_1pkcomposite.html#a3e62273f4e72fcf528d3c2a2bf2f407d">MINGUI</a>, <span class="stringliteral">"flag values smaller or equal to this value as invalid"</span>,<span class="stringliteral">"none"</span>))</div>
-<div class="line"><a name="l00078"></a><span class="lineno">   78</span>         self.addParameter(ParameterString(self.<a class="code" href="classqgis_1_1pkcomposite_1_1pkcomposite.html#a3bc122ffa6ff04ac4da3c486387bf7cc">MAXGUI</a>, <span class="stringliteral">"flag values smaller or equal to this value as invalid"</span>,<span class="stringliteral">"none"</span>))</div>
+<div class="line"><a name="l00078"></a><span class="lineno">   78</span>         self.addParameter(ParameterString(self.<a class="code" href="classqgis_1_1pkcomposite_1_1pkcomposite.html#a3bc122ffa6ff04ac4da3c486387bf7cc">MAXGUI</a>, <span class="stringliteral">"flag values larger or equal to this value as invalid"</span>,<span class="stringliteral">"none"</span>))</div>
 <div class="line"><a name="l00079"></a><span class="lineno">   79</span>         self.addParameter(ParameterSelection(self.<a class="code" href="classqgis_1_1pkcomposite_1_1pkcomposite.html#a54b2d965b3a847cc1975fd62c9c4dce1">RESAMPLE</a>,<span class="stringliteral">"resampling method"</span>,self.<a class="code" href="classqgis_1_1pkcomposite_1_1pkcomposite.html#a08c3a8025fa0f42847033e6c7bfd6585">RESAMPLE_OPTIONS</a>, 0))</div>
 <div class="line"><a name="l00080"></a><span class="lineno">   80</span>         self.addParameter(ParameterString(self.<a class="code" href="classqgis_1_1pkcomposite_1_1pkcomposite.html#a2a6835752fccf49eb80614d762310c49">EXTRA</a>,</div>
 <div class="line"><a name="l00081"></a><span class="lineno">   81</span>                           <span class="stringliteral">'Additional parameters'</span>, <span class="stringliteral">'-of GTiff'</span>, optional=<span class="keyword">True</span>))</div>
@@ -233,7 +233,7 @@
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Jun 23 2015 17:09:36 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Tue Nov 3 2015 15:58:26 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/pkcomposite__gui_2main_8cc_source.html b/doc/html/pkcomposite__gui_2main_8cc_source.html
index e2274eb..cb02e95 100644
--- a/doc/html/pkcomposite__gui_2main_8cc_source.html
+++ b/doc/html/pkcomposite__gui_2main_8cc_source.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.3</span>
+    <span id="projectnumber">2.6.4</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -88,7 +88,7 @@
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Jun 23 2015 17:09:36 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Tue Nov 3 2015 15:58:26 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/pkcomposite__gui_2mainwindow_8cc_source.html b/doc/html/pkcomposite__gui_2mainwindow_8cc_source.html
index 46c778f..39d6e9e 100644
--- a/doc/html/pkcomposite__gui_2mainwindow_8cc_source.html
+++ b/doc/html/pkcomposite__gui_2mainwindow_8cc_source.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.3</span>
+    <span id="projectnumber">2.6.4</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -316,7 +316,7 @@
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Jun 23 2015 17:09:36 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Tue Nov 3 2015 15:58:26 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/pkcomposite__gui_2mainwindow_8h_source.html b/doc/html/pkcomposite__gui_2mainwindow_8h_source.html
index b188911..f6c88c6 100644
--- a/doc/html/pkcomposite__gui_2mainwindow_8h_source.html
+++ b/doc/html/pkcomposite__gui_2mainwindow_8h_source.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.3</span>
+    <span id="projectnumber">2.6.4</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -129,7 +129,7 @@
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Jun 23 2015 17:09:36 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Tue Nov 3 2015 15:58:26 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/pkcreatect.html b/doc/html/pkcreatect.html
index 70e0805..b71fefc 100644
--- a/doc/html/pkcreatect.html
+++ b/doc/html/pkcreatect.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.3</span>
+    <span id="projectnumber">2.6.4</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -90,7 +90,7 @@ Usage: pkcreatect -i input.txt -o output [-ct colortable | -min value -max value
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Jun 23 2015 17:09:37 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/pkcreatect_8cc_source.html b/doc/html/pkcreatect_8cc_source.html
index 462e09b..70457e6 100644
--- a/doc/html/pkcreatect_8cc_source.html
+++ b/doc/html/pkcreatect_8cc_source.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.3</span>
+    <span id="projectnumber">2.6.4</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -264,7 +264,7 @@
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Jun 23 2015 17:09:36 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Tue Nov 3 2015 15:58:26 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/pkcrop.html b/doc/html/pkcrop.html
index 4deb76e..80eb5de 100644
--- a/doc/html/pkcrop.html
+++ b/doc/html/pkcrop.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.3</span>
+    <span id="projectnumber">2.6.4</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -48,7 +48,7 @@
 <p><code> Usage: pkcrop -i input -o output </code></p>
 <p><code></code></p>
 <p><code> Options: [-of out_format] [-ot {Byte/Int16/UInt16/UInt32/Int32/Float32/Float64/CInt16/CInt32/CFloat32/CFloat64}] [-b band]* [-ulx ULX -uly ULY -lrx LRX -lry LRY] [-dx xres] [-dy yres] [-r resampling_method] [-a_srs epsg:number] [-nodata value]</code></p>
-<p><code> Advanced options: [-e vector [-cut]] [-co NAME=VALUE]* [-x center_x -y center_y] [-nx size_x -ny size_y] [-ns nsample -nl nlines] [-as min -as max] [-s scale]* [-off offset]* [-ct colortable] [-d description] </code></p>
+<p><code> Advanced options: [-e vector [-cut]] [-sband band -eband band]* [-co NAME=VALUE]* [-x center_x -y center_y] [-nx size_x -ny size_y] [-ns nsample -nl nlines] [-as min -as max] [-scale value]* [-off offset]* [-ct colortable] [-d description] </code></p>
 <h1><a class="anchor" id="pkcrop_description"></a>
 Description</h1>
 <p>The utility pkcrop can subset and stack raster images. In the spatial domain it can crop a bounding box from a larger image. The output bounding box is selected by setting the new corner coordinates using the options -ulx -uly -lrx -lry. Alternatively you can set the new image center (-x -y) and size. This can be done either in projected coordinates (using the options -nx -ny) or in image coordinates (using the options -ns -nl). You can also use a vector file to set the new bounding b [...]
@@ -74,7 +74,11 @@ Options</h1>
 <tr>
 <td>lry </td><td>lry </td><td>double </td><td>0 </td><td>Lower right y value bounding box </td></tr>
 <tr>
-<td>b </td><td>band </td><td>int </td><td></td><td>band index to crop (leave empty to retain all bands) </td></tr>
+<td>b </td><td>band </td><td>unsigned short </td><td></td><td>band index to crop (leave empty to retain all bands) </td></tr>
+<tr>
+<td>sband </td><td>startband </td><td>unsigned short </td><td></td><td>Start band sequence number </td></tr>
+<tr>
+<td>eband </td><td>endband </td><td>unsigned short </td><td></td><td>End band sequence number </td></tr>
 <tr>
 <td>as </td><td>autoscale </td><td>double </td><td></td><td>scale output to min and max, e.g., –autoscale 0 –autoscale 255 </td></tr>
 <tr>
@@ -94,7 +98,13 @@ Options</h1>
 <tr>
 <td>cut </td><td>crop_to_cutline </td><td>bool </td><td>false </td><td>Crop the extent of the target dataset to the extent of the cutline </td></tr>
 <tr>
-<td>m </td><td>mask </td><td>std::string </td><td></td><td>Use the first band of the specified file as a validity mask (0 is nodata) </td></tr>
+<td>m </td><td>mask </td><td>std::string </td><td></td><td>Use the specified file as a validity mask (0 is nodata) </td></tr>
+<tr>
+<td>msknodata </td><td>msknodata </td><td>float </td><td>0 </td><td>Mask value not to consider for crop </td></tr>
+<tr>
+<td>msknodata </td><td>msknodata </td><td>float </td><td>0 </td><td>Mask value not to consider for crop </td></tr>
+<tr>
+<td>mskband </td><td>mskband </td><td>short </td><td>0 </td><td>Mask band to read (0 indexed). Provide band for each mask. </td></tr>
 <tr>
 <td>co </td><td>co </td><td>std::string </td><td></td><td>Creation option for output file. Multiple options can be specified. </td></tr>
 <tr>
@@ -110,7 +120,7 @@ Options</h1>
 <tr>
 <td>nl </td><td>nl </td><td>int </td><td></td><td>number of lines to crop (in pixels) </td></tr>
 <tr>
-<td>s </td><td>scale </td><td>double </td><td></td><td>output=scale*input+offset </td></tr>
+<td>scale </td><td>scale </td><td>double </td><td></td><td>output=scale*input+offset </td></tr>
 <tr>
 <td>off </td><td>offset </td><td>double </td><td></td><td>output=scale*input+offset </td></tr>
 <tr>
@@ -126,7 +136,7 @@ Usage: pkcrop -i input -o output</li>
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Jun 23 2015 17:09:37 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/pkcrop_8cc_source.html b/doc/html/pkcrop_8cc_source.html
index ab5e440..79a17d8 100644
--- a/doc/html/pkcrop_8cc_source.html
+++ b/doc/html/pkcrop_8cc_source.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.3</span>
+    <span id="projectnumber">2.6.4</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -84,692 +84,733 @@
 <div class="line"><a name="l00030"></a><span class="lineno">   30</span> <span class="preprocessor">#include "algorithms/Egcs.h"</span></div>
 <div class="line"><a name="l00031"></a><span class="lineno">   31</span> </div>
 <div class="line"><a name="l00032"></a><span class="lineno">   32</span> <span class="comment">/******************************************************************************/</span></div>
-<div class="line"><a name="l00094"></a><span class="lineno">   94</span> <span class="keyword">using namespace </span>std;</div>
-<div class="line"><a name="l00095"></a><span class="lineno">   95</span> </div>
-<div class="line"><a name="l00096"></a><span class="lineno">   96</span> <span class="keywordtype">int</span> main(<span class="keywordtype">int</span> argc, <span class="keywordtype">char</span> *argv[])</div>
-<div class="line"><a name="l00097"></a><span class="lineno">   97</span> {</div>
-<div class="line"><a name="l00098"></a><span class="lineno">   98</span>   <a class="code" href="classOptionpk.html">Optionpk<string></a>  input_opt(<span class="stringliteral">"i"</span>, <span class="stringliteral">"input"</span>, <span class="stringliteral">"Input image file(s). If input contains multiple images, a multi-band output is created"</span>);</div>
-<div class="line"><a name="l00099"></a><span class="lineno">   99</span>   <a class="code" href="classOptionpk.html">Optionpk<string></a>  output_opt(<span class="stringliteral">"o"</span>, <span class="stringliteral">"output"</span>, <span class="stringliteral">"Output image file"</span>);</div>
-<div class="line"><a name="l00100"></a><span class="lineno">  100</span>   <a class="code" href="classOptionpk.html">Optionpk<string></a>  projection_opt(<span class="stringliteral">"a_srs"</span>, <span class="stringliteral">"a_srs"</span>, <span class="stringliteral">"Override the projection for the output file (leave blank to copy from input file, use epsg:3035 to use European projection and force to European grid"</span>);</div>
-<div class="line"><a name="l00101"></a><span class="lineno">  101</span>   <span class="comment">//todo: support layer names</span></div>
-<div class="line"><a name="l00102"></a><span class="lineno">  102</span>   <a class="code" href="classOptionpk.html">Optionpk<string></a>  extent_opt(<span class="stringliteral">"e"</span>, <span class="stringliteral">"extent"</span>, <span class="stringliteral">"get boundary from extent from polygons in vector file"</span>);</div>
-<div class="line"><a name="l00103"></a><span class="lineno">  103</span>   <a class="code" href="classOptionpk.html">Optionpk<bool></a> cut_opt(<span class="stringliteral">"cut"</span>, <span class="stringliteral">"crop_to_cutline"</span>, <span class="stringliteral">"Crop the extent of the target dataset to the extent of the cutline."</span>,<span class="keyword">false</span>);</div>
-<div class="line"><a name="l00104"></a><span class="lineno">  104</span>   <a class="code" href="classOptionpk.html">Optionpk<string></a> mask_opt(<span class="stringliteral">"m"</span>, <span class="stringliteral">"mask"</span>, <span class="stringliteral">"Use the first band of the specified file as a validity mask (0 is nodata)."</span>);</div>
-<div class="line"><a name="l00105"></a><span class="lineno">  105</span>   <a class="code" href="classOptionpk.html">Optionpk<double></a>  ulx_opt(<span class="stringliteral">"ulx"</span>, <span class="stringliteral">"ulx"</span>, <span class="stringliteral">"Upper left x value bounding box"</span>, 0.0);</div>
-<div class="line"><a name="l00106"></a><span class="lineno">  106</span>   <a class="code" href="classOptionpk.html">Optionpk<double></a>  uly_opt(<span class="stringliteral">"uly"</span>, <span class="stringliteral">"uly"</span>, <span class="stringliteral">"Upper left y value bounding box"</span>, 0.0);</div>
-<div class="line"><a name="l00107"></a><span class="lineno">  107</span>   <a class="code" href="classOptionpk.html">Optionpk<double></a>  lrx_opt(<span class="stringliteral">"lrx"</span>, <span class="stringliteral">"lrx"</span>, <span class="stringliteral">"Lower right x value bounding box"</span>, 0.0);</div>
-<div class="line"><a name="l00108"></a><span class="lineno">  108</span>   <a class="code" href="classOptionpk.html">Optionpk<double></a>  lry_opt(<span class="stringliteral">"lry"</span>, <span class="stringliteral">"lry"</span>, <span class="stringliteral">"Lower right y value bounding box"</span>, 0.0);</div>
-<div class="line"><a name="l00109"></a><span class="lineno">  109</span>   <a class="code" href="classOptionpk.html">Optionpk<double></a>  dx_opt(<span class="stringliteral">"dx"</span>, <span class="stringliteral">"dx"</span>, <span class="stringliteral">"Output resolution in x (in meter) (empty: keep original resolution)"</span>);</div>
-<div class="line"><a name="l00110"></a><span class="lineno">  110</span>   <a class="code" href="classOptionpk.html">Optionpk<double></a>  dy_opt(<span class="stringliteral">"dy"</span>, <span class="stringliteral">"dy"</span>, <span class="stringliteral">"Output resolution in y (in meter) (empty: keep original resolution)"</span>);</div>
-<div class="line"><a name="l00111"></a><span class="lineno">  111</span>   <a class="code" href="classOptionpk.html">Optionpk<double></a> cx_opt(<span class="stringliteral">"x"</span>, <span class="stringliteral">"x"</span>, <span class="stringliteral">"x-coordinate of image center to crop (in meter)"</span>);</div>
-<div class="line"><a name="l00112"></a><span class="lineno">  112</span>   <a class="code" href="classOptionpk.html">Optionpk<double></a> cy_opt(<span class="stringliteral">"y"</span>, <span class="stringliteral">"y"</span>, <span class="stringliteral">"y-coordinate of image center to crop (in meter)"</span>);</div>
-<div class="line"><a name="l00113"></a><span class="lineno">  113</span>   <a class="code" href="classOptionpk.html">Optionpk<double></a> nx_opt(<span class="stringliteral">"nx"</span>, <span class="stringliteral">"nx"</span>, <span class="stringliteral">"image size in x to crop (in meter)"</span>);</div>
-<div class="line"><a name="l00114"></a><span class="lineno">  114</span>   <a class="code" href="classOptionpk.html">Optionpk<double></a> ny_opt(<span class="stringliteral">"ny"</span>, <span class="stringliteral">"ny"</span>, <span class="stringliteral">"image size in y to crop (in meter)"</span>);</div>
-<div class="line"><a name="l00115"></a><span class="lineno">  115</span>   <a class="code" href="classOptionpk.html">Optionpk<int></a> ns_opt(<span class="stringliteral">"ns"</span>, <span class="stringliteral">"ns"</span>, <span class="stringliteral">"number of samples  to crop (in pixels)"</span>);</div>
-<div class="line"><a name="l00116"></a><span class="lineno">  116</span>   <a class="code" href="classOptionpk.html">Optionpk<int></a> nl_opt(<span class="stringliteral">"nl"</span>, <span class="stringliteral">"nl"</span>, <span class="stringliteral">"number of lines to crop (in pixels)"</span>);</div>
-<div class="line"><a name="l00117"></a><span class="lineno">  117</span>   <a class="code" href="classOptionpk.html">Optionpk<int></a>  band_opt(<span class="stringliteral">"b"</span>, <span class="stringliteral">"band"</span>, <span class="stringliteral">"band index to crop (leave empty to retain all bands)"</span>);</div>
-<div class="line"><a name="l00118"></a><span class="lineno">  118</span>   <a class="code" href="classOptionpk.html">Optionpk<double></a> autoscale_opt(<span class="stringliteral">"as"</span>, <span class="stringliteral">"autoscale"</span>, <span class="stringliteral">"scale output to min and max, e.g., --autoscale 0 --autoscale 255"</span>);</div>
-<div class="line"><a name="l00119"></a><span class="lineno">  119</span>   <a class="code" href="classOptionpk.html">Optionpk<double></a> scale_opt(<span class="stringliteral">"s"</span>, <span class="stringliteral">"scale"</span>, <span class="stringliteral">"output=scale*input+offset"</span>);</div>
-<div class="line"><a name="l00120"></a><span class="lineno">  120</span>   <a class="code" href="classOptionpk.html">Optionpk<double></a> offset_opt(<span class="stringliteral">"off"</span>, <span class="stringliteral">"offset"</span>, <span class="stringliteral">"output=scale*input+offset"</span>);</div>
-<div class="line"><a name="l00121"></a><span class="lineno">  121</span>   <a class="code" href="classOptionpk.html">Optionpk<string></a>  otype_opt(<span class="stringliteral">"ot"</span>, <span class="stringliteral">"otype"</span>, <span class="stringliteral">"Data type for output image ({Byte/Int16/UInt16/UInt32/Int32/Float32/Float64/CInt16/CInt32/CFloat32/CFloat64}). Empty string: inherit type from input image"</span>,<span class="stringlitera [...]
-<div class="line"><a name="l00122"></a><span class="lineno">  122</span>   <a class="code" href="classOptionpk.html">Optionpk<string></a>  oformat_opt(<span class="stringliteral">"of"</span>, <span class="stringliteral">"oformat"</span>, <span class="stringliteral">"Output image format (see also gdal_translate). Empty string: inherit from input image"</span>);</div>
-<div class="line"><a name="l00123"></a><span class="lineno">  123</span>   <a class="code" href="classOptionpk.html">Optionpk<string></a> option_opt(<span class="stringliteral">"co"</span>, <span class="stringliteral">"co"</span>, <span class="stringliteral">"Creation option for output file. Multiple options can be specified."</span>);</div>
-<div class="line"><a name="l00124"></a><span class="lineno">  124</span>   <a class="code" href="classOptionpk.html">Optionpk<string></a>  colorTable_opt(<span class="stringliteral">"ct"</span>, <span class="stringliteral">"ct"</span>, <span class="stringliteral">"color table (file with 5 columns: id R G B ALFA (0: transparent, 255: solid)"</span>);</div>
-<div class="line"><a name="l00125"></a><span class="lineno">  125</span>   <a class="code" href="classOptionpk.html">Optionpk<float></a>  nodata_opt(<span class="stringliteral">"nodata"</span>, <span class="stringliteral">"nodata"</span>, <span class="stringliteral">"Nodata value to put in image if out of bounds."</span>);</div>
-<div class="line"><a name="l00126"></a><span class="lineno">  126</span>   <a class="code" href="classOptionpk.html">Optionpk<string></a>  resample_opt(<span class="stringliteral">"r"</span>, <span class="stringliteral">"resampling-method"</span>, <span class="stringliteral">"Resampling method (near: nearest neighbor, bilinear: bi-linear interpolation)."</span>, <span class="stringliteral">"near"</span>);</div>
-<div class="line"><a name="l00127"></a><span class="lineno">  127</span>   <a class="code" href="classOptionpk.html">Optionpk<string></a>  description_opt(<span class="stringliteral">"d"</span>, <span class="stringliteral">"description"</span>, <span class="stringliteral">"Set image description"</span>);</div>
-<div class="line"><a name="l00128"></a><span class="lineno">  128</span>   <a class="code" href="classOptionpk.html">Optionpk<short></a>  verbose_opt(<span class="stringliteral">"v"</span>, <span class="stringliteral">"verbose"</span>, <span class="stringliteral">"verbose"</span>, 0,2);</div>
-<div class="line"><a name="l00129"></a><span class="lineno">  129</span> </div>
-<div class="line"><a name="l00130"></a><span class="lineno">  130</span>   extent_opt.setHide(1);</div>
-<div class="line"><a name="l00131"></a><span class="lineno">  131</span>   cut_opt.setHide(1);</div>
-<div class="line"><a name="l00132"></a><span class="lineno">  132</span>   mask_opt.setHide(1);</div>
-<div class="line"><a name="l00133"></a><span class="lineno">  133</span>   option_opt.setHide(1);</div>
-<div class="line"><a name="l00134"></a><span class="lineno">  134</span>   cx_opt.setHide(1);</div>
-<div class="line"><a name="l00135"></a><span class="lineno">  135</span>   cy_opt.setHide(1);</div>
-<div class="line"><a name="l00136"></a><span class="lineno">  136</span>   nx_opt.setHide(1);</div>
-<div class="line"><a name="l00137"></a><span class="lineno">  137</span>   ny_opt.setHide(1);</div>
-<div class="line"><a name="l00138"></a><span class="lineno">  138</span>   ns_opt.setHide(1);</div>
-<div class="line"><a name="l00139"></a><span class="lineno">  139</span>   nl_opt.setHide(1);</div>
-<div class="line"><a name="l00140"></a><span class="lineno">  140</span>   scale_opt.setHide(1);</div>
-<div class="line"><a name="l00141"></a><span class="lineno">  141</span>   offset_opt.setHide(1);</div>
-<div class="line"><a name="l00142"></a><span class="lineno">  142</span>   nodata_opt.setHide(1);</div>
-<div class="line"><a name="l00143"></a><span class="lineno">  143</span>   description_opt.setHide(1);</div>
-<div class="line"><a name="l00144"></a><span class="lineno">  144</span>   </div>
-<div class="line"><a name="l00145"></a><span class="lineno">  145</span>   <span class="keywordtype">bool</span> doProcess;<span class="comment">//stop process when program was invoked with help option (-h --help)</span></div>
-<div class="line"><a name="l00146"></a><span class="lineno">  146</span>   <span class="keywordflow">try</span>{</div>
-<div class="line"><a name="l00147"></a><span class="lineno">  147</span>     doProcess=input_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00148"></a><span class="lineno">  148</span>     output_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00149"></a><span class="lineno">  149</span>     projection_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00150"></a><span class="lineno">  150</span>     ulx_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00151"></a><span class="lineno">  151</span>     uly_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00152"></a><span class="lineno">  152</span>     lrx_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00153"></a><span class="lineno">  153</span>     lry_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00154"></a><span class="lineno">  154</span>     band_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00155"></a><span class="lineno">  155</span>     autoscale_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00156"></a><span class="lineno">  156</span>     otype_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00157"></a><span class="lineno">  157</span>     oformat_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00158"></a><span class="lineno">  158</span>     colorTable_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00159"></a><span class="lineno">  159</span>     dx_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00160"></a><span class="lineno">  160</span>     dy_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00161"></a><span class="lineno">  161</span>     resample_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00162"></a><span class="lineno">  162</span>     extent_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00163"></a><span class="lineno">  163</span>     cut_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00164"></a><span class="lineno">  164</span>     mask_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00165"></a><span class="lineno">  165</span>     option_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00166"></a><span class="lineno">  166</span>     cx_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00167"></a><span class="lineno">  167</span>     cy_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00168"></a><span class="lineno">  168</span>     nx_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00169"></a><span class="lineno">  169</span>     ny_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00170"></a><span class="lineno">  170</span>     ns_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00171"></a><span class="lineno">  171</span>     nl_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00172"></a><span class="lineno">  172</span>     scale_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00173"></a><span class="lineno">  173</span>     offset_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00174"></a><span class="lineno">  174</span>     nodata_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00175"></a><span class="lineno">  175</span>     description_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00176"></a><span class="lineno">  176</span>     verbose_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00177"></a><span class="lineno">  177</span>   }</div>
-<div class="line"><a name="l00178"></a><span class="lineno">  178</span>   <span class="keywordflow">catch</span>(<span class="keywordtype">string</span> predefinedString){</div>
-<div class="line"><a name="l00179"></a><span class="lineno">  179</span>     std::cout << predefinedString << std::endl;</div>
-<div class="line"><a name="l00180"></a><span class="lineno">  180</span>     exit(0);</div>
-<div class="line"><a name="l00181"></a><span class="lineno">  181</span>   }</div>
-<div class="line"><a name="l00182"></a><span class="lineno">  182</span>   <span class="keywordflow">if</span>(verbose_opt[0])</div>
-<div class="line"><a name="l00183"></a><span class="lineno">  183</span>     cout << setprecision(12) << <span class="stringliteral">"--ulx="</span> << ulx_opt[0] << <span class="stringliteral">" --uly="</span> << uly_opt[0] << <span class="stringliteral">" --lrx="</span> << lrx_opt[0] << <span class="stringliteral">" --lry="</span> << lry_opt[0] << endl;</div>
-<div class="line"><a name="l00184"></a><span class="lineno">  184</span> </div>
-<div class="line"><a name="l00185"></a><span class="lineno">  185</span>   <span class="keywordflow">if</span>(!doProcess){</div>
-<div class="line"><a name="l00186"></a><span class="lineno">  186</span>     cout << endl;</div>
-<div class="line"><a name="l00187"></a><span class="lineno">  187</span>     cout << <span class="stringliteral">"Usage: pkcrop -i input -o output"</span> << endl;</div>
-<div class="line"><a name="l00188"></a><span class="lineno">  188</span>     cout << endl;</div>
-<div class="line"><a name="l00189"></a><span class="lineno">  189</span>     std::cout << <span class="stringliteral">"short option -h shows basic options only, use long option --help to show all options"</span> << std::endl;</div>
-<div class="line"><a name="l00190"></a><span class="lineno">  190</span>     exit(0);<span class="comment">//help was invoked, stop processing</span></div>
-<div class="line"><a name="l00191"></a><span class="lineno">  191</span>   }</div>
-<div class="line"><a name="l00192"></a><span class="lineno">  192</span>   <span class="keywordflow">if</span>(input_opt.empty()){</div>
-<div class="line"><a name="l00193"></a><span class="lineno">  193</span>     std::cerr << <span class="stringliteral">"No input file provided (use option -i). Use --help for help information"</span> << std::endl;</div>
-<div class="line"><a name="l00194"></a><span class="lineno">  194</span>     exit(0);</div>
-<div class="line"><a name="l00195"></a><span class="lineno">  195</span>   }</div>
-<div class="line"><a name="l00196"></a><span class="lineno">  196</span>   <span class="keywordflow">if</span>(output_opt.empty()){</div>
-<div class="line"><a name="l00197"></a><span class="lineno">  197</span>     std::cerr << <span class="stringliteral">"No output file provided (use option -o). Use --help for help information"</span> << std::endl;</div>
-<div class="line"><a name="l00198"></a><span class="lineno">  198</span>     exit(0);</div>
-<div class="line"><a name="l00199"></a><span class="lineno">  199</span>   }</div>
-<div class="line"><a name="l00200"></a><span class="lineno">  200</span> </div>
-<div class="line"><a name="l00201"></a><span class="lineno">  201</span>   <span class="keywordtype">float</span> nodataValue=nodata_opt.size()? nodata_opt[0] : 0;</div>
-<div class="line"><a name="l00202"></a><span class="lineno">  202</span>   RESAMPLE theResample;</div>
-<div class="line"><a name="l00203"></a><span class="lineno">  203</span>   <span class="keywordflow">if</span>(resample_opt[0]==<span class="stringliteral">"near"</span>){</div>
-<div class="line"><a name="l00204"></a><span class="lineno">  204</span>     theResample=NEAR;</div>
-<div class="line"><a name="l00205"></a><span class="lineno">  205</span>     <span class="keywordflow">if</span>(verbose_opt[0])</div>
-<div class="line"><a name="l00206"></a><span class="lineno">  206</span>       cout << <span class="stringliteral">"resampling: nearest neighbor"</span> << endl;</div>
-<div class="line"><a name="l00207"></a><span class="lineno">  207</span>   }</div>
-<div class="line"><a name="l00208"></a><span class="lineno">  208</span>   <span class="keywordflow">else</span> <span class="keywordflow">if</span>(resample_opt[0]==<span class="stringliteral">"bilinear"</span>){</div>
-<div class="line"><a name="l00209"></a><span class="lineno">  209</span>     theResample=BILINEAR;</div>
-<div class="line"><a name="l00210"></a><span class="lineno">  210</span>     <span class="keywordflow">if</span>(verbose_opt[0])</div>
-<div class="line"><a name="l00211"></a><span class="lineno">  211</span>       cout << <span class="stringliteral">"resampling: bilinear interpolation"</span> << endl;</div>
+<div class="line"><a name="l00099"></a><span class="lineno">   99</span> <span class="keyword">using namespace </span>std;</div>
+<div class="line"><a name="l00100"></a><span class="lineno">  100</span> </div>
+<div class="line"><a name="l00101"></a><span class="lineno">  101</span> <span class="keywordtype">int</span> main(<span class="keywordtype">int</span> argc, <span class="keywordtype">char</span> *argv[])</div>
+<div class="line"><a name="l00102"></a><span class="lineno">  102</span> {</div>
+<div class="line"><a name="l00103"></a><span class="lineno">  103</span>   <a class="code" href="classOptionpk.html">Optionpk<string></a>  input_opt(<span class="stringliteral">"i"</span>, <span class="stringliteral">"input"</span>, <span class="stringliteral">"Input image file(s). If input contains multiple images, a multi-band output is created"</span>);</div>
+<div class="line"><a name="l00104"></a><span class="lineno">  104</span>   <a class="code" href="classOptionpk.html">Optionpk<string></a>  output_opt(<span class="stringliteral">"o"</span>, <span class="stringliteral">"output"</span>, <span class="stringliteral">"Output image file"</span>);</div>
+<div class="line"><a name="l00105"></a><span class="lineno">  105</span>   <a class="code" href="classOptionpk.html">Optionpk<string></a>  projection_opt(<span class="stringliteral">"a_srs"</span>, <span class="stringliteral">"a_srs"</span>, <span class="stringliteral">"Override the projection for the output file (leave blank to copy from input file, use epsg:3035 to use European projection and force to European grid"</span>);</div>
+<div class="line"><a name="l00106"></a><span class="lineno">  106</span>   <span class="comment">//todo: support layer names</span></div>
+<div class="line"><a name="l00107"></a><span class="lineno">  107</span>   <a class="code" href="classOptionpk.html">Optionpk<string></a>  extent_opt(<span class="stringliteral">"e"</span>, <span class="stringliteral">"extent"</span>, <span class="stringliteral">"get boundary from extent from polygons in vector file"</span>);</div>
+<div class="line"><a name="l00108"></a><span class="lineno">  108</span>   <a class="code" href="classOptionpk.html">Optionpk<bool></a> cut_opt(<span class="stringliteral">"cut"</span>, <span class="stringliteral">"crop_to_cutline"</span>, <span class="stringliteral">"Crop the extent of the target dataset to the extent of the cutline."</span>,<span class="keyword">false</span>);</div>
+<div class="line"><a name="l00109"></a><span class="lineno">  109</span>   <a class="code" href="classOptionpk.html">Optionpk<string></a> mask_opt(<span class="stringliteral">"m"</span>, <span class="stringliteral">"mask"</span>, <span class="stringliteral">"Use the the specified file as a validity mask (0 is nodata)."</span>);</div>
+<div class="line"><a name="l00110"></a><span class="lineno">  110</span>   <a class="code" href="classOptionpk.html">Optionpk<float></a> msknodata_opt(<span class="stringliteral">"msknodata"</span>, <span class="stringliteral">"msknodata"</span>, <span class="stringliteral">"Mask value not to consider for crop."</span>, 0);</div>
+<div class="line"><a name="l00111"></a><span class="lineno">  111</span>   <a class="code" href="classOptionpk.html">Optionpk<short></a> mskband_opt(<span class="stringliteral">"mskband"</span>, <span class="stringliteral">"mskband"</span>, <span class="stringliteral">"Mask band to read (0 indexed). Provide band for each mask."</span>, 0);</div>
+<div class="line"><a name="l00112"></a><span class="lineno">  112</span>   <a class="code" href="classOptionpk.html">Optionpk<double></a>  ulx_opt(<span class="stringliteral">"ulx"</span>, <span class="stringliteral">"ulx"</span>, <span class="stringliteral">"Upper left x value bounding box"</span>, 0.0);</div>
+<div class="line"><a name="l00113"></a><span class="lineno">  113</span>   <a class="code" href="classOptionpk.html">Optionpk<double></a>  uly_opt(<span class="stringliteral">"uly"</span>, <span class="stringliteral">"uly"</span>, <span class="stringliteral">"Upper left y value bounding box"</span>, 0.0);</div>
+<div class="line"><a name="l00114"></a><span class="lineno">  114</span>   <a class="code" href="classOptionpk.html">Optionpk<double></a>  lrx_opt(<span class="stringliteral">"lrx"</span>, <span class="stringliteral">"lrx"</span>, <span class="stringliteral">"Lower right x value bounding box"</span>, 0.0);</div>
+<div class="line"><a name="l00115"></a><span class="lineno">  115</span>   <a class="code" href="classOptionpk.html">Optionpk<double></a>  lry_opt(<span class="stringliteral">"lry"</span>, <span class="stringliteral">"lry"</span>, <span class="stringliteral">"Lower right y value bounding box"</span>, 0.0);</div>
+<div class="line"><a name="l00116"></a><span class="lineno">  116</span>   <a class="code" href="classOptionpk.html">Optionpk<double></a>  dx_opt(<span class="stringliteral">"dx"</span>, <span class="stringliteral">"dx"</span>, <span class="stringliteral">"Output resolution in x (in meter) (empty: keep original resolution)"</span>);</div>
+<div class="line"><a name="l00117"></a><span class="lineno">  117</span>   <a class="code" href="classOptionpk.html">Optionpk<double></a>  dy_opt(<span class="stringliteral">"dy"</span>, <span class="stringliteral">"dy"</span>, <span class="stringliteral">"Output resolution in y (in meter) (empty: keep original resolution)"</span>);</div>
+<div class="line"><a name="l00118"></a><span class="lineno">  118</span>   <a class="code" href="classOptionpk.html">Optionpk<double></a> cx_opt(<span class="stringliteral">"x"</span>, <span class="stringliteral">"x"</span>, <span class="stringliteral">"x-coordinate of image center to crop (in meter)"</span>);</div>
+<div class="line"><a name="l00119"></a><span class="lineno">  119</span>   <a class="code" href="classOptionpk.html">Optionpk<double></a> cy_opt(<span class="stringliteral">"y"</span>, <span class="stringliteral">"y"</span>, <span class="stringliteral">"y-coordinate of image center to crop (in meter)"</span>);</div>
+<div class="line"><a name="l00120"></a><span class="lineno">  120</span>   <a class="code" href="classOptionpk.html">Optionpk<double></a> nx_opt(<span class="stringliteral">"nx"</span>, <span class="stringliteral">"nx"</span>, <span class="stringliteral">"image size in x to crop (in meter)"</span>);</div>
+<div class="line"><a name="l00121"></a><span class="lineno">  121</span>   <a class="code" href="classOptionpk.html">Optionpk<double></a> ny_opt(<span class="stringliteral">"ny"</span>, <span class="stringliteral">"ny"</span>, <span class="stringliteral">"image size in y to crop (in meter)"</span>);</div>
+<div class="line"><a name="l00122"></a><span class="lineno">  122</span>   <a class="code" href="classOptionpk.html">Optionpk<int></a> ns_opt(<span class="stringliteral">"ns"</span>, <span class="stringliteral">"ns"</span>, <span class="stringliteral">"number of samples  to crop (in pixels)"</span>);</div>
+<div class="line"><a name="l00123"></a><span class="lineno">  123</span>   <a class="code" href="classOptionpk.html">Optionpk<int></a> nl_opt(<span class="stringliteral">"nl"</span>, <span class="stringliteral">"nl"</span>, <span class="stringliteral">"number of lines to crop (in pixels)"</span>);</div>
+<div class="line"><a name="l00124"></a><span class="lineno">  124</span>   <a class="code" href="classOptionpk.html">Optionpk<unsigned short></a>  band_opt(<span class="stringliteral">"b"</span>, <span class="stringliteral">"band"</span>, <span class="stringliteral">"band index to crop (leave empty to retain all bands)"</span>);</div>
+<div class="line"><a name="l00125"></a><span class="lineno">  125</span>   <a class="code" href="classOptionpk.html">Optionpk<unsigned short></a> bstart_opt(<span class="stringliteral">"sband"</span>, <span class="stringliteral">"startband"</span>, <span class="stringliteral">"Start band sequence number"</span>); </div>
+<div class="line"><a name="l00126"></a><span class="lineno">  126</span>   <a class="code" href="classOptionpk.html">Optionpk<unsigned short></a> bend_opt(<span class="stringliteral">"eband"</span>, <span class="stringliteral">"endband"</span>, <span class="stringliteral">"End band sequence number"</span>); </div>
+<div class="line"><a name="l00127"></a><span class="lineno">  127</span>   <a class="code" href="classOptionpk.html">Optionpk<double></a> autoscale_opt(<span class="stringliteral">"as"</span>, <span class="stringliteral">"autoscale"</span>, <span class="stringliteral">"scale output to min and max, e.g., --autoscale 0 --autoscale 255"</span>);</div>
+<div class="line"><a name="l00128"></a><span class="lineno">  128</span>   <a class="code" href="classOptionpk.html">Optionpk<double></a> scale_opt(<span class="stringliteral">"scale"</span>, <span class="stringliteral">"scale"</span>, <span class="stringliteral">"output=scale*input+offset"</span>);</div>
+<div class="line"><a name="l00129"></a><span class="lineno">  129</span>   <a class="code" href="classOptionpk.html">Optionpk<double></a> offset_opt(<span class="stringliteral">"offset"</span>, <span class="stringliteral">"offset"</span>, <span class="stringliteral">"output=scale*input+offset"</span>);</div>
+<div class="line"><a name="l00130"></a><span class="lineno">  130</span>   <a class="code" href="classOptionpk.html">Optionpk<string></a>  otype_opt(<span class="stringliteral">"ot"</span>, <span class="stringliteral">"otype"</span>, <span class="stringliteral">"Data type for output image ({Byte/Int16/UInt16/UInt32/Int32/Float32/Float64/CInt16/CInt32/CFloat32/CFloat64}). Empty string: inherit type from input image"</span>,<span class="stringlitera [...]
+<div class="line"><a name="l00131"></a><span class="lineno">  131</span>   <a class="code" href="classOptionpk.html">Optionpk<string></a>  oformat_opt(<span class="stringliteral">"of"</span>, <span class="stringliteral">"oformat"</span>, <span class="stringliteral">"Output image format (see also gdal_translate). Empty string: inherit from input image"</span>);</div>
+<div class="line"><a name="l00132"></a><span class="lineno">  132</span>   <a class="code" href="classOptionpk.html">Optionpk<string></a> option_opt(<span class="stringliteral">"co"</span>, <span class="stringliteral">"co"</span>, <span class="stringliteral">"Creation option for output file. Multiple options can be specified."</span>);</div>
+<div class="line"><a name="l00133"></a><span class="lineno">  133</span>   <a class="code" href="classOptionpk.html">Optionpk<string></a>  colorTable_opt(<span class="stringliteral">"ct"</span>, <span class="stringliteral">"ct"</span>, <span class="stringliteral">"color table (file with 5 columns: id R G B ALFA (0: transparent, 255: solid)"</span>);</div>
+<div class="line"><a name="l00134"></a><span class="lineno">  134</span>   <a class="code" href="classOptionpk.html">Optionpk<float></a>  nodata_opt(<span class="stringliteral">"nodata"</span>, <span class="stringliteral">"nodata"</span>, <span class="stringliteral">"Nodata value to put in image if out of bounds."</span>);</div>
+<div class="line"><a name="l00135"></a><span class="lineno">  135</span>   <a class="code" href="classOptionpk.html">Optionpk<string></a>  resample_opt(<span class="stringliteral">"r"</span>, <span class="stringliteral">"resampling-method"</span>, <span class="stringliteral">"Resampling method (near: nearest neighbor, bilinear: bi-linear interpolation)."</span>, <span class="stringliteral">"near"</span>);</div>
+<div class="line"><a name="l00136"></a><span class="lineno">  136</span>   <a class="code" href="classOptionpk.html">Optionpk<string></a>  description_opt(<span class="stringliteral">"d"</span>, <span class="stringliteral">"description"</span>, <span class="stringliteral">"Set image description"</span>);</div>
+<div class="line"><a name="l00137"></a><span class="lineno">  137</span>   <a class="code" href="classOptionpk.html">Optionpk<short></a>  verbose_opt(<span class="stringliteral">"v"</span>, <span class="stringliteral">"verbose"</span>, <span class="stringliteral">"verbose"</span>, 0,2);</div>
+<div class="line"><a name="l00138"></a><span class="lineno">  138</span> </div>
+<div class="line"><a name="l00139"></a><span class="lineno">  139</span>   extent_opt.setHide(1);</div>
+<div class="line"><a name="l00140"></a><span class="lineno">  140</span>   cut_opt.setHide(1);</div>
+<div class="line"><a name="l00141"></a><span class="lineno">  141</span>   bstart_opt.setHide(1);</div>
+<div class="line"><a name="l00142"></a><span class="lineno">  142</span>   bend_opt.setHide(1);</div>
+<div class="line"><a name="l00143"></a><span class="lineno">  143</span>   mask_opt.setHide(1);</div>
+<div class="line"><a name="l00144"></a><span class="lineno">  144</span>   msknodata_opt.setHide(1);</div>
+<div class="line"><a name="l00145"></a><span class="lineno">  145</span>   mskband_opt.setHide(1);</div>
+<div class="line"><a name="l00146"></a><span class="lineno">  146</span>   option_opt.setHide(1);</div>
+<div class="line"><a name="l00147"></a><span class="lineno">  147</span>   cx_opt.setHide(1);</div>
+<div class="line"><a name="l00148"></a><span class="lineno">  148</span>   cy_opt.setHide(1);</div>
+<div class="line"><a name="l00149"></a><span class="lineno">  149</span>   nx_opt.setHide(1);</div>
+<div class="line"><a name="l00150"></a><span class="lineno">  150</span>   ny_opt.setHide(1);</div>
+<div class="line"><a name="l00151"></a><span class="lineno">  151</span>   ns_opt.setHide(1);</div>
+<div class="line"><a name="l00152"></a><span class="lineno">  152</span>   nl_opt.setHide(1);</div>
+<div class="line"><a name="l00153"></a><span class="lineno">  153</span>   scale_opt.setHide(1);</div>
+<div class="line"><a name="l00154"></a><span class="lineno">  154</span>   offset_opt.setHide(1);</div>
+<div class="line"><a name="l00155"></a><span class="lineno">  155</span>   nodata_opt.setHide(1);</div>
+<div class="line"><a name="l00156"></a><span class="lineno">  156</span>   description_opt.setHide(1);</div>
+<div class="line"><a name="l00157"></a><span class="lineno">  157</span>   </div>
+<div class="line"><a name="l00158"></a><span class="lineno">  158</span>   <span class="keywordtype">bool</span> doProcess;<span class="comment">//stop process when program was invoked with help option (-h --help)</span></div>
+<div class="line"><a name="l00159"></a><span class="lineno">  159</span>   <span class="keywordflow">try</span>{</div>
+<div class="line"><a name="l00160"></a><span class="lineno">  160</span>     doProcess=input_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00161"></a><span class="lineno">  161</span>     output_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00162"></a><span class="lineno">  162</span>     projection_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00163"></a><span class="lineno">  163</span>     ulx_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00164"></a><span class="lineno">  164</span>     uly_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00165"></a><span class="lineno">  165</span>     lrx_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00166"></a><span class="lineno">  166</span>     lry_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00167"></a><span class="lineno">  167</span>     band_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00168"></a><span class="lineno">  168</span>     bstart_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00169"></a><span class="lineno">  169</span>     bend_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00170"></a><span class="lineno">  170</span>     autoscale_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00171"></a><span class="lineno">  171</span>     otype_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00172"></a><span class="lineno">  172</span>     oformat_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00173"></a><span class="lineno">  173</span>     colorTable_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00174"></a><span class="lineno">  174</span>     dx_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00175"></a><span class="lineno">  175</span>     dy_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00176"></a><span class="lineno">  176</span>     resample_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00177"></a><span class="lineno">  177</span>     extent_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00178"></a><span class="lineno">  178</span>     cut_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00179"></a><span class="lineno">  179</span>     mask_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00180"></a><span class="lineno">  180</span>     msknodata_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00181"></a><span class="lineno">  181</span>     mskband_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00182"></a><span class="lineno">  182</span>     option_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00183"></a><span class="lineno">  183</span>     cx_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00184"></a><span class="lineno">  184</span>     cy_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00185"></a><span class="lineno">  185</span>     nx_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00186"></a><span class="lineno">  186</span>     ny_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00187"></a><span class="lineno">  187</span>     ns_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00188"></a><span class="lineno">  188</span>     nl_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00189"></a><span class="lineno">  189</span>     scale_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00190"></a><span class="lineno">  190</span>     offset_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00191"></a><span class="lineno">  191</span>     nodata_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00192"></a><span class="lineno">  192</span>     description_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00193"></a><span class="lineno">  193</span>     verbose_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00194"></a><span class="lineno">  194</span>   }</div>
+<div class="line"><a name="l00195"></a><span class="lineno">  195</span>   <span class="keywordflow">catch</span>(<span class="keywordtype">string</span> predefinedString){</div>
+<div class="line"><a name="l00196"></a><span class="lineno">  196</span>     std::cout << predefinedString << std::endl;</div>
+<div class="line"><a name="l00197"></a><span class="lineno">  197</span>     exit(0);</div>
+<div class="line"><a name="l00198"></a><span class="lineno">  198</span>   }</div>
+<div class="line"><a name="l00199"></a><span class="lineno">  199</span>   <span class="keywordflow">if</span>(verbose_opt[0])</div>
+<div class="line"><a name="l00200"></a><span class="lineno">  200</span>     cout << setprecision(12) << <span class="stringliteral">"--ulx="</span> << ulx_opt[0] << <span class="stringliteral">" --uly="</span> << uly_opt[0] << <span class="stringliteral">" --lrx="</span> << lrx_opt[0] << <span class="stringliteral">" --lry="</span> << lry_opt[0] << endl;</div>
+<div class="line"><a name="l00201"></a><span class="lineno">  201</span> </div>
+<div class="line"><a name="l00202"></a><span class="lineno">  202</span>   <span class="keywordflow">if</span>(!doProcess){</div>
+<div class="line"><a name="l00203"></a><span class="lineno">  203</span>     cout << endl;</div>
+<div class="line"><a name="l00204"></a><span class="lineno">  204</span>     cout << <span class="stringliteral">"Usage: pkcrop -i input -o output"</span> << endl;</div>
+<div class="line"><a name="l00205"></a><span class="lineno">  205</span>     cout << endl;</div>
+<div class="line"><a name="l00206"></a><span class="lineno">  206</span>     std::cout << <span class="stringliteral">"short option -h shows basic options only, use long option --help to show all options"</span> << std::endl;</div>
+<div class="line"><a name="l00207"></a><span class="lineno">  207</span>     exit(0);<span class="comment">//help was invoked, stop processing</span></div>
+<div class="line"><a name="l00208"></a><span class="lineno">  208</span>   }</div>
+<div class="line"><a name="l00209"></a><span class="lineno">  209</span>   <span class="keywordflow">if</span>(input_opt.empty()){</div>
+<div class="line"><a name="l00210"></a><span class="lineno">  210</span>     std::cerr << <span class="stringliteral">"No input file provided (use option -i). Use --help for help information"</span> << std::endl;</div>
+<div class="line"><a name="l00211"></a><span class="lineno">  211</span>     exit(0);</div>
 <div class="line"><a name="l00212"></a><span class="lineno">  212</span>   }</div>
-<div class="line"><a name="l00213"></a><span class="lineno">  213</span>   <span class="keywordflow">else</span>{</div>
-<div class="line"><a name="l00214"></a><span class="lineno">  214</span>     std::cout << <span class="stringliteral">"Error: resampling method "</span> << resample_opt[0] << <span class="stringliteral">" not supported"</span> << std::endl;</div>
-<div class="line"><a name="l00215"></a><span class="lineno">  215</span>     exit(1);</div>
+<div class="line"><a name="l00213"></a><span class="lineno">  213</span>   <span class="keywordflow">if</span>(output_opt.empty()){</div>
+<div class="line"><a name="l00214"></a><span class="lineno">  214</span>     std::cerr << <span class="stringliteral">"No output file provided (use option -o). Use --help for help information"</span> << std::endl;</div>
+<div class="line"><a name="l00215"></a><span class="lineno">  215</span>     exit(0);</div>
 <div class="line"><a name="l00216"></a><span class="lineno">  216</span>   }</div>
 <div class="line"><a name="l00217"></a><span class="lineno">  217</span> </div>
-<div class="line"><a name="l00218"></a><span class="lineno">  218</span>   <span class="keyword">const</span> <span class="keywordtype">char</span>* pszMessage;</div>
-<div class="line"><a name="l00219"></a><span class="lineno">  219</span>   <span class="keywordtype">void</span>* pProgressArg=NULL;</div>
-<div class="line"><a name="l00220"></a><span class="lineno">  220</span>   GDALProgressFunc pfnProgress=GDALTermProgress;</div>
-<div class="line"><a name="l00221"></a><span class="lineno">  221</span>   <span class="keywordtype">double</span> progress=0;</div>
-<div class="line"><a name="l00222"></a><span class="lineno">  222</span>   pfnProgress(progress,pszMessage,pProgressArg);</div>
-<div class="line"><a name="l00223"></a><span class="lineno">  223</span>   <a class="code" href="classImgReaderGdal.html">ImgReaderGdal</a> imgReader;</div>
-<div class="line"><a name="l00224"></a><span class="lineno">  224</span>   <a class="code" href="classImgWriterGdal.html">ImgWriterGdal</a> imgWriter;</div>
-<div class="line"><a name="l00225"></a><span class="lineno">  225</span>   <span class="comment">//open input images to extract number of bands and spatial resolution</span></div>
-<div class="line"><a name="l00226"></a><span class="lineno">  226</span>   <span class="keywordtype">int</span> ncropband=0;<span class="comment">//total number of bands to write</span></div>
-<div class="line"><a name="l00227"></a><span class="lineno">  227</span>   <span class="keywordtype">double</span> dx=0;</div>
-<div class="line"><a name="l00228"></a><span class="lineno">  228</span>   <span class="keywordtype">double</span> dy=0;</div>
-<div class="line"><a name="l00229"></a><span class="lineno">  229</span>   <span class="keywordflow">if</span>(dx_opt.size())</div>
-<div class="line"><a name="l00230"></a><span class="lineno">  230</span>     dx=dx_opt[0];</div>
-<div class="line"><a name="l00231"></a><span class="lineno">  231</span>   <span class="keywordflow">if</span>(dy_opt.size())</div>
-<div class="line"><a name="l00232"></a><span class="lineno">  232</span>     dy=dy_opt[0];</div>
-<div class="line"><a name="l00233"></a><span class="lineno">  233</span> </div>
-<div class="line"><a name="l00234"></a><span class="lineno">  234</span>   <span class="keywordtype">bool</span> isGeoRef=<span class="keyword">false</span>;</div>
-<div class="line"><a name="l00235"></a><span class="lineno">  235</span>   <span class="keywordtype">string</span> projectionString;</div>
-<div class="line"><a name="l00236"></a><span class="lineno">  236</span>   <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iimg=0;iimg<input_opt.size();++iimg){</div>
-<div class="line"><a name="l00237"></a><span class="lineno">  237</span>     imgReader.open(input_opt[iimg]);</div>
-<div class="line"><a name="l00238"></a><span class="lineno">  238</span>     <span class="keywordflow">if</span>(!isGeoRef)</div>
-<div class="line"><a name="l00239"></a><span class="lineno">  239</span>       isGeoRef=imgReader.isGeoRef();</div>
-<div class="line"><a name="l00240"></a><span class="lineno">  240</span>     <span class="keywordflow">if</span>(imgReader.isGeoRef()&&projection_opt.empty())</div>
-<div class="line"><a name="l00241"></a><span class="lineno">  241</span>       projectionString=imgReader.getProjection();</div>
-<div class="line"><a name="l00242"></a><span class="lineno">  242</span>     <span class="keywordflow">if</span>(dx_opt.empty()){</div>
-<div class="line"><a name="l00243"></a><span class="lineno">  243</span>       <span class="keywordflow">if</span>(!iimg||imgReader.getDeltaX()<dx)</div>
-<div class="line"><a name="l00244"></a><span class="lineno">  244</span>         dx=imgReader.getDeltaX();</div>
-<div class="line"><a name="l00245"></a><span class="lineno">  245</span>     }</div>
-<div class="line"><a name="l00246"></a><span class="lineno">  246</span>     <span class="keywordflow">if</span>(dy_opt.empty()){</div>
-<div class="line"><a name="l00247"></a><span class="lineno">  247</span>       <span class="keywordflow">if</span>(!iimg||imgReader.getDeltaY()<dy)</div>
-<div class="line"><a name="l00248"></a><span class="lineno">  248</span>         dy=imgReader.getDeltaY();</div>
-<div class="line"><a name="l00249"></a><span class="lineno">  249</span>     }</div>
-<div class="line"><a name="l00250"></a><span class="lineno">  250</span>     <span class="keywordflow">if</span>(band_opt.size())</div>
-<div class="line"><a name="l00251"></a><span class="lineno">  251</span>       ncropband+=band_opt.size();</div>
-<div class="line"><a name="l00252"></a><span class="lineno">  252</span>     <span class="keywordflow">else</span></div>
-<div class="line"><a name="l00253"></a><span class="lineno">  253</span>       ncropband+=imgReader.nrOfBand();</div>
-<div class="line"><a name="l00254"></a><span class="lineno">  254</span>     imgReader.close();</div>
-<div class="line"><a name="l00255"></a><span class="lineno">  255</span>   }</div>
-<div class="line"><a name="l00256"></a><span class="lineno">  256</span> </div>
-<div class="line"><a name="l00257"></a><span class="lineno">  257</span>   GDALDataType theType=GDT_Unknown;</div>
-<div class="line"><a name="l00258"></a><span class="lineno">  258</span>   <span class="keywordflow">if</span>(verbose_opt[0])</div>
-<div class="line"><a name="l00259"></a><span class="lineno">  259</span>     cout << <span class="stringliteral">"possible output data types: "</span>;</div>
-<div class="line"><a name="l00260"></a><span class="lineno">  260</span>   <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iType = 0; iType < GDT_TypeCount; ++iType){</div>
-<div class="line"><a name="l00261"></a><span class="lineno">  261</span>     <span class="keywordflow">if</span>(verbose_opt[0])</div>
-<div class="line"><a name="l00262"></a><span class="lineno">  262</span>       cout << <span class="stringliteral">" "</span> << GDALGetDataTypeName((GDALDataType)iType);</div>
-<div class="line"><a name="l00263"></a><span class="lineno">  263</span>     <span class="keywordflow">if</span>( GDALGetDataTypeName((GDALDataType)iType) != NULL</div>
-<div class="line"><a name="l00264"></a><span class="lineno">  264</span>         && EQUAL(GDALGetDataTypeName((GDALDataType)iType),</div>
-<div class="line"><a name="l00265"></a><span class="lineno">  265</span>                  otype_opt[0].c_str()))</div>
-<div class="line"><a name="l00266"></a><span class="lineno">  266</span>       theType=(GDALDataType) iType;</div>
-<div class="line"><a name="l00267"></a><span class="lineno">  267</span>   }</div>
-<div class="line"><a name="l00268"></a><span class="lineno">  268</span>   <span class="keywordflow">if</span>(verbose_opt[0]){</div>
-<div class="line"><a name="l00269"></a><span class="lineno">  269</span>     cout << endl;</div>
-<div class="line"><a name="l00270"></a><span class="lineno">  270</span>     <span class="keywordflow">if</span>(theType==GDT_Unknown)</div>
-<div class="line"><a name="l00271"></a><span class="lineno">  271</span>       cout << <span class="stringliteral">"Unknown output pixel type: "</span> << otype_opt[0] << endl;</div>
-<div class="line"><a name="l00272"></a><span class="lineno">  272</span>     <span class="keywordflow">else</span></div>
-<div class="line"><a name="l00273"></a><span class="lineno">  273</span>       cout << <span class="stringliteral">"Output pixel type:  "</span> << GDALGetDataTypeName(theType) << endl;</div>
-<div class="line"><a name="l00274"></a><span class="lineno">  274</span>   }</div>
-<div class="line"><a name="l00275"></a><span class="lineno">  275</span>   <span class="comment">//bounding box of cropped image</span></div>
-<div class="line"><a name="l00276"></a><span class="lineno">  276</span>   <span class="keywordtype">double</span> cropulx=ulx_opt[0];</div>
-<div class="line"><a name="l00277"></a><span class="lineno">  277</span>   <span class="keywordtype">double</span> cropuly=uly_opt[0];</div>
-<div class="line"><a name="l00278"></a><span class="lineno">  278</span>   <span class="keywordtype">double</span> croplrx=lrx_opt[0];</div>
-<div class="line"><a name="l00279"></a><span class="lineno">  279</span>   <span class="keywordtype">double</span> croplry=lry_opt[0];</div>
-<div class="line"><a name="l00280"></a><span class="lineno">  280</span>   <span class="comment">//get bounding box from extentReader if defined</span></div>
-<div class="line"><a name="l00281"></a><span class="lineno">  281</span>   <a class="code" href="classImgReaderOgr.html">ImgReaderOgr</a> extentReader;</div>
-<div class="line"><a name="l00282"></a><span class="lineno">  282</span> </div>
-<div class="line"><a name="l00283"></a><span class="lineno">  283</span>   <span class="keywordflow">if</span>(extent_opt.size()){</div>
-<div class="line"><a name="l00284"></a><span class="lineno">  284</span>     <span class="keywordtype">double</span> e_ulx;</div>
-<div class="line"><a name="l00285"></a><span class="lineno">  285</span>     <span class="keywordtype">double</span> e_uly;</div>
-<div class="line"><a name="l00286"></a><span class="lineno">  286</span>     <span class="keywordtype">double</span> e_lrx;</div>
-<div class="line"><a name="l00287"></a><span class="lineno">  287</span>     <span class="keywordtype">double</span> e_lry;</div>
-<div class="line"><a name="l00288"></a><span class="lineno">  288</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iextent=0;iextent<extent_opt.size();++iextent){</div>
-<div class="line"><a name="l00289"></a><span class="lineno">  289</span>       extentReader.open(extent_opt[iextent]);</div>
-<div class="line"><a name="l00290"></a><span class="lineno">  290</span>       <span class="keywordflow">if</span>(!(extentReader.getExtent(e_ulx,e_uly,e_lrx,e_lry))){</div>
-<div class="line"><a name="l00291"></a><span class="lineno">  291</span>         cerr << <span class="stringliteral">"Error: could not get extent from "</span> << extent_opt[0] << endl;</div>
-<div class="line"><a name="l00292"></a><span class="lineno">  292</span>         exit(1);</div>
-<div class="line"><a name="l00293"></a><span class="lineno">  293</span>       }</div>
-<div class="line"><a name="l00294"></a><span class="lineno">  294</span>       <span class="keywordflow">if</span>(!iextent){</div>
-<div class="line"><a name="l00295"></a><span class="lineno">  295</span>     ulx_opt[0]=e_ulx;</div>
-<div class="line"><a name="l00296"></a><span class="lineno">  296</span>     uly_opt[0]=e_uly;</div>
-<div class="line"><a name="l00297"></a><span class="lineno">  297</span>     lrx_opt[0]=e_lrx;</div>
-<div class="line"><a name="l00298"></a><span class="lineno">  298</span>     lry_opt[0]=e_lry;</div>
-<div class="line"><a name="l00299"></a><span class="lineno">  299</span>       }</div>
-<div class="line"><a name="l00300"></a><span class="lineno">  300</span>       <span class="keywordflow">else</span>{</div>
-<div class="line"><a name="l00301"></a><span class="lineno">  301</span>     <span class="keywordflow">if</span>(e_ulx<ulx_opt[0])</div>
-<div class="line"><a name="l00302"></a><span class="lineno">  302</span>       ulx_opt[0]=e_ulx;</div>
-<div class="line"><a name="l00303"></a><span class="lineno">  303</span>     <span class="keywordflow">if</span>(e_uly>uly_opt[0])</div>
-<div class="line"><a name="l00304"></a><span class="lineno">  304</span>       uly_opt[0]=e_uly;</div>
-<div class="line"><a name="l00305"></a><span class="lineno">  305</span>     <span class="keywordflow">if</span>(e_lrx>lrx_opt[0])</div>
-<div class="line"><a name="l00306"></a><span class="lineno">  306</span>       lrx_opt[0]=e_lrx;</div>
-<div class="line"><a name="l00307"></a><span class="lineno">  307</span>     <span class="keywordflow">if</span>(e_lry<lry_opt[0])</div>
-<div class="line"><a name="l00308"></a><span class="lineno">  308</span>       lry_opt[0]=e_lry;</div>
-<div class="line"><a name="l00309"></a><span class="lineno">  309</span>       }</div>
-<div class="line"><a name="l00310"></a><span class="lineno">  310</span>       extentReader.close();</div>
-<div class="line"><a name="l00311"></a><span class="lineno">  311</span>     }</div>
-<div class="line"><a name="l00312"></a><span class="lineno">  312</span>     <span class="keywordflow">if</span>(cut_opt.size())</div>
-<div class="line"><a name="l00313"></a><span class="lineno">  313</span>       extentReader.open(extent_opt[0]);</div>
+<div class="line"><a name="l00218"></a><span class="lineno">  218</span>   <span class="keywordtype">float</span> nodataValue=nodata_opt.size()? nodata_opt[0] : 0;</div>
+<div class="line"><a name="l00219"></a><span class="lineno">  219</span>   RESAMPLE theResample;</div>
+<div class="line"><a name="l00220"></a><span class="lineno">  220</span>   <span class="keywordflow">if</span>(resample_opt[0]==<span class="stringliteral">"near"</span>){</div>
+<div class="line"><a name="l00221"></a><span class="lineno">  221</span>     theResample=NEAR;</div>
+<div class="line"><a name="l00222"></a><span class="lineno">  222</span>     <span class="keywordflow">if</span>(verbose_opt[0])</div>
+<div class="line"><a name="l00223"></a><span class="lineno">  223</span>       cout << <span class="stringliteral">"resampling: nearest neighbor"</span> << endl;</div>
+<div class="line"><a name="l00224"></a><span class="lineno">  224</span>   }</div>
+<div class="line"><a name="l00225"></a><span class="lineno">  225</span>   <span class="keywordflow">else</span> <span class="keywordflow">if</span>(resample_opt[0]==<span class="stringliteral">"bilinear"</span>){</div>
+<div class="line"><a name="l00226"></a><span class="lineno">  226</span>     theResample=BILINEAR;</div>
+<div class="line"><a name="l00227"></a><span class="lineno">  227</span>     <span class="keywordflow">if</span>(verbose_opt[0])</div>
+<div class="line"><a name="l00228"></a><span class="lineno">  228</span>       cout << <span class="stringliteral">"resampling: bilinear interpolation"</span> << endl;</div>
+<div class="line"><a name="l00229"></a><span class="lineno">  229</span>   }</div>
+<div class="line"><a name="l00230"></a><span class="lineno">  230</span>   <span class="keywordflow">else</span>{</div>
+<div class="line"><a name="l00231"></a><span class="lineno">  231</span>     std::cout << <span class="stringliteral">"Error: resampling method "</span> << resample_opt[0] << <span class="stringliteral">" not supported"</span> << std::endl;</div>
+<div class="line"><a name="l00232"></a><span class="lineno">  232</span>     exit(1);</div>
+<div class="line"><a name="l00233"></a><span class="lineno">  233</span>   }</div>
+<div class="line"><a name="l00234"></a><span class="lineno">  234</span> </div>
+<div class="line"><a name="l00235"></a><span class="lineno">  235</span>   <span class="keyword">const</span> <span class="keywordtype">char</span>* pszMessage;</div>
+<div class="line"><a name="l00236"></a><span class="lineno">  236</span>   <span class="keywordtype">void</span>* pProgressArg=NULL;</div>
+<div class="line"><a name="l00237"></a><span class="lineno">  237</span>   GDALProgressFunc pfnProgress=GDALTermProgress;</div>
+<div class="line"><a name="l00238"></a><span class="lineno">  238</span>   <span class="keywordtype">double</span> progress=0;</div>
+<div class="line"><a name="l00239"></a><span class="lineno">  239</span>   pfnProgress(progress,pszMessage,pProgressArg);</div>
+<div class="line"><a name="l00240"></a><span class="lineno">  240</span>   <a class="code" href="classImgReaderGdal.html">ImgReaderGdal</a> imgReader;</div>
+<div class="line"><a name="l00241"></a><span class="lineno">  241</span>   <a class="code" href="classImgWriterGdal.html">ImgWriterGdal</a> imgWriter;</div>
+<div class="line"><a name="l00242"></a><span class="lineno">  242</span>   <span class="comment">//open input images to extract number of bands and spatial resolution</span></div>
+<div class="line"><a name="l00243"></a><span class="lineno">  243</span>   <span class="keywordtype">int</span> ncropband=0;<span class="comment">//total number of bands to write</span></div>
+<div class="line"><a name="l00244"></a><span class="lineno">  244</span>   <span class="keywordtype">double</span> dx=0;</div>
+<div class="line"><a name="l00245"></a><span class="lineno">  245</span>   <span class="keywordtype">double</span> dy=0;</div>
+<div class="line"><a name="l00246"></a><span class="lineno">  246</span>   <span class="keywordflow">if</span>(dx_opt.size())</div>
+<div class="line"><a name="l00247"></a><span class="lineno">  247</span>     dx=dx_opt[0];</div>
+<div class="line"><a name="l00248"></a><span class="lineno">  248</span>   <span class="keywordflow">if</span>(dy_opt.size())</div>
+<div class="line"><a name="l00249"></a><span class="lineno">  249</span>     dy=dy_opt[0];</div>
+<div class="line"><a name="l00250"></a><span class="lineno">  250</span> </div>
+<div class="line"><a name="l00251"></a><span class="lineno">  251</span>   <span class="comment">//convert start and end band options to vector of band indexes</span></div>
+<div class="line"><a name="l00252"></a><span class="lineno">  252</span>   <span class="keywordflow">try</span>{</div>
+<div class="line"><a name="l00253"></a><span class="lineno">  253</span>     <span class="keywordflow">if</span>(bstart_opt.size()){</div>
+<div class="line"><a name="l00254"></a><span class="lineno">  254</span>       <span class="keywordflow">if</span>(bend_opt.size()!=bstart_opt.size()){</div>
+<div class="line"><a name="l00255"></a><span class="lineno">  255</span>     <span class="keywordtype">string</span> errorstring=<span class="stringliteral">"Error: options for start and end band indexes must be provided as pairs, missing end band"</span>;</div>
+<div class="line"><a name="l00256"></a><span class="lineno">  256</span>     <span class="keywordflow">throw</span>(errorstring);</div>
+<div class="line"><a name="l00257"></a><span class="lineno">  257</span>       }</div>
+<div class="line"><a name="l00258"></a><span class="lineno">  258</span>       band_opt.clear();</div>
+<div class="line"><a name="l00259"></a><span class="lineno">  259</span>       <span class="keywordflow">for</span>(<span class="keywordtype">int</span> ipair=0;ipair<bstart_opt.size();++ipair){</div>
+<div class="line"><a name="l00260"></a><span class="lineno">  260</span>     <span class="keywordflow">if</span>(bend_opt[ipair]<=bstart_opt[ipair]){</div>
+<div class="line"><a name="l00261"></a><span class="lineno">  261</span>       <span class="keywordtype">string</span> errorstring=<span class="stringliteral">"Error: index for end band must be smaller then start band"</span>;</div>
+<div class="line"><a name="l00262"></a><span class="lineno">  262</span>       <span class="keywordflow">throw</span>(errorstring);</div>
+<div class="line"><a name="l00263"></a><span class="lineno">  263</span>     }</div>
+<div class="line"><a name="l00264"></a><span class="lineno">  264</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iband=bstart_opt[ipair];iband<=bend_opt[ipair];++iband)</div>
+<div class="line"><a name="l00265"></a><span class="lineno">  265</span>       band_opt.push_back(iband);</div>
+<div class="line"><a name="l00266"></a><span class="lineno">  266</span>       }</div>
+<div class="line"><a name="l00267"></a><span class="lineno">  267</span>     }</div>
+<div class="line"><a name="l00268"></a><span class="lineno">  268</span>   }</div>
+<div class="line"><a name="l00269"></a><span class="lineno">  269</span>   <span class="keywordflow">catch</span>(<span class="keywordtype">string</span> error){</div>
+<div class="line"><a name="l00270"></a><span class="lineno">  270</span>     cerr << error << std::endl;</div>
+<div class="line"><a name="l00271"></a><span class="lineno">  271</span>     exit(1);</div>
+<div class="line"><a name="l00272"></a><span class="lineno">  272</span>   }</div>
+<div class="line"><a name="l00273"></a><span class="lineno">  273</span> </div>
+<div class="line"><a name="l00274"></a><span class="lineno">  274</span>   <span class="keywordtype">bool</span> isGeoRef=<span class="keyword">false</span>;</div>
+<div class="line"><a name="l00275"></a><span class="lineno">  275</span>   <span class="keywordtype">string</span> projectionString;</div>
+<div class="line"><a name="l00276"></a><span class="lineno">  276</span>   <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iimg=0;iimg<input_opt.size();++iimg){</div>
+<div class="line"><a name="l00277"></a><span class="lineno">  277</span>     imgReader.open(input_opt[iimg]);</div>
+<div class="line"><a name="l00278"></a><span class="lineno">  278</span>     <span class="keywordflow">if</span>(!isGeoRef)</div>
+<div class="line"><a name="l00279"></a><span class="lineno">  279</span>       isGeoRef=imgReader.isGeoRef();</div>
+<div class="line"><a name="l00280"></a><span class="lineno">  280</span>     <span class="keywordflow">if</span>(imgReader.isGeoRef()&&projection_opt.empty())</div>
+<div class="line"><a name="l00281"></a><span class="lineno">  281</span>       projectionString=imgReader.getProjection();</div>
+<div class="line"><a name="l00282"></a><span class="lineno">  282</span>     <span class="keywordflow">if</span>(dx_opt.empty()){</div>
+<div class="line"><a name="l00283"></a><span class="lineno">  283</span>       <span class="keywordflow">if</span>(!iimg||imgReader.getDeltaX()<dx)</div>
+<div class="line"><a name="l00284"></a><span class="lineno">  284</span>         dx=imgReader.getDeltaX();</div>
+<div class="line"><a name="l00285"></a><span class="lineno">  285</span>     }</div>
+<div class="line"><a name="l00286"></a><span class="lineno">  286</span>     <span class="keywordflow">if</span>(dy_opt.empty()){</div>
+<div class="line"><a name="l00287"></a><span class="lineno">  287</span>       <span class="keywordflow">if</span>(!iimg||imgReader.getDeltaY()<dy)</div>
+<div class="line"><a name="l00288"></a><span class="lineno">  288</span>         dy=imgReader.getDeltaY();</div>
+<div class="line"><a name="l00289"></a><span class="lineno">  289</span>     }</div>
+<div class="line"><a name="l00290"></a><span class="lineno">  290</span>     <span class="keywordflow">if</span>(band_opt.size())</div>
+<div class="line"><a name="l00291"></a><span class="lineno">  291</span>       ncropband+=band_opt.size();</div>
+<div class="line"><a name="l00292"></a><span class="lineno">  292</span>     <span class="keywordflow">else</span></div>
+<div class="line"><a name="l00293"></a><span class="lineno">  293</span>       ncropband+=imgReader.nrOfBand();</div>
+<div class="line"><a name="l00294"></a><span class="lineno">  294</span>     imgReader.close();</div>
+<div class="line"><a name="l00295"></a><span class="lineno">  295</span>   }</div>
+<div class="line"><a name="l00296"></a><span class="lineno">  296</span> </div>
+<div class="line"><a name="l00297"></a><span class="lineno">  297</span>   GDALDataType theType=GDT_Unknown;</div>
+<div class="line"><a name="l00298"></a><span class="lineno">  298</span>   <span class="keywordflow">if</span>(verbose_opt[0])</div>
+<div class="line"><a name="l00299"></a><span class="lineno">  299</span>     cout << <span class="stringliteral">"possible output data types: "</span>;</div>
+<div class="line"><a name="l00300"></a><span class="lineno">  300</span>   <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iType = 0; iType < GDT_TypeCount; ++iType){</div>
+<div class="line"><a name="l00301"></a><span class="lineno">  301</span>     <span class="keywordflow">if</span>(verbose_opt[0])</div>
+<div class="line"><a name="l00302"></a><span class="lineno">  302</span>       cout << <span class="stringliteral">" "</span> << GDALGetDataTypeName((GDALDataType)iType);</div>
+<div class="line"><a name="l00303"></a><span class="lineno">  303</span>     <span class="keywordflow">if</span>( GDALGetDataTypeName((GDALDataType)iType) != NULL</div>
+<div class="line"><a name="l00304"></a><span class="lineno">  304</span>         && EQUAL(GDALGetDataTypeName((GDALDataType)iType),</div>
+<div class="line"><a name="l00305"></a><span class="lineno">  305</span>                  otype_opt[0].c_str()))</div>
+<div class="line"><a name="l00306"></a><span class="lineno">  306</span>       theType=(GDALDataType) iType;</div>
+<div class="line"><a name="l00307"></a><span class="lineno">  307</span>   }</div>
+<div class="line"><a name="l00308"></a><span class="lineno">  308</span>   <span class="keywordflow">if</span>(verbose_opt[0]){</div>
+<div class="line"><a name="l00309"></a><span class="lineno">  309</span>     cout << endl;</div>
+<div class="line"><a name="l00310"></a><span class="lineno">  310</span>     <span class="keywordflow">if</span>(theType==GDT_Unknown)</div>
+<div class="line"><a name="l00311"></a><span class="lineno">  311</span>       cout << <span class="stringliteral">"Unknown output pixel type: "</span> << otype_opt[0] << endl;</div>
+<div class="line"><a name="l00312"></a><span class="lineno">  312</span>     <span class="keywordflow">else</span></div>
+<div class="line"><a name="l00313"></a><span class="lineno">  313</span>       cout << <span class="stringliteral">"Output pixel type:  "</span> << GDALGetDataTypeName(theType) << endl;</div>
 <div class="line"><a name="l00314"></a><span class="lineno">  314</span>   }</div>
-<div class="line"><a name="l00315"></a><span class="lineno">  315</span>   <span class="keywordflow">else</span> <span class="keywordflow">if</span>(cx_opt.size()&&cy_opt.size()&&nx_opt.size()&&ny_opt.size()){</div>
-<div class="line"><a name="l00316"></a><span class="lineno">  316</span>     ulx_opt[0]=cx_opt[0]-nx_opt[0]/2.0;</div>
-<div class="line"><a name="l00317"></a><span class="lineno">  317</span>     uly_opt[0]=(isGeoRef) ? cy_opt[0]+ny_opt[0]/2.0 : cy_opt[0]-ny_opt[0]/2.0;</div>
-<div class="line"><a name="l00318"></a><span class="lineno">  318</span>     lrx_opt[0]=cx_opt[0]+nx_opt[0]/2.0;</div>
-<div class="line"><a name="l00319"></a><span class="lineno">  319</span>     lry_opt[0]=(isGeoRef) ? cy_opt[0]-ny_opt[0]/2.0 : cy_opt[0]+ny_opt[0]/2.0;</div>
-<div class="line"><a name="l00320"></a><span class="lineno">  320</span>     <span class="comment">// if(cropulx<ulx_opt[0])</span></div>
-<div class="line"><a name="l00321"></a><span class="lineno">  321</span>     <span class="comment">//   cropulx=ulx_opt[0];</span></div>
-<div class="line"><a name="l00322"></a><span class="lineno">  322</span>     <span class="comment">// if(cropuly>uly_opt[0])</span></div>
-<div class="line"><a name="l00323"></a><span class="lineno">  323</span>     <span class="comment">//   cropuly=uly_opt[0];</span></div>
-<div class="line"><a name="l00324"></a><span class="lineno">  324</span>     <span class="comment">// if(croplrx>lrx_opt[0])</span></div>
-<div class="line"><a name="l00325"></a><span class="lineno">  325</span>     <span class="comment">//   croplrx=lrx_opt[0];</span></div>
-<div class="line"><a name="l00326"></a><span class="lineno">  326</span>     <span class="comment">// if(croplry<lry_opt[0])</span></div>
-<div class="line"><a name="l00327"></a><span class="lineno">  327</span>     <span class="comment">//   croplry=lry_opt[0];</span></div>
-<div class="line"><a name="l00328"></a><span class="lineno">  328</span>   }</div>
-<div class="line"><a name="l00329"></a><span class="lineno">  329</span>   <span class="keywordflow">else</span> <span class="keywordflow">if</span>(cx_opt.size()&&cy_opt.size()&&ns_opt.size()&&nl_opt.size()){</div>
-<div class="line"><a name="l00330"></a><span class="lineno">  330</span>     ulx_opt[0]=cx_opt[0]-ns_opt[0]*dx/2.0;</div>
-<div class="line"><a name="l00331"></a><span class="lineno">  331</span>     uly_opt[0]=(isGeoRef) ? cy_opt[0]+nl_opt[0]*dy/2.0 : cy_opt[0]-nl_opt[0]*dy/2.0;</div>
-<div class="line"><a name="l00332"></a><span class="lineno">  332</span>     lrx_opt[0]=cx_opt[0]+ns_opt[0]*dx/2.0;</div>
-<div class="line"><a name="l00333"></a><span class="lineno">  333</span>     lry_opt[0]=(isGeoRef) ? cy_opt[0]-nl_opt[0]*dy/2.0 : cy_opt[0]+nl_opt[0]*dy/2.0;</div>
-<div class="line"><a name="l00334"></a><span class="lineno">  334</span>     <span class="comment">// if(cropulx<ulx_opt[0])</span></div>
-<div class="line"><a name="l00335"></a><span class="lineno">  335</span>     <span class="comment">//   cropulx=ulx_opt[0];</span></div>
-<div class="line"><a name="l00336"></a><span class="lineno">  336</span>     <span class="comment">// if(cropuly>uly_opt[0])</span></div>
-<div class="line"><a name="l00337"></a><span class="lineno">  337</span>     <span class="comment">//   cropuly=uly_opt[0];</span></div>
-<div class="line"><a name="l00338"></a><span class="lineno">  338</span>     <span class="comment">// if(croplrx>lrx_opt[0])</span></div>
-<div class="line"><a name="l00339"></a><span class="lineno">  339</span>     <span class="comment">//   croplrx=lrx_opt[0];</span></div>
-<div class="line"><a name="l00340"></a><span class="lineno">  340</span>     <span class="comment">// if(croplry<lry_opt[0])</span></div>
-<div class="line"><a name="l00341"></a><span class="lineno">  341</span>     <span class="comment">//   croplry=lry_opt[0];</span></div>
-<div class="line"><a name="l00342"></a><span class="lineno">  342</span>   }</div>
-<div class="line"><a name="l00343"></a><span class="lineno">  343</span> </div>
-<div class="line"><a name="l00344"></a><span class="lineno">  344</span>   <span class="keywordflow">if</span>(verbose_opt[0])</div>
-<div class="line"><a name="l00345"></a><span class="lineno">  345</span>     cout << <span class="stringliteral">"--ulx="</span> << ulx_opt[0] << <span class="stringliteral">" --uly="</span> << uly_opt[0] << <span class="stringliteral">" --lrx="</span> << lrx_opt[0] << <span class="stringliteral">" --lry="</span> << lry_opt[0] << endl;</div>
-<div class="line"><a name="l00346"></a><span class="lineno">  346</span> </div>
-<div class="line"><a name="l00347"></a><span class="lineno">  347</span>   <span class="keywordtype">int</span> ncropcol=0;</div>
-<div class="line"><a name="l00348"></a><span class="lineno">  348</span>   <span class="keywordtype">int</span> ncroprow=0;</div>
-<div class="line"><a name="l00349"></a><span class="lineno">  349</span> </div>
-<div class="line"><a name="l00350"></a><span class="lineno">  350</span>   <a class="code" href="classImgWriterGdal.html">ImgWriterGdal</a> maskWriter;</div>
-<div class="line"><a name="l00351"></a><span class="lineno">  351</span>   <span class="keywordflow">if</span>(extent_opt.size()&&cut_opt[0]){</div>
-<div class="line"><a name="l00352"></a><span class="lineno">  352</span>     <span class="keywordflow">try</span>{</div>
-<div class="line"><a name="l00353"></a><span class="lineno">  353</span>       ncropcol=abs(static_cast<int>(ceil((lrx_opt[0]-ulx_opt[0])/dx)));</div>
-<div class="line"><a name="l00354"></a><span class="lineno">  354</span>       ncroprow=abs(static_cast<int>(ceil((uly_opt[0]-lry_opt[0])/dy)));</div>
-<div class="line"><a name="l00355"></a><span class="lineno">  355</span>       maskWriter.open(<span class="stringliteral">"/vsimem/mask.tif"</span>,ncropcol,ncroprow,1,GDT_Float32,<span class="stringliteral">"GTiff"</span>,option_opt);</div>
-<div class="line"><a name="l00356"></a><span class="lineno">  356</span>       <span class="keywordtype">double</span> gt[6];</div>
-<div class="line"><a name="l00357"></a><span class="lineno">  357</span>       gt[0]=ulx_opt[0];</div>
-<div class="line"><a name="l00358"></a><span class="lineno">  358</span>       gt[1]=dx;</div>
-<div class="line"><a name="l00359"></a><span class="lineno">  359</span>       gt[2]=0;</div>
-<div class="line"><a name="l00360"></a><span class="lineno">  360</span>       gt[3]=uly_opt[0];</div>
-<div class="line"><a name="l00361"></a><span class="lineno">  361</span>       gt[4]=0;</div>
-<div class="line"><a name="l00362"></a><span class="lineno">  362</span>       gt[5]=-dy;</div>
-<div class="line"><a name="l00363"></a><span class="lineno">  363</span>       maskWriter.setGeoTransform(gt);</div>
-<div class="line"><a name="l00364"></a><span class="lineno">  364</span>       <span class="keywordflow">if</span>(projection_opt.size())</div>
-<div class="line"><a name="l00365"></a><span class="lineno">  365</span>     maskWriter.setProjectionProj4(projection_opt[0]);</div>
-<div class="line"><a name="l00366"></a><span class="lineno">  366</span>       <span class="keywordflow">else</span> <span class="keywordflow">if</span>(projectionString.size())</div>
-<div class="line"><a name="l00367"></a><span class="lineno">  367</span>     maskWriter.setProjection(projectionString);</div>
-<div class="line"><a name="l00368"></a><span class="lineno">  368</span>     </div>
-<div class="line"><a name="l00369"></a><span class="lineno">  369</span>       <span class="comment">//todo: handle multiple extent options</span></div>
-<div class="line"><a name="l00370"></a><span class="lineno">  370</span>       vector<double> burnValues(1,1);<span class="comment">//burn value is 1 (single band)</span></div>
-<div class="line"><a name="l00371"></a><span class="lineno">  371</span>       maskWriter.rasterizeOgr(extentReader,burnValues);</div>
-<div class="line"><a name="l00372"></a><span class="lineno">  372</span>       maskWriter.close();</div>
-<div class="line"><a name="l00373"></a><span class="lineno">  373</span>     }</div>
-<div class="line"><a name="l00374"></a><span class="lineno">  374</span>     <span class="keywordflow">catch</span>(<span class="keywordtype">string</span> error){</div>
-<div class="line"><a name="l00375"></a><span class="lineno">  375</span>       cerr << error << std::endl;</div>
-<div class="line"><a name="l00376"></a><span class="lineno">  376</span>       exit(2);</div>
-<div class="line"><a name="l00377"></a><span class="lineno">  377</span>     }</div>
-<div class="line"><a name="l00378"></a><span class="lineno">  378</span>     <span class="keywordflow">catch</span>(...){</div>
-<div class="line"><a name="l00379"></a><span class="lineno">  379</span>       cerr << <span class="stringliteral">"error catched"</span> << std::endl;</div>
-<div class="line"><a name="l00380"></a><span class="lineno">  380</span>       exit(1);</div>
-<div class="line"><a name="l00381"></a><span class="lineno">  381</span>     }</div>
-<div class="line"><a name="l00382"></a><span class="lineno">  382</span>     <span class="comment">//todo: support multiple masks</span></div>
-<div class="line"><a name="l00383"></a><span class="lineno">  383</span>     mask_opt.clear();</div>
-<div class="line"><a name="l00384"></a><span class="lineno">  384</span>     mask_opt.push_back(<span class="stringliteral">"/vsimem/mask.tif"</span>);</div>
-<div class="line"><a name="l00385"></a><span class="lineno">  385</span>   }</div>
-<div class="line"><a name="l00386"></a><span class="lineno">  386</span>   <a class="code" href="classImgReaderGdal.html">ImgReaderGdal</a> maskReader;</div>
-<div class="line"><a name="l00387"></a><span class="lineno">  387</span>   <span class="keywordflow">if</span>(mask_opt.size()){</div>
-<div class="line"><a name="l00388"></a><span class="lineno">  388</span>     <span class="keywordflow">try</span>{</div>
-<div class="line"><a name="l00389"></a><span class="lineno">  389</span>       <span class="keywordflow">if</span>(verbose_opt[0]>=1)</div>
-<div class="line"><a name="l00390"></a><span class="lineno">  390</span>     std::cout << <span class="stringliteral">"opening mask image file "</span> << mask_opt[0] << std::endl;</div>
-<div class="line"><a name="l00391"></a><span class="lineno">  391</span>       maskReader.open(mask_opt[0]);</div>
-<div class="line"><a name="l00392"></a><span class="lineno">  392</span>     }</div>
-<div class="line"><a name="l00393"></a><span class="lineno">  393</span>     <span class="keywordflow">catch</span>(<span class="keywordtype">string</span> error){</div>
-<div class="line"><a name="l00394"></a><span class="lineno">  394</span>       cerr << error << std::endl;</div>
-<div class="line"><a name="l00395"></a><span class="lineno">  395</span>       exit(2);</div>
-<div class="line"><a name="l00396"></a><span class="lineno">  396</span>     }</div>
-<div class="line"><a name="l00397"></a><span class="lineno">  397</span>     <span class="keywordflow">catch</span>(...){</div>
-<div class="line"><a name="l00398"></a><span class="lineno">  398</span>       cerr << <span class="stringliteral">"error catched"</span> << std::endl;</div>
-<div class="line"><a name="l00399"></a><span class="lineno">  399</span>       exit(1);</div>
-<div class="line"><a name="l00400"></a><span class="lineno">  400</span>     }</div>
-<div class="line"><a name="l00401"></a><span class="lineno">  401</span>   }</div>
-<div class="line"><a name="l00402"></a><span class="lineno">  402</span> </div>
-<div class="line"><a name="l00403"></a><span class="lineno">  403</span>   <span class="comment">//determine number of output bands</span></div>
-<div class="line"><a name="l00404"></a><span class="lineno">  404</span>   <span class="keywordtype">int</span> writeBand=0;<span class="comment">//write band</span></div>
-<div class="line"><a name="l00405"></a><span class="lineno">  405</span> </div>
-<div class="line"><a name="l00406"></a><span class="lineno">  406</span>   <span class="keywordflow">if</span>(scale_opt.size()){</div>
-<div class="line"><a name="l00407"></a><span class="lineno">  407</span>     <span class="keywordflow">while</span>(scale_opt.size()<band_opt.size())</div>
-<div class="line"><a name="l00408"></a><span class="lineno">  408</span>       scale_opt.push_back(scale_opt[0]);</div>
-<div class="line"><a name="l00409"></a><span class="lineno">  409</span>   }</div>
-<div class="line"><a name="l00410"></a><span class="lineno">  410</span>   <span class="keywordflow">if</span>(offset_opt.size()){</div>
-<div class="line"><a name="l00411"></a><span class="lineno">  411</span>     <span class="keywordflow">while</span>(offset_opt.size()<band_opt.size())</div>
-<div class="line"><a name="l00412"></a><span class="lineno">  412</span>       offset_opt.push_back(offset_opt[0]);</div>
-<div class="line"><a name="l00413"></a><span class="lineno">  413</span>   }</div>
-<div class="line"><a name="l00414"></a><span class="lineno">  414</span>   <span class="keywordflow">if</span>(autoscale_opt.size()){</div>
-<div class="line"><a name="l00415"></a><span class="lineno">  415</span>     assert(autoscale_opt.size()%2==0);</div>
-<div class="line"><a name="l00416"></a><span class="lineno">  416</span>     <span class="comment">// while(autoscale_opt.size()<band_opt.size()*2){</span></div>
-<div class="line"><a name="l00417"></a><span class="lineno">  417</span>     <span class="comment">//   autoscale_opt.push_back(autoscale_opt[0]);</span></div>
-<div class="line"><a name="l00418"></a><span class="lineno">  418</span>     <span class="comment">//   autoscale_opt.push_back(autoscale_opt[1]);</span></div>
-<div class="line"><a name="l00419"></a><span class="lineno">  419</span>     <span class="comment">// }</span></div>
-<div class="line"><a name="l00420"></a><span class="lineno">  420</span>   }</div>
-<div class="line"><a name="l00421"></a><span class="lineno">  421</span> </div>
-<div class="line"><a name="l00422"></a><span class="lineno">  422</span>   <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iimg=0;iimg<input_opt.size();++iimg){</div>
-<div class="line"><a name="l00423"></a><span class="lineno">  423</span>     <span class="keywordflow">if</span>(verbose_opt[0])</div>
-<div class="line"><a name="l00424"></a><span class="lineno">  424</span>       cout << <span class="stringliteral">"opening image "</span> << input_opt[iimg] << endl;</div>
-<div class="line"><a name="l00425"></a><span class="lineno">  425</span>     imgReader.open(input_opt[iimg]);</div>
-<div class="line"><a name="l00426"></a><span class="lineno">  426</span>     <span class="comment">//if output type not set, get type from input image</span></div>
-<div class="line"><a name="l00427"></a><span class="lineno">  427</span>     <span class="keywordflow">if</span>(theType==GDT_Unknown){</div>
-<div class="line"><a name="l00428"></a><span class="lineno">  428</span>       theType=imgReader.getDataType();</div>
-<div class="line"><a name="l00429"></a><span class="lineno">  429</span>       <span class="keywordflow">if</span>(verbose_opt[0])</div>
-<div class="line"><a name="l00430"></a><span class="lineno">  430</span>         cout << <span class="stringliteral">"Using data type from input image: "</span> << GDALGetDataTypeName(theType) << endl;</div>
-<div class="line"><a name="l00431"></a><span class="lineno">  431</span>     }</div>
-<div class="line"><a name="l00432"></a><span class="lineno">  432</span>     <span class="keywordflow">if</span>(option_opt.findSubstring(<span class="stringliteral">"INTERLEAVE="</span>)==option_opt.end()){</div>
-<div class="line"><a name="l00433"></a><span class="lineno">  433</span>       <span class="keywordtype">string</span> theInterleave=<span class="stringliteral">"INTERLEAVE="</span>;</div>
-<div class="line"><a name="l00434"></a><span class="lineno">  434</span>       theInterleave+=imgReader.getInterleave();</div>
-<div class="line"><a name="l00435"></a><span class="lineno">  435</span>       option_opt.push_back(theInterleave);</div>
+<div class="line"><a name="l00315"></a><span class="lineno">  315</span>   <span class="comment">//bounding box of cropped image</span></div>
+<div class="line"><a name="l00316"></a><span class="lineno">  316</span>   <span class="keywordtype">double</span> cropulx=ulx_opt[0];</div>
+<div class="line"><a name="l00317"></a><span class="lineno">  317</span>   <span class="keywordtype">double</span> cropuly=uly_opt[0];</div>
+<div class="line"><a name="l00318"></a><span class="lineno">  318</span>   <span class="keywordtype">double</span> croplrx=lrx_opt[0];</div>
+<div class="line"><a name="l00319"></a><span class="lineno">  319</span>   <span class="keywordtype">double</span> croplry=lry_opt[0];</div>
+<div class="line"><a name="l00320"></a><span class="lineno">  320</span>   <span class="comment">//get bounding box from extentReader if defined</span></div>
+<div class="line"><a name="l00321"></a><span class="lineno">  321</span>   <a class="code" href="classImgReaderOgr.html">ImgReaderOgr</a> extentReader;</div>
+<div class="line"><a name="l00322"></a><span class="lineno">  322</span> </div>
+<div class="line"><a name="l00323"></a><span class="lineno">  323</span>   <span class="keywordflow">if</span>(extent_opt.size()){</div>
+<div class="line"><a name="l00324"></a><span class="lineno">  324</span>     <span class="keywordtype">double</span> e_ulx;</div>
+<div class="line"><a name="l00325"></a><span class="lineno">  325</span>     <span class="keywordtype">double</span> e_uly;</div>
+<div class="line"><a name="l00326"></a><span class="lineno">  326</span>     <span class="keywordtype">double</span> e_lrx;</div>
+<div class="line"><a name="l00327"></a><span class="lineno">  327</span>     <span class="keywordtype">double</span> e_lry;</div>
+<div class="line"><a name="l00328"></a><span class="lineno">  328</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iextent=0;iextent<extent_opt.size();++iextent){</div>
+<div class="line"><a name="l00329"></a><span class="lineno">  329</span>       extentReader.open(extent_opt[iextent]);</div>
+<div class="line"><a name="l00330"></a><span class="lineno">  330</span>       <span class="keywordflow">if</span>(!(extentReader.getExtent(e_ulx,e_uly,e_lrx,e_lry))){</div>
+<div class="line"><a name="l00331"></a><span class="lineno">  331</span>         cerr << <span class="stringliteral">"Error: could not get extent from "</span> << extent_opt[0] << endl;</div>
+<div class="line"><a name="l00332"></a><span class="lineno">  332</span>         exit(1);</div>
+<div class="line"><a name="l00333"></a><span class="lineno">  333</span>       }</div>
+<div class="line"><a name="l00334"></a><span class="lineno">  334</span>       <span class="keywordflow">if</span>(!iextent){</div>
+<div class="line"><a name="l00335"></a><span class="lineno">  335</span>     ulx_opt[0]=e_ulx;</div>
+<div class="line"><a name="l00336"></a><span class="lineno">  336</span>     uly_opt[0]=e_uly;</div>
+<div class="line"><a name="l00337"></a><span class="lineno">  337</span>     lrx_opt[0]=e_lrx;</div>
+<div class="line"><a name="l00338"></a><span class="lineno">  338</span>     lry_opt[0]=e_lry;</div>
+<div class="line"><a name="l00339"></a><span class="lineno">  339</span>       }</div>
+<div class="line"><a name="l00340"></a><span class="lineno">  340</span>       <span class="keywordflow">else</span>{</div>
+<div class="line"><a name="l00341"></a><span class="lineno">  341</span>     <span class="keywordflow">if</span>(e_ulx<ulx_opt[0])</div>
+<div class="line"><a name="l00342"></a><span class="lineno">  342</span>       ulx_opt[0]=e_ulx;</div>
+<div class="line"><a name="l00343"></a><span class="lineno">  343</span>     <span class="keywordflow">if</span>(e_uly>uly_opt[0])</div>
+<div class="line"><a name="l00344"></a><span class="lineno">  344</span>       uly_opt[0]=e_uly;</div>
+<div class="line"><a name="l00345"></a><span class="lineno">  345</span>     <span class="keywordflow">if</span>(e_lrx>lrx_opt[0])</div>
+<div class="line"><a name="l00346"></a><span class="lineno">  346</span>       lrx_opt[0]=e_lrx;</div>
+<div class="line"><a name="l00347"></a><span class="lineno">  347</span>     <span class="keywordflow">if</span>(e_lry<lry_opt[0])</div>
+<div class="line"><a name="l00348"></a><span class="lineno">  348</span>       lry_opt[0]=e_lry;</div>
+<div class="line"><a name="l00349"></a><span class="lineno">  349</span>       }</div>
+<div class="line"><a name="l00350"></a><span class="lineno">  350</span>       extentReader.close();</div>
+<div class="line"><a name="l00351"></a><span class="lineno">  351</span>     }</div>
+<div class="line"><a name="l00352"></a><span class="lineno">  352</span>     <span class="keywordflow">if</span>(cut_opt.size())</div>
+<div class="line"><a name="l00353"></a><span class="lineno">  353</span>       extentReader.open(extent_opt[0]);</div>
+<div class="line"><a name="l00354"></a><span class="lineno">  354</span>   }</div>
+<div class="line"><a name="l00355"></a><span class="lineno">  355</span>   <span class="keywordflow">else</span> <span class="keywordflow">if</span>(cx_opt.size()&&cy_opt.size()&&nx_opt.size()&&ny_opt.size()){</div>
+<div class="line"><a name="l00356"></a><span class="lineno">  356</span>     ulx_opt[0]=cx_opt[0]-nx_opt[0]/2.0;</div>
+<div class="line"><a name="l00357"></a><span class="lineno">  357</span>     uly_opt[0]=(isGeoRef) ? cy_opt[0]+ny_opt[0]/2.0 : cy_opt[0]-ny_opt[0]/2.0;</div>
+<div class="line"><a name="l00358"></a><span class="lineno">  358</span>     lrx_opt[0]=cx_opt[0]+nx_opt[0]/2.0;</div>
+<div class="line"><a name="l00359"></a><span class="lineno">  359</span>     lry_opt[0]=(isGeoRef) ? cy_opt[0]-ny_opt[0]/2.0 : cy_opt[0]+ny_opt[0]/2.0;</div>
+<div class="line"><a name="l00360"></a><span class="lineno">  360</span>     <span class="comment">// if(cropulx<ulx_opt[0])</span></div>
+<div class="line"><a name="l00361"></a><span class="lineno">  361</span>     <span class="comment">//   cropulx=ulx_opt[0];</span></div>
+<div class="line"><a name="l00362"></a><span class="lineno">  362</span>     <span class="comment">// if(cropuly>uly_opt[0])</span></div>
+<div class="line"><a name="l00363"></a><span class="lineno">  363</span>     <span class="comment">//   cropuly=uly_opt[0];</span></div>
+<div class="line"><a name="l00364"></a><span class="lineno">  364</span>     <span class="comment">// if(croplrx>lrx_opt[0])</span></div>
+<div class="line"><a name="l00365"></a><span class="lineno">  365</span>     <span class="comment">//   croplrx=lrx_opt[0];</span></div>
+<div class="line"><a name="l00366"></a><span class="lineno">  366</span>     <span class="comment">// if(croplry<lry_opt[0])</span></div>
+<div class="line"><a name="l00367"></a><span class="lineno">  367</span>     <span class="comment">//   croplry=lry_opt[0];</span></div>
+<div class="line"><a name="l00368"></a><span class="lineno">  368</span>   }</div>
+<div class="line"><a name="l00369"></a><span class="lineno">  369</span>   <span class="keywordflow">else</span> <span class="keywordflow">if</span>(cx_opt.size()&&cy_opt.size()&&ns_opt.size()&&nl_opt.size()){</div>
+<div class="line"><a name="l00370"></a><span class="lineno">  370</span>     ulx_opt[0]=cx_opt[0]-ns_opt[0]*dx/2.0;</div>
+<div class="line"><a name="l00371"></a><span class="lineno">  371</span>     uly_opt[0]=(isGeoRef) ? cy_opt[0]+nl_opt[0]*dy/2.0 : cy_opt[0]-nl_opt[0]*dy/2.0;</div>
+<div class="line"><a name="l00372"></a><span class="lineno">  372</span>     lrx_opt[0]=cx_opt[0]+ns_opt[0]*dx/2.0;</div>
+<div class="line"><a name="l00373"></a><span class="lineno">  373</span>     lry_opt[0]=(isGeoRef) ? cy_opt[0]-nl_opt[0]*dy/2.0 : cy_opt[0]+nl_opt[0]*dy/2.0;</div>
+<div class="line"><a name="l00374"></a><span class="lineno">  374</span>     <span class="comment">// if(cropulx<ulx_opt[0])</span></div>
+<div class="line"><a name="l00375"></a><span class="lineno">  375</span>     <span class="comment">//   cropulx=ulx_opt[0];</span></div>
+<div class="line"><a name="l00376"></a><span class="lineno">  376</span>     <span class="comment">// if(cropuly>uly_opt[0])</span></div>
+<div class="line"><a name="l00377"></a><span class="lineno">  377</span>     <span class="comment">//   cropuly=uly_opt[0];</span></div>
+<div class="line"><a name="l00378"></a><span class="lineno">  378</span>     <span class="comment">// if(croplrx>lrx_opt[0])</span></div>
+<div class="line"><a name="l00379"></a><span class="lineno">  379</span>     <span class="comment">//   croplrx=lrx_opt[0];</span></div>
+<div class="line"><a name="l00380"></a><span class="lineno">  380</span>     <span class="comment">// if(croplry<lry_opt[0])</span></div>
+<div class="line"><a name="l00381"></a><span class="lineno">  381</span>     <span class="comment">//   croplry=lry_opt[0];</span></div>
+<div class="line"><a name="l00382"></a><span class="lineno">  382</span>   }</div>
+<div class="line"><a name="l00383"></a><span class="lineno">  383</span> </div>
+<div class="line"><a name="l00384"></a><span class="lineno">  384</span>   <span class="keywordflow">if</span>(verbose_opt[0])</div>
+<div class="line"><a name="l00385"></a><span class="lineno">  385</span>     cout << <span class="stringliteral">"--ulx="</span> << ulx_opt[0] << <span class="stringliteral">" --uly="</span> << uly_opt[0] << <span class="stringliteral">" --lrx="</span> << lrx_opt[0] << <span class="stringliteral">" --lry="</span> << lry_opt[0] << endl;</div>
+<div class="line"><a name="l00386"></a><span class="lineno">  386</span> </div>
+<div class="line"><a name="l00387"></a><span class="lineno">  387</span>   <span class="keywordtype">int</span> ncropcol=0;</div>
+<div class="line"><a name="l00388"></a><span class="lineno">  388</span>   <span class="keywordtype">int</span> ncroprow=0;</div>
+<div class="line"><a name="l00389"></a><span class="lineno">  389</span> </div>
+<div class="line"><a name="l00390"></a><span class="lineno">  390</span>   <a class="code" href="classImgWriterGdal.html">ImgWriterGdal</a> maskWriter;</div>
+<div class="line"><a name="l00391"></a><span class="lineno">  391</span>   <span class="keywordflow">if</span>(extent_opt.size()&&cut_opt[0]){</div>
+<div class="line"><a name="l00392"></a><span class="lineno">  392</span>     <span class="keywordflow">try</span>{</div>
+<div class="line"><a name="l00393"></a><span class="lineno">  393</span>       ncropcol=abs(static_cast<int>(ceil((lrx_opt[0]-ulx_opt[0])/dx)));</div>
+<div class="line"><a name="l00394"></a><span class="lineno">  394</span>       ncroprow=abs(static_cast<int>(ceil((uly_opt[0]-lry_opt[0])/dy)));</div>
+<div class="line"><a name="l00395"></a><span class="lineno">  395</span>       maskWriter.open(<span class="stringliteral">"/vsimem/mask.tif"</span>,ncropcol,ncroprow,1,GDT_Float32,<span class="stringliteral">"GTiff"</span>,option_opt);</div>
+<div class="line"><a name="l00396"></a><span class="lineno">  396</span>       <span class="keywordtype">double</span> gt[6];</div>
+<div class="line"><a name="l00397"></a><span class="lineno">  397</span>       gt[0]=ulx_opt[0];</div>
+<div class="line"><a name="l00398"></a><span class="lineno">  398</span>       gt[1]=dx;</div>
+<div class="line"><a name="l00399"></a><span class="lineno">  399</span>       gt[2]=0;</div>
+<div class="line"><a name="l00400"></a><span class="lineno">  400</span>       gt[3]=uly_opt[0];</div>
+<div class="line"><a name="l00401"></a><span class="lineno">  401</span>       gt[4]=0;</div>
+<div class="line"><a name="l00402"></a><span class="lineno">  402</span>       gt[5]=-dy;</div>
+<div class="line"><a name="l00403"></a><span class="lineno">  403</span>       maskWriter.setGeoTransform(gt);</div>
+<div class="line"><a name="l00404"></a><span class="lineno">  404</span>       <span class="keywordflow">if</span>(projection_opt.size())</div>
+<div class="line"><a name="l00405"></a><span class="lineno">  405</span>     maskWriter.setProjectionProj4(projection_opt[0]);</div>
+<div class="line"><a name="l00406"></a><span class="lineno">  406</span>       <span class="keywordflow">else</span> <span class="keywordflow">if</span>(projectionString.size())</div>
+<div class="line"><a name="l00407"></a><span class="lineno">  407</span>     maskWriter.setProjection(projectionString);</div>
+<div class="line"><a name="l00408"></a><span class="lineno">  408</span>     </div>
+<div class="line"><a name="l00409"></a><span class="lineno">  409</span>       <span class="comment">//todo: handle multiple extent options</span></div>
+<div class="line"><a name="l00410"></a><span class="lineno">  410</span>       vector<double> burnValues(1,1);<span class="comment">//burn value is 1 (single band)</span></div>
+<div class="line"><a name="l00411"></a><span class="lineno">  411</span>       maskWriter.rasterizeOgr(extentReader,burnValues);</div>
+<div class="line"><a name="l00412"></a><span class="lineno">  412</span>       maskWriter.close();</div>
+<div class="line"><a name="l00413"></a><span class="lineno">  413</span>     }</div>
+<div class="line"><a name="l00414"></a><span class="lineno">  414</span>     <span class="keywordflow">catch</span>(<span class="keywordtype">string</span> error){</div>
+<div class="line"><a name="l00415"></a><span class="lineno">  415</span>       cerr << error << std::endl;</div>
+<div class="line"><a name="l00416"></a><span class="lineno">  416</span>       exit(2);</div>
+<div class="line"><a name="l00417"></a><span class="lineno">  417</span>     }</div>
+<div class="line"><a name="l00418"></a><span class="lineno">  418</span>     <span class="keywordflow">catch</span>(...){</div>
+<div class="line"><a name="l00419"></a><span class="lineno">  419</span>       cerr << <span class="stringliteral">"error catched"</span> << std::endl;</div>
+<div class="line"><a name="l00420"></a><span class="lineno">  420</span>       exit(1);</div>
+<div class="line"><a name="l00421"></a><span class="lineno">  421</span>     }</div>
+<div class="line"><a name="l00422"></a><span class="lineno">  422</span>     <span class="comment">//todo: support multiple masks</span></div>
+<div class="line"><a name="l00423"></a><span class="lineno">  423</span>     mask_opt.clear();</div>
+<div class="line"><a name="l00424"></a><span class="lineno">  424</span>     mask_opt.push_back(<span class="stringliteral">"/vsimem/mask.tif"</span>);</div>
+<div class="line"><a name="l00425"></a><span class="lineno">  425</span>   }</div>
+<div class="line"><a name="l00426"></a><span class="lineno">  426</span>   <a class="code" href="classImgReaderGdal.html">ImgReaderGdal</a> maskReader;</div>
+<div class="line"><a name="l00427"></a><span class="lineno">  427</span>   <span class="keywordflow">if</span>(mask_opt.size()){</div>
+<div class="line"><a name="l00428"></a><span class="lineno">  428</span>     <span class="keywordflow">try</span>{</div>
+<div class="line"><a name="l00429"></a><span class="lineno">  429</span>       <span class="keywordflow">if</span>(verbose_opt[0]>=1)</div>
+<div class="line"><a name="l00430"></a><span class="lineno">  430</span>     std::cout << <span class="stringliteral">"opening mask image file "</span> << mask_opt[0] << std::endl;</div>
+<div class="line"><a name="l00431"></a><span class="lineno">  431</span>       maskReader.open(mask_opt[0]);</div>
+<div class="line"><a name="l00432"></a><span class="lineno">  432</span>       <span class="keywordflow">if</span>(mskband_opt[0]>=maskReader.nrOfBand()){</div>
+<div class="line"><a name="l00433"></a><span class="lineno">  433</span>     <span class="keywordtype">string</span> errorString=<span class="stringliteral">"Error: illegal mask band"</span>;</div>
+<div class="line"><a name="l00434"></a><span class="lineno">  434</span>     <span class="keywordflow">throw</span>(errorString);</div>
+<div class="line"><a name="l00435"></a><span class="lineno">  435</span>       }</div>
 <div class="line"><a name="l00436"></a><span class="lineno">  436</span>     }</div>
-<div class="line"><a name="l00437"></a><span class="lineno">  437</span>     <span class="keywordtype">int</span> nrow=imgReader.nrOfRow();</div>
-<div class="line"><a name="l00438"></a><span class="lineno">  438</span>     <span class="keywordtype">int</span> ncol=imgReader.nrOfCol();</div>
-<div class="line"><a name="l00439"></a><span class="lineno">  439</span>     <span class="comment">// if(!dx||!dy){</span></div>
-<div class="line"><a name="l00440"></a><span class="lineno">  440</span>     <span class="comment">//   dx=imgReader.getDeltaX();</span></div>
-<div class="line"><a name="l00441"></a><span class="lineno">  441</span>     <span class="comment">//   dy=imgReader.getDeltaY();</span></div>
-<div class="line"><a name="l00442"></a><span class="lineno">  442</span>     <span class="comment">// }</span></div>
-<div class="line"><a name="l00443"></a><span class="lineno">  443</span>     <span class="keywordflow">if</span>(verbose_opt[0])</div>
-<div class="line"><a name="l00444"></a><span class="lineno">  444</span>       cout << <span class="stringliteral">"size of "</span> << input_opt[iimg] << <span class="stringliteral">": "</span> << ncol << <span class="stringliteral">" cols, "</span><< nrow << <span class="stringliteral">" rows"</span> << endl;</div>
-<div class="line"><a name="l00445"></a><span class="lineno">  445</span>     <span class="keywordtype">double</span> uli,ulj,lri,lrj;<span class="comment">//image coordinates</span></div>
-<div class="line"><a name="l00446"></a><span class="lineno">  446</span>     <span class="keywordtype">bool</span> forceEUgrid=<span class="keyword">false</span>;</div>
-<div class="line"><a name="l00447"></a><span class="lineno">  447</span>     <span class="keywordflow">if</span>(projection_opt.size())</div>
-<div class="line"><a name="l00448"></a><span class="lineno">  448</span>       forceEUgrid=(!(projection_opt[0].compare(<span class="stringliteral">"EPSG:3035"</span>))||!(projection_opt[0].compare(<span class="stringliteral">"EPSG:3035"</span>))||projection_opt[0].find(<span class="stringliteral">"ETRS-LAEA"</span>)!=string::npos);</div>
-<div class="line"><a name="l00449"></a><span class="lineno">  449</span>     <span class="keywordflow">if</span>(ulx_opt[0]>=lrx_opt[0]){<span class="comment">//default bounding box: no cropping</span></div>
-<div class="line"><a name="l00450"></a><span class="lineno">  450</span>       uli=0;</div>
-<div class="line"><a name="l00451"></a><span class="lineno">  451</span>       lri=imgReader.nrOfCol()-1;</div>
-<div class="line"><a name="l00452"></a><span class="lineno">  452</span>       ulj=0;</div>
-<div class="line"><a name="l00453"></a><span class="lineno">  453</span>       lrj=imgReader.nrOfRow()-1;</div>
-<div class="line"><a name="l00454"></a><span class="lineno">  454</span>       ncropcol=imgReader.nrOfCol();</div>
-<div class="line"><a name="l00455"></a><span class="lineno">  455</span>       ncroprow=imgReader.nrOfRow();</div>
-<div class="line"><a name="l00456"></a><span class="lineno">  456</span>       imgReader.getBoundingBox(cropulx,cropuly,croplrx,croplry);</div>
-<div class="line"><a name="l00457"></a><span class="lineno">  457</span>       <span class="keywordtype">double</span> magicX=1,magicY=1;</div>
-<div class="line"><a name="l00458"></a><span class="lineno">  458</span>       <span class="comment">// imgReader.getMagicPixel(magicX,magicY);</span></div>
-<div class="line"><a name="l00459"></a><span class="lineno">  459</span>       <span class="keywordflow">if</span>(forceEUgrid){</div>
-<div class="line"><a name="l00460"></a><span class="lineno">  460</span>     <span class="comment">//force to LAEA grid</span></div>
-<div class="line"><a name="l00461"></a><span class="lineno">  461</span>     <a class="code" href="classEgcs.html">Egcs</a> egcs;</div>
-<div class="line"><a name="l00462"></a><span class="lineno">  462</span>         egcs.setLevel(egcs.res2level(dx));</div>
-<div class="line"><a name="l00463"></a><span class="lineno">  463</span>     egcs.force2grid(cropulx,cropuly,croplrx,croplry);</div>
-<div class="line"><a name="l00464"></a><span class="lineno">  464</span>     imgReader.geo2image(cropulx+(magicX-1.0)*imgReader.getDeltaX(),cropuly-(magicY-1.0)*imgReader.getDeltaY(),uli,ulj);</div>
-<div class="line"><a name="l00465"></a><span class="lineno">  465</span>     imgReader.geo2image(croplrx+(magicX-2.0)*imgReader.getDeltaX(),croplry-(magicY-2.0)*imgReader.getDeltaY(),lri,lrj);</div>
-<div class="line"><a name="l00466"></a><span class="lineno">  466</span>       }</div>
-<div class="line"><a name="l00467"></a><span class="lineno">  467</span>       imgReader.geo2image(cropulx+(magicX-1.0)*imgReader.getDeltaX(),cropuly-(magicY-1.0)*imgReader.getDeltaY(),uli,ulj);</div>
-<div class="line"><a name="l00468"></a><span class="lineno">  468</span>       imgReader.geo2image(croplrx+(magicX-2.0)*imgReader.getDeltaX(),croplry-(magicY-2.0)*imgReader.getDeltaY(),lri,lrj);</div>
-<div class="line"><a name="l00469"></a><span class="lineno">  469</span>       <span class="comment">//test</span></div>
-<div class="line"><a name="l00470"></a><span class="lineno">  470</span>       ncropcol=abs(static_cast<int>(ceil((croplrx-cropulx)/dx)));</div>
-<div class="line"><a name="l00471"></a><span class="lineno">  471</span>       ncroprow=abs(static_cast<int>(ceil((cropuly-croplry)/dy)));</div>
-<div class="line"><a name="l00472"></a><span class="lineno">  472</span>     }</div>
-<div class="line"><a name="l00473"></a><span class="lineno">  473</span>     <span class="keywordflow">else</span>{</div>
-<div class="line"><a name="l00474"></a><span class="lineno">  474</span>       <span class="keywordtype">double</span> magicX=1,magicY=1;</div>
-<div class="line"><a name="l00475"></a><span class="lineno">  475</span>       <span class="comment">// imgReader.getMagicPixel(magicX,magicY);</span></div>
-<div class="line"><a name="l00476"></a><span class="lineno">  476</span>       cropulx=ulx_opt[0];</div>
-<div class="line"><a name="l00477"></a><span class="lineno">  477</span>       cropuly=uly_opt[0];</div>
-<div class="line"><a name="l00478"></a><span class="lineno">  478</span>       croplrx=lrx_opt[0];</div>
-<div class="line"><a name="l00479"></a><span class="lineno">  479</span>       croplry=lry_opt[0];</div>
-<div class="line"><a name="l00480"></a><span class="lineno">  480</span>       <span class="keywordflow">if</span>(forceEUgrid){</div>
-<div class="line"><a name="l00481"></a><span class="lineno">  481</span>     <span class="comment">//force to LAEA grid</span></div>
-<div class="line"><a name="l00482"></a><span class="lineno">  482</span>     <a class="code" href="classEgcs.html">Egcs</a> egcs;</div>
-<div class="line"><a name="l00483"></a><span class="lineno">  483</span>         egcs.setLevel(egcs.res2level(dx));</div>
-<div class="line"><a name="l00484"></a><span class="lineno">  484</span>     egcs.force2grid(cropulx,cropuly,croplrx,croplry);</div>
-<div class="line"><a name="l00485"></a><span class="lineno">  485</span>     imgReader.geo2image(cropulx+(magicX-1.0)*imgReader.getDeltaX(),cropuly-(magicY-1.0)*imgReader.getDeltaY(),uli,ulj);</div>
-<div class="line"><a name="l00486"></a><span class="lineno">  486</span>     imgReader.geo2image(croplrx+(magicX-2.0)*imgReader.getDeltaX(),croplry-(magicY-2.0)*imgReader.getDeltaY(),lri,lrj);</div>
-<div class="line"><a name="l00487"></a><span class="lineno">  487</span>       }</div>
-<div class="line"><a name="l00488"></a><span class="lineno">  488</span>       imgReader.geo2image(cropulx+(magicX-1.0)*imgReader.getDeltaX(),cropuly-(magicY-1.0)*imgReader.getDeltaY(),uli,ulj);</div>
-<div class="line"><a name="l00489"></a><span class="lineno">  489</span>       imgReader.geo2image(croplrx+(magicX-2.0)*imgReader.getDeltaX(),croplry-(magicY-2.0)*imgReader.getDeltaY(),lri,lrj);</div>
-<div class="line"><a name="l00490"></a><span class="lineno">  490</span> </div>
-<div class="line"><a name="l00491"></a><span class="lineno">  491</span>       ncropcol=abs(static_cast<int>(ceil((croplrx-cropulx)/dx)));</div>
-<div class="line"><a name="l00492"></a><span class="lineno">  492</span>       ncroprow=abs(static_cast<int>(ceil((cropuly-croplry)/dy)));</div>
-<div class="line"><a name="l00493"></a><span class="lineno">  493</span>       uli=floor(uli);</div>
-<div class="line"><a name="l00494"></a><span class="lineno">  494</span>       ulj=floor(ulj);</div>
-<div class="line"><a name="l00495"></a><span class="lineno">  495</span>       lri=floor(lri);</div>
-<div class="line"><a name="l00496"></a><span class="lineno">  496</span>       lrj=floor(lrj);</div>
-<div class="line"><a name="l00497"></a><span class="lineno">  497</span>     }</div>
-<div class="line"><a name="l00498"></a><span class="lineno">  498</span> </div>
-<div class="line"><a name="l00499"></a><span class="lineno">  499</span>     <span class="keywordtype">double</span> dcropcol=0;</div>
-<div class="line"><a name="l00500"></a><span class="lineno">  500</span>     <span class="keywordtype">double</span> dcroprow=0;</div>
-<div class="line"><a name="l00501"></a><span class="lineno">  501</span>     <span class="keywordtype">double</span> deltaX=imgReader.getDeltaX();</div>
-<div class="line"><a name="l00502"></a><span class="lineno">  502</span>     <span class="keywordtype">double</span> deltaY=imgReader.getDeltaY();</div>
-<div class="line"><a name="l00503"></a><span class="lineno">  503</span>     dcropcol=(lri-uli+1)/(dx/deltaX);</div>
-<div class="line"><a name="l00504"></a><span class="lineno">  504</span>     dcroprow=(lrj-ulj+1)/(dy/deltaY);</div>
-<div class="line"><a name="l00505"></a><span class="lineno">  505</span>     <span class="keywordflow">if</span>(!imgWriter.nrOfBand()){<span class="comment">//not opened yet</span></div>
-<div class="line"><a name="l00506"></a><span class="lineno">  506</span>       <span class="keywordflow">if</span>(verbose_opt[0]){</div>
-<div class="line"><a name="l00507"></a><span class="lineno">  507</span>     cout << <span class="stringliteral">"cropulx: "</span> << cropulx << endl;</div>
-<div class="line"><a name="l00508"></a><span class="lineno">  508</span>     cout << <span class="stringliteral">"cropuly: "</span> << cropuly << endl;</div>
-<div class="line"><a name="l00509"></a><span class="lineno">  509</span>     cout << <span class="stringliteral">"croplrx: "</span> << croplrx << endl;</div>
-<div class="line"><a name="l00510"></a><span class="lineno">  510</span>     cout << <span class="stringliteral">"croplry: "</span> << croplry << endl;</div>
-<div class="line"><a name="l00511"></a><span class="lineno">  511</span>     cout << <span class="stringliteral">"ncropcol: "</span> << ncropcol << endl;</div>
-<div class="line"><a name="l00512"></a><span class="lineno">  512</span>     cout << <span class="stringliteral">"ncroprow: "</span> << ncroprow << endl;</div>
-<div class="line"><a name="l00513"></a><span class="lineno">  513</span>     cout << <span class="stringliteral">"cropulx+ncropcol*dx: "</span> << cropulx+ncropcol*dx << endl;</div>
-<div class="line"><a name="l00514"></a><span class="lineno">  514</span>     cout << <span class="stringliteral">"cropuly-ncroprow*dy: "</span> << cropuly-ncroprow*dy << endl;</div>
-<div class="line"><a name="l00515"></a><span class="lineno">  515</span>     cout << <span class="stringliteral">"upper left column of input image: "</span> << uli << endl;</div>
-<div class="line"><a name="l00516"></a><span class="lineno">  516</span>     cout << <span class="stringliteral">"upper left row of input image: "</span> << ulj << endl;</div>
-<div class="line"><a name="l00517"></a><span class="lineno">  517</span>     cout << <span class="stringliteral">"lower right column of input image: "</span> << lri << endl;</div>
-<div class="line"><a name="l00518"></a><span class="lineno">  518</span>     cout << <span class="stringliteral">"lower right row of input image: "</span> << lrj << endl;</div>
-<div class="line"><a name="l00519"></a><span class="lineno">  519</span>     cout << <span class="stringliteral">"new number of cols: "</span> << ncropcol << endl;</div>
-<div class="line"><a name="l00520"></a><span class="lineno">  520</span>     cout << <span class="stringliteral">"new number of rows: "</span> << ncroprow << endl;</div>
-<div class="line"><a name="l00521"></a><span class="lineno">  521</span>     cout << <span class="stringliteral">"new number of bands: "</span> << ncropband << endl;</div>
-<div class="line"><a name="l00522"></a><span class="lineno">  522</span>       }</div>
-<div class="line"><a name="l00523"></a><span class="lineno">  523</span>       <span class="comment">// string theCompression;</span></div>
-<div class="line"><a name="l00524"></a><span class="lineno">  524</span>       <span class="comment">// if(compress_opt[0]!="")//default</span></div>
-<div class="line"><a name="l00525"></a><span class="lineno">  525</span>       <span class="comment">//   theCompression=compress_opt[0];</span></div>
-<div class="line"><a name="l00526"></a><span class="lineno">  526</span>       <span class="comment">// else</span></div>
-<div class="line"><a name="l00527"></a><span class="lineno">  527</span>       <span class="comment">//   theCompression=imgReader.getCompression();</span></div>
-<div class="line"><a name="l00528"></a><span class="lineno">  528</span>       <span class="comment">// string theInterleave;</span></div>
-<div class="line"><a name="l00529"></a><span class="lineno">  529</span>       <span class="comment">// if(interleave_opt[0]!="")//default</span></div>
-<div class="line"><a name="l00530"></a><span class="lineno">  530</span>       <span class="comment">//   theInterleave=interleave_opt[0];</span></div>
-<div class="line"><a name="l00531"></a><span class="lineno">  531</span>       <span class="comment">// else</span></div>
-<div class="line"><a name="l00532"></a><span class="lineno">  532</span>       <span class="comment">//   theInterleave=imgReader.getInterleave();</span></div>
-<div class="line"><a name="l00533"></a><span class="lineno">  533</span>       <span class="keywordtype">string</span> imageType=imgReader.getImageType();</div>
-<div class="line"><a name="l00534"></a><span class="lineno">  534</span>       <span class="keywordflow">if</span>(oformat_opt.size())<span class="comment">//default</span></div>
-<div class="line"><a name="l00535"></a><span class="lineno">  535</span>         imageType=oformat_opt[0];</div>
-<div class="line"><a name="l00536"></a><span class="lineno">  536</span>       <span class="keywordflow">try</span>{</div>
-<div class="line"><a name="l00537"></a><span class="lineno">  537</span>         imgWriter.open(output_opt[0],ncropcol,ncroprow,ncropband,theType,imageType,option_opt);</div>
-<div class="line"><a name="l00538"></a><span class="lineno">  538</span>     <span class="keywordflow">if</span>(nodata_opt.size()){</div>
-<div class="line"><a name="l00539"></a><span class="lineno">  539</span>       <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iband=0;iband<ncropband;++iband)</div>
-<div class="line"><a name="l00540"></a><span class="lineno">  540</span>         imgWriter.GDALSetNoDataValue(nodata_opt[0],iband);</div>
+<div class="line"><a name="l00437"></a><span class="lineno">  437</span>     <span class="keywordflow">catch</span>(<span class="keywordtype">string</span> error){</div>
+<div class="line"><a name="l00438"></a><span class="lineno">  438</span>       cerr << error << std::endl;</div>
+<div class="line"><a name="l00439"></a><span class="lineno">  439</span>       exit(2);</div>
+<div class="line"><a name="l00440"></a><span class="lineno">  440</span>     }</div>
+<div class="line"><a name="l00441"></a><span class="lineno">  441</span>     <span class="keywordflow">catch</span>(...){</div>
+<div class="line"><a name="l00442"></a><span class="lineno">  442</span>       cerr << <span class="stringliteral">"error catched"</span> << std::endl;</div>
+<div class="line"><a name="l00443"></a><span class="lineno">  443</span>       exit(1);</div>
+<div class="line"><a name="l00444"></a><span class="lineno">  444</span>     }</div>
+<div class="line"><a name="l00445"></a><span class="lineno">  445</span>   }</div>
+<div class="line"><a name="l00446"></a><span class="lineno">  446</span> </div>
+<div class="line"><a name="l00447"></a><span class="lineno">  447</span>   <span class="comment">//determine number of output bands</span></div>
+<div class="line"><a name="l00448"></a><span class="lineno">  448</span>   <span class="keywordtype">int</span> writeBand=0;<span class="comment">//write band</span></div>
+<div class="line"><a name="l00449"></a><span class="lineno">  449</span> </div>
+<div class="line"><a name="l00450"></a><span class="lineno">  450</span>   <span class="keywordflow">if</span>(scale_opt.size()){</div>
+<div class="line"><a name="l00451"></a><span class="lineno">  451</span>     <span class="keywordflow">while</span>(scale_opt.size()<band_opt.size())</div>
+<div class="line"><a name="l00452"></a><span class="lineno">  452</span>       scale_opt.push_back(scale_opt[0]);</div>
+<div class="line"><a name="l00453"></a><span class="lineno">  453</span>   }</div>
+<div class="line"><a name="l00454"></a><span class="lineno">  454</span>   <span class="keywordflow">if</span>(offset_opt.size()){</div>
+<div class="line"><a name="l00455"></a><span class="lineno">  455</span>     <span class="keywordflow">while</span>(offset_opt.size()<band_opt.size())</div>
+<div class="line"><a name="l00456"></a><span class="lineno">  456</span>       offset_opt.push_back(offset_opt[0]);</div>
+<div class="line"><a name="l00457"></a><span class="lineno">  457</span>   }</div>
+<div class="line"><a name="l00458"></a><span class="lineno">  458</span>   <span class="keywordflow">if</span>(autoscale_opt.size()){</div>
+<div class="line"><a name="l00459"></a><span class="lineno">  459</span>     assert(autoscale_opt.size()%2==0);</div>
+<div class="line"><a name="l00460"></a><span class="lineno">  460</span>     <span class="comment">// while(autoscale_opt.size()<band_opt.size()*2){</span></div>
+<div class="line"><a name="l00461"></a><span class="lineno">  461</span>     <span class="comment">//   autoscale_opt.push_back(autoscale_opt[0]);</span></div>
+<div class="line"><a name="l00462"></a><span class="lineno">  462</span>     <span class="comment">//   autoscale_opt.push_back(autoscale_opt[1]);</span></div>
+<div class="line"><a name="l00463"></a><span class="lineno">  463</span>     <span class="comment">// }</span></div>
+<div class="line"><a name="l00464"></a><span class="lineno">  464</span>   }</div>
+<div class="line"><a name="l00465"></a><span class="lineno">  465</span> </div>
+<div class="line"><a name="l00466"></a><span class="lineno">  466</span>   <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iimg=0;iimg<input_opt.size();++iimg){</div>
+<div class="line"><a name="l00467"></a><span class="lineno">  467</span>     <span class="keywordflow">if</span>(verbose_opt[0])</div>
+<div class="line"><a name="l00468"></a><span class="lineno">  468</span>       cout << <span class="stringliteral">"opening image "</span> << input_opt[iimg] << endl;</div>
+<div class="line"><a name="l00469"></a><span class="lineno">  469</span>     imgReader.open(input_opt[iimg]);</div>
+<div class="line"><a name="l00470"></a><span class="lineno">  470</span>     <span class="comment">//if output type not set, get type from input image</span></div>
+<div class="line"><a name="l00471"></a><span class="lineno">  471</span>     <span class="keywordflow">if</span>(theType==GDT_Unknown){</div>
+<div class="line"><a name="l00472"></a><span class="lineno">  472</span>       theType=imgReader.getDataType();</div>
+<div class="line"><a name="l00473"></a><span class="lineno">  473</span>       <span class="keywordflow">if</span>(verbose_opt[0])</div>
+<div class="line"><a name="l00474"></a><span class="lineno">  474</span>         cout << <span class="stringliteral">"Using data type from input image: "</span> << GDALGetDataTypeName(theType) << endl;</div>
+<div class="line"><a name="l00475"></a><span class="lineno">  475</span>     }</div>
+<div class="line"><a name="l00476"></a><span class="lineno">  476</span>     <span class="keywordflow">if</span>(option_opt.findSubstring(<span class="stringliteral">"INTERLEAVE="</span>)==option_opt.end()){</div>
+<div class="line"><a name="l00477"></a><span class="lineno">  477</span>       <span class="keywordtype">string</span> theInterleave=<span class="stringliteral">"INTERLEAVE="</span>;</div>
+<div class="line"><a name="l00478"></a><span class="lineno">  478</span>       theInterleave+=imgReader.getInterleave();</div>
+<div class="line"><a name="l00479"></a><span class="lineno">  479</span>       option_opt.push_back(theInterleave);</div>
+<div class="line"><a name="l00480"></a><span class="lineno">  480</span>     }</div>
+<div class="line"><a name="l00481"></a><span class="lineno">  481</span>     <span class="keywordtype">int</span> nrow=imgReader.nrOfRow();</div>
+<div class="line"><a name="l00482"></a><span class="lineno">  482</span>     <span class="keywordtype">int</span> ncol=imgReader.nrOfCol();</div>
+<div class="line"><a name="l00483"></a><span class="lineno">  483</span>     <span class="comment">// if(!dx||!dy){</span></div>
+<div class="line"><a name="l00484"></a><span class="lineno">  484</span>     <span class="comment">//   dx=imgReader.getDeltaX();</span></div>
+<div class="line"><a name="l00485"></a><span class="lineno">  485</span>     <span class="comment">//   dy=imgReader.getDeltaY();</span></div>
+<div class="line"><a name="l00486"></a><span class="lineno">  486</span>     <span class="comment">// }</span></div>
+<div class="line"><a name="l00487"></a><span class="lineno">  487</span>     <span class="keywordflow">if</span>(verbose_opt[0])</div>
+<div class="line"><a name="l00488"></a><span class="lineno">  488</span>       cout << <span class="stringliteral">"size of "</span> << input_opt[iimg] << <span class="stringliteral">": "</span> << ncol << <span class="stringliteral">" cols, "</span><< nrow << <span class="stringliteral">" rows"</span> << endl;</div>
+<div class="line"><a name="l00489"></a><span class="lineno">  489</span>     <span class="keywordtype">double</span> uli,ulj,lri,lrj;<span class="comment">//image coordinates</span></div>
+<div class="line"><a name="l00490"></a><span class="lineno">  490</span>     <span class="keywordtype">bool</span> forceEUgrid=<span class="keyword">false</span>;</div>
+<div class="line"><a name="l00491"></a><span class="lineno">  491</span>     <span class="keywordflow">if</span>(projection_opt.size())</div>
+<div class="line"><a name="l00492"></a><span class="lineno">  492</span>       forceEUgrid=(!(projection_opt[0].compare(<span class="stringliteral">"EPSG:3035"</span>))||!(projection_opt[0].compare(<span class="stringliteral">"EPSG:3035"</span>))||projection_opt[0].find(<span class="stringliteral">"ETRS-LAEA"</span>)!=string::npos);</div>
+<div class="line"><a name="l00493"></a><span class="lineno">  493</span>     <span class="keywordflow">if</span>(ulx_opt[0]>=lrx_opt[0]){<span class="comment">//default bounding box: no cropping</span></div>
+<div class="line"><a name="l00494"></a><span class="lineno">  494</span>       uli=0;</div>
+<div class="line"><a name="l00495"></a><span class="lineno">  495</span>       lri=imgReader.nrOfCol()-1;</div>
+<div class="line"><a name="l00496"></a><span class="lineno">  496</span>       ulj=0;</div>
+<div class="line"><a name="l00497"></a><span class="lineno">  497</span>       lrj=imgReader.nrOfRow()-1;</div>
+<div class="line"><a name="l00498"></a><span class="lineno">  498</span>       ncropcol=imgReader.nrOfCol();</div>
+<div class="line"><a name="l00499"></a><span class="lineno">  499</span>       ncroprow=imgReader.nrOfRow();</div>
+<div class="line"><a name="l00500"></a><span class="lineno">  500</span>       imgReader.getBoundingBox(cropulx,cropuly,croplrx,croplry);</div>
+<div class="line"><a name="l00501"></a><span class="lineno">  501</span>       <span class="keywordtype">double</span> magicX=1,magicY=1;</div>
+<div class="line"><a name="l00502"></a><span class="lineno">  502</span>       <span class="comment">// imgReader.getMagicPixel(magicX,magicY);</span></div>
+<div class="line"><a name="l00503"></a><span class="lineno">  503</span>       <span class="keywordflow">if</span>(forceEUgrid){</div>
+<div class="line"><a name="l00504"></a><span class="lineno">  504</span>     <span class="comment">//force to LAEA grid</span></div>
+<div class="line"><a name="l00505"></a><span class="lineno">  505</span>     <a class="code" href="classEgcs.html">Egcs</a> egcs;</div>
+<div class="line"><a name="l00506"></a><span class="lineno">  506</span>         egcs.setLevel(egcs.res2level(dx));</div>
+<div class="line"><a name="l00507"></a><span class="lineno">  507</span>     egcs.force2grid(cropulx,cropuly,croplrx,croplry);</div>
+<div class="line"><a name="l00508"></a><span class="lineno">  508</span>     imgReader.geo2image(cropulx+(magicX-1.0)*imgReader.getDeltaX(),cropuly-(magicY-1.0)*imgReader.getDeltaY(),uli,ulj);</div>
+<div class="line"><a name="l00509"></a><span class="lineno">  509</span>     imgReader.geo2image(croplrx+(magicX-2.0)*imgReader.getDeltaX(),croplry-(magicY-2.0)*imgReader.getDeltaY(),lri,lrj);</div>
+<div class="line"><a name="l00510"></a><span class="lineno">  510</span>       }</div>
+<div class="line"><a name="l00511"></a><span class="lineno">  511</span>       imgReader.geo2image(cropulx+(magicX-1.0)*imgReader.getDeltaX(),cropuly-(magicY-1.0)*imgReader.getDeltaY(),uli,ulj);</div>
+<div class="line"><a name="l00512"></a><span class="lineno">  512</span>       imgReader.geo2image(croplrx+(magicX-2.0)*imgReader.getDeltaX(),croplry-(magicY-2.0)*imgReader.getDeltaY(),lri,lrj);</div>
+<div class="line"><a name="l00513"></a><span class="lineno">  513</span>       <span class="comment">//test</span></div>
+<div class="line"><a name="l00514"></a><span class="lineno">  514</span>       ncropcol=abs(static_cast<int>(ceil((croplrx-cropulx)/dx)));</div>
+<div class="line"><a name="l00515"></a><span class="lineno">  515</span>       ncroprow=abs(static_cast<int>(ceil((cropuly-croplry)/dy)));</div>
+<div class="line"><a name="l00516"></a><span class="lineno">  516</span>     }</div>
+<div class="line"><a name="l00517"></a><span class="lineno">  517</span>     <span class="keywordflow">else</span>{</div>
+<div class="line"><a name="l00518"></a><span class="lineno">  518</span>       <span class="keywordtype">double</span> magicX=1,magicY=1;</div>
+<div class="line"><a name="l00519"></a><span class="lineno">  519</span>       <span class="comment">// imgReader.getMagicPixel(magicX,magicY);</span></div>
+<div class="line"><a name="l00520"></a><span class="lineno">  520</span>       cropulx=ulx_opt[0];</div>
+<div class="line"><a name="l00521"></a><span class="lineno">  521</span>       cropuly=uly_opt[0];</div>
+<div class="line"><a name="l00522"></a><span class="lineno">  522</span>       croplrx=lrx_opt[0];</div>
+<div class="line"><a name="l00523"></a><span class="lineno">  523</span>       croplry=lry_opt[0];</div>
+<div class="line"><a name="l00524"></a><span class="lineno">  524</span>       <span class="keywordflow">if</span>(forceEUgrid){</div>
+<div class="line"><a name="l00525"></a><span class="lineno">  525</span>     <span class="comment">//force to LAEA grid</span></div>
+<div class="line"><a name="l00526"></a><span class="lineno">  526</span>     <a class="code" href="classEgcs.html">Egcs</a> egcs;</div>
+<div class="line"><a name="l00527"></a><span class="lineno">  527</span>         egcs.setLevel(egcs.res2level(dx));</div>
+<div class="line"><a name="l00528"></a><span class="lineno">  528</span>     egcs.force2grid(cropulx,cropuly,croplrx,croplry);</div>
+<div class="line"><a name="l00529"></a><span class="lineno">  529</span>     imgReader.geo2image(cropulx+(magicX-1.0)*imgReader.getDeltaX(),cropuly-(magicY-1.0)*imgReader.getDeltaY(),uli,ulj);</div>
+<div class="line"><a name="l00530"></a><span class="lineno">  530</span>     imgReader.geo2image(croplrx+(magicX-2.0)*imgReader.getDeltaX(),croplry-(magicY-2.0)*imgReader.getDeltaY(),lri,lrj);</div>
+<div class="line"><a name="l00531"></a><span class="lineno">  531</span>       }</div>
+<div class="line"><a name="l00532"></a><span class="lineno">  532</span>       imgReader.geo2image(cropulx+(magicX-1.0)*imgReader.getDeltaX(),cropuly-(magicY-1.0)*imgReader.getDeltaY(),uli,ulj);</div>
+<div class="line"><a name="l00533"></a><span class="lineno">  533</span>       imgReader.geo2image(croplrx+(magicX-2.0)*imgReader.getDeltaX(),croplry-(magicY-2.0)*imgReader.getDeltaY(),lri,lrj);</div>
+<div class="line"><a name="l00534"></a><span class="lineno">  534</span> </div>
+<div class="line"><a name="l00535"></a><span class="lineno">  535</span>       ncropcol=abs(static_cast<int>(ceil((croplrx-cropulx)/dx)));</div>
+<div class="line"><a name="l00536"></a><span class="lineno">  536</span>       ncroprow=abs(static_cast<int>(ceil((cropuly-croplry)/dy)));</div>
+<div class="line"><a name="l00537"></a><span class="lineno">  537</span>       uli=floor(uli);</div>
+<div class="line"><a name="l00538"></a><span class="lineno">  538</span>       ulj=floor(ulj);</div>
+<div class="line"><a name="l00539"></a><span class="lineno">  539</span>       lri=floor(lri);</div>
+<div class="line"><a name="l00540"></a><span class="lineno">  540</span>       lrj=floor(lrj);</div>
 <div class="line"><a name="l00541"></a><span class="lineno">  541</span>     }</div>
-<div class="line"><a name="l00542"></a><span class="lineno">  542</span>       }</div>
-<div class="line"><a name="l00543"></a><span class="lineno">  543</span>       <span class="keywordflow">catch</span>(<span class="keywordtype">string</span> errorstring){</div>
-<div class="line"><a name="l00544"></a><span class="lineno">  544</span>         cout << errorstring << endl;</div>
-<div class="line"><a name="l00545"></a><span class="lineno">  545</span>         exit(4);</div>
-<div class="line"><a name="l00546"></a><span class="lineno">  546</span>       }</div>
-<div class="line"><a name="l00547"></a><span class="lineno">  547</span>       <span class="keywordflow">if</span>(description_opt.size())</div>
-<div class="line"><a name="l00548"></a><span class="lineno">  548</span>     imgWriter.setImageDescription(description_opt[0]);</div>
-<div class="line"><a name="l00549"></a><span class="lineno">  549</span>       <span class="keywordtype">double</span> gt[6];</div>
-<div class="line"><a name="l00550"></a><span class="lineno">  550</span>       gt[0]=cropulx;</div>
-<div class="line"><a name="l00551"></a><span class="lineno">  551</span>       gt[1]=dx;</div>
-<div class="line"><a name="l00552"></a><span class="lineno">  552</span>       gt[2]=0;</div>
-<div class="line"><a name="l00553"></a><span class="lineno">  553</span>       gt[3]=cropuly;</div>
-<div class="line"><a name="l00554"></a><span class="lineno">  554</span>       gt[4]=0;</div>
-<div class="line"><a name="l00555"></a><span class="lineno">  555</span>       gt[5]=(imgReader.isGeoRef())? -dy : dy;</div>
-<div class="line"><a name="l00556"></a><span class="lineno">  556</span>       imgWriter.setGeoTransform(gt);</div>
-<div class="line"><a name="l00557"></a><span class="lineno">  557</span>       <span class="keywordflow">if</span>(projection_opt.size()){</div>
-<div class="line"><a name="l00558"></a><span class="lineno">  558</span>     <span class="keywordflow">if</span>(verbose_opt[0])</div>
-<div class="line"><a name="l00559"></a><span class="lineno">  559</span>       cout << <span class="stringliteral">"projection: "</span> << projection_opt[0] << endl;</div>
-<div class="line"><a name="l00560"></a><span class="lineno">  560</span>     imgWriter.setProjectionProj4(projection_opt[0]);</div>
-<div class="line"><a name="l00561"></a><span class="lineno">  561</span>       }</div>
-<div class="line"><a name="l00562"></a><span class="lineno">  562</span>       <span class="keywordflow">else</span></div>
-<div class="line"><a name="l00563"></a><span class="lineno">  563</span>     imgWriter.setProjection(imgReader.getProjection());</div>
-<div class="line"><a name="l00564"></a><span class="lineno">  564</span>       <span class="keywordflow">if</span>(imgWriter.getDataType()==GDT_Byte){</div>
-<div class="line"><a name="l00565"></a><span class="lineno">  565</span>     <span class="keywordflow">if</span>(colorTable_opt.size()){</div>
-<div class="line"><a name="l00566"></a><span class="lineno">  566</span>       <span class="keywordflow">if</span>(colorTable_opt[0]!=<span class="stringliteral">"none"</span>)</div>
-<div class="line"><a name="l00567"></a><span class="lineno">  567</span>         imgWriter.setColorTable(colorTable_opt[0]);</div>
-<div class="line"><a name="l00568"></a><span class="lineno">  568</span>     }</div>
-<div class="line"><a name="l00569"></a><span class="lineno">  569</span>     <span class="keywordflow">else</span> <span class="keywordflow">if</span> (imgReader.getColorTable()!=NULL)<span class="comment">//copy colorTable from input image</span></div>
-<div class="line"><a name="l00570"></a><span class="lineno">  570</span>       imgWriter.setColorTable(imgReader.getColorTable());</div>
-<div class="line"><a name="l00571"></a><span class="lineno">  571</span>       }</div>
-<div class="line"><a name="l00572"></a><span class="lineno">  572</span>     }</div>
-<div class="line"><a name="l00573"></a><span class="lineno">  573</span> </div>
-<div class="line"><a name="l00574"></a><span class="lineno">  574</span>     <span class="keywordtype">double</span> startCol=uli;</div>
-<div class="line"><a name="l00575"></a><span class="lineno">  575</span>     <span class="keywordtype">double</span> endCol=lri;</div>
-<div class="line"><a name="l00576"></a><span class="lineno">  576</span>     <span class="keywordflow">if</span>(uli<0)</div>
-<div class="line"><a name="l00577"></a><span class="lineno">  577</span>       startCol=0;</div>
-<div class="line"><a name="l00578"></a><span class="lineno">  578</span>     <span class="keywordflow">else</span> <span class="keywordflow">if</span>(uli>=imgReader.nrOfCol())</div>
-<div class="line"><a name="l00579"></a><span class="lineno">  579</span>       startCol=imgReader.nrOfCol()-1;</div>
-<div class="line"><a name="l00580"></a><span class="lineno">  580</span>     <span class="keywordflow">if</span>(lri<0)</div>
-<div class="line"><a name="l00581"></a><span class="lineno">  581</span>       endCol=0;</div>
-<div class="line"><a name="l00582"></a><span class="lineno">  582</span>     <span class="keywordflow">else</span> <span class="keywordflow">if</span>(lri>=imgReader.nrOfCol())</div>
-<div class="line"><a name="l00583"></a><span class="lineno">  583</span>       endCol=imgReader.nrOfCol()-1;</div>
-<div class="line"><a name="l00584"></a><span class="lineno">  584</span>     <span class="keywordtype">double</span> startRow=ulj;</div>
-<div class="line"><a name="l00585"></a><span class="lineno">  585</span>     <span class="keywordtype">double</span> endRow=lrj;</div>
-<div class="line"><a name="l00586"></a><span class="lineno">  586</span>     <span class="keywordflow">if</span>(ulj<0)</div>
-<div class="line"><a name="l00587"></a><span class="lineno">  587</span>       startRow=0;</div>
-<div class="line"><a name="l00588"></a><span class="lineno">  588</span>     <span class="keywordflow">else</span> <span class="keywordflow">if</span>(ulj>=imgReader.nrOfRow())</div>
-<div class="line"><a name="l00589"></a><span class="lineno">  589</span>       startRow=imgReader.nrOfRow()-1;</div>
-<div class="line"><a name="l00590"></a><span class="lineno">  590</span>     <span class="keywordflow">if</span>(lrj<0)</div>
-<div class="line"><a name="l00591"></a><span class="lineno">  591</span>       endRow=0;</div>
-<div class="line"><a name="l00592"></a><span class="lineno">  592</span>     <span class="keywordflow">else</span> <span class="keywordflow">if</span>(lrj>=imgReader.nrOfRow())</div>
-<div class="line"><a name="l00593"></a><span class="lineno">  593</span>       endRow=imgReader.nrOfRow()-1;</div>
-<div class="line"><a name="l00594"></a><span class="lineno">  594</span> </div>
-<div class="line"><a name="l00595"></a><span class="lineno">  595</span> </div>
-<div class="line"><a name="l00596"></a><span class="lineno">  596</span> </div>
-<div class="line"><a name="l00597"></a><span class="lineno">  597</span>     <span class="keywordtype">int</span> readncol=endCol-startCol+1;</div>
-<div class="line"><a name="l00598"></a><span class="lineno">  598</span>     vector<double> readBuffer(readncol+1);</div>
-<div class="line"><a name="l00599"></a><span class="lineno">  599</span>     <span class="keywordtype">int</span> nband=(band_opt.size())?band_opt.size() : imgReader.nrOfBand();</div>
-<div class="line"><a name="l00600"></a><span class="lineno">  600</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iband=0;iband<nband;++iband){</div>
-<div class="line"><a name="l00601"></a><span class="lineno">  601</span>       <span class="keywordtype">int</span> readBand=(band_opt.size()>iband)?band_opt[iband]:iband;</div>
-<div class="line"><a name="l00602"></a><span class="lineno">  602</span>       <span class="keywordflow">if</span>(verbose_opt[0]){</div>
-<div class="line"><a name="l00603"></a><span class="lineno">  603</span>     cout << <span class="stringliteral">"extracting band "</span> << readBand << endl;</div>
-<div class="line"><a name="l00604"></a><span class="lineno">  604</span>     pfnProgress(progress,pszMessage,pProgressArg);</div>
+<div class="line"><a name="l00542"></a><span class="lineno">  542</span> </div>
+<div class="line"><a name="l00543"></a><span class="lineno">  543</span>     <span class="keywordtype">double</span> dcropcol=0;</div>
+<div class="line"><a name="l00544"></a><span class="lineno">  544</span>     <span class="keywordtype">double</span> dcroprow=0;</div>
+<div class="line"><a name="l00545"></a><span class="lineno">  545</span>     <span class="keywordtype">double</span> deltaX=imgReader.getDeltaX();</div>
+<div class="line"><a name="l00546"></a><span class="lineno">  546</span>     <span class="keywordtype">double</span> deltaY=imgReader.getDeltaY();</div>
+<div class="line"><a name="l00547"></a><span class="lineno">  547</span>     dcropcol=(lri-uli+1)/(dx/deltaX);</div>
+<div class="line"><a name="l00548"></a><span class="lineno">  548</span>     dcroprow=(lrj-ulj+1)/(dy/deltaY);</div>
+<div class="line"><a name="l00549"></a><span class="lineno">  549</span>     <span class="keywordflow">if</span>(!imgWriter.nrOfBand()){<span class="comment">//not opened yet</span></div>
+<div class="line"><a name="l00550"></a><span class="lineno">  550</span>       <span class="keywordflow">if</span>(verbose_opt[0]){</div>
+<div class="line"><a name="l00551"></a><span class="lineno">  551</span>     cout << <span class="stringliteral">"cropulx: "</span> << cropulx << endl;</div>
+<div class="line"><a name="l00552"></a><span class="lineno">  552</span>     cout << <span class="stringliteral">"cropuly: "</span> << cropuly << endl;</div>
+<div class="line"><a name="l00553"></a><span class="lineno">  553</span>     cout << <span class="stringliteral">"croplrx: "</span> << croplrx << endl;</div>
+<div class="line"><a name="l00554"></a><span class="lineno">  554</span>     cout << <span class="stringliteral">"croplry: "</span> << croplry << endl;</div>
+<div class="line"><a name="l00555"></a><span class="lineno">  555</span>     cout << <span class="stringliteral">"ncropcol: "</span> << ncropcol << endl;</div>
+<div class="line"><a name="l00556"></a><span class="lineno">  556</span>     cout << <span class="stringliteral">"ncroprow: "</span> << ncroprow << endl;</div>
+<div class="line"><a name="l00557"></a><span class="lineno">  557</span>     cout << <span class="stringliteral">"cropulx+ncropcol*dx: "</span> << cropulx+ncropcol*dx << endl;</div>
+<div class="line"><a name="l00558"></a><span class="lineno">  558</span>     cout << <span class="stringliteral">"cropuly-ncroprow*dy: "</span> << cropuly-ncroprow*dy << endl;</div>
+<div class="line"><a name="l00559"></a><span class="lineno">  559</span>     cout << <span class="stringliteral">"upper left column of input image: "</span> << uli << endl;</div>
+<div class="line"><a name="l00560"></a><span class="lineno">  560</span>     cout << <span class="stringliteral">"upper left row of input image: "</span> << ulj << endl;</div>
+<div class="line"><a name="l00561"></a><span class="lineno">  561</span>     cout << <span class="stringliteral">"lower right column of input image: "</span> << lri << endl;</div>
+<div class="line"><a name="l00562"></a><span class="lineno">  562</span>     cout << <span class="stringliteral">"lower right row of input image: "</span> << lrj << endl;</div>
+<div class="line"><a name="l00563"></a><span class="lineno">  563</span>     cout << <span class="stringliteral">"new number of cols: "</span> << ncropcol << endl;</div>
+<div class="line"><a name="l00564"></a><span class="lineno">  564</span>     cout << <span class="stringliteral">"new number of rows: "</span> << ncroprow << endl;</div>
+<div class="line"><a name="l00565"></a><span class="lineno">  565</span>     cout << <span class="stringliteral">"new number of bands: "</span> << ncropband << endl;</div>
+<div class="line"><a name="l00566"></a><span class="lineno">  566</span>       }</div>
+<div class="line"><a name="l00567"></a><span class="lineno">  567</span>       <span class="comment">// string theCompression;</span></div>
+<div class="line"><a name="l00568"></a><span class="lineno">  568</span>       <span class="comment">// if(compress_opt[0]!="")//default</span></div>
+<div class="line"><a name="l00569"></a><span class="lineno">  569</span>       <span class="comment">//   theCompression=compress_opt[0];</span></div>
+<div class="line"><a name="l00570"></a><span class="lineno">  570</span>       <span class="comment">// else</span></div>
+<div class="line"><a name="l00571"></a><span class="lineno">  571</span>       <span class="comment">//   theCompression=imgReader.getCompression();</span></div>
+<div class="line"><a name="l00572"></a><span class="lineno">  572</span>       <span class="comment">// string theInterleave;</span></div>
+<div class="line"><a name="l00573"></a><span class="lineno">  573</span>       <span class="comment">// if(interleave_opt[0]!="")//default</span></div>
+<div class="line"><a name="l00574"></a><span class="lineno">  574</span>       <span class="comment">//   theInterleave=interleave_opt[0];</span></div>
+<div class="line"><a name="l00575"></a><span class="lineno">  575</span>       <span class="comment">// else</span></div>
+<div class="line"><a name="l00576"></a><span class="lineno">  576</span>       <span class="comment">//   theInterleave=imgReader.getInterleave();</span></div>
+<div class="line"><a name="l00577"></a><span class="lineno">  577</span>       <span class="keywordtype">string</span> imageType=imgReader.getImageType();</div>
+<div class="line"><a name="l00578"></a><span class="lineno">  578</span>       <span class="keywordflow">if</span>(oformat_opt.size())<span class="comment">//default</span></div>
+<div class="line"><a name="l00579"></a><span class="lineno">  579</span>         imageType=oformat_opt[0];</div>
+<div class="line"><a name="l00580"></a><span class="lineno">  580</span>       <span class="keywordflow">try</span>{</div>
+<div class="line"><a name="l00581"></a><span class="lineno">  581</span>         imgWriter.open(output_opt[0],ncropcol,ncroprow,ncropband,theType,imageType,option_opt);</div>
+<div class="line"><a name="l00582"></a><span class="lineno">  582</span>     <span class="keywordflow">if</span>(nodata_opt.size()){</div>
+<div class="line"><a name="l00583"></a><span class="lineno">  583</span>       <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iband=0;iband<ncropband;++iband)</div>
+<div class="line"><a name="l00584"></a><span class="lineno">  584</span>         imgWriter.GDALSetNoDataValue(nodata_opt[0],iband);</div>
+<div class="line"><a name="l00585"></a><span class="lineno">  585</span>     }</div>
+<div class="line"><a name="l00586"></a><span class="lineno">  586</span>       }</div>
+<div class="line"><a name="l00587"></a><span class="lineno">  587</span>       <span class="keywordflow">catch</span>(<span class="keywordtype">string</span> errorstring){</div>
+<div class="line"><a name="l00588"></a><span class="lineno">  588</span>         cout << errorstring << endl;</div>
+<div class="line"><a name="l00589"></a><span class="lineno">  589</span>         exit(4);</div>
+<div class="line"><a name="l00590"></a><span class="lineno">  590</span>       }</div>
+<div class="line"><a name="l00591"></a><span class="lineno">  591</span>       <span class="keywordflow">if</span>(description_opt.size())</div>
+<div class="line"><a name="l00592"></a><span class="lineno">  592</span>     imgWriter.setImageDescription(description_opt[0]);</div>
+<div class="line"><a name="l00593"></a><span class="lineno">  593</span>       <span class="keywordtype">double</span> gt[6];</div>
+<div class="line"><a name="l00594"></a><span class="lineno">  594</span>       gt[0]=cropulx;</div>
+<div class="line"><a name="l00595"></a><span class="lineno">  595</span>       gt[1]=dx;</div>
+<div class="line"><a name="l00596"></a><span class="lineno">  596</span>       gt[2]=0;</div>
+<div class="line"><a name="l00597"></a><span class="lineno">  597</span>       gt[3]=cropuly;</div>
+<div class="line"><a name="l00598"></a><span class="lineno">  598</span>       gt[4]=0;</div>
+<div class="line"><a name="l00599"></a><span class="lineno">  599</span>       gt[5]=(imgReader.isGeoRef())? -dy : dy;</div>
+<div class="line"><a name="l00600"></a><span class="lineno">  600</span>       imgWriter.setGeoTransform(gt);</div>
+<div class="line"><a name="l00601"></a><span class="lineno">  601</span>       <span class="keywordflow">if</span>(projection_opt.size()){</div>
+<div class="line"><a name="l00602"></a><span class="lineno">  602</span>     <span class="keywordflow">if</span>(verbose_opt[0])</div>
+<div class="line"><a name="l00603"></a><span class="lineno">  603</span>       cout << <span class="stringliteral">"projection: "</span> << projection_opt[0] << endl;</div>
+<div class="line"><a name="l00604"></a><span class="lineno">  604</span>     imgWriter.setProjectionProj4(projection_opt[0]);</div>
 <div class="line"><a name="l00605"></a><span class="lineno">  605</span>       }</div>
-<div class="line"><a name="l00606"></a><span class="lineno">  606</span>       <span class="keywordtype">double</span> theMin=0;</div>
-<div class="line"><a name="l00607"></a><span class="lineno">  607</span>       <span class="keywordtype">double</span> theMax=0;</div>
-<div class="line"><a name="l00608"></a><span class="lineno">  608</span>       <span class="keywordflow">if</span>(autoscale_opt.size()){</div>
-<div class="line"><a name="l00609"></a><span class="lineno">  609</span>     <span class="keywordflow">try</span>{</div>
-<div class="line"><a name="l00610"></a><span class="lineno">  610</span>       imgReader.getMinMax(static_cast<int>(startCol),static_cast<int>(endCol),static_cast<int>(startRow),static_cast<int>(endRow),readBand,theMin,theMax);</div>
-<div class="line"><a name="l00611"></a><span class="lineno">  611</span>     }</div>
-<div class="line"><a name="l00612"></a><span class="lineno">  612</span>     <span class="keywordflow">catch</span>(<span class="keywordtype">string</span> errorString){</div>
-<div class="line"><a name="l00613"></a><span class="lineno">  613</span>       cout << errorString << endl;</div>
-<div class="line"><a name="l00614"></a><span class="lineno">  614</span>     }</div>
-<div class="line"><a name="l00615"></a><span class="lineno">  615</span>     <span class="keywordflow">if</span>(verbose_opt[0])</div>
-<div class="line"><a name="l00616"></a><span class="lineno">  616</span>       cout << <span class="stringliteral">"minmax: "</span> << theMin << <span class="stringliteral">", "</span> << theMax << endl;</div>
-<div class="line"><a name="l00617"></a><span class="lineno">  617</span>     <span class="keywordtype">double</span> theScale=(autoscale_opt[1]-autoscale_opt[0])/(theMax-theMin);</div>
-<div class="line"><a name="l00618"></a><span class="lineno">  618</span>     <span class="keywordtype">double</span> theOffset=autoscale_opt[0]-theScale*theMin;</div>
-<div class="line"><a name="l00619"></a><span class="lineno">  619</span>     imgReader.setScale(theScale,readBand);</div>
-<div class="line"><a name="l00620"></a><span class="lineno">  620</span>     imgReader.setOffset(theOffset,readBand);</div>
-<div class="line"><a name="l00621"></a><span class="lineno">  621</span>       } </div>
-<div class="line"><a name="l00622"></a><span class="lineno">  622</span>       <span class="keywordflow">else</span>{</div>
-<div class="line"><a name="l00623"></a><span class="lineno">  623</span>     <span class="keywordflow">if</span>(scale_opt.size()){</div>
-<div class="line"><a name="l00624"></a><span class="lineno">  624</span>       <span class="keywordflow">if</span>(scale_opt.size()>iband)</div>
-<div class="line"><a name="l00625"></a><span class="lineno">  625</span>         imgReader.setScale(scale_opt[iband],readBand);</div>
-<div class="line"><a name="l00626"></a><span class="lineno">  626</span>       <span class="keywordflow">else</span></div>
-<div class="line"><a name="l00627"></a><span class="lineno">  627</span>         imgReader.setScale(scale_opt[0],readBand);</div>
-<div class="line"><a name="l00628"></a><span class="lineno">  628</span>     }</div>
-<div class="line"><a name="l00629"></a><span class="lineno">  629</span>     <span class="keywordflow">if</span>(offset_opt.size()){</div>
-<div class="line"><a name="l00630"></a><span class="lineno">  630</span>       <span class="keywordflow">if</span>(offset_opt.size()>iband)</div>
-<div class="line"><a name="l00631"></a><span class="lineno">  631</span>         imgReader.setOffset(offset_opt[iband],readBand);</div>
-<div class="line"><a name="l00632"></a><span class="lineno">  632</span>       <span class="keywordflow">else</span></div>
-<div class="line"><a name="l00633"></a><span class="lineno">  633</span>         imgReader.setOffset(offset_opt[0],readBand);</div>
-<div class="line"><a name="l00634"></a><span class="lineno">  634</span>     }</div>
-<div class="line"><a name="l00635"></a><span class="lineno">  635</span>       }</div>
-<div class="line"><a name="l00636"></a><span class="lineno">  636</span> </div>
-<div class="line"><a name="l00637"></a><span class="lineno">  637</span>       <span class="keywordtype">double</span> readRow=0;</div>
-<div class="line"><a name="l00638"></a><span class="lineno">  638</span>       <span class="keywordtype">double</span> readCol=0;</div>
-<div class="line"><a name="l00639"></a><span class="lineno">  639</span>       <span class="keywordtype">double</span> lowerCol=0;</div>
-<div class="line"><a name="l00640"></a><span class="lineno">  640</span>       <span class="keywordtype">double</span> upperCol=0;</div>
-<div class="line"><a name="l00641"></a><span class="lineno">  641</span>       <span class="keywordflow">for</span>(<span class="keywordtype">int</span> irow=0;irow<imgWriter.nrOfRow();++irow){</div>
-<div class="line"><a name="l00642"></a><span class="lineno">  642</span>     vector<float> lineMask;</div>
-<div class="line"><a name="l00643"></a><span class="lineno">  643</span>     <span class="keywordtype">double</span> x=0;</div>
-<div class="line"><a name="l00644"></a><span class="lineno">  644</span>     <span class="keywordtype">double</span> y=0;</div>
-<div class="line"><a name="l00645"></a><span class="lineno">  645</span>     <span class="comment">//convert irow to geo</span></div>
-<div class="line"><a name="l00646"></a><span class="lineno">  646</span>     imgWriter.image2geo(0,irow,x,y);</div>
-<div class="line"><a name="l00647"></a><span class="lineno">  647</span>     <span class="comment">//lookup corresponding row for irow in this file</span></div>
-<div class="line"><a name="l00648"></a><span class="lineno">  648</span>     imgReader.geo2image(x,y,readCol,readRow);</div>
-<div class="line"><a name="l00649"></a><span class="lineno">  649</span>     vector<double> writeBuffer;</div>
-<div class="line"><a name="l00650"></a><span class="lineno">  650</span>     <span class="keywordflow">if</span>(readRow<0||readRow>=imgReader.nrOfRow()){</div>
-<div class="line"><a name="l00651"></a><span class="lineno">  651</span>       <span class="comment">//if(readRow<0)</span></div>
-<div class="line"><a name="l00652"></a><span class="lineno">  652</span>       <span class="comment">//readRow=0;</span></div>
-<div class="line"><a name="l00653"></a><span class="lineno">  653</span>       <span class="comment">//else if(readRow>=imgReader.nrOfRow())</span></div>
-<div class="line"><a name="l00654"></a><span class="lineno">  654</span>       <span class="comment">//readRow=imgReader.nrOfRow()-1;</span></div>
-<div class="line"><a name="l00655"></a><span class="lineno">  655</span>       <span class="keywordflow">for</span>(<span class="keywordtype">int</span> ib=0;ib<imgWriter.nrOfCol();++ib)</div>
-<div class="line"><a name="l00656"></a><span class="lineno">  656</span>         writeBuffer.push_back(nodataValue);</div>
-<div class="line"><a name="l00657"></a><span class="lineno">  657</span>     }</div>
-<div class="line"><a name="l00658"></a><span class="lineno">  658</span>     <span class="keywordflow">else</span>{</div>
-<div class="line"><a name="l00659"></a><span class="lineno">  659</span>       <span class="keywordflow">if</span>(verbose_opt[0]>1)</div>
-<div class="line"><a name="l00660"></a><span class="lineno">  660</span>         cout << <span class="stringliteral">"reading row: "</span> << readRow << endl;</div>
-<div class="line"><a name="l00661"></a><span class="lineno">  661</span>       <span class="keywordflow">try</span>{</div>
-<div class="line"><a name="l00662"></a><span class="lineno">  662</span>             <span class="keywordflow">if</span>(endCol<imgReader.nrOfCol()-1)</div>
-<div class="line"><a name="l00663"></a><span class="lineno">  663</span>               imgReader.readData(readBuffer,GDT_Float64,startCol,endCol+1,readRow,readBand,theResample);</div>
-<div class="line"><a name="l00664"></a><span class="lineno">  664</span>             <span class="keywordflow">else</span></div>
-<div class="line"><a name="l00665"></a><span class="lineno">  665</span>               imgReader.readData(readBuffer,GDT_Float64,startCol,endCol,readRow,readBand,theResample);</div>
-<div class="line"><a name="l00666"></a><span class="lineno">  666</span>         <span class="comment">// for(int ib=0;ib<ncropcol;++ib){</span></div>
-<div class="line"><a name="l00667"></a><span class="lineno">  667</span>         <span class="keywordtype">double</span> oldRowMask=-1;<span class="comment">//keep track of row mask to optimize number of line readings</span></div>
-<div class="line"><a name="l00668"></a><span class="lineno">  668</span>         <span class="keywordflow">for</span>(<span class="keywordtype">int</span> ib=0;ib<imgWriter.nrOfCol();++ib){</div>
-<div class="line"><a name="l00669"></a><span class="lineno">  669</span>           imgWriter.image2geo(ib,irow,x,y);</div>
-<div class="line"><a name="l00670"></a><span class="lineno">  670</span>           <span class="comment">//lookup corresponding row for irow in this file</span></div>
-<div class="line"><a name="l00671"></a><span class="lineno">  671</span>           imgReader.geo2image(x,y,readCol,readRow);</div>
-<div class="line"><a name="l00672"></a><span class="lineno">  672</span>           <span class="keywordflow">if</span>(readCol<0||readCol>=imgReader.nrOfCol()){</div>
-<div class="line"><a name="l00673"></a><span class="lineno">  673</span>           <span class="comment">// if(readCol<0||readCol>=imgReader.nrOfCol()){</span></div>
-<div class="line"><a name="l00674"></a><span class="lineno">  674</span>         <span class="comment">//               if(readCol<0)</span></div>
-<div class="line"><a name="l00675"></a><span class="lineno">  675</span>         <span class="comment">//                 readCol=0;</span></div>
-<div class="line"><a name="l00676"></a><span class="lineno">  676</span>         <span class="comment">//               else if(readCol>=imgReader.nrOfCol())</span></div>
-<div class="line"><a name="l00677"></a><span class="lineno">  677</span>         <span class="comment">//                 readCol=imgReader.nrOfCol()-1;</span></div>
-<div class="line"><a name="l00678"></a><span class="lineno">  678</span>         writeBuffer.push_back(nodataValue);</div>
-<div class="line"><a name="l00679"></a><span class="lineno">  679</span>           }</div>
-<div class="line"><a name="l00680"></a><span class="lineno">  680</span>           <span class="keywordflow">else</span>{</div>
-<div class="line"><a name="l00681"></a><span class="lineno">  681</span>                 <span class="keywordtype">bool</span> valid=<span class="keyword">true</span>;</div>
-<div class="line"><a name="l00682"></a><span class="lineno">  682</span>         <span class="keywordtype">double</span> geox=0;</div>
-<div class="line"><a name="l00683"></a><span class="lineno">  683</span>         <span class="keywordtype">double</span> geoy=0;</div>
-<div class="line"><a name="l00684"></a><span class="lineno">  684</span>                 <span class="keywordflow">if</span>(mask_opt.size()){</div>
-<div class="line"><a name="l00685"></a><span class="lineno">  685</span>           <span class="comment">//read mask</span></div>
-<div class="line"><a name="l00686"></a><span class="lineno">  686</span>           <span class="keywordtype">double</span> colMask=0;</div>
-<div class="line"><a name="l00687"></a><span class="lineno">  687</span>           <span class="keywordtype">double</span> rowMask=0;</div>
-<div class="line"><a name="l00688"></a><span class="lineno">  688</span> </div>
-<div class="line"><a name="l00689"></a><span class="lineno">  689</span>           imgWriter.image2geo(ib,irow,geox,geoy);</div>
-<div class="line"><a name="l00690"></a><span class="lineno">  690</span>           maskReader.geo2image(geox,geoy,colMask,rowMask);</div>
-<div class="line"><a name="l00691"></a><span class="lineno">  691</span>           colMask=<span class="keyword">static_cast<</span><span class="keywordtype">int</span><span class="keyword">></span>(colMask);</div>
-<div class="line"><a name="l00692"></a><span class="lineno">  692</span>           rowMask=<span class="keyword">static_cast<</span><span class="keywordtype">int</span><span class="keyword">></span>(rowMask);</div>
-<div class="line"><a name="l00693"></a><span class="lineno">  693</span>           <span class="keywordflow">if</span>(rowMask>=0&&rowMask<maskReader.nrOfRow()&&colMask>=0&&colMask<maskReader.nrOfCol()){</div>
-<div class="line"><a name="l00694"></a><span class="lineno">  694</span>             <span class="keywordflow">if</span>(static_cast<int>(rowMask)!=<span class="keyword">static_cast<</span><span class="keywordtype">int</span><span class="keyword">></span>(oldRowMask)){</div>
-<div class="line"><a name="l00695"></a><span class="lineno">  695</span> </div>
-<div class="line"><a name="l00696"></a><span class="lineno">  696</span>               assert(rowMask>=0&&rowMask<maskReader.nrOfRow());</div>
-<div class="line"><a name="l00697"></a><span class="lineno">  697</span>               <span class="keywordflow">try</span>{</div>
-<div class="line"><a name="l00698"></a><span class="lineno">  698</span>             maskReader.readData(lineMask,GDT_Float32,static_cast<int>(rowMask));</div>
-<div class="line"><a name="l00699"></a><span class="lineno">  699</span>               }</div>
-<div class="line"><a name="l00700"></a><span class="lineno">  700</span>               <span class="keywordflow">catch</span>(<span class="keywordtype">string</span> errorstring){</div>
-<div class="line"><a name="l00701"></a><span class="lineno">  701</span>             cerr << errorstring << endl;</div>
-<div class="line"><a name="l00702"></a><span class="lineno">  702</span>             exit(1);</div>
-<div class="line"><a name="l00703"></a><span class="lineno">  703</span>               }</div>
-<div class="line"><a name="l00704"></a><span class="lineno">  704</span>               <span class="keywordflow">catch</span>(...){</div>
-<div class="line"><a name="l00705"></a><span class="lineno">  705</span>             cerr << <span class="stringliteral">"error catched"</span> << std::endl;</div>
-<div class="line"><a name="l00706"></a><span class="lineno">  706</span>             exit(3);</div>
-<div class="line"><a name="l00707"></a><span class="lineno">  707</span>               }</div>
-<div class="line"><a name="l00708"></a><span class="lineno">  708</span>               oldRowMask=rowMask;</div>
-<div class="line"><a name="l00709"></a><span class="lineno">  709</span>             }</div>
-<div class="line"><a name="l00710"></a><span class="lineno">  710</span>             <span class="keywordflow">if</span>(lineMask[colMask]==0)</div>
-<div class="line"><a name="l00711"></a><span class="lineno">  711</span>               valid=<span class="keyword">false</span>;</div>
-<div class="line"><a name="l00712"></a><span class="lineno">  712</span>           }</div>
-<div class="line"><a name="l00713"></a><span class="lineno">  713</span>         }</div>
-<div class="line"><a name="l00714"></a><span class="lineno">  714</span> </div>
-<div class="line"><a name="l00715"></a><span class="lineno">  715</span>                 <span class="keywordflow">if</span>(!valid)</div>
-<div class="line"><a name="l00716"></a><span class="lineno">  716</span>                   writeBuffer.push_back(nodataValue);</div>
-<div class="line"><a name="l00717"></a><span class="lineno">  717</span>                 <span class="keywordflow">else</span>{</div>
-<div class="line"><a name="l00718"></a><span class="lineno">  718</span>                   <span class="keywordflow">switch</span>(theResample){</div>
-<div class="line"><a name="l00719"></a><span class="lineno">  719</span>                   <span class="keywordflow">case</span>(BILINEAR):</div>
-<div class="line"><a name="l00720"></a><span class="lineno">  720</span>                     lowerCol=readCol-0.5;</div>
-<div class="line"><a name="l00721"></a><span class="lineno">  721</span>                     lowerCol=<span class="keyword">static_cast<</span><span class="keywordtype">int</span><span class="keyword">></span>(lowerCol);</div>
-<div class="line"><a name="l00722"></a><span class="lineno">  722</span>                     upperCol=readCol+0.5;</div>
-<div class="line"><a name="l00723"></a><span class="lineno">  723</span>                     upperCol=<span class="keyword">static_cast<</span><span class="keywordtype">int</span><span class="keyword">></span>(upperCol);</div>
-<div class="line"><a name="l00724"></a><span class="lineno">  724</span>                     <span class="keywordflow">if</span>(lowerCol<0)</div>
-<div class="line"><a name="l00725"></a><span class="lineno">  725</span>                       lowerCol=0;</div>
-<div class="line"><a name="l00726"></a><span class="lineno">  726</span>                     <span class="keywordflow">if</span>(upperCol>=imgReader.nrOfCol())</div>
-<div class="line"><a name="l00727"></a><span class="lineno">  727</span>                       upperCol=imgReader.nrOfCol()-1;</div>
-<div class="line"><a name="l00728"></a><span class="lineno">  728</span>                     <span class="comment">// writeBuffer.push_back((readCol-0.5-lowerCol)*(readBuffer[upperCol-startCol]*theScale+theOffset)+(1-readCol+0.5+lowerCol)*(readBuffer[lowerCol-startCol]*theScale+theOffset));</span></div>
-<div class="line"><a name="l00729"></a><span class="lineno">  729</span>                     writeBuffer.push_back((readCol-0.5-lowerCol)*readBuffer[upperCol-startCol]+(1-readCol+0.5+lowerCol)*readBuffer[lowerCol-startCol]);</div>
-<div class="line"><a name="l00730"></a><span class="lineno">  730</span>                     <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l00731"></a><span class="lineno">  731</span>                   <span class="keywordflow">default</span>:</div>
-<div class="line"><a name="l00732"></a><span class="lineno">  732</span>                     readCol=<span class="keyword">static_cast<</span><span class="keywordtype">int</span><span class="keyword">></span>(readCol);</div>
-<div class="line"><a name="l00733"></a><span class="lineno">  733</span>                     readCol-=startCol;<span class="comment">//we only start reading from startCol</span></div>
-<div class="line"><a name="l00734"></a><span class="lineno">  734</span>                     <span class="comment">// writeBuffer.push_back(readBuffer[readCol]*theScale+theOffset);</span></div>
-<div class="line"><a name="l00735"></a><span class="lineno">  735</span>                     writeBuffer.push_back(readBuffer[readCol]);</div>
-<div class="line"><a name="l00736"></a><span class="lineno">  736</span>                     <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l00737"></a><span class="lineno">  737</span>           }</div>
-<div class="line"><a name="l00738"></a><span class="lineno">  738</span>         }</div>
-<div class="line"><a name="l00739"></a><span class="lineno">  739</span>           }</div>
-<div class="line"><a name="l00740"></a><span class="lineno">  740</span>         }</div>
-<div class="line"><a name="l00741"></a><span class="lineno">  741</span>       }</div>
-<div class="line"><a name="l00742"></a><span class="lineno">  742</span>       <span class="keywordflow">catch</span>(<span class="keywordtype">string</span> errorstring){</div>
-<div class="line"><a name="l00743"></a><span class="lineno">  743</span>         cout << errorstring << endl;</div>
-<div class="line"><a name="l00744"></a><span class="lineno">  744</span>         exit(2);</div>
-<div class="line"><a name="l00745"></a><span class="lineno">  745</span>       }</div>
-<div class="line"><a name="l00746"></a><span class="lineno">  746</span>     }</div>
-<div class="line"><a name="l00747"></a><span class="lineno">  747</span>     <span class="keywordflow">if</span>(writeBuffer.size()!=imgWriter.nrOfCol())</div>
-<div class="line"><a name="l00748"></a><span class="lineno">  748</span>       cout << <span class="stringliteral">"writeBuffer.size()="</span> << writeBuffer.size() << <span class="stringliteral">", imgWriter.nrOfCol()="</span> << imgWriter.nrOfCol() << endl;</div>
-<div class="line"><a name="l00749"></a><span class="lineno">  749</span>     assert(writeBuffer.size()==imgWriter.nrOfCol());</div>
-<div class="line"><a name="l00750"></a><span class="lineno">  750</span>     <span class="keywordflow">try</span>{</div>
-<div class="line"><a name="l00751"></a><span class="lineno">  751</span>       imgWriter.writeData(writeBuffer,GDT_Float64,irow,writeBand);</div>
-<div class="line"><a name="l00752"></a><span class="lineno">  752</span>     }</div>
-<div class="line"><a name="l00753"></a><span class="lineno">  753</span>     <span class="keywordflow">catch</span>(<span class="keywordtype">string</span> errorstring){</div>
-<div class="line"><a name="l00754"></a><span class="lineno">  754</span>       cout << errorstring << endl;</div>
-<div class="line"><a name="l00755"></a><span class="lineno">  755</span>       exit(3);</div>
-<div class="line"><a name="l00756"></a><span class="lineno">  756</span>     }</div>
-<div class="line"><a name="l00757"></a><span class="lineno">  757</span>     <span class="keywordflow">if</span>(verbose_opt[0]){</div>
-<div class="line"><a name="l00758"></a><span class="lineno">  758</span>       progress=(1.0+irow);</div>
-<div class="line"><a name="l00759"></a><span class="lineno">  759</span>       progress/=imgWriter.nrOfRow();</div>
-<div class="line"><a name="l00760"></a><span class="lineno">  760</span>       pfnProgress(progress,pszMessage,pProgressArg);</div>
-<div class="line"><a name="l00761"></a><span class="lineno">  761</span>     }</div>
-<div class="line"><a name="l00762"></a><span class="lineno">  762</span>     <span class="keywordflow">else</span>{</div>
-<div class="line"><a name="l00763"></a><span class="lineno">  763</span>       progress=(1.0+irow);</div>
-<div class="line"><a name="l00764"></a><span class="lineno">  764</span>       progress+=(imgWriter.nrOfRow()*writeBand);</div>
-<div class="line"><a name="l00765"></a><span class="lineno">  765</span>       progress/=imgWriter.nrOfBand()*imgWriter.nrOfRow();</div>
-<div class="line"><a name="l00766"></a><span class="lineno">  766</span>       assert(progress>=0);</div>
-<div class="line"><a name="l00767"></a><span class="lineno">  767</span>       assert(progress<=1);</div>
-<div class="line"><a name="l00768"></a><span class="lineno">  768</span>       pfnProgress(progress,pszMessage,pProgressArg);</div>
-<div class="line"><a name="l00769"></a><span class="lineno">  769</span>     }</div>
-<div class="line"><a name="l00770"></a><span class="lineno">  770</span>       }</div>
-<div class="line"><a name="l00771"></a><span class="lineno">  771</span>       ++writeBand;</div>
-<div class="line"><a name="l00772"></a><span class="lineno">  772</span>     }</div>
-<div class="line"><a name="l00773"></a><span class="lineno">  773</span>     imgReader.close();</div>
-<div class="line"><a name="l00774"></a><span class="lineno">  774</span>   }</div>
-<div class="line"><a name="l00775"></a><span class="lineno">  775</span>   <span class="keywordflow">if</span>(extent_opt.size()&&cut_opt.size()){</div>
-<div class="line"><a name="l00776"></a><span class="lineno">  776</span>     extentReader.close();</div>
-<div class="line"><a name="l00777"></a><span class="lineno">  777</span>   }</div>
-<div class="line"><a name="l00778"></a><span class="lineno">  778</span>   imgWriter.close();</div>
-<div class="line"><a name="l00779"></a><span class="lineno">  779</span> }</div>
+<div class="line"><a name="l00606"></a><span class="lineno">  606</span>       <span class="keywordflow">else</span></div>
+<div class="line"><a name="l00607"></a><span class="lineno">  607</span>     imgWriter.setProjection(imgReader.getProjection());</div>
+<div class="line"><a name="l00608"></a><span class="lineno">  608</span>       <span class="keywordflow">if</span>(imgWriter.getDataType()==GDT_Byte){</div>
+<div class="line"><a name="l00609"></a><span class="lineno">  609</span>     <span class="keywordflow">if</span>(colorTable_opt.size()){</div>
+<div class="line"><a name="l00610"></a><span class="lineno">  610</span>       <span class="keywordflow">if</span>(colorTable_opt[0]!=<span class="stringliteral">"none"</span>)</div>
+<div class="line"><a name="l00611"></a><span class="lineno">  611</span>         imgWriter.setColorTable(colorTable_opt[0]);</div>
+<div class="line"><a name="l00612"></a><span class="lineno">  612</span>     }</div>
+<div class="line"><a name="l00613"></a><span class="lineno">  613</span>     <span class="keywordflow">else</span> <span class="keywordflow">if</span> (imgReader.getColorTable()!=NULL)<span class="comment">//copy colorTable from input image</span></div>
+<div class="line"><a name="l00614"></a><span class="lineno">  614</span>       imgWriter.setColorTable(imgReader.getColorTable());</div>
+<div class="line"><a name="l00615"></a><span class="lineno">  615</span>       }</div>
+<div class="line"><a name="l00616"></a><span class="lineno">  616</span>     }</div>
+<div class="line"><a name="l00617"></a><span class="lineno">  617</span> </div>
+<div class="line"><a name="l00618"></a><span class="lineno">  618</span>     <span class="keywordtype">double</span> startCol=uli;</div>
+<div class="line"><a name="l00619"></a><span class="lineno">  619</span>     <span class="keywordtype">double</span> endCol=lri;</div>
+<div class="line"><a name="l00620"></a><span class="lineno">  620</span>     <span class="keywordflow">if</span>(uli<0)</div>
+<div class="line"><a name="l00621"></a><span class="lineno">  621</span>       startCol=0;</div>
+<div class="line"><a name="l00622"></a><span class="lineno">  622</span>     <span class="keywordflow">else</span> <span class="keywordflow">if</span>(uli>=imgReader.nrOfCol())</div>
+<div class="line"><a name="l00623"></a><span class="lineno">  623</span>       startCol=imgReader.nrOfCol()-1;</div>
+<div class="line"><a name="l00624"></a><span class="lineno">  624</span>     <span class="keywordflow">if</span>(lri<0)</div>
+<div class="line"><a name="l00625"></a><span class="lineno">  625</span>       endCol=0;</div>
+<div class="line"><a name="l00626"></a><span class="lineno">  626</span>     <span class="keywordflow">else</span> <span class="keywordflow">if</span>(lri>=imgReader.nrOfCol())</div>
+<div class="line"><a name="l00627"></a><span class="lineno">  627</span>       endCol=imgReader.nrOfCol()-1;</div>
+<div class="line"><a name="l00628"></a><span class="lineno">  628</span>     <span class="keywordtype">double</span> startRow=ulj;</div>
+<div class="line"><a name="l00629"></a><span class="lineno">  629</span>     <span class="keywordtype">double</span> endRow=lrj;</div>
+<div class="line"><a name="l00630"></a><span class="lineno">  630</span>     <span class="keywordflow">if</span>(ulj<0)</div>
+<div class="line"><a name="l00631"></a><span class="lineno">  631</span>       startRow=0;</div>
+<div class="line"><a name="l00632"></a><span class="lineno">  632</span>     <span class="keywordflow">else</span> <span class="keywordflow">if</span>(ulj>=imgReader.nrOfRow())</div>
+<div class="line"><a name="l00633"></a><span class="lineno">  633</span>       startRow=imgReader.nrOfRow()-1;</div>
+<div class="line"><a name="l00634"></a><span class="lineno">  634</span>     <span class="keywordflow">if</span>(lrj<0)</div>
+<div class="line"><a name="l00635"></a><span class="lineno">  635</span>       endRow=0;</div>
+<div class="line"><a name="l00636"></a><span class="lineno">  636</span>     <span class="keywordflow">else</span> <span class="keywordflow">if</span>(lrj>=imgReader.nrOfRow())</div>
+<div class="line"><a name="l00637"></a><span class="lineno">  637</span>       endRow=imgReader.nrOfRow()-1;</div>
+<div class="line"><a name="l00638"></a><span class="lineno">  638</span> </div>
+<div class="line"><a name="l00639"></a><span class="lineno">  639</span> </div>
+<div class="line"><a name="l00640"></a><span class="lineno">  640</span> </div>
+<div class="line"><a name="l00641"></a><span class="lineno">  641</span>     <span class="keywordtype">int</span> readncol=endCol-startCol+1;</div>
+<div class="line"><a name="l00642"></a><span class="lineno">  642</span>     vector<double> readBuffer(readncol+1);</div>
+<div class="line"><a name="l00643"></a><span class="lineno">  643</span>     <span class="keywordtype">int</span> nband=(band_opt.size())?band_opt.size() : imgReader.nrOfBand();</div>
+<div class="line"><a name="l00644"></a><span class="lineno">  644</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iband=0;iband<nband;++iband){</div>
+<div class="line"><a name="l00645"></a><span class="lineno">  645</span>       <span class="keywordtype">int</span> readBand=(band_opt.size()>iband)?band_opt[iband]:iband;</div>
+<div class="line"><a name="l00646"></a><span class="lineno">  646</span>       <span class="keywordflow">if</span>(verbose_opt[0]){</div>
+<div class="line"><a name="l00647"></a><span class="lineno">  647</span>     cout << <span class="stringliteral">"extracting band "</span> << readBand << endl;</div>
+<div class="line"><a name="l00648"></a><span class="lineno">  648</span>     pfnProgress(progress,pszMessage,pProgressArg);</div>
+<div class="line"><a name="l00649"></a><span class="lineno">  649</span>       }</div>
+<div class="line"><a name="l00650"></a><span class="lineno">  650</span>       <span class="keywordtype">double</span> theMin=0;</div>
+<div class="line"><a name="l00651"></a><span class="lineno">  651</span>       <span class="keywordtype">double</span> theMax=0;</div>
+<div class="line"><a name="l00652"></a><span class="lineno">  652</span>       <span class="keywordflow">if</span>(autoscale_opt.size()){</div>
+<div class="line"><a name="l00653"></a><span class="lineno">  653</span>     <span class="keywordflow">try</span>{</div>
+<div class="line"><a name="l00654"></a><span class="lineno">  654</span>       imgReader.getMinMax(static_cast<int>(startCol),static_cast<int>(endCol),static_cast<int>(startRow),static_cast<int>(endRow),readBand,theMin,theMax);</div>
+<div class="line"><a name="l00655"></a><span class="lineno">  655</span>     }</div>
+<div class="line"><a name="l00656"></a><span class="lineno">  656</span>     <span class="keywordflow">catch</span>(<span class="keywordtype">string</span> errorString){</div>
+<div class="line"><a name="l00657"></a><span class="lineno">  657</span>       cout << errorString << endl;</div>
+<div class="line"><a name="l00658"></a><span class="lineno">  658</span>     }</div>
+<div class="line"><a name="l00659"></a><span class="lineno">  659</span>     <span class="keywordflow">if</span>(verbose_opt[0])</div>
+<div class="line"><a name="l00660"></a><span class="lineno">  660</span>       cout << <span class="stringliteral">"minmax: "</span> << theMin << <span class="stringliteral">", "</span> << theMax << endl;</div>
+<div class="line"><a name="l00661"></a><span class="lineno">  661</span>     <span class="keywordtype">double</span> theScale=(autoscale_opt[1]-autoscale_opt[0])/(theMax-theMin);</div>
+<div class="line"><a name="l00662"></a><span class="lineno">  662</span>     <span class="keywordtype">double</span> theOffset=autoscale_opt[0]-theScale*theMin;</div>
+<div class="line"><a name="l00663"></a><span class="lineno">  663</span>     imgReader.setScale(theScale,readBand);</div>
+<div class="line"><a name="l00664"></a><span class="lineno">  664</span>     imgReader.setOffset(theOffset,readBand);</div>
+<div class="line"><a name="l00665"></a><span class="lineno">  665</span>       } </div>
+<div class="line"><a name="l00666"></a><span class="lineno">  666</span>       <span class="keywordflow">else</span>{</div>
+<div class="line"><a name="l00667"></a><span class="lineno">  667</span>     <span class="keywordflow">if</span>(scale_opt.size()){</div>
+<div class="line"><a name="l00668"></a><span class="lineno">  668</span>       <span class="keywordflow">if</span>(scale_opt.size()>iband)</div>
+<div class="line"><a name="l00669"></a><span class="lineno">  669</span>         imgReader.setScale(scale_opt[iband],readBand);</div>
+<div class="line"><a name="l00670"></a><span class="lineno">  670</span>       <span class="keywordflow">else</span></div>
+<div class="line"><a name="l00671"></a><span class="lineno">  671</span>         imgReader.setScale(scale_opt[0],readBand);</div>
+<div class="line"><a name="l00672"></a><span class="lineno">  672</span>     }</div>
+<div class="line"><a name="l00673"></a><span class="lineno">  673</span>     <span class="keywordflow">if</span>(offset_opt.size()){</div>
+<div class="line"><a name="l00674"></a><span class="lineno">  674</span>       <span class="keywordflow">if</span>(offset_opt.size()>iband)</div>
+<div class="line"><a name="l00675"></a><span class="lineno">  675</span>         imgReader.setOffset(offset_opt[iband],readBand);</div>
+<div class="line"><a name="l00676"></a><span class="lineno">  676</span>       <span class="keywordflow">else</span></div>
+<div class="line"><a name="l00677"></a><span class="lineno">  677</span>         imgReader.setOffset(offset_opt[0],readBand);</div>
+<div class="line"><a name="l00678"></a><span class="lineno">  678</span>     }</div>
+<div class="line"><a name="l00679"></a><span class="lineno">  679</span>       }</div>
+<div class="line"><a name="l00680"></a><span class="lineno">  680</span> </div>
+<div class="line"><a name="l00681"></a><span class="lineno">  681</span>       <span class="keywordtype">double</span> readRow=0;</div>
+<div class="line"><a name="l00682"></a><span class="lineno">  682</span>       <span class="keywordtype">double</span> readCol=0;</div>
+<div class="line"><a name="l00683"></a><span class="lineno">  683</span>       <span class="keywordtype">double</span> lowerCol=0;</div>
+<div class="line"><a name="l00684"></a><span class="lineno">  684</span>       <span class="keywordtype">double</span> upperCol=0;</div>
+<div class="line"><a name="l00685"></a><span class="lineno">  685</span>       <span class="keywordflow">for</span>(<span class="keywordtype">int</span> irow=0;irow<imgWriter.nrOfRow();++irow){</div>
+<div class="line"><a name="l00686"></a><span class="lineno">  686</span>     vector<float> lineMask;</div>
+<div class="line"><a name="l00687"></a><span class="lineno">  687</span>     <span class="keywordtype">double</span> x=0;</div>
+<div class="line"><a name="l00688"></a><span class="lineno">  688</span>     <span class="keywordtype">double</span> y=0;</div>
+<div class="line"><a name="l00689"></a><span class="lineno">  689</span>     <span class="comment">//convert irow to geo</span></div>
+<div class="line"><a name="l00690"></a><span class="lineno">  690</span>     imgWriter.image2geo(0,irow,x,y);</div>
+<div class="line"><a name="l00691"></a><span class="lineno">  691</span>     <span class="comment">//lookup corresponding row for irow in this file</span></div>
+<div class="line"><a name="l00692"></a><span class="lineno">  692</span>     imgReader.geo2image(x,y,readCol,readRow);</div>
+<div class="line"><a name="l00693"></a><span class="lineno">  693</span>     vector<double> writeBuffer;</div>
+<div class="line"><a name="l00694"></a><span class="lineno">  694</span>     <span class="keywordflow">if</span>(readRow<0||readRow>=imgReader.nrOfRow()){</div>
+<div class="line"><a name="l00695"></a><span class="lineno">  695</span>       <span class="comment">//if(readRow<0)</span></div>
+<div class="line"><a name="l00696"></a><span class="lineno">  696</span>       <span class="comment">//readRow=0;</span></div>
+<div class="line"><a name="l00697"></a><span class="lineno">  697</span>       <span class="comment">//else if(readRow>=imgReader.nrOfRow())</span></div>
+<div class="line"><a name="l00698"></a><span class="lineno">  698</span>       <span class="comment">//readRow=imgReader.nrOfRow()-1;</span></div>
+<div class="line"><a name="l00699"></a><span class="lineno">  699</span>       <span class="keywordflow">for</span>(<span class="keywordtype">int</span> icol=0;icol<imgWriter.nrOfCol();++icol)</div>
+<div class="line"><a name="l00700"></a><span class="lineno">  700</span>         writeBuffer.push_back(nodataValue);</div>
+<div class="line"><a name="l00701"></a><span class="lineno">  701</span>     }</div>
+<div class="line"><a name="l00702"></a><span class="lineno">  702</span>     <span class="keywordflow">else</span>{</div>
+<div class="line"><a name="l00703"></a><span class="lineno">  703</span>       <span class="keywordflow">if</span>(verbose_opt[0]>1)</div>
+<div class="line"><a name="l00704"></a><span class="lineno">  704</span>         cout << <span class="stringliteral">"reading row: "</span> << readRow << endl;</div>
+<div class="line"><a name="l00705"></a><span class="lineno">  705</span>       <span class="keywordflow">try</span>{</div>
+<div class="line"><a name="l00706"></a><span class="lineno">  706</span>             <span class="keywordflow">if</span>(endCol<imgReader.nrOfCol()-1)</div>
+<div class="line"><a name="l00707"></a><span class="lineno">  707</span>               imgReader.readData(readBuffer,GDT_Float64,startCol,endCol+1,readRow,readBand,theResample);</div>
+<div class="line"><a name="l00708"></a><span class="lineno">  708</span>             <span class="keywordflow">else</span></div>
+<div class="line"><a name="l00709"></a><span class="lineno">  709</span>               imgReader.readData(readBuffer,GDT_Float64,startCol,endCol,readRow,readBand,theResample);</div>
+<div class="line"><a name="l00710"></a><span class="lineno">  710</span>         <span class="comment">// for(int icol=0;icol<ncropcol;++icol){</span></div>
+<div class="line"><a name="l00711"></a><span class="lineno">  711</span>         <span class="keywordtype">double</span> oldRowMask=-1;<span class="comment">//keep track of row mask to optimize number of line readings</span></div>
+<div class="line"><a name="l00712"></a><span class="lineno">  712</span>         <span class="keywordflow">for</span>(<span class="keywordtype">int</span> icol=0;icol<imgWriter.nrOfCol();++icol){</div>
+<div class="line"><a name="l00713"></a><span class="lineno">  713</span>           imgWriter.image2geo(icol,irow,x,y);</div>
+<div class="line"><a name="l00714"></a><span class="lineno">  714</span>           <span class="comment">//lookup corresponding row for irow in this file</span></div>
+<div class="line"><a name="l00715"></a><span class="lineno">  715</span>           imgReader.geo2image(x,y,readCol,readRow);</div>
+<div class="line"><a name="l00716"></a><span class="lineno">  716</span>           <span class="keywordflow">if</span>(readCol<0||readCol>=imgReader.nrOfCol()){</div>
+<div class="line"><a name="l00717"></a><span class="lineno">  717</span>           <span class="comment">// if(readCol<0||readCol>=imgReader.nrOfCol()){</span></div>
+<div class="line"><a name="l00718"></a><span class="lineno">  718</span>         <span class="comment">//               if(readCol<0)</span></div>
+<div class="line"><a name="l00719"></a><span class="lineno">  719</span>         <span class="comment">//                 readCol=0;</span></div>
+<div class="line"><a name="l00720"></a><span class="lineno">  720</span>         <span class="comment">//               else if(readCol>=imgReader.nrOfCol())</span></div>
+<div class="line"><a name="l00721"></a><span class="lineno">  721</span>         <span class="comment">//                 readCol=imgReader.nrOfCol()-1;</span></div>
+<div class="line"><a name="l00722"></a><span class="lineno">  722</span>         writeBuffer.push_back(nodataValue);</div>
+<div class="line"><a name="l00723"></a><span class="lineno">  723</span>           }</div>
+<div class="line"><a name="l00724"></a><span class="lineno">  724</span>           <span class="keywordflow">else</span>{</div>
+<div class="line"><a name="l00725"></a><span class="lineno">  725</span>                 <span class="keywordtype">bool</span> valid=<span class="keyword">true</span>;</div>
+<div class="line"><a name="l00726"></a><span class="lineno">  726</span>         <span class="keywordtype">double</span> geox=0;</div>
+<div class="line"><a name="l00727"></a><span class="lineno">  727</span>         <span class="keywordtype">double</span> geoy=0;</div>
+<div class="line"><a name="l00728"></a><span class="lineno">  728</span>                 <span class="keywordflow">if</span>(mask_opt.size()){</div>
+<div class="line"><a name="l00729"></a><span class="lineno">  729</span>           <span class="comment">//read mask</span></div>
+<div class="line"><a name="l00730"></a><span class="lineno">  730</span>           <span class="keywordtype">double</span> colMask=0;</div>
+<div class="line"><a name="l00731"></a><span class="lineno">  731</span>           <span class="keywordtype">double</span> rowMask=0;</div>
+<div class="line"><a name="l00732"></a><span class="lineno">  732</span> </div>
+<div class="line"><a name="l00733"></a><span class="lineno">  733</span>           imgWriter.image2geo(icol,irow,geox,geoy);</div>
+<div class="line"><a name="l00734"></a><span class="lineno">  734</span>           maskReader.geo2image(geox,geoy,colMask,rowMask);</div>
+<div class="line"><a name="l00735"></a><span class="lineno">  735</span>           colMask=<span class="keyword">static_cast<</span><span class="keywordtype">int</span><span class="keyword">></span>(colMask);</div>
+<div class="line"><a name="l00736"></a><span class="lineno">  736</span>           rowMask=<span class="keyword">static_cast<</span><span class="keywordtype">int</span><span class="keyword">></span>(rowMask);</div>
+<div class="line"><a name="l00737"></a><span class="lineno">  737</span>           <span class="keywordflow">if</span>(rowMask>=0&&rowMask<maskReader.nrOfRow()&&colMask>=0&&colMask<maskReader.nrOfCol()){</div>
+<div class="line"><a name="l00738"></a><span class="lineno">  738</span>             <span class="keywordflow">if</span>(static_cast<int>(rowMask)!=<span class="keyword">static_cast<</span><span class="keywordtype">int</span><span class="keyword">></span>(oldRowMask)){</div>
+<div class="line"><a name="l00739"></a><span class="lineno">  739</span> </div>
+<div class="line"><a name="l00740"></a><span class="lineno">  740</span>               assert(rowMask>=0&&rowMask<maskReader.nrOfRow());</div>
+<div class="line"><a name="l00741"></a><span class="lineno">  741</span>               <span class="keywordflow">try</span>{</div>
+<div class="line"><a name="l00742"></a><span class="lineno">  742</span>             maskReader.readData(lineMask,GDT_Float32,static_cast<int>(rowMask),mskband_opt[0]);</div>
+<div class="line"><a name="l00743"></a><span class="lineno">  743</span>               }</div>
+<div class="line"><a name="l00744"></a><span class="lineno">  744</span>               <span class="keywordflow">catch</span>(<span class="keywordtype">string</span> errorstring){</div>
+<div class="line"><a name="l00745"></a><span class="lineno">  745</span>             cerr << errorstring << endl;</div>
+<div class="line"><a name="l00746"></a><span class="lineno">  746</span>             exit(1);</div>
+<div class="line"><a name="l00747"></a><span class="lineno">  747</span>               }</div>
+<div class="line"><a name="l00748"></a><span class="lineno">  748</span>               <span class="keywordflow">catch</span>(...){</div>
+<div class="line"><a name="l00749"></a><span class="lineno">  749</span>             cerr << <span class="stringliteral">"error catched"</span> << std::endl;</div>
+<div class="line"><a name="l00750"></a><span class="lineno">  750</span>             exit(3);</div>
+<div class="line"><a name="l00751"></a><span class="lineno">  751</span>               }</div>
+<div class="line"><a name="l00752"></a><span class="lineno">  752</span>               oldRowMask=rowMask;</div>
+<div class="line"><a name="l00753"></a><span class="lineno">  753</span>             }</div>
+<div class="line"><a name="l00754"></a><span class="lineno">  754</span>             <span class="keywordflow">if</span>(lineMask[colMask]==msknodata_opt[0])</div>
+<div class="line"><a name="l00755"></a><span class="lineno">  755</span>               valid=<span class="keyword">false</span>;</div>
+<div class="line"><a name="l00756"></a><span class="lineno">  756</span>           }</div>
+<div class="line"><a name="l00757"></a><span class="lineno">  757</span>         }</div>
+<div class="line"><a name="l00758"></a><span class="lineno">  758</span> </div>
+<div class="line"><a name="l00759"></a><span class="lineno">  759</span>                 <span class="keywordflow">if</span>(!valid)</div>
+<div class="line"><a name="l00760"></a><span class="lineno">  760</span>                   writeBuffer.push_back(nodataValue);</div>
+<div class="line"><a name="l00761"></a><span class="lineno">  761</span>                 <span class="keywordflow">else</span>{</div>
+<div class="line"><a name="l00762"></a><span class="lineno">  762</span>                   <span class="keywordflow">switch</span>(theResample){</div>
+<div class="line"><a name="l00763"></a><span class="lineno">  763</span>                   <span class="keywordflow">case</span>(BILINEAR):</div>
+<div class="line"><a name="l00764"></a><span class="lineno">  764</span>                     lowerCol=readCol-0.5;</div>
+<div class="line"><a name="l00765"></a><span class="lineno">  765</span>                     lowerCol=<span class="keyword">static_cast<</span><span class="keywordtype">int</span><span class="keyword">></span>(lowerCol);</div>
+<div class="line"><a name="l00766"></a><span class="lineno">  766</span>                     upperCol=readCol+0.5;</div>
+<div class="line"><a name="l00767"></a><span class="lineno">  767</span>                     upperCol=<span class="keyword">static_cast<</span><span class="keywordtype">int</span><span class="keyword">></span>(upperCol);</div>
+<div class="line"><a name="l00768"></a><span class="lineno">  768</span>                     <span class="keywordflow">if</span>(lowerCol<0)</div>
+<div class="line"><a name="l00769"></a><span class="lineno">  769</span>                       lowerCol=0;</div>
+<div class="line"><a name="l00770"></a><span class="lineno">  770</span>                     <span class="keywordflow">if</span>(upperCol>=imgReader.nrOfCol())</div>
+<div class="line"><a name="l00771"></a><span class="lineno">  771</span>                       upperCol=imgReader.nrOfCol()-1;</div>
+<div class="line"><a name="l00772"></a><span class="lineno">  772</span>                     <span class="comment">// writeBuffer.push_back((readCol-0.5-lowerCol)*(readBuffer[upperCol-startCol]*theScale+theOffset)+(1-readCol+0.5+lowerCol)*(readBuffer[lowerCol-startCol]*theScale+theOffset));</span></div>
+<div class="line"><a name="l00773"></a><span class="lineno">  773</span>                     writeBuffer.push_back((readCol-0.5-lowerCol)*readBuffer[upperCol-startCol]+(1-readCol+0.5+lowerCol)*readBuffer[lowerCol-startCol]);</div>
+<div class="line"><a name="l00774"></a><span class="lineno">  774</span>                     <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l00775"></a><span class="lineno">  775</span>                   <span class="keywordflow">default</span>:</div>
+<div class="line"><a name="l00776"></a><span class="lineno">  776</span>                     readCol=<span class="keyword">static_cast<</span><span class="keywordtype">int</span><span class="keyword">></span>(readCol);</div>
+<div class="line"><a name="l00777"></a><span class="lineno">  777</span>                     readCol-=startCol;<span class="comment">//we only start reading from startCol</span></div>
+<div class="line"><a name="l00778"></a><span class="lineno">  778</span>                     <span class="comment">// writeBuffer.push_back(readBuffer[readCol]*theScale+theOffset);</span></div>
+<div class="line"><a name="l00779"></a><span class="lineno">  779</span>                     writeBuffer.push_back(readBuffer[readCol]);</div>
+<div class="line"><a name="l00780"></a><span class="lineno">  780</span>                     <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l00781"></a><span class="lineno">  781</span>           }</div>
+<div class="line"><a name="l00782"></a><span class="lineno">  782</span>         }</div>
+<div class="line"><a name="l00783"></a><span class="lineno">  783</span>           }</div>
+<div class="line"><a name="l00784"></a><span class="lineno">  784</span>         }</div>
+<div class="line"><a name="l00785"></a><span class="lineno">  785</span>       }</div>
+<div class="line"><a name="l00786"></a><span class="lineno">  786</span>       <span class="keywordflow">catch</span>(<span class="keywordtype">string</span> errorstring){</div>
+<div class="line"><a name="l00787"></a><span class="lineno">  787</span>         cout << errorstring << endl;</div>
+<div class="line"><a name="l00788"></a><span class="lineno">  788</span>         exit(2);</div>
+<div class="line"><a name="l00789"></a><span class="lineno">  789</span>       }</div>
+<div class="line"><a name="l00790"></a><span class="lineno">  790</span>     }</div>
+<div class="line"><a name="l00791"></a><span class="lineno">  791</span>     <span class="keywordflow">if</span>(writeBuffer.size()!=imgWriter.nrOfCol())</div>
+<div class="line"><a name="l00792"></a><span class="lineno">  792</span>       cout << <span class="stringliteral">"writeBuffer.size()="</span> << writeBuffer.size() << <span class="stringliteral">", imgWriter.nrOfCol()="</span> << imgWriter.nrOfCol() << endl;</div>
+<div class="line"><a name="l00793"></a><span class="lineno">  793</span>     assert(writeBuffer.size()==imgWriter.nrOfCol());</div>
+<div class="line"><a name="l00794"></a><span class="lineno">  794</span>     <span class="keywordflow">try</span>{</div>
+<div class="line"><a name="l00795"></a><span class="lineno">  795</span>       imgWriter.writeData(writeBuffer,GDT_Float64,irow,writeBand);</div>
+<div class="line"><a name="l00796"></a><span class="lineno">  796</span>     }</div>
+<div class="line"><a name="l00797"></a><span class="lineno">  797</span>     <span class="keywordflow">catch</span>(<span class="keywordtype">string</span> errorstring){</div>
+<div class="line"><a name="l00798"></a><span class="lineno">  798</span>       cout << errorstring << endl;</div>
+<div class="line"><a name="l00799"></a><span class="lineno">  799</span>       exit(3);</div>
+<div class="line"><a name="l00800"></a><span class="lineno">  800</span>     }</div>
+<div class="line"><a name="l00801"></a><span class="lineno">  801</span>     <span class="keywordflow">if</span>(verbose_opt[0]){</div>
+<div class="line"><a name="l00802"></a><span class="lineno">  802</span>       progress=(1.0+irow);</div>
+<div class="line"><a name="l00803"></a><span class="lineno">  803</span>       progress/=imgWriter.nrOfRow();</div>
+<div class="line"><a name="l00804"></a><span class="lineno">  804</span>       pfnProgress(progress,pszMessage,pProgressArg);</div>
+<div class="line"><a name="l00805"></a><span class="lineno">  805</span>     }</div>
+<div class="line"><a name="l00806"></a><span class="lineno">  806</span>     <span class="keywordflow">else</span>{</div>
+<div class="line"><a name="l00807"></a><span class="lineno">  807</span>       progress=(1.0+irow);</div>
+<div class="line"><a name="l00808"></a><span class="lineno">  808</span>       progress+=(imgWriter.nrOfRow()*writeBand);</div>
+<div class="line"><a name="l00809"></a><span class="lineno">  809</span>       progress/=imgWriter.nrOfBand()*imgWriter.nrOfRow();</div>
+<div class="line"><a name="l00810"></a><span class="lineno">  810</span>       assert(progress>=0);</div>
+<div class="line"><a name="l00811"></a><span class="lineno">  811</span>       assert(progress<=1);</div>
+<div class="line"><a name="l00812"></a><span class="lineno">  812</span>       pfnProgress(progress,pszMessage,pProgressArg);</div>
+<div class="line"><a name="l00813"></a><span class="lineno">  813</span>     }</div>
+<div class="line"><a name="l00814"></a><span class="lineno">  814</span>       }</div>
+<div class="line"><a name="l00815"></a><span class="lineno">  815</span>       ++writeBand;</div>
+<div class="line"><a name="l00816"></a><span class="lineno">  816</span>     }</div>
+<div class="line"><a name="l00817"></a><span class="lineno">  817</span>     imgReader.close();</div>
+<div class="line"><a name="l00818"></a><span class="lineno">  818</span>   }</div>
+<div class="line"><a name="l00819"></a><span class="lineno">  819</span>   <span class="keywordflow">if</span>(extent_opt.size()&&cut_opt.size()){</div>
+<div class="line"><a name="l00820"></a><span class="lineno">  820</span>     extentReader.close();</div>
+<div class="line"><a name="l00821"></a><span class="lineno">  821</span>   }</div>
+<div class="line"><a name="l00822"></a><span class="lineno">  822</span>   <span class="keywordflow">if</span>(mask_opt.size())</div>
+<div class="line"><a name="l00823"></a><span class="lineno">  823</span>     maskReader.close();</div>
+<div class="line"><a name="l00824"></a><span class="lineno">  824</span>   imgWriter.close();</div>
+<div class="line"><a name="l00825"></a><span class="lineno">  825</span> }</div>
 <div class="ttc" id="classImgReaderGdal_html"><div class="ttname"><a href="classImgReaderGdal.html">ImgReaderGdal</a></div><div class="ttdef"><b>Definition:</b> <a href="ImgReaderGdal_8h_source.html#l00033">ImgReaderGdal.h:33</a></div></div>
 <div class="ttc" id="classImgWriterGdal_html"><div class="ttname"><a href="classImgWriterGdal.html">ImgWriterGdal</a></div><div class="ttdef"><b>Definition:</b> <a href="ImgWriterGdal_8h_source.html#l00032">ImgWriterGdal.h:32</a></div></div>
 <div class="ttc" id="classImgReaderOgr_html"><div class="ttname"><a href="classImgReaderOgr.html">ImgReaderOgr</a></div><div class="ttdef"><b>Definition:</b> <a href="ImgReaderOgr_8h_source.html#l00035">ImgReaderOgr.h:35</a></div></div>
@@ -779,7 +820,7 @@
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Jun 23 2015 17:09:36 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Tue Nov 3 2015 15:58:26 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/pkcrop_8py_source.html b/doc/html/pkcrop_8py_source.html
index 73ff915..25eda4e 100644
--- a/doc/html/pkcrop_8py_source.html
+++ b/doc/html/pkcrop_8py_source.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.3</span>
+    <span id="projectnumber">2.6.4</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -200,7 +200,7 @@
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Jun 23 2015 17:09:36 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Tue Nov 3 2015 15:58:26 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/pkcrop__gui_2main_8cc_source.html b/doc/html/pkcrop__gui_2main_8cc_source.html
index 34e75be..edb9643 100644
--- a/doc/html/pkcrop__gui_2main_8cc_source.html
+++ b/doc/html/pkcrop__gui_2main_8cc_source.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.3</span>
+    <span id="projectnumber">2.6.4</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -88,7 +88,7 @@
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Jun 23 2015 17:09:36 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Tue Nov 3 2015 15:58:26 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/pkcrop__gui_2mainwindow_8cc_source.html b/doc/html/pkcrop__gui_2mainwindow_8cc_source.html
index 1491581..31adcdc 100644
--- a/doc/html/pkcrop__gui_2mainwindow_8cc_source.html
+++ b/doc/html/pkcrop__gui_2mainwindow_8cc_source.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.3</span>
+    <span id="projectnumber">2.6.4</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -363,7 +363,7 @@
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Jun 23 2015 17:09:36 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Tue Nov 3 2015 15:58:26 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/pkcrop__gui_2mainwindow_8h_source.html b/doc/html/pkcrop__gui_2mainwindow_8h_source.html
index b7ced95..0ea106b 100644
--- a/doc/html/pkcrop__gui_2mainwindow_8h_source.html
+++ b/doc/html/pkcrop__gui_2mainwindow_8h_source.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.3</span>
+    <span id="projectnumber">2.6.4</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -137,7 +137,7 @@
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Jun 23 2015 17:09:36 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Tue Nov 3 2015 15:58:26 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/pkdiff.html b/doc/html/pkdiff.html
index 797f840..3da5d4d 100644
--- a/doc/html/pkdiff.html
+++ b/doc/html/pkdiff.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.3</span>
+    <span id="projectnumber">2.6.4</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -120,7 +120,7 @@ Usage: pkdiff -i input -ref reference</li>
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Jun 23 2015 17:09:37 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/pkdiff_8cc_source.html b/doc/html/pkdiff_8cc_source.html
index c28e3f3..d101847 100644
--- a/doc/html/pkdiff_8cc_source.html
+++ b/doc/html/pkdiff_8cc_source.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.3</span>
+    <span id="projectnumber">2.6.4</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -955,7 +955,7 @@
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Jun 23 2015 17:09:36 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Tue Nov 3 2015 15:58:26 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/pkdiff__accuracy_8py_source.html b/doc/html/pkdiff__accuracy_8py_source.html
index 3c06236..e9a0ac1 100644
--- a/doc/html/pkdiff__accuracy_8py_source.html
+++ b/doc/html/pkdiff__accuracy_8py_source.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.3</span>
+    <span id="projectnumber">2.6.4</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -261,7 +261,7 @@
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Jun 23 2015 17:09:36 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Tue Nov 3 2015 15:58:26 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/pkdiff__gui_2main_8cpp_source.html b/doc/html/pkdiff__gui_2main_8cpp_source.html
index 314d21c..8590144 100644
--- a/doc/html/pkdiff__gui_2main_8cpp_source.html
+++ b/doc/html/pkdiff__gui_2main_8cpp_source.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.3</span>
+    <span id="projectnumber">2.6.4</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -87,7 +87,7 @@
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Jun 23 2015 17:09:36 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Tue Nov 3 2015 15:58:26 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/pkdiff__gui_2mainwindow_8cpp_source.html b/doc/html/pkdiff__gui_2mainwindow_8cpp_source.html
index 5cbc3c7..67ec87f 100644
--- a/doc/html/pkdiff__gui_2mainwindow_8cpp_source.html
+++ b/doc/html/pkdiff__gui_2mainwindow_8cpp_source.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.3</span>
+    <span id="projectnumber">2.6.4</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -265,7 +265,7 @@
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Jun 23 2015 17:09:36 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Tue Nov 3 2015 15:58:26 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/pkdiff__gui_2mainwindow_8h_source.html b/doc/html/pkdiff__gui_2mainwindow_8h_source.html
index 789c256..5e5576c 100644
--- a/doc/html/pkdiff__gui_2mainwindow_8h_source.html
+++ b/doc/html/pkdiff__gui_2mainwindow_8h_source.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.3</span>
+    <span id="projectnumber">2.6.4</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -125,7 +125,7 @@
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Jun 23 2015 17:09:36 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Tue Nov 3 2015 15:58:26 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/pkdsm2shadow.html b/doc/html/pkdsm2shadow.html
index 225c8ad..f5cafeb 100644
--- a/doc/html/pkdsm2shadow.html
+++ b/doc/html/pkdsm2shadow.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.3</span>
+    <span id="projectnumber">2.6.4</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -90,7 +90,7 @@ Usage: pkdsm2shadow -i input.txt -o output [-sza angle] [-saa angle]</li>
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Jun 23 2015 17:09:37 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/pkdsm2shadow_8cc_source.html b/doc/html/pkdsm2shadow_8cc_source.html
index bdc7f24..604ec86 100644
--- a/doc/html/pkdsm2shadow_8cc_source.html
+++ b/doc/html/pkdsm2shadow_8cc_source.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.3</span>
+    <span id="projectnumber">2.6.4</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -204,7 +204,7 @@
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Jun 23 2015 17:09:36 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Tue Nov 3 2015 15:58:26 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/pkdumpimg.html b/doc/html/pkdumpimg.html
index 2b2fafd..96033ab 100644
--- a/doc/html/pkdumpimg.html
+++ b/doc/html/pkdumpimg.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.3</span>
+    <span id="projectnumber">2.6.4</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -97,7 +97,7 @@ Usage: pkdumpimg -i input.txt [-o output]</li>
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Jun 23 2015 17:09:37 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/pkdumpimg_8cc_source.html b/doc/html/pkdumpimg_8cc_source.html
index b35b25c..6628b66 100644
--- a/doc/html/pkdumpimg_8cc_source.html
+++ b/doc/html/pkdumpimg_8cc_source.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.3</span>
+    <span id="projectnumber">2.6.4</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -405,7 +405,7 @@
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Jun 23 2015 17:09:36 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Tue Nov 3 2015 15:58:26 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/pkdumpogr.html b/doc/html/pkdumpogr.html
index 2c88bfe..6ce01b5 100644
--- a/doc/html/pkdumpogr.html
+++ b/doc/html/pkdumpogr.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.3</span>
+    <span id="projectnumber">2.6.4</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -83,7 +83,7 @@ Usage: pkdumpogr -i input. [-o output]</li>
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Jun 23 2015 17:09:37 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/pkdumpogr_8cc_source.html b/doc/html/pkdumpogr_8cc_source.html
index 83ec34c..1a9896f 100644
--- a/doc/html/pkdumpogr_8cc_source.html
+++ b/doc/html/pkdumpogr_8cc_source.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.3</span>
+    <span id="projectnumber">2.6.4</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -291,7 +291,7 @@
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Jun 23 2015 17:09:36 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Tue Nov 3 2015 15:58:26 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/pkdumpogr_8h_source.html b/doc/html/pkdumpogr_8h_source.html
index 3a1fd79..dbf2aa7 100644
--- a/doc/html/pkdumpogr_8h_source.html
+++ b/doc/html/pkdumpogr_8h_source.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.3</span>
+    <span id="projectnumber">2.6.4</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -189,7 +189,7 @@
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Jun 23 2015 17:09:36 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Tue Nov 3 2015 15:58:26 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/pkeditogr_8cc_source.html b/doc/html/pkeditogr_8cc_source.html
index 192e232..947dd9d 100644
--- a/doc/html/pkeditogr_8cc_source.html
+++ b/doc/html/pkeditogr_8cc_source.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.3</span>
+    <span id="projectnumber">2.6.4</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -345,7 +345,7 @@
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Jun 23 2015 17:09:36 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Tue Nov 3 2015 15:58:26 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/pkegcs.html b/doc/html/pkegcs.html
index 4714e88..0002cec 100644
--- a/doc/html/pkegcs.html
+++ b/doc/html/pkegcs.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.3</span>
+    <span id="projectnumber">2.6.4</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -81,7 +81,7 @@ Options</h1>
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Jun 23 2015 17:09:37 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/pkegcs_8cc_source.html b/doc/html/pkegcs_8cc_source.html
index 966cfc8..24ba149 100644
--- a/doc/html/pkegcs_8cc_source.html
+++ b/doc/html/pkegcs_8cc_source.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.3</span>
+    <span id="projectnumber">2.6.4</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -160,7 +160,7 @@
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Jun 23 2015 17:09:36 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Tue Nov 3 2015 15:58:26 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/pkenhance_8cc_source.html b/doc/html/pkenhance_8cc_source.html
index d686747..8d0582b 100644
--- a/doc/html/pkenhance_8cc_source.html
+++ b/doc/html/pkenhance_8cc_source.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.3</span>
+    <span id="projectnumber">2.6.4</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -258,7 +258,7 @@
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Jun 23 2015 17:09:36 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Tue Nov 3 2015 15:58:26 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/pkextract.html b/doc/html/pkextract.html
index 3cf92b1..43f3301 100644
--- a/doc/html/pkextract.html
+++ b/doc/html/pkextract.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.3</span>
+    <span id="projectnumber">2.6.4</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -48,12 +48,42 @@
 <p><code> Usage: pkextract -i input [-s sample | -rand number | -grid size] -o output </code></p>
 <p><code></code></p>
 <p><code> Options: [-ln layer]* [-c class]* [-t threshold]* [-f format] [-ft fieldType] [-lt labelType] [-polygon] [-b band]* [-r rule]</code></p>
-<p><code> Advanced options: [-bndnodata band -srcnodata value]* [-tp threshold] [-test testSample] [-bn attribute] [-cn attribute] [-geo value] [-down value] [-buf value [-circ]] </code></p>
+<p><code> Advanced options: [-sband band -eband band]* [-bndnodata band -srcnodata value]* [-tp threshold] [-test testSample] [-bn attribute] [-cn attribute] [-geo value] [-down value] [-buf value [-circ]] </code></p>
 <h1><a class="anchor" id="pkextract_description"></a>
 Description</h1>
 <p>The utility pkextract extracts pixel values from an input raster dataset, based on the locations you provide via a sample file. Alternatively, a random sample or systematic grid of points can also be extracted. The sample can be a vector file with points or polygons. In the case of polygons, you can either extract the values for all raster pixels that are covered by the polygons, or extract a single value for each polygon such as the centroid, mean, median, etc. As output, a new copy  [...]
 <p>Instead of a vector dataset, the sample can also be a raster dataset with categorical values. The typical use case is a land cover map that overlaps the input raster dataset. The utility then extracts pixels from the input raster for the respective land cover classes. To select a random subset of the sample raster dataset you can set the threshold option -t with a percentage value.</p>
 <p>A typical usage of pkextract is to prepare a training sample for one of the classifiers implemented in pktools.</p>
+<p><a class="anchor" id="pkextract_rules"></a></p>
+<p>Overview of the possible extraction rules:</p>
+<table class="doxtable">
+<tr>
+<th>extraction rule </th><th>output features  </th></tr>
+<tr>
+<td>point </td><td>Extract all pixel values covered by the polygon (option -polygon not set) or extract a pixel on the surface option (-polygon set). </td></tr>
+<tr>
+<td>centroid </td><td>Extract pixel value at the centroid of the polygon. </td></tr>
+<tr>
+<td>mean </td><td>Extract average of all pixel values within the polygon. </td></tr>
+<tr>
+<td>stdev </td><td>Extract standard deviation of all pixel values within the polygon. </td></tr>
+<tr>
+<td>median </td><td>Extract median of all pixel values within the polygon. </td></tr>
+<tr>
+<td>min </td><td>Extract minimum value of all pixels within the polygon. </td></tr>
+<tr>
+<td>max </td><td>Extract maximum value of all pixels within the polygon. </td></tr>
+<tr>
+<td>sum </td><td>Extract sum of the values of all pixels within the polygon. </td></tr>
+<tr>
+<td>mode </td><td>Extract the mode of classes within the polygon (classes must be set with the option class). </td></tr>
+<tr>
+<td>proportion </td><td>Extract proportion of class(es) within the polygon (classes must be set with the option class). </td></tr>
+<tr>
+<td>count </td><td>Extract count of class(es) within the polygon (classes must be set with the option class). </td></tr>
+<tr>
+<td>percentile </td><td>Extract percentile as defined by option perc (e.g, 95th percentile of values covered by polygon). </td></tr>
+</table>
 <h1><a class="anchor" id="pkextract_options"></a>
 Options</h1>
 <ul>
@@ -74,7 +104,7 @@ Options</h1>
 <tr>
 <td>o </td><td>output </td><td>std::string </td><td></td><td>Output sample dataset </td></tr>
 <tr>
-<td>c </td><td>class </td><td>int </td><td></td><td>Class(es) to extract from input sample image. Leave empty to extract all valid data pixels from sample dataset. Make sure to set classes if rule is set to mode or proportion </td></tr>
+<td>c </td><td>class </td><td>int </td><td></td><td>Class(es) to extract from input sample image. Leave empty to extract all valid data pixels from sample dataset. Make sure to set classes if rule is set to mode, proportion or count </td></tr>
 <tr>
 <td>t </td><td>threshold </td><td>float </td><td>100 </td><td>Probability threshold for selecting samples (randomly). Provide probability in percentage (>0) or absolute (<0). Use a single threshold for vector sample datasets. If using raster land cover maps as a sample dataset, you can provide a threshold value for each class (e.g. -t 80 -t 60). Use value 100 to select all pixels for selected class(es) </td></tr>
 <tr>
@@ -90,7 +120,11 @@ Options</h1>
 <tr>
 <td>b </td><td>band </td><td>int </td><td></td><td>Band index(es) to extract (0 based). Leave empty to use all bands </td></tr>
 <tr>
-<td>r </td><td>rule </td><td>std::string </td><td>centroid </td><td>Rule how to report image information per feature (only for vector sample). point (value at each point or at centroid if polygon), centroid, mean, stdev, median, proportion, min, max, mode, sum, percentile. </td></tr>
+<td>sband </td><td>startband </td><td>unsigned short </td><td></td><td>Start band sequence number </td></tr>
+<tr>
+<td>eband </td><td>endband </td><td>unsigned short </td><td></td><td>End band sequence number </td></tr>
+<tr>
+<td>r </td><td>rule </td><td>std::string </td><td>centroid </td><td>Rule how to report image information per feature (only for vector sample). point (value at each point or at centroid if polygon), centroid, mean, stdev, median, proportion, count, min, max, mode, sum, percentile. </td></tr>
 <tr>
 <td>bndnodata </td><td>bndnodata </td><td>int </td><td>0 </td><td>Band(s) in input image to check if pixel is valid (used for srcnodata) </td></tr>
 <tr>
@@ -120,7 +154,7 @@ Usage: pkextract -i input [-s sample | -rand number | -grid size] -o output</li>
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Jun 23 2015 17:09:37 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/pkextract_8cc_source.html b/doc/html/pkextract_8cc_source.html
index 1e41774..5eabacb 100644
--- a/doc/html/pkextract_8cc_source.html
+++ b/doc/html/pkextract_8cc_source.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.3</span>
+    <span id="projectnumber">2.6.4</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -89,2408 +89,2406 @@
 <div class="line"><a name="l00035"></a><span class="lineno">   35</span> <span class="preprocessor"></span><span class="preprocessor">#endif</span></div>
 <div class="line"><a name="l00036"></a><span class="lineno">   36</span> <span class="preprocessor"></span></div>
 <div class="line"><a name="l00037"></a><span class="lineno">   37</span> <span class="comment">/******************************************************************************/</span></div>
-<div class="line"><a name="l00101"></a><span class="lineno">  101</span> <span class="keyword">namespace </span>rule{</div>
-<div class="line"><a name="l00102"></a><span class="lineno">  102</span>   <span class="keyword">enum</span> RULE_TYPE {point=0, mean=1, proportion=2, custom=3, min=4, max=5, mode=6, centroid=7, sum=8, median=9, stdev=10, percentile=11};</div>
-<div class="line"><a name="l00103"></a><span class="lineno">  103</span> }</div>
-<div class="line"><a name="l00104"></a><span class="lineno">  104</span> </div>
-<div class="line"><a name="l00105"></a><span class="lineno">  105</span> <span class="keyword">using namespace </span>std;</div>
-<div class="line"><a name="l00106"></a><span class="lineno">  106</span> </div>
-<div class="line"><a name="l00107"></a><span class="lineno">  107</span> <span class="keywordtype">int</span> main(<span class="keywordtype">int</span> argc, <span class="keywordtype">char</span> *argv[])</div>
-<div class="line"><a name="l00108"></a><span class="lineno">  108</span> {</div>
-<div class="line"><a name="l00109"></a><span class="lineno">  109</span>   <a class="code" href="classOptionpk.html">Optionpk<string></a> image_opt(<span class="stringliteral">"i"</span>, <span class="stringliteral">"input"</span>, <span class="stringliteral">"Raster input dataset containing band information"</span>);</div>
-<div class="line"><a name="l00110"></a><span class="lineno">  110</span>   <a class="code" href="classOptionpk.html">Optionpk<string></a> sample_opt(<span class="stringliteral">"s"</span>, <span class="stringliteral">"sample"</span>, <span class="stringliteral">"OGR vector dataset with features to be extracted from input data. Output will contain features with input band information included. Sample image can also be GDAL raster dataset."</span>);</div>
-<div class="line"><a name="l00111"></a><span class="lineno">  111</span>   <a class="code" href="classOptionpk.html">Optionpk<string></a> layer_opt(<span class="stringliteral">"ln"</span>, <span class="stringliteral">"ln"</span>, <span class="stringliteral">"Layer name(s) in sample (leave empty to select all)"</span>);</div>
-<div class="line"><a name="l00112"></a><span class="lineno">  112</span>   <a class="code" href="classOptionpk.html">Optionpk<unsigned int></a> random_opt(<span class="stringliteral">"rand"</span>, <span class="stringliteral">"random"</span>, <span class="stringliteral">"Create simple random sample of points. Provide number of points to generate"</span>);</div>
-<div class="line"><a name="l00113"></a><span class="lineno">  113</span>   <a class="code" href="classOptionpk.html">Optionpk<double></a> grid_opt(<span class="stringliteral">"grid"</span>, <span class="stringliteral">"grid"</span>, <span class="stringliteral">"Create systematic grid of points. Provide cell grid size (in projected units, e.g,. m)"</span>);</div>
-<div class="line"><a name="l00114"></a><span class="lineno">  114</span>   <a class="code" href="classOptionpk.html">Optionpk<string></a> output_opt(<span class="stringliteral">"o"</span>, <span class="stringliteral">"output"</span>, <span class="stringliteral">"Output sample dataset"</span>);</div>
-<div class="line"><a name="l00115"></a><span class="lineno">  115</span>   <a class="code" href="classOptionpk.html">Optionpk<int></a> class_opt(<span class="stringliteral">"c"</span>, <span class="stringliteral">"class"</span>, <span class="stringliteral">"Class(es) to extract from input sample image. Leave empty to extract all valid data pixels from sample dataset. Make sure to set classes if rule is set to mode or proportion"</span>);</div>
-<div class="line"><a name="l00116"></a><span class="lineno">  116</span>   <a class="code" href="classOptionpk.html">Optionpk<float></a> threshold_opt(<span class="stringliteral">"t"</span>, <span class="stringliteral">"threshold"</span>, <span class="stringliteral">"Probability threshold for selecting samples (randomly). Provide probability in percentage (>0) or absolute (<0). Use a single threshold for vector sample datasets. If using raster la [...]
-<div class="line"><a name="l00117"></a><span class="lineno">  117</span>   <a class="code" href="classOptionpk.html">Optionpk<double></a> percentile_opt(<span class="stringliteral">"perc"</span>,<span class="stringliteral">"perc"</span>,<span class="stringliteral">"Percentile value used for rule percentile"</span>,95);</div>
-<div class="line"><a name="l00118"></a><span class="lineno">  118</span>   <a class="code" href="classOptionpk.html">Optionpk<string></a> ogrformat_opt(<span class="stringliteral">"f"</span>, <span class="stringliteral">"f"</span>, <span class="stringliteral">"Output sample dataset format"</span>,<span class="stringliteral">"SQLite"</span>);</div>
-<div class="line"><a name="l00119"></a><span class="lineno">  119</span>   <a class="code" href="classOptionpk.html">Optionpk<string></a> ftype_opt(<span class="stringliteral">"ft"</span>, <span class="stringliteral">"ftype"</span>, <span class="stringliteral">"Field type (only Real or Integer)"</span>, <span class="stringliteral">"Real"</span>);</div>
-<div class="line"><a name="l00120"></a><span class="lineno">  120</span>   <a class="code" href="classOptionpk.html">Optionpk<string></a> ltype_opt(<span class="stringliteral">"lt"</span>, <span class="stringliteral">"ltype"</span>, <span class="stringliteral">"Label type: In16 or String"</span>, <span class="stringliteral">"Integer"</span>);</div>
-<div class="line"><a name="l00121"></a><span class="lineno">  121</span>   <a class="code" href="classOptionpk.html">Optionpk<bool></a> polygon_opt(<span class="stringliteral">"polygon"</span>, <span class="stringliteral">"polygon"</span>, <span class="stringliteral">"Create OGRPolygon as geometry instead of OGRPoint."</span>, <span class="keyword">false</span>);</div>
-<div class="line"><a name="l00122"></a><span class="lineno">  122</span>   <a class="code" href="classOptionpk.html">Optionpk<int></a> band_opt(<span class="stringliteral">"b"</span>, <span class="stringliteral">"band"</span>, <span class="stringliteral">"Band index(es) to extract (0 based). Leave empty to use all bands"</span>);</div>
-<div class="line"><a name="l00123"></a><span class="lineno">  123</span>   <a class="code" href="classOptionpk.html">Optionpk<string></a> rule_opt(<span class="stringliteral">"r"</span>, <span class="stringliteral">"rule"</span>, <span class="stringliteral">"Rule how to report image information per feature (only for vector sample). point (value at each point or at centroid if polygon), centroid, mean, stdev, median, proportion, min, max, mode, sum, per [...]
-<div class="line"><a name="l00124"></a><span class="lineno">  124</span>   <a class="code" href="classOptionpk.html">Optionpk<double></a> srcnodata_opt(<span class="stringliteral">"srcnodata"</span>, <span class="stringliteral">"srcnodata"</span>, <span class="stringliteral">"Invalid value(s) for input image"</span>);</div>
-<div class="line"><a name="l00125"></a><span class="lineno">  125</span>   <a class="code" href="classOptionpk.html">Optionpk<int></a> bndnodata_opt(<span class="stringliteral">"bndnodata"</span>, <span class="stringliteral">"bndnodata"</span>, <span class="stringliteral">"Band(s) in input image to check if pixel is valid (used for srcnodata)"</span>, 0);</div>
-<div class="line"><a name="l00126"></a><span class="lineno">  126</span>   <a class="code" href="classOptionpk.html">Optionpk<float></a> polythreshold_opt(<span class="stringliteral">"tp"</span>, <span class="stringliteral">"thresholdPolygon"</span>, <span class="stringliteral">"(absolute) threshold for selecting samples in each polygon"</span>);</div>
-<div class="line"><a name="l00127"></a><span class="lineno">  127</span>   <a class="code" href="classOptionpk.html">Optionpk<string></a> test_opt(<span class="stringliteral">"test"</span>, <span class="stringliteral">"test"</span>, <span class="stringliteral">"Test sample dataset (use this option in combination with threshold<100 to create a training (output) and test set"</span>);</div>
-<div class="line"><a name="l00128"></a><span class="lineno">  128</span>   <a class="code" href="classOptionpk.html">Optionpk<string></a> fieldname_opt(<span class="stringliteral">"bn"</span>, <span class="stringliteral">"bname"</span>, <span class="stringliteral">"For single band input data, this extra attribute name will correspond to the raster values. For multi-band input data, multiple attributes with this prefix will be added (e.g. b0, b1, b2, et [...]
-<div class="line"><a name="l00129"></a><span class="lineno">  129</span>   <a class="code" href="classOptionpk.html">Optionpk<string></a> label_opt(<span class="stringliteral">"cn"</span>, <span class="stringliteral">"cname"</span>, <span class="stringliteral">"Name of the class label in the output vector dataset"</span>, <span class="stringliteral">"label"</span>);</div>
-<div class="line"><a name="l00130"></a><span class="lineno">  130</span>   <a class="code" href="classOptionpk.html">Optionpk<short></a> geo_opt(<span class="stringliteral">"geo"</span>, <span class="stringliteral">"geo"</span>, <span class="stringliteral">"Use geo coordinates (set to 0 to use image coordinates)"</span>, 1);</div>
-<div class="line"><a name="l00131"></a><span class="lineno">  131</span>   <a class="code" href="classOptionpk.html">Optionpk<short></a> down_opt(<span class="stringliteral">"down"</span>, <span class="stringliteral">"down"</span>, <span class="stringliteral">"Down sampling factor (for raster sample datasets only). Can be used to create grid points"</span>, 1);</div>
-<div class="line"><a name="l00132"></a><span class="lineno">  132</span>   <a class="code" href="classOptionpk.html">Optionpk<short></a> buffer_opt(<span class="stringliteral">"buf"</span>, <span class="stringliteral">"buffer"</span>, <span class="stringliteral">"Buffer for calculating statistics for point features "</span>);</div>
-<div class="line"><a name="l00133"></a><span class="lineno">  133</span>   <a class="code" href="classOptionpk.html">Optionpk<bool></a> disc_opt(<span class="stringliteral">"circ"</span>, <span class="stringliteral">"circular"</span>, <span class="stringliteral">"Use a circular disc kernel buffer (for vector point sample datasets only, use in combination with buffer option)"</span>, <span class="keyword">false</span>);</div>
-<div class="line"><a name="l00134"></a><span class="lineno">  134</span>   <a class="code" href="classOptionpk.html">Optionpk<short></a> verbose_opt(<span class="stringliteral">"v"</span>, <span class="stringliteral">"verbose"</span>, <span class="stringliteral">"Verbose mode if > 0"</span>, 0,2);</div>
-<div class="line"><a name="l00135"></a><span class="lineno">  135</span> </div>
-<div class="line"><a name="l00136"></a><span class="lineno">  136</span>   bndnodata_opt.setHide(1);</div>
-<div class="line"><a name="l00137"></a><span class="lineno">  137</span>   srcnodata_opt.setHide(1);</div>
-<div class="line"><a name="l00138"></a><span class="lineno">  138</span>   polythreshold_opt.setHide(1);</div>
-<div class="line"><a name="l00139"></a><span class="lineno">  139</span>   percentile_opt.setHide(1);</div>
-<div class="line"><a name="l00140"></a><span class="lineno">  140</span>   test_opt.setHide(1);</div>
-<div class="line"><a name="l00141"></a><span class="lineno">  141</span>   fieldname_opt.setHide(1);</div>
-<div class="line"><a name="l00142"></a><span class="lineno">  142</span>   label_opt.setHide(1);</div>
-<div class="line"><a name="l00143"></a><span class="lineno">  143</span>   geo_opt.setHide(1);</div>
-<div class="line"><a name="l00144"></a><span class="lineno">  144</span>   down_opt.setHide(1);</div>
-<div class="line"><a name="l00145"></a><span class="lineno">  145</span>   buffer_opt.setHide(1);</div>
-<div class="line"><a name="l00146"></a><span class="lineno">  146</span>   disc_opt.setHide(1);</div>
-<div class="line"><a name="l00147"></a><span class="lineno">  147</span> </div>
-<div class="line"><a name="l00148"></a><span class="lineno">  148</span>   <span class="keywordtype">bool</span> doProcess;<span class="comment">//stop process when program was invoked with help option (-h --help)</span></div>
-<div class="line"><a name="l00149"></a><span class="lineno">  149</span>   <span class="keywordflow">try</span>{</div>
-<div class="line"><a name="l00150"></a><span class="lineno">  150</span>     doProcess=image_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00151"></a><span class="lineno">  151</span>     sample_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00152"></a><span class="lineno">  152</span>     layer_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00153"></a><span class="lineno">  153</span>     random_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00154"></a><span class="lineno">  154</span>     grid_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00155"></a><span class="lineno">  155</span>     output_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00156"></a><span class="lineno">  156</span>     class_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00157"></a><span class="lineno">  157</span>     threshold_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00158"></a><span class="lineno">  158</span>     percentile_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00159"></a><span class="lineno">  159</span>     ogrformat_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00160"></a><span class="lineno">  160</span>     ftype_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00161"></a><span class="lineno">  161</span>     ltype_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00162"></a><span class="lineno">  162</span>     polygon_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00163"></a><span class="lineno">  163</span>     band_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00164"></a><span class="lineno">  164</span>     rule_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00165"></a><span class="lineno">  165</span>     bndnodata_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00166"></a><span class="lineno">  166</span>     srcnodata_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00167"></a><span class="lineno">  167</span>     polythreshold_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00168"></a><span class="lineno">  168</span>     test_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00169"></a><span class="lineno">  169</span>     fieldname_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00170"></a><span class="lineno">  170</span>     label_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00171"></a><span class="lineno">  171</span>     geo_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00172"></a><span class="lineno">  172</span>     down_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00173"></a><span class="lineno">  173</span>     buffer_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00174"></a><span class="lineno">  174</span>     disc_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00175"></a><span class="lineno">  175</span>     <span class="comment">// rbox_opt.retrieveOption(argc,argv);</span></div>
-<div class="line"><a name="l00176"></a><span class="lineno">  176</span>     <span class="comment">// cbox_opt.retrieveOption(argc,argv);</span></div>
-<div class="line"><a name="l00177"></a><span class="lineno">  177</span>     verbose_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00178"></a><span class="lineno">  178</span>   }</div>
-<div class="line"><a name="l00179"></a><span class="lineno">  179</span>   <span class="keywordflow">catch</span>(<span class="keywordtype">string</span> predefinedString){</div>
-<div class="line"><a name="l00180"></a><span class="lineno">  180</span>     std::cout << predefinedString << std::endl;</div>
-<div class="line"><a name="l00181"></a><span class="lineno">  181</span>     exit(0);</div>
-<div class="line"><a name="l00182"></a><span class="lineno">  182</span>   }</div>
-<div class="line"><a name="l00183"></a><span class="lineno">  183</span>   <span class="keywordflow">if</span>(!doProcess){</div>
-<div class="line"><a name="l00184"></a><span class="lineno">  184</span>     cout << endl;</div>
-<div class="line"><a name="l00185"></a><span class="lineno">  185</span>     cout << <span class="stringliteral">"Usage: pkextract -i input [-s sample | -rand number | -grid size] -o output"</span> << endl;</div>
-<div class="line"><a name="l00186"></a><span class="lineno">  186</span>     cout << endl;</div>
-<div class="line"><a name="l00187"></a><span class="lineno">  187</span>     std::cout << <span class="stringliteral">"short option -h shows basic options only, use long option --help to show all options"</span> << std::endl;</div>
-<div class="line"><a name="l00188"></a><span class="lineno">  188</span>     exit(0);<span class="comment">//help was invoked, stop processing</span></div>
-<div class="line"><a name="l00189"></a><span class="lineno">  189</span>   }</div>
-<div class="line"><a name="l00190"></a><span class="lineno">  190</span> </div>
-<div class="line"><a name="l00191"></a><span class="lineno">  191</span>   std::map<std::string, rule::RULE_TYPE> ruleMap;</div>
-<div class="line"><a name="l00192"></a><span class="lineno">  192</span>   <span class="comment">//initialize ruleMap</span></div>
-<div class="line"><a name="l00193"></a><span class="lineno">  193</span>   ruleMap[<span class="stringliteral">"point"</span>]=rule::point;</div>
-<div class="line"><a name="l00194"></a><span class="lineno">  194</span>   ruleMap[<span class="stringliteral">"centroid"</span>]=rule::centroid;</div>
-<div class="line"><a name="l00195"></a><span class="lineno">  195</span>   ruleMap[<span class="stringliteral">"mean"</span>]=rule::mean;</div>
-<div class="line"><a name="l00196"></a><span class="lineno">  196</span>   ruleMap[<span class="stringliteral">"stdev"</span>]=rule::stdev;</div>
-<div class="line"><a name="l00197"></a><span class="lineno">  197</span>   ruleMap[<span class="stringliteral">"median"</span>]=rule::median;</div>
-<div class="line"><a name="l00198"></a><span class="lineno">  198</span>   ruleMap[<span class="stringliteral">"proportion"</span>]=rule::proportion;</div>
-<div class="line"><a name="l00199"></a><span class="lineno">  199</span>   ruleMap[<span class="stringliteral">"min"</span>]=rule::min;</div>
-<div class="line"><a name="l00200"></a><span class="lineno">  200</span>   ruleMap[<span class="stringliteral">"max"</span>]=rule::max;</div>
-<div class="line"><a name="l00201"></a><span class="lineno">  201</span>   ruleMap[<span class="stringliteral">"custom"</span>]=rule::custom;</div>
-<div class="line"><a name="l00202"></a><span class="lineno">  202</span>   ruleMap[<span class="stringliteral">"mode"</span>]=rule::mode;</div>
-<div class="line"><a name="l00203"></a><span class="lineno">  203</span>   ruleMap[<span class="stringliteral">"sum"</span>]=rule::sum;</div>
-<div class="line"><a name="l00204"></a><span class="lineno">  204</span>   ruleMap[<span class="stringliteral">"percentile"</span>]=rule::percentile;</div>
-<div class="line"><a name="l00205"></a><span class="lineno">  205</span> </div>
-<div class="line"><a name="l00206"></a><span class="lineno">  206</span>   <span class="keywordflow">if</span>(srcnodata_opt.size()){</div>
-<div class="line"><a name="l00207"></a><span class="lineno">  207</span>     <span class="keywordflow">while</span>(srcnodata_opt.size()<bndnodata_opt.size())</div>
-<div class="line"><a name="l00208"></a><span class="lineno">  208</span>       srcnodata_opt.push_back(srcnodata_opt[0]);</div>
-<div class="line"><a name="l00209"></a><span class="lineno">  209</span>     <span class="keywordflow">while</span>(bndnodata_opt.size()<srcnodata_opt.size())</div>
-<div class="line"><a name="l00210"></a><span class="lineno">  210</span>       bndnodata_opt.push_back(bndnodata_opt[0]);</div>
-<div class="line"><a name="l00211"></a><span class="lineno">  211</span>   }</div>
-<div class="line"><a name="l00212"></a><span class="lineno">  212</span> </div>
-<div class="line"><a name="l00213"></a><span class="lineno">  213</span>   <span class="keywordflow">if</span>(verbose_opt[0])</div>
-<div class="line"><a name="l00214"></a><span class="lineno">  214</span>     std::cout << class_opt << std::endl;</div>
-<div class="line"><a name="l00215"></a><span class="lineno">  215</span>   <a class="code" href="classstatfactory_1_1StatFactory.html">statfactory::StatFactory</a> stat;</div>
-<div class="line"><a name="l00216"></a><span class="lineno">  216</span>   stat.setNoDataValues(srcnodata_opt);</div>
-<div class="line"><a name="l00217"></a><span class="lineno">  217</span>   <a class="code" href="classVector2d.html">Vector2d<unsigned int></a> posdata;</div>
-<div class="line"><a name="l00218"></a><span class="lineno">  218</span>   <span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> nsample=0;</div>
-<div class="line"><a name="l00219"></a><span class="lineno">  219</span>   <span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> ntotalvalid=0;</div>
-<div class="line"><a name="l00220"></a><span class="lineno">  220</span>   <span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> ntotalinvalid=0;</div>
-<div class="line"><a name="l00221"></a><span class="lineno">  221</span>   vector<unsigned long int> nvalid(class_opt.size());</div>
-<div class="line"><a name="l00222"></a><span class="lineno">  222</span>   vector<unsigned long int> ninvalid(class_opt.size());</div>
-<div class="line"><a name="l00223"></a><span class="lineno">  223</span>   <span class="keywordflow">for</span>(<span class="keywordtype">int</span> it=0;it<nvalid.size();++it){</div>
-<div class="line"><a name="l00224"></a><span class="lineno">  224</span>     nvalid[it]=0;</div>
-<div class="line"><a name="l00225"></a><span class="lineno">  225</span>     ninvalid[it]=0;</div>
-<div class="line"><a name="l00226"></a><span class="lineno">  226</span>   }</div>
-<div class="line"><a name="l00227"></a><span class="lineno">  227</span> </div>
-<div class="line"><a name="l00228"></a><span class="lineno">  228</span>   <a class="code" href="classImgReaderGdal.html">ImgReaderGdal</a> imgReader;</div>
-<div class="line"><a name="l00229"></a><span class="lineno">  229</span>   <span class="keywordflow">if</span>(image_opt.empty()){</div>
-<div class="line"><a name="l00230"></a><span class="lineno">  230</span>     std::cerr << <span class="stringliteral">"No image dataset provided (use option -i). Use --help for help information"</span>;</div>
-<div class="line"><a name="l00231"></a><span class="lineno">  231</span>       exit(0);</div>
-<div class="line"><a name="l00232"></a><span class="lineno">  232</span>   }</div>
-<div class="line"><a name="l00233"></a><span class="lineno">  233</span>   <span class="keywordflow">if</span>(output_opt.empty()){</div>
-<div class="line"><a name="l00234"></a><span class="lineno">  234</span>     std::cerr << <span class="stringliteral">"No output dataset provided (use option -o). Use --help for help information"</span>;</div>
-<div class="line"><a name="l00235"></a><span class="lineno">  235</span>       exit(0);</div>
-<div class="line"><a name="l00236"></a><span class="lineno">  236</span>   }</div>
-<div class="line"><a name="l00237"></a><span class="lineno">  237</span>   <span class="keywordflow">try</span>{</div>
-<div class="line"><a name="l00238"></a><span class="lineno">  238</span>     imgReader.open(image_opt[0]);</div>
+<div class="line"><a name="l00122"></a><span class="lineno">  122</span> <span class="keyword">namespace </span>rule{</div>
+<div class="line"><a name="l00123"></a><span class="lineno">  123</span>   <span class="keyword">enum</span> RULE_TYPE {point=0, mean=1, proportion=2, custom=3, min=4, max=5, mode=6, centroid=7, sum=8, median=9, stdev=10, percentile=11, count=12};</div>
+<div class="line"><a name="l00124"></a><span class="lineno">  124</span> }</div>
+<div class="line"><a name="l00125"></a><span class="lineno">  125</span> </div>
+<div class="line"><a name="l00126"></a><span class="lineno">  126</span> <span class="keyword">using namespace </span>std;</div>
+<div class="line"><a name="l00127"></a><span class="lineno">  127</span> </div>
+<div class="line"><a name="l00128"></a><span class="lineno">  128</span> <span class="keywordtype">int</span> main(<span class="keywordtype">int</span> argc, <span class="keywordtype">char</span> *argv[])</div>
+<div class="line"><a name="l00129"></a><span class="lineno">  129</span> {</div>
+<div class="line"><a name="l00130"></a><span class="lineno">  130</span>   <a class="code" href="classOptionpk.html">Optionpk<string></a> image_opt(<span class="stringliteral">"i"</span>, <span class="stringliteral">"input"</span>, <span class="stringliteral">"Raster input dataset containing band information"</span>);</div>
+<div class="line"><a name="l00131"></a><span class="lineno">  131</span>   <a class="code" href="classOptionpk.html">Optionpk<string></a> sample_opt(<span class="stringliteral">"s"</span>, <span class="stringliteral">"sample"</span>, <span class="stringliteral">"OGR vector dataset with features to be extracted from input data. Output will contain features with input band information included. Sample image can also be GDAL raster dataset."</span>);</div>
+<div class="line"><a name="l00132"></a><span class="lineno">  132</span>   <a class="code" href="classOptionpk.html">Optionpk<string></a> layer_opt(<span class="stringliteral">"ln"</span>, <span class="stringliteral">"ln"</span>, <span class="stringliteral">"Layer name(s) in sample (leave empty to select all)"</span>);</div>
+<div class="line"><a name="l00133"></a><span class="lineno">  133</span>   <a class="code" href="classOptionpk.html">Optionpk<unsigned int></a> random_opt(<span class="stringliteral">"rand"</span>, <span class="stringliteral">"random"</span>, <span class="stringliteral">"Create simple random sample of points. Provide number of points to generate"</span>);</div>
+<div class="line"><a name="l00134"></a><span class="lineno">  134</span>   <a class="code" href="classOptionpk.html">Optionpk<double></a> grid_opt(<span class="stringliteral">"grid"</span>, <span class="stringliteral">"grid"</span>, <span class="stringliteral">"Create systematic grid of points. Provide cell grid size (in projected units, e.g,. m)"</span>);</div>
+<div class="line"><a name="l00135"></a><span class="lineno">  135</span>   <a class="code" href="classOptionpk.html">Optionpk<string></a> output_opt(<span class="stringliteral">"o"</span>, <span class="stringliteral">"output"</span>, <span class="stringliteral">"Output sample dataset"</span>);</div>
+<div class="line"><a name="l00136"></a><span class="lineno">  136</span>   <a class="code" href="classOptionpk.html">Optionpk<int></a> class_opt(<span class="stringliteral">"c"</span>, <span class="stringliteral">"class"</span>, <span class="stringliteral">"Class(es) to extract from input sample image. Leave empty to extract all valid data pixels from sample dataset. Make sure to set classes if rule is set to mode, proportion or count"</span>);</div>
+<div class="line"><a name="l00137"></a><span class="lineno">  137</span>   <a class="code" href="classOptionpk.html">Optionpk<float></a> threshold_opt(<span class="stringliteral">"t"</span>, <span class="stringliteral">"threshold"</span>, <span class="stringliteral">"Probability threshold for selecting samples (randomly). Provide probability in percentage (>0) or absolute (<0). Use a single threshold for vector sample datasets. If using raster la [...]
+<div class="line"><a name="l00138"></a><span class="lineno">  138</span>   <a class="code" href="classOptionpk.html">Optionpk<double></a> percentile_opt(<span class="stringliteral">"perc"</span>,<span class="stringliteral">"perc"</span>,<span class="stringliteral">"Percentile value used for rule percentile"</span>,95);</div>
+<div class="line"><a name="l00139"></a><span class="lineno">  139</span>   <a class="code" href="classOptionpk.html">Optionpk<string></a> ogrformat_opt(<span class="stringliteral">"f"</span>, <span class="stringliteral">"f"</span>, <span class="stringliteral">"Output sample dataset format"</span>,<span class="stringliteral">"SQLite"</span>);</div>
+<div class="line"><a name="l00140"></a><span class="lineno">  140</span>   <a class="code" href="classOptionpk.html">Optionpk<string></a> ftype_opt(<span class="stringliteral">"ft"</span>, <span class="stringliteral">"ftype"</span>, <span class="stringliteral">"Field type (only Real or Integer)"</span>, <span class="stringliteral">"Real"</span>);</div>
+<div class="line"><a name="l00141"></a><span class="lineno">  141</span>   <a class="code" href="classOptionpk.html">Optionpk<string></a> ltype_opt(<span class="stringliteral">"lt"</span>, <span class="stringliteral">"ltype"</span>, <span class="stringliteral">"Label type: In16 or String"</span>, <span class="stringliteral">"Integer"</span>);</div>
+<div class="line"><a name="l00142"></a><span class="lineno">  142</span>   <a class="code" href="classOptionpk.html">Optionpk<bool></a> polygon_opt(<span class="stringliteral">"polygon"</span>, <span class="stringliteral">"polygon"</span>, <span class="stringliteral">"Create OGRPolygon as geometry instead of OGRPoint."</span>, <span class="keyword">false</span>);</div>
+<div class="line"><a name="l00143"></a><span class="lineno">  143</span>   <a class="code" href="classOptionpk.html">Optionpk<int></a> band_opt(<span class="stringliteral">"b"</span>, <span class="stringliteral">"band"</span>, <span class="stringliteral">"Band index(es) to extract (0 based). Leave empty to use all bands"</span>);</div>
+<div class="line"><a name="l00144"></a><span class="lineno">  144</span>   <a class="code" href="classOptionpk.html">Optionpk<unsigned short></a> bstart_opt(<span class="stringliteral">"sband"</span>, <span class="stringliteral">"startband"</span>, <span class="stringliteral">"Start band sequence number"</span>); </div>
+<div class="line"><a name="l00145"></a><span class="lineno">  145</span>   <a class="code" href="classOptionpk.html">Optionpk<unsigned short></a> bend_opt(<span class="stringliteral">"eband"</span>, <span class="stringliteral">"endband"</span>, <span class="stringliteral">"End band sequence number"</span>); </div>
+<div class="line"><a name="l00146"></a><span class="lineno">  146</span>   <a class="code" href="classOptionpk.html">Optionpk<string></a> rule_opt(<span class="stringliteral">"r"</span>, <span class="stringliteral">"rule"</span>, <span class="stringliteral">"Rule how to report image information per feature (only for vector sample). point (value at each point or at centroid if polygon), centroid, mean, stdev, median, proportion, count, min, max, mode, s [...]
+<div class="line"><a name="l00147"></a><span class="lineno">  147</span>   <a class="code" href="classOptionpk.html">Optionpk<double></a> srcnodata_opt(<span class="stringliteral">"srcnodata"</span>, <span class="stringliteral">"srcnodata"</span>, <span class="stringliteral">"Invalid value(s) for input image"</span>);</div>
+<div class="line"><a name="l00148"></a><span class="lineno">  148</span>   <a class="code" href="classOptionpk.html">Optionpk<int></a> bndnodata_opt(<span class="stringliteral">"bndnodata"</span>, <span class="stringliteral">"bndnodata"</span>, <span class="stringliteral">"Band(s) in input image to check if pixel is valid (used for srcnodata)"</span>, 0);</div>
+<div class="line"><a name="l00149"></a><span class="lineno">  149</span>   <a class="code" href="classOptionpk.html">Optionpk<float></a> polythreshold_opt(<span class="stringliteral">"tp"</span>, <span class="stringliteral">"thresholdPolygon"</span>, <span class="stringliteral">"(absolute) threshold for selecting samples in each polygon"</span>);</div>
+<div class="line"><a name="l00150"></a><span class="lineno">  150</span>   <a class="code" href="classOptionpk.html">Optionpk<string></a> test_opt(<span class="stringliteral">"test"</span>, <span class="stringliteral">"test"</span>, <span class="stringliteral">"Test sample dataset (use this option in combination with threshold<100 to create a training (output) and test set"</span>);</div>
+<div class="line"><a name="l00151"></a><span class="lineno">  151</span>   <a class="code" href="classOptionpk.html">Optionpk<string></a> fieldname_opt(<span class="stringliteral">"bn"</span>, <span class="stringliteral">"bname"</span>, <span class="stringliteral">"For single band input data, this extra attribute name will correspond to the raster values. For multi-band input data, multiple attributes with this prefix will be added (e.g. b0, b1, b2, et [...]
+<div class="line"><a name="l00152"></a><span class="lineno">  152</span>   <a class="code" href="classOptionpk.html">Optionpk<string></a> label_opt(<span class="stringliteral">"cn"</span>, <span class="stringliteral">"cname"</span>, <span class="stringliteral">"Name of the class label in the output vector dataset"</span>, <span class="stringliteral">"label"</span>);</div>
+<div class="line"><a name="l00153"></a><span class="lineno">  153</span>   <a class="code" href="classOptionpk.html">Optionpk<short></a> geo_opt(<span class="stringliteral">"geo"</span>, <span class="stringliteral">"geo"</span>, <span class="stringliteral">"Use geo coordinates (set to 0 to use image coordinates)"</span>, 1);</div>
+<div class="line"><a name="l00154"></a><span class="lineno">  154</span>   <a class="code" href="classOptionpk.html">Optionpk<short></a> down_opt(<span class="stringliteral">"down"</span>, <span class="stringliteral">"down"</span>, <span class="stringliteral">"Down sampling factor (for raster sample datasets only). Can be used to create grid points"</span>, 1);</div>
+<div class="line"><a name="l00155"></a><span class="lineno">  155</span>   <a class="code" href="classOptionpk.html">Optionpk<short></a> buffer_opt(<span class="stringliteral">"buf"</span>, <span class="stringliteral">"buffer"</span>, <span class="stringliteral">"Buffer for calculating statistics for point features "</span>);</div>
+<div class="line"><a name="l00156"></a><span class="lineno">  156</span>   <a class="code" href="classOptionpk.html">Optionpk<bool></a> disc_opt(<span class="stringliteral">"circ"</span>, <span class="stringliteral">"circular"</span>, <span class="stringliteral">"Use a circular disc kernel buffer (for vector point sample datasets only, use in combination with buffer option)"</span>, <span class="keyword">false</span>);</div>
+<div class="line"><a name="l00157"></a><span class="lineno">  157</span>   <a class="code" href="classOptionpk.html">Optionpk<short></a> verbose_opt(<span class="stringliteral">"v"</span>, <span class="stringliteral">"verbose"</span>, <span class="stringliteral">"Verbose mode if > 0"</span>, 0,2);</div>
+<div class="line"><a name="l00158"></a><span class="lineno">  158</span> </div>
+<div class="line"><a name="l00159"></a><span class="lineno">  159</span>   bstart_opt.setHide(1);</div>
+<div class="line"><a name="l00160"></a><span class="lineno">  160</span>   bend_opt.setHide(1);</div>
+<div class="line"><a name="l00161"></a><span class="lineno">  161</span>   bndnodata_opt.setHide(1);</div>
+<div class="line"><a name="l00162"></a><span class="lineno">  162</span>   srcnodata_opt.setHide(1);</div>
+<div class="line"><a name="l00163"></a><span class="lineno">  163</span>   polythreshold_opt.setHide(1);</div>
+<div class="line"><a name="l00164"></a><span class="lineno">  164</span>   percentile_opt.setHide(1);</div>
+<div class="line"><a name="l00165"></a><span class="lineno">  165</span>   test_opt.setHide(1);</div>
+<div class="line"><a name="l00166"></a><span class="lineno">  166</span>   fieldname_opt.setHide(1);</div>
+<div class="line"><a name="l00167"></a><span class="lineno">  167</span>   label_opt.setHide(1);</div>
+<div class="line"><a name="l00168"></a><span class="lineno">  168</span>   geo_opt.setHide(1);</div>
+<div class="line"><a name="l00169"></a><span class="lineno">  169</span>   down_opt.setHide(1);</div>
+<div class="line"><a name="l00170"></a><span class="lineno">  170</span>   buffer_opt.setHide(1);</div>
+<div class="line"><a name="l00171"></a><span class="lineno">  171</span>   disc_opt.setHide(1);</div>
+<div class="line"><a name="l00172"></a><span class="lineno">  172</span> </div>
+<div class="line"><a name="l00173"></a><span class="lineno">  173</span>   <span class="keywordtype">bool</span> doProcess;<span class="comment">//stop process when program was invoked with help option (-h --help)</span></div>
+<div class="line"><a name="l00174"></a><span class="lineno">  174</span>   <span class="keywordflow">try</span>{</div>
+<div class="line"><a name="l00175"></a><span class="lineno">  175</span>     doProcess=image_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00176"></a><span class="lineno">  176</span>     sample_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00177"></a><span class="lineno">  177</span>     layer_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00178"></a><span class="lineno">  178</span>     random_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00179"></a><span class="lineno">  179</span>     grid_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00180"></a><span class="lineno">  180</span>     output_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00181"></a><span class="lineno">  181</span>     class_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00182"></a><span class="lineno">  182</span>     threshold_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00183"></a><span class="lineno">  183</span>     percentile_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00184"></a><span class="lineno">  184</span>     ogrformat_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00185"></a><span class="lineno">  185</span>     ftype_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00186"></a><span class="lineno">  186</span>     ltype_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00187"></a><span class="lineno">  187</span>     polygon_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00188"></a><span class="lineno">  188</span>     band_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00189"></a><span class="lineno">  189</span>     bstart_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00190"></a><span class="lineno">  190</span>     bend_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00191"></a><span class="lineno">  191</span>     rule_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00192"></a><span class="lineno">  192</span>     bndnodata_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00193"></a><span class="lineno">  193</span>     srcnodata_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00194"></a><span class="lineno">  194</span>     polythreshold_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00195"></a><span class="lineno">  195</span>     test_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00196"></a><span class="lineno">  196</span>     fieldname_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00197"></a><span class="lineno">  197</span>     label_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00198"></a><span class="lineno">  198</span>     geo_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00199"></a><span class="lineno">  199</span>     down_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00200"></a><span class="lineno">  200</span>     buffer_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00201"></a><span class="lineno">  201</span>     disc_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00202"></a><span class="lineno">  202</span>     <span class="comment">// rbox_opt.retrieveOption(argc,argv);</span></div>
+<div class="line"><a name="l00203"></a><span class="lineno">  203</span>     <span class="comment">// cbox_opt.retrieveOption(argc,argv);</span></div>
+<div class="line"><a name="l00204"></a><span class="lineno">  204</span>     verbose_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00205"></a><span class="lineno">  205</span>   }</div>
+<div class="line"><a name="l00206"></a><span class="lineno">  206</span>   <span class="keywordflow">catch</span>(<span class="keywordtype">string</span> predefinedString){</div>
+<div class="line"><a name="l00207"></a><span class="lineno">  207</span>     std::cout << predefinedString << std::endl;</div>
+<div class="line"><a name="l00208"></a><span class="lineno">  208</span>     exit(0);</div>
+<div class="line"><a name="l00209"></a><span class="lineno">  209</span>   }</div>
+<div class="line"><a name="l00210"></a><span class="lineno">  210</span>   <span class="keywordflow">if</span>(!doProcess){</div>
+<div class="line"><a name="l00211"></a><span class="lineno">  211</span>     cout << endl;</div>
+<div class="line"><a name="l00212"></a><span class="lineno">  212</span>     cout << <span class="stringliteral">"Usage: pkextract -i input [-s sample | -rand number | -grid size] -o output"</span> << endl;</div>
+<div class="line"><a name="l00213"></a><span class="lineno">  213</span>     cout << endl;</div>
+<div class="line"><a name="l00214"></a><span class="lineno">  214</span>     std::cout << <span class="stringliteral">"short option -h shows basic options only, use long option --help to show all options"</span> << std::endl;</div>
+<div class="line"><a name="l00215"></a><span class="lineno">  215</span>     exit(0);<span class="comment">//help was invoked, stop processing</span></div>
+<div class="line"><a name="l00216"></a><span class="lineno">  216</span>   }</div>
+<div class="line"><a name="l00217"></a><span class="lineno">  217</span> </div>
+<div class="line"><a name="l00218"></a><span class="lineno">  218</span>   std::map<std::string, rule::RULE_TYPE> ruleMap;</div>
+<div class="line"><a name="l00219"></a><span class="lineno">  219</span>   <span class="comment">//initialize ruleMap</span></div>
+<div class="line"><a name="l00220"></a><span class="lineno">  220</span>   ruleMap[<span class="stringliteral">"point"</span>]=rule::point;</div>
+<div class="line"><a name="l00221"></a><span class="lineno">  221</span>   ruleMap[<span class="stringliteral">"centroid"</span>]=rule::centroid;</div>
+<div class="line"><a name="l00222"></a><span class="lineno">  222</span>   ruleMap[<span class="stringliteral">"mean"</span>]=rule::mean;</div>
+<div class="line"><a name="l00223"></a><span class="lineno">  223</span>   ruleMap[<span class="stringliteral">"stdev"</span>]=rule::stdev;</div>
+<div class="line"><a name="l00224"></a><span class="lineno">  224</span>   ruleMap[<span class="stringliteral">"median"</span>]=rule::median;</div>
+<div class="line"><a name="l00225"></a><span class="lineno">  225</span>   ruleMap[<span class="stringliteral">"proportion"</span>]=rule::proportion;</div>
+<div class="line"><a name="l00226"></a><span class="lineno">  226</span>   ruleMap[<span class="stringliteral">"count"</span>]=rule::count;</div>
+<div class="line"><a name="l00227"></a><span class="lineno">  227</span>   ruleMap[<span class="stringliteral">"min"</span>]=rule::min;</div>
+<div class="line"><a name="l00228"></a><span class="lineno">  228</span>   ruleMap[<span class="stringliteral">"max"</span>]=rule::max;</div>
+<div class="line"><a name="l00229"></a><span class="lineno">  229</span>   ruleMap[<span class="stringliteral">"custom"</span>]=rule::custom;</div>
+<div class="line"><a name="l00230"></a><span class="lineno">  230</span>   ruleMap[<span class="stringliteral">"mode"</span>]=rule::mode;</div>
+<div class="line"><a name="l00231"></a><span class="lineno">  231</span>   ruleMap[<span class="stringliteral">"sum"</span>]=rule::sum;</div>
+<div class="line"><a name="l00232"></a><span class="lineno">  232</span>   ruleMap[<span class="stringliteral">"percentile"</span>]=rule::percentile;</div>
+<div class="line"><a name="l00233"></a><span class="lineno">  233</span> </div>
+<div class="line"><a name="l00234"></a><span class="lineno">  234</span>   <span class="keywordflow">if</span>(srcnodata_opt.size()){</div>
+<div class="line"><a name="l00235"></a><span class="lineno">  235</span>     <span class="keywordflow">while</span>(srcnodata_opt.size()<bndnodata_opt.size())</div>
+<div class="line"><a name="l00236"></a><span class="lineno">  236</span>       srcnodata_opt.push_back(srcnodata_opt[0]);</div>
+<div class="line"><a name="l00237"></a><span class="lineno">  237</span>     <span class="keywordflow">while</span>(bndnodata_opt.size()<srcnodata_opt.size())</div>
+<div class="line"><a name="l00238"></a><span class="lineno">  238</span>       bndnodata_opt.push_back(bndnodata_opt[0]);</div>
 <div class="line"><a name="l00239"></a><span class="lineno">  239</span>   }</div>
-<div class="line"><a name="l00240"></a><span class="lineno">  240</span>   <span class="keywordflow">catch</span>(std::string errorstring){</div>
-<div class="line"><a name="l00241"></a><span class="lineno">  241</span>     std::cout << errorstring << std::endl;</div>
-<div class="line"><a name="l00242"></a><span class="lineno">  242</span>     exit(0);</div>
-<div class="line"><a name="l00243"></a><span class="lineno">  243</span>   }</div>
-<div class="line"><a name="l00244"></a><span class="lineno">  244</span>   </div>
-<div class="line"><a name="l00245"></a><span class="lineno">  245</span>   <span class="keywordtype">int</span> nband=(band_opt.size()) ? band_opt.size() : imgReader.nrOfBand();</div>
-<div class="line"><a name="l00246"></a><span class="lineno">  246</span> </div>
-<div class="line"><a name="l00247"></a><span class="lineno">  247</span>   <span class="keywordflow">if</span>(fieldname_opt.size()<nband){</div>
-<div class="line"><a name="l00248"></a><span class="lineno">  248</span>     std::string bandString=fieldname_opt[0];</div>
-<div class="line"><a name="l00249"></a><span class="lineno">  249</span>     fieldname_opt.clear();</div>
-<div class="line"><a name="l00250"></a><span class="lineno">  250</span>     fieldname_opt.resize(nband);</div>
-<div class="line"><a name="l00251"></a><span class="lineno">  251</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iband=0;iband<nband;++iband){</div>
-<div class="line"><a name="l00252"></a><span class="lineno">  252</span>       <span class="keywordtype">int</span> theBand=(band_opt.size()) ? band_opt[iband] : iband;</div>
-<div class="line"><a name="l00253"></a><span class="lineno">  253</span>       ostringstream fs;</div>
-<div class="line"><a name="l00254"></a><span class="lineno">  254</span>       fs << bandString << theBand;</div>
-<div class="line"><a name="l00255"></a><span class="lineno">  255</span>       fieldname_opt[iband]=fs.str();</div>
-<div class="line"><a name="l00256"></a><span class="lineno">  256</span>     }</div>
-<div class="line"><a name="l00257"></a><span class="lineno">  257</span>   }</div>
-<div class="line"><a name="l00258"></a><span class="lineno">  258</span> </div>
-<div class="line"><a name="l00259"></a><span class="lineno">  259</span>   <span class="keywordflow">if</span>(verbose_opt[0])</div>
-<div class="line"><a name="l00260"></a><span class="lineno">  260</span>     std::cout << fieldname_opt << std::endl;</div>
-<div class="line"><a name="l00261"></a><span class="lineno">  261</span>   </div>
-<div class="line"><a name="l00262"></a><span class="lineno">  262</span>   <span class="keywordflow">if</span>(verbose_opt[0]>1)</div>
-<div class="line"><a name="l00263"></a><span class="lineno">  263</span>     std::cout << <span class="stringliteral">"Number of bands in input image: "</span> << imgReader.nrOfBand() << std::endl;</div>
-<div class="line"><a name="l00264"></a><span class="lineno">  264</span> </div>
-<div class="line"><a name="l00265"></a><span class="lineno">  265</span>   OGRFieldType fieldType;</div>
-<div class="line"><a name="l00266"></a><span class="lineno">  266</span>   OGRFieldType labelType;</div>
-<div class="line"><a name="l00267"></a><span class="lineno">  267</span>   <span class="keywordtype">int</span> ogr_typecount=11;<span class="comment">//hard coded for now!</span></div>
-<div class="line"><a name="l00268"></a><span class="lineno">  268</span>   <span class="keywordflow">if</span>(verbose_opt[0]>1)</div>
-<div class="line"><a name="l00269"></a><span class="lineno">  269</span>     std::cout << <span class="stringliteral">"field and label types can be: "</span>;</div>
-<div class="line"><a name="l00270"></a><span class="lineno">  270</span>   <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iType = 0; iType < ogr_typecount; ++iType){</div>
-<div class="line"><a name="l00271"></a><span class="lineno">  271</span>     <span class="keywordflow">if</span>(verbose_opt[0]>1)</div>
-<div class="line"><a name="l00272"></a><span class="lineno">  272</span>       std::cout << <span class="stringliteral">" "</span> << OGRFieldDefn::GetFieldTypeName((OGRFieldType)iType);</div>
-<div class="line"><a name="l00273"></a><span class="lineno">  273</span>     <span class="keywordflow">if</span>( OGRFieldDefn::GetFieldTypeName((OGRFieldType)iType) != NULL</div>
-<div class="line"><a name="l00274"></a><span class="lineno">  274</span>         && EQUAL(OGRFieldDefn::GetFieldTypeName((OGRFieldType)iType),</div>
-<div class="line"><a name="l00275"></a><span class="lineno">  275</span>                  ftype_opt[0].c_str()))</div>
-<div class="line"><a name="l00276"></a><span class="lineno">  276</span>       fieldType=(OGRFieldType) iType;</div>
-<div class="line"><a name="l00277"></a><span class="lineno">  277</span>     <span class="keywordflow">if</span>( OGRFieldDefn::GetFieldTypeName((OGRFieldType)iType) != NULL</div>
-<div class="line"><a name="l00278"></a><span class="lineno">  278</span>         && EQUAL(OGRFieldDefn::GetFieldTypeName((OGRFieldType)iType),</div>
-<div class="line"><a name="l00279"></a><span class="lineno">  279</span>                  ltype_opt[0].c_str()))</div>
-<div class="line"><a name="l00280"></a><span class="lineno">  280</span>       labelType=(OGRFieldType) iType;</div>
-<div class="line"><a name="l00281"></a><span class="lineno">  281</span>   }</div>
-<div class="line"><a name="l00282"></a><span class="lineno">  282</span>   <span class="keywordflow">switch</span>( fieldType ){</div>
-<div class="line"><a name="l00283"></a><span class="lineno">  283</span>   <span class="keywordflow">case</span> OFTInteger:</div>
-<div class="line"><a name="l00284"></a><span class="lineno">  284</span>   <span class="keywordflow">case</span> OFTReal:</div>
-<div class="line"><a name="l00285"></a><span class="lineno">  285</span>   <span class="keywordflow">case</span> OFTRealList:</div>
-<div class="line"><a name="l00286"></a><span class="lineno">  286</span>   <span class="keywordflow">case</span> OFTString:</div>
-<div class="line"><a name="l00287"></a><span class="lineno">  287</span>     <span class="keywordflow">if</span>(verbose_opt[0]>1)</div>
-<div class="line"><a name="l00288"></a><span class="lineno">  288</span>       std::cout << std::endl << <span class="stringliteral">"field type is: "</span> << OGRFieldDefn::GetFieldTypeName(fieldType) << std::endl;</div>
-<div class="line"><a name="l00289"></a><span class="lineno">  289</span>     <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l00290"></a><span class="lineno">  290</span>   <span class="keywordflow">default</span>:</div>
-<div class="line"><a name="l00291"></a><span class="lineno">  291</span>     cerr << <span class="stringliteral">"field type "</span> << OGRFieldDefn::GetFieldTypeName(fieldType) << <span class="stringliteral">" not supported"</span> << std::endl;</div>
-<div class="line"><a name="l00292"></a><span class="lineno">  292</span>     exit(0);</div>
-<div class="line"><a name="l00293"></a><span class="lineno">  293</span>     <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l00240"></a><span class="lineno">  240</span> </div>
+<div class="line"><a name="l00241"></a><span class="lineno">  241</span>   <span class="keywordflow">if</span>(verbose_opt[0])</div>
+<div class="line"><a name="l00242"></a><span class="lineno">  242</span>     std::cout << class_opt << std::endl;</div>
+<div class="line"><a name="l00243"></a><span class="lineno">  243</span>   <a class="code" href="classstatfactory_1_1StatFactory.html">statfactory::StatFactory</a> stat;</div>
+<div class="line"><a name="l00244"></a><span class="lineno">  244</span>   stat.setNoDataValues(srcnodata_opt);</div>
+<div class="line"><a name="l00245"></a><span class="lineno">  245</span>   <a class="code" href="classVector2d.html">Vector2d<unsigned int></a> posdata;</div>
+<div class="line"><a name="l00246"></a><span class="lineno">  246</span>   <span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> nsample=0;</div>
+<div class="line"><a name="l00247"></a><span class="lineno">  247</span>   <span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> ntotalvalid=0;</div>
+<div class="line"><a name="l00248"></a><span class="lineno">  248</span>   <span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> ntotalinvalid=0;</div>
+<div class="line"><a name="l00249"></a><span class="lineno">  249</span>   vector<unsigned long int> nvalid(class_opt.size());</div>
+<div class="line"><a name="l00250"></a><span class="lineno">  250</span>   vector<unsigned long int> ninvalid(class_opt.size());</div>
+<div class="line"><a name="l00251"></a><span class="lineno">  251</span>   <span class="keywordflow">for</span>(<span class="keywordtype">int</span> it=0;it<nvalid.size();++it){</div>
+<div class="line"><a name="l00252"></a><span class="lineno">  252</span>     nvalid[it]=0;</div>
+<div class="line"><a name="l00253"></a><span class="lineno">  253</span>     ninvalid[it]=0;</div>
+<div class="line"><a name="l00254"></a><span class="lineno">  254</span>   }</div>
+<div class="line"><a name="l00255"></a><span class="lineno">  255</span> </div>
+<div class="line"><a name="l00256"></a><span class="lineno">  256</span>   <a class="code" href="classImgReaderGdal.html">ImgReaderGdal</a> imgReader;</div>
+<div class="line"><a name="l00257"></a><span class="lineno">  257</span>   <span class="keywordflow">if</span>(image_opt.empty()){</div>
+<div class="line"><a name="l00258"></a><span class="lineno">  258</span>     std::cerr << <span class="stringliteral">"No image dataset provided (use option -i). Use --help for help information"</span>;</div>
+<div class="line"><a name="l00259"></a><span class="lineno">  259</span>       exit(0);</div>
+<div class="line"><a name="l00260"></a><span class="lineno">  260</span>   }</div>
+<div class="line"><a name="l00261"></a><span class="lineno">  261</span>   <span class="keywordflow">if</span>(output_opt.empty()){</div>
+<div class="line"><a name="l00262"></a><span class="lineno">  262</span>     std::cerr << <span class="stringliteral">"No output dataset provided (use option -o). Use --help for help information"</span>;</div>
+<div class="line"><a name="l00263"></a><span class="lineno">  263</span>       exit(0);</div>
+<div class="line"><a name="l00264"></a><span class="lineno">  264</span>   }</div>
+<div class="line"><a name="l00265"></a><span class="lineno">  265</span>   <span class="keywordflow">try</span>{</div>
+<div class="line"><a name="l00266"></a><span class="lineno">  266</span>     imgReader.open(image_opt[0]);</div>
+<div class="line"><a name="l00267"></a><span class="lineno">  267</span>   }</div>
+<div class="line"><a name="l00268"></a><span class="lineno">  268</span>   <span class="keywordflow">catch</span>(std::string errorstring){</div>
+<div class="line"><a name="l00269"></a><span class="lineno">  269</span>     std::cout << errorstring << std::endl;</div>
+<div class="line"><a name="l00270"></a><span class="lineno">  270</span>     exit(0);</div>
+<div class="line"><a name="l00271"></a><span class="lineno">  271</span>   }</div>
+<div class="line"><a name="l00272"></a><span class="lineno">  272</span> </div>
+<div class="line"><a name="l00273"></a><span class="lineno">  273</span>   <span class="comment">//convert start and end band options to vector of band indexes</span></div>
+<div class="line"><a name="l00274"></a><span class="lineno">  274</span>   <span class="keywordflow">try</span>{</div>
+<div class="line"><a name="l00275"></a><span class="lineno">  275</span>     <span class="keywordflow">if</span>(bstart_opt.size()){</div>
+<div class="line"><a name="l00276"></a><span class="lineno">  276</span>       <span class="keywordflow">if</span>(bend_opt.size()!=bstart_opt.size()){</div>
+<div class="line"><a name="l00277"></a><span class="lineno">  277</span>     <span class="keywordtype">string</span> errorstring=<span class="stringliteral">"Error: options for start and end band indexes must be provided as pairs, missing end band"</span>;</div>
+<div class="line"><a name="l00278"></a><span class="lineno">  278</span>     <span class="keywordflow">throw</span>(errorstring);</div>
+<div class="line"><a name="l00279"></a><span class="lineno">  279</span>       }</div>
+<div class="line"><a name="l00280"></a><span class="lineno">  280</span>       band_opt.clear();</div>
+<div class="line"><a name="l00281"></a><span class="lineno">  281</span>       <span class="keywordflow">for</span>(<span class="keywordtype">int</span> ipair=0;ipair<bstart_opt.size();++ipair){</div>
+<div class="line"><a name="l00282"></a><span class="lineno">  282</span>     <span class="keywordflow">if</span>(bend_opt[ipair]<=bstart_opt[ipair]){</div>
+<div class="line"><a name="l00283"></a><span class="lineno">  283</span>       <span class="keywordtype">string</span> errorstring=<span class="stringliteral">"Error: index for end band must be smaller then start band"</span>;</div>
+<div class="line"><a name="l00284"></a><span class="lineno">  284</span>       <span class="keywordflow">throw</span>(errorstring);</div>
+<div class="line"><a name="l00285"></a><span class="lineno">  285</span>     }</div>
+<div class="line"><a name="l00286"></a><span class="lineno">  286</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iband=bstart_opt[ipair];iband<=bend_opt[ipair];++iband)</div>
+<div class="line"><a name="l00287"></a><span class="lineno">  287</span>       band_opt.push_back(iband);</div>
+<div class="line"><a name="l00288"></a><span class="lineno">  288</span>       }</div>
+<div class="line"><a name="l00289"></a><span class="lineno">  289</span>     }</div>
+<div class="line"><a name="l00290"></a><span class="lineno">  290</span>   }</div>
+<div class="line"><a name="l00291"></a><span class="lineno">  291</span>   <span class="keywordflow">catch</span>(<span class="keywordtype">string</span> error){</div>
+<div class="line"><a name="l00292"></a><span class="lineno">  292</span>     cerr << error << std::endl;</div>
+<div class="line"><a name="l00293"></a><span class="lineno">  293</span>     exit(1);</div>
 <div class="line"><a name="l00294"></a><span class="lineno">  294</span>   }</div>
-<div class="line"><a name="l00295"></a><span class="lineno">  295</span>   <span class="keywordflow">switch</span>( labelType ){</div>
-<div class="line"><a name="l00296"></a><span class="lineno">  296</span>   <span class="keywordflow">case</span> OFTInteger:</div>
-<div class="line"><a name="l00297"></a><span class="lineno">  297</span>   <span class="keywordflow">case</span> OFTReal:</div>
-<div class="line"><a name="l00298"></a><span class="lineno">  298</span>   <span class="keywordflow">case</span> OFTRealList:</div>
-<div class="line"><a name="l00299"></a><span class="lineno">  299</span>   <span class="keywordflow">case</span> OFTString:</div>
-<div class="line"><a name="l00300"></a><span class="lineno">  300</span>     <span class="keywordflow">if</span>(verbose_opt[0]>1)</div>
-<div class="line"><a name="l00301"></a><span class="lineno">  301</span>       std::cout << std::endl << <span class="stringliteral">"label type is: "</span> << OGRFieldDefn::GetFieldTypeName(labelType) << std::endl;</div>
-<div class="line"><a name="l00302"></a><span class="lineno">  302</span>     <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l00303"></a><span class="lineno">  303</span>   <span class="keywordflow">default</span>:</div>
-<div class="line"><a name="l00304"></a><span class="lineno">  304</span>     cerr << <span class="stringliteral">"label type "</span> << OGRFieldDefn::GetFieldTypeName(labelType) << <span class="stringliteral">" not supported"</span> << std::endl;</div>
-<div class="line"><a name="l00305"></a><span class="lineno">  305</span>     exit(0);</div>
-<div class="line"><a name="l00306"></a><span class="lineno">  306</span>     <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l00307"></a><span class="lineno">  307</span>   }</div>
-<div class="line"><a name="l00308"></a><span class="lineno">  308</span>   </div>
-<div class="line"><a name="l00309"></a><span class="lineno">  309</span>   <span class="keyword">const</span> <span class="keywordtype">char</span>* pszMessage;</div>
-<div class="line"><a name="l00310"></a><span class="lineno">  310</span>   <span class="keywordtype">void</span>* pProgressArg=NULL;</div>
-<div class="line"><a name="l00311"></a><span class="lineno">  311</span>   GDALProgressFunc pfnProgress=GDALTermProgress;</div>
-<div class="line"><a name="l00312"></a><span class="lineno">  312</span>   <span class="keywordtype">double</span> progress=0;</div>
-<div class="line"><a name="l00313"></a><span class="lineno">  313</span>   srand(time(NULL));</div>
-<div class="line"><a name="l00314"></a><span class="lineno">  314</span> </div>
-<div class="line"><a name="l00315"></a><span class="lineno">  315</span>   <span class="keywordtype">bool</span> sampleIsRaster=<span class="keyword">false</span>;</div>
-<div class="line"><a name="l00316"></a><span class="lineno">  316</span>   <span class="keywordtype">bool</span> sampleIsVirtual=<span class="keyword">false</span>;</div>
-<div class="line"><a name="l00317"></a><span class="lineno">  317</span> </div>
-<div class="line"><a name="l00318"></a><span class="lineno">  318</span>   <a class="code" href="classImgReaderOgr.html">ImgReaderOgr</a> sampleReaderOgr;</div>
-<div class="line"><a name="l00319"></a><span class="lineno">  319</span>   <a class="code" href="classImgWriterOgr.html">ImgWriterOgr</a> sampleWriterOgr;</div>
-<div class="line"><a name="l00320"></a><span class="lineno">  320</span> </div>
-<div class="line"><a name="l00321"></a><span class="lineno">  321</span>   <span class="keywordflow">if</span>(sample_opt.size()){</div>
-<div class="line"><a name="l00322"></a><span class="lineno">  322</span>     <span class="keywordflow">try</span>{</div>
-<div class="line"><a name="l00323"></a><span class="lineno">  323</span>       sampleReaderOgr.open(sample_opt[0]);</div>
-<div class="line"><a name="l00324"></a><span class="lineno">  324</span>     }</div>
-<div class="line"><a name="l00325"></a><span class="lineno">  325</span>     <span class="keywordflow">catch</span>(<span class="keywordtype">string</span> errorString){</div>
-<div class="line"><a name="l00326"></a><span class="lineno">  326</span>       sampleIsRaster=<span class="keyword">true</span>;</div>
-<div class="line"><a name="l00327"></a><span class="lineno">  327</span>     }</div>
-<div class="line"><a name="l00328"></a><span class="lineno">  328</span>   }</div>
-<div class="line"><a name="l00329"></a><span class="lineno">  329</span>   <span class="keywordflow">else</span>{</div>
-<div class="line"><a name="l00330"></a><span class="lineno">  330</span>     <span class="keywordflow">try</span>{</div>
-<div class="line"><a name="l00331"></a><span class="lineno">  331</span>       sampleWriterOgr.open(<span class="stringliteral">"/vsimem/virtual"</span>,ogrformat_opt[0]);</div>
-<div class="line"><a name="l00332"></a><span class="lineno">  332</span>     }</div>
-<div class="line"><a name="l00333"></a><span class="lineno">  333</span>     <span class="keywordflow">catch</span>(<span class="keywordtype">string</span> errorString){</div>
-<div class="line"><a name="l00334"></a><span class="lineno">  334</span>       cerr << errorString << endl;</div>
-<div class="line"><a name="l00335"></a><span class="lineno">  335</span>     }</div>
-<div class="line"><a name="l00336"></a><span class="lineno">  336</span>     <span class="keywordtype">char</span>     **papszOptions=NULL;</div>
-<div class="line"><a name="l00337"></a><span class="lineno">  337</span>     sampleWriterOgr.createLayer(<span class="stringliteral">"points"</span>, imgReader.getProjection(), wkbPoint, papszOptions);</div>
-<div class="line"><a name="l00338"></a><span class="lineno">  338</span>     sampleIsVirtual=<span class="keyword">true</span>;</div>
-<div class="line"><a name="l00339"></a><span class="lineno">  339</span> </div>
-<div class="line"><a name="l00340"></a><span class="lineno">  340</span>     <span class="comment">// string fieldName="label";</span></div>
-<div class="line"><a name="l00341"></a><span class="lineno">  341</span>     <span class="comment">// string fieldValue="class";</span></div>
-<div class="line"><a name="l00342"></a><span class="lineno">  342</span>     <span class="comment">// sampleWriterOgr.createField(fieldName,OFTString);</span></div>
-<div class="line"><a name="l00343"></a><span class="lineno">  343</span>     <span class="keywordflow">if</span>(random_opt.size()){</div>
-<div class="line"><a name="l00344"></a><span class="lineno">  344</span>       <span class="comment">//create simple random sampling within boundary</span></div>
-<div class="line"><a name="l00345"></a><span class="lineno">  345</span>       OGRPoint pt;</div>
-<div class="line"><a name="l00346"></a><span class="lineno">  346</span>       <span class="keywordtype">double</span> ulx,uly,lrx,lry;</div>
-<div class="line"><a name="l00347"></a><span class="lineno">  347</span>       imgReader.getBoundingBox(ulx,uly,lrx,lry);</div>
-<div class="line"><a name="l00348"></a><span class="lineno">  348</span>       <span class="keywordflow">for</span>(<span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> ipoint=1;ipoint<=random_opt[0];++ipoint){</div>
-<div class="line"><a name="l00349"></a><span class="lineno">  349</span>     OGRFeature *pointFeature;</div>
-<div class="line"><a name="l00350"></a><span class="lineno">  350</span>     pointFeature=sampleWriterOgr.createFeature();</div>
-<div class="line"><a name="l00351"></a><span class="lineno">  351</span>     <span class="comment">// pointFeature->SetField(fieldName.c_str(),fieldValue.c_str());</span></div>
-<div class="line"><a name="l00352"></a><span class="lineno">  352</span>     <span class="keywordtype">double</span> theX=ulx+<span class="keyword">static_cast<</span><span class="keywordtype">double</span><span class="keyword">></span>(rand())/(RAND_MAX)*(lrx-ulx);</div>
-<div class="line"><a name="l00353"></a><span class="lineno">  353</span>     <span class="keywordtype">double</span> theY=uly-<span class="keyword">static_cast<</span><span class="keywordtype">double</span><span class="keyword">></span>(rand())/(RAND_MAX)*(uly-lry);</div>
-<div class="line"><a name="l00354"></a><span class="lineno">  354</span>     pt.setX(theX);</div>
-<div class="line"><a name="l00355"></a><span class="lineno">  355</span>     pt.setY(theY);</div>
-<div class="line"><a name="l00356"></a><span class="lineno">  356</span>     pointFeature->SetGeometry( &pt ); </div>
-<div class="line"><a name="l00357"></a><span class="lineno">  357</span>     <span class="keywordflow">if</span>(sampleWriterOgr.createFeature(pointFeature) != OGRERR_NONE ){</div>
-<div class="line"><a name="l00358"></a><span class="lineno">  358</span>       cerr << <span class="stringliteral">"Failed to create feature in shapefile"</span> << endl;</div>
-<div class="line"><a name="l00359"></a><span class="lineno">  359</span>       exit( 1 );</div>
-<div class="line"><a name="l00360"></a><span class="lineno">  360</span>     }</div>
-<div class="line"><a name="l00361"></a><span class="lineno">  361</span>     OGRFeature::DestroyFeature(pointFeature);</div>
-<div class="line"><a name="l00362"></a><span class="lineno">  362</span>       }</div>
-<div class="line"><a name="l00363"></a><span class="lineno">  363</span>     }</div>
-<div class="line"><a name="l00364"></a><span class="lineno">  364</span>     <span class="keywordflow">else</span> <span class="keywordflow">if</span>(grid_opt.size()){</div>
-<div class="line"><a name="l00365"></a><span class="lineno">  365</span>       <span class="comment">//create systematic grid of points </span></div>
-<div class="line"><a name="l00366"></a><span class="lineno">  366</span>       OGRPoint pt;</div>
-<div class="line"><a name="l00367"></a><span class="lineno">  367</span>       <span class="keywordtype">double</span> ulx,uly,lrx,lry;</div>
-<div class="line"><a name="l00368"></a><span class="lineno">  368</span>       imgReader.getBoundingBox(ulx,uly,lrx,lry);</div>
-<div class="line"><a name="l00369"></a><span class="lineno">  369</span>       <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> ipoint=0;</div>
-<div class="line"><a name="l00370"></a><span class="lineno">  370</span>       <span class="keywordflow">for</span>(<span class="keywordtype">double</span> theY=uly-grid_opt[0]/2;theY>lry;theY-=grid_opt[0]){</div>
-<div class="line"><a name="l00371"></a><span class="lineno">  371</span>     <span class="keywordflow">for</span>(<span class="keywordtype">double</span> theX=ulx+grid_opt[0]/2;theX<lrx;theX+=grid_opt[0]){</div>
-<div class="line"><a name="l00372"></a><span class="lineno">  372</span>       <span class="keywordflow">if</span>(verbose_opt[0]>1)</div>
-<div class="line"><a name="l00373"></a><span class="lineno">  373</span>         cout << <span class="stringliteral">"position: "</span> << theX << <span class="stringliteral">" "</span> << theY << endl;</div>
-<div class="line"><a name="l00374"></a><span class="lineno">  374</span>       OGRFeature *pointFeature;</div>
-<div class="line"><a name="l00375"></a><span class="lineno">  375</span>       pointFeature=sampleWriterOgr.createFeature();</div>
-<div class="line"><a name="l00376"></a><span class="lineno">  376</span>       <span class="comment">// pointFeature->SetField(fieldName.c_str(),fieldValue.c_str());</span></div>
-<div class="line"><a name="l00377"></a><span class="lineno">  377</span>       pt.setX(theX);</div>
-<div class="line"><a name="l00378"></a><span class="lineno">  378</span>       pt.setY(theY);</div>
-<div class="line"><a name="l00379"></a><span class="lineno">  379</span>       pointFeature->SetGeometry( &pt ); </div>
-<div class="line"><a name="l00380"></a><span class="lineno">  380</span>       <span class="keywordflow">if</span>(sampleWriterOgr.createFeature(pointFeature) != OGRERR_NONE ){</div>
-<div class="line"><a name="l00381"></a><span class="lineno">  381</span>         cerr << <span class="stringliteral">"Failed to create feature in shapefile"</span> << endl;</div>
-<div class="line"><a name="l00382"></a><span class="lineno">  382</span>         exit( 1 );</div>
-<div class="line"><a name="l00383"></a><span class="lineno">  383</span>       }</div>
-<div class="line"><a name="l00384"></a><span class="lineno">  384</span>       OGRFeature::DestroyFeature(pointFeature);</div>
-<div class="line"><a name="l00385"></a><span class="lineno">  385</span>     }</div>
-<div class="line"><a name="l00386"></a><span class="lineno">  386</span>       }</div>
-<div class="line"><a name="l00387"></a><span class="lineno">  387</span>     }</div>
-<div class="line"><a name="l00388"></a><span class="lineno">  388</span>     <span class="keywordflow">else</span>{</div>
-<div class="line"><a name="l00389"></a><span class="lineno">  389</span>       std::cerr << <span class="stringliteral">"No sample dataset provided (use option -s). Use --help for help information"</span>;</div>
-<div class="line"><a name="l00390"></a><span class="lineno">  390</span>       exit(0);</div>
-<div class="line"><a name="l00391"></a><span class="lineno">  391</span>     }</div>
-<div class="line"><a name="l00392"></a><span class="lineno">  392</span>     <span class="keywordflow">try</span>{</div>
-<div class="line"><a name="l00393"></a><span class="lineno">  393</span>       sampleWriterOgr.close();</div>
-<div class="line"><a name="l00394"></a><span class="lineno">  394</span>       sampleReaderOgr.open(<span class="stringliteral">"/vsimem/virtual"</span>);</div>
-<div class="line"><a name="l00395"></a><span class="lineno">  395</span>     }</div>
-<div class="line"><a name="l00396"></a><span class="lineno">  396</span>     <span class="keywordflow">catch</span>(<span class="keywordtype">string</span> errorString){</div>
-<div class="line"><a name="l00397"></a><span class="lineno">  397</span>       cerr << errorString << endl;</div>
-<div class="line"><a name="l00398"></a><span class="lineno">  398</span>     }</div>
-<div class="line"><a name="l00399"></a><span class="lineno">  399</span>   }</div>
-<div class="line"><a name="l00400"></a><span class="lineno">  400</span> </div>
-<div class="line"><a name="l00401"></a><span class="lineno">  401</span>   <span class="keywordflow">if</span>(sampleIsRaster){</div>
-<div class="line"><a name="l00402"></a><span class="lineno">  402</span>     <span class="keywordflow">if</span>(class_opt.empty()){</div>
-<div class="line"><a name="l00403"></a><span class="lineno">  403</span>       <span class="comment">// std::cout << "Warning: no classes selected, if a classes must be extracted, set to -1 for all classes using option -c -1" << std::endl;</span></div>
-<div class="line"><a name="l00404"></a><span class="lineno">  404</span>       <a class="code" href="classImgReaderGdal.html">ImgReaderGdal</a> classReader;</div>
-<div class="line"><a name="l00405"></a><span class="lineno">  405</span>       <a class="code" href="classImgWriterOgr.html">ImgWriterOgr</a> ogrWriter;</div>
-<div class="line"><a name="l00406"></a><span class="lineno">  406</span>       assert(sample_opt.size());</div>
-<div class="line"><a name="l00407"></a><span class="lineno">  407</span>       classReader.open(sample_opt[0]);</div>
-<div class="line"><a name="l00408"></a><span class="lineno">  408</span>       <span class="comment">// vector<int> classBuffer(classReader.nrOfCol());</span></div>
-<div class="line"><a name="l00409"></a><span class="lineno">  409</span>       vector<double> classBuffer(classReader.nrOfCol());</div>
-<div class="line"><a name="l00410"></a><span class="lineno">  410</span>       <a class="code" href="classVector2d.html">Vector2d<double></a> imgBuffer(nband);<span class="comment">//[band][col]</span></div>
-<div class="line"><a name="l00411"></a><span class="lineno">  411</span>       vector<double> sample(2+nband);<span class="comment">//x,y,band values</span></div>
-<div class="line"><a name="l00412"></a><span class="lineno">  412</span>       <a class="code" href="classVector2d.html">Vector2d<double></a> writeBuffer;</div>
-<div class="line"><a name="l00413"></a><span class="lineno">  413</span>       <span class="comment">// vector<int> writeBufferClass;</span></div>
-<div class="line"><a name="l00414"></a><span class="lineno">  414</span>       vector<double> writeBufferClass;</div>
-<div class="line"><a name="l00415"></a><span class="lineno">  415</span>       vector<int> selectedClass;</div>
-<div class="line"><a name="l00416"></a><span class="lineno">  416</span>       <a class="code" href="classVector2d.html">Vector2d<double></a> selectedBuffer;</div>
-<div class="line"><a name="l00417"></a><span class="lineno">  417</span>       <span class="keywordtype">double</span> oldimgrow=-1;</div>
-<div class="line"><a name="l00418"></a><span class="lineno">  418</span>       <span class="keywordtype">int</span> irow=0;</div>
-<div class="line"><a name="l00419"></a><span class="lineno">  419</span>       <span class="keywordtype">int</span> icol=0;</div>
-<div class="line"><a name="l00420"></a><span class="lineno">  420</span>       <span class="keywordflow">if</span>(verbose_opt[0]>1)</div>
-<div class="line"><a name="l00421"></a><span class="lineno">  421</span>         std::cout << <span class="stringliteral">"extracting sample from image..."</span> << std::endl;</div>
-<div class="line"><a name="l00422"></a><span class="lineno">  422</span>       progress=0;</div>
-<div class="line"><a name="l00423"></a><span class="lineno">  423</span>       pfnProgress(progress,pszMessage,pProgressArg);</div>
-<div class="line"><a name="l00424"></a><span class="lineno">  424</span>       <span class="keywordflow">for</span>(irow=0;irow<classReader.nrOfRow();++irow){</div>
-<div class="line"><a name="l00425"></a><span class="lineno">  425</span>         <span class="keywordflow">if</span>(irow%down_opt[0])</div>
-<div class="line"><a name="l00426"></a><span class="lineno">  426</span>           <span class="keywordflow">continue</span>;</div>
-<div class="line"><a name="l00427"></a><span class="lineno">  427</span>         <span class="comment">// classReader.readData(classBuffer,GDT_Int32,irow);</span></div>
-<div class="line"><a name="l00428"></a><span class="lineno">  428</span>         classReader.readData(classBuffer,GDT_Float64,irow);</div>
-<div class="line"><a name="l00429"></a><span class="lineno">  429</span>         <span class="keywordtype">double</span> x,y;<span class="comment">//geo coordinates</span></div>
-<div class="line"><a name="l00430"></a><span class="lineno">  430</span>         <span class="keywordtype">double</span> iimg,jimg;<span class="comment">//image coordinates in img image</span></div>
-<div class="line"><a name="l00431"></a><span class="lineno">  431</span>         <span class="keywordflow">for</span>(icol=0;icol<classReader.nrOfCol();++icol){</div>
-<div class="line"><a name="l00432"></a><span class="lineno">  432</span>           <span class="keywordflow">if</span>(icol%down_opt[0])</div>
-<div class="line"><a name="l00433"></a><span class="lineno">  433</span>             <span class="keywordflow">continue</span>;</div>
-<div class="line"><a name="l00434"></a><span class="lineno">  434</span>           <span class="comment">// int theClass=0;</span></div>
-<div class="line"><a name="l00435"></a><span class="lineno">  435</span>           <span class="keywordtype">double</span> theClass=classBuffer[icol];</div>
-<div class="line"><a name="l00436"></a><span class="lineno">  436</span>           <span class="comment">// int processClass=-1;</span></div>
-<div class="line"><a name="l00437"></a><span class="lineno">  437</span>           <span class="keywordtype">int</span> processClass=0;</div>
-<div class="line"><a name="l00438"></a><span class="lineno">  438</span>           <span class="comment">// if(class_opt[0]<0){//process every class except 0</span></div>
-<div class="line"><a name="l00439"></a><span class="lineno">  439</span>           <span class="comment">//   if(classBuffer[icol]){</span></div>
-<div class="line"><a name="l00440"></a><span class="lineno">  440</span>           <span class="comment">//     processClass=0;</span></div>
-<div class="line"><a name="l00441"></a><span class="lineno">  441</span>           <span class="comment">//     theClass=classBuffer[icol];</span></div>
-<div class="line"><a name="l00442"></a><span class="lineno">  442</span>           <span class="comment">//   }</span></div>
-<div class="line"><a name="l00443"></a><span class="lineno">  443</span>           <span class="comment">// }</span></div>
-<div class="line"><a name="l00444"></a><span class="lineno">  444</span>           <span class="comment">// else{</span></div>
-<div class="line"><a name="l00445"></a><span class="lineno">  445</span>           <span class="comment">//   for(int iclass=0;iclass<class_opt.size();++iclass){</span></div>
-<div class="line"><a name="l00446"></a><span class="lineno">  446</span>           <span class="comment">//     if(classBuffer[icol]==class_opt[iclass]){</span></div>
-<div class="line"><a name="l00447"></a><span class="lineno">  447</span>           <span class="comment">//       processClass=iclass;</span></div>
-<div class="line"><a name="l00448"></a><span class="lineno">  448</span>           <span class="comment">//       theClass=class_opt[iclass];</span></div>
-<div class="line"><a name="l00449"></a><span class="lineno">  449</span>           <span class="comment">//     }</span></div>
-<div class="line"><a name="l00450"></a><span class="lineno">  450</span>           <span class="comment">//   }</span></div>
-<div class="line"><a name="l00451"></a><span class="lineno">  451</span>           <span class="comment">// }</span></div>
-<div class="line"><a name="l00452"></a><span class="lineno">  452</span>           <span class="comment">// if(processClass>=0){</span></div>
-<div class="line"><a name="l00453"></a><span class="lineno">  453</span>           <span class="keywordtype">bool</span> valid=<span class="keyword">true</span>;</div>
-<div class="line"><a name="l00454"></a><span class="lineno">  454</span>           <span class="keywordflow">if</span>(valid){</div>
-<div class="line"><a name="l00455"></a><span class="lineno">  455</span>             <span class="keywordflow">if</span>(geo_opt[0]){</div>
-<div class="line"><a name="l00456"></a><span class="lineno">  456</span>               classReader.image2geo(icol,irow,x,y);</div>
-<div class="line"><a name="l00457"></a><span class="lineno">  457</span>               sample[0]=x;</div>
-<div class="line"><a name="l00458"></a><span class="lineno">  458</span>               sample[1]=y;</div>
-<div class="line"><a name="l00459"></a><span class="lineno">  459</span>               <span class="keywordflow">if</span>(verbose_opt[0]>1){</div>
-<div class="line"><a name="l00460"></a><span class="lineno">  460</span>                 std::cout.precision(12);</div>
-<div class="line"><a name="l00461"></a><span class="lineno">  461</span>                 std::cout << theClass << <span class="stringliteral">" "</span> << x << <span class="stringliteral">" "</span> << y << std::endl;</div>
-<div class="line"><a name="l00462"></a><span class="lineno">  462</span>               }</div>
-<div class="line"><a name="l00463"></a><span class="lineno">  463</span>               <span class="comment">//find col in img</span></div>
-<div class="line"><a name="l00464"></a><span class="lineno">  464</span>               imgReader.geo2image(x,y,iimg,jimg);</div>
-<div class="line"><a name="l00465"></a><span class="lineno">  465</span>               <span class="comment">//nearest neighbour</span></div>
-<div class="line"><a name="l00466"></a><span class="lineno">  466</span>               jimg=<span class="keyword">static_cast<</span><span class="keywordtype">int</span><span class="keyword">></span>(jimg);</div>
-<div class="line"><a name="l00467"></a><span class="lineno">  467</span>               iimg=<span class="keyword">static_cast<</span><span class="keywordtype">int</span><span class="keyword">></span>(iimg);</div>
-<div class="line"><a name="l00468"></a><span class="lineno">  468</span>               <span class="keywordflow">if</span>(static_cast<int>(iimg)<0||<span class="keyword">static_cast<</span><span class="keywordtype">int</span><span class="keyword">></span>(iimg)>=imgReader.nrOfCol())</div>
-<div class="line"><a name="l00469"></a><span class="lineno">  469</span>                 <span class="keywordflow">continue</span>;</div>
-<div class="line"><a name="l00470"></a><span class="lineno">  470</span>             }</div>
-<div class="line"><a name="l00471"></a><span class="lineno">  471</span>             <span class="keywordflow">else</span>{</div>
-<div class="line"><a name="l00472"></a><span class="lineno">  472</span>               iimg=icol;</div>
-<div class="line"><a name="l00473"></a><span class="lineno">  473</span>               jimg=irow;</div>
-<div class="line"><a name="l00474"></a><span class="lineno">  474</span>               sample[0]=iimg;</div>
-<div class="line"><a name="l00475"></a><span class="lineno">  475</span>               sample[1]=jimg;</div>
-<div class="line"><a name="l00476"></a><span class="lineno">  476</span>             }</div>
-<div class="line"><a name="l00477"></a><span class="lineno">  477</span>             <span class="keywordflow">if</span>(static_cast<int>(jimg)<0||<span class="keyword">static_cast<</span><span class="keywordtype">int</span><span class="keyword">></span>(jimg)>=imgReader.nrOfRow())</div>
-<div class="line"><a name="l00478"></a><span class="lineno">  478</span>               <span class="keywordflow">continue</span>;</div>
-<div class="line"><a name="l00479"></a><span class="lineno">  479</span> </div>
-<div class="line"><a name="l00480"></a><span class="lineno">  480</span>             <span class="keywordtype">bool</span> valid=<span class="keyword">true</span>;</div>
-<div class="line"><a name="l00481"></a><span class="lineno">  481</span> </div>
-<div class="line"><a name="l00482"></a><span class="lineno">  482</span>             <span class="keywordflow">if</span>(static_cast<int>(jimg)!=<span class="keyword">static_cast<</span><span class="keywordtype">int</span><span class="keyword">></span>(oldimgrow)){</div>
-<div class="line"><a name="l00483"></a><span class="lineno">  483</span>               assert(imgBuffer.size()==nband);</div>
-<div class="line"><a name="l00484"></a><span class="lineno">  484</span>               <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iband=0;iband<nband;++iband){</div>
-<div class="line"><a name="l00485"></a><span class="lineno">  485</span>         <span class="keywordtype">int</span> theBand=(band_opt.size()) ? band_opt[iband] : iband;</div>
-<div class="line"><a name="l00486"></a><span class="lineno">  486</span>                 imgReader.readData(imgBuffer[iband],GDT_Float64,static_cast<int>(jimg),theBand);</div>
-<div class="line"><a name="l00487"></a><span class="lineno">  487</span>                 assert(imgBuffer[iband].size()==imgReader.nrOfCol());</div>
-<div class="line"><a name="l00488"></a><span class="lineno">  488</span>         <span class="keywordflow">if</span>(srcnodata_opt.size()){</div>
-<div class="line"><a name="l00489"></a><span class="lineno">  489</span>           vector<int>::const_iterator bndit=bndnodata_opt.begin();</div>
-<div class="line"><a name="l00490"></a><span class="lineno">  490</span>           vector<double>::const_iterator srcit=srcnodata_opt.begin();</div>
-<div class="line"><a name="l00491"></a><span class="lineno">  491</span>           <span class="keywordflow">while</span>(bndit!=bndnodata_opt.end()&&srcit!=srcnodata_opt.end()){</div>
-<div class="line"><a name="l00492"></a><span class="lineno">  492</span>             <span class="keywordflow">if</span>((*bndit==theBand)&&(*srcit==imgBuffer[iband][<span class="keyword">static_cast<</span><span class="keywordtype">int</span><span class="keyword">></span>(iimg)])){</div>
-<div class="line"><a name="l00493"></a><span class="lineno">  493</span>               valid=<span class="keyword">false</span>;</div>
-<div class="line"><a name="l00494"></a><span class="lineno">  494</span>               <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l00495"></a><span class="lineno">  495</span>             }</div>
-<div class="line"><a name="l00496"></a><span class="lineno">  496</span>             <span class="keywordflow">else</span>{</div>
-<div class="line"><a name="l00497"></a><span class="lineno">  497</span>               ++bndit;</div>
-<div class="line"><a name="l00498"></a><span class="lineno">  498</span>               ++srcit;</div>
-<div class="line"><a name="l00499"></a><span class="lineno">  499</span>             }</div>
-<div class="line"><a name="l00500"></a><span class="lineno">  500</span>           }</div>
-<div class="line"><a name="l00501"></a><span class="lineno">  501</span>         }</div>
-<div class="line"><a name="l00502"></a><span class="lineno">  502</span>           }</div>
-<div class="line"><a name="l00503"></a><span class="lineno">  503</span>               oldimgrow=jimg;</div>
-<div class="line"><a name="l00504"></a><span class="lineno">  504</span>         }</div>
-<div class="line"><a name="l00505"></a><span class="lineno">  505</span> </div>
-<div class="line"><a name="l00506"></a><span class="lineno">  506</span>             <span class="keywordflow">if</span>(valid){</div>
-<div class="line"><a name="l00507"></a><span class="lineno">  507</span>               <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iband=0;iband<imgBuffer.size();++iband){</div>
-<div class="line"><a name="l00508"></a><span class="lineno">  508</span>                 <span class="keywordflow">if</span>(imgBuffer[iband].size()!=imgReader.nrOfCol()){</div>
-<div class="line"><a name="l00509"></a><span class="lineno">  509</span>                   std::cout << <span class="stringliteral">"Error in band "</span> << iband << <span class="stringliteral">": "</span> << imgBuffer[iband].size() << <span class="stringliteral">"!="</span> << imgReader.nrOfCol() << std::endl;</div>
-<div class="line"><a name="l00510"></a><span class="lineno">  510</span>                   assert(imgBuffer[iband].size()==imgReader.nrOfCol());</div>
-<div class="line"><a name="l00511"></a><span class="lineno">  511</span>                 }</div>
-<div class="line"><a name="l00512"></a><span class="lineno">  512</span>                 sample[iband+2]=imgBuffer[iband][<span class="keyword">static_cast<</span><span class="keywordtype">int</span><span class="keyword">></span>(iimg)];</div>
+<div class="line"><a name="l00295"></a><span class="lineno">  295</span>   </div>
+<div class="line"><a name="l00296"></a><span class="lineno">  296</span>   <span class="keywordtype">int</span> nband=(band_opt.size()) ? band_opt.size() : imgReader.nrOfBand();</div>
+<div class="line"><a name="l00297"></a><span class="lineno">  297</span> </div>
+<div class="line"><a name="l00298"></a><span class="lineno">  298</span>   <span class="keywordflow">if</span>(fieldname_opt.size()<nband){</div>
+<div class="line"><a name="l00299"></a><span class="lineno">  299</span>     std::string bandString=fieldname_opt[0];</div>
+<div class="line"><a name="l00300"></a><span class="lineno">  300</span>     fieldname_opt.clear();</div>
+<div class="line"><a name="l00301"></a><span class="lineno">  301</span>     fieldname_opt.resize(nband);</div>
+<div class="line"><a name="l00302"></a><span class="lineno">  302</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iband=0;iband<nband;++iband){</div>
+<div class="line"><a name="l00303"></a><span class="lineno">  303</span>       <span class="keywordtype">int</span> theBand=(band_opt.size()) ? band_opt[iband] : iband;</div>
+<div class="line"><a name="l00304"></a><span class="lineno">  304</span>       ostringstream fs;</div>
+<div class="line"><a name="l00305"></a><span class="lineno">  305</span>       fs << bandString << theBand;</div>
+<div class="line"><a name="l00306"></a><span class="lineno">  306</span>       fieldname_opt[iband]=fs.str();</div>
+<div class="line"><a name="l00307"></a><span class="lineno">  307</span>     }</div>
+<div class="line"><a name="l00308"></a><span class="lineno">  308</span>   }</div>
+<div class="line"><a name="l00309"></a><span class="lineno">  309</span> </div>
+<div class="line"><a name="l00310"></a><span class="lineno">  310</span>   <span class="keywordflow">if</span>(verbose_opt[0])</div>
+<div class="line"><a name="l00311"></a><span class="lineno">  311</span>     std::cout << fieldname_opt << std::endl;</div>
+<div class="line"><a name="l00312"></a><span class="lineno">  312</span>   </div>
+<div class="line"><a name="l00313"></a><span class="lineno">  313</span>   <span class="keywordflow">if</span>(verbose_opt[0]>1)</div>
+<div class="line"><a name="l00314"></a><span class="lineno">  314</span>     std::cout << <span class="stringliteral">"Number of bands in input image: "</span> << imgReader.nrOfBand() << std::endl;</div>
+<div class="line"><a name="l00315"></a><span class="lineno">  315</span> </div>
+<div class="line"><a name="l00316"></a><span class="lineno">  316</span>   OGRFieldType fieldType;</div>
+<div class="line"><a name="l00317"></a><span class="lineno">  317</span>   OGRFieldType labelType;</div>
+<div class="line"><a name="l00318"></a><span class="lineno">  318</span>   <span class="keywordtype">int</span> ogr_typecount=11;<span class="comment">//hard coded for now!</span></div>
+<div class="line"><a name="l00319"></a><span class="lineno">  319</span>   <span class="keywordflow">if</span>(verbose_opt[0]>1)</div>
+<div class="line"><a name="l00320"></a><span class="lineno">  320</span>     std::cout << <span class="stringliteral">"field and label types can be: "</span>;</div>
+<div class="line"><a name="l00321"></a><span class="lineno">  321</span>   <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iType = 0; iType < ogr_typecount; ++iType){</div>
+<div class="line"><a name="l00322"></a><span class="lineno">  322</span>     <span class="keywordflow">if</span>(verbose_opt[0]>1)</div>
+<div class="line"><a name="l00323"></a><span class="lineno">  323</span>       std::cout << <span class="stringliteral">" "</span> << OGRFieldDefn::GetFieldTypeName((OGRFieldType)iType);</div>
+<div class="line"><a name="l00324"></a><span class="lineno">  324</span>     <span class="keywordflow">if</span>( OGRFieldDefn::GetFieldTypeName((OGRFieldType)iType) != NULL</div>
+<div class="line"><a name="l00325"></a><span class="lineno">  325</span>         && EQUAL(OGRFieldDefn::GetFieldTypeName((OGRFieldType)iType),</div>
+<div class="line"><a name="l00326"></a><span class="lineno">  326</span>                  ftype_opt[0].c_str()))</div>
+<div class="line"><a name="l00327"></a><span class="lineno">  327</span>       fieldType=(OGRFieldType) iType;</div>
+<div class="line"><a name="l00328"></a><span class="lineno">  328</span>     <span class="keywordflow">if</span>( OGRFieldDefn::GetFieldTypeName((OGRFieldType)iType) != NULL</div>
+<div class="line"><a name="l00329"></a><span class="lineno">  329</span>         && EQUAL(OGRFieldDefn::GetFieldTypeName((OGRFieldType)iType),</div>
+<div class="line"><a name="l00330"></a><span class="lineno">  330</span>                  ltype_opt[0].c_str()))</div>
+<div class="line"><a name="l00331"></a><span class="lineno">  331</span>       labelType=(OGRFieldType) iType;</div>
+<div class="line"><a name="l00332"></a><span class="lineno">  332</span>   }</div>
+<div class="line"><a name="l00333"></a><span class="lineno">  333</span>   <span class="keywordflow">switch</span>( fieldType ){</div>
+<div class="line"><a name="l00334"></a><span class="lineno">  334</span>   <span class="keywordflow">case</span> OFTInteger:</div>
+<div class="line"><a name="l00335"></a><span class="lineno">  335</span>   <span class="keywordflow">case</span> OFTReal:</div>
+<div class="line"><a name="l00336"></a><span class="lineno">  336</span>   <span class="keywordflow">case</span> OFTRealList:</div>
+<div class="line"><a name="l00337"></a><span class="lineno">  337</span>   <span class="keywordflow">case</span> OFTString:</div>
+<div class="line"><a name="l00338"></a><span class="lineno">  338</span>     <span class="keywordflow">if</span>(verbose_opt[0]>1)</div>
+<div class="line"><a name="l00339"></a><span class="lineno">  339</span>       std::cout << std::endl << <span class="stringliteral">"field type is: "</span> << OGRFieldDefn::GetFieldTypeName(fieldType) << std::endl;</div>
+<div class="line"><a name="l00340"></a><span class="lineno">  340</span>     <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l00341"></a><span class="lineno">  341</span>   <span class="keywordflow">default</span>:</div>
+<div class="line"><a name="l00342"></a><span class="lineno">  342</span>     cerr << <span class="stringliteral">"field type "</span> << OGRFieldDefn::GetFieldTypeName(fieldType) << <span class="stringliteral">" not supported"</span> << std::endl;</div>
+<div class="line"><a name="l00343"></a><span class="lineno">  343</span>     exit(0);</div>
+<div class="line"><a name="l00344"></a><span class="lineno">  344</span>     <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l00345"></a><span class="lineno">  345</span>   }</div>
+<div class="line"><a name="l00346"></a><span class="lineno">  346</span>   <span class="keywordflow">switch</span>( labelType ){</div>
+<div class="line"><a name="l00347"></a><span class="lineno">  347</span>   <span class="keywordflow">case</span> OFTInteger:</div>
+<div class="line"><a name="l00348"></a><span class="lineno">  348</span>   <span class="keywordflow">case</span> OFTReal:</div>
+<div class="line"><a name="l00349"></a><span class="lineno">  349</span>   <span class="keywordflow">case</span> OFTRealList:</div>
+<div class="line"><a name="l00350"></a><span class="lineno">  350</span>   <span class="keywordflow">case</span> OFTString:</div>
+<div class="line"><a name="l00351"></a><span class="lineno">  351</span>     <span class="keywordflow">if</span>(verbose_opt[0]>1)</div>
+<div class="line"><a name="l00352"></a><span class="lineno">  352</span>       std::cout << std::endl << <span class="stringliteral">"label type is: "</span> << OGRFieldDefn::GetFieldTypeName(labelType) << std::endl;</div>
+<div class="line"><a name="l00353"></a><span class="lineno">  353</span>     <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l00354"></a><span class="lineno">  354</span>   <span class="keywordflow">default</span>:</div>
+<div class="line"><a name="l00355"></a><span class="lineno">  355</span>     cerr << <span class="stringliteral">"label type "</span> << OGRFieldDefn::GetFieldTypeName(labelType) << <span class="stringliteral">" not supported"</span> << std::endl;</div>
+<div class="line"><a name="l00356"></a><span class="lineno">  356</span>     exit(0);</div>
+<div class="line"><a name="l00357"></a><span class="lineno">  357</span>     <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l00358"></a><span class="lineno">  358</span>   }</div>
+<div class="line"><a name="l00359"></a><span class="lineno">  359</span>   </div>
+<div class="line"><a name="l00360"></a><span class="lineno">  360</span>   <span class="keyword">const</span> <span class="keywordtype">char</span>* pszMessage;</div>
+<div class="line"><a name="l00361"></a><span class="lineno">  361</span>   <span class="keywordtype">void</span>* pProgressArg=NULL;</div>
+<div class="line"><a name="l00362"></a><span class="lineno">  362</span>   GDALProgressFunc pfnProgress=GDALTermProgress;</div>
+<div class="line"><a name="l00363"></a><span class="lineno">  363</span>   <span class="keywordtype">double</span> progress=0;</div>
+<div class="line"><a name="l00364"></a><span class="lineno">  364</span>   srand(time(NULL));</div>
+<div class="line"><a name="l00365"></a><span class="lineno">  365</span> </div>
+<div class="line"><a name="l00366"></a><span class="lineno">  366</span>   <span class="keywordtype">bool</span> sampleIsRaster=<span class="keyword">false</span>;</div>
+<div class="line"><a name="l00367"></a><span class="lineno">  367</span>   <span class="keywordtype">bool</span> sampleIsVirtual=<span class="keyword">false</span>;</div>
+<div class="line"><a name="l00368"></a><span class="lineno">  368</span> </div>
+<div class="line"><a name="l00369"></a><span class="lineno">  369</span>   <a class="code" href="classImgReaderOgr.html">ImgReaderOgr</a> sampleReaderOgr;</div>
+<div class="line"><a name="l00370"></a><span class="lineno">  370</span>   <a class="code" href="classImgWriterOgr.html">ImgWriterOgr</a> sampleWriterOgr;</div>
+<div class="line"><a name="l00371"></a><span class="lineno">  371</span> </div>
+<div class="line"><a name="l00372"></a><span class="lineno">  372</span>   <span class="keywordflow">if</span>(sample_opt.size()){</div>
+<div class="line"><a name="l00373"></a><span class="lineno">  373</span>     <span class="keywordflow">try</span>{</div>
+<div class="line"><a name="l00374"></a><span class="lineno">  374</span>       sampleReaderOgr.open(sample_opt[0]);</div>
+<div class="line"><a name="l00375"></a><span class="lineno">  375</span>     }</div>
+<div class="line"><a name="l00376"></a><span class="lineno">  376</span>     <span class="keywordflow">catch</span>(<span class="keywordtype">string</span> errorString){</div>
+<div class="line"><a name="l00377"></a><span class="lineno">  377</span>       sampleIsRaster=<span class="keyword">true</span>;</div>
+<div class="line"><a name="l00378"></a><span class="lineno">  378</span>     }</div>
+<div class="line"><a name="l00379"></a><span class="lineno">  379</span>   }</div>
+<div class="line"><a name="l00380"></a><span class="lineno">  380</span>   <span class="keywordflow">else</span>{</div>
+<div class="line"><a name="l00381"></a><span class="lineno">  381</span>     <span class="keywordflow">try</span>{</div>
+<div class="line"><a name="l00382"></a><span class="lineno">  382</span>       sampleWriterOgr.open(<span class="stringliteral">"/vsimem/virtual"</span>,ogrformat_opt[0]);</div>
+<div class="line"><a name="l00383"></a><span class="lineno">  383</span>     }</div>
+<div class="line"><a name="l00384"></a><span class="lineno">  384</span>     <span class="keywordflow">catch</span>(<span class="keywordtype">string</span> errorString){</div>
+<div class="line"><a name="l00385"></a><span class="lineno">  385</span>       cerr << errorString << endl;</div>
+<div class="line"><a name="l00386"></a><span class="lineno">  386</span>     }</div>
+<div class="line"><a name="l00387"></a><span class="lineno">  387</span>     <span class="keywordtype">char</span>     **papszOptions=NULL;</div>
+<div class="line"><a name="l00388"></a><span class="lineno">  388</span>     sampleWriterOgr.createLayer(<span class="stringliteral">"points"</span>, imgReader.getProjection(), wkbPoint, papszOptions);</div>
+<div class="line"><a name="l00389"></a><span class="lineno">  389</span>     sampleIsVirtual=<span class="keyword">true</span>;</div>
+<div class="line"><a name="l00390"></a><span class="lineno">  390</span> </div>
+<div class="line"><a name="l00391"></a><span class="lineno">  391</span>     <span class="comment">// string fieldName="label";</span></div>
+<div class="line"><a name="l00392"></a><span class="lineno">  392</span>     <span class="comment">// string fieldValue="class";</span></div>
+<div class="line"><a name="l00393"></a><span class="lineno">  393</span>     <span class="comment">// sampleWriterOgr.createField(fieldName,OFTString);</span></div>
+<div class="line"><a name="l00394"></a><span class="lineno">  394</span>     <span class="keywordflow">if</span>(random_opt.size()){</div>
+<div class="line"><a name="l00395"></a><span class="lineno">  395</span>       <span class="comment">//create simple random sampling within boundary</span></div>
+<div class="line"><a name="l00396"></a><span class="lineno">  396</span>       OGRPoint pt;</div>
+<div class="line"><a name="l00397"></a><span class="lineno">  397</span>       <span class="keywordtype">double</span> ulx,uly,lrx,lry;</div>
+<div class="line"><a name="l00398"></a><span class="lineno">  398</span>       imgReader.getBoundingBox(ulx,uly,lrx,lry);</div>
+<div class="line"><a name="l00399"></a><span class="lineno">  399</span>       <span class="keywordflow">for</span>(<span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> ipoint=1;ipoint<=random_opt[0];++ipoint){</div>
+<div class="line"><a name="l00400"></a><span class="lineno">  400</span>     OGRFeature *pointFeature;</div>
+<div class="line"><a name="l00401"></a><span class="lineno">  401</span>     pointFeature=sampleWriterOgr.createFeature();</div>
+<div class="line"><a name="l00402"></a><span class="lineno">  402</span>     <span class="comment">// pointFeature->SetField(fieldName.c_str(),fieldValue.c_str());</span></div>
+<div class="line"><a name="l00403"></a><span class="lineno">  403</span>     <span class="keywordtype">double</span> theX=ulx+<span class="keyword">static_cast<</span><span class="keywordtype">double</span><span class="keyword">></span>(rand())/(RAND_MAX)*(lrx-ulx);</div>
+<div class="line"><a name="l00404"></a><span class="lineno">  404</span>     <span class="keywordtype">double</span> theY=uly-<span class="keyword">static_cast<</span><span class="keywordtype">double</span><span class="keyword">></span>(rand())/(RAND_MAX)*(uly-lry);</div>
+<div class="line"><a name="l00405"></a><span class="lineno">  405</span>     pt.setX(theX);</div>
+<div class="line"><a name="l00406"></a><span class="lineno">  406</span>     pt.setY(theY);</div>
+<div class="line"><a name="l00407"></a><span class="lineno">  407</span>     pointFeature->SetGeometry( &pt ); </div>
+<div class="line"><a name="l00408"></a><span class="lineno">  408</span>     <span class="keywordflow">if</span>(sampleWriterOgr.createFeature(pointFeature) != OGRERR_NONE ){</div>
+<div class="line"><a name="l00409"></a><span class="lineno">  409</span>       cerr << <span class="stringliteral">"Failed to create feature in shapefile"</span> << endl;</div>
+<div class="line"><a name="l00410"></a><span class="lineno">  410</span>       exit( 1 );</div>
+<div class="line"><a name="l00411"></a><span class="lineno">  411</span>     }</div>
+<div class="line"><a name="l00412"></a><span class="lineno">  412</span>     OGRFeature::DestroyFeature(pointFeature);</div>
+<div class="line"><a name="l00413"></a><span class="lineno">  413</span>       }</div>
+<div class="line"><a name="l00414"></a><span class="lineno">  414</span>     }</div>
+<div class="line"><a name="l00415"></a><span class="lineno">  415</span>     <span class="keywordflow">else</span> <span class="keywordflow">if</span>(grid_opt.size()){</div>
+<div class="line"><a name="l00416"></a><span class="lineno">  416</span>       <span class="comment">//create systematic grid of points </span></div>
+<div class="line"><a name="l00417"></a><span class="lineno">  417</span>       OGRPoint pt;</div>
+<div class="line"><a name="l00418"></a><span class="lineno">  418</span>       <span class="keywordtype">double</span> ulx,uly,lrx,lry;</div>
+<div class="line"><a name="l00419"></a><span class="lineno">  419</span>       imgReader.getBoundingBox(ulx,uly,lrx,lry);</div>
+<div class="line"><a name="l00420"></a><span class="lineno">  420</span>       <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> ipoint=0;</div>
+<div class="line"><a name="l00421"></a><span class="lineno">  421</span>       <span class="keywordflow">for</span>(<span class="keywordtype">double</span> theY=uly-grid_opt[0]/2;theY>lry;theY-=grid_opt[0]){</div>
+<div class="line"><a name="l00422"></a><span class="lineno">  422</span>     <span class="keywordflow">for</span>(<span class="keywordtype">double</span> theX=ulx+grid_opt[0]/2;theX<lrx;theX+=grid_opt[0]){</div>
+<div class="line"><a name="l00423"></a><span class="lineno">  423</span>       <span class="keywordflow">if</span>(verbose_opt[0]>1)</div>
+<div class="line"><a name="l00424"></a><span class="lineno">  424</span>         cout << <span class="stringliteral">"position: "</span> << theX << <span class="stringliteral">" "</span> << theY << endl;</div>
+<div class="line"><a name="l00425"></a><span class="lineno">  425</span>       OGRFeature *pointFeature;</div>
+<div class="line"><a name="l00426"></a><span class="lineno">  426</span>       pointFeature=sampleWriterOgr.createFeature();</div>
+<div class="line"><a name="l00427"></a><span class="lineno">  427</span>       <span class="comment">// pointFeature->SetField(fieldName.c_str(),fieldValue.c_str());</span></div>
+<div class="line"><a name="l00428"></a><span class="lineno">  428</span>       pt.setX(theX);</div>
+<div class="line"><a name="l00429"></a><span class="lineno">  429</span>       pt.setY(theY);</div>
+<div class="line"><a name="l00430"></a><span class="lineno">  430</span>       pointFeature->SetGeometry( &pt ); </div>
+<div class="line"><a name="l00431"></a><span class="lineno">  431</span>       <span class="keywordflow">if</span>(sampleWriterOgr.createFeature(pointFeature) != OGRERR_NONE ){</div>
+<div class="line"><a name="l00432"></a><span class="lineno">  432</span>         cerr << <span class="stringliteral">"Failed to create feature in shapefile"</span> << endl;</div>
+<div class="line"><a name="l00433"></a><span class="lineno">  433</span>         exit( 1 );</div>
+<div class="line"><a name="l00434"></a><span class="lineno">  434</span>       }</div>
+<div class="line"><a name="l00435"></a><span class="lineno">  435</span>       OGRFeature::DestroyFeature(pointFeature);</div>
+<div class="line"><a name="l00436"></a><span class="lineno">  436</span>     }</div>
+<div class="line"><a name="l00437"></a><span class="lineno">  437</span>       }</div>
+<div class="line"><a name="l00438"></a><span class="lineno">  438</span>     }</div>
+<div class="line"><a name="l00439"></a><span class="lineno">  439</span>     <span class="keywordflow">else</span>{</div>
+<div class="line"><a name="l00440"></a><span class="lineno">  440</span>       std::cerr << <span class="stringliteral">"No sample dataset provided (use option -s). Use --help for help information"</span>;</div>
+<div class="line"><a name="l00441"></a><span class="lineno">  441</span>       exit(0);</div>
+<div class="line"><a name="l00442"></a><span class="lineno">  442</span>     }</div>
+<div class="line"><a name="l00443"></a><span class="lineno">  443</span>     <span class="keywordflow">try</span>{</div>
+<div class="line"><a name="l00444"></a><span class="lineno">  444</span>       sampleWriterOgr.close();</div>
+<div class="line"><a name="l00445"></a><span class="lineno">  445</span>       sampleReaderOgr.open(<span class="stringliteral">"/vsimem/virtual"</span>);</div>
+<div class="line"><a name="l00446"></a><span class="lineno">  446</span>     }</div>
+<div class="line"><a name="l00447"></a><span class="lineno">  447</span>     <span class="keywordflow">catch</span>(<span class="keywordtype">string</span> errorString){</div>
+<div class="line"><a name="l00448"></a><span class="lineno">  448</span>       cerr << errorString << endl;</div>
+<div class="line"><a name="l00449"></a><span class="lineno">  449</span>     }</div>
+<div class="line"><a name="l00450"></a><span class="lineno">  450</span>   }</div>
+<div class="line"><a name="l00451"></a><span class="lineno">  451</span> </div>
+<div class="line"><a name="l00452"></a><span class="lineno">  452</span>   <span class="keywordflow">if</span>(sampleIsRaster){</div>
+<div class="line"><a name="l00453"></a><span class="lineno">  453</span>     <span class="keywordflow">if</span>(class_opt.empty()){</div>
+<div class="line"><a name="l00454"></a><span class="lineno">  454</span>       <span class="comment">// std::cout << "Warning: no classes selected, if a classes must be extracted, set to -1 for all classes using option -c -1" << std::endl;</span></div>
+<div class="line"><a name="l00455"></a><span class="lineno">  455</span>       <a class="code" href="classImgReaderGdal.html">ImgReaderGdal</a> classReader;</div>
+<div class="line"><a name="l00456"></a><span class="lineno">  456</span>       <a class="code" href="classImgWriterOgr.html">ImgWriterOgr</a> ogrWriter;</div>
+<div class="line"><a name="l00457"></a><span class="lineno">  457</span>       assert(sample_opt.size());</div>
+<div class="line"><a name="l00458"></a><span class="lineno">  458</span>       classReader.open(sample_opt[0]);</div>
+<div class="line"><a name="l00459"></a><span class="lineno">  459</span>       <span class="comment">// vector<int> classBuffer(classReader.nrOfCol());</span></div>
+<div class="line"><a name="l00460"></a><span class="lineno">  460</span>       vector<double> classBuffer(classReader.nrOfCol());</div>
+<div class="line"><a name="l00461"></a><span class="lineno">  461</span>       <a class="code" href="classVector2d.html">Vector2d<double></a> imgBuffer(nband);<span class="comment">//[band][col]</span></div>
+<div class="line"><a name="l00462"></a><span class="lineno">  462</span>       vector<double> sample(2+nband);<span class="comment">//x,y,band values</span></div>
+<div class="line"><a name="l00463"></a><span class="lineno">  463</span>       <a class="code" href="classVector2d.html">Vector2d<double></a> writeBuffer;</div>
+<div class="line"><a name="l00464"></a><span class="lineno">  464</span>       <span class="comment">// vector<int> writeBufferClass;</span></div>
+<div class="line"><a name="l00465"></a><span class="lineno">  465</span>       vector<double> writeBufferClass;</div>
+<div class="line"><a name="l00466"></a><span class="lineno">  466</span>       vector<int> selectedClass;</div>
+<div class="line"><a name="l00467"></a><span class="lineno">  467</span>       <a class="code" href="classVector2d.html">Vector2d<double></a> selectedBuffer;</div>
+<div class="line"><a name="l00468"></a><span class="lineno">  468</span>       <span class="keywordtype">double</span> oldimgrow=-1;</div>
+<div class="line"><a name="l00469"></a><span class="lineno">  469</span>       <span class="keywordtype">int</span> irow=0;</div>
+<div class="line"><a name="l00470"></a><span class="lineno">  470</span>       <span class="keywordtype">int</span> icol=0;</div>
+<div class="line"><a name="l00471"></a><span class="lineno">  471</span>       <span class="keywordflow">if</span>(verbose_opt[0]>1)</div>
+<div class="line"><a name="l00472"></a><span class="lineno">  472</span>         std::cout << <span class="stringliteral">"extracting sample from image..."</span> << std::endl;</div>
+<div class="line"><a name="l00473"></a><span class="lineno">  473</span>       progress=0;</div>
+<div class="line"><a name="l00474"></a><span class="lineno">  474</span>       pfnProgress(progress,pszMessage,pProgressArg);</div>
+<div class="line"><a name="l00475"></a><span class="lineno">  475</span>       <span class="keywordflow">for</span>(irow=0;irow<classReader.nrOfRow();++irow){</div>
+<div class="line"><a name="l00476"></a><span class="lineno">  476</span>         <span class="keywordflow">if</span>(irow%down_opt[0])</div>
+<div class="line"><a name="l00477"></a><span class="lineno">  477</span>           <span class="keywordflow">continue</span>;</div>
+<div class="line"><a name="l00478"></a><span class="lineno">  478</span>         <span class="comment">// classReader.readData(classBuffer,GDT_Int32,irow);</span></div>
+<div class="line"><a name="l00479"></a><span class="lineno">  479</span>         classReader.readData(classBuffer,GDT_Float64,irow);</div>
+<div class="line"><a name="l00480"></a><span class="lineno">  480</span>         <span class="keywordtype">double</span> x,y;<span class="comment">//geo coordinates</span></div>
+<div class="line"><a name="l00481"></a><span class="lineno">  481</span>         <span class="keywordtype">double</span> iimg,jimg;<span class="comment">//image coordinates in img image</span></div>
+<div class="line"><a name="l00482"></a><span class="lineno">  482</span>         <span class="keywordflow">for</span>(icol=0;icol<classReader.nrOfCol();++icol){</div>
+<div class="line"><a name="l00483"></a><span class="lineno">  483</span>           <span class="keywordflow">if</span>(icol%down_opt[0])</div>
+<div class="line"><a name="l00484"></a><span class="lineno">  484</span>             <span class="keywordflow">continue</span>;</div>
+<div class="line"><a name="l00485"></a><span class="lineno">  485</span>           <span class="comment">// int theClass=0;</span></div>
+<div class="line"><a name="l00486"></a><span class="lineno">  486</span>           <span class="keywordtype">double</span> theClass=classBuffer[icol];</div>
+<div class="line"><a name="l00487"></a><span class="lineno">  487</span>           <span class="comment">// int processClass=-1;</span></div>
+<div class="line"><a name="l00488"></a><span class="lineno">  488</span>           <span class="keywordtype">int</span> processClass=0;</div>
+<div class="line"><a name="l00489"></a><span class="lineno">  489</span>           <span class="comment">// if(class_opt[0]<0){//process every class except 0</span></div>
+<div class="line"><a name="l00490"></a><span class="lineno">  490</span>           <span class="comment">//   if(classBuffer[icol]){</span></div>
+<div class="line"><a name="l00491"></a><span class="lineno">  491</span>           <span class="comment">//     processClass=0;</span></div>
+<div class="line"><a name="l00492"></a><span class="lineno">  492</span>           <span class="comment">//     theClass=classBuffer[icol];</span></div>
+<div class="line"><a name="l00493"></a><span class="lineno">  493</span>           <span class="comment">//   }</span></div>
+<div class="line"><a name="l00494"></a><span class="lineno">  494</span>           <span class="comment">// }</span></div>
+<div class="line"><a name="l00495"></a><span class="lineno">  495</span>           <span class="comment">// else{</span></div>
+<div class="line"><a name="l00496"></a><span class="lineno">  496</span>           <span class="comment">//   for(int iclass=0;iclass<class_opt.size();++iclass){</span></div>
+<div class="line"><a name="l00497"></a><span class="lineno">  497</span>           <span class="comment">//     if(classBuffer[icol]==class_opt[iclass]){</span></div>
+<div class="line"><a name="l00498"></a><span class="lineno">  498</span>           <span class="comment">//       processClass=iclass;</span></div>
+<div class="line"><a name="l00499"></a><span class="lineno">  499</span>           <span class="comment">//       theClass=class_opt[iclass];</span></div>
+<div class="line"><a name="l00500"></a><span class="lineno">  500</span>           <span class="comment">//     }</span></div>
+<div class="line"><a name="l00501"></a><span class="lineno">  501</span>           <span class="comment">//   }</span></div>
+<div class="line"><a name="l00502"></a><span class="lineno">  502</span>           <span class="comment">// }</span></div>
+<div class="line"><a name="l00503"></a><span class="lineno">  503</span>           <span class="comment">// if(processClass>=0){</span></div>
+<div class="line"><a name="l00504"></a><span class="lineno">  504</span>           <span class="keywordtype">bool</span> valid=<span class="keyword">true</span>;</div>
+<div class="line"><a name="l00505"></a><span class="lineno">  505</span>           <span class="keywordflow">if</span>(valid){</div>
+<div class="line"><a name="l00506"></a><span class="lineno">  506</span>             <span class="keywordflow">if</span>(geo_opt[0]){</div>
+<div class="line"><a name="l00507"></a><span class="lineno">  507</span>               classReader.image2geo(icol,irow,x,y);</div>
+<div class="line"><a name="l00508"></a><span class="lineno">  508</span>               sample[0]=x;</div>
+<div class="line"><a name="l00509"></a><span class="lineno">  509</span>               sample[1]=y;</div>
+<div class="line"><a name="l00510"></a><span class="lineno">  510</span>               <span class="keywordflow">if</span>(verbose_opt[0]>1){</div>
+<div class="line"><a name="l00511"></a><span class="lineno">  511</span>                 std::cout.precision(12);</div>
+<div class="line"><a name="l00512"></a><span class="lineno">  512</span>                 std::cout << theClass << <span class="stringliteral">" "</span> << x << <span class="stringliteral">" "</span> << y << std::endl;</div>
 <div class="line"><a name="l00513"></a><span class="lineno">  513</span>               }</div>
-<div class="line"><a name="l00514"></a><span class="lineno">  514</span>               <span class="keywordtype">float</span> theThreshold=(threshold_opt.size()>1)?threshold_opt[processClass]:threshold_opt[0];</div>
-<div class="line"><a name="l00515"></a><span class="lineno">  515</span>               <span class="keywordflow">if</span>(theThreshold>0){<span class="comment">//percentual value</span></div>
-<div class="line"><a name="l00516"></a><span class="lineno">  516</span>                 <span class="keywordtype">double</span> p=<span class="keyword">static_cast<</span><span class="keywordtype">double</span><span class="keyword">></span>(rand())/(RAND_MAX);</div>
-<div class="line"><a name="l00517"></a><span class="lineno">  517</span>                 p*=100.0;</div>
-<div class="line"><a name="l00518"></a><span class="lineno">  518</span>                 <span class="keywordflow">if</span>(p>theThreshold)</div>
-<div class="line"><a name="l00519"></a><span class="lineno">  519</span>           <span class="keywordflow">continue</span>;<span class="comment">//do not select for now, go to next column</span></div>
-<div class="line"><a name="l00520"></a><span class="lineno">  520</span>               }</div>
-<div class="line"><a name="l00521"></a><span class="lineno">  521</span>               <span class="keywordflow">else</span> <span class="keywordflow">if</span>(nvalid.size()>processClass){<span class="comment">//absolute value</span></div>
-<div class="line"><a name="l00522"></a><span class="lineno">  522</span>                 <span class="keywordflow">if</span>(nvalid[processClass]>=-theThreshold)</div>
-<div class="line"><a name="l00523"></a><span class="lineno">  523</span>                   <span class="keywordflow">continue</span>;<span class="comment">//do not select any more pixels for this class, go to next column to search for other classes</span></div>
-<div class="line"><a name="l00524"></a><span class="lineno">  524</span>               }</div>
-<div class="line"><a name="l00525"></a><span class="lineno">  525</span>           writeBuffer.push_back(sample);</div>
-<div class="line"><a name="l00526"></a><span class="lineno">  526</span>           writeBufferClass.push_back(theClass);</div>
-<div class="line"><a name="l00527"></a><span class="lineno">  527</span>           ++ntotalvalid;</div>
-<div class="line"><a name="l00528"></a><span class="lineno">  528</span>               <span class="keywordflow">if</span>(nvalid.size()>processClass)</div>
-<div class="line"><a name="l00529"></a><span class="lineno">  529</span>                 ++(nvalid[processClass]);</div>
-<div class="line"><a name="l00530"></a><span class="lineno">  530</span>         }</div>
-<div class="line"><a name="l00531"></a><span class="lineno">  531</span>             <span class="keywordflow">else</span>{</div>
-<div class="line"><a name="l00532"></a><span class="lineno">  532</span>               ++ntotalinvalid;</div>
-<div class="line"><a name="l00533"></a><span class="lineno">  533</span>               <span class="keywordflow">if</span>(ninvalid.size()>processClass)</div>
-<div class="line"><a name="l00534"></a><span class="lineno">  534</span>                 ++(ninvalid[processClass]);</div>
-<div class="line"><a name="l00535"></a><span class="lineno">  535</span>             }</div>
-<div class="line"><a name="l00536"></a><span class="lineno">  536</span>           }<span class="comment">//processClass</span></div>
-<div class="line"><a name="l00537"></a><span class="lineno">  537</span>         }<span class="comment">//icol</span></div>
-<div class="line"><a name="l00538"></a><span class="lineno">  538</span>         progress=<span class="keyword">static_cast<</span><span class="keywordtype">float</span><span class="keyword">></span>(irow+1.0)/classReader.nrOfRow();</div>
-<div class="line"><a name="l00539"></a><span class="lineno">  539</span>         pfnProgress(progress,pszMessage,pProgressArg);</div>
-<div class="line"><a name="l00540"></a><span class="lineno">  540</span>       }<span class="comment">//irow</span></div>
-<div class="line"><a name="l00541"></a><span class="lineno">  541</span>       progress=100;</div>
-<div class="line"><a name="l00542"></a><span class="lineno">  542</span>       pfnProgress(progress,pszMessage,pProgressArg);</div>
-<div class="line"><a name="l00543"></a><span class="lineno">  543</span>       <span class="keywordflow">if</span>(writeBuffer.size()>0){</div>
-<div class="line"><a name="l00544"></a><span class="lineno">  544</span>         assert(ntotalvalid==writeBuffer.size());</div>
-<div class="line"><a name="l00545"></a><span class="lineno">  545</span>         <span class="keywordflow">if</span>(verbose_opt[0]>0)</div>
-<div class="line"><a name="l00546"></a><span class="lineno">  546</span>           std::cout << <span class="stringliteral">"creating image sample writer "</span> << output_opt[0] << <span class="stringliteral">" with "</span> << writeBuffer.size() << <span class="stringliteral">" samples ("</span> << ntotalinvalid << <span class="stringliteral">" invalid)"</span> << std::endl;</div>
-<div class="line"><a name="l00547"></a><span class="lineno">  547</span>         ogrWriter.open(output_opt[0],ogrformat_opt[0]);</div>
-<div class="line"><a name="l00548"></a><span class="lineno">  548</span>         <span class="keywordtype">char</span>     **papszOptions=NULL;</div>
-<div class="line"><a name="l00549"></a><span class="lineno">  549</span>         ostringstream slayer;</div>
-<div class="line"><a name="l00550"></a><span class="lineno">  550</span>         slayer << <span class="stringliteral">"training data"</span>;</div>
-<div class="line"><a name="l00551"></a><span class="lineno">  551</span>         std::string layername=slayer.str();</div>
-<div class="line"><a name="l00552"></a><span class="lineno">  552</span>         ogrWriter.createLayer(layername, imgReader.getProjection(), wkbPoint, papszOptions);</div>
-<div class="line"><a name="l00553"></a><span class="lineno">  553</span>         std::string fieldname=<span class="stringliteral">"fid"</span>;<span class="comment">//number of the point</span></div>
-<div class="line"><a name="l00554"></a><span class="lineno">  554</span>         ogrWriter.createField(fieldname,OFTInteger);</div>
-<div class="line"><a name="l00555"></a><span class="lineno">  555</span>         map<std::string,double> pointAttributes;</div>
-<div class="line"><a name="l00556"></a><span class="lineno">  556</span>         ogrWriter.createField(label_opt[0],labelType);</div>
-<div class="line"><a name="l00557"></a><span class="lineno">  557</span>         <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iband=0;iband<nband;++iband){</div>
-<div class="line"><a name="l00558"></a><span class="lineno">  558</span>       <span class="keywordtype">int</span> theBand=(band_opt.size()) ? band_opt[iband] : iband;</div>
-<div class="line"><a name="l00559"></a><span class="lineno">  559</span>           ogrWriter.createField(fieldname_opt[iband],fieldType);</div>
-<div class="line"><a name="l00560"></a><span class="lineno">  560</span>         }</div>
-<div class="line"><a name="l00561"></a><span class="lineno">  561</span>         std::cout << <span class="stringliteral">"writing sample to "</span> << output_opt[0] << <span class="stringliteral">"..."</span> << std::endl;</div>
-<div class="line"><a name="l00562"></a><span class="lineno">  562</span>         progress=0;</div>
-<div class="line"><a name="l00563"></a><span class="lineno">  563</span>         pfnProgress(progress,pszMessage,pProgressArg);</div>
-<div class="line"><a name="l00564"></a><span class="lineno">  564</span>         <span class="keywordflow">for</span>(<span class="keywordtype">int</span> isample=0;isample<writeBuffer.size();++isample){</div>
-<div class="line"><a name="l00565"></a><span class="lineno">  565</span>           <span class="keywordflow">if</span>(verbose_opt[0]>1)</div>
-<div class="line"><a name="l00566"></a><span class="lineno">  566</span>             std::cout << <span class="stringliteral">"writing sample "</span> << isample << std::endl;</div>
-<div class="line"><a name="l00567"></a><span class="lineno">  567</span>           pointAttributes[label_opt[0]]=writeBufferClass[isample];</div>
-<div class="line"><a name="l00568"></a><span class="lineno">  568</span>           <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iband=0;iband<writeBuffer[0].size()-2;++iband){</div>
-<div class="line"><a name="l00569"></a><span class="lineno">  569</span>         <span class="keywordtype">int</span> theBand=(band_opt.size()) ? band_opt[iband] : iband;</div>
-<div class="line"><a name="l00570"></a><span class="lineno">  570</span>             <span class="comment">// ostringstream fs;</span></div>
-<div class="line"><a name="l00571"></a><span class="lineno">  571</span>             <span class="comment">// if(nband==1)</span></div>
-<div class="line"><a name="l00572"></a><span class="lineno">  572</span>             <span class="comment">//   fs << fieldname_opt[0];</span></div>
-<div class="line"><a name="l00573"></a><span class="lineno">  573</span>             <span class="comment">// else</span></div>
-<div class="line"><a name="l00574"></a><span class="lineno">  574</span>             <span class="comment">//   fs << fieldname_opt[0] << theBand;</span></div>
-<div class="line"><a name="l00575"></a><span class="lineno">  575</span>             <span class="comment">// pointAttributes[fs.str()]=writeBuffer[isample][iband+2];</span></div>
-<div class="line"><a name="l00576"></a><span class="lineno">  576</span>             pointAttributes[fieldname_opt[iband]]=writeBuffer[isample][iband+2];</div>
-<div class="line"><a name="l00577"></a><span class="lineno">  577</span>           }</div>
-<div class="line"><a name="l00578"></a><span class="lineno">  578</span>           <span class="keywordflow">if</span>(verbose_opt[0]>1)</div>
-<div class="line"><a name="l00579"></a><span class="lineno">  579</span>             std::cout << <span class="stringliteral">"all bands written"</span> << std::endl;</div>
-<div class="line"><a name="l00580"></a><span class="lineno">  580</span>           ogrWriter.addPoint(writeBuffer[isample][0],writeBuffer[isample][1],pointAttributes,fieldname,isample);</div>
-<div class="line"><a name="l00581"></a><span class="lineno">  581</span>           progress=<span class="keyword">static_cast<</span><span class="keywordtype">float</span><span class="keyword">></span>(isample+1.0)/writeBuffer.size();</div>
-<div class="line"><a name="l00582"></a><span class="lineno">  582</span>           pfnProgress(progress,pszMessage,pProgressArg);</div>
-<div class="line"><a name="l00583"></a><span class="lineno">  583</span>         }</div>
-<div class="line"><a name="l00584"></a><span class="lineno">  584</span>         ogrWriter.close();</div>
-<div class="line"><a name="l00585"></a><span class="lineno">  585</span>       }</div>
-<div class="line"><a name="l00586"></a><span class="lineno">  586</span>       <span class="keywordflow">else</span>{</div>
-<div class="line"><a name="l00587"></a><span class="lineno">  587</span>         std::cout << <span class="stringliteral">"No data found for any class "</span> << std::endl;</div>
-<div class="line"><a name="l00588"></a><span class="lineno">  588</span>       }</div>
-<div class="line"><a name="l00589"></a><span class="lineno">  589</span>       classReader.close();</div>
-<div class="line"><a name="l00590"></a><span class="lineno">  590</span>       nsample=writeBuffer.size();</div>
-<div class="line"><a name="l00591"></a><span class="lineno">  591</span>       <span class="keywordflow">if</span>(verbose_opt[0])</div>
-<div class="line"><a name="l00592"></a><span class="lineno">  592</span>         std::cout << <span class="stringliteral">"total number of samples written: "</span> << nsample << std::endl;</div>
-<div class="line"><a name="l00593"></a><span class="lineno">  593</span>     }</div>
-<div class="line"><a name="l00594"></a><span class="lineno">  594</span>     <span class="keywordflow">else</span>{<span class="comment">//class_opt.size()!=0</span></div>
-<div class="line"><a name="l00595"></a><span class="lineno">  595</span>       assert(class_opt[0]);</div>
-<div class="line"><a name="l00596"></a><span class="lineno">  596</span>       <span class="comment">//   if(class_opt[0]){</span></div>
-<div class="line"><a name="l00597"></a><span class="lineno">  597</span>       assert(threshold_opt.size()==1||threshold_opt.size()==class_opt.size());</div>
-<div class="line"><a name="l00598"></a><span class="lineno">  598</span>       <a class="code" href="classImgReaderGdal.html">ImgReaderGdal</a> classReader;</div>
-<div class="line"><a name="l00599"></a><span class="lineno">  599</span>       <a class="code" href="classImgWriterOgr.html">ImgWriterOgr</a> ogrWriter;</div>
-<div class="line"><a name="l00600"></a><span class="lineno">  600</span>       <span class="keywordflow">if</span>(verbose_opt[0]>1){</div>
-<div class="line"><a name="l00601"></a><span class="lineno">  601</span>         std::cout << <span class="stringliteral">"reading position from sample dataset "</span> << std::endl;</div>
-<div class="line"><a name="l00602"></a><span class="lineno">  602</span>         std::cout << <span class="stringliteral">"class thresholds: "</span> << std::endl;</div>
-<div class="line"><a name="l00603"></a><span class="lineno">  603</span>         <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iclass=0;iclass<class_opt.size();++iclass){</div>
-<div class="line"><a name="l00604"></a><span class="lineno">  604</span>           <span class="keywordflow">if</span>(threshold_opt.size()>1)</div>
-<div class="line"><a name="l00605"></a><span class="lineno">  605</span>             std::cout << class_opt[iclass] << <span class="stringliteral">": "</span> << threshold_opt[iclass] << std::endl;</div>
-<div class="line"><a name="l00606"></a><span class="lineno">  606</span>           <span class="keywordflow">else</span></div>
-<div class="line"><a name="l00607"></a><span class="lineno">  607</span>             std::cout << class_opt[iclass] << <span class="stringliteral">": "</span> << threshold_opt[0] << std::endl;</div>
-<div class="line"><a name="l00608"></a><span class="lineno">  608</span>         }</div>
-<div class="line"><a name="l00609"></a><span class="lineno">  609</span>       }</div>
-<div class="line"><a name="l00610"></a><span class="lineno">  610</span>       classReader.open(sample_opt[0]);</div>
-<div class="line"><a name="l00611"></a><span class="lineno">  611</span>       vector<int> classBuffer(classReader.nrOfCol());</div>
-<div class="line"><a name="l00612"></a><span class="lineno">  612</span>       <span class="comment">// vector<double> classBuffer(classReader.nrOfCol());</span></div>
-<div class="line"><a name="l00613"></a><span class="lineno">  613</span>       <a class="code" href="classVector2d.html">Vector2d<double></a> imgBuffer(nband);<span class="comment">//[band][col]</span></div>
-<div class="line"><a name="l00614"></a><span class="lineno">  614</span>       vector<double> sample(2+nband);<span class="comment">//x,y,band values</span></div>
-<div class="line"><a name="l00615"></a><span class="lineno">  615</span>       <a class="code" href="classVector2d.html">Vector2d<double></a> writeBuffer;</div>
-<div class="line"><a name="l00616"></a><span class="lineno">  616</span>       vector<int> writeBufferClass;</div>
-<div class="line"><a name="l00617"></a><span class="lineno">  617</span>       <span class="comment">// vector<double> writeBufferClass;</span></div>
-<div class="line"><a name="l00618"></a><span class="lineno">  618</span>       vector<int> selectedClass;</div>
-<div class="line"><a name="l00619"></a><span class="lineno">  619</span>       <a class="code" href="classVector2d.html">Vector2d<double></a> selectedBuffer;</div>
-<div class="line"><a name="l00620"></a><span class="lineno">  620</span>       <span class="keywordtype">double</span> oldimgrow=-1;</div>
-<div class="line"><a name="l00621"></a><span class="lineno">  621</span>       <span class="keywordtype">int</span> irow=0;</div>
-<div class="line"><a name="l00622"></a><span class="lineno">  622</span>       <span class="keywordtype">int</span> icol=0;</div>
-<div class="line"><a name="l00623"></a><span class="lineno">  623</span>       <span class="keywordflow">if</span>(verbose_opt[0]>1)</div>
-<div class="line"><a name="l00624"></a><span class="lineno">  624</span>         std::cout << <span class="stringliteral">"extracting sample from image..."</span> << std::endl;</div>
-<div class="line"><a name="l00625"></a><span class="lineno">  625</span>       progress=0;</div>
-<div class="line"><a name="l00626"></a><span class="lineno">  626</span>       pfnProgress(progress,pszMessage,pProgressArg);</div>
-<div class="line"><a name="l00627"></a><span class="lineno">  627</span>       <span class="keywordflow">for</span>(irow=0;irow<classReader.nrOfRow();++irow){</div>
-<div class="line"><a name="l00628"></a><span class="lineno">  628</span>         <span class="keywordflow">if</span>(irow%down_opt[0])</div>
-<div class="line"><a name="l00629"></a><span class="lineno">  629</span>           <span class="keywordflow">continue</span>;</div>
-<div class="line"><a name="l00630"></a><span class="lineno">  630</span>         classReader.readData(classBuffer,GDT_Int32,irow);</div>
-<div class="line"><a name="l00631"></a><span class="lineno">  631</span>         <span class="comment">// classReader.readData(classBuffer,GDT_Float64,irow);</span></div>
-<div class="line"><a name="l00632"></a><span class="lineno">  632</span>         <span class="keywordtype">double</span> x,y;<span class="comment">//geo coordinates</span></div>
-<div class="line"><a name="l00633"></a><span class="lineno">  633</span>         <span class="keywordtype">double</span> iimg,jimg;<span class="comment">//image coordinates in img image</span></div>
-<div class="line"><a name="l00634"></a><span class="lineno">  634</span>         <span class="keywordflow">for</span>(icol=0;icol<classReader.nrOfCol();++icol){</div>
-<div class="line"><a name="l00635"></a><span class="lineno">  635</span>           <span class="keywordflow">if</span>(icol%down_opt[0])</div>
-<div class="line"><a name="l00636"></a><span class="lineno">  636</span>             <span class="keywordflow">continue</span>;</div>
-<div class="line"><a name="l00637"></a><span class="lineno">  637</span>           <span class="keywordtype">int</span> theClass=0;</div>
-<div class="line"><a name="l00638"></a><span class="lineno">  638</span>           <span class="comment">// double theClass=0;</span></div>
-<div class="line"><a name="l00639"></a><span class="lineno">  639</span>           <span class="keywordtype">int</span> processClass=-1;</div>
-<div class="line"><a name="l00640"></a><span class="lineno">  640</span>           <span class="keywordflow">if</span>(class_opt.empty()){<span class="comment">//process every class</span></div>
-<div class="line"><a name="l00641"></a><span class="lineno">  641</span>             <span class="keywordflow">if</span>(classBuffer[icol]){</div>
-<div class="line"><a name="l00642"></a><span class="lineno">  642</span>               processClass=0;</div>
-<div class="line"><a name="l00643"></a><span class="lineno">  643</span>               theClass=classBuffer[icol];</div>
-<div class="line"><a name="l00644"></a><span class="lineno">  644</span>             }</div>
-<div class="line"><a name="l00645"></a><span class="lineno">  645</span>           }</div>
-<div class="line"><a name="l00646"></a><span class="lineno">  646</span>           <span class="keywordflow">else</span>{</div>
-<div class="line"><a name="l00647"></a><span class="lineno">  647</span>             <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iclass=0;iclass<class_opt.size();++iclass){</div>
-<div class="line"><a name="l00648"></a><span class="lineno">  648</span>               <span class="keywordflow">if</span>(classBuffer[icol]==class_opt[iclass]){</div>
-<div class="line"><a name="l00649"></a><span class="lineno">  649</span>                 processClass=iclass;</div>
-<div class="line"><a name="l00650"></a><span class="lineno">  650</span>                 theClass=class_opt[iclass];</div>
-<div class="line"><a name="l00651"></a><span class="lineno">  651</span>               }</div>
-<div class="line"><a name="l00652"></a><span class="lineno">  652</span>             }</div>
-<div class="line"><a name="l00653"></a><span class="lineno">  653</span>           }</div>
-<div class="line"><a name="l00654"></a><span class="lineno">  654</span>           <span class="keywordflow">if</span>(processClass>=0){</div>
-<div class="line"><a name="l00655"></a><span class="lineno">  655</span>             <span class="comment">//         if(classBuffer[icol]==class_opt[0]){</span></div>
-<div class="line"><a name="l00656"></a><span class="lineno">  656</span>             <span class="keywordflow">if</span>(geo_opt[0]){</div>
-<div class="line"><a name="l00657"></a><span class="lineno">  657</span>               classReader.image2geo(icol,irow,x,y);</div>
-<div class="line"><a name="l00658"></a><span class="lineno">  658</span>               sample[0]=x;</div>
-<div class="line"><a name="l00659"></a><span class="lineno">  659</span>               sample[1]=y;</div>
-<div class="line"><a name="l00660"></a><span class="lineno">  660</span>               <span class="keywordflow">if</span>(verbose_opt[0]>1){</div>
-<div class="line"><a name="l00661"></a><span class="lineno">  661</span>                 std::cout.precision(12);</div>
-<div class="line"><a name="l00662"></a><span class="lineno">  662</span>                 std::cout << theClass << <span class="stringliteral">" "</span> << x << <span class="stringliteral">" "</span> << y << std::endl;</div>
-<div class="line"><a name="l00663"></a><span class="lineno">  663</span>               }</div>
-<div class="line"><a name="l00664"></a><span class="lineno">  664</span>               <span class="comment">//find col in img</span></div>
-<div class="line"><a name="l00665"></a><span class="lineno">  665</span>               imgReader.geo2image(x,y,iimg,jimg);</div>
-<div class="line"><a name="l00666"></a><span class="lineno">  666</span>               <span class="comment">//nearest neighbour</span></div>
-<div class="line"><a name="l00667"></a><span class="lineno">  667</span>               jimg=<span class="keyword">static_cast<</span><span class="keywordtype">int</span><span class="keyword">></span>(jimg);</div>
-<div class="line"><a name="l00668"></a><span class="lineno">  668</span>               iimg=<span class="keyword">static_cast<</span><span class="keywordtype">int</span><span class="keyword">></span>(iimg);</div>
-<div class="line"><a name="l00669"></a><span class="lineno">  669</span>               <span class="keywordflow">if</span>(static_cast<int>(iimg)<0||<span class="keyword">static_cast<</span><span class="keywordtype">int</span><span class="keyword">></span>(iimg)>=imgReader.nrOfCol())</div>
-<div class="line"><a name="l00670"></a><span class="lineno">  670</span>                 <span class="keywordflow">continue</span>;</div>
-<div class="line"><a name="l00671"></a><span class="lineno">  671</span>             }</div>
-<div class="line"><a name="l00672"></a><span class="lineno">  672</span>             <span class="keywordflow">else</span>{</div>
-<div class="line"><a name="l00673"></a><span class="lineno">  673</span>               iimg=icol;</div>
-<div class="line"><a name="l00674"></a><span class="lineno">  674</span>               jimg=irow;</div>
-<div class="line"><a name="l00675"></a><span class="lineno">  675</span>               sample[0]=iimg;</div>
-<div class="line"><a name="l00676"></a><span class="lineno">  676</span>               sample[1]=jimg;</div>
-<div class="line"><a name="l00677"></a><span class="lineno">  677</span>             }</div>
-<div class="line"><a name="l00678"></a><span class="lineno">  678</span>             <span class="keywordflow">if</span>(static_cast<int>(jimg)<0||<span class="keyword">static_cast<</span><span class="keywordtype">int</span><span class="keyword">></span>(jimg)>=imgReader.nrOfRow())</div>
-<div class="line"><a name="l00679"></a><span class="lineno">  679</span>               <span class="keywordflow">continue</span>;</div>
-<div class="line"><a name="l00680"></a><span class="lineno">  680</span> </div>
-<div class="line"><a name="l00681"></a><span class="lineno">  681</span>             <span class="keywordtype">bool</span> valid=<span class="keyword">true</span>;</div>
-<div class="line"><a name="l00682"></a><span class="lineno">  682</span> </div>
-<div class="line"><a name="l00683"></a><span class="lineno">  683</span>             <span class="keywordflow">if</span>(static_cast<int>(jimg)!=<span class="keyword">static_cast<</span><span class="keywordtype">int</span><span class="keyword">></span>(oldimgrow)){</div>
-<div class="line"><a name="l00684"></a><span class="lineno">  684</span>               assert(imgBuffer.size()==nband);</div>
-<div class="line"><a name="l00685"></a><span class="lineno">  685</span>               <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iband=0;iband<nband;++iband){</div>
-<div class="line"><a name="l00686"></a><span class="lineno">  686</span>         <span class="keywordtype">int</span> theBand=(band_opt.size()) ? band_opt[iband] : iband;</div>
-<div class="line"><a name="l00687"></a><span class="lineno">  687</span>                 imgReader.readData(imgBuffer[iband],GDT_Float64,static_cast<int>(jimg),theBand);</div>
-<div class="line"><a name="l00688"></a><span class="lineno">  688</span>                 assert(imgBuffer[iband].size()==imgReader.nrOfCol());</div>
-<div class="line"><a name="l00689"></a><span class="lineno">  689</span> </div>
-<div class="line"><a name="l00690"></a><span class="lineno">  690</span>         <span class="keywordflow">if</span>(srcnodata_opt.size()){</div>
-<div class="line"><a name="l00691"></a><span class="lineno">  691</span>           vector<int>::const_iterator bndit=bndnodata_opt.begin();</div>
-<div class="line"><a name="l00692"></a><span class="lineno">  692</span>           vector<double>::const_iterator srcit=srcnodata_opt.begin();</div>
-<div class="line"><a name="l00693"></a><span class="lineno">  693</span>           <span class="keywordflow">while</span>(bndit!=bndnodata_opt.end()&&srcit!=srcnodata_opt.end()){</div>
-<div class="line"><a name="l00694"></a><span class="lineno">  694</span>             <span class="keywordflow">if</span>((*bndit==theBand)&&(*srcit==imgBuffer[iband][<span class="keyword">static_cast<</span><span class="keywordtype">int</span><span class="keyword">></span>(iimg)])){</div>
-<div class="line"><a name="l00695"></a><span class="lineno">  695</span>               valid=<span class="keyword">false</span>;</div>
-<div class="line"><a name="l00696"></a><span class="lineno">  696</span>               <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l00697"></a><span class="lineno">  697</span>             }</div>
-<div class="line"><a name="l00698"></a><span class="lineno">  698</span>             <span class="keywordflow">else</span>{</div>
-<div class="line"><a name="l00699"></a><span class="lineno">  699</span>               ++bndit;</div>
-<div class="line"><a name="l00700"></a><span class="lineno">  700</span>               ++srcit;</div>
-<div class="line"><a name="l00701"></a><span class="lineno">  701</span>             }</div>
-<div class="line"><a name="l00702"></a><span class="lineno">  702</span>           }</div>
-<div class="line"><a name="l00703"></a><span class="lineno">  703</span>         }</div>
-<div class="line"><a name="l00704"></a><span class="lineno">  704</span>               }</div>
-<div class="line"><a name="l00705"></a><span class="lineno">  705</span>               oldimgrow=jimg;</div>
-<div class="line"><a name="l00706"></a><span class="lineno">  706</span>             }</div>
-<div class="line"><a name="l00707"></a><span class="lineno">  707</span>             <span class="keywordflow">if</span>(valid){</div>
-<div class="line"><a name="l00708"></a><span class="lineno">  708</span>               <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iband=0;iband<imgBuffer.size();++iband){</div>
-<div class="line"><a name="l00709"></a><span class="lineno">  709</span>                 <span class="keywordflow">if</span>(imgBuffer[iband].size()!=imgReader.nrOfCol()){</div>
-<div class="line"><a name="l00710"></a><span class="lineno">  710</span>                   std::cout << <span class="stringliteral">"Error in band "</span> << iband << <span class="stringliteral">": "</span> << imgBuffer[iband].size() << <span class="stringliteral">"!="</span> << imgReader.nrOfCol() << std::endl;</div>
-<div class="line"><a name="l00711"></a><span class="lineno">  711</span>                   assert(imgBuffer[iband].size()==imgReader.nrOfCol());</div>
-<div class="line"><a name="l00712"></a><span class="lineno">  712</span>                 }</div>
-<div class="line"><a name="l00713"></a><span class="lineno">  713</span>                 sample[iband+2]=imgBuffer[iband][<span class="keyword">static_cast<</span><span class="keywordtype">int</span><span class="keyword">></span>(iimg)];</div>
+<div class="line"><a name="l00514"></a><span class="lineno">  514</span>               <span class="comment">//find col in img</span></div>
+<div class="line"><a name="l00515"></a><span class="lineno">  515</span>               imgReader.geo2image(x,y,iimg,jimg);</div>
+<div class="line"><a name="l00516"></a><span class="lineno">  516</span>               <span class="comment">//nearest neighbour</span></div>
+<div class="line"><a name="l00517"></a><span class="lineno">  517</span>               jimg=<span class="keyword">static_cast<</span><span class="keywordtype">int</span><span class="keyword">></span>(jimg);</div>
+<div class="line"><a name="l00518"></a><span class="lineno">  518</span>               iimg=<span class="keyword">static_cast<</span><span class="keywordtype">int</span><span class="keyword">></span>(iimg);</div>
+<div class="line"><a name="l00519"></a><span class="lineno">  519</span>               <span class="keywordflow">if</span>(static_cast<int>(iimg)<0||<span class="keyword">static_cast<</span><span class="keywordtype">int</span><span class="keyword">></span>(iimg)>=imgReader.nrOfCol())</div>
+<div class="line"><a name="l00520"></a><span class="lineno">  520</span>                 <span class="keywordflow">continue</span>;</div>
+<div class="line"><a name="l00521"></a><span class="lineno">  521</span>             }</div>
+<div class="line"><a name="l00522"></a><span class="lineno">  522</span>             <span class="keywordflow">else</span>{</div>
+<div class="line"><a name="l00523"></a><span class="lineno">  523</span>               iimg=icol;</div>
+<div class="line"><a name="l00524"></a><span class="lineno">  524</span>               jimg=irow;</div>
+<div class="line"><a name="l00525"></a><span class="lineno">  525</span>               sample[0]=iimg;</div>
+<div class="line"><a name="l00526"></a><span class="lineno">  526</span>               sample[1]=jimg;</div>
+<div class="line"><a name="l00527"></a><span class="lineno">  527</span>             }</div>
+<div class="line"><a name="l00528"></a><span class="lineno">  528</span>             <span class="keywordflow">if</span>(static_cast<int>(jimg)<0||<span class="keyword">static_cast<</span><span class="keywordtype">int</span><span class="keyword">></span>(jimg)>=imgReader.nrOfRow())</div>
+<div class="line"><a name="l00529"></a><span class="lineno">  529</span>               <span class="keywordflow">continue</span>;</div>
+<div class="line"><a name="l00530"></a><span class="lineno">  530</span> </div>
+<div class="line"><a name="l00531"></a><span class="lineno">  531</span>             <span class="keywordtype">bool</span> valid=<span class="keyword">true</span>;</div>
+<div class="line"><a name="l00532"></a><span class="lineno">  532</span> </div>
+<div class="line"><a name="l00533"></a><span class="lineno">  533</span>             <span class="keywordflow">if</span>(static_cast<int>(jimg)!=<span class="keyword">static_cast<</span><span class="keywordtype">int</span><span class="keyword">></span>(oldimgrow)){</div>
+<div class="line"><a name="l00534"></a><span class="lineno">  534</span>               assert(imgBuffer.size()==nband);</div>
+<div class="line"><a name="l00535"></a><span class="lineno">  535</span>               <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iband=0;iband<nband;++iband){</div>
+<div class="line"><a name="l00536"></a><span class="lineno">  536</span>         <span class="keywordtype">int</span> theBand=(band_opt.size()) ? band_opt[iband] : iband;</div>
+<div class="line"><a name="l00537"></a><span class="lineno">  537</span>                 imgReader.readData(imgBuffer[iband],GDT_Float64,static_cast<int>(jimg),theBand);</div>
+<div class="line"><a name="l00538"></a><span class="lineno">  538</span>                 assert(imgBuffer[iband].size()==imgReader.nrOfCol());</div>
+<div class="line"><a name="l00539"></a><span class="lineno">  539</span>         <span class="keywordflow">if</span>(srcnodata_opt.size()){</div>
+<div class="line"><a name="l00540"></a><span class="lineno">  540</span>           vector<int>::const_iterator bndit=bndnodata_opt.begin();</div>
+<div class="line"><a name="l00541"></a><span class="lineno">  541</span>           vector<double>::const_iterator srcit=srcnodata_opt.begin();</div>
+<div class="line"><a name="l00542"></a><span class="lineno">  542</span>           <span class="keywordflow">while</span>(bndit!=bndnodata_opt.end()&&srcit!=srcnodata_opt.end()){</div>
+<div class="line"><a name="l00543"></a><span class="lineno">  543</span>             <span class="keywordflow">if</span>((*bndit==theBand)&&(*srcit==imgBuffer[iband][<span class="keyword">static_cast<</span><span class="keywordtype">int</span><span class="keyword">></span>(iimg)])){</div>
+<div class="line"><a name="l00544"></a><span class="lineno">  544</span>               valid=<span class="keyword">false</span>;</div>
+<div class="line"><a name="l00545"></a><span class="lineno">  545</span>               <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l00546"></a><span class="lineno">  546</span>             }</div>
+<div class="line"><a name="l00547"></a><span class="lineno">  547</span>             <span class="keywordflow">else</span>{</div>
+<div class="line"><a name="l00548"></a><span class="lineno">  548</span>               ++bndit;</div>
+<div class="line"><a name="l00549"></a><span class="lineno">  549</span>               ++srcit;</div>
+<div class="line"><a name="l00550"></a><span class="lineno">  550</span>             }</div>
+<div class="line"><a name="l00551"></a><span class="lineno">  551</span>           }</div>
+<div class="line"><a name="l00552"></a><span class="lineno">  552</span>         }</div>
+<div class="line"><a name="l00553"></a><span class="lineno">  553</span>           }</div>
+<div class="line"><a name="l00554"></a><span class="lineno">  554</span>               oldimgrow=jimg;</div>
+<div class="line"><a name="l00555"></a><span class="lineno">  555</span>         }</div>
+<div class="line"><a name="l00556"></a><span class="lineno">  556</span> </div>
+<div class="line"><a name="l00557"></a><span class="lineno">  557</span>             <span class="keywordflow">if</span>(valid){</div>
+<div class="line"><a name="l00558"></a><span class="lineno">  558</span>               <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iband=0;iband<imgBuffer.size();++iband){</div>
+<div class="line"><a name="l00559"></a><span class="lineno">  559</span>                 <span class="keywordflow">if</span>(imgBuffer[iband].size()!=imgReader.nrOfCol()){</div>
+<div class="line"><a name="l00560"></a><span class="lineno">  560</span>                   std::cout << <span class="stringliteral">"Error in band "</span> << iband << <span class="stringliteral">": "</span> << imgBuffer[iband].size() << <span class="stringliteral">"!="</span> << imgReader.nrOfCol() << std::endl;</div>
+<div class="line"><a name="l00561"></a><span class="lineno">  561</span>                   assert(imgBuffer[iband].size()==imgReader.nrOfCol());</div>
+<div class="line"><a name="l00562"></a><span class="lineno">  562</span>                 }</div>
+<div class="line"><a name="l00563"></a><span class="lineno">  563</span>                 sample[iband+2]=imgBuffer[iband][<span class="keyword">static_cast<</span><span class="keywordtype">int</span><span class="keyword">></span>(iimg)];</div>
+<div class="line"><a name="l00564"></a><span class="lineno">  564</span>               }</div>
+<div class="line"><a name="l00565"></a><span class="lineno">  565</span>               <span class="keywordtype">float</span> theThreshold=(threshold_opt.size()>1)?threshold_opt[processClass]:threshold_opt[0];</div>
+<div class="line"><a name="l00566"></a><span class="lineno">  566</span>               <span class="keywordflow">if</span>(theThreshold>0){<span class="comment">//percentual value</span></div>
+<div class="line"><a name="l00567"></a><span class="lineno">  567</span>                 <span class="keywordtype">double</span> p=<span class="keyword">static_cast<</span><span class="keywordtype">double</span><span class="keyword">></span>(rand())/(RAND_MAX);</div>
+<div class="line"><a name="l00568"></a><span class="lineno">  568</span>                 p*=100.0;</div>
+<div class="line"><a name="l00569"></a><span class="lineno">  569</span>                 <span class="keywordflow">if</span>(p>theThreshold)</div>
+<div class="line"><a name="l00570"></a><span class="lineno">  570</span>           <span class="keywordflow">continue</span>;<span class="comment">//do not select for now, go to next column</span></div>
+<div class="line"><a name="l00571"></a><span class="lineno">  571</span>               }</div>
+<div class="line"><a name="l00572"></a><span class="lineno">  572</span>               <span class="keywordflow">else</span> <span class="keywordflow">if</span>(nvalid.size()>processClass){<span class="comment">//absolute value</span></div>
+<div class="line"><a name="l00573"></a><span class="lineno">  573</span>                 <span class="keywordflow">if</span>(nvalid[processClass]>=-theThreshold)</div>
+<div class="line"><a name="l00574"></a><span class="lineno">  574</span>                   <span class="keywordflow">continue</span>;<span class="comment">//do not select any more pixels for this class, go to next column to search for other classes</span></div>
+<div class="line"><a name="l00575"></a><span class="lineno">  575</span>               }</div>
+<div class="line"><a name="l00576"></a><span class="lineno">  576</span>           writeBuffer.push_back(sample);</div>
+<div class="line"><a name="l00577"></a><span class="lineno">  577</span>           writeBufferClass.push_back(theClass);</div>
+<div class="line"><a name="l00578"></a><span class="lineno">  578</span>           ++ntotalvalid;</div>
+<div class="line"><a name="l00579"></a><span class="lineno">  579</span>               <span class="keywordflow">if</span>(nvalid.size()>processClass)</div>
+<div class="line"><a name="l00580"></a><span class="lineno">  580</span>                 ++(nvalid[processClass]);</div>
+<div class="line"><a name="l00581"></a><span class="lineno">  581</span>         }</div>
+<div class="line"><a name="l00582"></a><span class="lineno">  582</span>             <span class="keywordflow">else</span>{</div>
+<div class="line"><a name="l00583"></a><span class="lineno">  583</span>               ++ntotalinvalid;</div>
+<div class="line"><a name="l00584"></a><span class="lineno">  584</span>               <span class="keywordflow">if</span>(ninvalid.size()>processClass)</div>
+<div class="line"><a name="l00585"></a><span class="lineno">  585</span>                 ++(ninvalid[processClass]);</div>
+<div class="line"><a name="l00586"></a><span class="lineno">  586</span>             }</div>
+<div class="line"><a name="l00587"></a><span class="lineno">  587</span>           }<span class="comment">//processClass</span></div>
+<div class="line"><a name="l00588"></a><span class="lineno">  588</span>         }<span class="comment">//icol</span></div>
+<div class="line"><a name="l00589"></a><span class="lineno">  589</span>         progress=<span class="keyword">static_cast<</span><span class="keywordtype">float</span><span class="keyword">></span>(irow+1.0)/classReader.nrOfRow();</div>
+<div class="line"><a name="l00590"></a><span class="lineno">  590</span>         pfnProgress(progress,pszMessage,pProgressArg);</div>
+<div class="line"><a name="l00591"></a><span class="lineno">  591</span>       }<span class="comment">//irow</span></div>
+<div class="line"><a name="l00592"></a><span class="lineno">  592</span>       progress=100;</div>
+<div class="line"><a name="l00593"></a><span class="lineno">  593</span>       pfnProgress(progress,pszMessage,pProgressArg);</div>
+<div class="line"><a name="l00594"></a><span class="lineno">  594</span>       <span class="keywordflow">if</span>(writeBuffer.size()>0){</div>
+<div class="line"><a name="l00595"></a><span class="lineno">  595</span>         assert(ntotalvalid==writeBuffer.size());</div>
+<div class="line"><a name="l00596"></a><span class="lineno">  596</span>         <span class="keywordflow">if</span>(verbose_opt[0]>0)</div>
+<div class="line"><a name="l00597"></a><span class="lineno">  597</span>           std::cout << <span class="stringliteral">"creating image sample writer "</span> << output_opt[0] << <span class="stringliteral">" with "</span> << writeBuffer.size() << <span class="stringliteral">" samples ("</span> << ntotalinvalid << <span class="stringliteral">" invalid)"</span> << std::endl;</div>
+<div class="line"><a name="l00598"></a><span class="lineno">  598</span>         ogrWriter.open(output_opt[0],ogrformat_opt[0]);</div>
+<div class="line"><a name="l00599"></a><span class="lineno">  599</span>         <span class="keywordtype">char</span>     **papszOptions=NULL;</div>
+<div class="line"><a name="l00600"></a><span class="lineno">  600</span>         ostringstream slayer;</div>
+<div class="line"><a name="l00601"></a><span class="lineno">  601</span>         slayer << <span class="stringliteral">"training data"</span>;</div>
+<div class="line"><a name="l00602"></a><span class="lineno">  602</span>         std::string layername=slayer.str();</div>
+<div class="line"><a name="l00603"></a><span class="lineno">  603</span>         ogrWriter.createLayer(layername, imgReader.getProjection(), wkbPoint, papszOptions);</div>
+<div class="line"><a name="l00604"></a><span class="lineno">  604</span>         std::string fieldname=<span class="stringliteral">"fid"</span>;<span class="comment">//number of the point</span></div>
+<div class="line"><a name="l00605"></a><span class="lineno">  605</span>         ogrWriter.createField(fieldname,OFTInteger);</div>
+<div class="line"><a name="l00606"></a><span class="lineno">  606</span>         map<std::string,double> pointAttributes;</div>
+<div class="line"><a name="l00607"></a><span class="lineno">  607</span>         ogrWriter.createField(label_opt[0],labelType);</div>
+<div class="line"><a name="l00608"></a><span class="lineno">  608</span>         <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iband=0;iband<nband;++iband){</div>
+<div class="line"><a name="l00609"></a><span class="lineno">  609</span>       <span class="keywordtype">int</span> theBand=(band_opt.size()) ? band_opt[iband] : iband;</div>
+<div class="line"><a name="l00610"></a><span class="lineno">  610</span>           ogrWriter.createField(fieldname_opt[iband],fieldType);</div>
+<div class="line"><a name="l00611"></a><span class="lineno">  611</span>         }</div>
+<div class="line"><a name="l00612"></a><span class="lineno">  612</span>         std::cout << <span class="stringliteral">"writing sample to "</span> << output_opt[0] << <span class="stringliteral">"..."</span> << std::endl;</div>
+<div class="line"><a name="l00613"></a><span class="lineno">  613</span>         progress=0;</div>
+<div class="line"><a name="l00614"></a><span class="lineno">  614</span>         pfnProgress(progress,pszMessage,pProgressArg);</div>
+<div class="line"><a name="l00615"></a><span class="lineno">  615</span>         <span class="keywordflow">for</span>(<span class="keywordtype">int</span> isample=0;isample<writeBuffer.size();++isample){</div>
+<div class="line"><a name="l00616"></a><span class="lineno">  616</span>           <span class="keywordflow">if</span>(verbose_opt[0]>1)</div>
+<div class="line"><a name="l00617"></a><span class="lineno">  617</span>             std::cout << <span class="stringliteral">"writing sample "</span> << isample << std::endl;</div>
+<div class="line"><a name="l00618"></a><span class="lineno">  618</span>           pointAttributes[label_opt[0]]=writeBufferClass[isample];</div>
+<div class="line"><a name="l00619"></a><span class="lineno">  619</span>           <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iband=0;iband<writeBuffer[0].size()-2;++iband){</div>
+<div class="line"><a name="l00620"></a><span class="lineno">  620</span>         <span class="keywordtype">int</span> theBand=(band_opt.size()) ? band_opt[iband] : iband;</div>
+<div class="line"><a name="l00621"></a><span class="lineno">  621</span>             <span class="comment">// ostringstream fs;</span></div>
+<div class="line"><a name="l00622"></a><span class="lineno">  622</span>             <span class="comment">// if(nband==1)</span></div>
+<div class="line"><a name="l00623"></a><span class="lineno">  623</span>             <span class="comment">//   fs << fieldname_opt[0];</span></div>
+<div class="line"><a name="l00624"></a><span class="lineno">  624</span>             <span class="comment">// else</span></div>
+<div class="line"><a name="l00625"></a><span class="lineno">  625</span>             <span class="comment">//   fs << fieldname_opt[0] << theBand;</span></div>
+<div class="line"><a name="l00626"></a><span class="lineno">  626</span>             <span class="comment">// pointAttributes[fs.str()]=writeBuffer[isample][iband+2];</span></div>
+<div class="line"><a name="l00627"></a><span class="lineno">  627</span>             pointAttributes[fieldname_opt[iband]]=writeBuffer[isample][iband+2];</div>
+<div class="line"><a name="l00628"></a><span class="lineno">  628</span>           }</div>
+<div class="line"><a name="l00629"></a><span class="lineno">  629</span>           <span class="keywordflow">if</span>(verbose_opt[0]>1)</div>
+<div class="line"><a name="l00630"></a><span class="lineno">  630</span>             std::cout << <span class="stringliteral">"all bands written"</span> << std::endl;</div>
+<div class="line"><a name="l00631"></a><span class="lineno">  631</span>           ogrWriter.addPoint(writeBuffer[isample][0],writeBuffer[isample][1],pointAttributes,fieldname,isample);</div>
+<div class="line"><a name="l00632"></a><span class="lineno">  632</span>           progress=<span class="keyword">static_cast<</span><span class="keywordtype">float</span><span class="keyword">></span>(isample+1.0)/writeBuffer.size();</div>
+<div class="line"><a name="l00633"></a><span class="lineno">  633</span>           pfnProgress(progress,pszMessage,pProgressArg);</div>
+<div class="line"><a name="l00634"></a><span class="lineno">  634</span>         }</div>
+<div class="line"><a name="l00635"></a><span class="lineno">  635</span>         ogrWriter.close();</div>
+<div class="line"><a name="l00636"></a><span class="lineno">  636</span>       }</div>
+<div class="line"><a name="l00637"></a><span class="lineno">  637</span>       <span class="keywordflow">else</span>{</div>
+<div class="line"><a name="l00638"></a><span class="lineno">  638</span>         std::cout << <span class="stringliteral">"No data found for any class "</span> << std::endl;</div>
+<div class="line"><a name="l00639"></a><span class="lineno">  639</span>       }</div>
+<div class="line"><a name="l00640"></a><span class="lineno">  640</span>       classReader.close();</div>
+<div class="line"><a name="l00641"></a><span class="lineno">  641</span>       nsample=writeBuffer.size();</div>
+<div class="line"><a name="l00642"></a><span class="lineno">  642</span>       <span class="keywordflow">if</span>(verbose_opt[0])</div>
+<div class="line"><a name="l00643"></a><span class="lineno">  643</span>         std::cout << <span class="stringliteral">"total number of samples written: "</span> << nsample << std::endl;</div>
+<div class="line"><a name="l00644"></a><span class="lineno">  644</span>     }</div>
+<div class="line"><a name="l00645"></a><span class="lineno">  645</span>     <span class="keywordflow">else</span>{<span class="comment">//class_opt.size()!=0</span></div>
+<div class="line"><a name="l00646"></a><span class="lineno">  646</span>       assert(class_opt[0]);</div>
+<div class="line"><a name="l00647"></a><span class="lineno">  647</span>       <span class="comment">//   if(class_opt[0]){</span></div>
+<div class="line"><a name="l00648"></a><span class="lineno">  648</span>       assert(threshold_opt.size()==1||threshold_opt.size()==class_opt.size());</div>
+<div class="line"><a name="l00649"></a><span class="lineno">  649</span>       <a class="code" href="classImgReaderGdal.html">ImgReaderGdal</a> classReader;</div>
+<div class="line"><a name="l00650"></a><span class="lineno">  650</span>       <a class="code" href="classImgWriterOgr.html">ImgWriterOgr</a> ogrWriter;</div>
+<div class="line"><a name="l00651"></a><span class="lineno">  651</span>       <span class="keywordflow">if</span>(verbose_opt[0]>1){</div>
+<div class="line"><a name="l00652"></a><span class="lineno">  652</span>         std::cout << <span class="stringliteral">"reading position from sample dataset "</span> << std::endl;</div>
+<div class="line"><a name="l00653"></a><span class="lineno">  653</span>         std::cout << <span class="stringliteral">"class thresholds: "</span> << std::endl;</div>
+<div class="line"><a name="l00654"></a><span class="lineno">  654</span>         <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iclass=0;iclass<class_opt.size();++iclass){</div>
+<div class="line"><a name="l00655"></a><span class="lineno">  655</span>           <span class="keywordflow">if</span>(threshold_opt.size()>1)</div>
+<div class="line"><a name="l00656"></a><span class="lineno">  656</span>             std::cout << class_opt[iclass] << <span class="stringliteral">": "</span> << threshold_opt[iclass] << std::endl;</div>
+<div class="line"><a name="l00657"></a><span class="lineno">  657</span>           <span class="keywordflow">else</span></div>
+<div class="line"><a name="l00658"></a><span class="lineno">  658</span>             std::cout << class_opt[iclass] << <span class="stringliteral">": "</span> << threshold_opt[0] << std::endl;</div>
+<div class="line"><a name="l00659"></a><span class="lineno">  659</span>         }</div>
+<div class="line"><a name="l00660"></a><span class="lineno">  660</span>       }</div>
+<div class="line"><a name="l00661"></a><span class="lineno">  661</span>       classReader.open(sample_opt[0]);</div>
+<div class="line"><a name="l00662"></a><span class="lineno">  662</span>       vector<int> classBuffer(classReader.nrOfCol());</div>
+<div class="line"><a name="l00663"></a><span class="lineno">  663</span>       <span class="comment">// vector<double> classBuffer(classReader.nrOfCol());</span></div>
+<div class="line"><a name="l00664"></a><span class="lineno">  664</span>       <a class="code" href="classVector2d.html">Vector2d<double></a> imgBuffer(nband);<span class="comment">//[band][col]</span></div>
+<div class="line"><a name="l00665"></a><span class="lineno">  665</span>       vector<double> sample(2+nband);<span class="comment">//x,y,band values</span></div>
+<div class="line"><a name="l00666"></a><span class="lineno">  666</span>       <a class="code" href="classVector2d.html">Vector2d<double></a> writeBuffer;</div>
+<div class="line"><a name="l00667"></a><span class="lineno">  667</span>       vector<int> writeBufferClass;</div>
+<div class="line"><a name="l00668"></a><span class="lineno">  668</span>       <span class="comment">// vector<double> writeBufferClass;</span></div>
+<div class="line"><a name="l00669"></a><span class="lineno">  669</span>       vector<int> selectedClass;</div>
+<div class="line"><a name="l00670"></a><span class="lineno">  670</span>       <a class="code" href="classVector2d.html">Vector2d<double></a> selectedBuffer;</div>
+<div class="line"><a name="l00671"></a><span class="lineno">  671</span>       <span class="keywordtype">double</span> oldimgrow=-1;</div>
+<div class="line"><a name="l00672"></a><span class="lineno">  672</span>       <span class="keywordtype">int</span> irow=0;</div>
+<div class="line"><a name="l00673"></a><span class="lineno">  673</span>       <span class="keywordtype">int</span> icol=0;</div>
+<div class="line"><a name="l00674"></a><span class="lineno">  674</span>       <span class="keywordflow">if</span>(verbose_opt[0]>1)</div>
+<div class="line"><a name="l00675"></a><span class="lineno">  675</span>         std::cout << <span class="stringliteral">"extracting sample from image..."</span> << std::endl;</div>
+<div class="line"><a name="l00676"></a><span class="lineno">  676</span>       progress=0;</div>
+<div class="line"><a name="l00677"></a><span class="lineno">  677</span>       pfnProgress(progress,pszMessage,pProgressArg);</div>
+<div class="line"><a name="l00678"></a><span class="lineno">  678</span>       <span class="keywordflow">for</span>(irow=0;irow<classReader.nrOfRow();++irow){</div>
+<div class="line"><a name="l00679"></a><span class="lineno">  679</span>         <span class="keywordflow">if</span>(irow%down_opt[0])</div>
+<div class="line"><a name="l00680"></a><span class="lineno">  680</span>           <span class="keywordflow">continue</span>;</div>
+<div class="line"><a name="l00681"></a><span class="lineno">  681</span>         classReader.readData(classBuffer,GDT_Int32,irow);</div>
+<div class="line"><a name="l00682"></a><span class="lineno">  682</span>         <span class="comment">// classReader.readData(classBuffer,GDT_Float64,irow);</span></div>
+<div class="line"><a name="l00683"></a><span class="lineno">  683</span>         <span class="keywordtype">double</span> x,y;<span class="comment">//geo coordinates</span></div>
+<div class="line"><a name="l00684"></a><span class="lineno">  684</span>         <span class="keywordtype">double</span> iimg,jimg;<span class="comment">//image coordinates in img image</span></div>
+<div class="line"><a name="l00685"></a><span class="lineno">  685</span>         <span class="keywordflow">for</span>(icol=0;icol<classReader.nrOfCol();++icol){</div>
+<div class="line"><a name="l00686"></a><span class="lineno">  686</span>           <span class="keywordflow">if</span>(icol%down_opt[0])</div>
+<div class="line"><a name="l00687"></a><span class="lineno">  687</span>             <span class="keywordflow">continue</span>;</div>
+<div class="line"><a name="l00688"></a><span class="lineno">  688</span>           <span class="keywordtype">int</span> theClass=0;</div>
+<div class="line"><a name="l00689"></a><span class="lineno">  689</span>           <span class="comment">// double theClass=0;</span></div>
+<div class="line"><a name="l00690"></a><span class="lineno">  690</span>           <span class="keywordtype">int</span> processClass=-1;</div>
+<div class="line"><a name="l00691"></a><span class="lineno">  691</span>           <span class="keywordflow">if</span>(class_opt.empty()){<span class="comment">//process every class</span></div>
+<div class="line"><a name="l00692"></a><span class="lineno">  692</span>             <span class="keywordflow">if</span>(classBuffer[icol]){</div>
+<div class="line"><a name="l00693"></a><span class="lineno">  693</span>               processClass=0;</div>
+<div class="line"><a name="l00694"></a><span class="lineno">  694</span>               theClass=classBuffer[icol];</div>
+<div class="line"><a name="l00695"></a><span class="lineno">  695</span>             }</div>
+<div class="line"><a name="l00696"></a><span class="lineno">  696</span>           }</div>
+<div class="line"><a name="l00697"></a><span class="lineno">  697</span>           <span class="keywordflow">else</span>{</div>
+<div class="line"><a name="l00698"></a><span class="lineno">  698</span>             <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iclass=0;iclass<class_opt.size();++iclass){</div>
+<div class="line"><a name="l00699"></a><span class="lineno">  699</span>               <span class="keywordflow">if</span>(classBuffer[icol]==class_opt[iclass]){</div>
+<div class="line"><a name="l00700"></a><span class="lineno">  700</span>                 processClass=iclass;</div>
+<div class="line"><a name="l00701"></a><span class="lineno">  701</span>                 theClass=class_opt[iclass];</div>
+<div class="line"><a name="l00702"></a><span class="lineno">  702</span>               }</div>
+<div class="line"><a name="l00703"></a><span class="lineno">  703</span>             }</div>
+<div class="line"><a name="l00704"></a><span class="lineno">  704</span>           }</div>
+<div class="line"><a name="l00705"></a><span class="lineno">  705</span>           <span class="keywordflow">if</span>(processClass>=0){</div>
+<div class="line"><a name="l00706"></a><span class="lineno">  706</span>             <span class="comment">//         if(classBuffer[icol]==class_opt[0]){</span></div>
+<div class="line"><a name="l00707"></a><span class="lineno">  707</span>             <span class="keywordflow">if</span>(geo_opt[0]){</div>
+<div class="line"><a name="l00708"></a><span class="lineno">  708</span>               classReader.image2geo(icol,irow,x,y);</div>
+<div class="line"><a name="l00709"></a><span class="lineno">  709</span>               sample[0]=x;</div>
+<div class="line"><a name="l00710"></a><span class="lineno">  710</span>               sample[1]=y;</div>
+<div class="line"><a name="l00711"></a><span class="lineno">  711</span>               <span class="keywordflow">if</span>(verbose_opt[0]>1){</div>
+<div class="line"><a name="l00712"></a><span class="lineno">  712</span>                 std::cout.precision(12);</div>
+<div class="line"><a name="l00713"></a><span class="lineno">  713</span>                 std::cout << theClass << <span class="stringliteral">" "</span> << x << <span class="stringliteral">" "</span> << y << std::endl;</div>
 <div class="line"><a name="l00714"></a><span class="lineno">  714</span>               }</div>
-<div class="line"><a name="l00715"></a><span class="lineno">  715</span>               <span class="keywordtype">float</span> theThreshold=(threshold_opt.size()>1)?threshold_opt[processClass]:threshold_opt[0];</div>
-<div class="line"><a name="l00716"></a><span class="lineno">  716</span>               <span class="keywordflow">if</span>(theThreshold>0){<span class="comment">//percentual value</span></div>
-<div class="line"><a name="l00717"></a><span class="lineno">  717</span>                 <span class="keywordtype">double</span> p=<span class="keyword">static_cast<</span><span class="keywordtype">double</span><span class="keyword">></span>(rand())/(RAND_MAX);</div>
-<div class="line"><a name="l00718"></a><span class="lineno">  718</span>                 p*=100.0;</div>
-<div class="line"><a name="l00719"></a><span class="lineno">  719</span>                 <span class="keywordflow">if</span>(p>theThreshold)</div>
-<div class="line"><a name="l00720"></a><span class="lineno">  720</span>                   <span class="keywordflow">continue</span>;<span class="comment">//do not select for now, go to next column</span></div>
-<div class="line"><a name="l00721"></a><span class="lineno">  721</span>               }</div>
-<div class="line"><a name="l00722"></a><span class="lineno">  722</span>               <span class="keywordflow">else</span> <span class="keywordflow">if</span>(nvalid.size()>processClass){<span class="comment">//absolute value</span></div>
-<div class="line"><a name="l00723"></a><span class="lineno">  723</span>                 <span class="keywordflow">if</span>(nvalid[processClass]>=-theThreshold)</div>
-<div class="line"><a name="l00724"></a><span class="lineno">  724</span>                   <span class="keywordflow">continue</span>;<span class="comment">//do not select any more pixels for this class, go to next column to search for other classes</span></div>
-<div class="line"><a name="l00725"></a><span class="lineno">  725</span>               }</div>
-<div class="line"><a name="l00726"></a><span class="lineno">  726</span>               writeBuffer.push_back(sample);</div>
-<div class="line"><a name="l00727"></a><span class="lineno">  727</span>               <span class="comment">//             writeBufferClass.push_back(class_opt[processClass]);</span></div>
-<div class="line"><a name="l00728"></a><span class="lineno">  728</span>               writeBufferClass.push_back(theClass);</div>
-<div class="line"><a name="l00729"></a><span class="lineno">  729</span>               ++ntotalvalid;</div>
-<div class="line"><a name="l00730"></a><span class="lineno">  730</span>               <span class="keywordflow">if</span>(nvalid.size()>processClass)</div>
-<div class="line"><a name="l00731"></a><span class="lineno">  731</span>                 ++(nvalid[processClass]);</div>
-<div class="line"><a name="l00732"></a><span class="lineno">  732</span>             }</div>
-<div class="line"><a name="l00733"></a><span class="lineno">  733</span>             <span class="keywordflow">else</span>{</div>
-<div class="line"><a name="l00734"></a><span class="lineno">  734</span>               ++ntotalinvalid;</div>
-<div class="line"><a name="l00735"></a><span class="lineno">  735</span>               <span class="keywordflow">if</span>(ninvalid.size()>processClass)</div>
-<div class="line"><a name="l00736"></a><span class="lineno">  736</span>                 ++(ninvalid[processClass]);</div>
-<div class="line"><a name="l00737"></a><span class="lineno">  737</span>             }</div>
-<div class="line"><a name="l00738"></a><span class="lineno">  738</span>           }<span class="comment">//processClass</span></div>
-<div class="line"><a name="l00739"></a><span class="lineno">  739</span>         }<span class="comment">//icol</span></div>
-<div class="line"><a name="l00740"></a><span class="lineno">  740</span>         progress=<span class="keyword">static_cast<</span><span class="keywordtype">float</span><span class="keyword">></span>(irow+1.0)/classReader.nrOfRow();</div>
-<div class="line"><a name="l00741"></a><span class="lineno">  741</span>         pfnProgress(progress,pszMessage,pProgressArg);</div>
-<div class="line"><a name="l00742"></a><span class="lineno">  742</span>       }<span class="comment">//irow</span></div>
-<div class="line"><a name="l00743"></a><span class="lineno">  743</span>       <span class="keywordflow">if</span>(writeBuffer.size()>0){</div>
-<div class="line"><a name="l00744"></a><span class="lineno">  744</span>         assert(ntotalvalid==writeBuffer.size());</div>
-<div class="line"><a name="l00745"></a><span class="lineno">  745</span>         <span class="keywordflow">if</span>(verbose_opt[0]>0)</div>
-<div class="line"><a name="l00746"></a><span class="lineno">  746</span>           std::cout << <span class="stringliteral">"creating image sample writer "</span> << output_opt[0] << <span class="stringliteral">" with "</span> << writeBuffer.size() << <span class="stringliteral">" samples ("</span> << ntotalinvalid << <span class="stringliteral">" invalid)"</span> << std::endl;</div>
-<div class="line"><a name="l00747"></a><span class="lineno">  747</span>         ogrWriter.open(output_opt[0],ogrformat_opt[0]);</div>
-<div class="line"><a name="l00748"></a><span class="lineno">  748</span>         <span class="keywordtype">char</span>     **papszOptions=NULL;</div>
-<div class="line"><a name="l00749"></a><span class="lineno">  749</span>         ostringstream slayer;</div>
-<div class="line"><a name="l00750"></a><span class="lineno">  750</span>         slayer << <span class="stringliteral">"training data"</span>;</div>
-<div class="line"><a name="l00751"></a><span class="lineno">  751</span>         std::string layername=slayer.str();</div>
-<div class="line"><a name="l00752"></a><span class="lineno">  752</span>         ogrWriter.createLayer(layername, imgReader.getProjection(), wkbPoint, papszOptions);</div>
-<div class="line"><a name="l00753"></a><span class="lineno">  753</span>         std::string fieldname=<span class="stringliteral">"fid"</span>;<span class="comment">//number of the point</span></div>
-<div class="line"><a name="l00754"></a><span class="lineno">  754</span>         ogrWriter.createField(fieldname,OFTInteger);</div>
-<div class="line"><a name="l00755"></a><span class="lineno">  755</span>         map<std::string,double> pointAttributes;</div>
-<div class="line"><a name="l00756"></a><span class="lineno">  756</span>         <span class="comment">//         ogrWriter.createField(label_opt[0],OFTInteger);</span></div>
-<div class="line"><a name="l00757"></a><span class="lineno">  757</span>         ogrWriter.createField(label_opt[0],labelType);</div>
-<div class="line"><a name="l00758"></a><span class="lineno">  758</span>         <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iband=0;iband<nband;++iband){</div>
-<div class="line"><a name="l00759"></a><span class="lineno">  759</span>       <span class="keywordtype">int</span> theBand=(band_opt.size()) ? band_opt[iband] : iband;</div>
-<div class="line"><a name="l00760"></a><span class="lineno">  760</span>           <span class="comment">// ostringstream fs;</span></div>
-<div class="line"><a name="l00761"></a><span class="lineno">  761</span>           <span class="comment">// if(nband==1)</span></div>
-<div class="line"><a name="l00762"></a><span class="lineno">  762</span>           <span class="comment">//   fs << fieldname_opt[0];</span></div>
-<div class="line"><a name="l00763"></a><span class="lineno">  763</span>           <span class="comment">// else</span></div>
-<div class="line"><a name="l00764"></a><span class="lineno">  764</span>           <span class="comment">//   fs << fieldname_opt[0] << theBand;</span></div>
-<div class="line"><a name="l00765"></a><span class="lineno">  765</span>           <span class="comment">// ogrWriter.createField(fs.str(),fieldType);</span></div>
-<div class="line"><a name="l00766"></a><span class="lineno">  766</span>           ogrWriter.createField(fieldname_opt[iband],fieldType);</div>
-<div class="line"><a name="l00767"></a><span class="lineno">  767</span>         }</div>
-<div class="line"><a name="l00768"></a><span class="lineno">  768</span>         pfnProgress(progress,pszMessage,pProgressArg);</div>
-<div class="line"><a name="l00769"></a><span class="lineno">  769</span>         std::cout << <span class="stringliteral">"writing sample to "</span> << output_opt[0] << <span class="stringliteral">"..."</span> << std::endl;</div>
-<div class="line"><a name="l00770"></a><span class="lineno">  770</span>         progress=0;</div>
-<div class="line"><a name="l00771"></a><span class="lineno">  771</span>         pfnProgress(progress,pszMessage,pProgressArg);</div>
-<div class="line"><a name="l00772"></a><span class="lineno">  772</span>         <span class="keywordflow">for</span>(<span class="keywordtype">int</span> isample=0;isample<writeBuffer.size();++isample){</div>
-<div class="line"><a name="l00773"></a><span class="lineno">  773</span>           pointAttributes[label_opt[0]]=writeBufferClass[isample];</div>
-<div class="line"><a name="l00774"></a><span class="lineno">  774</span>           <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iband=0;iband<writeBuffer[0].size()-2;++iband){</div>
-<div class="line"><a name="l00775"></a><span class="lineno">  775</span>         <span class="keywordtype">int</span> theBand=(band_opt.size()) ? band_opt[iband] : iband;</div>
-<div class="line"><a name="l00776"></a><span class="lineno">  776</span>             <span class="comment">// ostringstream fs;</span></div>
-<div class="line"><a name="l00777"></a><span class="lineno">  777</span>             <span class="comment">// if(nband==1)</span></div>
-<div class="line"><a name="l00778"></a><span class="lineno">  778</span>             <span class="comment">//   fs << fieldname_opt[0];</span></div>
-<div class="line"><a name="l00779"></a><span class="lineno">  779</span>             <span class="comment">// else</span></div>
-<div class="line"><a name="l00780"></a><span class="lineno">  780</span>             <span class="comment">//   fs << fieldname_opt[0] << theBand;</span></div>
-<div class="line"><a name="l00781"></a><span class="lineno">  781</span>             <span class="comment">// pointAttributes[fs.str()]=writeBuffer[isample][iband+2];</span></div>
-<div class="line"><a name="l00782"></a><span class="lineno">  782</span>             pointAttributes[fieldname_opt[iband]]=writeBuffer[isample][iband+2];</div>
-<div class="line"><a name="l00783"></a><span class="lineno">  783</span>           }</div>
-<div class="line"><a name="l00784"></a><span class="lineno">  784</span>           ogrWriter.addPoint(writeBuffer[isample][0],writeBuffer[isample][1],pointAttributes,fieldname,isample);</div>
-<div class="line"><a name="l00785"></a><span class="lineno">  785</span>           progress=<span class="keyword">static_cast<</span><span class="keywordtype">float</span><span class="keyword">></span>(isample+1.0)/writeBuffer.size();</div>
-<div class="line"><a name="l00786"></a><span class="lineno">  786</span>           pfnProgress(progress,pszMessage,pProgressArg);</div>
-<div class="line"><a name="l00787"></a><span class="lineno">  787</span>         }</div>
-<div class="line"><a name="l00788"></a><span class="lineno">  788</span>         ogrWriter.close();</div>
-<div class="line"><a name="l00789"></a><span class="lineno">  789</span>       }</div>
-<div class="line"><a name="l00790"></a><span class="lineno">  790</span>       <span class="keywordflow">else</span>{</div>
-<div class="line"><a name="l00791"></a><span class="lineno">  791</span>         std::cout << <span class="stringliteral">"No data found for any class "</span> << std::endl;</div>
-<div class="line"><a name="l00792"></a><span class="lineno">  792</span>       }</div>
-<div class="line"><a name="l00793"></a><span class="lineno">  793</span>       classReader.close();</div>
-<div class="line"><a name="l00794"></a><span class="lineno">  794</span>       nsample=writeBuffer.size();</div>
-<div class="line"><a name="l00795"></a><span class="lineno">  795</span>       <span class="keywordflow">if</span>(verbose_opt[0]){</div>
-<div class="line"><a name="l00796"></a><span class="lineno">  796</span>         std::cout << <span class="stringliteral">"total number of samples written: "</span> << nsample << std::endl;</div>
-<div class="line"><a name="l00797"></a><span class="lineno">  797</span>         <span class="keywordflow">if</span>(nvalid.size()==class_opt.size()){</div>
-<div class="line"><a name="l00798"></a><span class="lineno">  798</span>           <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iclass=0;iclass<class_opt.size();++iclass)</div>
-<div class="line"><a name="l00799"></a><span class="lineno">  799</span>             std::cout << <span class="stringliteral">"class "</span> << class_opt[iclass] << <span class="stringliteral">" has "</span> << nvalid[iclass] << <span class="stringliteral">" samples"</span> << std::endl;</div>
-<div class="line"><a name="l00800"></a><span class="lineno">  800</span>         }</div>
-<div class="line"><a name="l00801"></a><span class="lineno">  801</span>       }</div>
-<div class="line"><a name="l00802"></a><span class="lineno">  802</span>     }</div>
-<div class="line"><a name="l00803"></a><span class="lineno">  803</span>   }</div>
-<div class="line"><a name="l00804"></a><span class="lineno">  804</span>   <span class="keywordflow">else</span>{<span class="comment">//vector dataset</span></div>
-<div class="line"><a name="l00805"></a><span class="lineno">  805</span>     <span class="keywordflow">if</span>(verbose_opt[0]>1)</div>
-<div class="line"><a name="l00806"></a><span class="lineno">  806</span>       std::cout << <span class="stringliteral">"creating image sample writer "</span> << output_opt[0] << std::endl;</div>
-<div class="line"><a name="l00807"></a><span class="lineno">  807</span>     <a class="code" href="classImgWriterOgr.html">ImgWriterOgr</a> ogrWriter;</div>
-<div class="line"><a name="l00808"></a><span class="lineno">  808</span>     <a class="code" href="classImgWriterOgr.html">ImgWriterOgr</a> ogrTestWriter;</div>
-<div class="line"><a name="l00809"></a><span class="lineno">  809</span>     ogrWriter.open(output_opt[0],ogrformat_opt[0]);</div>
-<div class="line"><a name="l00810"></a><span class="lineno">  810</span>     <span class="keywordflow">if</span>(test_opt.size()){</div>
-<div class="line"><a name="l00811"></a><span class="lineno">  811</span>       <span class="keywordflow">if</span>(verbose_opt[0]>1)</div>
-<div class="line"><a name="l00812"></a><span class="lineno">  812</span>     std::cout << <span class="stringliteral">"creating image test writer "</span> << test_opt[0] << std::endl;</div>
-<div class="line"><a name="l00813"></a><span class="lineno">  813</span>       <span class="keywordflow">try</span>{</div>
-<div class="line"><a name="l00814"></a><span class="lineno">  814</span>     ogrTestWriter.open(test_opt[0],ogrformat_opt[0]);</div>
-<div class="line"><a name="l00815"></a><span class="lineno">  815</span>       }</div>
-<div class="line"><a name="l00816"></a><span class="lineno">  816</span>       <span class="keywordflow">catch</span>(<span class="keywordtype">string</span> errorString){</div>
-<div class="line"><a name="l00817"></a><span class="lineno">  817</span>     cerr << errorString << endl;</div>
-<div class="line"><a name="l00818"></a><span class="lineno">  818</span>       }</div>
-<div class="line"><a name="l00819"></a><span class="lineno">  819</span>     }</div>
-<div class="line"><a name="l00820"></a><span class="lineno">  820</span>     <span class="comment">//support multiple layers</span></div>
-<div class="line"><a name="l00821"></a><span class="lineno">  821</span>     <span class="keywordtype">int</span> nlayerRead=sampleReaderOgr.getDataSource()->GetLayerCount();</div>
-<div class="line"><a name="l00822"></a><span class="lineno">  822</span>     <span class="keywordtype">int</span> ilayerWrite=0;</div>
-<div class="line"><a name="l00823"></a><span class="lineno">  823</span>     <span class="keywordflow">if</span>(verbose_opt[0])</div>
-<div class="line"><a name="l00824"></a><span class="lineno">  824</span>       std::cout << <span class="stringliteral">"number of layers: "</span> << nlayerRead << endl;</div>
-<div class="line"><a name="l00825"></a><span class="lineno">  825</span>       </div>
-<div class="line"><a name="l00826"></a><span class="lineno">  826</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> ilayer=0;ilayer<nlayerRead;++ilayer){</div>
-<div class="line"><a name="l00827"></a><span class="lineno">  827</span>       OGRLayer *readLayer=sampleReaderOgr.getLayer(ilayer);</div>
-<div class="line"><a name="l00828"></a><span class="lineno">  828</span>       <span class="keywordtype">string</span> currentLayername=readLayer->GetName();</div>
-<div class="line"><a name="l00829"></a><span class="lineno">  829</span>       <span class="keywordflow">if</span>(layer_opt.size())</div>
-<div class="line"><a name="l00830"></a><span class="lineno">  830</span>     <span class="keywordflow">if</span>(find(layer_opt.begin(),layer_opt.end(),currentLayername)==layer_opt.end())</div>
-<div class="line"><a name="l00831"></a><span class="lineno">  831</span>       <span class="keywordflow">continue</span>;</div>
-<div class="line"><a name="l00832"></a><span class="lineno">  832</span>       cout << <span class="stringliteral">"processing layer "</span> << currentLayername << endl;</div>
-<div class="line"><a name="l00833"></a><span class="lineno">  833</span>       </div>
-<div class="line"><a name="l00834"></a><span class="lineno">  834</span>       readLayer->ResetReading();</div>
-<div class="line"><a name="l00835"></a><span class="lineno">  835</span>       OGRLayer *writeLayer;</div>
-<div class="line"><a name="l00836"></a><span class="lineno">  836</span>       OGRLayer *writeTestLayer;</div>
-<div class="line"><a name="l00837"></a><span class="lineno">  837</span> </div>
-<div class="line"><a name="l00838"></a><span class="lineno">  838</span>       <span class="keywordflow">if</span>(polygon_opt[0]){</div>
-<div class="line"><a name="l00839"></a><span class="lineno">  839</span>     <span class="keywordflow">if</span>(verbose_opt[0])</div>
-<div class="line"><a name="l00840"></a><span class="lineno">  840</span>       std::cout << <span class="stringliteral">"create polygons"</span> << std::endl;</div>
-<div class="line"><a name="l00841"></a><span class="lineno">  841</span>     <span class="keywordtype">char</span> **papszOptions=NULL;</div>
-<div class="line"><a name="l00842"></a><span class="lineno">  842</span>     writeLayer=ogrWriter.createLayer(readLayer->GetName(), imgReader.getProjection(), wkbPolygon, papszOptions);</div>
-<div class="line"><a name="l00843"></a><span class="lineno">  843</span>     <span class="keywordflow">if</span>(test_opt.size())</div>
-<div class="line"><a name="l00844"></a><span class="lineno">  844</span>       writeTestLayer=ogrTestWriter.createLayer(readLayer->GetName(), imgReader.getProjection(), wkbPolygon, papszOptions);</div>
-<div class="line"><a name="l00845"></a><span class="lineno">  845</span>       }</div>
-<div class="line"><a name="l00846"></a><span class="lineno">  846</span>       <span class="keywordflow">else</span>{</div>
-<div class="line"><a name="l00847"></a><span class="lineno">  847</span>     <span class="keywordflow">if</span>(verbose_opt[0])</div>
-<div class="line"><a name="l00848"></a><span class="lineno">  848</span>       std::cout << <span class="stringliteral">"create points in layer "</span> << readLayer->GetName() << std::endl;</div>
-<div class="line"><a name="l00849"></a><span class="lineno">  849</span>     <span class="keywordtype">char</span> **papszOptions=NULL;</div>
-<div class="line"><a name="l00850"></a><span class="lineno">  850</span> </div>
-<div class="line"><a name="l00851"></a><span class="lineno">  851</span>     writeLayer=ogrWriter.createLayer(readLayer->GetName(), imgReader.getProjection(), wkbPoint, papszOptions);</div>
-<div class="line"><a name="l00852"></a><span class="lineno">  852</span>     <span class="keywordflow">if</span>(test_opt.size()){</div>
-<div class="line"><a name="l00853"></a><span class="lineno">  853</span>       <span class="keywordtype">char</span> **papszOptions=NULL;</div>
-<div class="line"><a name="l00854"></a><span class="lineno">  854</span>       writeTestLayer=ogrTestWriter.createLayer(readLayer->GetName(), imgReader.getProjection(), wkbPoint, papszOptions);</div>
-<div class="line"><a name="l00855"></a><span class="lineno">  855</span>     }</div>
-<div class="line"><a name="l00856"></a><span class="lineno">  856</span>       }</div>
-<div class="line"><a name="l00857"></a><span class="lineno">  857</span>       <span class="keywordflow">if</span>(verbose_opt[0])</div>
-<div class="line"><a name="l00858"></a><span class="lineno">  858</span>     std::cout << <span class="stringliteral">"copy fields from layer "</span> << ilayer << std::flush << std::endl;</div>
-<div class="line"><a name="l00859"></a><span class="lineno">  859</span>       ogrWriter.copyFields(sampleReaderOgr,ilayer,ilayerWrite);</div>
-<div class="line"><a name="l00860"></a><span class="lineno">  860</span> </div>
-<div class="line"><a name="l00861"></a><span class="lineno">  861</span>       <span class="keywordflow">if</span>(test_opt.size()){</div>
-<div class="line"><a name="l00862"></a><span class="lineno">  862</span>     <span class="keywordflow">if</span>(verbose_opt[0])</div>
-<div class="line"><a name="l00863"></a><span class="lineno">  863</span>       std::cout << <span class="stringliteral">"copy fields test writer"</span> << std::flush << std::endl;</div>
-<div class="line"><a name="l00864"></a><span class="lineno">  864</span>     ogrTestWriter.copyFields(sampleReaderOgr,ilayer,ilayerWrite);</div>
-<div class="line"><a name="l00865"></a><span class="lineno">  865</span>       }</div>
-<div class="line"><a name="l00866"></a><span class="lineno">  866</span>       <span class="comment">// vector<std::string> fieldnames;</span></div>
-<div class="line"><a name="l00867"></a><span class="lineno">  867</span>       <span class="comment">// if(verbose_opt[0])</span></div>
-<div class="line"><a name="l00868"></a><span class="lineno">  868</span>       <span class="comment">//    std::cout << "get fields" << std::flush << std::endl;</span></div>
-<div class="line"><a name="l00869"></a><span class="lineno">  869</span>       <span class="comment">// sampleReaderOgr.getFields(fieldnames);</span></div>
-<div class="line"><a name="l00870"></a><span class="lineno">  870</span>       <span class="comment">// assert(fieldnames.size()==ogrWriter.getFieldCount(ilayerWrite));</span></div>
-<div class="line"><a name="l00871"></a><span class="lineno">  871</span>       <span class="comment">// map<std::string,double> pointAttributes;</span></div>
-<div class="line"><a name="l00872"></a><span class="lineno">  872</span> </div>
-<div class="line"><a name="l00873"></a><span class="lineno">  873</span>       <span class="keywordflow">if</span>(class_opt.size()){</div>
-<div class="line"><a name="l00874"></a><span class="lineno">  874</span>     <span class="keywordflow">switch</span>(ruleMap[rule_opt[0]]){</div>
-<div class="line"><a name="l00875"></a><span class="lineno">  875</span>     <span class="keywordflow">case</span>(rule::proportion):{<span class="comment">//proportion for each class</span></div>
-<div class="line"><a name="l00876"></a><span class="lineno">  876</span>       <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iclass=0;iclass<class_opt.size();++iclass){</div>
-<div class="line"><a name="l00877"></a><span class="lineno">  877</span>         ostringstream cs;</div>
-<div class="line"><a name="l00878"></a><span class="lineno">  878</span>         cs << class_opt[iclass];</div>
-<div class="line"><a name="l00879"></a><span class="lineno">  879</span>         ogrWriter.createField(cs.str(),fieldType,ilayerWrite);</div>
-<div class="line"><a name="l00880"></a><span class="lineno">  880</span>       }</div>
-<div class="line"><a name="l00881"></a><span class="lineno">  881</span>       <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l00882"></a><span class="lineno">  882</span>     }</div>
-<div class="line"><a name="l00883"></a><span class="lineno">  883</span>     <span class="keywordflow">case</span>(rule::custom):</div>
-<div class="line"><a name="l00884"></a><span class="lineno">  884</span>     <span class="keywordflow">case</span>(rule::mode):</div>
-<div class="line"><a name="l00885"></a><span class="lineno">  885</span>       ogrWriter.createField(label_opt[0],fieldType,ilayerWrite);</div>
-<div class="line"><a name="l00886"></a><span class="lineno">  886</span>     <span class="keywordflow">if</span>(test_opt.size())</div>
-<div class="line"><a name="l00887"></a><span class="lineno">  887</span>       ogrTestWriter.createField(label_opt[0],fieldType,ilayerWrite);</div>
-<div class="line"><a name="l00888"></a><span class="lineno">  888</span>     <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l00889"></a><span class="lineno">  889</span>     }</div>
+<div class="line"><a name="l00715"></a><span class="lineno">  715</span>               <span class="comment">//find col in img</span></div>
+<div class="line"><a name="l00716"></a><span class="lineno">  716</span>               imgReader.geo2image(x,y,iimg,jimg);</div>
+<div class="line"><a name="l00717"></a><span class="lineno">  717</span>               <span class="comment">//nearest neighbour</span></div>
+<div class="line"><a name="l00718"></a><span class="lineno">  718</span>               jimg=<span class="keyword">static_cast<</span><span class="keywordtype">int</span><span class="keyword">></span>(jimg);</div>
+<div class="line"><a name="l00719"></a><span class="lineno">  719</span>               iimg=<span class="keyword">static_cast<</span><span class="keywordtype">int</span><span class="keyword">></span>(iimg);</div>
+<div class="line"><a name="l00720"></a><span class="lineno">  720</span>               <span class="keywordflow">if</span>(static_cast<int>(iimg)<0||<span class="keyword">static_cast<</span><span class="keywordtype">int</span><span class="keyword">></span>(iimg)>=imgReader.nrOfCol())</div>
+<div class="line"><a name="l00721"></a><span class="lineno">  721</span>                 <span class="keywordflow">continue</span>;</div>
+<div class="line"><a name="l00722"></a><span class="lineno">  722</span>             }</div>
+<div class="line"><a name="l00723"></a><span class="lineno">  723</span>             <span class="keywordflow">else</span>{</div>
+<div class="line"><a name="l00724"></a><span class="lineno">  724</span>               iimg=icol;</div>
+<div class="line"><a name="l00725"></a><span class="lineno">  725</span>               jimg=irow;</div>
+<div class="line"><a name="l00726"></a><span class="lineno">  726</span>               sample[0]=iimg;</div>
+<div class="line"><a name="l00727"></a><span class="lineno">  727</span>               sample[1]=jimg;</div>
+<div class="line"><a name="l00728"></a><span class="lineno">  728</span>             }</div>
+<div class="line"><a name="l00729"></a><span class="lineno">  729</span>             <span class="keywordflow">if</span>(static_cast<int>(jimg)<0||<span class="keyword">static_cast<</span><span class="keywordtype">int</span><span class="keyword">></span>(jimg)>=imgReader.nrOfRow())</div>
+<div class="line"><a name="l00730"></a><span class="lineno">  730</span>               <span class="keywordflow">continue</span>;</div>
+<div class="line"><a name="l00731"></a><span class="lineno">  731</span> </div>
+<div class="line"><a name="l00732"></a><span class="lineno">  732</span>             <span class="keywordtype">bool</span> valid=<span class="keyword">true</span>;</div>
+<div class="line"><a name="l00733"></a><span class="lineno">  733</span> </div>
+<div class="line"><a name="l00734"></a><span class="lineno">  734</span>             <span class="keywordflow">if</span>(static_cast<int>(jimg)!=<span class="keyword">static_cast<</span><span class="keywordtype">int</span><span class="keyword">></span>(oldimgrow)){</div>
+<div class="line"><a name="l00735"></a><span class="lineno">  735</span>               assert(imgBuffer.size()==nband);</div>
+<div class="line"><a name="l00736"></a><span class="lineno">  736</span>               <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iband=0;iband<nband;++iband){</div>
+<div class="line"><a name="l00737"></a><span class="lineno">  737</span>         <span class="keywordtype">int</span> theBand=(band_opt.size()) ? band_opt[iband] : iband;</div>
+<div class="line"><a name="l00738"></a><span class="lineno">  738</span>                 imgReader.readData(imgBuffer[iband],GDT_Float64,static_cast<int>(jimg),theBand);</div>
+<div class="line"><a name="l00739"></a><span class="lineno">  739</span>                 assert(imgBuffer[iband].size()==imgReader.nrOfCol());</div>
+<div class="line"><a name="l00740"></a><span class="lineno">  740</span> </div>
+<div class="line"><a name="l00741"></a><span class="lineno">  741</span>         <span class="keywordflow">if</span>(srcnodata_opt.size()){</div>
+<div class="line"><a name="l00742"></a><span class="lineno">  742</span>           vector<int>::const_iterator bndit=bndnodata_opt.begin();</div>
+<div class="line"><a name="l00743"></a><span class="lineno">  743</span>           vector<double>::const_iterator srcit=srcnodata_opt.begin();</div>
+<div class="line"><a name="l00744"></a><span class="lineno">  744</span>           <span class="keywordflow">while</span>(bndit!=bndnodata_opt.end()&&srcit!=srcnodata_opt.end()){</div>
+<div class="line"><a name="l00745"></a><span class="lineno">  745</span>             <span class="keywordflow">if</span>((*bndit==theBand)&&(*srcit==imgBuffer[iband][<span class="keyword">static_cast<</span><span class="keywordtype">int</span><span class="keyword">></span>(iimg)])){</div>
+<div class="line"><a name="l00746"></a><span class="lineno">  746</span>               valid=<span class="keyword">false</span>;</div>
+<div class="line"><a name="l00747"></a><span class="lineno">  747</span>               <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l00748"></a><span class="lineno">  748</span>             }</div>
+<div class="line"><a name="l00749"></a><span class="lineno">  749</span>             <span class="keywordflow">else</span>{</div>
+<div class="line"><a name="l00750"></a><span class="lineno">  750</span>               ++bndit;</div>
+<div class="line"><a name="l00751"></a><span class="lineno">  751</span>               ++srcit;</div>
+<div class="line"><a name="l00752"></a><span class="lineno">  752</span>             }</div>
+<div class="line"><a name="l00753"></a><span class="lineno">  753</span>           }</div>
+<div class="line"><a name="l00754"></a><span class="lineno">  754</span>         }</div>
+<div class="line"><a name="l00755"></a><span class="lineno">  755</span>               }</div>
+<div class="line"><a name="l00756"></a><span class="lineno">  756</span>               oldimgrow=jimg;</div>
+<div class="line"><a name="l00757"></a><span class="lineno">  757</span>             }</div>
+<div class="line"><a name="l00758"></a><span class="lineno">  758</span>             <span class="keywordflow">if</span>(valid){</div>
+<div class="line"><a name="l00759"></a><span class="lineno">  759</span>               <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iband=0;iband<imgBuffer.size();++iband){</div>
+<div class="line"><a name="l00760"></a><span class="lineno">  760</span>                 <span class="keywordflow">if</span>(imgBuffer[iband].size()!=imgReader.nrOfCol()){</div>
+<div class="line"><a name="l00761"></a><span class="lineno">  761</span>                   std::cout << <span class="stringliteral">"Error in band "</span> << iband << <span class="stringliteral">": "</span> << imgBuffer[iband].size() << <span class="stringliteral">"!="</span> << imgReader.nrOfCol() << std::endl;</div>
+<div class="line"><a name="l00762"></a><span class="lineno">  762</span>                   assert(imgBuffer[iband].size()==imgReader.nrOfCol());</div>
+<div class="line"><a name="l00763"></a><span class="lineno">  763</span>                 }</div>
+<div class="line"><a name="l00764"></a><span class="lineno">  764</span>                 sample[iband+2]=imgBuffer[iband][<span class="keyword">static_cast<</span><span class="keywordtype">int</span><span class="keyword">></span>(iimg)];</div>
+<div class="line"><a name="l00765"></a><span class="lineno">  765</span>               }</div>
+<div class="line"><a name="l00766"></a><span class="lineno">  766</span>               <span class="keywordtype">float</span> theThreshold=(threshold_opt.size()>1)?threshold_opt[processClass]:threshold_opt[0];</div>
+<div class="line"><a name="l00767"></a><span class="lineno">  767</span>               <span class="keywordflow">if</span>(theThreshold>0){<span class="comment">//percentual value</span></div>
+<div class="line"><a name="l00768"></a><span class="lineno">  768</span>                 <span class="keywordtype">double</span> p=<span class="keyword">static_cast<</span><span class="keywordtype">double</span><span class="keyword">></span>(rand())/(RAND_MAX);</div>
+<div class="line"><a name="l00769"></a><span class="lineno">  769</span>                 p*=100.0;</div>
+<div class="line"><a name="l00770"></a><span class="lineno">  770</span>                 <span class="keywordflow">if</span>(p>theThreshold)</div>
+<div class="line"><a name="l00771"></a><span class="lineno">  771</span>                   <span class="keywordflow">continue</span>;<span class="comment">//do not select for now, go to next column</span></div>
+<div class="line"><a name="l00772"></a><span class="lineno">  772</span>               }</div>
+<div class="line"><a name="l00773"></a><span class="lineno">  773</span>               <span class="keywordflow">else</span> <span class="keywordflow">if</span>(nvalid.size()>processClass){<span class="comment">//absolute value</span></div>
+<div class="line"><a name="l00774"></a><span class="lineno">  774</span>                 <span class="keywordflow">if</span>(nvalid[processClass]>=-theThreshold)</div>
+<div class="line"><a name="l00775"></a><span class="lineno">  775</span>                   <span class="keywordflow">continue</span>;<span class="comment">//do not select any more pixels for this class, go to next column to search for other classes</span></div>
+<div class="line"><a name="l00776"></a><span class="lineno">  776</span>               }</div>
+<div class="line"><a name="l00777"></a><span class="lineno">  777</span>               writeBuffer.push_back(sample);</div>
+<div class="line"><a name="l00778"></a><span class="lineno">  778</span>               <span class="comment">//             writeBufferClass.push_back(class_opt[processClass]);</span></div>
+<div class="line"><a name="l00779"></a><span class="lineno">  779</span>               writeBufferClass.push_back(theClass);</div>
+<div class="line"><a name="l00780"></a><span class="lineno">  780</span>               ++ntotalvalid;</div>
+<div class="line"><a name="l00781"></a><span class="lineno">  781</span>               <span class="keywordflow">if</span>(nvalid.size()>processClass)</div>
+<div class="line"><a name="l00782"></a><span class="lineno">  782</span>                 ++(nvalid[processClass]);</div>
+<div class="line"><a name="l00783"></a><span class="lineno">  783</span>             }</div>
+<div class="line"><a name="l00784"></a><span class="lineno">  784</span>             <span class="keywordflow">else</span>{</div>
+<div class="line"><a name="l00785"></a><span class="lineno">  785</span>               ++ntotalinvalid;</div>
+<div class="line"><a name="l00786"></a><span class="lineno">  786</span>               <span class="keywordflow">if</span>(ninvalid.size()>processClass)</div>
+<div class="line"><a name="l00787"></a><span class="lineno">  787</span>                 ++(ninvalid[processClass]);</div>
+<div class="line"><a name="l00788"></a><span class="lineno">  788</span>             }</div>
+<div class="line"><a name="l00789"></a><span class="lineno">  789</span>           }<span class="comment">//processClass</span></div>
+<div class="line"><a name="l00790"></a><span class="lineno">  790</span>         }<span class="comment">//icol</span></div>
+<div class="line"><a name="l00791"></a><span class="lineno">  791</span>         progress=<span class="keyword">static_cast<</span><span class="keywordtype">float</span><span class="keyword">></span>(irow+1.0)/classReader.nrOfRow();</div>
+<div class="line"><a name="l00792"></a><span class="lineno">  792</span>         pfnProgress(progress,pszMessage,pProgressArg);</div>
+<div class="line"><a name="l00793"></a><span class="lineno">  793</span>       }<span class="comment">//irow</span></div>
+<div class="line"><a name="l00794"></a><span class="lineno">  794</span>       <span class="keywordflow">if</span>(writeBuffer.size()>0){</div>
+<div class="line"><a name="l00795"></a><span class="lineno">  795</span>         assert(ntotalvalid==writeBuffer.size());</div>
+<div class="line"><a name="l00796"></a><span class="lineno">  796</span>         <span class="keywordflow">if</span>(verbose_opt[0]>0)</div>
+<div class="line"><a name="l00797"></a><span class="lineno">  797</span>           std::cout << <span class="stringliteral">"creating image sample writer "</span> << output_opt[0] << <span class="stringliteral">" with "</span> << writeBuffer.size() << <span class="stringliteral">" samples ("</span> << ntotalinvalid << <span class="stringliteral">" invalid)"</span> << std::endl;</div>
+<div class="line"><a name="l00798"></a><span class="lineno">  798</span>         ogrWriter.open(output_opt[0],ogrformat_opt[0]);</div>
+<div class="line"><a name="l00799"></a><span class="lineno">  799</span>         <span class="keywordtype">char</span>     **papszOptions=NULL;</div>
+<div class="line"><a name="l00800"></a><span class="lineno">  800</span>         ostringstream slayer;</div>
+<div class="line"><a name="l00801"></a><span class="lineno">  801</span>         slayer << <span class="stringliteral">"training data"</span>;</div>
+<div class="line"><a name="l00802"></a><span class="lineno">  802</span>         std::string layername=slayer.str();</div>
+<div class="line"><a name="l00803"></a><span class="lineno">  803</span>         ogrWriter.createLayer(layername, imgReader.getProjection(), wkbPoint, papszOptions);</div>
+<div class="line"><a name="l00804"></a><span class="lineno">  804</span>         std::string fieldname=<span class="stringliteral">"fid"</span>;<span class="comment">//number of the point</span></div>
+<div class="line"><a name="l00805"></a><span class="lineno">  805</span>         ogrWriter.createField(fieldname,OFTInteger);</div>
+<div class="line"><a name="l00806"></a><span class="lineno">  806</span>         map<std::string,double> pointAttributes;</div>
+<div class="line"><a name="l00807"></a><span class="lineno">  807</span>         <span class="comment">//         ogrWriter.createField(label_opt[0],OFTInteger);</span></div>
+<div class="line"><a name="l00808"></a><span class="lineno">  808</span>         ogrWriter.createField(label_opt[0],labelType);</div>
+<div class="line"><a name="l00809"></a><span class="lineno">  809</span>         <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iband=0;iband<nband;++iband){</div>
+<div class="line"><a name="l00810"></a><span class="lineno">  810</span>       <span class="keywordtype">int</span> theBand=(band_opt.size()) ? band_opt[iband] : iband;</div>
+<div class="line"><a name="l00811"></a><span class="lineno">  811</span>           <span class="comment">// ostringstream fs;</span></div>
+<div class="line"><a name="l00812"></a><span class="lineno">  812</span>           <span class="comment">// if(nband==1)</span></div>
+<div class="line"><a name="l00813"></a><span class="lineno">  813</span>           <span class="comment">//   fs << fieldname_opt[0];</span></div>
+<div class="line"><a name="l00814"></a><span class="lineno">  814</span>           <span class="comment">// else</span></div>
+<div class="line"><a name="l00815"></a><span class="lineno">  815</span>           <span class="comment">//   fs << fieldname_opt[0] << theBand;</span></div>
+<div class="line"><a name="l00816"></a><span class="lineno">  816</span>           <span class="comment">// ogrWriter.createField(fs.str(),fieldType);</span></div>
+<div class="line"><a name="l00817"></a><span class="lineno">  817</span>           ogrWriter.createField(fieldname_opt[iband],fieldType);</div>
+<div class="line"><a name="l00818"></a><span class="lineno">  818</span>         }</div>
+<div class="line"><a name="l00819"></a><span class="lineno">  819</span>         pfnProgress(progress,pszMessage,pProgressArg);</div>
+<div class="line"><a name="l00820"></a><span class="lineno">  820</span>         std::cout << <span class="stringliteral">"writing sample to "</span> << output_opt[0] << <span class="stringliteral">"..."</span> << std::endl;</div>
+<div class="line"><a name="l00821"></a><span class="lineno">  821</span>         progress=0;</div>
+<div class="line"><a name="l00822"></a><span class="lineno">  822</span>         pfnProgress(progress,pszMessage,pProgressArg);</div>
+<div class="line"><a name="l00823"></a><span class="lineno">  823</span>         <span class="keywordflow">for</span>(<span class="keywordtype">int</span> isample=0;isample<writeBuffer.size();++isample){</div>
+<div class="line"><a name="l00824"></a><span class="lineno">  824</span>           pointAttributes[label_opt[0]]=writeBufferClass[isample];</div>
+<div class="line"><a name="l00825"></a><span class="lineno">  825</span>           <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iband=0;iband<writeBuffer[0].size()-2;++iband){</div>
+<div class="line"><a name="l00826"></a><span class="lineno">  826</span>         <span class="keywordtype">int</span> theBand=(band_opt.size()) ? band_opt[iband] : iband;</div>
+<div class="line"><a name="l00827"></a><span class="lineno">  827</span>             <span class="comment">// ostringstream fs;</span></div>
+<div class="line"><a name="l00828"></a><span class="lineno">  828</span>             <span class="comment">// if(nband==1)</span></div>
+<div class="line"><a name="l00829"></a><span class="lineno">  829</span>             <span class="comment">//   fs << fieldname_opt[0];</span></div>
+<div class="line"><a name="l00830"></a><span class="lineno">  830</span>             <span class="comment">// else</span></div>
+<div class="line"><a name="l00831"></a><span class="lineno">  831</span>             <span class="comment">//   fs << fieldname_opt[0] << theBand;</span></div>
+<div class="line"><a name="l00832"></a><span class="lineno">  832</span>             <span class="comment">// pointAttributes[fs.str()]=writeBuffer[isample][iband+2];</span></div>
+<div class="line"><a name="l00833"></a><span class="lineno">  833</span>             pointAttributes[fieldname_opt[iband]]=writeBuffer[isample][iband+2];</div>
+<div class="line"><a name="l00834"></a><span class="lineno">  834</span>           }</div>
+<div class="line"><a name="l00835"></a><span class="lineno">  835</span>           ogrWriter.addPoint(writeBuffer[isample][0],writeBuffer[isample][1],pointAttributes,fieldname,isample);</div>
+<div class="line"><a name="l00836"></a><span class="lineno">  836</span>           progress=<span class="keyword">static_cast<</span><span class="keywordtype">float</span><span class="keyword">></span>(isample+1.0)/writeBuffer.size();</div>
+<div class="line"><a name="l00837"></a><span class="lineno">  837</span>           pfnProgress(progress,pszMessage,pProgressArg);</div>
+<div class="line"><a name="l00838"></a><span class="lineno">  838</span>         }</div>
+<div class="line"><a name="l00839"></a><span class="lineno">  839</span>         ogrWriter.close();</div>
+<div class="line"><a name="l00840"></a><span class="lineno">  840</span>       }</div>
+<div class="line"><a name="l00841"></a><span class="lineno">  841</span>       <span class="keywordflow">else</span>{</div>
+<div class="line"><a name="l00842"></a><span class="lineno">  842</span>         std::cout << <span class="stringliteral">"No data found for any class "</span> << std::endl;</div>
+<div class="line"><a name="l00843"></a><span class="lineno">  843</span>       }</div>
+<div class="line"><a name="l00844"></a><span class="lineno">  844</span>       classReader.close();</div>
+<div class="line"><a name="l00845"></a><span class="lineno">  845</span>       nsample=writeBuffer.size();</div>
+<div class="line"><a name="l00846"></a><span class="lineno">  846</span>       <span class="keywordflow">if</span>(verbose_opt[0]){</div>
+<div class="line"><a name="l00847"></a><span class="lineno">  847</span>         std::cout << <span class="stringliteral">"total number of samples written: "</span> << nsample << std::endl;</div>
+<div class="line"><a name="l00848"></a><span class="lineno">  848</span>         <span class="keywordflow">if</span>(nvalid.size()==class_opt.size()){</div>
+<div class="line"><a name="l00849"></a><span class="lineno">  849</span>           <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iclass=0;iclass<class_opt.size();++iclass)</div>
+<div class="line"><a name="l00850"></a><span class="lineno">  850</span>             std::cout << <span class="stringliteral">"class "</span> << class_opt[iclass] << <span class="stringliteral">" has "</span> << nvalid[iclass] << <span class="stringliteral">" samples"</span> << std::endl;</div>
+<div class="line"><a name="l00851"></a><span class="lineno">  851</span>         }</div>
+<div class="line"><a name="l00852"></a><span class="lineno">  852</span>       }</div>
+<div class="line"><a name="l00853"></a><span class="lineno">  853</span>     }</div>
+<div class="line"><a name="l00854"></a><span class="lineno">  854</span>   }</div>
+<div class="line"><a name="l00855"></a><span class="lineno">  855</span>   <span class="keywordflow">else</span>{<span class="comment">//vector dataset</span></div>
+<div class="line"><a name="l00856"></a><span class="lineno">  856</span>     <span class="keywordflow">if</span>(verbose_opt[0]>1)</div>
+<div class="line"><a name="l00857"></a><span class="lineno">  857</span>       std::cout << <span class="stringliteral">"creating image sample writer "</span> << output_opt[0] << std::endl;</div>
+<div class="line"><a name="l00858"></a><span class="lineno">  858</span>     <a class="code" href="classImgWriterOgr.html">ImgWriterOgr</a> ogrWriter;</div>
+<div class="line"><a name="l00859"></a><span class="lineno">  859</span>     <a class="code" href="classImgWriterOgr.html">ImgWriterOgr</a> ogrTestWriter;</div>
+<div class="line"><a name="l00860"></a><span class="lineno">  860</span>     <span class="keywordflow">try</span>{</div>
+<div class="line"><a name="l00861"></a><span class="lineno">  861</span>       ogrWriter.open(output_opt[0],ogrformat_opt[0]);</div>
+<div class="line"><a name="l00862"></a><span class="lineno">  862</span>       <span class="keywordflow">if</span>(test_opt.size()){</div>
+<div class="line"><a name="l00863"></a><span class="lineno">  863</span>     <span class="keywordflow">if</span>(verbose_opt[0]>1)</div>
+<div class="line"><a name="l00864"></a><span class="lineno">  864</span>       std::cout << <span class="stringliteral">"creating image test writer "</span> << test_opt[0] << std::endl;</div>
+<div class="line"><a name="l00865"></a><span class="lineno">  865</span>     ogrTestWriter.open(test_opt[0],ogrformat_opt[0]);</div>
+<div class="line"><a name="l00866"></a><span class="lineno">  866</span>       }</div>
+<div class="line"><a name="l00867"></a><span class="lineno">  867</span> </div>
+<div class="line"><a name="l00868"></a><span class="lineno">  868</span>       <span class="comment">//if class_opt not set, get number of classes from input image for these rules</span></div>
+<div class="line"><a name="l00869"></a><span class="lineno">  869</span>       <span class="keywordflow">switch</span>(ruleMap[rule_opt[0]]){</div>
+<div class="line"><a name="l00870"></a><span class="lineno">  870</span>       <span class="keywordflow">case</span>(rule::proportion):</div>
+<div class="line"><a name="l00871"></a><span class="lineno">  871</span>       <span class="keywordflow">case</span>(rule::count):</div>
+<div class="line"><a name="l00872"></a><span class="lineno">  872</span>       <span class="keywordflow">case</span>(rule::custom):</div>
+<div class="line"><a name="l00873"></a><span class="lineno">  873</span>       <span class="keywordflow">case</span>(rule::mode):{</div>
+<div class="line"><a name="l00874"></a><span class="lineno">  874</span>     <span class="keywordflow">if</span>(class_opt.empty()){</div>
+<div class="line"><a name="l00875"></a><span class="lineno">  875</span>       <span class="keywordtype">int</span> theBand=0;</div>
+<div class="line"><a name="l00876"></a><span class="lineno">  876</span>       <span class="keywordtype">double</span> minValue=0;</div>
+<div class="line"><a name="l00877"></a><span class="lineno">  877</span>       <span class="keywordtype">double</span> maxValue=0;</div>
+<div class="line"><a name="l00878"></a><span class="lineno">  878</span>       <span class="keywordflow">if</span>(band_opt.size())</div>
+<div class="line"><a name="l00879"></a><span class="lineno">  879</span>         theBand=band_opt[0];</div>
+<div class="line"><a name="l00880"></a><span class="lineno">  880</span>       imgReader.getMinMax(minValue,maxValue,theBand);</div>
+<div class="line"><a name="l00881"></a><span class="lineno">  881</span>       <span class="keywordtype">int</span> nclass=maxValue-minValue+1;</div>
+<div class="line"><a name="l00882"></a><span class="lineno">  882</span>       <span class="keywordflow">if</span>(nclass<0&&nclass<256){</div>
+<div class="line"><a name="l00883"></a><span class="lineno">  883</span>         <span class="keywordtype">string</span> errorString=<span class="stringliteral">"Could not automatically define classes, please set class option"</span>;</div>
+<div class="line"><a name="l00884"></a><span class="lineno">  884</span>         <span class="keywordflow">throw</span>(errorString);</div>
+<div class="line"><a name="l00885"></a><span class="lineno">  885</span>       }</div>
+<div class="line"><a name="l00886"></a><span class="lineno">  886</span>       <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iclass=minValue;iclass<=maxValue;++iclass)</div>
+<div class="line"><a name="l00887"></a><span class="lineno">  887</span>         class_opt.push_back(iclass);</div>
+<div class="line"><a name="l00888"></a><span class="lineno">  888</span>     }</div>
+<div class="line"><a name="l00889"></a><span class="lineno">  889</span>     <span class="keywordflow">break</span>;</div>
 <div class="line"><a name="l00890"></a><span class="lineno">  890</span>       }</div>
-<div class="line"><a name="l00891"></a><span class="lineno">  891</span>       <span class="keywordflow">else</span>{</div>
-<div class="line"><a name="l00892"></a><span class="lineno">  892</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iband=0;iband<nband;++iband){</div>
-<div class="line"><a name="l00893"></a><span class="lineno">  893</span>       <span class="keywordtype">int</span> theBand=(band_opt.size()) ? band_opt[iband] : iband;</div>
-<div class="line"><a name="l00894"></a><span class="lineno">  894</span>       ostringstream fs;</div>
-<div class="line"><a name="l00895"></a><span class="lineno">  895</span>       fs << fieldname_opt[iband];</div>
-<div class="line"><a name="l00896"></a><span class="lineno">  896</span>       <span class="keywordflow">if</span>(verbose_opt[0]>1)</div>
-<div class="line"><a name="l00897"></a><span class="lineno">  897</span>         std::cout << <span class="stringliteral">"creating field "</span> << fs.str() << std::endl;</div>
-<div class="line"><a name="l00898"></a><span class="lineno">  898</span> </div>
-<div class="line"><a name="l00899"></a><span class="lineno">  899</span>       ogrWriter.createField(fs.str(),fieldType,ilayerWrite);</div>
-<div class="line"><a name="l00900"></a><span class="lineno">  900</span>       <span class="keywordflow">if</span>(test_opt.size())</div>
-<div class="line"><a name="l00901"></a><span class="lineno">  901</span>         ogrTestWriter.createField(fs.str(),fieldType,ilayerWrite);</div>
-<div class="line"><a name="l00902"></a><span class="lineno">  902</span>     }</div>
-<div class="line"><a name="l00903"></a><span class="lineno">  903</span>       }</div>
-<div class="line"><a name="l00904"></a><span class="lineno">  904</span>       OGRFeature *readFeature;</div>
-<div class="line"><a name="l00905"></a><span class="lineno">  905</span>       <span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> ifeature=0;</div>
-<div class="line"><a name="l00906"></a><span class="lineno">  906</span>       <span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> nfeature=sampleReaderOgr.getFeatureCount();</div>
-<div class="line"><a name="l00907"></a><span class="lineno">  907</span>       progress=0;</div>
-<div class="line"><a name="l00908"></a><span class="lineno">  908</span>       pfnProgress(progress,pszMessage,pProgressArg);</div>
-<div class="line"><a name="l00909"></a><span class="lineno">  909</span>       <span class="keywordflow">while</span>( (readFeature = readLayer->GetNextFeature()) != NULL ){</div>
-<div class="line"><a name="l00910"></a><span class="lineno">  910</span>     <span class="keywordtype">bool</span> validFeature=<span class="keyword">false</span>;</div>
-<div class="line"><a name="l00911"></a><span class="lineno">  911</span>     <span class="keywordtype">bool</span> writeTest=<span class="keyword">false</span>;<span class="comment">//write this feature to test_opt[0] instead of output_opt</span></div>
-<div class="line"><a name="l00912"></a><span class="lineno">  912</span>     <span class="keywordflow">if</span>(verbose_opt[0]>0)</div>
-<div class="line"><a name="l00913"></a><span class="lineno">  913</span>       std::cout << <span class="stringliteral">"reading feature "</span> << readFeature->GetFID() << std::endl;</div>
-<div class="line"><a name="l00914"></a><span class="lineno">  914</span>     <span class="keywordflow">if</span>(threshold_opt[0]>0){<span class="comment">//percentual value</span></div>
-<div class="line"><a name="l00915"></a><span class="lineno">  915</span>       <span class="keywordtype">double</span> p=<span class="keyword">static_cast<</span><span class="keywordtype">double</span><span class="keyword">></span>(rand())/(RAND_MAX);</div>
-<div class="line"><a name="l00916"></a><span class="lineno">  916</span>       p*=100.0;</div>
-<div class="line"><a name="l00917"></a><span class="lineno">  917</span>       <span class="keywordflow">if</span>(p>threshold_opt[0]){</div>
-<div class="line"><a name="l00918"></a><span class="lineno">  918</span>         <span class="keywordflow">if</span>(test_opt.size())</div>
-<div class="line"><a name="l00919"></a><span class="lineno">  919</span>           writeTest=<span class="keyword">true</span>;</div>
-<div class="line"><a name="l00920"></a><span class="lineno">  920</span>         <span class="keywordflow">else</span></div>
-<div class="line"><a name="l00921"></a><span class="lineno">  921</span>           <span class="keywordflow">continue</span>;<span class="comment">//do not select for now, go to next feature</span></div>
-<div class="line"><a name="l00922"></a><span class="lineno">  922</span>       }</div>
-<div class="line"><a name="l00923"></a><span class="lineno">  923</span>     }</div>
-<div class="line"><a name="l00924"></a><span class="lineno">  924</span>     <span class="keywordflow">else</span>{<span class="comment">//absolute value</span></div>
-<div class="line"><a name="l00925"></a><span class="lineno">  925</span>       <span class="keywordflow">if</span>(ntotalvalid>=-threshold_opt[0]){</div>
-<div class="line"><a name="l00926"></a><span class="lineno">  926</span>         <span class="keywordflow">if</span>(test_opt.size())</div>
-<div class="line"><a name="l00927"></a><span class="lineno">  927</span>           writeTest=<span class="keyword">true</span>;</div>
-<div class="line"><a name="l00928"></a><span class="lineno">  928</span>         <span class="keywordflow">else</span></div>
-<div class="line"><a name="l00929"></a><span class="lineno">  929</span>           <span class="keywordflow">continue</span>;<span class="comment">//do not select any more pixels, go to next column feature</span></div>
-<div class="line"><a name="l00930"></a><span class="lineno">  930</span>       }</div>
-<div class="line"><a name="l00931"></a><span class="lineno">  931</span>     }</div>
-<div class="line"><a name="l00932"></a><span class="lineno">  932</span>     <span class="keywordflow">if</span>(verbose_opt[0]>0)</div>
-<div class="line"><a name="l00933"></a><span class="lineno">  933</span>       std::cout << <span class="stringliteral">"processing feature "</span> << readFeature->GetFID() << std::endl;</div>
-<div class="line"><a name="l00934"></a><span class="lineno">  934</span>     <span class="comment">//get x and y from readFeature</span></div>
-<div class="line"><a name="l00935"></a><span class="lineno">  935</span>     <span class="keywordtype">double</span> x,y;</div>
-<div class="line"><a name="l00936"></a><span class="lineno">  936</span>     OGRGeometry *poGeometry;</div>
-<div class="line"><a name="l00937"></a><span class="lineno">  937</span>     poGeometry = readFeature->GetGeometryRef();</div>
-<div class="line"><a name="l00938"></a><span class="lineno">  938</span>     assert(poGeometry!=NULL);</div>
-<div class="line"><a name="l00939"></a><span class="lineno">  939</span>     <span class="keywordflow">try</span>{</div>
-<div class="line"><a name="l00940"></a><span class="lineno">  940</span>       <span class="keywordflow">if</span>(wkbFlatten(poGeometry->getGeometryType()) == wkbPoint ){</div>
-<div class="line"><a name="l00941"></a><span class="lineno">  941</span> </div>
-<div class="line"><a name="l00942"></a><span class="lineno">  942</span>         <span class="keywordflow">if</span>(!buffer_opt.size()){</div>
-<div class="line"><a name="l00943"></a><span class="lineno">  943</span>           <span class="keywordflow">switch</span>(ruleMap[rule_opt[0]]){</div>
-<div class="line"><a name="l00944"></a><span class="lineno">  944</span>           <span class="keywordflow">case</span>(rule::point):</div>
-<div class="line"><a name="l00945"></a><span class="lineno">  945</span>           <span class="keywordflow">case</span>(rule::centroid):</div>
-<div class="line"><a name="l00946"></a><span class="lineno">  946</span>         buffer_opt.push_back(1);<span class="comment">//default</span></div>
-<div class="line"><a name="l00947"></a><span class="lineno">  947</span>           <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l00948"></a><span class="lineno">  948</span>           <span class="keywordflow">default</span>:</div>
-<div class="line"><a name="l00949"></a><span class="lineno">  949</span>         buffer_opt.push_back(3);<span class="comment">//default</span></div>
-<div class="line"><a name="l00950"></a><span class="lineno">  950</span>           }</div>
-<div class="line"><a name="l00951"></a><span class="lineno">  951</span>         }</div>
-<div class="line"><a name="l00952"></a><span class="lineno">  952</span> </div>
-<div class="line"><a name="l00953"></a><span class="lineno">  953</span>         <span class="keywordflow">if</span>(verbose_opt[0]>1)</div>
-<div class="line"><a name="l00954"></a><span class="lineno">  954</span>           std::cout << <span class="stringliteral">"boundary: "</span> << buffer_opt[0] << std::endl;</div>
-<div class="line"><a name="l00955"></a><span class="lineno">  955</span> </div>
-<div class="line"><a name="l00956"></a><span class="lineno">  956</span>         OGRPolygon writePolygon;</div>
-<div class="line"><a name="l00957"></a><span class="lineno">  957</span>         OGRLinearRing writeRing;</div>
-<div class="line"><a name="l00958"></a><span class="lineno">  958</span>         OGRPoint writeCentroidPoint;</div>
-<div class="line"><a name="l00959"></a><span class="lineno">  959</span>         OGRFeature *writePolygonFeature;</div>
-<div class="line"><a name="l00960"></a><span class="lineno">  960</span>         OGRFeature *writeCentroidFeature;</div>
-<div class="line"><a name="l00961"></a><span class="lineno">  961</span> </div>
-<div class="line"><a name="l00962"></a><span class="lineno">  962</span>         OGRPoint *poPoint = (OGRPoint *) poGeometry;</div>
-<div class="line"><a name="l00963"></a><span class="lineno">  963</span>         writeCentroidPoint=*poPoint;</div>
-<div class="line"><a name="l00964"></a><span class="lineno">  964</span> </div>
-<div class="line"><a name="l00965"></a><span class="lineno">  965</span>         x=poPoint->getX();</div>
-<div class="line"><a name="l00966"></a><span class="lineno">  966</span>         y=poPoint->getY();</div>
-<div class="line"><a name="l00967"></a><span class="lineno">  967</span> </div>
-<div class="line"><a name="l00968"></a><span class="lineno">  968</span>         <span class="keywordtype">double</span> i_centre,j_centre;</div>
-<div class="line"><a name="l00969"></a><span class="lineno">  969</span>         <span class="keywordflow">if</span>(geo_opt[0])</div>
-<div class="line"><a name="l00970"></a><span class="lineno">  970</span>           imgReader.geo2image(x,y,i_centre,j_centre);</div>
-<div class="line"><a name="l00971"></a><span class="lineno">  971</span>         <span class="keywordflow">else</span>{</div>
-<div class="line"><a name="l00972"></a><span class="lineno">  972</span>           i_centre=x;</div>
-<div class="line"><a name="l00973"></a><span class="lineno">  973</span>           j_centre=y;</div>
-<div class="line"><a name="l00974"></a><span class="lineno">  974</span>         }</div>
-<div class="line"><a name="l00975"></a><span class="lineno">  975</span>         <span class="comment">//nearest neighbour</span></div>
-<div class="line"><a name="l00976"></a><span class="lineno">  976</span>         j_centre=<span class="keyword">static_cast<</span><span class="keywordtype">int</span><span class="keyword">></span>(j_centre);</div>
-<div class="line"><a name="l00977"></a><span class="lineno">  977</span>         i_centre=<span class="keyword">static_cast<</span><span class="keywordtype">int</span><span class="keyword">></span>(i_centre);</div>
-<div class="line"><a name="l00978"></a><span class="lineno">  978</span> </div>
-<div class="line"><a name="l00979"></a><span class="lineno">  979</span>         <span class="keywordtype">double</span> uli=i_centre-buffer_opt[0]/2;</div>
-<div class="line"><a name="l00980"></a><span class="lineno">  980</span>         <span class="keywordtype">double</span> ulj=j_centre-buffer_opt[0]/2;</div>
-<div class="line"><a name="l00981"></a><span class="lineno">  981</span>         <span class="keywordtype">double</span> lri=i_centre+buffer_opt[0]/2;</div>
-<div class="line"><a name="l00982"></a><span class="lineno">  982</span>         <span class="keywordtype">double</span> lrj=j_centre+buffer_opt[0]/2;</div>
-<div class="line"><a name="l00983"></a><span class="lineno">  983</span> </div>
-<div class="line"><a name="l00984"></a><span class="lineno">  984</span>         <span class="comment">//nearest neighbour</span></div>
-<div class="line"><a name="l00985"></a><span class="lineno">  985</span>         ulj=<span class="keyword">static_cast<</span><span class="keywordtype">int</span><span class="keyword">></span>(ulj);</div>
-<div class="line"><a name="l00986"></a><span class="lineno">  986</span>         uli=<span class="keyword">static_cast<</span><span class="keywordtype">int</span><span class="keyword">></span>(uli);</div>
-<div class="line"><a name="l00987"></a><span class="lineno">  987</span>         lrj=<span class="keyword">static_cast<</span><span class="keywordtype">int</span><span class="keyword">></span>(lrj);</div>
-<div class="line"><a name="l00988"></a><span class="lineno">  988</span>         lri=<span class="keyword">static_cast<</span><span class="keywordtype">int</span><span class="keyword">></span>(lri);</div>
-<div class="line"><a name="l00989"></a><span class="lineno">  989</span> </div>
-<div class="line"><a name="l00990"></a><span class="lineno">  990</span>         <span class="comment">// if((polygon_opt[0]&&ruleMap[rule_opt[0]]==rule::point)||(ruleMap[rule_opt[0]]==rule::centroid)){</span></div>
-<div class="line"><a name="l00991"></a><span class="lineno">  991</span>         <span class="comment">//   uli=i_centre;</span></div>
-<div class="line"><a name="l00992"></a><span class="lineno">  992</span>         <span class="comment">//   ulj=j_centre;</span></div>
-<div class="line"><a name="l00993"></a><span class="lineno">  993</span>         <span class="comment">//   lri=i_centre;</span></div>
-<div class="line"><a name="l00994"></a><span class="lineno">  994</span>         <span class="comment">//   lrj=j_centre;</span></div>
-<div class="line"><a name="l00995"></a><span class="lineno">  995</span>         <span class="comment">// }</span></div>
-<div class="line"><a name="l00996"></a><span class="lineno">  996</span> </div>
-<div class="line"><a name="l00997"></a><span class="lineno">  997</span>         <span class="comment">//check if j is out of bounds</span></div>
-<div class="line"><a name="l00998"></a><span class="lineno">  998</span>         <span class="keywordflow">if</span>(static_cast<int>(ulj)<0||<span class="keyword">static_cast<</span><span class="keywordtype">int</span><span class="keyword">></span>(ulj)>=imgReader.nrOfRow())</div>
-<div class="line"><a name="l00999"></a><span class="lineno">  999</span>           <span class="keywordflow">continue</span>;</div>
-<div class="line"><a name="l01000"></a><span class="lineno"> 1000</span>         <span class="comment">//check if j is out of bounds</span></div>
-<div class="line"><a name="l01001"></a><span class="lineno"> 1001</span>         <span class="keywordflow">if</span>(static_cast<int>(uli)<0||<span class="keyword">static_cast<</span><span class="keywordtype">int</span><span class="keyword">></span>(lri)>=imgReader.nrOfCol())</div>
-<div class="line"><a name="l01002"></a><span class="lineno"> 1002</span>           <span class="keywordflow">continue</span>;</div>
-<div class="line"><a name="l01003"></a><span class="lineno"> 1003</span> </div>
-<div class="line"><a name="l01004"></a><span class="lineno"> 1004</span>         OGRPoint ulPoint,urPoint,llPoint,lrPoint;</div>
-<div class="line"><a name="l01005"></a><span class="lineno"> 1005</span>         <span class="keywordtype">double</span> ulx,uly;</div>
-<div class="line"><a name="l01006"></a><span class="lineno"> 1006</span>         <span class="keywordtype">double</span> urx,ury;</div>
-<div class="line"><a name="l01007"></a><span class="lineno"> 1007</span> </div>
-<div class="line"><a name="l01008"></a><span class="lineno"> 1008</span>         <span class="keywordflow">if</span>(polygon_opt[0]){</div>
-<div class="line"><a name="l01009"></a><span class="lineno"> 1009</span>           <span class="keywordflow">if</span>(disc_opt[0]){</div>
-<div class="line"><a name="l01010"></a><span class="lineno"> 1010</span>         <span class="keywordtype">double</span> gt[6];<span class="comment">// { 444720, 30, 0, 3751320, 0, -30 };</span></div>
-<div class="line"><a name="l01011"></a><span class="lineno"> 1011</span>         <span class="keywordtype">double</span> radius=buffer_opt[0]/2.0*sqrt(imgReader.getDeltaX()*imgReader.getDeltaY());</div>
-<div class="line"><a name="l01012"></a><span class="lineno"> 1012</span>         <span class="keywordtype">unsigned</span> <span class="keywordtype">short</span> nstep = 25;</div>
-<div class="line"><a name="l01013"></a><span class="lineno"> 1013</span>         <span class="keywordflow">for</span>(<span class="keywordtype">int</span> i=0;i<nstep;++i){</div>
-<div class="line"><a name="l01014"></a><span class="lineno"> 1014</span>           OGRPoint aPoint;</div>
-<div class="line"><a name="l01015"></a><span class="lineno"> 1015</span>           aPoint.setX(x+imgReader.getDeltaX()/2.0+radius*cos(2*PI*i/nstep));</div>
-<div class="line"><a name="l01016"></a><span class="lineno"> 1016</span>           aPoint.setY(y-imgReader.getDeltaY()/2.0+radius*sin(2*PI*i/nstep));</div>
-<div class="line"><a name="l01017"></a><span class="lineno"> 1017</span>           writeRing.addPoint(&aPoint);</div>
-<div class="line"><a name="l01018"></a><span class="lineno"> 1018</span>         }</div>
-<div class="line"><a name="l01019"></a><span class="lineno"> 1019</span>         writePolygon.addRing(&writeRing);</div>
-<div class="line"><a name="l01020"></a><span class="lineno"> 1020</span>         writePolygon.closeRings();</div>
-<div class="line"><a name="l01021"></a><span class="lineno"> 1021</span>           }</div>
-<div class="line"><a name="l01022"></a><span class="lineno"> 1022</span>           <span class="keywordflow">else</span>{</div>
-<div class="line"><a name="l01023"></a><span class="lineno"> 1023</span>         <span class="keywordtype">double</span> llx,lly;</div>
-<div class="line"><a name="l01024"></a><span class="lineno"> 1024</span>         <span class="keywordtype">double</span> lrx,lry;</div>
-<div class="line"><a name="l01025"></a><span class="lineno"> 1025</span>         imgReader.image2geo(uli,ulj,ulx,uly);</div>
-<div class="line"><a name="l01026"></a><span class="lineno"> 1026</span>         imgReader.image2geo(lri,lrj,lrx,lry);</div>
-<div class="line"><a name="l01027"></a><span class="lineno"> 1027</span>         ulPoint.setX(ulx-imgReader.getDeltaX()/2.0);</div>
-<div class="line"><a name="l01028"></a><span class="lineno"> 1028</span>         ulPoint.setY(uly+imgReader.getDeltaY()/2.0);</div>
-<div class="line"><a name="l01029"></a><span class="lineno"> 1029</span>         lrPoint.setX(lrx+imgReader.getDeltaX()/2.0);</div>
-<div class="line"><a name="l01030"></a><span class="lineno"> 1030</span>         lrPoint.setY(lry-imgReader.getDeltaY()/2.0);</div>
-<div class="line"><a name="l01031"></a><span class="lineno"> 1031</span>         urPoint.setX(lrx+imgReader.getDeltaX()/2.0);</div>
-<div class="line"><a name="l01032"></a><span class="lineno"> 1032</span>         urPoint.setY(uly+imgReader.getDeltaY()/2.0);</div>
-<div class="line"><a name="l01033"></a><span class="lineno"> 1033</span>         llPoint.setX(ulx-imgReader.getDeltaX()/2.0);</div>
-<div class="line"><a name="l01034"></a><span class="lineno"> 1034</span>         llPoint.setY(lry-imgReader.getDeltaY()/2.0);</div>
-<div class="line"><a name="l01035"></a><span class="lineno"> 1035</span> </div>
-<div class="line"><a name="l01036"></a><span class="lineno"> 1036</span>         writeRing.addPoint(&ulPoint);</div>
-<div class="line"><a name="l01037"></a><span class="lineno"> 1037</span>         writeRing.addPoint(&urPoint);</div>
-<div class="line"><a name="l01038"></a><span class="lineno"> 1038</span>         writeRing.addPoint(&lrPoint);</div>
-<div class="line"><a name="l01039"></a><span class="lineno"> 1039</span>         writeRing.addPoint(&llPoint);</div>
-<div class="line"><a name="l01040"></a><span class="lineno"> 1040</span>         writePolygon.addRing(&writeRing);</div>
-<div class="line"><a name="l01041"></a><span class="lineno"> 1041</span>         writePolygon.closeRings();</div>
-<div class="line"><a name="l01042"></a><span class="lineno"> 1042</span>           }</div>
-<div class="line"><a name="l01043"></a><span class="lineno"> 1043</span>         }</div>
-<div class="line"><a name="l01044"></a><span class="lineno"> 1044</span> </div>
-<div class="line"><a name="l01045"></a><span class="lineno"> 1045</span>         <span class="keywordflow">if</span>((polygon_opt[0]&&ruleMap[rule_opt[0]]==rule::point)||(ruleMap[rule_opt[0]]==rule::centroid)){</div>
-<div class="line"><a name="l01046"></a><span class="lineno"> 1046</span>           uli=i_centre;</div>
-<div class="line"><a name="l01047"></a><span class="lineno"> 1047</span>           ulj=j_centre;</div>
-<div class="line"><a name="l01048"></a><span class="lineno"> 1048</span>           lri=i_centre;</div>
-<div class="line"><a name="l01049"></a><span class="lineno"> 1049</span>           lrj=j_centre;</div>
-<div class="line"><a name="l01050"></a><span class="lineno"> 1050</span>         }</div>
-<div class="line"><a name="l01051"></a><span class="lineno"> 1051</span> </div>
-<div class="line"><a name="l01052"></a><span class="lineno"> 1052</span>         <span class="keywordtype">int</span> nPointWindow=0;<span class="comment">//similar to nPointPolygon for polygons</span></div>
-<div class="line"><a name="l01053"></a><span class="lineno"> 1053</span>         <span class="keywordflow">if</span>(polygon_opt[0]){</div>
-<div class="line"><a name="l01054"></a><span class="lineno"> 1054</span>           <span class="keywordflow">if</span>(writeTest)</div>
-<div class="line"><a name="l01055"></a><span class="lineno"> 1055</span>         writePolygonFeature = OGRFeature::CreateFeature(writeTestLayer->GetLayerDefn());</div>
-<div class="line"><a name="l01056"></a><span class="lineno"> 1056</span>           <span class="keywordflow">else</span></div>
-<div class="line"><a name="l01057"></a><span class="lineno"> 1057</span>         writePolygonFeature = OGRFeature::CreateFeature(writeLayer->GetLayerDefn());</div>
-<div class="line"><a name="l01058"></a><span class="lineno"> 1058</span>         }</div>
-<div class="line"><a name="l01059"></a><span class="lineno"> 1059</span>         <span class="keywordflow">else</span> <span class="keywordflow">if</span>(ruleMap[rule_opt[0]]!=rule::point){</div>
-<div class="line"><a name="l01060"></a><span class="lineno"> 1060</span>           <span class="keywordflow">if</span>(writeTest)</div>
-<div class="line"><a name="l01061"></a><span class="lineno"> 1061</span>         writeCentroidFeature = OGRFeature::CreateFeature(writeTestLayer->GetLayerDefn());</div>
-<div class="line"><a name="l01062"></a><span class="lineno"> 1062</span>           <span class="keywordflow">else</span></div>
-<div class="line"><a name="l01063"></a><span class="lineno"> 1063</span>         writeCentroidFeature = OGRFeature::CreateFeature(writeLayer->GetLayerDefn());</div>
-<div class="line"><a name="l01064"></a><span class="lineno"> 1064</span>         }</div>
-<div class="line"><a name="l01065"></a><span class="lineno"> 1065</span>         <a class="code" href="classVector2d.html">Vector2d<double></a> windowValues;</div>
-<div class="line"><a name="l01066"></a><span class="lineno"> 1066</span>         vector<double> windowClassValues;</div>
-<div class="line"><a name="l01067"></a><span class="lineno"> 1067</span> </div>
-<div class="line"><a name="l01068"></a><span class="lineno"> 1068</span>         <span class="keywordflow">if</span>(class_opt.size()){</div>
-<div class="line"><a name="l01069"></a><span class="lineno"> 1069</span>           windowClassValues.resize(class_opt.size());</div>
-<div class="line"><a name="l01070"></a><span class="lineno"> 1070</span>           <span class="comment">//initialize</span></div>
-<div class="line"><a name="l01071"></a><span class="lineno"> 1071</span>           <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iclass=0;iclass<class_opt.size();++iclass)</div>
-<div class="line"><a name="l01072"></a><span class="lineno"> 1072</span>         windowClassValues[iclass]=0;</div>
-<div class="line"><a name="l01073"></a><span class="lineno"> 1073</span>         }</div>
-<div class="line"><a name="l01074"></a><span class="lineno"> 1074</span>         <span class="keywordflow">else</span></div>
-<div class="line"><a name="l01075"></a><span class="lineno"> 1075</span>           windowValues.resize(nband);</div>
-<div class="line"><a name="l01076"></a><span class="lineno"> 1076</span>         vector< Vector2d<double> > readValues(nband);</div>
-<div class="line"><a name="l01077"></a><span class="lineno"> 1077</span>         <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iband=0;iband<nband;++iband){</div>
-<div class="line"><a name="l01078"></a><span class="lineno"> 1078</span>           <span class="keywordtype">int</span> theBand=(band_opt.size()) ? band_opt[iband] : iband;</div>
-<div class="line"><a name="l01079"></a><span class="lineno"> 1079</span>           <span class="comment">//test</span></div>
-<div class="line"><a name="l01080"></a><span class="lineno"> 1080</span>           assert(uli>=0);</div>
-<div class="line"><a name="l01081"></a><span class="lineno"> 1081</span>           assert(uli<imgReader.nrOfCol());        </div>
-<div class="line"><a name="l01082"></a><span class="lineno"> 1082</span>           assert(lri>=0);</div>
-<div class="line"><a name="l01083"></a><span class="lineno"> 1083</span>           assert(lri<imgReader.nrOfCol());        </div>
-<div class="line"><a name="l01084"></a><span class="lineno"> 1084</span>           assert(ulj>=0);</div>
-<div class="line"><a name="l01085"></a><span class="lineno"> 1085</span>           assert(ulj<imgReader.nrOfRow());        </div>
-<div class="line"><a name="l01086"></a><span class="lineno"> 1086</span>           assert(lrj>=0);</div>
-<div class="line"><a name="l01087"></a><span class="lineno"> 1087</span>           assert(lrj<imgReader.nrOfRow());        </div>
-<div class="line"><a name="l01088"></a><span class="lineno"> 1088</span>           imgReader.readDataBlock(readValues[iband],GDT_Float64,uli,lri,ulj,lrj,theBand);</div>
-<div class="line"><a name="l01089"></a><span class="lineno"> 1089</span>         }</div>
-<div class="line"><a name="l01090"></a><span class="lineno"> 1090</span> </div>
-<div class="line"><a name="l01091"></a><span class="lineno"> 1091</span>         OGRPoint thePoint;</div>
-<div class="line"><a name="l01092"></a><span class="lineno"> 1092</span>         <span class="keywordflow">for</span>(<span class="keywordtype">int</span> j=ulj;j<=lrj;++j){</div>
-<div class="line"><a name="l01093"></a><span class="lineno"> 1093</span>           <span class="keywordflow">for</span>(<span class="keywordtype">int</span> i=uli;i<=lri;++i){</div>
-<div class="line"><a name="l01094"></a><span class="lineno"> 1094</span>         <span class="comment">//check if within raster image</span></div>
-<div class="line"><a name="l01095"></a><span class="lineno"> 1095</span>         <span class="keywordflow">if</span>(i<0||i>=imgReader.nrOfCol())</div>
-<div class="line"><a name="l01096"></a><span class="lineno"> 1096</span>           <span class="keywordflow">continue</span>;</div>
-<div class="line"><a name="l01097"></a><span class="lineno"> 1097</span>         <span class="keywordflow">if</span>(j<0||j>=imgReader.nrOfRow())</div>
-<div class="line"><a name="l01098"></a><span class="lineno"> 1098</span>           <span class="keywordflow">continue</span>;</div>
-<div class="line"><a name="l01099"></a><span class="lineno"> 1099</span>         <span class="comment">//no need to check if point is on surface</span></div>
-<div class="line"><a name="l01100"></a><span class="lineno"> 1100</span>         <span class="keywordtype">double</span> theX=0;</div>
-<div class="line"><a name="l01101"></a><span class="lineno"> 1101</span>         <span class="keywordtype">double</span> theY=0;</div>
-<div class="line"><a name="l01102"></a><span class="lineno"> 1102</span>         imgReader.image2geo(i,j,theX,theY);</div>
-<div class="line"><a name="l01103"></a><span class="lineno"> 1103</span>         thePoint.setX(theX);</div>
-<div class="line"><a name="l01104"></a><span class="lineno"> 1104</span>         thePoint.setY(theY);</div>
-<div class="line"><a name="l01105"></a><span class="lineno"> 1105</span> </div>
-<div class="line"><a name="l01106"></a><span class="lineno"> 1106</span>         <span class="keywordflow">if</span>(disc_opt[0]&&buffer_opt[0]>1){</div>
-<div class="line"><a name="l01107"></a><span class="lineno"> 1107</span>           <span class="keywordtype">double</span> radius=buffer_opt[0]/2.0*sqrt(imgReader.getDeltaX()*imgReader.getDeltaY());</div>
-<div class="line"><a name="l01108"></a><span class="lineno"> 1108</span>           <span class="keywordflow">if</span>((theX-x)*(theX-x)+(theY-y)*(theY-y)>radius*radius)</div>
-<div class="line"><a name="l01109"></a><span class="lineno"> 1109</span>             <span class="keywordflow">continue</span>;</div>
-<div class="line"><a name="l01110"></a><span class="lineno"> 1110</span>         }</div>
-<div class="line"><a name="l01111"></a><span class="lineno"> 1111</span>         <span class="keywordtype">bool</span> valid=<span class="keyword">true</span>;</div>
-<div class="line"><a name="l01112"></a><span class="lineno"> 1112</span> </div>
-<div class="line"><a name="l01113"></a><span class="lineno"> 1113</span>         <span class="keywordflow">if</span>(srcnodata_opt.size()){</div>
-<div class="line"><a name="l01114"></a><span class="lineno"> 1114</span>           <span class="keywordflow">for</span>(<span class="keywordtype">int</span> vband=0;vband<bndnodata_opt.size();++vband){</div>
-<div class="line"><a name="l01115"></a><span class="lineno"> 1115</span>             <span class="keywordtype">double</span> value=((readValues[bndnodata_opt[vband]])[j-ulj])[i-uli];</div>
-<div class="line"><a name="l01116"></a><span class="lineno"> 1116</span>             <span class="keywordflow">if</span>(value==srcnodata_opt[vband]){</div>
-<div class="line"><a name="l01117"></a><span class="lineno"> 1117</span>               valid=<span class="keyword">false</span>;</div>
-<div class="line"><a name="l01118"></a><span class="lineno"> 1118</span>               <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l01119"></a><span class="lineno"> 1119</span>             }</div>
-<div class="line"><a name="l01120"></a><span class="lineno"> 1120</span>           }</div>
-<div class="line"><a name="l01121"></a><span class="lineno"> 1121</span>         }</div>
-<div class="line"><a name="l01122"></a><span class="lineno"> 1122</span> </div>
-<div class="line"><a name="l01123"></a><span class="lineno"> 1123</span>         <span class="keywordflow">if</span>(!valid)</div>
-<div class="line"><a name="l01124"></a><span class="lineno"> 1124</span>           <span class="keywordflow">continue</span>;</div>
-<div class="line"><a name="l01125"></a><span class="lineno"> 1125</span>         <span class="keywordflow">else</span></div>
-<div class="line"><a name="l01126"></a><span class="lineno"> 1126</span>           validFeature=<span class="keyword">true</span>;</div>
-<div class="line"><a name="l01127"></a><span class="lineno"> 1127</span> </div>
-<div class="line"><a name="l01128"></a><span class="lineno"> 1128</span>         <span class="comment">// writeRing.addPoint(&thePoint);//already done</span></div>
-<div class="line"><a name="l01129"></a><span class="lineno"> 1129</span> </div>
-<div class="line"><a name="l01130"></a><span class="lineno"> 1130</span>         ++nPointWindow;</div>
-<div class="line"><a name="l01131"></a><span class="lineno"> 1131</span>         OGRFeature *writePointFeature;</div>
-<div class="line"><a name="l01132"></a><span class="lineno"> 1132</span>         <span class="keywordflow">if</span>(!polygon_opt[0]){</div>
-<div class="line"><a name="l01133"></a><span class="lineno"> 1133</span>           <span class="comment">//create feature</span></div>
-<div class="line"><a name="l01134"></a><span class="lineno"> 1134</span>           <span class="keywordflow">if</span>(ruleMap[rule_opt[0]]==rule::point){<span class="comment">//do not create in case of mean, stdev, median, sum or centroid (only create point at centroid)</span></div>
-<div class="line"><a name="l01135"></a><span class="lineno"> 1135</span>             <span class="keywordflow">if</span>(writeTest)</div>
-<div class="line"><a name="l01136"></a><span class="lineno"> 1136</span>               writePointFeature = OGRFeature::CreateFeature(writeTestLayer->GetLayerDefn());</div>
-<div class="line"><a name="l01137"></a><span class="lineno"> 1137</span>             <span class="keywordflow">else</span></div>
-<div class="line"><a name="l01138"></a><span class="lineno"> 1138</span>               writePointFeature = OGRFeature::CreateFeature(writeLayer->GetLayerDefn());</div>
-<div class="line"><a name="l01139"></a><span class="lineno"> 1139</span>             <span class="keywordflow">if</span>(verbose_opt[0]>1)</div>
-<div class="line"><a name="l01140"></a><span class="lineno"> 1140</span>               std::cout << <span class="stringliteral">"copying fields from polygons "</span> << std::endl;</div>
-<div class="line"><a name="l01141"></a><span class="lineno"> 1141</span>             <span class="comment">//Geometry of readFeature and writePointFeature are both wkbPoint</span></div>
-<div class="line"><a name="l01142"></a><span class="lineno"> 1142</span>             <span class="comment">//attributes AND geometry are copied with SetFrom</span></div>
-<div class="line"><a name="l01143"></a><span class="lineno"> 1143</span>             <span class="comment">//test</span></div>
-<div class="line"><a name="l01144"></a><span class="lineno"> 1144</span>             <span class="comment">// writePointFeature->SetGeometry(&thePoint);</span></div>
-<div class="line"><a name="l01145"></a><span class="lineno"> 1145</span>             <span class="keywordflow">if</span>(writePointFeature->SetFrom(readFeature)!= OGRERR_NONE)</div>
-<div class="line"><a name="l01146"></a><span class="lineno"> 1146</span>               cerr << <span class="stringliteral">"writing feature failed"</span> << std::endl;</div>
-<div class="line"><a name="l01147"></a><span class="lineno"> 1147</span> </div>
-<div class="line"><a name="l01148"></a><span class="lineno"> 1148</span>             assert(wkbFlatten(writePointFeature->GetGeometryRef()->getGeometryType()) == wkbPoint);</div>
-<div class="line"><a name="l01149"></a><span class="lineno"> 1149</span>             <span class="comment">// OGRGeometry *updateGeometry;</span></div>
-<div class="line"><a name="l01150"></a><span class="lineno"> 1150</span>             <span class="comment">// updateGeometry = writePointFeature->GetGeometryRef();</span></div>
-<div class="line"><a name="l01151"></a><span class="lineno"> 1151</span>             <span class="comment">// OGRPoint *poPoint = (OGRPoint *) updateGeometry;</span></div>
-<div class="line"><a name="l01152"></a><span class="lineno"> 1152</span>             <span class="keywordflow">if</span>(verbose_opt[0]>1)</div>
-<div class="line"><a name="l01153"></a><span class="lineno"> 1153</span>               std::cout << <span class="stringliteral">"write feature has "</span> << writePointFeature->GetFieldCount() << <span class="stringliteral">" fields"</span> << std::endl;</div>
-<div class="line"><a name="l01154"></a><span class="lineno"> 1154</span>           }</div>
-<div class="line"><a name="l01155"></a><span class="lineno"> 1155</span>         }</div>
-<div class="line"><a name="l01156"></a><span class="lineno"> 1156</span>         <span class="keywordflow">if</span>(class_opt.size()){</div>
-<div class="line"><a name="l01157"></a><span class="lineno"> 1157</span>           <span class="keywordtype">short</span> value=((readValues[0])[j-ulj])[i-uli];</div>
-<div class="line"><a name="l01158"></a><span class="lineno"> 1158</span>           <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iclass=0;iclass<class_opt.size();++iclass){</div>
-<div class="line"><a name="l01159"></a><span class="lineno"> 1159</span>             <span class="keywordflow">if</span>(value==class_opt[iclass])</div>
-<div class="line"><a name="l01160"></a><span class="lineno"> 1160</span>               windowClassValues[iclass]+=1;</div>
-<div class="line"><a name="l01161"></a><span class="lineno"> 1161</span>           }</div>
-<div class="line"><a name="l01162"></a><span class="lineno"> 1162</span>         }</div>
-<div class="line"><a name="l01163"></a><span class="lineno"> 1163</span>         <span class="keywordflow">else</span>{</div>
-<div class="line"><a name="l01164"></a><span class="lineno"> 1164</span>           <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iband=0;iband<nband;++iband){</div>
-<div class="line"><a name="l01165"></a><span class="lineno"> 1165</span>             <span class="keywordtype">int</span> theBand=(band_opt.size()) ? band_opt[iband] : iband;</div>
-<div class="line"><a name="l01166"></a><span class="lineno"> 1166</span>             assert(j-ulj>=0);</div>
-<div class="line"><a name="l01167"></a><span class="lineno"> 1167</span>             assert(j-ulj<readValues[iband].size());</div>
-<div class="line"><a name="l01168"></a><span class="lineno"> 1168</span>             assert(i-uli>=0);</div>
-<div class="line"><a name="l01169"></a><span class="lineno"> 1169</span>             assert(i-uli<((readValues[iband])[j-ulj]).size());</div>
-<div class="line"><a name="l01170"></a><span class="lineno"> 1170</span>             <span class="keywordtype">double</span> value=((readValues[iband])[j-ulj])[i-uli];</div>
-<div class="line"><a name="l01171"></a><span class="lineno"> 1171</span>             <span class="comment">// imgReader.readData(value,GDT_Float64,i,j,theBand);</span></div>
-<div class="line"><a name="l01172"></a><span class="lineno"> 1172</span>             <span class="keywordflow">if</span>(verbose_opt[0]>1)</div>
-<div class="line"><a name="l01173"></a><span class="lineno"> 1173</span>               std::cout << <span class="stringliteral">": "</span> << value << std::endl;</div>
-<div class="line"><a name="l01174"></a><span class="lineno"> 1174</span>             <span class="keywordflow">if</span>(polygon_opt[0]||ruleMap[rule_opt[0]]!=rule::point){</div>
-<div class="line"><a name="l01175"></a><span class="lineno"> 1175</span>               windowValues[iband].push_back(value);</div>
-<div class="line"><a name="l01176"></a><span class="lineno"> 1176</span>             }</div>
-<div class="line"><a name="l01177"></a><span class="lineno"> 1177</span>             <span class="keywordflow">else</span>{</div>
-<div class="line"><a name="l01178"></a><span class="lineno"> 1178</span>               <span class="keywordflow">try</span>{</div>
-<div class="line"><a name="l01179"></a><span class="lineno"> 1179</span>             <span class="keywordflow">if</span>(verbose_opt[0]>1)</div>
-<div class="line"><a name="l01180"></a><span class="lineno"> 1180</span>               std::cout << <span class="stringliteral">"set field "</span> << fieldname_opt[iband] << <span class="stringliteral">" to "</span> << value << std::endl;</div>
-<div class="line"><a name="l01181"></a><span class="lineno"> 1181</span>             <span class="keywordflow">switch</span>( fieldType ){</div>
-<div class="line"><a name="l01182"></a><span class="lineno"> 1182</span>             <span class="keywordflow">case</span> OFTInteger:</div>
-<div class="line"><a name="l01183"></a><span class="lineno"> 1183</span>             <span class="keywordflow">case</span> OFTReal:</div>
-<div class="line"><a name="l01184"></a><span class="lineno"> 1184</span>               writePointFeature->SetField(fieldname_opt[iband].c_str(),value);</div>
-<div class="line"><a name="l01185"></a><span class="lineno"> 1185</span>               <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l01186"></a><span class="lineno"> 1186</span>             <span class="keywordflow">case</span> OFTString:</div>
-<div class="line"><a name="l01187"></a><span class="lineno"> 1187</span>               writePointFeature->SetField(fieldname_opt[iband].c_str(),type2string<double>(value).c_str());</div>
+<div class="line"><a name="l00891"></a><span class="lineno">  891</span>       }</div>
+<div class="line"><a name="l00892"></a><span class="lineno">  892</span>     }</div>
+<div class="line"><a name="l00893"></a><span class="lineno">  893</span>     <span class="keywordflow">catch</span>(<span class="keywordtype">string</span> errorString){</div>
+<div class="line"><a name="l00894"></a><span class="lineno">  894</span>       cerr << errorString << endl;</div>
+<div class="line"><a name="l00895"></a><span class="lineno">  895</span>       exit(1);</div>
+<div class="line"><a name="l00896"></a><span class="lineno">  896</span>     }</div>
+<div class="line"><a name="l00897"></a><span class="lineno">  897</span>     </div>
+<div class="line"><a name="l00898"></a><span class="lineno">  898</span>     <span class="comment">//support multiple layers</span></div>
+<div class="line"><a name="l00899"></a><span class="lineno">  899</span>     <span class="keywordtype">int</span> nlayerRead=sampleReaderOgr.getDataSource()->GetLayerCount();</div>
+<div class="line"><a name="l00900"></a><span class="lineno">  900</span>     <span class="keywordtype">int</span> ilayerWrite=0;</div>
+<div class="line"><a name="l00901"></a><span class="lineno">  901</span>     <span class="keywordflow">if</span>(verbose_opt[0])</div>
+<div class="line"><a name="l00902"></a><span class="lineno">  902</span>       std::cout << <span class="stringliteral">"number of layers: "</span> << nlayerRead << endl;</div>
+<div class="line"><a name="l00903"></a><span class="lineno">  903</span>       </div>
+<div class="line"><a name="l00904"></a><span class="lineno">  904</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> ilayer=0;ilayer<nlayerRead;++ilayer){</div>
+<div class="line"><a name="l00905"></a><span class="lineno">  905</span>       OGRLayer *readLayer=sampleReaderOgr.getLayer(ilayer);</div>
+<div class="line"><a name="l00906"></a><span class="lineno">  906</span>       <span class="keywordtype">string</span> currentLayername=readLayer->GetName();</div>
+<div class="line"><a name="l00907"></a><span class="lineno">  907</span>       <span class="keywordflow">if</span>(layer_opt.size())</div>
+<div class="line"><a name="l00908"></a><span class="lineno">  908</span>     <span class="keywordflow">if</span>(find(layer_opt.begin(),layer_opt.end(),currentLayername)==layer_opt.end())</div>
+<div class="line"><a name="l00909"></a><span class="lineno">  909</span>       <span class="keywordflow">continue</span>;</div>
+<div class="line"><a name="l00910"></a><span class="lineno">  910</span>       cout << <span class="stringliteral">"processing layer "</span> << currentLayername << endl;</div>
+<div class="line"><a name="l00911"></a><span class="lineno">  911</span>       </div>
+<div class="line"><a name="l00912"></a><span class="lineno">  912</span>       readLayer->ResetReading();</div>
+<div class="line"><a name="l00913"></a><span class="lineno">  913</span>       OGRLayer *writeLayer;</div>
+<div class="line"><a name="l00914"></a><span class="lineno">  914</span>       OGRLayer *writeTestLayer;</div>
+<div class="line"><a name="l00915"></a><span class="lineno">  915</span> </div>
+<div class="line"><a name="l00916"></a><span class="lineno">  916</span>       <span class="keywordflow">if</span>(polygon_opt[0]){</div>
+<div class="line"><a name="l00917"></a><span class="lineno">  917</span>     <span class="keywordflow">if</span>(verbose_opt[0])</div>
+<div class="line"><a name="l00918"></a><span class="lineno">  918</span>       std::cout << <span class="stringliteral">"create polygons"</span> << std::endl;</div>
+<div class="line"><a name="l00919"></a><span class="lineno">  919</span>     <span class="keywordtype">char</span> **papszOptions=NULL;</div>
+<div class="line"><a name="l00920"></a><span class="lineno">  920</span>     writeLayer=ogrWriter.createLayer(readLayer->GetName(), imgReader.getProjection(), wkbPolygon, papszOptions);</div>
+<div class="line"><a name="l00921"></a><span class="lineno">  921</span>     <span class="keywordflow">if</span>(test_opt.size())</div>
+<div class="line"><a name="l00922"></a><span class="lineno">  922</span>       writeTestLayer=ogrTestWriter.createLayer(readLayer->GetName(), imgReader.getProjection(), wkbPolygon, papszOptions);</div>
+<div class="line"><a name="l00923"></a><span class="lineno">  923</span>       }</div>
+<div class="line"><a name="l00924"></a><span class="lineno">  924</span>       <span class="keywordflow">else</span>{</div>
+<div class="line"><a name="l00925"></a><span class="lineno">  925</span>     <span class="keywordflow">if</span>(verbose_opt[0])</div>
+<div class="line"><a name="l00926"></a><span class="lineno">  926</span>       std::cout << <span class="stringliteral">"create points in layer "</span> << readLayer->GetName() << std::endl;</div>
+<div class="line"><a name="l00927"></a><span class="lineno">  927</span>     <span class="keywordtype">char</span> **papszOptions=NULL;</div>
+<div class="line"><a name="l00928"></a><span class="lineno">  928</span> </div>
+<div class="line"><a name="l00929"></a><span class="lineno">  929</span>     writeLayer=ogrWriter.createLayer(readLayer->GetName(), imgReader.getProjection(), wkbPoint, papszOptions);</div>
+<div class="line"><a name="l00930"></a><span class="lineno">  930</span>     <span class="keywordflow">if</span>(test_opt.size()){</div>
+<div class="line"><a name="l00931"></a><span class="lineno">  931</span>       <span class="keywordtype">char</span> **papszOptions=NULL;</div>
+<div class="line"><a name="l00932"></a><span class="lineno">  932</span>       writeTestLayer=ogrTestWriter.createLayer(readLayer->GetName(), imgReader.getProjection(), wkbPoint, papszOptions);</div>
+<div class="line"><a name="l00933"></a><span class="lineno">  933</span>     }</div>
+<div class="line"><a name="l00934"></a><span class="lineno">  934</span>       }</div>
+<div class="line"><a name="l00935"></a><span class="lineno">  935</span>       <span class="keywordflow">if</span>(verbose_opt[0])</div>
+<div class="line"><a name="l00936"></a><span class="lineno">  936</span>     std::cout << <span class="stringliteral">"copy fields from layer "</span> << ilayer << std::flush << std::endl;</div>
+<div class="line"><a name="l00937"></a><span class="lineno">  937</span>       ogrWriter.copyFields(sampleReaderOgr,ilayer,ilayerWrite);</div>
+<div class="line"><a name="l00938"></a><span class="lineno">  938</span> </div>
+<div class="line"><a name="l00939"></a><span class="lineno">  939</span>       <span class="keywordflow">if</span>(test_opt.size()){</div>
+<div class="line"><a name="l00940"></a><span class="lineno">  940</span>     <span class="keywordflow">if</span>(verbose_opt[0])</div>
+<div class="line"><a name="l00941"></a><span class="lineno">  941</span>       std::cout << <span class="stringliteral">"copy fields test writer"</span> << std::flush << std::endl;</div>
+<div class="line"><a name="l00942"></a><span class="lineno">  942</span>     ogrTestWriter.copyFields(sampleReaderOgr,ilayer,ilayerWrite);</div>
+<div class="line"><a name="l00943"></a><span class="lineno">  943</span>       }</div>
+<div class="line"><a name="l00944"></a><span class="lineno">  944</span>       <span class="comment">// vector<std::string> fieldnames;</span></div>
+<div class="line"><a name="l00945"></a><span class="lineno">  945</span>       <span class="comment">// if(verbose_opt[0])</span></div>
+<div class="line"><a name="l00946"></a><span class="lineno">  946</span>       <span class="comment">//    std::cout << "get fields" << std::flush << std::endl;</span></div>
+<div class="line"><a name="l00947"></a><span class="lineno">  947</span>       <span class="comment">// sampleReaderOgr.getFields(fieldnames);</span></div>
+<div class="line"><a name="l00948"></a><span class="lineno">  948</span>       <span class="comment">// assert(fieldnames.size()==ogrWriter.getFieldCount(ilayerWrite));</span></div>
+<div class="line"><a name="l00949"></a><span class="lineno">  949</span>       <span class="comment">// map<std::string,double> pointAttributes;</span></div>
+<div class="line"><a name="l00950"></a><span class="lineno">  950</span> </div>
+<div class="line"><a name="l00951"></a><span class="lineno">  951</span>       <span class="keywordflow">if</span>(class_opt.size()){</div>
+<div class="line"><a name="l00952"></a><span class="lineno">  952</span>     <span class="keywordflow">switch</span>(ruleMap[rule_opt[0]]){</div>
+<div class="line"><a name="l00953"></a><span class="lineno">  953</span>     <span class="keywordflow">case</span>(rule::proportion):<span class="comment">//proportion for each class</span></div>
+<div class="line"><a name="l00954"></a><span class="lineno">  954</span>     <span class="keywordflow">case</span>(rule::count):{<span class="comment">//count for each class</span></div>
+<div class="line"><a name="l00955"></a><span class="lineno">  955</span>       <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iclass=0;iclass<class_opt.size();++iclass){</div>
+<div class="line"><a name="l00956"></a><span class="lineno">  956</span>         ostringstream cs;</div>
+<div class="line"><a name="l00957"></a><span class="lineno">  957</span>         cs << class_opt[iclass];</div>
+<div class="line"><a name="l00958"></a><span class="lineno">  958</span>         ogrWriter.createField(cs.str(),fieldType,ilayerWrite);</div>
+<div class="line"><a name="l00959"></a><span class="lineno">  959</span>       }</div>
+<div class="line"><a name="l00960"></a><span class="lineno">  960</span>       <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l00961"></a><span class="lineno">  961</span>     }</div>
+<div class="line"><a name="l00962"></a><span class="lineno">  962</span>     <span class="keywordflow">case</span>(rule::custom):</div>
+<div class="line"><a name="l00963"></a><span class="lineno">  963</span>     <span class="keywordflow">case</span>(rule::mode):</div>
+<div class="line"><a name="l00964"></a><span class="lineno">  964</span>       ogrWriter.createField(label_opt[0],fieldType,ilayerWrite);</div>
+<div class="line"><a name="l00965"></a><span class="lineno">  965</span>     <span class="keywordflow">if</span>(test_opt.size())</div>
+<div class="line"><a name="l00966"></a><span class="lineno">  966</span>       ogrTestWriter.createField(label_opt[0],fieldType,ilayerWrite);</div>
+<div class="line"><a name="l00967"></a><span class="lineno">  967</span>     <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l00968"></a><span class="lineno">  968</span>     }</div>
+<div class="line"><a name="l00969"></a><span class="lineno">  969</span>       }</div>
+<div class="line"><a name="l00970"></a><span class="lineno">  970</span>       <span class="keywordflow">else</span>{</div>
+<div class="line"><a name="l00971"></a><span class="lineno">  971</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iband=0;iband<nband;++iband){</div>
+<div class="line"><a name="l00972"></a><span class="lineno">  972</span>       <span class="keywordtype">int</span> theBand=(band_opt.size()) ? band_opt[iband] : iband;</div>
+<div class="line"><a name="l00973"></a><span class="lineno">  973</span>       ostringstream fs;</div>
+<div class="line"><a name="l00974"></a><span class="lineno">  974</span>       fs << fieldname_opt[iband];</div>
+<div class="line"><a name="l00975"></a><span class="lineno">  975</span>       <span class="keywordflow">if</span>(verbose_opt[0]>1)</div>
+<div class="line"><a name="l00976"></a><span class="lineno">  976</span>         std::cout << <span class="stringliteral">"creating field "</span> << fs.str() << std::endl;</div>
+<div class="line"><a name="l00977"></a><span class="lineno">  977</span> </div>
+<div class="line"><a name="l00978"></a><span class="lineno">  978</span>       ogrWriter.createField(fs.str(),fieldType,ilayerWrite);</div>
+<div class="line"><a name="l00979"></a><span class="lineno">  979</span>       <span class="keywordflow">if</span>(test_opt.size())</div>
+<div class="line"><a name="l00980"></a><span class="lineno">  980</span>         ogrTestWriter.createField(fs.str(),fieldType,ilayerWrite);</div>
+<div class="line"><a name="l00981"></a><span class="lineno">  981</span>     }</div>
+<div class="line"><a name="l00982"></a><span class="lineno">  982</span>       }</div>
+<div class="line"><a name="l00983"></a><span class="lineno">  983</span>       OGRFeature *readFeature;</div>
+<div class="line"><a name="l00984"></a><span class="lineno">  984</span>       <span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> ifeature=0;</div>
+<div class="line"><a name="l00985"></a><span class="lineno">  985</span>       <span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> nfeature=sampleReaderOgr.getFeatureCount();</div>
+<div class="line"><a name="l00986"></a><span class="lineno">  986</span>       progress=0;</div>
+<div class="line"><a name="l00987"></a><span class="lineno">  987</span>       pfnProgress(progress,pszMessage,pProgressArg);</div>
+<div class="line"><a name="l00988"></a><span class="lineno">  988</span>       <span class="keywordflow">while</span>( (readFeature = readLayer->GetNextFeature()) != NULL ){</div>
+<div class="line"><a name="l00989"></a><span class="lineno">  989</span>     <span class="keywordtype">bool</span> validFeature=<span class="keyword">false</span>;</div>
+<div class="line"><a name="l00990"></a><span class="lineno">  990</span>     <span class="keywordtype">bool</span> writeTest=<span class="keyword">false</span>;<span class="comment">//write this feature to test_opt[0] instead of output_opt</span></div>
+<div class="line"><a name="l00991"></a><span class="lineno">  991</span>     <span class="keywordflow">if</span>(verbose_opt[0]>0)</div>
+<div class="line"><a name="l00992"></a><span class="lineno">  992</span>       std::cout << <span class="stringliteral">"reading feature "</span> << readFeature->GetFID() << std::endl;</div>
+<div class="line"><a name="l00993"></a><span class="lineno">  993</span>     <span class="keywordflow">if</span>(threshold_opt[0]>0){<span class="comment">//percentual value</span></div>
+<div class="line"><a name="l00994"></a><span class="lineno">  994</span>       <span class="keywordtype">double</span> p=<span class="keyword">static_cast<</span><span class="keywordtype">double</span><span class="keyword">></span>(rand())/(RAND_MAX);</div>
+<div class="line"><a name="l00995"></a><span class="lineno">  995</span>       p*=100.0;</div>
+<div class="line"><a name="l00996"></a><span class="lineno">  996</span>       <span class="keywordflow">if</span>(p>threshold_opt[0]){</div>
+<div class="line"><a name="l00997"></a><span class="lineno">  997</span>         <span class="keywordflow">if</span>(test_opt.size())</div>
+<div class="line"><a name="l00998"></a><span class="lineno">  998</span>           writeTest=<span class="keyword">true</span>;</div>
+<div class="line"><a name="l00999"></a><span class="lineno">  999</span>         <span class="keywordflow">else</span></div>
+<div class="line"><a name="l01000"></a><span class="lineno"> 1000</span>           <span class="keywordflow">continue</span>;<span class="comment">//do not select for now, go to next feature</span></div>
+<div class="line"><a name="l01001"></a><span class="lineno"> 1001</span>       }</div>
+<div class="line"><a name="l01002"></a><span class="lineno"> 1002</span>     }</div>
+<div class="line"><a name="l01003"></a><span class="lineno"> 1003</span>     <span class="keywordflow">else</span>{<span class="comment">//absolute value</span></div>
+<div class="line"><a name="l01004"></a><span class="lineno"> 1004</span>       <span class="keywordflow">if</span>(ntotalvalid>=-threshold_opt[0]){</div>
+<div class="line"><a name="l01005"></a><span class="lineno"> 1005</span>         <span class="keywordflow">if</span>(test_opt.size())</div>
+<div class="line"><a name="l01006"></a><span class="lineno"> 1006</span>           writeTest=<span class="keyword">true</span>;</div>
+<div class="line"><a name="l01007"></a><span class="lineno"> 1007</span>         <span class="keywordflow">else</span></div>
+<div class="line"><a name="l01008"></a><span class="lineno"> 1008</span>           <span class="keywordflow">continue</span>;<span class="comment">//do not select any more pixels, go to next column feature</span></div>
+<div class="line"><a name="l01009"></a><span class="lineno"> 1009</span>       }</div>
+<div class="line"><a name="l01010"></a><span class="lineno"> 1010</span>     }</div>
+<div class="line"><a name="l01011"></a><span class="lineno"> 1011</span>     <span class="keywordflow">if</span>(verbose_opt[0]>0)</div>
+<div class="line"><a name="l01012"></a><span class="lineno"> 1012</span>       std::cout << <span class="stringliteral">"processing feature "</span> << readFeature->GetFID() << std::endl;</div>
+<div class="line"><a name="l01013"></a><span class="lineno"> 1013</span>     <span class="comment">//get x and y from readFeature</span></div>
+<div class="line"><a name="l01014"></a><span class="lineno"> 1014</span>     <span class="keywordtype">double</span> x,y;</div>
+<div class="line"><a name="l01015"></a><span class="lineno"> 1015</span>     OGRGeometry *poGeometry;</div>
+<div class="line"><a name="l01016"></a><span class="lineno"> 1016</span>     poGeometry = readFeature->GetGeometryRef();</div>
+<div class="line"><a name="l01017"></a><span class="lineno"> 1017</span>     assert(poGeometry!=NULL);</div>
+<div class="line"><a name="l01018"></a><span class="lineno"> 1018</span>     <span class="keywordflow">try</span>{</div>
+<div class="line"><a name="l01019"></a><span class="lineno"> 1019</span>       <span class="keywordflow">if</span>(wkbFlatten(poGeometry->getGeometryType()) == wkbPoint ){</div>
+<div class="line"><a name="l01020"></a><span class="lineno"> 1020</span> </div>
+<div class="line"><a name="l01021"></a><span class="lineno"> 1021</span>         <span class="keywordflow">if</span>(!buffer_opt.size()){</div>
+<div class="line"><a name="l01022"></a><span class="lineno"> 1022</span>           <span class="keywordflow">switch</span>(ruleMap[rule_opt[0]]){</div>
+<div class="line"><a name="l01023"></a><span class="lineno"> 1023</span>           <span class="keywordflow">case</span>(rule::point):</div>
+<div class="line"><a name="l01024"></a><span class="lineno"> 1024</span>           <span class="keywordflow">case</span>(rule::centroid):</div>
+<div class="line"><a name="l01025"></a><span class="lineno"> 1025</span>         buffer_opt.push_back(1);<span class="comment">//default</span></div>
+<div class="line"><a name="l01026"></a><span class="lineno"> 1026</span>           <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l01027"></a><span class="lineno"> 1027</span>           <span class="keywordflow">default</span>:</div>
+<div class="line"><a name="l01028"></a><span class="lineno"> 1028</span>         buffer_opt.push_back(3);<span class="comment">//default</span></div>
+<div class="line"><a name="l01029"></a><span class="lineno"> 1029</span>           }</div>
+<div class="line"><a name="l01030"></a><span class="lineno"> 1030</span>         }</div>
+<div class="line"><a name="l01031"></a><span class="lineno"> 1031</span> </div>
+<div class="line"><a name="l01032"></a><span class="lineno"> 1032</span>         <span class="keywordflow">if</span>(verbose_opt[0]>1)</div>
+<div class="line"><a name="l01033"></a><span class="lineno"> 1033</span>           std::cout << <span class="stringliteral">"boundary: "</span> << buffer_opt[0] << std::endl;</div>
+<div class="line"><a name="l01034"></a><span class="lineno"> 1034</span> </div>
+<div class="line"><a name="l01035"></a><span class="lineno"> 1035</span>         OGRPolygon writePolygon;</div>
+<div class="line"><a name="l01036"></a><span class="lineno"> 1036</span>         OGRLinearRing writeRing;</div>
+<div class="line"><a name="l01037"></a><span class="lineno"> 1037</span>         OGRPoint writeCentroidPoint;</div>
+<div class="line"><a name="l01038"></a><span class="lineno"> 1038</span>         OGRFeature *writePolygonFeature;</div>
+<div class="line"><a name="l01039"></a><span class="lineno"> 1039</span>         OGRFeature *writeCentroidFeature;</div>
+<div class="line"><a name="l01040"></a><span class="lineno"> 1040</span> </div>
+<div class="line"><a name="l01041"></a><span class="lineno"> 1041</span>         OGRPoint *poPoint = (OGRPoint *) poGeometry;</div>
+<div class="line"><a name="l01042"></a><span class="lineno"> 1042</span>         writeCentroidPoint=*poPoint;</div>
+<div class="line"><a name="l01043"></a><span class="lineno"> 1043</span> </div>
+<div class="line"><a name="l01044"></a><span class="lineno"> 1044</span>         x=poPoint->getX();</div>
+<div class="line"><a name="l01045"></a><span class="lineno"> 1045</span>         y=poPoint->getY();</div>
+<div class="line"><a name="l01046"></a><span class="lineno"> 1046</span> </div>
+<div class="line"><a name="l01047"></a><span class="lineno"> 1047</span>         <span class="keywordtype">double</span> i_centre,j_centre;</div>
+<div class="line"><a name="l01048"></a><span class="lineno"> 1048</span>         <span class="keywordflow">if</span>(geo_opt[0])</div>
+<div class="line"><a name="l01049"></a><span class="lineno"> 1049</span>           imgReader.geo2image(x,y,i_centre,j_centre);</div>
+<div class="line"><a name="l01050"></a><span class="lineno"> 1050</span>         <span class="keywordflow">else</span>{</div>
+<div class="line"><a name="l01051"></a><span class="lineno"> 1051</span>           i_centre=x;</div>
+<div class="line"><a name="l01052"></a><span class="lineno"> 1052</span>           j_centre=y;</div>
+<div class="line"><a name="l01053"></a><span class="lineno"> 1053</span>         }</div>
+<div class="line"><a name="l01054"></a><span class="lineno"> 1054</span>         <span class="comment">//nearest neighbour</span></div>
+<div class="line"><a name="l01055"></a><span class="lineno"> 1055</span>         j_centre=<span class="keyword">static_cast<</span><span class="keywordtype">int</span><span class="keyword">></span>(j_centre);</div>
+<div class="line"><a name="l01056"></a><span class="lineno"> 1056</span>         i_centre=<span class="keyword">static_cast<</span><span class="keywordtype">int</span><span class="keyword">></span>(i_centre);</div>
+<div class="line"><a name="l01057"></a><span class="lineno"> 1057</span> </div>
+<div class="line"><a name="l01058"></a><span class="lineno"> 1058</span>         <span class="keywordtype">double</span> uli=i_centre-buffer_opt[0]/2;</div>
+<div class="line"><a name="l01059"></a><span class="lineno"> 1059</span>         <span class="keywordtype">double</span> ulj=j_centre-buffer_opt[0]/2;</div>
+<div class="line"><a name="l01060"></a><span class="lineno"> 1060</span>         <span class="keywordtype">double</span> lri=i_centre+buffer_opt[0]/2;</div>
+<div class="line"><a name="l01061"></a><span class="lineno"> 1061</span>         <span class="keywordtype">double</span> lrj=j_centre+buffer_opt[0]/2;</div>
+<div class="line"><a name="l01062"></a><span class="lineno"> 1062</span> </div>
+<div class="line"><a name="l01063"></a><span class="lineno"> 1063</span>         <span class="comment">//nearest neighbour</span></div>
+<div class="line"><a name="l01064"></a><span class="lineno"> 1064</span>         ulj=<span class="keyword">static_cast<</span><span class="keywordtype">int</span><span class="keyword">></span>(ulj);</div>
+<div class="line"><a name="l01065"></a><span class="lineno"> 1065</span>         uli=<span class="keyword">static_cast<</span><span class="keywordtype">int</span><span class="keyword">></span>(uli);</div>
+<div class="line"><a name="l01066"></a><span class="lineno"> 1066</span>         lrj=<span class="keyword">static_cast<</span><span class="keywordtype">int</span><span class="keyword">></span>(lrj);</div>
+<div class="line"><a name="l01067"></a><span class="lineno"> 1067</span>         lri=<span class="keyword">static_cast<</span><span class="keywordtype">int</span><span class="keyword">></span>(lri);</div>
+<div class="line"><a name="l01068"></a><span class="lineno"> 1068</span> </div>
+<div class="line"><a name="l01069"></a><span class="lineno"> 1069</span>         <span class="comment">// if((polygon_opt[0]&&ruleMap[rule_opt[0]]==rule::point)||(ruleMap[rule_opt[0]]==rule::centroid)){</span></div>
+<div class="line"><a name="l01070"></a><span class="lineno"> 1070</span>         <span class="comment">//   uli=i_centre;</span></div>
+<div class="line"><a name="l01071"></a><span class="lineno"> 1071</span>         <span class="comment">//   ulj=j_centre;</span></div>
+<div class="line"><a name="l01072"></a><span class="lineno"> 1072</span>         <span class="comment">//   lri=i_centre;</span></div>
+<div class="line"><a name="l01073"></a><span class="lineno"> 1073</span>         <span class="comment">//   lrj=j_centre;</span></div>
+<div class="line"><a name="l01074"></a><span class="lineno"> 1074</span>         <span class="comment">// }</span></div>
+<div class="line"><a name="l01075"></a><span class="lineno"> 1075</span> </div>
+<div class="line"><a name="l01076"></a><span class="lineno"> 1076</span>         <span class="comment">//check if j is out of bounds</span></div>
+<div class="line"><a name="l01077"></a><span class="lineno"> 1077</span>         <span class="keywordflow">if</span>(static_cast<int>(ulj)<0||<span class="keyword">static_cast<</span><span class="keywordtype">int</span><span class="keyword">></span>(ulj)>=imgReader.nrOfRow())</div>
+<div class="line"><a name="l01078"></a><span class="lineno"> 1078</span>           <span class="keywordflow">continue</span>;</div>
+<div class="line"><a name="l01079"></a><span class="lineno"> 1079</span>         <span class="comment">//check if j is out of bounds</span></div>
+<div class="line"><a name="l01080"></a><span class="lineno"> 1080</span>         <span class="keywordflow">if</span>(static_cast<int>(uli)<0||<span class="keyword">static_cast<</span><span class="keywordtype">int</span><span class="keyword">></span>(lri)>=imgReader.nrOfCol())</div>
+<div class="line"><a name="l01081"></a><span class="lineno"> 1081</span>           <span class="keywordflow">continue</span>;</div>
+<div class="line"><a name="l01082"></a><span class="lineno"> 1082</span> </div>
+<div class="line"><a name="l01083"></a><span class="lineno"> 1083</span>         OGRPoint ulPoint,urPoint,llPoint,lrPoint;</div>
+<div class="line"><a name="l01084"></a><span class="lineno"> 1084</span>         <span class="keywordtype">double</span> ulx,uly;</div>
+<div class="line"><a name="l01085"></a><span class="lineno"> 1085</span>         <span class="keywordtype">double</span> urx,ury;</div>
+<div class="line"><a name="l01086"></a><span class="lineno"> 1086</span> </div>
+<div class="line"><a name="l01087"></a><span class="lineno"> 1087</span>         <span class="keywordflow">if</span>(polygon_opt[0]){</div>
+<div class="line"><a name="l01088"></a><span class="lineno"> 1088</span>           <span class="keywordflow">if</span>(disc_opt[0]){</div>
+<div class="line"><a name="l01089"></a><span class="lineno"> 1089</span>         <span class="keywordtype">double</span> gt[6];<span class="comment">// { 444720, 30, 0, 3751320, 0, -30 };</span></div>
+<div class="line"><a name="l01090"></a><span class="lineno"> 1090</span>         <span class="keywordtype">double</span> radius=buffer_opt[0]/2.0*sqrt(imgReader.getDeltaX()*imgReader.getDeltaY());</div>
+<div class="line"><a name="l01091"></a><span class="lineno"> 1091</span>         <span class="keywordtype">unsigned</span> <span class="keywordtype">short</span> nstep = 25;</div>
+<div class="line"><a name="l01092"></a><span class="lineno"> 1092</span>         <span class="keywordflow">for</span>(<span class="keywordtype">int</span> i=0;i<nstep;++i){</div>
+<div class="line"><a name="l01093"></a><span class="lineno"> 1093</span>           OGRPoint aPoint;</div>
+<div class="line"><a name="l01094"></a><span class="lineno"> 1094</span>           aPoint.setX(x+imgReader.getDeltaX()/2.0+radius*cos(2*PI*i/nstep));</div>
+<div class="line"><a name="l01095"></a><span class="lineno"> 1095</span>           aPoint.setY(y-imgReader.getDeltaY()/2.0+radius*sin(2*PI*i/nstep));</div>
+<div class="line"><a name="l01096"></a><span class="lineno"> 1096</span>           writeRing.addPoint(&aPoint);</div>
+<div class="line"><a name="l01097"></a><span class="lineno"> 1097</span>         }</div>
+<div class="line"><a name="l01098"></a><span class="lineno"> 1098</span>         writePolygon.addRing(&writeRing);</div>
+<div class="line"><a name="l01099"></a><span class="lineno"> 1099</span>         writePolygon.closeRings();</div>
+<div class="line"><a name="l01100"></a><span class="lineno"> 1100</span>           }</div>
+<div class="line"><a name="l01101"></a><span class="lineno"> 1101</span>           <span class="keywordflow">else</span>{</div>
+<div class="line"><a name="l01102"></a><span class="lineno"> 1102</span>         <span class="keywordtype">double</span> llx,lly;</div>
+<div class="line"><a name="l01103"></a><span class="lineno"> 1103</span>         <span class="keywordtype">double</span> lrx,lry;</div>
+<div class="line"><a name="l01104"></a><span class="lineno"> 1104</span>         imgReader.image2geo(uli,ulj,ulx,uly);</div>
+<div class="line"><a name="l01105"></a><span class="lineno"> 1105</span>         imgReader.image2geo(lri,lrj,lrx,lry);</div>
+<div class="line"><a name="l01106"></a><span class="lineno"> 1106</span>         ulPoint.setX(ulx-imgReader.getDeltaX()/2.0);</div>
+<div class="line"><a name="l01107"></a><span class="lineno"> 1107</span>         ulPoint.setY(uly+imgReader.getDeltaY()/2.0);</div>
+<div class="line"><a name="l01108"></a><span class="lineno"> 1108</span>         lrPoint.setX(lrx+imgReader.getDeltaX()/2.0);</div>
+<div class="line"><a name="l01109"></a><span class="lineno"> 1109</span>         lrPoint.setY(lry-imgReader.getDeltaY()/2.0);</div>
+<div class="line"><a name="l01110"></a><span class="lineno"> 1110</span>         urPoint.setX(lrx+imgReader.getDeltaX()/2.0);</div>
+<div class="line"><a name="l01111"></a><span class="lineno"> 1111</span>         urPoint.setY(uly+imgReader.getDeltaY()/2.0);</div>
+<div class="line"><a name="l01112"></a><span class="lineno"> 1112</span>         llPoint.setX(ulx-imgReader.getDeltaX()/2.0);</div>
+<div class="line"><a name="l01113"></a><span class="lineno"> 1113</span>         llPoint.setY(lry-imgReader.getDeltaY()/2.0);</div>
+<div class="line"><a name="l01114"></a><span class="lineno"> 1114</span> </div>
+<div class="line"><a name="l01115"></a><span class="lineno"> 1115</span>         writeRing.addPoint(&ulPoint);</div>
+<div class="line"><a name="l01116"></a><span class="lineno"> 1116</span>         writeRing.addPoint(&urPoint);</div>
+<div class="line"><a name="l01117"></a><span class="lineno"> 1117</span>         writeRing.addPoint(&lrPoint);</div>
+<div class="line"><a name="l01118"></a><span class="lineno"> 1118</span>         writeRing.addPoint(&llPoint);</div>
+<div class="line"><a name="l01119"></a><span class="lineno"> 1119</span>         writePolygon.addRing(&writeRing);</div>
+<div class="line"><a name="l01120"></a><span class="lineno"> 1120</span>         writePolygon.closeRings();</div>
+<div class="line"><a name="l01121"></a><span class="lineno"> 1121</span>           }</div>
+<div class="line"><a name="l01122"></a><span class="lineno"> 1122</span>         }</div>
+<div class="line"><a name="l01123"></a><span class="lineno"> 1123</span> </div>
+<div class="line"><a name="l01124"></a><span class="lineno"> 1124</span>         <span class="keywordflow">if</span>((polygon_opt[0]&&ruleMap[rule_opt[0]]==rule::point)||(ruleMap[rule_opt[0]]==rule::centroid)){</div>
+<div class="line"><a name="l01125"></a><span class="lineno"> 1125</span>           uli=i_centre;</div>
+<div class="line"><a name="l01126"></a><span class="lineno"> 1126</span>           ulj=j_centre;</div>
+<div class="line"><a name="l01127"></a><span class="lineno"> 1127</span>           lri=i_centre;</div>
+<div class="line"><a name="l01128"></a><span class="lineno"> 1128</span>           lrj=j_centre;</div>
+<div class="line"><a name="l01129"></a><span class="lineno"> 1129</span>         }</div>
+<div class="line"><a name="l01130"></a><span class="lineno"> 1130</span> </div>
+<div class="line"><a name="l01131"></a><span class="lineno"> 1131</span>         <span class="keywordtype">int</span> nPointWindow=0;<span class="comment">//similar to nPointPolygon for polygons</span></div>
+<div class="line"><a name="l01132"></a><span class="lineno"> 1132</span>         <span class="keywordflow">if</span>(polygon_opt[0]){</div>
+<div class="line"><a name="l01133"></a><span class="lineno"> 1133</span>           <span class="keywordflow">if</span>(writeTest)</div>
+<div class="line"><a name="l01134"></a><span class="lineno"> 1134</span>         writePolygonFeature = OGRFeature::CreateFeature(writeTestLayer->GetLayerDefn());</div>
+<div class="line"><a name="l01135"></a><span class="lineno"> 1135</span>           <span class="keywordflow">else</span></div>
+<div class="line"><a name="l01136"></a><span class="lineno"> 1136</span>         writePolygonFeature = OGRFeature::CreateFeature(writeLayer->GetLayerDefn());</div>
+<div class="line"><a name="l01137"></a><span class="lineno"> 1137</span>         }</div>
+<div class="line"><a name="l01138"></a><span class="lineno"> 1138</span>         <span class="keywordflow">else</span> <span class="keywordflow">if</span>(ruleMap[rule_opt[0]]!=rule::point){</div>
+<div class="line"><a name="l01139"></a><span class="lineno"> 1139</span>           <span class="keywordflow">if</span>(writeTest)</div>
+<div class="line"><a name="l01140"></a><span class="lineno"> 1140</span>         writeCentroidFeature = OGRFeature::CreateFeature(writeTestLayer->GetLayerDefn());</div>
+<div class="line"><a name="l01141"></a><span class="lineno"> 1141</span>           <span class="keywordflow">else</span></div>
+<div class="line"><a name="l01142"></a><span class="lineno"> 1142</span>         writeCentroidFeature = OGRFeature::CreateFeature(writeLayer->GetLayerDefn());</div>
+<div class="line"><a name="l01143"></a><span class="lineno"> 1143</span>         }</div>
+<div class="line"><a name="l01144"></a><span class="lineno"> 1144</span>         <a class="code" href="classVector2d.html">Vector2d<double></a> windowValues;</div>
+<div class="line"><a name="l01145"></a><span class="lineno"> 1145</span>         vector<double> windowClassValues;</div>
+<div class="line"><a name="l01146"></a><span class="lineno"> 1146</span> </div>
+<div class="line"><a name="l01147"></a><span class="lineno"> 1147</span>         <span class="keywordflow">if</span>(class_opt.size()){</div>
+<div class="line"><a name="l01148"></a><span class="lineno"> 1148</span>           windowClassValues.resize(class_opt.size());</div>
+<div class="line"><a name="l01149"></a><span class="lineno"> 1149</span>           <span class="comment">//initialize</span></div>
+<div class="line"><a name="l01150"></a><span class="lineno"> 1150</span>           <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iclass=0;iclass<class_opt.size();++iclass)</div>
+<div class="line"><a name="l01151"></a><span class="lineno"> 1151</span>         windowClassValues[iclass]=0;</div>
+<div class="line"><a name="l01152"></a><span class="lineno"> 1152</span>         }</div>
+<div class="line"><a name="l01153"></a><span class="lineno"> 1153</span>         <span class="keywordflow">else</span></div>
+<div class="line"><a name="l01154"></a><span class="lineno"> 1154</span>           windowValues.resize(nband);</div>
+<div class="line"><a name="l01155"></a><span class="lineno"> 1155</span>         vector< Vector2d<double> > readValues(nband);</div>
+<div class="line"><a name="l01156"></a><span class="lineno"> 1156</span>         <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iband=0;iband<nband;++iband){</div>
+<div class="line"><a name="l01157"></a><span class="lineno"> 1157</span>           <span class="keywordtype">int</span> theBand=(band_opt.size()) ? band_opt[iband] : iband;</div>
+<div class="line"><a name="l01158"></a><span class="lineno"> 1158</span>           imgReader.readDataBlock(readValues[iband],GDT_Float64,uli,lri,ulj,lrj,theBand);</div>
+<div class="line"><a name="l01159"></a><span class="lineno"> 1159</span>         }</div>
+<div class="line"><a name="l01160"></a><span class="lineno"> 1160</span> </div>
+<div class="line"><a name="l01161"></a><span class="lineno"> 1161</span>         OGRPoint thePoint;</div>
+<div class="line"><a name="l01162"></a><span class="lineno"> 1162</span>         <span class="keywordflow">for</span>(<span class="keywordtype">int</span> j=ulj;j<=lrj;++j){</div>
+<div class="line"><a name="l01163"></a><span class="lineno"> 1163</span>           <span class="keywordflow">for</span>(<span class="keywordtype">int</span> i=uli;i<=lri;++i){</div>
+<div class="line"><a name="l01164"></a><span class="lineno"> 1164</span>         <span class="comment">//check if within raster image</span></div>
+<div class="line"><a name="l01165"></a><span class="lineno"> 1165</span>         <span class="keywordflow">if</span>(i<0||i>=imgReader.nrOfCol())</div>
+<div class="line"><a name="l01166"></a><span class="lineno"> 1166</span>           <span class="keywordflow">continue</span>;</div>
+<div class="line"><a name="l01167"></a><span class="lineno"> 1167</span>         <span class="keywordflow">if</span>(j<0||j>=imgReader.nrOfRow())</div>
+<div class="line"><a name="l01168"></a><span class="lineno"> 1168</span>           <span class="keywordflow">continue</span>;</div>
+<div class="line"><a name="l01169"></a><span class="lineno"> 1169</span>         <span class="comment">//no need to check if point is on surface</span></div>
+<div class="line"><a name="l01170"></a><span class="lineno"> 1170</span>         <span class="keywordtype">double</span> theX=0;</div>
+<div class="line"><a name="l01171"></a><span class="lineno"> 1171</span>         <span class="keywordtype">double</span> theY=0;</div>
+<div class="line"><a name="l01172"></a><span class="lineno"> 1172</span>         imgReader.image2geo(i,j,theX,theY);</div>
+<div class="line"><a name="l01173"></a><span class="lineno"> 1173</span>         thePoint.setX(theX);</div>
+<div class="line"><a name="l01174"></a><span class="lineno"> 1174</span>         thePoint.setY(theY);</div>
+<div class="line"><a name="l01175"></a><span class="lineno"> 1175</span> </div>
+<div class="line"><a name="l01176"></a><span class="lineno"> 1176</span>         <span class="keywordflow">if</span>(disc_opt[0]&&buffer_opt[0]>1){</div>
+<div class="line"><a name="l01177"></a><span class="lineno"> 1177</span>           <span class="keywordtype">double</span> radius=buffer_opt[0]/2.0*sqrt(imgReader.getDeltaX()*imgReader.getDeltaY());</div>
+<div class="line"><a name="l01178"></a><span class="lineno"> 1178</span>           <span class="keywordflow">if</span>((theX-x)*(theX-x)+(theY-y)*(theY-y)>radius*radius)</div>
+<div class="line"><a name="l01179"></a><span class="lineno"> 1179</span>             <span class="keywordflow">continue</span>;</div>
+<div class="line"><a name="l01180"></a><span class="lineno"> 1180</span>         }</div>
+<div class="line"><a name="l01181"></a><span class="lineno"> 1181</span>         <span class="keywordtype">bool</span> valid=<span class="keyword">true</span>;</div>
+<div class="line"><a name="l01182"></a><span class="lineno"> 1182</span> </div>
+<div class="line"><a name="l01183"></a><span class="lineno"> 1183</span>         <span class="keywordflow">if</span>(srcnodata_opt.size()){</div>
+<div class="line"><a name="l01184"></a><span class="lineno"> 1184</span>           <span class="keywordflow">for</span>(<span class="keywordtype">int</span> vband=0;vband<bndnodata_opt.size();++vband){</div>
+<div class="line"><a name="l01185"></a><span class="lineno"> 1185</span>             <span class="keywordtype">double</span> value=((readValues[bndnodata_opt[vband]])[j-ulj])[i-uli];</div>
+<div class="line"><a name="l01186"></a><span class="lineno"> 1186</span>             <span class="keywordflow">if</span>(value==srcnodata_opt[vband]){</div>
+<div class="line"><a name="l01187"></a><span class="lineno"> 1187</span>               valid=<span class="keyword">false</span>;</div>
 <div class="line"><a name="l01188"></a><span class="lineno"> 1188</span>               <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l01189"></a><span class="lineno"> 1189</span>             <span class="keywordflow">default</span>:<span class="comment">//not supported</span></div>
-<div class="line"><a name="l01190"></a><span class="lineno"> 1190</span>               std::string errorString=<span class="stringliteral">"field type not supported"</span>;</div>
-<div class="line"><a name="l01191"></a><span class="lineno"> 1191</span>               <span class="keywordflow">throw</span>(errorString);</div>
-<div class="line"><a name="l01192"></a><span class="lineno"> 1192</span>               <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l01193"></a><span class="lineno"> 1193</span>             }</div>
-<div class="line"><a name="l01194"></a><span class="lineno"> 1194</span>               }</div>
-<div class="line"><a name="l01195"></a><span class="lineno"> 1195</span>               <span class="keywordflow">catch</span>(std::string e){</div>
-<div class="line"><a name="l01196"></a><span class="lineno"> 1196</span>             std::cout << e << std::endl;</div>
-<div class="line"><a name="l01197"></a><span class="lineno"> 1197</span>             exit(1);</div>
-<div class="line"><a name="l01198"></a><span class="lineno"> 1198</span>               }</div>
-<div class="line"><a name="l01199"></a><span class="lineno"> 1199</span>             }<span class="comment">//else</span></div>
-<div class="line"><a name="l01200"></a><span class="lineno"> 1200</span>           }<span class="comment">//iband</span></div>
-<div class="line"><a name="l01201"></a><span class="lineno"> 1201</span>         }<span class="comment">//else (class_opt.size())</span></div>
+<div class="line"><a name="l01189"></a><span class="lineno"> 1189</span>             }</div>
+<div class="line"><a name="l01190"></a><span class="lineno"> 1190</span>           }</div>
+<div class="line"><a name="l01191"></a><span class="lineno"> 1191</span>         }</div>
+<div class="line"><a name="l01192"></a><span class="lineno"> 1192</span> </div>
+<div class="line"><a name="l01193"></a><span class="lineno"> 1193</span>         <span class="keywordflow">if</span>(!valid)</div>
+<div class="line"><a name="l01194"></a><span class="lineno"> 1194</span>           <span class="keywordflow">continue</span>;</div>
+<div class="line"><a name="l01195"></a><span class="lineno"> 1195</span>         <span class="keywordflow">else</span></div>
+<div class="line"><a name="l01196"></a><span class="lineno"> 1196</span>           validFeature=<span class="keyword">true</span>;</div>
+<div class="line"><a name="l01197"></a><span class="lineno"> 1197</span> </div>
+<div class="line"><a name="l01198"></a><span class="lineno"> 1198</span>         <span class="comment">// writeRing.addPoint(&thePoint);//already done</span></div>
+<div class="line"><a name="l01199"></a><span class="lineno"> 1199</span> </div>
+<div class="line"><a name="l01200"></a><span class="lineno"> 1200</span>         ++nPointWindow;</div>
+<div class="line"><a name="l01201"></a><span class="lineno"> 1201</span>         OGRFeature *writePointFeature;</div>
 <div class="line"><a name="l01202"></a><span class="lineno"> 1202</span>         <span class="keywordflow">if</span>(!polygon_opt[0]){</div>
-<div class="line"><a name="l01203"></a><span class="lineno"> 1203</span>           <span class="keywordflow">if</span>(ruleMap[rule_opt[0]]==rule::point){<span class="comment">//do not create in case of mean or median value (only at centroid)</span></div>
-<div class="line"><a name="l01204"></a><span class="lineno"> 1204</span>             <span class="comment">//write feature</span></div>
-<div class="line"><a name="l01205"></a><span class="lineno"> 1205</span>             <span class="keywordflow">if</span>(verbose_opt[0]>1)</div>
-<div class="line"><a name="l01206"></a><span class="lineno"> 1206</span>               std::cout << <span class="stringliteral">"creating point feature"</span> << std::endl;</div>
-<div class="line"><a name="l01207"></a><span class="lineno"> 1207</span>             <span class="keywordflow">if</span>(writeTest){</div>
-<div class="line"><a name="l01208"></a><span class="lineno"> 1208</span>               <span class="keywordflow">if</span>(writeTestLayer->CreateFeature( writePointFeature ) != OGRERR_NONE ){</div>
-<div class="line"><a name="l01209"></a><span class="lineno"> 1209</span>             std::string errorString=<span class="stringliteral">"Failed to create feature in test ogr vector dataset"</span>;</div>
-<div class="line"><a name="l01210"></a><span class="lineno"> 1210</span>             <span class="keywordflow">throw</span>(errorString);</div>
-<div class="line"><a name="l01211"></a><span class="lineno"> 1211</span>               }</div>
-<div class="line"><a name="l01212"></a><span class="lineno"> 1212</span>             }</div>
-<div class="line"><a name="l01213"></a><span class="lineno"> 1213</span>             <span class="keywordflow">else</span>{</div>
-<div class="line"><a name="l01214"></a><span class="lineno"> 1214</span>               <span class="keywordflow">if</span>(writeLayer->CreateFeature( writePointFeature ) != OGRERR_NONE ){</div>
-<div class="line"><a name="l01215"></a><span class="lineno"> 1215</span>             std::string errorString=<span class="stringliteral">"Failed to create feature in ogr vector dataset"</span>;</div>
-<div class="line"><a name="l01216"></a><span class="lineno"> 1216</span>             <span class="keywordflow">throw</span>(errorString);</div>
-<div class="line"><a name="l01217"></a><span class="lineno"> 1217</span>               }</div>
-<div class="line"><a name="l01218"></a><span class="lineno"> 1218</span>             }</div>
-<div class="line"><a name="l01219"></a><span class="lineno"> 1219</span>             <span class="comment">//destroy feature</span></div>
-<div class="line"><a name="l01220"></a><span class="lineno"> 1220</span>             OGRFeature::DestroyFeature( writePointFeature );</div>
-<div class="line"><a name="l01221"></a><span class="lineno"> 1221</span>             ++ntotalvalid;</div>
-<div class="line"><a name="l01222"></a><span class="lineno"> 1222</span>             <span class="keywordflow">if</span>(verbose_opt[0])</div>
-<div class="line"><a name="l01223"></a><span class="lineno"> 1223</span>               std::cout << <span class="stringliteral">"ntotalvalid(2): "</span> << ntotalvalid << std::endl;</div>
+<div class="line"><a name="l01203"></a><span class="lineno"> 1203</span>           <span class="comment">//create feature</span></div>
+<div class="line"><a name="l01204"></a><span class="lineno"> 1204</span>           <span class="keywordflow">if</span>(ruleMap[rule_opt[0]]==rule::point){<span class="comment">//do not create in case of mean, stdev, median, sum or centroid (only create point at centroid)</span></div>
+<div class="line"><a name="l01205"></a><span class="lineno"> 1205</span>             <span class="keywordflow">if</span>(writeTest)</div>
+<div class="line"><a name="l01206"></a><span class="lineno"> 1206</span>               writePointFeature = OGRFeature::CreateFeature(writeTestLayer->GetLayerDefn());</div>
+<div class="line"><a name="l01207"></a><span class="lineno"> 1207</span>             <span class="keywordflow">else</span></div>
+<div class="line"><a name="l01208"></a><span class="lineno"> 1208</span>               writePointFeature = OGRFeature::CreateFeature(writeLayer->GetLayerDefn());</div>
+<div class="line"><a name="l01209"></a><span class="lineno"> 1209</span>             <span class="keywordflow">if</span>(verbose_opt[0]>1)</div>
+<div class="line"><a name="l01210"></a><span class="lineno"> 1210</span>               std::cout << <span class="stringliteral">"copying fields from polygons "</span> << std::endl;</div>
+<div class="line"><a name="l01211"></a><span class="lineno"> 1211</span>             <span class="comment">//Geometry of readFeature and writePointFeature are both wkbPoint</span></div>
+<div class="line"><a name="l01212"></a><span class="lineno"> 1212</span>             <span class="comment">//attributes AND geometry are copied with SetFrom</span></div>
+<div class="line"><a name="l01213"></a><span class="lineno"> 1213</span>             <span class="comment">//test</span></div>
+<div class="line"><a name="l01214"></a><span class="lineno"> 1214</span>             <span class="comment">// writePointFeature->SetGeometry(&thePoint);</span></div>
+<div class="line"><a name="l01215"></a><span class="lineno"> 1215</span>             <span class="keywordflow">if</span>(writePointFeature->SetFrom(readFeature)!= OGRERR_NONE)</div>
+<div class="line"><a name="l01216"></a><span class="lineno"> 1216</span>               cerr << <span class="stringliteral">"writing feature failed"</span> << std::endl;</div>
+<div class="line"><a name="l01217"></a><span class="lineno"> 1217</span> </div>
+<div class="line"><a name="l01218"></a><span class="lineno"> 1218</span>             assert(wkbFlatten(writePointFeature->GetGeometryRef()->getGeometryType()) == wkbPoint);</div>
+<div class="line"><a name="l01219"></a><span class="lineno"> 1219</span>             <span class="comment">// OGRGeometry *updateGeometry;</span></div>
+<div class="line"><a name="l01220"></a><span class="lineno"> 1220</span>             <span class="comment">// updateGeometry = writePointFeature->GetGeometryRef();</span></div>
+<div class="line"><a name="l01221"></a><span class="lineno"> 1221</span>             <span class="comment">// OGRPoint *poPoint = (OGRPoint *) updateGeometry;</span></div>
+<div class="line"><a name="l01222"></a><span class="lineno"> 1222</span>             <span class="keywordflow">if</span>(verbose_opt[0]>1)</div>
+<div class="line"><a name="l01223"></a><span class="lineno"> 1223</span>               std::cout << <span class="stringliteral">"write feature has "</span> << writePointFeature->GetFieldCount() << <span class="stringliteral">" fields"</span> << std::endl;</div>
 <div class="line"><a name="l01224"></a><span class="lineno"> 1224</span>           }</div>
 <div class="line"><a name="l01225"></a><span class="lineno"> 1225</span>         }</div>
-<div class="line"><a name="l01226"></a><span class="lineno"> 1226</span>           }</div>
-<div class="line"><a name="l01227"></a><span class="lineno"> 1227</span>         }</div>
-<div class="line"><a name="l01228"></a><span class="lineno"> 1228</span>         <span class="keywordflow">if</span>(polygon_opt[0]||ruleMap[rule_opt[0]]!=rule::point){</div>
-<div class="line"><a name="l01229"></a><span class="lineno"> 1229</span>           <span class="comment">//do not create if no points found within polygon</span></div>
-<div class="line"><a name="l01230"></a><span class="lineno"> 1230</span>           <span class="keywordflow">if</span>(!nPointWindow){</div>
-<div class="line"><a name="l01231"></a><span class="lineno"> 1231</span>         <span class="keywordflow">if</span>(verbose_opt[0])</div>
-<div class="line"><a name="l01232"></a><span class="lineno"> 1232</span>           cout << <span class="stringliteral">"no points found in window, continuing"</span> << endl;</div>
-<div class="line"><a name="l01233"></a><span class="lineno"> 1233</span>         <span class="keywordflow">continue</span>;</div>
-<div class="line"><a name="l01234"></a><span class="lineno"> 1234</span>           }</div>
-<div class="line"><a name="l01235"></a><span class="lineno"> 1235</span>           <span class="comment">//add ring to polygon</span></div>
-<div class="line"><a name="l01236"></a><span class="lineno"> 1236</span>           <span class="keywordflow">if</span>(polygon_opt[0]){</div>
-<div class="line"><a name="l01237"></a><span class="lineno"> 1237</span>         <span class="comment">// writePolygon.addRing(&writeRing);//already done</span></div>
-<div class="line"><a name="l01238"></a><span class="lineno"> 1238</span>         <span class="comment">// writePolygon.closeRings();//already done</span></div>
-<div class="line"><a name="l01239"></a><span class="lineno"> 1239</span>         <span class="comment">//write geometry of writePolygon</span></div>
-<div class="line"><a name="l01240"></a><span class="lineno"> 1240</span>         <span class="comment">//test</span></div>
-<div class="line"><a name="l01241"></a><span class="lineno"> 1241</span>         <span class="comment">// writePolygonFeature->SetGeometry(&writePolygon);</span></div>
-<div class="line"><a name="l01242"></a><span class="lineno"> 1242</span>         <span class="keywordflow">if</span>(writePolygonFeature->SetFrom(readFeature)!= OGRERR_NONE)</div>
-<div class="line"><a name="l01243"></a><span class="lineno"> 1243</span>           cerr << <span class="stringliteral">"writing feature failed"</span> << std::endl;</div>
-<div class="line"><a name="l01244"></a><span class="lineno"> 1244</span>         <span class="comment">//test</span></div>
-<div class="line"><a name="l01245"></a><span class="lineno"> 1245</span>         writePolygonFeature->SetGeometry(&writePolygon);</div>
-<div class="line"><a name="l01246"></a><span class="lineno"> 1246</span>         assert(wkbFlatten(writePolygonFeature->GetGeometryRef()->getGeometryType()) == wkbPolygon);</div>
-<div class="line"><a name="l01247"></a><span class="lineno"> 1247</span> </div>
-<div class="line"><a name="l01248"></a><span class="lineno"> 1248</span>         <span class="keywordflow">if</span>(verbose_opt[0]>1)</div>
-<div class="line"><a name="l01249"></a><span class="lineno"> 1249</span>           std::cout << <span class="stringliteral">"copying new fields write polygon "</span> << std::endl;</div>
-<div class="line"><a name="l01250"></a><span class="lineno"> 1250</span>         <span class="keywordflow">if</span>(verbose_opt[0]>1)</div>
-<div class="line"><a name="l01251"></a><span class="lineno"> 1251</span>           std::cout << <span class="stringliteral">"write feature has "</span> << writePolygonFeature->GetFieldCount() << <span class="stringliteral">" fields"</span> << std::endl;</div>
-<div class="line"><a name="l01252"></a><span class="lineno"> 1252</span>         <span class="comment">//write polygon feature</span></div>
-<div class="line"><a name="l01253"></a><span class="lineno"> 1253</span>           }</div>
-<div class="line"><a name="l01254"></a><span class="lineno"> 1254</span>           <span class="keywordflow">else</span>{<span class="comment">//write value of polygon to centroid point</span></div>
-<div class="line"><a name="l01255"></a><span class="lineno"> 1255</span>         <span class="comment">//create feature</span></div>
-<div class="line"><a name="l01256"></a><span class="lineno"> 1256</span>         <span class="keywordflow">if</span>(verbose_opt[0]>1)</div>
-<div class="line"><a name="l01257"></a><span class="lineno"> 1257</span>           std::cout << <span class="stringliteral">"copying fields from polygons "</span> << std::endl;</div>
-<div class="line"><a name="l01258"></a><span class="lineno"> 1258</span>         <span class="comment">//test</span></div>
-<div class="line"><a name="l01259"></a><span class="lineno"> 1259</span>         <span class="comment">//Geometry of readFeature and writeCentroidFeature are both wkbPoint</span></div>
-<div class="line"><a name="l01260"></a><span class="lineno"> 1260</span>         <span class="comment">//attributes AND geometry are copied with SetFrom</span></div>
-<div class="line"><a name="l01261"></a><span class="lineno"> 1261</span>         <span class="comment">// writeCentroidFeature->SetGeometry(&writeCentroidPoint);</span></div>
-<div class="line"><a name="l01262"></a><span class="lineno"> 1262</span>         <span class="keywordflow">if</span>(writeCentroidFeature->SetFrom(readFeature)!= OGRERR_NONE)</div>
-<div class="line"><a name="l01263"></a><span class="lineno"> 1263</span>           cerr << <span class="stringliteral">"writing feature failed"</span> << std::endl;</div>
-<div class="line"><a name="l01264"></a><span class="lineno"> 1264</span>         assert(wkbFlatten(writeCentroidFeature->GetGeometryRef()->getGeometryType()) == wkbPoint);</div>
-<div class="line"><a name="l01265"></a><span class="lineno"> 1265</span>         <span class="comment">//test</span></div>
-<div class="line"><a name="l01266"></a><span class="lineno"> 1266</span>         <span class="comment">// OGRGeometry *updateGeometry;</span></div>
-<div class="line"><a name="l01267"></a><span class="lineno"> 1267</span>         <span class="comment">// updateGeometry = writeCentroidFeature->GetGeometryRef();</span></div>
-<div class="line"><a name="l01268"></a><span class="lineno"> 1268</span>         <span class="comment">// assert(wkbFlatten(updateGeometry->getGeometryType()) == wkbPoint );</span></div>
-<div class="line"><a name="l01269"></a><span class="lineno"> 1269</span>         <span class="keywordflow">if</span>(verbose_opt[0]>1)</div>
-<div class="line"><a name="l01270"></a><span class="lineno"> 1270</span>           std::cout << <span class="stringliteral">"write feature has "</span> << writeCentroidFeature->GetFieldCount() << <span class="stringliteral">" fields"</span> << std::endl;</div>
-<div class="line"><a name="l01271"></a><span class="lineno"> 1271</span>           }</div>
-<div class="line"><a name="l01272"></a><span class="lineno"> 1272</span>           <span class="keywordflow">if</span>(class_opt.empty()){</div>
-<div class="line"><a name="l01273"></a><span class="lineno"> 1273</span>         <span class="keywordflow">if</span>(ruleMap[rule_opt[0]]==rule::point){<span class="comment">//value at centroid of polygon</span></div>
-<div class="line"><a name="l01274"></a><span class="lineno"> 1274</span>           <span class="keywordflow">if</span>(verbose_opt[0])</div>
-<div class="line"><a name="l01275"></a><span class="lineno"> 1275</span>             std::cout << <span class="stringliteral">"number of points in window: "</span> << nPointWindow << std::endl;</div>
-<div class="line"><a name="l01276"></a><span class="lineno"> 1276</span>           <span class="keywordflow">for</span>(<span class="keywordtype">int</span> index=0;index<windowValues.size();++index){</div>
-<div class="line"><a name="l01277"></a><span class="lineno"> 1277</span>             <span class="comment">//test</span></div>
-<div class="line"><a name="l01278"></a><span class="lineno"> 1278</span>             <span class="keywordflow">if</span>(windowValues[index].size()!=1){</div>
-<div class="line"><a name="l01279"></a><span class="lineno"> 1279</span>               cerr << <span class="stringliteral">"Error: windowValues[index].size()="</span> << windowValues[index].size() << endl;</div>
-<div class="line"><a name="l01280"></a><span class="lineno"> 1280</span>               assert(windowValues[index].size()==1);</div>
-<div class="line"><a name="l01281"></a><span class="lineno"> 1281</span>             }</div>
-<div class="line"><a name="l01282"></a><span class="lineno"> 1282</span>             <span class="keywordtype">double</span> theValue=windowValues[index].back();</div>
-<div class="line"><a name="l01283"></a><span class="lineno"> 1283</span> </div>
-<div class="line"><a name="l01284"></a><span class="lineno"> 1284</span>             <span class="keywordflow">if</span>(verbose_opt[0])</div>
-<div class="line"><a name="l01285"></a><span class="lineno"> 1285</span>               std::cout << <span class="stringliteral">"number of points in window: "</span> << nPointWindow << std::endl;</div>
-<div class="line"><a name="l01286"></a><span class="lineno"> 1286</span>             <span class="keywordtype">int</span> theBand=(band_opt.size()) ? band_opt[index] : index;</div>
-<div class="line"><a name="l01287"></a><span class="lineno"> 1287</span> </div>
-<div class="line"><a name="l01288"></a><span class="lineno"> 1288</span>             <span class="keywordflow">try</span>{</div>
-<div class="line"><a name="l01289"></a><span class="lineno"> 1289</span>               <span class="keywordflow">if</span>(verbose_opt[0]>1)</div>
-<div class="line"><a name="l01290"></a><span class="lineno"> 1290</span>             std::cout << <span class="stringliteral">"set field "</span> << fieldname_opt[index] << <span class="stringliteral">" to "</span> << theValue << std::endl;</div>
-<div class="line"><a name="l01291"></a><span class="lineno"> 1291</span>               <span class="keywordflow">switch</span>( fieldType ){</div>
-<div class="line"><a name="l01292"></a><span class="lineno"> 1292</span>               <span class="keywordflow">case</span> OFTInteger:</div>
-<div class="line"><a name="l01293"></a><span class="lineno"> 1293</span>               <span class="keywordflow">case</span> OFTReal:</div>
-<div class="line"><a name="l01294"></a><span class="lineno"> 1294</span>             <span class="keywordflow">if</span>(polygon_opt[0])</div>
-<div class="line"><a name="l01295"></a><span class="lineno"> 1295</span>               writePolygonFeature->SetField(fieldname_opt[index].c_str(),theValue);</div>
-<div class="line"><a name="l01296"></a><span class="lineno"> 1296</span>             <span class="keywordflow">else</span></div>
-<div class="line"><a name="l01297"></a><span class="lineno"> 1297</span>               writeCentroidFeature->SetField(fieldname_opt[index].c_str(),theValue);</div>
-<div class="line"><a name="l01298"></a><span class="lineno"> 1298</span>             <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l01299"></a><span class="lineno"> 1299</span>               <span class="keywordflow">case</span> OFTString:</div>
-<div class="line"><a name="l01300"></a><span class="lineno"> 1300</span>             <span class="keywordflow">if</span>(polygon_opt[0])</div>
-<div class="line"><a name="l01301"></a><span class="lineno"> 1301</span>               writePolygonFeature->SetField(fieldname_opt[index].c_str(),type2string<double>(theValue).c_str());</div>
-<div class="line"><a name="l01302"></a><span class="lineno"> 1302</span>             <span class="keywordflow">else</span></div>
-<div class="line"><a name="l01303"></a><span class="lineno"> 1303</span>               writeCentroidFeature->SetField(fieldname_opt[index].c_str(),type2string<double>(theValue).c_str());</div>
-<div class="line"><a name="l01304"></a><span class="lineno"> 1304</span>             <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l01305"></a><span class="lineno"> 1305</span>               <span class="keywordflow">default</span>:<span class="comment">//not supported</span></div>
-<div class="line"><a name="l01306"></a><span class="lineno"> 1306</span>             std::string errorString=<span class="stringliteral">"field type not supported"</span>;</div>
-<div class="line"><a name="l01307"></a><span class="lineno"> 1307</span>             <span class="keywordflow">throw</span>(errorString);</div>
-<div class="line"><a name="l01308"></a><span class="lineno"> 1308</span>             <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l01309"></a><span class="lineno"> 1309</span>               }</div>
-<div class="line"><a name="l01310"></a><span class="lineno"> 1310</span>             }</div>
-<div class="line"><a name="l01311"></a><span class="lineno"> 1311</span>             <span class="keywordflow">catch</span>(std::string e){</div>
-<div class="line"><a name="l01312"></a><span class="lineno"> 1312</span>               std::cout << e << std::endl;</div>
-<div class="line"><a name="l01313"></a><span class="lineno"> 1313</span>               exit(1);</div>
-<div class="line"><a name="l01314"></a><span class="lineno"> 1314</span>             }</div>
-<div class="line"><a name="l01315"></a><span class="lineno"> 1315</span>           }</div>
-<div class="line"><a name="l01316"></a><span class="lineno"> 1316</span>         }</div>
-<div class="line"><a name="l01317"></a><span class="lineno"> 1317</span>         <span class="keywordflow">else</span>{<span class="comment">//ruleMap[rule_opt[0]] is not rule::point</span></div>
-<div class="line"><a name="l01318"></a><span class="lineno"> 1318</span>           <span class="keywordtype">double</span> theValue=0;</div>
-<div class="line"><a name="l01319"></a><span class="lineno"> 1319</span>           <span class="keywordflow">for</span>(<span class="keywordtype">int</span> index=0;index<windowValues.size();++index){</div>
-<div class="line"><a name="l01320"></a><span class="lineno"> 1320</span>             <span class="keywordflow">try</span>{</div>
-<div class="line"><a name="l01321"></a><span class="lineno"> 1321</span>               <span class="keywordflow">if</span>(ruleMap[rule_opt[0]]==rule::mean)</div>
-<div class="line"><a name="l01322"></a><span class="lineno"> 1322</span>             theValue=stat.mean(windowValues[index]);</div>
-<div class="line"><a name="l01323"></a><span class="lineno"> 1323</span>               <span class="keywordflow">else</span> <span class="keywordflow">if</span>(ruleMap[rule_opt[0]]==rule::stdev)</div>
-<div class="line"><a name="l01324"></a><span class="lineno"> 1324</span>             theValue=sqrt(stat.var(windowValues[index]));</div>
-<div class="line"><a name="l01325"></a><span class="lineno"> 1325</span>               <span class="keywordflow">else</span> <span class="keywordflow">if</span>(ruleMap[rule_opt[0]]==rule::median)</div>
-<div class="line"><a name="l01326"></a><span class="lineno"> 1326</span>             theValue=stat.median(windowValues[index]);</div>
-<div class="line"><a name="l01327"></a><span class="lineno"> 1327</span>               <span class="keywordflow">else</span> <span class="keywordflow">if</span>(ruleMap[rule_opt[0]]==rule::percentile)</div>
-<div class="line"><a name="l01328"></a><span class="lineno"> 1328</span>             theValue=stat.percentile(windowValues[index],windowValues[index].begin(),windowValues[index].end(),percentile_opt[0]);</div>
-<div class="line"><a name="l01329"></a><span class="lineno"> 1329</span>               <span class="keywordflow">else</span> <span class="keywordflow">if</span>(ruleMap[rule_opt[0]]==rule::sum)</div>
-<div class="line"><a name="l01330"></a><span class="lineno"> 1330</span>             theValue=stat.sum(windowValues[index]);</div>
-<div class="line"><a name="l01331"></a><span class="lineno"> 1331</span>               <span class="keywordflow">else</span> <span class="keywordflow">if</span>(ruleMap[rule_opt[0]]==rule::max)</div>
-<div class="line"><a name="l01332"></a><span class="lineno"> 1332</span>             theValue=stat.mymax(windowValues[index]);</div>
-<div class="line"><a name="l01333"></a><span class="lineno"> 1333</span>               <span class="keywordflow">else</span> <span class="keywordflow">if</span>(ruleMap[rule_opt[0]]==rule::min)</div>
-<div class="line"><a name="l01334"></a><span class="lineno"> 1334</span>             theValue=stat.mymin(windowValues[index]);</div>
-<div class="line"><a name="l01335"></a><span class="lineno"> 1335</span>               <span class="keywordflow">else</span> <span class="keywordflow">if</span>(ruleMap[rule_opt[0]]==rule::centroid){</div>
-<div class="line"><a name="l01336"></a><span class="lineno"> 1336</span>             <span class="keywordflow">if</span>(verbose_opt[0])</div>
-<div class="line"><a name="l01337"></a><span class="lineno"> 1337</span>               std::cout << <span class="stringliteral">"number of points in polygon: "</span> << nPointWindow << std::endl;</div>
-<div class="line"><a name="l01338"></a><span class="lineno"> 1338</span>             assert(nPointWindow<=1);</div>
-<div class="line"><a name="l01339"></a><span class="lineno"> 1339</span>             assert(nPointWindow==windowValues[index].size());</div>
-<div class="line"><a name="l01340"></a><span class="lineno"> 1340</span>             theValue=windowValues[index].back();</div>
-<div class="line"><a name="l01341"></a><span class="lineno"> 1341</span>               }</div>
-<div class="line"><a name="l01342"></a><span class="lineno"> 1342</span>               <span class="keywordflow">else</span>{</div>
-<div class="line"><a name="l01343"></a><span class="lineno"> 1343</span>             std::string errorString=<span class="stringliteral">"rule not supported"</span>;</div>
-<div class="line"><a name="l01344"></a><span class="lineno"> 1344</span>             <span class="keywordflow">throw</span>(errorString);</div>
-<div class="line"><a name="l01345"></a><span class="lineno"> 1345</span>               }</div>
-<div class="line"><a name="l01346"></a><span class="lineno"> 1346</span>               <span class="keywordflow">if</span>(verbose_opt[0]>1)</div>
-<div class="line"><a name="l01347"></a><span class="lineno"> 1347</span>             std::cout << <span class="stringliteral">"set field "</span> << fieldname_opt[index] << <span class="stringliteral">" to "</span> << theValue << std::endl;</div>
-<div class="line"><a name="l01348"></a><span class="lineno"> 1348</span>               <span class="keywordflow">switch</span>( fieldType ){</div>
-<div class="line"><a name="l01349"></a><span class="lineno"> 1349</span>               <span class="keywordflow">case</span> OFTInteger:</div>
-<div class="line"><a name="l01350"></a><span class="lineno"> 1350</span>               <span class="keywordflow">case</span> OFTReal:</div>
-<div class="line"><a name="l01351"></a><span class="lineno"> 1351</span>             <span class="keywordflow">if</span>(polygon_opt[0])</div>
-<div class="line"><a name="l01352"></a><span class="lineno"> 1352</span>               writePolygonFeature->SetField(fieldname_opt[index].c_str(),theValue);</div>
-<div class="line"><a name="l01353"></a><span class="lineno"> 1353</span>             <span class="keywordflow">else</span></div>
-<div class="line"><a name="l01354"></a><span class="lineno"> 1354</span>               writeCentroidFeature->SetField(fieldname_opt[index].c_str(),theValue);</div>
-<div class="line"><a name="l01355"></a><span class="lineno"> 1355</span>             <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l01356"></a><span class="lineno"> 1356</span>               <span class="keywordflow">case</span> OFTString:</div>
-<div class="line"><a name="l01357"></a><span class="lineno"> 1357</span>             <span class="keywordflow">if</span>(polygon_opt[0])</div>
-<div class="line"><a name="l01358"></a><span class="lineno"> 1358</span>               writePolygonFeature->SetField(fieldname_opt[index].c_str(),type2string<double>(theValue).c_str());</div>
-<div class="line"><a name="l01359"></a><span class="lineno"> 1359</span>             <span class="keywordflow">else</span></div>
-<div class="line"><a name="l01360"></a><span class="lineno"> 1360</span>               writeCentroidFeature->SetField(fieldname_opt[index].c_str(),type2string<double>(theValue).c_str());</div>
-<div class="line"><a name="l01361"></a><span class="lineno"> 1361</span>             <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l01362"></a><span class="lineno"> 1362</span>               <span class="keywordflow">default</span>:<span class="comment">//not supported</span></div>
-<div class="line"><a name="l01363"></a><span class="lineno"> 1363</span>             std::string errorString=<span class="stringliteral">"field type not supported"</span>;</div>
-<div class="line"><a name="l01364"></a><span class="lineno"> 1364</span>             <span class="keywordflow">throw</span>(errorString);</div>
-<div class="line"><a name="l01365"></a><span class="lineno"> 1365</span>             <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l01366"></a><span class="lineno"> 1366</span>               }</div>
-<div class="line"><a name="l01367"></a><span class="lineno"> 1367</span>             }</div>
-<div class="line"><a name="l01368"></a><span class="lineno"> 1368</span>             <span class="keywordflow">catch</span>(std::string e){</div>
-<div class="line"><a name="l01369"></a><span class="lineno"> 1369</span>               std::cout << e << std::endl;</div>
-<div class="line"><a name="l01370"></a><span class="lineno"> 1370</span>               exit(1);</div>
-<div class="line"><a name="l01371"></a><span class="lineno"> 1371</span>             }</div>
-<div class="line"><a name="l01372"></a><span class="lineno"> 1372</span>           }</div>
-<div class="line"><a name="l01373"></a><span class="lineno"> 1373</span>         }</div>
-<div class="line"><a name="l01374"></a><span class="lineno"> 1374</span>           }</div>
-<div class="line"><a name="l01375"></a><span class="lineno"> 1375</span>           <span class="keywordflow">else</span>{<span class="comment">//class_opt is set</span></div>
-<div class="line"><a name="l01376"></a><span class="lineno"> 1376</span>         <span class="keywordflow">if</span>(ruleMap[rule_opt[0]]==rule::proportion){</div>
-<div class="line"><a name="l01377"></a><span class="lineno"> 1377</span>           <span class="keywordflow">if</span>(verbose_opt[0])</div>
-<div class="line"><a name="l01378"></a><span class="lineno"> 1378</span>             std::cout << <span class="stringliteral">"number of points in polygon: "</span> << nPointWindow << std::endl;</div>
-<div class="line"><a name="l01379"></a><span class="lineno"> 1379</span>           stat.normalize_pct(windowClassValues);</div>
-<div class="line"><a name="l01380"></a><span class="lineno"> 1380</span>           <span class="keywordflow">for</span>(<span class="keywordtype">int</span> index=0;index<windowClassValues.size();++index){</div>
-<div class="line"><a name="l01381"></a><span class="lineno"> 1381</span>             <span class="keywordtype">double</span> theValue=windowClassValues[index];</div>
-<div class="line"><a name="l01382"></a><span class="lineno"> 1382</span>             ostringstream fs;</div>
-<div class="line"><a name="l01383"></a><span class="lineno"> 1383</span>             fs << class_opt[index];</div>
-<div class="line"><a name="l01384"></a><span class="lineno"> 1384</span>             <span class="keywordflow">if</span>(polygon_opt[0])</div>
-<div class="line"><a name="l01385"></a><span class="lineno"> 1385</span>               writePolygonFeature->SetField(fs.str().c_str(),<span class="keyword">static_cast<</span><span class="keywordtype">int</span><span class="keyword">></span>(theValue));</div>
-<div class="line"><a name="l01386"></a><span class="lineno"> 1386</span>             <span class="keywordflow">else</span></div>
-<div class="line"><a name="l01387"></a><span class="lineno"> 1387</span>               writeCentroidFeature->SetField(fs.str().c_str(),<span class="keyword">static_cast<</span><span class="keywordtype">int</span><span class="keyword">></span>(theValue));</div>
-<div class="line"><a name="l01388"></a><span class="lineno"> 1388</span>           }</div>
-<div class="line"><a name="l01389"></a><span class="lineno"> 1389</span>         }</div>
-<div class="line"><a name="l01390"></a><span class="lineno"> 1390</span>         <span class="keywordflow">else</span> <span class="keywordflow">if</span>(ruleMap[rule_opt[0]]==rule::custom){</div>
-<div class="line"><a name="l01391"></a><span class="lineno"> 1391</span>           assert(polygon_opt[0]);<span class="comment">//not implemented for points</span></div>
-<div class="line"><a name="l01392"></a><span class="lineno"> 1392</span>           <span class="keywordflow">if</span>(verbose_opt[0])</div>
-<div class="line"><a name="l01393"></a><span class="lineno"> 1393</span>             std::cout << <span class="stringliteral">"number of points in polygon: "</span> << nPointWindow << std::endl;</div>
-<div class="line"><a name="l01394"></a><span class="lineno"> 1394</span>           stat.normalize_pct(windowClassValues);</div>
-<div class="line"><a name="l01395"></a><span class="lineno"> 1395</span>           assert(windowClassValues.size()==2);<span class="comment">//11:broadleaved, 12:coniferous</span></div>
-<div class="line"><a name="l01396"></a><span class="lineno"> 1396</span>           <span class="keywordflow">if</span>(windowClassValues[0]>=75)<span class="comment">//broadleaved</span></div>
-<div class="line"><a name="l01397"></a><span class="lineno"> 1397</span>             writePolygonFeature->SetField(label_opt[0].c_str(),static_cast<int>(11));</div>
-<div class="line"><a name="l01398"></a><span class="lineno"> 1398</span>           <span class="keywordflow">else</span> <span class="keywordflow">if</span>(windowClassValues[1]>=75)<span class="comment">//coniferous</span></div>
-<div class="line"><a name="l01399"></a><span class="lineno"> 1399</span>             writePolygonFeature->SetField(label_opt[0].c_str(),static_cast<int>(12));</div>
-<div class="line"><a name="l01400"></a><span class="lineno"> 1400</span>           <span class="keywordflow">else</span> <span class="keywordflow">if</span>(windowClassValues[0]>25&&windowClassValues[1]>25)<span class="comment">//mixed</span></div>
-<div class="line"><a name="l01401"></a><span class="lineno"> 1401</span>             writePolygonFeature->SetField(label_opt[0].c_str(),static_cast<int>(13));</div>
-<div class="line"><a name="l01402"></a><span class="lineno"> 1402</span>           <span class="keywordflow">else</span>{</div>
-<div class="line"><a name="l01403"></a><span class="lineno"> 1403</span>             <span class="keywordflow">if</span>(verbose_opt[0]){</div>
-<div class="line"><a name="l01404"></a><span class="lineno"> 1404</span>               std::cout << <span class="stringliteral">"No valid value in windowClassValues..."</span> << std::endl;</div>
-<div class="line"><a name="l01405"></a><span class="lineno"> 1405</span>               <span class="keywordflow">for</span>(<span class="keywordtype">int</span> index=0;index<windowClassValues.size();++index){</div>
-<div class="line"><a name="l01406"></a><span class="lineno"> 1406</span>             <span class="keywordtype">double</span> theValue=windowClassValues[index];</div>
-<div class="line"><a name="l01407"></a><span class="lineno"> 1407</span>             std::cout << theValue << <span class="stringliteral">" "</span>;</div>
-<div class="line"><a name="l01408"></a><span class="lineno"> 1408</span>               }</div>
-<div class="line"><a name="l01409"></a><span class="lineno"> 1409</span>               std::cout << std::endl;</div>
-<div class="line"><a name="l01410"></a><span class="lineno"> 1410</span>             }</div>
-<div class="line"><a name="l01411"></a><span class="lineno"> 1411</span>             writePolygonFeature->SetField(label_opt[0].c_str(),static_cast<int>(20));</div>
-<div class="line"><a name="l01412"></a><span class="lineno"> 1412</span>           }</div>
-<div class="line"><a name="l01413"></a><span class="lineno"> 1413</span>         }</div>
-<div class="line"><a name="l01414"></a><span class="lineno"> 1414</span>         <span class="keywordflow">else</span> <span class="keywordflow">if</span>(ruleMap[rule_opt[0]]==rule::mode){</div>
-<div class="line"><a name="l01415"></a><span class="lineno"> 1415</span>           <span class="comment">//maximum votes in polygon</span></div>
-<div class="line"><a name="l01416"></a><span class="lineno"> 1416</span>           <span class="keywordflow">if</span>(verbose_opt[0])</div>
-<div class="line"><a name="l01417"></a><span class="lineno"> 1417</span>             std::cout << <span class="stringliteral">"number of points in window: "</span> << nPointWindow << std::endl;</div>
-<div class="line"><a name="l01418"></a><span class="lineno"> 1418</span>           <span class="comment">//search for class with maximum votes</span></div>
-<div class="line"><a name="l01419"></a><span class="lineno"> 1419</span>           <span class="keywordtype">int</span> maxClass=stat.mymin(class_opt);</div>
-<div class="line"><a name="l01420"></a><span class="lineno"> 1420</span>           vector<double>::iterator maxit;</div>
-<div class="line"><a name="l01421"></a><span class="lineno"> 1421</span>           maxit=stat.mymax(windowClassValues,windowClassValues.begin(),windowClassValues.end());</div>
-<div class="line"><a name="l01422"></a><span class="lineno"> 1422</span>           <span class="keywordtype">int</span> maxIndex=distance(windowClassValues.begin(),maxit);</div>
-<div class="line"><a name="l01423"></a><span class="lineno"> 1423</span>           maxClass=class_opt[maxIndex];</div>
-<div class="line"><a name="l01424"></a><span class="lineno"> 1424</span>           <span class="keywordflow">if</span>(verbose_opt[0]>0)</div>
-<div class="line"><a name="l01425"></a><span class="lineno"> 1425</span>             std::cout << <span class="stringliteral">"maxClass: "</span> << maxClass << std::endl;</div>
-<div class="line"><a name="l01426"></a><span class="lineno"> 1426</span>           <span class="keywordflow">if</span>(polygon_opt[0])</div>
-<div class="line"><a name="l01427"></a><span class="lineno"> 1427</span>             writePolygonFeature->SetField(label_opt[0].c_str(),maxClass);</div>
-<div class="line"><a name="l01428"></a><span class="lineno"> 1428</span>           <span class="keywordflow">else</span></div>
-<div class="line"><a name="l01429"></a><span class="lineno"> 1429</span>             writeCentroidFeature->SetField(label_opt[0].c_str(),maxClass);</div>
-<div class="line"><a name="l01430"></a><span class="lineno"> 1430</span>         }</div>
-<div class="line"><a name="l01431"></a><span class="lineno"> 1431</span>           }</div>
-<div class="line"><a name="l01432"></a><span class="lineno"> 1432</span>           <span class="keywordflow">if</span>(polygon_opt[0]){</div>
-<div class="line"><a name="l01433"></a><span class="lineno"> 1433</span>         <span class="keywordflow">if</span>(verbose_opt[0]>1)</div>
-<div class="line"><a name="l01434"></a><span class="lineno"> 1434</span>           std::cout << <span class="stringliteral">"creating polygon feature"</span> << std::endl;</div>
-<div class="line"><a name="l01435"></a><span class="lineno"> 1435</span>         <span class="keywordflow">if</span>(writeTest){</div>
-<div class="line"><a name="l01436"></a><span class="lineno"> 1436</span>           <span class="keywordflow">if</span>(writeTestLayer->CreateFeature( writePolygonFeature ) != OGRERR_NONE ){</div>
-<div class="line"><a name="l01437"></a><span class="lineno"> 1437</span>             std::string errorString=<span class="stringliteral">"Failed to create polygon feature in ogr vector dataset"</span>;</div>
-<div class="line"><a name="l01438"></a><span class="lineno"> 1438</span>             <span class="keywordflow">throw</span>(errorString);</div>
-<div class="line"><a name="l01439"></a><span class="lineno"> 1439</span>           }</div>
-<div class="line"><a name="l01440"></a><span class="lineno"> 1440</span>         }</div>
-<div class="line"><a name="l01441"></a><span class="lineno"> 1441</span>         <span class="keywordflow">else</span>{</div>
-<div class="line"><a name="l01442"></a><span class="lineno"> 1442</span>           <span class="keywordflow">if</span>(writeLayer->CreateFeature( writePolygonFeature ) != OGRERR_NONE ){</div>
-<div class="line"><a name="l01443"></a><span class="lineno"> 1443</span>             std::string errorString=<span class="stringliteral">"Failed to create polygon feature in ogr vector dataset"</span>;</div>
-<div class="line"><a name="l01444"></a><span class="lineno"> 1444</span>             <span class="keywordflow">throw</span>(errorString);</div>
-<div class="line"><a name="l01445"></a><span class="lineno"> 1445</span>           }</div>
-<div class="line"><a name="l01446"></a><span class="lineno"> 1446</span>         }</div>
-<div class="line"><a name="l01447"></a><span class="lineno"> 1447</span>         OGRFeature::DestroyFeature( writePolygonFeature );</div>
-<div class="line"><a name="l01448"></a><span class="lineno"> 1448</span>         ++ntotalvalid;</div>
-<div class="line"><a name="l01449"></a><span class="lineno"> 1449</span>         <span class="keywordflow">if</span>(verbose_opt[0])</div>
-<div class="line"><a name="l01450"></a><span class="lineno"> 1450</span>           std::cout << <span class="stringliteral">"ntotalvalid(1): "</span> << ntotalvalid << std::endl;</div>
-<div class="line"><a name="l01451"></a><span class="lineno"> 1451</span>           }</div>
-<div class="line"><a name="l01452"></a><span class="lineno"> 1452</span>           <span class="keywordflow">else</span>{</div>
-<div class="line"><a name="l01453"></a><span class="lineno"> 1453</span>         <span class="keywordflow">if</span>(verbose_opt[0]>1)</div>
-<div class="line"><a name="l01454"></a><span class="lineno"> 1454</span>           std::cout << <span class="stringliteral">"creating point feature in centroid"</span> << std::endl;</div>
-<div class="line"><a name="l01455"></a><span class="lineno"> 1455</span>         <span class="keywordflow">if</span>(writeTest){</div>
-<div class="line"><a name="l01456"></a><span class="lineno"> 1456</span>           <span class="keywordflow">if</span>(writeTestLayer->CreateFeature( writeCentroidFeature ) != OGRERR_NONE ){</div>
-<div class="line"><a name="l01457"></a><span class="lineno"> 1457</span>             std::string errorString=<span class="stringliteral">"Failed to create point feature in ogr vector dataset"</span>;</div>
-<div class="line"><a name="l01458"></a><span class="lineno"> 1458</span>             <span class="keywordflow">throw</span>(errorString);</div>
+<div class="line"><a name="l01226"></a><span class="lineno"> 1226</span>         <span class="keywordflow">if</span>(class_opt.size()){</div>
+<div class="line"><a name="l01227"></a><span class="lineno"> 1227</span>           <span class="keywordtype">short</span> value=((readValues[0])[j-ulj])[i-uli];</div>
+<div class="line"><a name="l01228"></a><span class="lineno"> 1228</span>           <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iclass=0;iclass<class_opt.size();++iclass){</div>
+<div class="line"><a name="l01229"></a><span class="lineno"> 1229</span>             <span class="keywordflow">if</span>(value==class_opt[iclass])</div>
+<div class="line"><a name="l01230"></a><span class="lineno"> 1230</span>               windowClassValues[iclass]+=1;</div>
+<div class="line"><a name="l01231"></a><span class="lineno"> 1231</span>           }</div>
+<div class="line"><a name="l01232"></a><span class="lineno"> 1232</span>         }</div>
+<div class="line"><a name="l01233"></a><span class="lineno"> 1233</span>         <span class="keywordflow">else</span>{</div>
+<div class="line"><a name="l01234"></a><span class="lineno"> 1234</span>           <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iband=0;iband<nband;++iband){</div>
+<div class="line"><a name="l01235"></a><span class="lineno"> 1235</span>             <span class="keywordtype">int</span> theBand=(band_opt.size()) ? band_opt[iband] : iband;</div>
+<div class="line"><a name="l01236"></a><span class="lineno"> 1236</span>             assert(j-ulj>=0);</div>
+<div class="line"><a name="l01237"></a><span class="lineno"> 1237</span>             assert(j-ulj<readValues[iband].size());</div>
+<div class="line"><a name="l01238"></a><span class="lineno"> 1238</span>             assert(i-uli>=0);</div>
+<div class="line"><a name="l01239"></a><span class="lineno"> 1239</span>             assert(i-uli<((readValues[iband])[j-ulj]).size());</div>
+<div class="line"><a name="l01240"></a><span class="lineno"> 1240</span>             <span class="keywordtype">double</span> value=((readValues[iband])[j-ulj])[i-uli];</div>
+<div class="line"><a name="l01241"></a><span class="lineno"> 1241</span>             <span class="comment">// imgReader.readData(value,GDT_Float64,i,j,theBand);</span></div>
+<div class="line"><a name="l01242"></a><span class="lineno"> 1242</span>             <span class="keywordflow">if</span>(verbose_opt[0]>1)</div>
+<div class="line"><a name="l01243"></a><span class="lineno"> 1243</span>               std::cout << <span class="stringliteral">": "</span> << value << std::endl;</div>
+<div class="line"><a name="l01244"></a><span class="lineno"> 1244</span>             <span class="keywordflow">if</span>(polygon_opt[0]||ruleMap[rule_opt[0]]!=rule::point){</div>
+<div class="line"><a name="l01245"></a><span class="lineno"> 1245</span>               windowValues[iband].push_back(value);</div>
+<div class="line"><a name="l01246"></a><span class="lineno"> 1246</span>             }</div>
+<div class="line"><a name="l01247"></a><span class="lineno"> 1247</span>             <span class="keywordflow">else</span>{</div>
+<div class="line"><a name="l01248"></a><span class="lineno"> 1248</span>               <span class="keywordflow">try</span>{</div>
+<div class="line"><a name="l01249"></a><span class="lineno"> 1249</span>             <span class="keywordflow">if</span>(verbose_opt[0]>1)</div>
+<div class="line"><a name="l01250"></a><span class="lineno"> 1250</span>               std::cout << <span class="stringliteral">"set field "</span> << fieldname_opt[iband] << <span class="stringliteral">" to "</span> << value << std::endl;</div>
+<div class="line"><a name="l01251"></a><span class="lineno"> 1251</span>             <span class="keywordflow">switch</span>( fieldType ){</div>
+<div class="line"><a name="l01252"></a><span class="lineno"> 1252</span>             <span class="keywordflow">case</span> OFTInteger:</div>
+<div class="line"><a name="l01253"></a><span class="lineno"> 1253</span>             <span class="keywordflow">case</span> OFTReal:</div>
+<div class="line"><a name="l01254"></a><span class="lineno"> 1254</span>               writePointFeature->SetField(fieldname_opt[iband].c_str(),value);</div>
+<div class="line"><a name="l01255"></a><span class="lineno"> 1255</span>               <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l01256"></a><span class="lineno"> 1256</span>             <span class="keywordflow">case</span> OFTString:</div>
+<div class="line"><a name="l01257"></a><span class="lineno"> 1257</span>               writePointFeature->SetField(fieldname_opt[iband].c_str(),type2string<double>(value).c_str());</div>
+<div class="line"><a name="l01258"></a><span class="lineno"> 1258</span>               <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l01259"></a><span class="lineno"> 1259</span>             <span class="keywordflow">default</span>:<span class="comment">//not supported</span></div>
+<div class="line"><a name="l01260"></a><span class="lineno"> 1260</span>               std::string errorString=<span class="stringliteral">"field type not supported"</span>;</div>
+<div class="line"><a name="l01261"></a><span class="lineno"> 1261</span>               <span class="keywordflow">throw</span>(errorString);</div>
+<div class="line"><a name="l01262"></a><span class="lineno"> 1262</span>               <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l01263"></a><span class="lineno"> 1263</span>             }</div>
+<div class="line"><a name="l01264"></a><span class="lineno"> 1264</span>               }</div>
+<div class="line"><a name="l01265"></a><span class="lineno"> 1265</span>               <span class="keywordflow">catch</span>(std::string e){</div>
+<div class="line"><a name="l01266"></a><span class="lineno"> 1266</span>             std::cout << e << std::endl;</div>
+<div class="line"><a name="l01267"></a><span class="lineno"> 1267</span>             exit(1);</div>
+<div class="line"><a name="l01268"></a><span class="lineno"> 1268</span>               }</div>
+<div class="line"><a name="l01269"></a><span class="lineno"> 1269</span>             }<span class="comment">//else</span></div>
+<div class="line"><a name="l01270"></a><span class="lineno"> 1270</span>           }<span class="comment">//iband</span></div>
+<div class="line"><a name="l01271"></a><span class="lineno"> 1271</span>         }<span class="comment">//else (class_opt.size())</span></div>
+<div class="line"><a name="l01272"></a><span class="lineno"> 1272</span>         <span class="keywordflow">if</span>(!polygon_opt[0]){</div>
+<div class="line"><a name="l01273"></a><span class="lineno"> 1273</span>           <span class="keywordflow">if</span>(ruleMap[rule_opt[0]]==rule::point){<span class="comment">//do not create in case of mean or median value (only at centroid)</span></div>
+<div class="line"><a name="l01274"></a><span class="lineno"> 1274</span>             <span class="comment">//write feature</span></div>
+<div class="line"><a name="l01275"></a><span class="lineno"> 1275</span>             <span class="keywordflow">if</span>(verbose_opt[0]>1)</div>
+<div class="line"><a name="l01276"></a><span class="lineno"> 1276</span>               std::cout << <span class="stringliteral">"creating point feature"</span> << std::endl;</div>
+<div class="line"><a name="l01277"></a><span class="lineno"> 1277</span>             <span class="keywordflow">if</span>(writeTest){</div>
+<div class="line"><a name="l01278"></a><span class="lineno"> 1278</span>               <span class="keywordflow">if</span>(writeTestLayer->CreateFeature( writePointFeature ) != OGRERR_NONE ){</div>
+<div class="line"><a name="l01279"></a><span class="lineno"> 1279</span>             std::string errorString=<span class="stringliteral">"Failed to create feature in test ogr vector dataset"</span>;</div>
+<div class="line"><a name="l01280"></a><span class="lineno"> 1280</span>             <span class="keywordflow">throw</span>(errorString);</div>
+<div class="line"><a name="l01281"></a><span class="lineno"> 1281</span>               }</div>
+<div class="line"><a name="l01282"></a><span class="lineno"> 1282</span>             }</div>
+<div class="line"><a name="l01283"></a><span class="lineno"> 1283</span>             <span class="keywordflow">else</span>{</div>
+<div class="line"><a name="l01284"></a><span class="lineno"> 1284</span>               <span class="keywordflow">if</span>(writeLayer->CreateFeature( writePointFeature ) != OGRERR_NONE ){</div>
+<div class="line"><a name="l01285"></a><span class="lineno"> 1285</span>             std::string errorString=<span class="stringliteral">"Failed to create feature in ogr vector dataset"</span>;</div>
+<div class="line"><a name="l01286"></a><span class="lineno"> 1286</span>             <span class="keywordflow">throw</span>(errorString);</div>
+<div class="line"><a name="l01287"></a><span class="lineno"> 1287</span>               }</div>
+<div class="line"><a name="l01288"></a><span class="lineno"> 1288</span>             }</div>
+<div class="line"><a name="l01289"></a><span class="lineno"> 1289</span>             <span class="comment">//destroy feature</span></div>
+<div class="line"><a name="l01290"></a><span class="lineno"> 1290</span>             OGRFeature::DestroyFeature( writePointFeature );</div>
+<div class="line"><a name="l01291"></a><span class="lineno"> 1291</span>             ++ntotalvalid;</div>
+<div class="line"><a name="l01292"></a><span class="lineno"> 1292</span>             <span class="keywordflow">if</span>(verbose_opt[0])</div>
+<div class="line"><a name="l01293"></a><span class="lineno"> 1293</span>               std::cout << <span class="stringliteral">"ntotalvalid(2): "</span> << ntotalvalid << std::endl;</div>
+<div class="line"><a name="l01294"></a><span class="lineno"> 1294</span>           }</div>
+<div class="line"><a name="l01295"></a><span class="lineno"> 1295</span>         }</div>
+<div class="line"><a name="l01296"></a><span class="lineno"> 1296</span>           }</div>
+<div class="line"><a name="l01297"></a><span class="lineno"> 1297</span>         }</div>
+<div class="line"><a name="l01298"></a><span class="lineno"> 1298</span>         <span class="keywordflow">if</span>(polygon_opt[0]||ruleMap[rule_opt[0]]!=rule::point){</div>
+<div class="line"><a name="l01299"></a><span class="lineno"> 1299</span>           <span class="comment">//do not create if no points found within polygon</span></div>
+<div class="line"><a name="l01300"></a><span class="lineno"> 1300</span>           <span class="keywordflow">if</span>(!nPointWindow){</div>
+<div class="line"><a name="l01301"></a><span class="lineno"> 1301</span>         <span class="keywordflow">if</span>(verbose_opt[0])</div>
+<div class="line"><a name="l01302"></a><span class="lineno"> 1302</span>           cout << <span class="stringliteral">"no points found in window, continuing"</span> << endl;</div>
+<div class="line"><a name="l01303"></a><span class="lineno"> 1303</span>         <span class="keywordflow">continue</span>;</div>
+<div class="line"><a name="l01304"></a><span class="lineno"> 1304</span>           }</div>
+<div class="line"><a name="l01305"></a><span class="lineno"> 1305</span>           <span class="comment">//add ring to polygon</span></div>
+<div class="line"><a name="l01306"></a><span class="lineno"> 1306</span>           <span class="keywordflow">if</span>(polygon_opt[0]){</div>
+<div class="line"><a name="l01307"></a><span class="lineno"> 1307</span>         <span class="comment">// writePolygon.addRing(&writeRing);//already done</span></div>
+<div class="line"><a name="l01308"></a><span class="lineno"> 1308</span>         <span class="comment">// writePolygon.closeRings();//already done</span></div>
+<div class="line"><a name="l01309"></a><span class="lineno"> 1309</span>         <span class="comment">//write geometry of writePolygon</span></div>
+<div class="line"><a name="l01310"></a><span class="lineno"> 1310</span>         <span class="comment">//test</span></div>
+<div class="line"><a name="l01311"></a><span class="lineno"> 1311</span>         <span class="comment">// writePolygonFeature->SetGeometry(&writePolygon);</span></div>
+<div class="line"><a name="l01312"></a><span class="lineno"> 1312</span>         <span class="keywordflow">if</span>(writePolygonFeature->SetFrom(readFeature)!= OGRERR_NONE)</div>
+<div class="line"><a name="l01313"></a><span class="lineno"> 1313</span>           cerr << <span class="stringliteral">"writing feature failed"</span> << std::endl;</div>
+<div class="line"><a name="l01314"></a><span class="lineno"> 1314</span>         <span class="comment">//test</span></div>
+<div class="line"><a name="l01315"></a><span class="lineno"> 1315</span>         writePolygonFeature->SetGeometry(&writePolygon);</div>
+<div class="line"><a name="l01316"></a><span class="lineno"> 1316</span>         assert(wkbFlatten(writePolygonFeature->GetGeometryRef()->getGeometryType()) == wkbPolygon);</div>
+<div class="line"><a name="l01317"></a><span class="lineno"> 1317</span> </div>
+<div class="line"><a name="l01318"></a><span class="lineno"> 1318</span>         <span class="keywordflow">if</span>(verbose_opt[0]>1)</div>
+<div class="line"><a name="l01319"></a><span class="lineno"> 1319</span>           std::cout << <span class="stringliteral">"copying new fields write polygon "</span> << std::endl;</div>
+<div class="line"><a name="l01320"></a><span class="lineno"> 1320</span>         <span class="keywordflow">if</span>(verbose_opt[0]>1)</div>
+<div class="line"><a name="l01321"></a><span class="lineno"> 1321</span>           std::cout << <span class="stringliteral">"write feature has "</span> << writePolygonFeature->GetFieldCount() << <span class="stringliteral">" fields"</span> << std::endl;</div>
+<div class="line"><a name="l01322"></a><span class="lineno"> 1322</span>         <span class="comment">//write polygon feature</span></div>
+<div class="line"><a name="l01323"></a><span class="lineno"> 1323</span>           }</div>
+<div class="line"><a name="l01324"></a><span class="lineno"> 1324</span>           <span class="keywordflow">else</span>{<span class="comment">//write value of polygon to centroid point</span></div>
+<div class="line"><a name="l01325"></a><span class="lineno"> 1325</span>         <span class="comment">//create feature</span></div>
+<div class="line"><a name="l01326"></a><span class="lineno"> 1326</span>         <span class="keywordflow">if</span>(verbose_opt[0]>1)</div>
+<div class="line"><a name="l01327"></a><span class="lineno"> 1327</span>           std::cout << <span class="stringliteral">"copying fields from polygons "</span> << std::endl;</div>
+<div class="line"><a name="l01328"></a><span class="lineno"> 1328</span>         <span class="comment">//test</span></div>
+<div class="line"><a name="l01329"></a><span class="lineno"> 1329</span>         <span class="comment">//Geometry of readFeature and writeCentroidFeature are both wkbPoint</span></div>
+<div class="line"><a name="l01330"></a><span class="lineno"> 1330</span>         <span class="comment">//attributes AND geometry are copied with SetFrom</span></div>
+<div class="line"><a name="l01331"></a><span class="lineno"> 1331</span>         <span class="comment">// writeCentroidFeature->SetGeometry(&writeCentroidPoint);</span></div>
+<div class="line"><a name="l01332"></a><span class="lineno"> 1332</span>         <span class="keywordflow">if</span>(writeCentroidFeature->SetFrom(readFeature)!= OGRERR_NONE)</div>
+<div class="line"><a name="l01333"></a><span class="lineno"> 1333</span>           cerr << <span class="stringliteral">"writing feature failed"</span> << std::endl;</div>
+<div class="line"><a name="l01334"></a><span class="lineno"> 1334</span>         assert(wkbFlatten(writeCentroidFeature->GetGeometryRef()->getGeometryType()) == wkbPoint);</div>
+<div class="line"><a name="l01335"></a><span class="lineno"> 1335</span>         <span class="comment">//test</span></div>
+<div class="line"><a name="l01336"></a><span class="lineno"> 1336</span>         <span class="comment">// OGRGeometry *updateGeometry;</span></div>
+<div class="line"><a name="l01337"></a><span class="lineno"> 1337</span>         <span class="comment">// updateGeometry = writeCentroidFeature->GetGeometryRef();</span></div>
+<div class="line"><a name="l01338"></a><span class="lineno"> 1338</span>         <span class="comment">// assert(wkbFlatten(updateGeometry->getGeometryType()) == wkbPoint );</span></div>
+<div class="line"><a name="l01339"></a><span class="lineno"> 1339</span>         <span class="keywordflow">if</span>(verbose_opt[0]>1)</div>
+<div class="line"><a name="l01340"></a><span class="lineno"> 1340</span>           std::cout << <span class="stringliteral">"write feature has "</span> << writeCentroidFeature->GetFieldCount() << <span class="stringliteral">" fields"</span> << std::endl;</div>
+<div class="line"><a name="l01341"></a><span class="lineno"> 1341</span>           }</div>
+<div class="line"><a name="l01342"></a><span class="lineno"> 1342</span>           <span class="keywordflow">if</span>(class_opt.empty()){</div>
+<div class="line"><a name="l01343"></a><span class="lineno"> 1343</span>         <span class="keywordflow">if</span>(ruleMap[rule_opt[0]]==rule::point){<span class="comment">//value at centroid of polygon</span></div>
+<div class="line"><a name="l01344"></a><span class="lineno"> 1344</span>           <span class="keywordflow">if</span>(verbose_opt[0])</div>
+<div class="line"><a name="l01345"></a><span class="lineno"> 1345</span>             std::cout << <span class="stringliteral">"number of points in window: "</span> << nPointWindow << std::endl;</div>
+<div class="line"><a name="l01346"></a><span class="lineno"> 1346</span>           <span class="keywordflow">for</span>(<span class="keywordtype">int</span> index=0;index<windowValues.size();++index){</div>
+<div class="line"><a name="l01347"></a><span class="lineno"> 1347</span>             <span class="comment">//test</span></div>
+<div class="line"><a name="l01348"></a><span class="lineno"> 1348</span>             <span class="keywordflow">if</span>(windowValues[index].size()!=1){</div>
+<div class="line"><a name="l01349"></a><span class="lineno"> 1349</span>               cerr << <span class="stringliteral">"Error: windowValues[index].size()="</span> << windowValues[index].size() << endl;</div>
+<div class="line"><a name="l01350"></a><span class="lineno"> 1350</span>               assert(windowValues[index].size()==1);</div>
+<div class="line"><a name="l01351"></a><span class="lineno"> 1351</span>             }</div>
+<div class="line"><a name="l01352"></a><span class="lineno"> 1352</span>             <span class="keywordtype">double</span> theValue=windowValues[index].back();</div>
+<div class="line"><a name="l01353"></a><span class="lineno"> 1353</span> </div>
+<div class="line"><a name="l01354"></a><span class="lineno"> 1354</span>             <span class="keywordflow">if</span>(verbose_opt[0])</div>
+<div class="line"><a name="l01355"></a><span class="lineno"> 1355</span>               std::cout << <span class="stringliteral">"number of points in window: "</span> << nPointWindow << std::endl;</div>
+<div class="line"><a name="l01356"></a><span class="lineno"> 1356</span>             <span class="keywordtype">int</span> theBand=(band_opt.size()) ? band_opt[index] : index;</div>
+<div class="line"><a name="l01357"></a><span class="lineno"> 1357</span> </div>
+<div class="line"><a name="l01358"></a><span class="lineno"> 1358</span>             <span class="keywordflow">try</span>{</div>
+<div class="line"><a name="l01359"></a><span class="lineno"> 1359</span>               <span class="keywordflow">if</span>(verbose_opt[0]>1)</div>
+<div class="line"><a name="l01360"></a><span class="lineno"> 1360</span>             std::cout << <span class="stringliteral">"set field "</span> << fieldname_opt[index] << <span class="stringliteral">" to "</span> << theValue << std::endl;</div>
+<div class="line"><a name="l01361"></a><span class="lineno"> 1361</span>               <span class="keywordflow">switch</span>( fieldType ){</div>
+<div class="line"><a name="l01362"></a><span class="lineno"> 1362</span>               <span class="keywordflow">case</span> OFTInteger:</div>
+<div class="line"><a name="l01363"></a><span class="lineno"> 1363</span>               <span class="keywordflow">case</span> OFTReal:</div>
+<div class="line"><a name="l01364"></a><span class="lineno"> 1364</span>             <span class="keywordflow">if</span>(polygon_opt[0])</div>
+<div class="line"><a name="l01365"></a><span class="lineno"> 1365</span>               writePolygonFeature->SetField(fieldname_opt[index].c_str(),theValue);</div>
+<div class="line"><a name="l01366"></a><span class="lineno"> 1366</span>             <span class="keywordflow">else</span></div>
+<div class="line"><a name="l01367"></a><span class="lineno"> 1367</span>               writeCentroidFeature->SetField(fieldname_opt[index].c_str(),theValue);</div>
+<div class="line"><a name="l01368"></a><span class="lineno"> 1368</span>             <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l01369"></a><span class="lineno"> 1369</span>               <span class="keywordflow">case</span> OFTString:</div>
+<div class="line"><a name="l01370"></a><span class="lineno"> 1370</span>             <span class="keywordflow">if</span>(polygon_opt[0])</div>
+<div class="line"><a name="l01371"></a><span class="lineno"> 1371</span>               writePolygonFeature->SetField(fieldname_opt[index].c_str(),type2string<double>(theValue).c_str());</div>
+<div class="line"><a name="l01372"></a><span class="lineno"> 1372</span>             <span class="keywordflow">else</span></div>
+<div class="line"><a name="l01373"></a><span class="lineno"> 1373</span>               writeCentroidFeature->SetField(fieldname_opt[index].c_str(),type2string<double>(theValue).c_str());</div>
+<div class="line"><a name="l01374"></a><span class="lineno"> 1374</span>             <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l01375"></a><span class="lineno"> 1375</span>               <span class="keywordflow">default</span>:<span class="comment">//not supported</span></div>
+<div class="line"><a name="l01376"></a><span class="lineno"> 1376</span>             std::string errorString=<span class="stringliteral">"field type not supported"</span>;</div>
+<div class="line"><a name="l01377"></a><span class="lineno"> 1377</span>             <span class="keywordflow">throw</span>(errorString);</div>
+<div class="line"><a name="l01378"></a><span class="lineno"> 1378</span>             <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l01379"></a><span class="lineno"> 1379</span>               }</div>
+<div class="line"><a name="l01380"></a><span class="lineno"> 1380</span>             }</div>
+<div class="line"><a name="l01381"></a><span class="lineno"> 1381</span>             <span class="keywordflow">catch</span>(std::string e){</div>
+<div class="line"><a name="l01382"></a><span class="lineno"> 1382</span>               std::cout << e << std::endl;</div>
+<div class="line"><a name="l01383"></a><span class="lineno"> 1383</span>               exit(1);</div>
+<div class="line"><a name="l01384"></a><span class="lineno"> 1384</span>             }</div>
+<div class="line"><a name="l01385"></a><span class="lineno"> 1385</span>           }</div>
+<div class="line"><a name="l01386"></a><span class="lineno"> 1386</span>         }</div>
+<div class="line"><a name="l01387"></a><span class="lineno"> 1387</span>         <span class="keywordflow">else</span>{<span class="comment">//ruleMap[rule_opt[0]] is not rule::point</span></div>
+<div class="line"><a name="l01388"></a><span class="lineno"> 1388</span>           <span class="keywordtype">double</span> theValue=0;</div>
+<div class="line"><a name="l01389"></a><span class="lineno"> 1389</span>           <span class="keywordflow">for</span>(<span class="keywordtype">int</span> index=0;index<windowValues.size();++index){</div>
+<div class="line"><a name="l01390"></a><span class="lineno"> 1390</span>             <span class="keywordflow">try</span>{</div>
+<div class="line"><a name="l01391"></a><span class="lineno"> 1391</span>               <span class="keywordflow">if</span>(ruleMap[rule_opt[0]]==rule::mean)</div>
+<div class="line"><a name="l01392"></a><span class="lineno"> 1392</span>             theValue=stat.mean(windowValues[index]);</div>
+<div class="line"><a name="l01393"></a><span class="lineno"> 1393</span>               <span class="keywordflow">else</span> <span class="keywordflow">if</span>(ruleMap[rule_opt[0]]==rule::stdev)</div>
+<div class="line"><a name="l01394"></a><span class="lineno"> 1394</span>             theValue=sqrt(stat.var(windowValues[index]));</div>
+<div class="line"><a name="l01395"></a><span class="lineno"> 1395</span>               <span class="keywordflow">else</span> <span class="keywordflow">if</span>(ruleMap[rule_opt[0]]==rule::median)</div>
+<div class="line"><a name="l01396"></a><span class="lineno"> 1396</span>             theValue=stat.median(windowValues[index]);</div>
+<div class="line"><a name="l01397"></a><span class="lineno"> 1397</span>               <span class="keywordflow">else</span> <span class="keywordflow">if</span>(ruleMap[rule_opt[0]]==rule::percentile)</div>
+<div class="line"><a name="l01398"></a><span class="lineno"> 1398</span>             theValue=stat.percentile(windowValues[index],windowValues[index].begin(),windowValues[index].end(),percentile_opt[0]);</div>
+<div class="line"><a name="l01399"></a><span class="lineno"> 1399</span>               <span class="keywordflow">else</span> <span class="keywordflow">if</span>(ruleMap[rule_opt[0]]==rule::sum)</div>
+<div class="line"><a name="l01400"></a><span class="lineno"> 1400</span>             theValue=stat.sum(windowValues[index]);</div>
+<div class="line"><a name="l01401"></a><span class="lineno"> 1401</span>               <span class="keywordflow">else</span> <span class="keywordflow">if</span>(ruleMap[rule_opt[0]]==rule::max)</div>
+<div class="line"><a name="l01402"></a><span class="lineno"> 1402</span>             theValue=stat.mymax(windowValues[index]);</div>
+<div class="line"><a name="l01403"></a><span class="lineno"> 1403</span>               <span class="keywordflow">else</span> <span class="keywordflow">if</span>(ruleMap[rule_opt[0]]==rule::min)</div>
+<div class="line"><a name="l01404"></a><span class="lineno"> 1404</span>             theValue=stat.mymin(windowValues[index]);</div>
+<div class="line"><a name="l01405"></a><span class="lineno"> 1405</span>               <span class="keywordflow">else</span> <span class="keywordflow">if</span>(ruleMap[rule_opt[0]]==rule::centroid){</div>
+<div class="line"><a name="l01406"></a><span class="lineno"> 1406</span>             <span class="keywordflow">if</span>(verbose_opt[0])</div>
+<div class="line"><a name="l01407"></a><span class="lineno"> 1407</span>               std::cout << <span class="stringliteral">"number of points in polygon: "</span> << nPointWindow << std::endl;</div>
+<div class="line"><a name="l01408"></a><span class="lineno"> 1408</span>             assert(nPointWindow<=1);</div>
+<div class="line"><a name="l01409"></a><span class="lineno"> 1409</span>             assert(nPointWindow==windowValues[index].size());</div>
+<div class="line"><a name="l01410"></a><span class="lineno"> 1410</span>             theValue=windowValues[index].back();</div>
+<div class="line"><a name="l01411"></a><span class="lineno"> 1411</span>               }</div>
+<div class="line"><a name="l01412"></a><span class="lineno"> 1412</span>               <span class="keywordflow">else</span>{</div>
+<div class="line"><a name="l01413"></a><span class="lineno"> 1413</span>             std::string errorString=<span class="stringliteral">"rule not supported"</span>;</div>
+<div class="line"><a name="l01414"></a><span class="lineno"> 1414</span>             <span class="keywordflow">throw</span>(errorString);</div>
+<div class="line"><a name="l01415"></a><span class="lineno"> 1415</span>               }</div>
+<div class="line"><a name="l01416"></a><span class="lineno"> 1416</span>               <span class="keywordflow">if</span>(verbose_opt[0]>1)</div>
+<div class="line"><a name="l01417"></a><span class="lineno"> 1417</span>             std::cout << <span class="stringliteral">"set field "</span> << fieldname_opt[index] << <span class="stringliteral">" to "</span> << theValue << std::endl;</div>
+<div class="line"><a name="l01418"></a><span class="lineno"> 1418</span>               <span class="keywordflow">switch</span>( fieldType ){</div>
+<div class="line"><a name="l01419"></a><span class="lineno"> 1419</span>               <span class="keywordflow">case</span> OFTInteger:</div>
+<div class="line"><a name="l01420"></a><span class="lineno"> 1420</span>               <span class="keywordflow">case</span> OFTReal:</div>
+<div class="line"><a name="l01421"></a><span class="lineno"> 1421</span>             <span class="keywordflow">if</span>(polygon_opt[0])</div>
+<div class="line"><a name="l01422"></a><span class="lineno"> 1422</span>               writePolygonFeature->SetField(fieldname_opt[index].c_str(),theValue);</div>
+<div class="line"><a name="l01423"></a><span class="lineno"> 1423</span>             <span class="keywordflow">else</span></div>
+<div class="line"><a name="l01424"></a><span class="lineno"> 1424</span>               writeCentroidFeature->SetField(fieldname_opt[index].c_str(),theValue);</div>
+<div class="line"><a name="l01425"></a><span class="lineno"> 1425</span>             <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l01426"></a><span class="lineno"> 1426</span>               <span class="keywordflow">case</span> OFTString:</div>
+<div class="line"><a name="l01427"></a><span class="lineno"> 1427</span>             <span class="keywordflow">if</span>(polygon_opt[0])</div>
+<div class="line"><a name="l01428"></a><span class="lineno"> 1428</span>               writePolygonFeature->SetField(fieldname_opt[index].c_str(),type2string<double>(theValue).c_str());</div>
+<div class="line"><a name="l01429"></a><span class="lineno"> 1429</span>             <span class="keywordflow">else</span></div>
+<div class="line"><a name="l01430"></a><span class="lineno"> 1430</span>               writeCentroidFeature->SetField(fieldname_opt[index].c_str(),type2string<double>(theValue).c_str());</div>
+<div class="line"><a name="l01431"></a><span class="lineno"> 1431</span>             <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l01432"></a><span class="lineno"> 1432</span>               <span class="keywordflow">default</span>:<span class="comment">//not supported</span></div>
+<div class="line"><a name="l01433"></a><span class="lineno"> 1433</span>             std::string errorString=<span class="stringliteral">"field type not supported"</span>;</div>
+<div class="line"><a name="l01434"></a><span class="lineno"> 1434</span>             <span class="keywordflow">throw</span>(errorString);</div>
+<div class="line"><a name="l01435"></a><span class="lineno"> 1435</span>             <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l01436"></a><span class="lineno"> 1436</span>               }</div>
+<div class="line"><a name="l01437"></a><span class="lineno"> 1437</span>             }</div>
+<div class="line"><a name="l01438"></a><span class="lineno"> 1438</span>             <span class="keywordflow">catch</span>(std::string e){</div>
+<div class="line"><a name="l01439"></a><span class="lineno"> 1439</span>               std::cout << e << std::endl;</div>
+<div class="line"><a name="l01440"></a><span class="lineno"> 1440</span>               exit(1);</div>
+<div class="line"><a name="l01441"></a><span class="lineno"> 1441</span>             }</div>
+<div class="line"><a name="l01442"></a><span class="lineno"> 1442</span>           }</div>
+<div class="line"><a name="l01443"></a><span class="lineno"> 1443</span>         }</div>
+<div class="line"><a name="l01444"></a><span class="lineno"> 1444</span>           }</div>
+<div class="line"><a name="l01445"></a><span class="lineno"> 1445</span>           <span class="keywordflow">else</span>{<span class="comment">//class_opt is set</span></div>
+<div class="line"><a name="l01446"></a><span class="lineno"> 1446</span>         <span class="keywordflow">if</span>(ruleMap[rule_opt[0]]==rule::proportion||ruleMap[rule_opt[0]]==rule::count){</div>
+<div class="line"><a name="l01447"></a><span class="lineno"> 1447</span>           <span class="keywordflow">if</span>(verbose_opt[0])</div>
+<div class="line"><a name="l01448"></a><span class="lineno"> 1448</span>             std::cout << <span class="stringliteral">"number of points in polygon: "</span> << nPointWindow << std::endl;</div>
+<div class="line"><a name="l01449"></a><span class="lineno"> 1449</span>           <span class="keywordflow">if</span>(ruleMap[rule_opt[0]]==rule::proportion)</div>
+<div class="line"><a name="l01450"></a><span class="lineno"> 1450</span>             stat.normalize_pct(windowClassValues);</div>
+<div class="line"><a name="l01451"></a><span class="lineno"> 1451</span>           <span class="keywordflow">for</span>(<span class="keywordtype">int</span> index=0;index<windowClassValues.size();++index){</div>
+<div class="line"><a name="l01452"></a><span class="lineno"> 1452</span>             <span class="keywordtype">double</span> theValue=windowClassValues[index];</div>
+<div class="line"><a name="l01453"></a><span class="lineno"> 1453</span>             ostringstream fs;</div>
+<div class="line"><a name="l01454"></a><span class="lineno"> 1454</span>             fs << class_opt[index];</div>
+<div class="line"><a name="l01455"></a><span class="lineno"> 1455</span>             <span class="keywordflow">if</span>(polygon_opt[0])</div>
+<div class="line"><a name="l01456"></a><span class="lineno"> 1456</span>               writePolygonFeature->SetField(fs.str().c_str(),<span class="keyword">static_cast<</span><span class="keywordtype">int</span><span class="keyword">></span>(theValue));</div>
+<div class="line"><a name="l01457"></a><span class="lineno"> 1457</span>             <span class="keywordflow">else</span></div>
+<div class="line"><a name="l01458"></a><span class="lineno"> 1458</span>               writeCentroidFeature->SetField(fs.str().c_str(),<span class="keyword">static_cast<</span><span class="keywordtype">int</span><span class="keyword">></span>(theValue));</div>
 <div class="line"><a name="l01459"></a><span class="lineno"> 1459</span>           }</div>
 <div class="line"><a name="l01460"></a><span class="lineno"> 1460</span>         }</div>
-<div class="line"><a name="l01461"></a><span class="lineno"> 1461</span>         <span class="keywordflow">else</span>{</div>
-<div class="line"><a name="l01462"></a><span class="lineno"> 1462</span>           <span class="comment">//test</span></div>
-<div class="line"><a name="l01463"></a><span class="lineno"> 1463</span>           assert(validFeature);</div>
-<div class="line"><a name="l01464"></a><span class="lineno"> 1464</span>           <span class="keywordflow">if</span>(writeLayer->CreateFeature( writeCentroidFeature ) != OGRERR_NONE ){</div>
-<div class="line"><a name="l01465"></a><span class="lineno"> 1465</span>             std::string errorString=<span class="stringliteral">"Failed to create point feature in ogr vector dataset"</span>;</div>
-<div class="line"><a name="l01466"></a><span class="lineno"> 1466</span>             <span class="keywordflow">throw</span>(errorString);</div>
-<div class="line"><a name="l01467"></a><span class="lineno"> 1467</span>           }</div>
-<div class="line"><a name="l01468"></a><span class="lineno"> 1468</span>         }</div>
-<div class="line"><a name="l01469"></a><span class="lineno"> 1469</span>         OGRFeature::DestroyFeature( writeCentroidFeature );</div>
-<div class="line"><a name="l01470"></a><span class="lineno"> 1470</span>         ++ntotalvalid;</div>
-<div class="line"><a name="l01471"></a><span class="lineno"> 1471</span>         <span class="keywordflow">if</span>(verbose_opt[0])</div>
-<div class="line"><a name="l01472"></a><span class="lineno"> 1472</span>           std::cout << <span class="stringliteral">"ntotalvalid: "</span> << ntotalvalid << std::endl;</div>
-<div class="line"><a name="l01473"></a><span class="lineno"> 1473</span>           }</div>
-<div class="line"><a name="l01474"></a><span class="lineno"> 1474</span>         }</div>
-<div class="line"><a name="l01475"></a><span class="lineno"> 1475</span>       }<span class="comment">//if wkbPoint</span></div>
-<div class="line"><a name="l01476"></a><span class="lineno"> 1476</span>       <span class="keywordflow">else</span> <span class="keywordflow">if</span>(wkbFlatten(poGeometry->getGeometryType()) == wkbPolygon){</div>
-<div class="line"><a name="l01477"></a><span class="lineno"> 1477</span>             </div>
-<div class="line"><a name="l01478"></a><span class="lineno"> 1478</span>         OGRPolygon readPolygon = *((OGRPolygon *) poGeometry);</div>
-<div class="line"><a name="l01479"></a><span class="lineno"> 1479</span>         OGRPolygon writePolygon;</div>
-<div class="line"><a name="l01480"></a><span class="lineno"> 1480</span>         OGRLinearRing writeRing;</div>
-<div class="line"><a name="l01481"></a><span class="lineno"> 1481</span>         OGRPoint writeCentroidPoint;</div>
-<div class="line"><a name="l01482"></a><span class="lineno"> 1482</span>         OGRFeature *writePolygonFeature;</div>
-<div class="line"><a name="l01483"></a><span class="lineno"> 1483</span>         OGRFeature *writeCentroidFeature;</div>
-<div class="line"><a name="l01484"></a><span class="lineno"> 1484</span> </div>
-<div class="line"><a name="l01485"></a><span class="lineno"> 1485</span>         readPolygon.closeRings();</div>
-<div class="line"><a name="l01486"></a><span class="lineno"> 1486</span> </div>
-<div class="line"><a name="l01487"></a><span class="lineno"> 1487</span>         <span class="keywordflow">if</span>(verbose_opt[0]>1)</div>
-<div class="line"><a name="l01488"></a><span class="lineno"> 1488</span>           std::cout << <span class="stringliteral">"get point on polygon"</span> << std::endl;</div>
-<div class="line"><a name="l01489"></a><span class="lineno"> 1489</span>         <span class="keywordflow">if</span>(ruleMap[rule_opt[0]]==rule::centroid)</div>
-<div class="line"><a name="l01490"></a><span class="lineno"> 1490</span>           readPolygon.Centroid(&writeCentroidPoint);</div>
-<div class="line"><a name="l01491"></a><span class="lineno"> 1491</span>         <span class="keywordflow">else</span></div>
-<div class="line"><a name="l01492"></a><span class="lineno"> 1492</span>           readPolygon.PointOnSurface(&writeCentroidPoint);</div>
-<div class="line"><a name="l01493"></a><span class="lineno"> 1493</span> </div>
-<div class="line"><a name="l01494"></a><span class="lineno"> 1494</span>         <span class="keywordtype">double</span> ulx,uly,lrx,lry;</div>
-<div class="line"><a name="l01495"></a><span class="lineno"> 1495</span>         <span class="keywordtype">double</span> uli,ulj,lri,lrj;</div>
-<div class="line"><a name="l01496"></a><span class="lineno"> 1496</span>         <span class="keywordflow">if</span>((polygon_opt[0]&&ruleMap[rule_opt[0]]==rule::point)||(ruleMap[rule_opt[0]]==rule::centroid)){</div>
-<div class="line"><a name="l01497"></a><span class="lineno"> 1497</span>           ulx=writeCentroidPoint.getX();</div>
-<div class="line"><a name="l01498"></a><span class="lineno"> 1498</span>           uly=writeCentroidPoint.getY();</div>
-<div class="line"><a name="l01499"></a><span class="lineno"> 1499</span>           lrx=ulx;</div>
-<div class="line"><a name="l01500"></a><span class="lineno"> 1500</span>           lry=uly;</div>
+<div class="line"><a name="l01461"></a><span class="lineno"> 1461</span>         <span class="keywordflow">else</span> <span class="keywordflow">if</span>(ruleMap[rule_opt[0]]==rule::custom){</div>
+<div class="line"><a name="l01462"></a><span class="lineno"> 1462</span>           assert(polygon_opt[0]);<span class="comment">//not implemented for points</span></div>
+<div class="line"><a name="l01463"></a><span class="lineno"> 1463</span>           <span class="keywordflow">if</span>(verbose_opt[0])</div>
+<div class="line"><a name="l01464"></a><span class="lineno"> 1464</span>             std::cout << <span class="stringliteral">"number of points in polygon: "</span> << nPointWindow << std::endl;</div>
+<div class="line"><a name="l01465"></a><span class="lineno"> 1465</span>           stat.normalize_pct(windowClassValues);</div>
+<div class="line"><a name="l01466"></a><span class="lineno"> 1466</span>           assert(windowClassValues.size()==2);<span class="comment">//11:broadleaved, 12:coniferous</span></div>
+<div class="line"><a name="l01467"></a><span class="lineno"> 1467</span>           <span class="keywordflow">if</span>(windowClassValues[0]>=75)<span class="comment">//broadleaved</span></div>
+<div class="line"><a name="l01468"></a><span class="lineno"> 1468</span>             writePolygonFeature->SetField(label_opt[0].c_str(),static_cast<int>(11));</div>
+<div class="line"><a name="l01469"></a><span class="lineno"> 1469</span>           <span class="keywordflow">else</span> <span class="keywordflow">if</span>(windowClassValues[1]>=75)<span class="comment">//coniferous</span></div>
+<div class="line"><a name="l01470"></a><span class="lineno"> 1470</span>             writePolygonFeature->SetField(label_opt[0].c_str(),static_cast<int>(12));</div>
+<div class="line"><a name="l01471"></a><span class="lineno"> 1471</span>           <span class="keywordflow">else</span> <span class="keywordflow">if</span>(windowClassValues[0]>25&&windowClassValues[1]>25)<span class="comment">//mixed</span></div>
+<div class="line"><a name="l01472"></a><span class="lineno"> 1472</span>             writePolygonFeature->SetField(label_opt[0].c_str(),static_cast<int>(13));</div>
+<div class="line"><a name="l01473"></a><span class="lineno"> 1473</span>           <span class="keywordflow">else</span>{</div>
+<div class="line"><a name="l01474"></a><span class="lineno"> 1474</span>             <span class="keywordflow">if</span>(verbose_opt[0]){</div>
+<div class="line"><a name="l01475"></a><span class="lineno"> 1475</span>               std::cout << <span class="stringliteral">"No valid value in windowClassValues..."</span> << std::endl;</div>
+<div class="line"><a name="l01476"></a><span class="lineno"> 1476</span>               <span class="keywordflow">for</span>(<span class="keywordtype">int</span> index=0;index<windowClassValues.size();++index){</div>
+<div class="line"><a name="l01477"></a><span class="lineno"> 1477</span>             <span class="keywordtype">double</span> theValue=windowClassValues[index];</div>
+<div class="line"><a name="l01478"></a><span class="lineno"> 1478</span>             std::cout << theValue << <span class="stringliteral">" "</span>;</div>
+<div class="line"><a name="l01479"></a><span class="lineno"> 1479</span>               }</div>
+<div class="line"><a name="l01480"></a><span class="lineno"> 1480</span>               std::cout << std::endl;</div>
+<div class="line"><a name="l01481"></a><span class="lineno"> 1481</span>             }</div>
+<div class="line"><a name="l01482"></a><span class="lineno"> 1482</span>             writePolygonFeature->SetField(label_opt[0].c_str(),static_cast<int>(20));</div>
+<div class="line"><a name="l01483"></a><span class="lineno"> 1483</span>           }</div>
+<div class="line"><a name="l01484"></a><span class="lineno"> 1484</span>         }</div>
+<div class="line"><a name="l01485"></a><span class="lineno"> 1485</span>         <span class="keywordflow">else</span> <span class="keywordflow">if</span>(ruleMap[rule_opt[0]]==rule::mode){</div>
+<div class="line"><a name="l01486"></a><span class="lineno"> 1486</span>           <span class="comment">//maximum votes in polygon</span></div>
+<div class="line"><a name="l01487"></a><span class="lineno"> 1487</span>           <span class="keywordflow">if</span>(verbose_opt[0])</div>
+<div class="line"><a name="l01488"></a><span class="lineno"> 1488</span>             std::cout << <span class="stringliteral">"number of points in window: "</span> << nPointWindow << std::endl;</div>
+<div class="line"><a name="l01489"></a><span class="lineno"> 1489</span>           <span class="comment">//search for class with maximum votes</span></div>
+<div class="line"><a name="l01490"></a><span class="lineno"> 1490</span>           <span class="keywordtype">int</span> maxClass=stat.mymin(class_opt);</div>
+<div class="line"><a name="l01491"></a><span class="lineno"> 1491</span>           vector<double>::iterator maxit;</div>
+<div class="line"><a name="l01492"></a><span class="lineno"> 1492</span>           maxit=stat.mymax(windowClassValues,windowClassValues.begin(),windowClassValues.end());</div>
+<div class="line"><a name="l01493"></a><span class="lineno"> 1493</span>           <span class="keywordtype">int</span> maxIndex=distance(windowClassValues.begin(),maxit);</div>
+<div class="line"><a name="l01494"></a><span class="lineno"> 1494</span>           maxClass=class_opt[maxIndex];</div>
+<div class="line"><a name="l01495"></a><span class="lineno"> 1495</span>           <span class="keywordflow">if</span>(verbose_opt[0]>0)</div>
+<div class="line"><a name="l01496"></a><span class="lineno"> 1496</span>             std::cout << <span class="stringliteral">"maxClass: "</span> << maxClass << std::endl;</div>
+<div class="line"><a name="l01497"></a><span class="lineno"> 1497</span>           <span class="keywordflow">if</span>(polygon_opt[0])</div>
+<div class="line"><a name="l01498"></a><span class="lineno"> 1498</span>             writePolygonFeature->SetField(label_opt[0].c_str(),maxClass);</div>
+<div class="line"><a name="l01499"></a><span class="lineno"> 1499</span>           <span class="keywordflow">else</span></div>
+<div class="line"><a name="l01500"></a><span class="lineno"> 1500</span>             writeCentroidFeature->SetField(label_opt[0].c_str(),maxClass);</div>
 <div class="line"><a name="l01501"></a><span class="lineno"> 1501</span>         }</div>
-<div class="line"><a name="l01502"></a><span class="lineno"> 1502</span>         <span class="keywordflow">else</span>{</div>
-<div class="line"><a name="l01503"></a><span class="lineno"> 1503</span>           <span class="comment">//get envelope</span></div>
-<div class="line"><a name="l01504"></a><span class="lineno"> 1504</span>           <span class="keywordflow">if</span>(verbose_opt[0])</div>
-<div class="line"><a name="l01505"></a><span class="lineno"> 1505</span>         std::cout << <span class="stringliteral">"reading envelope for polygon "</span> << ifeature << std::endl;</div>
-<div class="line"><a name="l01506"></a><span class="lineno"> 1506</span>           OGREnvelope* psEnvelope=<span class="keyword">new</span> OGREnvelope();</div>
-<div class="line"><a name="l01507"></a><span class="lineno"> 1507</span>           readPolygon.getEnvelope(psEnvelope);</div>
-<div class="line"><a name="l01508"></a><span class="lineno"> 1508</span>           ulx=psEnvelope->MinX;</div>
-<div class="line"><a name="l01509"></a><span class="lineno"> 1509</span>           uly=psEnvelope->MaxY;</div>
-<div class="line"><a name="l01510"></a><span class="lineno"> 1510</span>           lrx=psEnvelope->MaxX;</div>
-<div class="line"><a name="l01511"></a><span class="lineno"> 1511</span>           lry=psEnvelope->MinY;</div>
-<div class="line"><a name="l01512"></a><span class="lineno"> 1512</span>           <span class="keyword">delete</span> psEnvelope;</div>
-<div class="line"><a name="l01513"></a><span class="lineno"> 1513</span>         }</div>
-<div class="line"><a name="l01514"></a><span class="lineno"> 1514</span>         <span class="keywordflow">if</span>(geo_opt[0]){</div>
-<div class="line"><a name="l01515"></a><span class="lineno"> 1515</span>           imgReader.geo2image(ulx,uly,uli,ulj);</div>
-<div class="line"><a name="l01516"></a><span class="lineno"> 1516</span>           imgReader.geo2image(lrx,lry,lri,lrj);</div>
+<div class="line"><a name="l01502"></a><span class="lineno"> 1502</span>           }</div>
+<div class="line"><a name="l01503"></a><span class="lineno"> 1503</span>           <span class="keywordflow">if</span>(polygon_opt[0]){</div>
+<div class="line"><a name="l01504"></a><span class="lineno"> 1504</span>         <span class="keywordflow">if</span>(verbose_opt[0]>1)</div>
+<div class="line"><a name="l01505"></a><span class="lineno"> 1505</span>           std::cout << <span class="stringliteral">"creating polygon feature"</span> << std::endl;</div>
+<div class="line"><a name="l01506"></a><span class="lineno"> 1506</span>         <span class="keywordflow">if</span>(writeTest){</div>
+<div class="line"><a name="l01507"></a><span class="lineno"> 1507</span>           <span class="keywordflow">if</span>(writeTestLayer->CreateFeature( writePolygonFeature ) != OGRERR_NONE ){</div>
+<div class="line"><a name="l01508"></a><span class="lineno"> 1508</span>             std::string errorString=<span class="stringliteral">"Failed to create polygon feature in ogr vector dataset"</span>;</div>
+<div class="line"><a name="l01509"></a><span class="lineno"> 1509</span>             <span class="keywordflow">throw</span>(errorString);</div>
+<div class="line"><a name="l01510"></a><span class="lineno"> 1510</span>           }</div>
+<div class="line"><a name="l01511"></a><span class="lineno"> 1511</span>         }</div>
+<div class="line"><a name="l01512"></a><span class="lineno"> 1512</span>         <span class="keywordflow">else</span>{</div>
+<div class="line"><a name="l01513"></a><span class="lineno"> 1513</span>           <span class="keywordflow">if</span>(writeLayer->CreateFeature( writePolygonFeature ) != OGRERR_NONE ){</div>
+<div class="line"><a name="l01514"></a><span class="lineno"> 1514</span>             std::string errorString=<span class="stringliteral">"Failed to create polygon feature in ogr vector dataset"</span>;</div>
+<div class="line"><a name="l01515"></a><span class="lineno"> 1515</span>             <span class="keywordflow">throw</span>(errorString);</div>
+<div class="line"><a name="l01516"></a><span class="lineno"> 1516</span>           }</div>
 <div class="line"><a name="l01517"></a><span class="lineno"> 1517</span>         }</div>
-<div class="line"><a name="l01518"></a><span class="lineno"> 1518</span>         <span class="keywordflow">else</span>{</div>
-<div class="line"><a name="l01519"></a><span class="lineno"> 1519</span>           uli=ulx;</div>
-<div class="line"><a name="l01520"></a><span class="lineno"> 1520</span>           ulj=uly;</div>
-<div class="line"><a name="l01521"></a><span class="lineno"> 1521</span>           lri=lrx;</div>
-<div class="line"><a name="l01522"></a><span class="lineno"> 1522</span>           lrj=lry;</div>
-<div class="line"><a name="l01523"></a><span class="lineno"> 1523</span>         }</div>
-<div class="line"><a name="l01524"></a><span class="lineno"> 1524</span>         <span class="comment">//nearest neighbour</span></div>
-<div class="line"><a name="l01525"></a><span class="lineno"> 1525</span>         ulj=<span class="keyword">static_cast<</span><span class="keywordtype">int</span><span class="keyword">></span>(ulj);</div>
-<div class="line"><a name="l01526"></a><span class="lineno"> 1526</span>         uli=<span class="keyword">static_cast<</span><span class="keywordtype">int</span><span class="keyword">></span>(uli);</div>
-<div class="line"><a name="l01527"></a><span class="lineno"> 1527</span>         lrj=<span class="keyword">static_cast<</span><span class="keywordtype">int</span><span class="keyword">></span>(lrj);</div>
-<div class="line"><a name="l01528"></a><span class="lineno"> 1528</span>         lri=<span class="keyword">static_cast<</span><span class="keywordtype">int</span><span class="keyword">></span>(lri);</div>
-<div class="line"><a name="l01529"></a><span class="lineno"> 1529</span>         <span class="comment">//iterate through all pixels</span></div>
-<div class="line"><a name="l01530"></a><span class="lineno"> 1530</span>         <span class="keywordflow">if</span>(verbose_opt[0]>1)</div>
-<div class="line"><a name="l01531"></a><span class="lineno"> 1531</span>           std::cout << <span class="stringliteral">"bounding box for polygon feature "</span> << ifeature << <span class="stringliteral">": "</span> << uli << <span class="stringliteral">" "</span> << ulj << <span class="stringliteral">" "</span> << lri << <span class="stringliteral">" "</span> << lrj & [...]
-<div class="line"><a name="l01532"></a><span class="lineno"> 1532</span> </div>
-<div class="line"><a name="l01533"></a><span class="lineno"> 1533</span>         <span class="keywordflow">if</span>(uli<0)</div>
-<div class="line"><a name="l01534"></a><span class="lineno"> 1534</span>           uli=0;</div>
-<div class="line"><a name="l01535"></a><span class="lineno"> 1535</span>         <span class="keywordflow">if</span>(lri<0)</div>
-<div class="line"><a name="l01536"></a><span class="lineno"> 1536</span>           lri=0;</div>
-<div class="line"><a name="l01537"></a><span class="lineno"> 1537</span>         <span class="keywordflow">if</span>(uli>=imgReader.nrOfCol())</div>
-<div class="line"><a name="l01538"></a><span class="lineno"> 1538</span>           uli=imgReader.nrOfCol()-1;</div>
-<div class="line"><a name="l01539"></a><span class="lineno"> 1539</span>         <span class="keywordflow">if</span>(lri>=imgReader.nrOfCol())</div>
-<div class="line"><a name="l01540"></a><span class="lineno"> 1540</span>           lri=imgReader.nrOfCol()-1;</div>
-<div class="line"><a name="l01541"></a><span class="lineno"> 1541</span>         <span class="keywordflow">if</span>(ulj<0)</div>
-<div class="line"><a name="l01542"></a><span class="lineno"> 1542</span>           ulj=0;</div>
-<div class="line"><a name="l01543"></a><span class="lineno"> 1543</span>         <span class="keywordflow">if</span>(lrj<0)</div>
-<div class="line"><a name="l01544"></a><span class="lineno"> 1544</span>           lrj=0;</div>
-<div class="line"><a name="l01545"></a><span class="lineno"> 1545</span>         <span class="keywordflow">if</span>(ulj>=imgReader.nrOfRow())</div>
-<div class="line"><a name="l01546"></a><span class="lineno"> 1546</span>           ulj=imgReader.nrOfRow()-1;</div>
-<div class="line"><a name="l01547"></a><span class="lineno"> 1547</span>         <span class="keywordflow">if</span>(lrj>=imgReader.nrOfRow())</div>
-<div class="line"><a name="l01548"></a><span class="lineno"> 1548</span>           lrj=imgReader.nrOfRow()-1;</div>
-<div class="line"><a name="l01549"></a><span class="lineno"> 1549</span>         <span class="comment">// if(uli<0||lri>=imgReader.nrOfCol()||ulj<0||lrj>=imgReader.nrOfRow())</span></div>
-<div class="line"><a name="l01550"></a><span class="lineno"> 1550</span>         <span class="comment">//   continue;</span></div>
-<div class="line"><a name="l01551"></a><span class="lineno"> 1551</span> </div>
-<div class="line"><a name="l01552"></a><span class="lineno"> 1552</span>         <span class="keywordtype">int</span> nPointPolygon=0;</div>
-<div class="line"><a name="l01553"></a><span class="lineno"> 1553</span> </div>
-<div class="line"><a name="l01554"></a><span class="lineno"> 1554</span>         <span class="keywordflow">if</span>(polygon_opt[0]){</div>
-<div class="line"><a name="l01555"></a><span class="lineno"> 1555</span>           <span class="keywordflow">if</span>(writeTest)</div>
-<div class="line"><a name="l01556"></a><span class="lineno"> 1556</span>         writePolygonFeature = OGRFeature::CreateFeature(writeTestLayer->GetLayerDefn());</div>
-<div class="line"><a name="l01557"></a><span class="lineno"> 1557</span>           <span class="keywordflow">else</span></div>
-<div class="line"><a name="l01558"></a><span class="lineno"> 1558</span>         writePolygonFeature = OGRFeature::CreateFeature(writeLayer->GetLayerDefn());</div>
-<div class="line"><a name="l01559"></a><span class="lineno"> 1559</span>         }</div>
-<div class="line"><a name="l01560"></a><span class="lineno"> 1560</span>         <span class="keywordflow">else</span> <span class="keywordflow">if</span>(ruleMap[rule_opt[0]]!=rule::point){</div>
-<div class="line"><a name="l01561"></a><span class="lineno"> 1561</span>           <span class="keywordflow">if</span>(writeTest)</div>
-<div class="line"><a name="l01562"></a><span class="lineno"> 1562</span>         writeCentroidFeature = OGRFeature::CreateFeature(writeTestLayer->GetLayerDefn());</div>
-<div class="line"><a name="l01563"></a><span class="lineno"> 1563</span>           <span class="keywordflow">else</span></div>
-<div class="line"><a name="l01564"></a><span class="lineno"> 1564</span>         writeCentroidFeature = OGRFeature::CreateFeature(writeLayer->GetLayerDefn());</div>
+<div class="line"><a name="l01518"></a><span class="lineno"> 1518</span>         OGRFeature::DestroyFeature( writePolygonFeature );</div>
+<div class="line"><a name="l01519"></a><span class="lineno"> 1519</span>         ++ntotalvalid;</div>
+<div class="line"><a name="l01520"></a><span class="lineno"> 1520</span>         <span class="keywordflow">if</span>(verbose_opt[0])</div>
+<div class="line"><a name="l01521"></a><span class="lineno"> 1521</span>           std::cout << <span class="stringliteral">"ntotalvalid(1): "</span> << ntotalvalid << std::endl;</div>
+<div class="line"><a name="l01522"></a><span class="lineno"> 1522</span>           }</div>
+<div class="line"><a name="l01523"></a><span class="lineno"> 1523</span>           <span class="keywordflow">else</span>{</div>
+<div class="line"><a name="l01524"></a><span class="lineno"> 1524</span>         <span class="keywordflow">if</span>(verbose_opt[0]>1)</div>
+<div class="line"><a name="l01525"></a><span class="lineno"> 1525</span>           std::cout << <span class="stringliteral">"creating point feature in centroid"</span> << std::endl;</div>
+<div class="line"><a name="l01526"></a><span class="lineno"> 1526</span>         <span class="keywordflow">if</span>(writeTest){</div>
+<div class="line"><a name="l01527"></a><span class="lineno"> 1527</span>           <span class="keywordflow">if</span>(writeTestLayer->CreateFeature( writeCentroidFeature ) != OGRERR_NONE ){</div>
+<div class="line"><a name="l01528"></a><span class="lineno"> 1528</span>             std::string errorString=<span class="stringliteral">"Failed to create point feature in ogr vector dataset"</span>;</div>
+<div class="line"><a name="l01529"></a><span class="lineno"> 1529</span>             <span class="keywordflow">throw</span>(errorString);</div>
+<div class="line"><a name="l01530"></a><span class="lineno"> 1530</span>           }</div>
+<div class="line"><a name="l01531"></a><span class="lineno"> 1531</span>         }</div>
+<div class="line"><a name="l01532"></a><span class="lineno"> 1532</span>         <span class="keywordflow">else</span>{</div>
+<div class="line"><a name="l01533"></a><span class="lineno"> 1533</span>           <span class="comment">//test</span></div>
+<div class="line"><a name="l01534"></a><span class="lineno"> 1534</span>           assert(validFeature);</div>
+<div class="line"><a name="l01535"></a><span class="lineno"> 1535</span>           <span class="keywordflow">if</span>(writeLayer->CreateFeature( writeCentroidFeature ) != OGRERR_NONE ){</div>
+<div class="line"><a name="l01536"></a><span class="lineno"> 1536</span>             std::string errorString=<span class="stringliteral">"Failed to create point feature in ogr vector dataset"</span>;</div>
+<div class="line"><a name="l01537"></a><span class="lineno"> 1537</span>             <span class="keywordflow">throw</span>(errorString);</div>
+<div class="line"><a name="l01538"></a><span class="lineno"> 1538</span>           }</div>
+<div class="line"><a name="l01539"></a><span class="lineno"> 1539</span>         }</div>
+<div class="line"><a name="l01540"></a><span class="lineno"> 1540</span>         OGRFeature::DestroyFeature( writeCentroidFeature );</div>
+<div class="line"><a name="l01541"></a><span class="lineno"> 1541</span>         ++ntotalvalid;</div>
+<div class="line"><a name="l01542"></a><span class="lineno"> 1542</span>         <span class="keywordflow">if</span>(verbose_opt[0])</div>
+<div class="line"><a name="l01543"></a><span class="lineno"> 1543</span>           std::cout << <span class="stringliteral">"ntotalvalid: "</span> << ntotalvalid << std::endl;</div>
+<div class="line"><a name="l01544"></a><span class="lineno"> 1544</span>           }</div>
+<div class="line"><a name="l01545"></a><span class="lineno"> 1545</span>         }</div>
+<div class="line"><a name="l01546"></a><span class="lineno"> 1546</span>       }<span class="comment">//if wkbPoint</span></div>
+<div class="line"><a name="l01547"></a><span class="lineno"> 1547</span>       <span class="keywordflow">else</span> <span class="keywordflow">if</span>(wkbFlatten(poGeometry->getGeometryType()) == wkbPolygon){</div>
+<div class="line"><a name="l01548"></a><span class="lineno"> 1548</span>             </div>
+<div class="line"><a name="l01549"></a><span class="lineno"> 1549</span>         OGRPolygon readPolygon = *((OGRPolygon *) poGeometry);</div>
+<div class="line"><a name="l01550"></a><span class="lineno"> 1550</span>         OGRPolygon writePolygon;</div>
+<div class="line"><a name="l01551"></a><span class="lineno"> 1551</span>         OGRLinearRing writeRing;</div>
+<div class="line"><a name="l01552"></a><span class="lineno"> 1552</span>         OGRPoint writeCentroidPoint;</div>
+<div class="line"><a name="l01553"></a><span class="lineno"> 1553</span>         OGRFeature *writePolygonFeature;</div>
+<div class="line"><a name="l01554"></a><span class="lineno"> 1554</span>         OGRFeature *writeCentroidFeature;</div>
+<div class="line"><a name="l01555"></a><span class="lineno"> 1555</span> </div>
+<div class="line"><a name="l01556"></a><span class="lineno"> 1556</span>         readPolygon.closeRings();</div>
+<div class="line"><a name="l01557"></a><span class="lineno"> 1557</span> </div>
+<div class="line"><a name="l01558"></a><span class="lineno"> 1558</span>         <span class="keywordflow">if</span>(verbose_opt[0]>1)</div>
+<div class="line"><a name="l01559"></a><span class="lineno"> 1559</span>           std::cout << <span class="stringliteral">"get point on polygon"</span> << std::endl;</div>
+<div class="line"><a name="l01560"></a><span class="lineno"> 1560</span>         <span class="keywordflow">if</span>(ruleMap[rule_opt[0]]==rule::centroid)</div>
+<div class="line"><a name="l01561"></a><span class="lineno"> 1561</span>           readPolygon.Centroid(&writeCentroidPoint);</div>
+<div class="line"><a name="l01562"></a><span class="lineno"> 1562</span>         <span class="keywordflow">else</span> <span class="keywordflow">if</span>(readPolygon.PointOnSurface(&writeCentroidPoint)!=OGRERR_NONE){</div>
+<div class="line"><a name="l01563"></a><span class="lineno"> 1563</span>           <span class="comment">// cerr << "function PointOnSurface failed, trying centroid instead" << endl;</span></div>
+<div class="line"><a name="l01564"></a><span class="lineno"> 1564</span>           readPolygon.Centroid(&writeCentroidPoint);</div>
 <div class="line"><a name="l01565"></a><span class="lineno"> 1565</span>         }</div>
-<div class="line"><a name="l01566"></a><span class="lineno"> 1566</span>         <span class="comment">// vector<double> polyValues;</span></div>
-<div class="line"><a name="l01567"></a><span class="lineno"> 1567</span>         <a class="code" href="classVector2d.html">Vector2d<double></a> polyValues;</div>
-<div class="line"><a name="l01568"></a><span class="lineno"> 1568</span>         vector<double> polyClassValues;</div>
-<div class="line"><a name="l01569"></a><span class="lineno"> 1569</span>         </div>
-<div class="line"><a name="l01570"></a><span class="lineno"> 1570</span>         <span class="keywordflow">if</span>(class_opt.size()){</div>
-<div class="line"><a name="l01571"></a><span class="lineno"> 1571</span> </div>
-<div class="line"><a name="l01572"></a><span class="lineno"> 1572</span>           polyClassValues.resize(class_opt.size());</div>
-<div class="line"><a name="l01573"></a><span class="lineno"> 1573</span>           <span class="comment">//initialize</span></div>
-<div class="line"><a name="l01574"></a><span class="lineno"> 1574</span>           <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iclass=0;iclass<class_opt.size();++iclass)</div>
-<div class="line"><a name="l01575"></a><span class="lineno"> 1575</span>         polyClassValues[iclass]=0;</div>
-<div class="line"><a name="l01576"></a><span class="lineno"> 1576</span>         }</div>
-<div class="line"><a name="l01577"></a><span class="lineno"> 1577</span>         <span class="keywordflow">else</span></div>
-<div class="line"><a name="l01578"></a><span class="lineno"> 1578</span>           polyValues.resize(nband);</div>
-<div class="line"><a name="l01579"></a><span class="lineno"> 1579</span>         vector< Vector2d<double> > readValues(nband);</div>
-<div class="line"><a name="l01580"></a><span class="lineno"> 1580</span>         <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iband=0;iband<nband;++iband){</div>
-<div class="line"><a name="l01581"></a><span class="lineno"> 1581</span>           <span class="keywordtype">int</span> theBand=(band_opt.size()) ? band_opt[iband] : iband;</div>
-<div class="line"><a name="l01582"></a><span class="lineno"> 1582</span>           <span class="comment">//test</span></div>
-<div class="line"><a name="l01583"></a><span class="lineno"> 1583</span>           assert(uli>=0);</div>
-<div class="line"><a name="l01584"></a><span class="lineno"> 1584</span>           assert(uli<imgReader.nrOfCol());        </div>
-<div class="line"><a name="l01585"></a><span class="lineno"> 1585</span>           assert(lri>=0);</div>
-<div class="line"><a name="l01586"></a><span class="lineno"> 1586</span>           assert(lri<imgReader.nrOfCol());        </div>
-<div class="line"><a name="l01587"></a><span class="lineno"> 1587</span>           assert(ulj>=0);</div>
-<div class="line"><a name="l01588"></a><span class="lineno"> 1588</span>           assert(ulj<imgReader.nrOfRow());        </div>
-<div class="line"><a name="l01589"></a><span class="lineno"> 1589</span>           assert(lrj>=0);</div>
-<div class="line"><a name="l01590"></a><span class="lineno"> 1590</span>           assert(lrj<imgReader.nrOfRow());        </div>
-<div class="line"><a name="l01591"></a><span class="lineno"> 1591</span>           imgReader.readDataBlock(readValues[iband],GDT_Float64,uli,lri,ulj,lrj,theBand);</div>
-<div class="line"><a name="l01592"></a><span class="lineno"> 1592</span>         }</div>
-<div class="line"><a name="l01593"></a><span class="lineno"> 1593</span> </div>
-<div class="line"><a name="l01594"></a><span class="lineno"> 1594</span>         OGRPoint thePoint;</div>
-<div class="line"><a name="l01595"></a><span class="lineno"> 1595</span>         <span class="keywordflow">for</span>(<span class="keywordtype">int</span> j=ulj;j<=lrj;++j){</div>
-<div class="line"><a name="l01596"></a><span class="lineno"> 1596</span>           <span class="keywordflow">for</span>(<span class="keywordtype">int</span> i=uli;i<=lri;++i){</div>
-<div class="line"><a name="l01597"></a><span class="lineno"> 1597</span>         <span class="comment">//check if within raster image</span></div>
-<div class="line"><a name="l01598"></a><span class="lineno"> 1598</span>         <span class="keywordflow">if</span>(i<0||i>=imgReader.nrOfCol())</div>
-<div class="line"><a name="l01599"></a><span class="lineno"> 1599</span>           <span class="keywordflow">continue</span>;</div>
-<div class="line"><a name="l01600"></a><span class="lineno"> 1600</span>         <span class="keywordflow">if</span>(j<0||j>=imgReader.nrOfRow())</div>
-<div class="line"><a name="l01601"></a><span class="lineno"> 1601</span>           <span class="keywordflow">continue</span>;</div>
-<div class="line"><a name="l01602"></a><span class="lineno"> 1602</span>         <span class="comment">//check if point is on surface</span></div>
-<div class="line"><a name="l01603"></a><span class="lineno"> 1603</span>         <span class="keywordtype">double</span> theX=0;</div>
-<div class="line"><a name="l01604"></a><span class="lineno"> 1604</span>         <span class="keywordtype">double</span> theY=0;</div>
-<div class="line"><a name="l01605"></a><span class="lineno"> 1605</span>         imgReader.image2geo(i,j,theX,theY);</div>
-<div class="line"><a name="l01606"></a><span class="lineno"> 1606</span>         thePoint.setX(theX);</div>
-<div class="line"><a name="l01607"></a><span class="lineno"> 1607</span>         thePoint.setY(theY);</div>
-<div class="line"><a name="l01608"></a><span class="lineno"> 1608</span>         </div>
-<div class="line"><a name="l01609"></a><span class="lineno"> 1609</span>         <span class="keywordflow">if</span>(ruleMap[rule_opt[0]]!=rule::centroid&&!readPolygon.Contains(&thePoint))</div>
-<div class="line"><a name="l01610"></a><span class="lineno"> 1610</span>           <span class="keywordflow">continue</span>;</div>
-<div class="line"><a name="l01611"></a><span class="lineno"> 1611</span> </div>
-<div class="line"><a name="l01612"></a><span class="lineno"> 1612</span>         <span class="keywordtype">bool</span> valid=<span class="keyword">true</span>;</div>
-<div class="line"><a name="l01613"></a><span class="lineno"> 1613</span> </div>
-<div class="line"><a name="l01614"></a><span class="lineno"> 1614</span>         <span class="keywordflow">if</span>(srcnodata_opt.size()){</div>
-<div class="line"><a name="l01615"></a><span class="lineno"> 1615</span>           <span class="keywordflow">for</span>(<span class="keywordtype">int</span> vband=0;vband<bndnodata_opt.size();++vband){</div>
-<div class="line"><a name="l01616"></a><span class="lineno"> 1616</span>             <span class="keywordtype">double</span> value=((readValues[bndnodata_opt[vband]])[j-ulj])[i-uli];</div>
-<div class="line"><a name="l01617"></a><span class="lineno"> 1617</span>             <span class="keywordflow">if</span>(value==srcnodata_opt[vband]){</div>
-<div class="line"><a name="l01618"></a><span class="lineno"> 1618</span>               valid=<span class="keyword">false</span>;</div>
-<div class="line"><a name="l01619"></a><span class="lineno"> 1619</span>               <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l01620"></a><span class="lineno"> 1620</span>             }</div>
-<div class="line"><a name="l01621"></a><span class="lineno"> 1621</span>           }</div>
-<div class="line"><a name="l01622"></a><span class="lineno"> 1622</span>         }</div>
+<div class="line"><a name="l01566"></a><span class="lineno"> 1566</span>         <span class="keywordtype">double</span> ulx,uly,lrx,lry;</div>
+<div class="line"><a name="l01567"></a><span class="lineno"> 1567</span>         <span class="keywordtype">double</span> uli,ulj,lri,lrj;</div>
+<div class="line"><a name="l01568"></a><span class="lineno"> 1568</span>         <span class="keywordflow">if</span>((polygon_opt[0]&&ruleMap[rule_opt[0]]==rule::point)||(ruleMap[rule_opt[0]]==rule::centroid)){</div>
+<div class="line"><a name="l01569"></a><span class="lineno"> 1569</span>           ulx=writeCentroidPoint.getX();</div>
+<div class="line"><a name="l01570"></a><span class="lineno"> 1570</span>           uly=writeCentroidPoint.getY();</div>
+<div class="line"><a name="l01571"></a><span class="lineno"> 1571</span>           lrx=ulx;</div>
+<div class="line"><a name="l01572"></a><span class="lineno"> 1572</span>           lry=uly;</div>
+<div class="line"><a name="l01573"></a><span class="lineno"> 1573</span>         }</div>
+<div class="line"><a name="l01574"></a><span class="lineno"> 1574</span>         <span class="keywordflow">else</span>{</div>
+<div class="line"><a name="l01575"></a><span class="lineno"> 1575</span>           <span class="comment">//get envelope</span></div>
+<div class="line"><a name="l01576"></a><span class="lineno"> 1576</span>           <span class="keywordflow">if</span>(verbose_opt[0])</div>
+<div class="line"><a name="l01577"></a><span class="lineno"> 1577</span>         std::cout << <span class="stringliteral">"reading envelope for polygon "</span> << ifeature << std::endl;</div>
+<div class="line"><a name="l01578"></a><span class="lineno"> 1578</span>           OGREnvelope* psEnvelope=<span class="keyword">new</span> OGREnvelope();</div>
+<div class="line"><a name="l01579"></a><span class="lineno"> 1579</span>           readPolygon.getEnvelope(psEnvelope);</div>
+<div class="line"><a name="l01580"></a><span class="lineno"> 1580</span>           ulx=psEnvelope->MinX;</div>
+<div class="line"><a name="l01581"></a><span class="lineno"> 1581</span>           uly=psEnvelope->MaxY;</div>
+<div class="line"><a name="l01582"></a><span class="lineno"> 1582</span>           lrx=psEnvelope->MaxX;</div>
+<div class="line"><a name="l01583"></a><span class="lineno"> 1583</span>           lry=psEnvelope->MinY;</div>
+<div class="line"><a name="l01584"></a><span class="lineno"> 1584</span>           <span class="keyword">delete</span> psEnvelope;</div>
+<div class="line"><a name="l01585"></a><span class="lineno"> 1585</span>         }</div>
+<div class="line"><a name="l01586"></a><span class="lineno"> 1586</span>         <span class="keywordflow">if</span>(geo_opt[0]){</div>
+<div class="line"><a name="l01587"></a><span class="lineno"> 1587</span>           imgReader.geo2image(ulx,uly,uli,ulj);</div>
+<div class="line"><a name="l01588"></a><span class="lineno"> 1588</span>           imgReader.geo2image(lrx,lry,lri,lrj);</div>
+<div class="line"><a name="l01589"></a><span class="lineno"> 1589</span>         }</div>
+<div class="line"><a name="l01590"></a><span class="lineno"> 1590</span>         <span class="keywordflow">else</span>{</div>
+<div class="line"><a name="l01591"></a><span class="lineno"> 1591</span>           uli=ulx;</div>
+<div class="line"><a name="l01592"></a><span class="lineno"> 1592</span>           ulj=uly;</div>
+<div class="line"><a name="l01593"></a><span class="lineno"> 1593</span>           lri=lrx;</div>
+<div class="line"><a name="l01594"></a><span class="lineno"> 1594</span>           lrj=lry;</div>
+<div class="line"><a name="l01595"></a><span class="lineno"> 1595</span>         }</div>
+<div class="line"><a name="l01596"></a><span class="lineno"> 1596</span>         <span class="comment">//nearest neighbour</span></div>
+<div class="line"><a name="l01597"></a><span class="lineno"> 1597</span>         ulj=<span class="keyword">static_cast<</span><span class="keywordtype">int</span><span class="keyword">></span>(ulj);</div>
+<div class="line"><a name="l01598"></a><span class="lineno"> 1598</span>         uli=<span class="keyword">static_cast<</span><span class="keywordtype">int</span><span class="keyword">></span>(uli);</div>
+<div class="line"><a name="l01599"></a><span class="lineno"> 1599</span>         lrj=<span class="keyword">static_cast<</span><span class="keywordtype">int</span><span class="keyword">></span>(lrj);</div>
+<div class="line"><a name="l01600"></a><span class="lineno"> 1600</span>         lri=<span class="keyword">static_cast<</span><span class="keywordtype">int</span><span class="keyword">></span>(lri);</div>
+<div class="line"><a name="l01601"></a><span class="lineno"> 1601</span>         <span class="comment">//iterate through all pixels</span></div>
+<div class="line"><a name="l01602"></a><span class="lineno"> 1602</span>         <span class="keywordflow">if</span>(verbose_opt[0]>1)</div>
+<div class="line"><a name="l01603"></a><span class="lineno"> 1603</span>           std::cout << <span class="stringliteral">"bounding box for polygon feature "</span> << ifeature << <span class="stringliteral">": "</span> << uli << <span class="stringliteral">" "</span> << ulj << <span class="stringliteral">" "</span> << lri << <span class="stringliteral">" "</span> << lrj & [...]
+<div class="line"><a name="l01604"></a><span class="lineno"> 1604</span> </div>
+<div class="line"><a name="l01605"></a><span class="lineno"> 1605</span>         <span class="keywordflow">if</span>(uli<0)</div>
+<div class="line"><a name="l01606"></a><span class="lineno"> 1606</span>           uli=0;</div>
+<div class="line"><a name="l01607"></a><span class="lineno"> 1607</span>         <span class="keywordflow">if</span>(lri<0)</div>
+<div class="line"><a name="l01608"></a><span class="lineno"> 1608</span>           lri=0;</div>
+<div class="line"><a name="l01609"></a><span class="lineno"> 1609</span>         <span class="keywordflow">if</span>(uli>=imgReader.nrOfCol())</div>
+<div class="line"><a name="l01610"></a><span class="lineno"> 1610</span>           uli=imgReader.nrOfCol()-1;</div>
+<div class="line"><a name="l01611"></a><span class="lineno"> 1611</span>         <span class="keywordflow">if</span>(lri>=imgReader.nrOfCol())</div>
+<div class="line"><a name="l01612"></a><span class="lineno"> 1612</span>           lri=imgReader.nrOfCol()-1;</div>
+<div class="line"><a name="l01613"></a><span class="lineno"> 1613</span>         <span class="keywordflow">if</span>(ulj<0)</div>
+<div class="line"><a name="l01614"></a><span class="lineno"> 1614</span>           ulj=0;</div>
+<div class="line"><a name="l01615"></a><span class="lineno"> 1615</span>         <span class="keywordflow">if</span>(lrj<0)</div>
+<div class="line"><a name="l01616"></a><span class="lineno"> 1616</span>           lrj=0;</div>
+<div class="line"><a name="l01617"></a><span class="lineno"> 1617</span>         <span class="keywordflow">if</span>(ulj>=imgReader.nrOfRow())</div>
+<div class="line"><a name="l01618"></a><span class="lineno"> 1618</span>           ulj=imgReader.nrOfRow()-1;</div>
+<div class="line"><a name="l01619"></a><span class="lineno"> 1619</span>         <span class="keywordflow">if</span>(lrj>=imgReader.nrOfRow())</div>
+<div class="line"><a name="l01620"></a><span class="lineno"> 1620</span>           lrj=imgReader.nrOfRow()-1;</div>
+<div class="line"><a name="l01621"></a><span class="lineno"> 1621</span>         <span class="comment">// if(uli<0||lri>=imgReader.nrOfCol()||ulj<0||lrj>=imgReader.nrOfRow())</span></div>
+<div class="line"><a name="l01622"></a><span class="lineno"> 1622</span>         <span class="comment">//   continue;</span></div>
 <div class="line"><a name="l01623"></a><span class="lineno"> 1623</span> </div>
-<div class="line"><a name="l01624"></a><span class="lineno"> 1624</span>         <span class="keywordflow">if</span>(!valid)</div>
-<div class="line"><a name="l01625"></a><span class="lineno"> 1625</span>           <span class="keywordflow">continue</span>;</div>
-<div class="line"><a name="l01626"></a><span class="lineno"> 1626</span>         <span class="keywordflow">else</span></div>
-<div class="line"><a name="l01627"></a><span class="lineno"> 1627</span>           validFeature=<span class="keyword">true</span>;</div>
-<div class="line"><a name="l01628"></a><span class="lineno"> 1628</span> </div>
-<div class="line"><a name="l01629"></a><span class="lineno"> 1629</span>         writeRing.addPoint(&thePoint);<span class="comment">//todo: check if I need to add all interior points to ring or do I need to check if point is on ring first?</span></div>
-<div class="line"><a name="l01630"></a><span class="lineno"> 1630</span>         <span class="comment">// if(writeRing.isPointOnRingBoundary(&thePoint))</span></div>
-<div class="line"><a name="l01631"></a><span class="lineno"> 1631</span>         <span class="comment">//    writeRing.addPoint(&thePoint);</span></div>
-<div class="line"><a name="l01632"></a><span class="lineno"> 1632</span>         <span class="keywordflow">if</span>(verbose_opt[0]>1)</div>
-<div class="line"><a name="l01633"></a><span class="lineno"> 1633</span>           std::cout << <span class="stringliteral">"point is on surface:"</span> << thePoint.getX() << <span class="stringliteral">","</span> << thePoint.getY() << std::endl;</div>
-<div class="line"><a name="l01634"></a><span class="lineno"> 1634</span>         ++nPointPolygon;</div>
-<div class="line"><a name="l01635"></a><span class="lineno"> 1635</span> </div>
-<div class="line"><a name="l01636"></a><span class="lineno"> 1636</span>         <span class="keywordflow">if</span>(polythreshold_opt.size())</div>
-<div class="line"><a name="l01637"></a><span class="lineno"> 1637</span>           <span class="keywordflow">if</span>(nPointPolygon>polythreshold_opt[0])</div>
-<div class="line"><a name="l01638"></a><span class="lineno"> 1638</span>             <span class="keywordflow">continue</span>;</div>
-<div class="line"><a name="l01639"></a><span class="lineno"> 1639</span>         <span class="comment">// throw(nPointPolygon);</span></div>
-<div class="line"><a name="l01640"></a><span class="lineno"> 1640</span>         OGRFeature *writePointFeature;</div>
-<div class="line"><a name="l01641"></a><span class="lineno"> 1641</span>         <span class="keywordflow">if</span>(!polygon_opt[0]){</div>
-<div class="line"><a name="l01642"></a><span class="lineno"> 1642</span>           <span class="comment">//create feature</span></div>
-<div class="line"><a name="l01643"></a><span class="lineno"> 1643</span>           <span class="keywordflow">if</span>(ruleMap[rule_opt[0]]==rule::point){<span class="comment">//do not create in case of mean, stdev, median, sum or centroid (only create point at centroid)</span></div>
-<div class="line"><a name="l01644"></a><span class="lineno"> 1644</span>             <span class="keywordflow">if</span>(writeTest)</div>
-<div class="line"><a name="l01645"></a><span class="lineno"> 1645</span>               writePointFeature = OGRFeature::CreateFeature(writeTestLayer->GetLayerDefn());</div>
-<div class="line"><a name="l01646"></a><span class="lineno"> 1646</span>             <span class="keywordflow">else</span></div>
-<div class="line"><a name="l01647"></a><span class="lineno"> 1647</span>               writePointFeature = OGRFeature::CreateFeature(writeLayer->GetLayerDefn());</div>
-<div class="line"><a name="l01648"></a><span class="lineno"> 1648</span>             <span class="keywordflow">if</span>(verbose_opt[0]>1)</div>
-<div class="line"><a name="l01649"></a><span class="lineno"> 1649</span>               std::cout << <span class="stringliteral">"copying fields from polygons "</span> << std::endl;</div>
-<div class="line"><a name="l01650"></a><span class="lineno"> 1650</span>             <span class="keywordflow">if</span>(writePointFeature->SetFrom(readFeature)!= OGRERR_NONE)</div>
-<div class="line"><a name="l01651"></a><span class="lineno"> 1651</span>               cerr << <span class="stringliteral">"writing feature failed"</span> << std::endl;</div>
-<div class="line"><a name="l01652"></a><span class="lineno"> 1652</span>             <span class="keywordflow">if</span>(verbose_opt[0]>1)</div>
-<div class="line"><a name="l01653"></a><span class="lineno"> 1653</span>               std::cout << <span class="stringliteral">"set geometry as point "</span> << std::endl;</div>
-<div class="line"><a name="l01654"></a><span class="lineno"> 1654</span>             <span class="comment">//test</span></div>
-<div class="line"><a name="l01655"></a><span class="lineno"> 1655</span>             writePointFeature->SetGeometry(&thePoint);</div>
-<div class="line"><a name="l01656"></a><span class="lineno"> 1656</span>             assert(wkbFlatten(writePointFeature->GetGeometryRef()->getGeometryType()) == wkbPoint);</div>
-<div class="line"><a name="l01657"></a><span class="lineno"> 1657</span>             <span class="comment">//test</span></div>
-<div class="line"><a name="l01658"></a><span class="lineno"> 1658</span>             <span class="comment">// OGRGeometry *updateGeometry;</span></div>
-<div class="line"><a name="l01659"></a><span class="lineno"> 1659</span>             <span class="comment">// updateGeometry = writePointFeature->GetGeometryRef();</span></div>
-<div class="line"><a name="l01660"></a><span class="lineno"> 1660</span>             <span class="comment">// OGRPoint *poPoint = (OGRPoint *) updateGeometry;</span></div>
-<div class="line"><a name="l01661"></a><span class="lineno"> 1661</span>             <span class="keywordflow">if</span>(verbose_opt[0]>1)</div>
-<div class="line"><a name="l01662"></a><span class="lineno"> 1662</span>               std::cout << <span class="stringliteral">"write feature has "</span> << writePointFeature->GetFieldCount() << <span class="stringliteral">" fields"</span> << std::endl;</div>
-<div class="line"><a name="l01663"></a><span class="lineno"> 1663</span>           }</div>
-<div class="line"><a name="l01664"></a><span class="lineno"> 1664</span>         }</div>
-<div class="line"><a name="l01665"></a><span class="lineno"> 1665</span>         <span class="keywordflow">if</span>(class_opt.size()){</div>
-<div class="line"><a name="l01666"></a><span class="lineno"> 1666</span>           <span class="keywordtype">short</span> value=((readValues[0])[j-ulj])[i-uli];</div>
-<div class="line"><a name="l01667"></a><span class="lineno"> 1667</span>           <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iclass=0;iclass<class_opt.size();++iclass){</div>
-<div class="line"><a name="l01668"></a><span class="lineno"> 1668</span>             <span class="keywordflow">if</span>(value==class_opt[iclass])</div>
-<div class="line"><a name="l01669"></a><span class="lineno"> 1669</span>               polyClassValues[iclass]+=1;</div>
-<div class="line"><a name="l01670"></a><span class="lineno"> 1670</span>           }</div>
-<div class="line"><a name="l01671"></a><span class="lineno"> 1671</span>         }</div>
-<div class="line"><a name="l01672"></a><span class="lineno"> 1672</span>         <span class="keywordflow">else</span>{</div>
-<div class="line"><a name="l01673"></a><span class="lineno"> 1673</span>           <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iband=0;iband<nband;++iband){</div>
-<div class="line"><a name="l01674"></a><span class="lineno"> 1674</span>             <span class="keywordtype">int</span> theBand=(band_opt.size()) ? band_opt[iband] : iband;</div>
-<div class="line"><a name="l01675"></a><span class="lineno"> 1675</span>             assert(j-ulj>=0);</div>
-<div class="line"><a name="l01676"></a><span class="lineno"> 1676</span>             assert(j-ulj<readValues[iband].size());</div>
-<div class="line"><a name="l01677"></a><span class="lineno"> 1677</span>             assert(i-uli>=0);</div>
-<div class="line"><a name="l01678"></a><span class="lineno"> 1678</span>             assert(i-uli<((readValues[iband])[j-ulj]).size());</div>
-<div class="line"><a name="l01679"></a><span class="lineno"> 1679</span>             <span class="keywordtype">double</span> value=((readValues[iband])[j-ulj])[i-uli];</div>
-<div class="line"><a name="l01680"></a><span class="lineno"> 1680</span>             <span class="comment">// imgReader.readData(value,GDT_Float64,i,j,theBand);</span></div>
-<div class="line"><a name="l01681"></a><span class="lineno"> 1681</span>             <span class="keywordflow">if</span>(verbose_opt[0]>1)</div>
-<div class="line"><a name="l01682"></a><span class="lineno"> 1682</span>               std::cout << <span class="stringliteral">": "</span> << value << std::endl;</div>
-<div class="line"><a name="l01683"></a><span class="lineno"> 1683</span>             <span class="keywordflow">if</span>(polygon_opt[0]||ruleMap[rule_opt[0]]!=rule::point)</div>
-<div class="line"><a name="l01684"></a><span class="lineno"> 1684</span>               polyValues[iband].push_back(value);</div>
-<div class="line"><a name="l01685"></a><span class="lineno"> 1685</span>             <span class="keywordflow">else</span>{</div>
-<div class="line"><a name="l01686"></a><span class="lineno"> 1686</span>               <span class="keywordflow">if</span>(verbose_opt[0]>1)</div>
-<div class="line"><a name="l01687"></a><span class="lineno"> 1687</span>             std::cout << <span class="stringliteral">"set field "</span> << fieldname_opt[iband] << <span class="stringliteral">" to "</span> << value << std::endl;</div>
-<div class="line"><a name="l01688"></a><span class="lineno"> 1688</span>               <span class="keywordflow">switch</span>( fieldType ){</div>
-<div class="line"><a name="l01689"></a><span class="lineno"> 1689</span>               <span class="keywordflow">case</span> OFTInteger:</div>
-<div class="line"><a name="l01690"></a><span class="lineno"> 1690</span>               <span class="keywordflow">case</span> OFTReal:</div>
-<div class="line"><a name="l01691"></a><span class="lineno"> 1691</span>             writePointFeature->SetField(fieldname_opt[iband].c_str(),value);</div>
-<div class="line"><a name="l01692"></a><span class="lineno"> 1692</span>             <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l01693"></a><span class="lineno"> 1693</span>               <span class="keywordflow">case</span> OFTString:</div>
-<div class="line"><a name="l01694"></a><span class="lineno"> 1694</span>             writePointFeature->SetField(fieldname_opt[iband].c_str(),type2string<double>(value).c_str());</div>
-<div class="line"><a name="l01695"></a><span class="lineno"> 1695</span>             <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l01696"></a><span class="lineno"> 1696</span>               <span class="keywordflow">default</span>:<span class="comment">//not supported</span></div>
-<div class="line"><a name="l01697"></a><span class="lineno"> 1697</span>             assert(0);</div>
-<div class="line"><a name="l01698"></a><span class="lineno"> 1698</span>             <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l01699"></a><span class="lineno"> 1699</span>               }</div>
-<div class="line"><a name="l01700"></a><span class="lineno"> 1700</span>             }<span class="comment">//else</span></div>
-<div class="line"><a name="l01701"></a><span class="lineno"> 1701</span>           }<span class="comment">//iband</span></div>
-<div class="line"><a name="l01702"></a><span class="lineno"> 1702</span>         }<span class="comment">//else (class_opt.size())</span></div>
+<div class="line"><a name="l01624"></a><span class="lineno"> 1624</span>         <span class="keywordtype">int</span> nPointPolygon=0;</div>
+<div class="line"><a name="l01625"></a><span class="lineno"> 1625</span> </div>
+<div class="line"><a name="l01626"></a><span class="lineno"> 1626</span>         <span class="keywordflow">if</span>(polygon_opt[0]){</div>
+<div class="line"><a name="l01627"></a><span class="lineno"> 1627</span>           <span class="keywordflow">if</span>(writeTest)</div>
+<div class="line"><a name="l01628"></a><span class="lineno"> 1628</span>         writePolygonFeature = OGRFeature::CreateFeature(writeTestLayer->GetLayerDefn());</div>
+<div class="line"><a name="l01629"></a><span class="lineno"> 1629</span>           <span class="keywordflow">else</span></div>
+<div class="line"><a name="l01630"></a><span class="lineno"> 1630</span>         writePolygonFeature = OGRFeature::CreateFeature(writeLayer->GetLayerDefn());</div>
+<div class="line"><a name="l01631"></a><span class="lineno"> 1631</span>         }</div>
+<div class="line"><a name="l01632"></a><span class="lineno"> 1632</span>         <span class="keywordflow">else</span> <span class="keywordflow">if</span>(ruleMap[rule_opt[0]]!=rule::point){</div>
+<div class="line"><a name="l01633"></a><span class="lineno"> 1633</span>           <span class="keywordflow">if</span>(writeTest)</div>
+<div class="line"><a name="l01634"></a><span class="lineno"> 1634</span>         writeCentroidFeature = OGRFeature::CreateFeature(writeTestLayer->GetLayerDefn());</div>
+<div class="line"><a name="l01635"></a><span class="lineno"> 1635</span>           <span class="keywordflow">else</span></div>
+<div class="line"><a name="l01636"></a><span class="lineno"> 1636</span>         writeCentroidFeature = OGRFeature::CreateFeature(writeLayer->GetLayerDefn());</div>
+<div class="line"><a name="l01637"></a><span class="lineno"> 1637</span>         }</div>
+<div class="line"><a name="l01638"></a><span class="lineno"> 1638</span>         <span class="comment">// vector<double> polyValues;</span></div>
+<div class="line"><a name="l01639"></a><span class="lineno"> 1639</span>         <a class="code" href="classVector2d.html">Vector2d<double></a> polyValues;</div>
+<div class="line"><a name="l01640"></a><span class="lineno"> 1640</span>         vector<double> polyClassValues;</div>
+<div class="line"><a name="l01641"></a><span class="lineno"> 1641</span>         </div>
+<div class="line"><a name="l01642"></a><span class="lineno"> 1642</span>         <span class="keywordflow">if</span>(class_opt.size()){</div>
+<div class="line"><a name="l01643"></a><span class="lineno"> 1643</span> </div>
+<div class="line"><a name="l01644"></a><span class="lineno"> 1644</span>           polyClassValues.resize(class_opt.size());</div>
+<div class="line"><a name="l01645"></a><span class="lineno"> 1645</span>           <span class="comment">//initialize</span></div>
+<div class="line"><a name="l01646"></a><span class="lineno"> 1646</span>           <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iclass=0;iclass<class_opt.size();++iclass)</div>
+<div class="line"><a name="l01647"></a><span class="lineno"> 1647</span>         polyClassValues[iclass]=0;</div>
+<div class="line"><a name="l01648"></a><span class="lineno"> 1648</span>         }</div>
+<div class="line"><a name="l01649"></a><span class="lineno"> 1649</span>         <span class="keywordflow">else</span></div>
+<div class="line"><a name="l01650"></a><span class="lineno"> 1650</span>           polyValues.resize(nband);</div>
+<div class="line"><a name="l01651"></a><span class="lineno"> 1651</span>         vector< Vector2d<double> > readValues(nband);</div>
+<div class="line"><a name="l01652"></a><span class="lineno"> 1652</span>         <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iband=0;iband<nband;++iband){</div>
+<div class="line"><a name="l01653"></a><span class="lineno"> 1653</span>           <span class="keywordtype">int</span> theBand=(band_opt.size()) ? band_opt[iband] : iband;</div>
+<div class="line"><a name="l01654"></a><span class="lineno"> 1654</span>           imgReader.readDataBlock(readValues[iband],GDT_Float64,uli,lri,ulj,lrj,theBand);</div>
+<div class="line"><a name="l01655"></a><span class="lineno"> 1655</span>         }</div>
+<div class="line"><a name="l01656"></a><span class="lineno"> 1656</span> </div>
+<div class="line"><a name="l01657"></a><span class="lineno"> 1657</span>         OGRPoint thePoint;</div>
+<div class="line"><a name="l01658"></a><span class="lineno"> 1658</span>         <span class="keywordflow">for</span>(<span class="keywordtype">int</span> j=ulj;j<=lrj;++j){</div>
+<div class="line"><a name="l01659"></a><span class="lineno"> 1659</span>           <span class="keywordflow">for</span>(<span class="keywordtype">int</span> i=uli;i<=lri;++i){</div>
+<div class="line"><a name="l01660"></a><span class="lineno"> 1660</span>         <span class="comment">//check if within raster image</span></div>
+<div class="line"><a name="l01661"></a><span class="lineno"> 1661</span>         <span class="keywordflow">if</span>(i<0||i>=imgReader.nrOfCol())</div>
+<div class="line"><a name="l01662"></a><span class="lineno"> 1662</span>           <span class="keywordflow">continue</span>;</div>
+<div class="line"><a name="l01663"></a><span class="lineno"> 1663</span>         <span class="keywordflow">if</span>(j<0||j>=imgReader.nrOfRow())</div>
+<div class="line"><a name="l01664"></a><span class="lineno"> 1664</span>           <span class="keywordflow">continue</span>;</div>
+<div class="line"><a name="l01665"></a><span class="lineno"> 1665</span>         <span class="comment">//check if point is on surface</span></div>
+<div class="line"><a name="l01666"></a><span class="lineno"> 1666</span>         <span class="keywordtype">double</span> theX=0;</div>
+<div class="line"><a name="l01667"></a><span class="lineno"> 1667</span>         <span class="keywordtype">double</span> theY=0;</div>
+<div class="line"><a name="l01668"></a><span class="lineno"> 1668</span>         imgReader.image2geo(i,j,theX,theY);</div>
+<div class="line"><a name="l01669"></a><span class="lineno"> 1669</span>         thePoint.setX(theX);</div>
+<div class="line"><a name="l01670"></a><span class="lineno"> 1670</span>         thePoint.setY(theY);</div>
+<div class="line"><a name="l01671"></a><span class="lineno"> 1671</span>         <span class="keywordflow">if</span>(ruleMap[rule_opt[0]]!=rule::centroid&&!readPolygon.Contains(&thePoint))</div>
+<div class="line"><a name="l01672"></a><span class="lineno"> 1672</span>           <span class="keywordflow">continue</span>;</div>
+<div class="line"><a name="l01673"></a><span class="lineno"> 1673</span> </div>
+<div class="line"><a name="l01674"></a><span class="lineno"> 1674</span>         <span class="keywordtype">bool</span> valid=<span class="keyword">true</span>;</div>
+<div class="line"><a name="l01675"></a><span class="lineno"> 1675</span> </div>
+<div class="line"><a name="l01676"></a><span class="lineno"> 1676</span>         <span class="keywordflow">if</span>(srcnodata_opt.size()){</div>
+<div class="line"><a name="l01677"></a><span class="lineno"> 1677</span>           <span class="keywordflow">for</span>(<span class="keywordtype">int</span> vband=0;vband<bndnodata_opt.size();++vband){</div>
+<div class="line"><a name="l01678"></a><span class="lineno"> 1678</span>             <span class="keywordtype">double</span> value=((readValues[bndnodata_opt[vband]])[j-ulj])[i-uli];</div>
+<div class="line"><a name="l01679"></a><span class="lineno"> 1679</span>             <span class="keywordflow">if</span>(value==srcnodata_opt[vband]){</div>
+<div class="line"><a name="l01680"></a><span class="lineno"> 1680</span>               valid=<span class="keyword">false</span>;</div>
+<div class="line"><a name="l01681"></a><span class="lineno"> 1681</span>               <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l01682"></a><span class="lineno"> 1682</span>             }</div>
+<div class="line"><a name="l01683"></a><span class="lineno"> 1683</span>           }</div>
+<div class="line"><a name="l01684"></a><span class="lineno"> 1684</span>         }</div>
+<div class="line"><a name="l01685"></a><span class="lineno"> 1685</span> </div>
+<div class="line"><a name="l01686"></a><span class="lineno"> 1686</span>         <span class="keywordflow">if</span>(!valid)</div>
+<div class="line"><a name="l01687"></a><span class="lineno"> 1687</span>           <span class="keywordflow">continue</span>;</div>
+<div class="line"><a name="l01688"></a><span class="lineno"> 1688</span>         <span class="keywordflow">else</span></div>
+<div class="line"><a name="l01689"></a><span class="lineno"> 1689</span>           validFeature=<span class="keyword">true</span>;</div>
+<div class="line"><a name="l01690"></a><span class="lineno"> 1690</span> </div>
+<div class="line"><a name="l01691"></a><span class="lineno"> 1691</span>         writeRing.addPoint(&thePoint);<span class="comment">//todo: check if I need to add all interior points to ring or do I need to check if point is on ring first?</span></div>
+<div class="line"><a name="l01692"></a><span class="lineno"> 1692</span>         <span class="comment">// if(writeRing.isPointOnRingBoundary(&thePoint))</span></div>
+<div class="line"><a name="l01693"></a><span class="lineno"> 1693</span>         <span class="comment">//    writeRing.addPoint(&thePoint);</span></div>
+<div class="line"><a name="l01694"></a><span class="lineno"> 1694</span>         <span class="keywordflow">if</span>(verbose_opt[0]>1)</div>
+<div class="line"><a name="l01695"></a><span class="lineno"> 1695</span>           std::cout << <span class="stringliteral">"point is on surface:"</span> << thePoint.getX() << <span class="stringliteral">","</span> << thePoint.getY() << std::endl;</div>
+<div class="line"><a name="l01696"></a><span class="lineno"> 1696</span>         ++nPointPolygon;</div>
+<div class="line"><a name="l01697"></a><span class="lineno"> 1697</span> </div>
+<div class="line"><a name="l01698"></a><span class="lineno"> 1698</span>         <span class="keywordflow">if</span>(polythreshold_opt.size())</div>
+<div class="line"><a name="l01699"></a><span class="lineno"> 1699</span>           <span class="keywordflow">if</span>(nPointPolygon>polythreshold_opt[0])</div>
+<div class="line"><a name="l01700"></a><span class="lineno"> 1700</span>             <span class="keywordflow">continue</span>;</div>
+<div class="line"><a name="l01701"></a><span class="lineno"> 1701</span>         <span class="comment">// throw(nPointPolygon);</span></div>
+<div class="line"><a name="l01702"></a><span class="lineno"> 1702</span>         OGRFeature *writePointFeature;</div>
 <div class="line"><a name="l01703"></a><span class="lineno"> 1703</span>         <span class="keywordflow">if</span>(!polygon_opt[0]){</div>
-<div class="line"><a name="l01704"></a><span class="lineno"> 1704</span>           <span class="keywordflow">if</span>(ruleMap[rule_opt[0]]==rule::point){<span class="comment">//do not create in case of mean or median value (only at centroid)</span></div>
-<div class="line"><a name="l01705"></a><span class="lineno"> 1705</span>             <span class="comment">//write feature</span></div>
-<div class="line"><a name="l01706"></a><span class="lineno"> 1706</span>             <span class="keywordflow">if</span>(verbose_opt[0]>1)</div>
-<div class="line"><a name="l01707"></a><span class="lineno"> 1707</span>               std::cout << <span class="stringliteral">"creating point feature"</span> << std::endl;</div>
-<div class="line"><a name="l01708"></a><span class="lineno"> 1708</span>             <span class="keywordflow">if</span>(writeTest){</div>
-<div class="line"><a name="l01709"></a><span class="lineno"> 1709</span>               <span class="keywordflow">if</span>(writeTestLayer->CreateFeature( writePointFeature ) != OGRERR_NONE ){</div>
-<div class="line"><a name="l01710"></a><span class="lineno"> 1710</span>             std::string errorString=<span class="stringliteral">"Failed to create feature in test ogr vector dataset"</span>;</div>
-<div class="line"><a name="l01711"></a><span class="lineno"> 1711</span>             <span class="keywordflow">throw</span>(errorString);</div>
-<div class="line"><a name="l01712"></a><span class="lineno"> 1712</span>               }</div>
-<div class="line"><a name="l01713"></a><span class="lineno"> 1713</span>             }</div>
-<div class="line"><a name="l01714"></a><span class="lineno"> 1714</span>             <span class="keywordflow">else</span>{</div>
-<div class="line"><a name="l01715"></a><span class="lineno"> 1715</span>               <span class="keywordflow">if</span>(writeLayer->CreateFeature( writePointFeature ) != OGRERR_NONE ){</div>
-<div class="line"><a name="l01716"></a><span class="lineno"> 1716</span>             std::string errorString=<span class="stringliteral">"Failed to create feature in ogr vector dataset"</span>;</div>
-<div class="line"><a name="l01717"></a><span class="lineno"> 1717</span>             <span class="keywordflow">throw</span>(errorString);</div>
-<div class="line"><a name="l01718"></a><span class="lineno"> 1718</span>               }</div>
-<div class="line"><a name="l01719"></a><span class="lineno"> 1719</span>             }</div>
-<div class="line"><a name="l01720"></a><span class="lineno"> 1720</span>             <span class="comment">//destroy feature</span></div>
-<div class="line"><a name="l01721"></a><span class="lineno"> 1721</span>             OGRFeature::DestroyFeature( writePointFeature );</div>
-<div class="line"><a name="l01722"></a><span class="lineno"> 1722</span>             ++ntotalvalid;</div>
-<div class="line"><a name="l01723"></a><span class="lineno"> 1723</span>             <span class="keywordflow">if</span>(verbose_opt[0])</div>
-<div class="line"><a name="l01724"></a><span class="lineno"> 1724</span>               std::cout << <span class="stringliteral">"ntotalvalid(2): "</span> << ntotalvalid << std::endl;</div>
-<div class="line"><a name="l01725"></a><span class="lineno"> 1725</span>           }</div>
-<div class="line"><a name="l01726"></a><span class="lineno"> 1726</span>         }</div>
-<div class="line"><a name="l01727"></a><span class="lineno"> 1727</span>           }</div>
-<div class="line"><a name="l01728"></a><span class="lineno"> 1728</span>         }</div>
-<div class="line"><a name="l01729"></a><span class="lineno"> 1729</span>         <span class="keywordflow">if</span>(polygon_opt[0]||ruleMap[rule_opt[0]]!=rule::point){</div>
-<div class="line"><a name="l01730"></a><span class="lineno"> 1730</span>           <span class="comment">//do not create if no points found within polygon</span></div>
-<div class="line"><a name="l01731"></a><span class="lineno"> 1731</span>           <span class="keywordflow">if</span>(!nPointPolygon){</div>
-<div class="line"><a name="l01732"></a><span class="lineno"> 1732</span>         <span class="keywordflow">if</span>(verbose_opt[0])</div>
-<div class="line"><a name="l01733"></a><span class="lineno"> 1733</span>           cout << <span class="stringliteral">"no points found in polygon, continuing"</span> << endl;</div>
-<div class="line"><a name="l01734"></a><span class="lineno"> 1734</span>         <span class="keywordflow">continue</span>;</div>
-<div class="line"><a name="l01735"></a><span class="lineno"> 1735</span>           }</div>
-<div class="line"><a name="l01736"></a><span class="lineno"> 1736</span>           <span class="comment">//add ring to polygon</span></div>
-<div class="line"><a name="l01737"></a><span class="lineno"> 1737</span>           <span class="keywordflow">if</span>(polygon_opt[0]){</div>
-<div class="line"><a name="l01738"></a><span class="lineno"> 1738</span>         writePolygon.addRing(&writeRing);</div>
-<div class="line"><a name="l01739"></a><span class="lineno"> 1739</span>         writePolygon.closeRings();</div>
-<div class="line"><a name="l01740"></a><span class="lineno"> 1740</span>         <span class="comment">//write geometry of writePolygon</span></div>
-<div class="line"><a name="l01741"></a><span class="lineno"> 1741</span>         <span class="comment">//test</span></div>
-<div class="line"><a name="l01742"></a><span class="lineno"> 1742</span>         <span class="comment">//writePolygonFeature and readFeature are both of type wkbPolygon</span></div>
-<div class="line"><a name="l01743"></a><span class="lineno"> 1743</span>         <span class="comment">// writePolygonFeature->SetGeometry(&writePolygon);</span></div>
-<div class="line"><a name="l01744"></a><span class="lineno"> 1744</span>         <span class="keywordflow">if</span>(writePolygonFeature->SetFrom(readFeature)!= OGRERR_NONE)</div>
-<div class="line"><a name="l01745"></a><span class="lineno"> 1745</span>           cerr << <span class="stringliteral">"writing feature failed"</span> << std::endl;</div>
-<div class="line"><a name="l01746"></a><span class="lineno"> 1746</span>         <span class="keywordflow">if</span>(verbose_opt[0]>1)</div>
-<div class="line"><a name="l01747"></a><span class="lineno"> 1747</span>           std::cout << <span class="stringliteral">"copying new fields write polygon "</span> << std::endl;</div>
-<div class="line"><a name="l01748"></a><span class="lineno"> 1748</span>         <span class="keywordflow">if</span>(verbose_opt[0]>1)</div>
-<div class="line"><a name="l01749"></a><span class="lineno"> 1749</span>           std::cout << <span class="stringliteral">"write feature has "</span> << writePolygonFeature->GetFieldCount() << <span class="stringliteral">" fields"</span> << std::endl;</div>
-<div class="line"><a name="l01750"></a><span class="lineno"> 1750</span>         <span class="comment">//write polygon feature</span></div>
-<div class="line"><a name="l01751"></a><span class="lineno"> 1751</span>           }</div>
-<div class="line"><a name="l01752"></a><span class="lineno"> 1752</span>           <span class="keywordflow">else</span>{<span class="comment">//write value of polygon to centroid point</span></div>
-<div class="line"><a name="l01753"></a><span class="lineno"> 1753</span>         <span class="comment">//create feature</span></div>
-<div class="line"><a name="l01754"></a><span class="lineno"> 1754</span>         <span class="keywordflow">if</span>(verbose_opt[0]>1)</div>
-<div class="line"><a name="l01755"></a><span class="lineno"> 1755</span>           std::cout << <span class="stringliteral">"copying fields from polygons "</span> << std::endl;</div>
-<div class="line"><a name="l01756"></a><span class="lineno"> 1756</span>         <span class="comment">//test</span></div>
-<div class="line"><a name="l01757"></a><span class="lineno"> 1757</span>         <span class="comment">//writeCentroidFeature->SetGeometry(&writeCentroidPoint);</span></div>
-<div class="line"><a name="l01758"></a><span class="lineno"> 1758</span>         <span class="keywordflow">if</span>(writeCentroidFeature->SetFrom(readFeature)!= OGRERR_NONE)</div>
-<div class="line"><a name="l01759"></a><span class="lineno"> 1759</span>           cerr << <span class="stringliteral">"writing feature failed"</span> << std::endl;</div>
-<div class="line"><a name="l01760"></a><span class="lineno"> 1760</span>         <span class="comment">//test</span></div>
-<div class="line"><a name="l01761"></a><span class="lineno"> 1761</span>         writeCentroidFeature->SetGeometry(&writeCentroidPoint);</div>
-<div class="line"><a name="l01762"></a><span class="lineno"> 1762</span>         assert(wkbFlatten(writeCentroidFeature->GetGeometryRef()->getGeometryType()) == wkbPoint );</div>
-<div class="line"><a name="l01763"></a><span class="lineno"> 1763</span>         <span class="comment">// OGRGeometry *updateGeometry;</span></div>
-<div class="line"><a name="l01764"></a><span class="lineno"> 1764</span>         <span class="comment">// updateGeometry = writeCentroidFeature->GetGeometryRef();</span></div>
-<div class="line"><a name="l01765"></a><span class="lineno"> 1765</span>         <span class="comment">// assert(wkbFlatten(updateGeometry->getGeometryType()) == wkbPoint );</span></div>
-<div class="line"><a name="l01766"></a><span class="lineno"> 1766</span>         <span class="keywordflow">if</span>(verbose_opt[0]>1)</div>
-<div class="line"><a name="l01767"></a><span class="lineno"> 1767</span>           std::cout << <span class="stringliteral">"write feature has "</span> << writeCentroidFeature->GetFieldCount() << <span class="stringliteral">" fields"</span> << std::endl;</div>
-<div class="line"><a name="l01768"></a><span class="lineno"> 1768</span>           }</div>
-<div class="line"><a name="l01769"></a><span class="lineno"> 1769</span>           <span class="keywordflow">if</span>(class_opt.empty()){</div>
-<div class="line"><a name="l01770"></a><span class="lineno"> 1770</span>         <span class="keywordflow">if</span>(ruleMap[rule_opt[0]]==rule::point){<span class="comment">//value at centroid of polygon</span></div>
-<div class="line"><a name="l01771"></a><span class="lineno"> 1771</span>           <span class="keywordflow">if</span>(verbose_opt[0])</div>
-<div class="line"><a name="l01772"></a><span class="lineno"> 1772</span>             std::cout << <span class="stringliteral">"number of points in polygon: "</span> << nPointPolygon << std::endl;</div>
-<div class="line"><a name="l01773"></a><span class="lineno"> 1773</span>           <span class="keywordflow">for</span>(<span class="keywordtype">int</span> index=0;index<polyValues.size();++index){</div>
-<div class="line"><a name="l01774"></a><span class="lineno"> 1774</span>             assert(polyValues[index].size()==1);</div>
-<div class="line"><a name="l01775"></a><span class="lineno"> 1775</span>             <span class="keywordtype">double</span> theValue=polyValues[index].back();</div>
-<div class="line"><a name="l01776"></a><span class="lineno"> 1776</span> </div>
-<div class="line"><a name="l01777"></a><span class="lineno"> 1777</span>             <span class="keywordflow">if</span>(verbose_opt[0])</div>
-<div class="line"><a name="l01778"></a><span class="lineno"> 1778</span>               std::cout << <span class="stringliteral">"number of points in polygon: "</span> << nPointPolygon << std::endl;</div>
-<div class="line"><a name="l01779"></a><span class="lineno"> 1779</span>             <span class="keywordtype">int</span> theBand=(band_opt.size()) ? band_opt[index] : index;</div>
-<div class="line"><a name="l01780"></a><span class="lineno"> 1780</span>             <span class="keywordflow">try</span>{</div>
-<div class="line"><a name="l01781"></a><span class="lineno"> 1781</span>               <span class="keywordflow">if</span>(verbose_opt[0]>1)</div>
-<div class="line"><a name="l01782"></a><span class="lineno"> 1782</span>             std::cout << <span class="stringliteral">"set field "</span> << fieldname_opt[index] << <span class="stringliteral">" to "</span> << theValue << std::endl;</div>
-<div class="line"><a name="l01783"></a><span class="lineno"> 1783</span>               <span class="keywordflow">switch</span>( fieldType ){</div>
-<div class="line"><a name="l01784"></a><span class="lineno"> 1784</span>               <span class="keywordflow">case</span> OFTInteger:</div>
-<div class="line"><a name="l01785"></a><span class="lineno"> 1785</span>               <span class="keywordflow">case</span> OFTReal:</div>
-<div class="line"><a name="l01786"></a><span class="lineno"> 1786</span>             <span class="keywordflow">if</span>(polygon_opt[0])</div>
-<div class="line"><a name="l01787"></a><span class="lineno"> 1787</span>               writePolygonFeature->SetField(fieldname_opt[index].c_str(),theValue);</div>
-<div class="line"><a name="l01788"></a><span class="lineno"> 1788</span>             <span class="keywordflow">else</span></div>
-<div class="line"><a name="l01789"></a><span class="lineno"> 1789</span>               writeCentroidFeature->SetField(fieldname_opt[index].c_str(),theValue);</div>
-<div class="line"><a name="l01790"></a><span class="lineno"> 1790</span>             <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l01791"></a><span class="lineno"> 1791</span>               <span class="keywordflow">case</span> OFTString:</div>
-<div class="line"><a name="l01792"></a><span class="lineno"> 1792</span>             <span class="keywordflow">if</span>(polygon_opt[0])</div>
-<div class="line"><a name="l01793"></a><span class="lineno"> 1793</span>               writePolygonFeature->SetField(fieldname_opt[index].c_str(),type2string<double>(theValue).c_str());</div>
-<div class="line"><a name="l01794"></a><span class="lineno"> 1794</span>             <span class="keywordflow">else</span></div>
-<div class="line"><a name="l01795"></a><span class="lineno"> 1795</span>               writeCentroidFeature->SetField(fieldname_opt[index].c_str(),type2string<double>(theValue).c_str());</div>
-<div class="line"><a name="l01796"></a><span class="lineno"> 1796</span>             <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l01797"></a><span class="lineno"> 1797</span>               <span class="keywordflow">default</span>:<span class="comment">//not supported</span></div>
-<div class="line"><a name="l01798"></a><span class="lineno"> 1798</span>             std::string errorString=<span class="stringliteral">"field type not supported"</span>;</div>
-<div class="line"><a name="l01799"></a><span class="lineno"> 1799</span>             <span class="keywordflow">throw</span>(errorString);</div>
-<div class="line"><a name="l01800"></a><span class="lineno"> 1800</span>             <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l01801"></a><span class="lineno"> 1801</span>               }</div>
-<div class="line"><a name="l01802"></a><span class="lineno"> 1802</span>             }</div>
-<div class="line"><a name="l01803"></a><span class="lineno"> 1803</span>             <span class="keywordflow">catch</span>(std::string e){</div>
-<div class="line"><a name="l01804"></a><span class="lineno"> 1804</span>               std::cout << e << std::endl;</div>
-<div class="line"><a name="l01805"></a><span class="lineno"> 1805</span>               exit(1);</div>
-<div class="line"><a name="l01806"></a><span class="lineno"> 1806</span>             }</div>
-<div class="line"><a name="l01807"></a><span class="lineno"> 1807</span>           }</div>
-<div class="line"><a name="l01808"></a><span class="lineno"> 1808</span>         }</div>
-<div class="line"><a name="l01809"></a><span class="lineno"> 1809</span>         <span class="keywordflow">else</span>{<span class="comment">//ruleMap[rule_opt[0]] is not rule::point</span></div>
-<div class="line"><a name="l01810"></a><span class="lineno"> 1810</span>           <span class="keywordtype">double</span> theValue=0;</div>
-<div class="line"><a name="l01811"></a><span class="lineno"> 1811</span>           <span class="keywordflow">for</span>(<span class="keywordtype">int</span> index=0;index<polyValues.size();++index){</div>
-<div class="line"><a name="l01812"></a><span class="lineno"> 1812</span>             <span class="keywordflow">try</span>{</div>
-<div class="line"><a name="l01813"></a><span class="lineno"> 1813</span>               <span class="keywordflow">if</span>(ruleMap[rule_opt[0]]==rule::mean)</div>
-<div class="line"><a name="l01814"></a><span class="lineno"> 1814</span>             theValue=stat.mean(polyValues[index]);</div>
-<div class="line"><a name="l01815"></a><span class="lineno"> 1815</span>               <span class="keywordflow">else</span> <span class="keywordflow">if</span>(ruleMap[rule_opt[0]]==rule::stdev)</div>
-<div class="line"><a name="l01816"></a><span class="lineno"> 1816</span>             theValue=sqrt(stat.var(polyValues[index]));</div>
-<div class="line"><a name="l01817"></a><span class="lineno"> 1817</span>               <span class="keywordflow">else</span> <span class="keywordflow">if</span>(ruleMap[rule_opt[0]]==rule::median)</div>
-<div class="line"><a name="l01818"></a><span class="lineno"> 1818</span>             theValue=stat.median(polyValues[index]);</div>
-<div class="line"><a name="l01819"></a><span class="lineno"> 1819</span>               <span class="keywordflow">else</span> <span class="keywordflow">if</span>(ruleMap[rule_opt[0]]==rule::percentile)</div>
-<div class="line"><a name="l01820"></a><span class="lineno"> 1820</span>             theValue=stat.percentile(polyValues[index],polyValues[index].begin(),polyValues[index].end(),percentile_opt[0]);</div>
-<div class="line"><a name="l01821"></a><span class="lineno"> 1821</span>               <span class="keywordflow">else</span> <span class="keywordflow">if</span>(ruleMap[rule_opt[0]]==rule::sum)</div>
-<div class="line"><a name="l01822"></a><span class="lineno"> 1822</span>             theValue=stat.sum(polyValues[index]);</div>
-<div class="line"><a name="l01823"></a><span class="lineno"> 1823</span>               <span class="keywordflow">else</span> <span class="keywordflow">if</span>(ruleMap[rule_opt[0]]==rule::max)</div>
-<div class="line"><a name="l01824"></a><span class="lineno"> 1824</span>             theValue=stat.mymax(polyValues[index]);</div>
-<div class="line"><a name="l01825"></a><span class="lineno"> 1825</span>               <span class="keywordflow">else</span> <span class="keywordflow">if</span>(ruleMap[rule_opt[0]]==rule::min)</div>
-<div class="line"><a name="l01826"></a><span class="lineno"> 1826</span>             theValue=stat.mymin(polyValues[index]);</div>
-<div class="line"><a name="l01827"></a><span class="lineno"> 1827</span>               <span class="keywordflow">else</span> <span class="keywordflow">if</span>(ruleMap[rule_opt[0]]==rule::centroid){</div>
-<div class="line"><a name="l01828"></a><span class="lineno"> 1828</span>             <span class="keywordflow">if</span>(verbose_opt[0])</div>
-<div class="line"><a name="l01829"></a><span class="lineno"> 1829</span>               std::cout << <span class="stringliteral">"number of points in polygon: "</span> << nPointPolygon << std::endl;</div>
-<div class="line"><a name="l01830"></a><span class="lineno"> 1830</span>             assert(nPointPolygon<=1);</div>
-<div class="line"><a name="l01831"></a><span class="lineno"> 1831</span>             assert(nPointPolygon==polyValues[index].size());</div>
-<div class="line"><a name="l01832"></a><span class="lineno"> 1832</span>             theValue=polyValues[index].back();</div>
-<div class="line"><a name="l01833"></a><span class="lineno"> 1833</span>               }</div>
-<div class="line"><a name="l01834"></a><span class="lineno"> 1834</span>               <span class="keywordflow">else</span>{</div>
-<div class="line"><a name="l01835"></a><span class="lineno"> 1835</span>             std::string errorString=<span class="stringliteral">"rule not supported"</span>;</div>
-<div class="line"><a name="l01836"></a><span class="lineno"> 1836</span>             <span class="keywordflow">throw</span>(errorString);</div>
-<div class="line"><a name="l01837"></a><span class="lineno"> 1837</span>               }</div>
-<div class="line"><a name="l01838"></a><span class="lineno"> 1838</span>               <span class="keywordflow">if</span>(verbose_opt[0]>1)</div>
-<div class="line"><a name="l01839"></a><span class="lineno"> 1839</span>             std::cout << <span class="stringliteral">"set field "</span> << fieldname_opt[index] << <span class="stringliteral">" to "</span> << theValue << std::endl;</div>
-<div class="line"><a name="l01840"></a><span class="lineno"> 1840</span>               <span class="keywordflow">switch</span>( fieldType ){</div>
-<div class="line"><a name="l01841"></a><span class="lineno"> 1841</span>               <span class="keywordflow">case</span> OFTInteger:</div>
-<div class="line"><a name="l01842"></a><span class="lineno"> 1842</span>               <span class="keywordflow">case</span> OFTReal:</div>
-<div class="line"><a name="l01843"></a><span class="lineno"> 1843</span>             <span class="keywordflow">if</span>(polygon_opt[0])</div>
-<div class="line"><a name="l01844"></a><span class="lineno"> 1844</span>               writePolygonFeature->SetField(fieldname_opt[index].c_str(),theValue);</div>
-<div class="line"><a name="l01845"></a><span class="lineno"> 1845</span>             <span class="keywordflow">else</span></div>
-<div class="line"><a name="l01846"></a><span class="lineno"> 1846</span>               writeCentroidFeature->SetField(fieldname_opt[index].c_str(),theValue);</div>
-<div class="line"><a name="l01847"></a><span class="lineno"> 1847</span>             <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l01848"></a><span class="lineno"> 1848</span>               <span class="keywordflow">case</span> OFTString:</div>
-<div class="line"><a name="l01849"></a><span class="lineno"> 1849</span>             <span class="keywordflow">if</span>(polygon_opt[0])</div>
-<div class="line"><a name="l01850"></a><span class="lineno"> 1850</span>               writePolygonFeature->SetField(fieldname_opt[index].c_str(),type2string<double>(theValue).c_str());</div>
-<div class="line"><a name="l01851"></a><span class="lineno"> 1851</span>             <span class="keywordflow">else</span></div>
-<div class="line"><a name="l01852"></a><span class="lineno"> 1852</span>               writeCentroidFeature->SetField(fieldname_opt[index].c_str(),type2string<double>(theValue).c_str());</div>
-<div class="line"><a name="l01853"></a><span class="lineno"> 1853</span>             <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l01854"></a><span class="lineno"> 1854</span>               <span class="keywordflow">default</span>:</div>
-<div class="line"><a name="l01855"></a><span class="lineno"> 1855</span>             std::string errorString=<span class="stringliteral">"field type not supported"</span>;</div>
-<div class="line"><a name="l01856"></a><span class="lineno"> 1856</span>             <span class="keywordflow">throw</span>(errorString);</div>
-<div class="line"><a name="l01857"></a><span class="lineno"> 1857</span>             <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l01858"></a><span class="lineno"> 1858</span>               }</div>
-<div class="line"><a name="l01859"></a><span class="lineno"> 1859</span>             }</div>
-<div class="line"><a name="l01860"></a><span class="lineno"> 1860</span>             <span class="keywordflow">catch</span>(std::string e){</div>
-<div class="line"><a name="l01861"></a><span class="lineno"> 1861</span>               std::cout << e << std::endl;</div>
-<div class="line"><a name="l01862"></a><span class="lineno"> 1862</span>               exit(1);</div>
-<div class="line"><a name="l01863"></a><span class="lineno"> 1863</span>             }</div>
-<div class="line"><a name="l01864"></a><span class="lineno"> 1864</span>           }</div>
-<div class="line"><a name="l01865"></a><span class="lineno"> 1865</span>         }</div>
-<div class="line"><a name="l01866"></a><span class="lineno"> 1866</span>           }</div>
-<div class="line"><a name="l01867"></a><span class="lineno"> 1867</span>           <span class="keywordflow">else</span>{<span class="comment">//class_opt is set</span></div>
-<div class="line"><a name="l01868"></a><span class="lineno"> 1868</span>         <span class="keywordflow">if</span>(ruleMap[rule_opt[0]]==rule::proportion){</div>
-<div class="line"><a name="l01869"></a><span class="lineno"> 1869</span>           <span class="keywordflow">if</span>(verbose_opt[0])</div>
-<div class="line"><a name="l01870"></a><span class="lineno"> 1870</span>             std::cout << <span class="stringliteral">"number of points in polygon: "</span> << nPointPolygon << std::endl;</div>
-<div class="line"><a name="l01871"></a><span class="lineno"> 1871</span>           stat.normalize_pct(polyClassValues);</div>
-<div class="line"><a name="l01872"></a><span class="lineno"> 1872</span>           <span class="keywordflow">for</span>(<span class="keywordtype">int</span> index=0;index<polyClassValues.size();++index){</div>
-<div class="line"><a name="l01873"></a><span class="lineno"> 1873</span>             <span class="keywordtype">double</span> theValue=polyClassValues[index];</div>
-<div class="line"><a name="l01874"></a><span class="lineno"> 1874</span>             ostringstream fs;</div>
-<div class="line"><a name="l01875"></a><span class="lineno"> 1875</span>             fs << class_opt[index];</div>
-<div class="line"><a name="l01876"></a><span class="lineno"> 1876</span>             <span class="keywordflow">if</span>(polygon_opt[0])</div>
-<div class="line"><a name="l01877"></a><span class="lineno"> 1877</span>               writePolygonFeature->SetField(fs.str().c_str(),<span class="keyword">static_cast<</span><span class="keywordtype">int</span><span class="keyword">></span>(theValue));</div>
-<div class="line"><a name="l01878"></a><span class="lineno"> 1878</span>             <span class="keywordflow">else</span></div>
-<div class="line"><a name="l01879"></a><span class="lineno"> 1879</span>               writeCentroidFeature->SetField(fs.str().c_str(),<span class="keyword">static_cast<</span><span class="keywordtype">int</span><span class="keyword">></span>(theValue));</div>
-<div class="line"><a name="l01880"></a><span class="lineno"> 1880</span>           }</div>
-<div class="line"><a name="l01881"></a><span class="lineno"> 1881</span>         }</div>
-<div class="line"><a name="l01882"></a><span class="lineno"> 1882</span>         <span class="keywordflow">else</span> <span class="keywordflow">if</span>(ruleMap[rule_opt[0]]==rule::custom){</div>
-<div class="line"><a name="l01883"></a><span class="lineno"> 1883</span>           assert(polygon_opt[0]);<span class="comment">//not implemented for points</span></div>
-<div class="line"><a name="l01884"></a><span class="lineno"> 1884</span>           <span class="keywordflow">if</span>(verbose_opt[0])</div>
-<div class="line"><a name="l01885"></a><span class="lineno"> 1885</span>             std::cout << <span class="stringliteral">"number of points in polygon: "</span> << nPointPolygon << std::endl;</div>
-<div class="line"><a name="l01886"></a><span class="lineno"> 1886</span>           stat.normalize_pct(polyClassValues);</div>
-<div class="line"><a name="l01887"></a><span class="lineno"> 1887</span>           assert(polyClassValues.size()==2);<span class="comment">//11:broadleaved, 12:coniferous</span></div>
-<div class="line"><a name="l01888"></a><span class="lineno"> 1888</span>           <span class="keywordflow">if</span>(polyClassValues[0]>=75)<span class="comment">//broadleaved</span></div>
-<div class="line"><a name="l01889"></a><span class="lineno"> 1889</span>             writePolygonFeature->SetField(label_opt[0].c_str(),static_cast<int>(11));</div>
-<div class="line"><a name="l01890"></a><span class="lineno"> 1890</span>           <span class="keywordflow">else</span> <span class="keywordflow">if</span>(polyClassValues[1]>=75)<span class="comment">//coniferous</span></div>
-<div class="line"><a name="l01891"></a><span class="lineno"> 1891</span>             writePolygonFeature->SetField(label_opt[0].c_str(),static_cast<int>(12));</div>
-<div class="line"><a name="l01892"></a><span class="lineno"> 1892</span>           <span class="keywordflow">else</span> <span class="keywordflow">if</span>(polyClassValues[0]>25&&polyClassValues[1]>25)<span class="comment">//mixed</span></div>
-<div class="line"><a name="l01893"></a><span class="lineno"> 1893</span>             writePolygonFeature->SetField(label_opt[0].c_str(),static_cast<int>(13));</div>
-<div class="line"><a name="l01894"></a><span class="lineno"> 1894</span>           <span class="keywordflow">else</span>{</div>
-<div class="line"><a name="l01895"></a><span class="lineno"> 1895</span>             <span class="keywordflow">if</span>(verbose_opt[0]){</div>
-<div class="line"><a name="l01896"></a><span class="lineno"> 1896</span>               std::cout << <span class="stringliteral">"No valid value in polyClassValues..."</span> << std::endl;</div>
-<div class="line"><a name="l01897"></a><span class="lineno"> 1897</span>               <span class="keywordflow">for</span>(<span class="keywordtype">int</span> index=0;index<polyClassValues.size();++index){</div>
-<div class="line"><a name="l01898"></a><span class="lineno"> 1898</span>             <span class="keywordtype">double</span> theValue=polyClassValues[index];</div>
-<div class="line"><a name="l01899"></a><span class="lineno"> 1899</span>             std::cout << theValue << <span class="stringliteral">" "</span>;</div>
-<div class="line"><a name="l01900"></a><span class="lineno"> 1900</span>               }</div>
-<div class="line"><a name="l01901"></a><span class="lineno"> 1901</span>               std::cout << std::endl;</div>
-<div class="line"><a name="l01902"></a><span class="lineno"> 1902</span>             }</div>
-<div class="line"><a name="l01903"></a><span class="lineno"> 1903</span>             writePolygonFeature->SetField(label_opt[0].c_str(),static_cast<int>(20));</div>
-<div class="line"><a name="l01904"></a><span class="lineno"> 1904</span>           }</div>
-<div class="line"><a name="l01905"></a><span class="lineno"> 1905</span>         }</div>
-<div class="line"><a name="l01906"></a><span class="lineno"> 1906</span>         <span class="keywordflow">else</span> <span class="keywordflow">if</span>(ruleMap[rule_opt[0]]==rule::mode){</div>
-<div class="line"><a name="l01907"></a><span class="lineno"> 1907</span>           <span class="comment">//maximum votes in polygon</span></div>
-<div class="line"><a name="l01908"></a><span class="lineno"> 1908</span>           <span class="keywordflow">if</span>(verbose_opt[0])</div>
-<div class="line"><a name="l01909"></a><span class="lineno"> 1909</span>             std::cout << <span class="stringliteral">"number of points in polygon: "</span> << nPointPolygon << std::endl;</div>
-<div class="line"><a name="l01910"></a><span class="lineno"> 1910</span>           <span class="comment">//search for class with maximum votes</span></div>
-<div class="line"><a name="l01911"></a><span class="lineno"> 1911</span>           <span class="keywordtype">int</span> maxClass=stat.mymin(class_opt);</div>
-<div class="line"><a name="l01912"></a><span class="lineno"> 1912</span>           vector<double>::iterator maxit;</div>
-<div class="line"><a name="l01913"></a><span class="lineno"> 1913</span>           maxit=stat.mymax(polyClassValues,polyClassValues.begin(),polyClassValues.end());</div>
-<div class="line"><a name="l01914"></a><span class="lineno"> 1914</span>           <span class="keywordtype">int</span> maxIndex=distance(polyClassValues.begin(),maxit);</div>
-<div class="line"><a name="l01915"></a><span class="lineno"> 1915</span>           maxClass=class_opt[maxIndex];</div>
-<div class="line"><a name="l01916"></a><span class="lineno"> 1916</span>           <span class="keywordflow">if</span>(verbose_opt[0]>0)</div>
-<div class="line"><a name="l01917"></a><span class="lineno"> 1917</span>             std::cout << <span class="stringliteral">"maxClass: "</span> << maxClass << std::endl;</div>
-<div class="line"><a name="l01918"></a><span class="lineno"> 1918</span>           <span class="keywordflow">if</span>(polygon_opt[0])</div>
-<div class="line"><a name="l01919"></a><span class="lineno"> 1919</span>             writePolygonFeature->SetField(label_opt[0].c_str(),maxClass);</div>
-<div class="line"><a name="l01920"></a><span class="lineno"> 1920</span>           <span class="keywordflow">else</span></div>
-<div class="line"><a name="l01921"></a><span class="lineno"> 1921</span>             writeCentroidFeature->SetField(label_opt[0].c_str(),maxClass);</div>
-<div class="line"><a name="l01922"></a><span class="lineno"> 1922</span>         }</div>
-<div class="line"><a name="l01923"></a><span class="lineno"> 1923</span>           }</div>
-<div class="line"><a name="l01924"></a><span class="lineno"> 1924</span>           <span class="keywordflow">if</span>(polygon_opt[0]){</div>
-<div class="line"><a name="l01925"></a><span class="lineno"> 1925</span>         <span class="keywordflow">if</span>(verbose_opt[0]>1)</div>
-<div class="line"><a name="l01926"></a><span class="lineno"> 1926</span>           std::cout << <span class="stringliteral">"creating polygon feature"</span> << std::endl;</div>
-<div class="line"><a name="l01927"></a><span class="lineno"> 1927</span>         <span class="keywordflow">if</span>(writeTest){</div>
-<div class="line"><a name="l01928"></a><span class="lineno"> 1928</span>           <span class="keywordflow">if</span>(writeTestLayer->CreateFeature( writePolygonFeature ) != OGRERR_NONE ){</div>
-<div class="line"><a name="l01929"></a><span class="lineno"> 1929</span>             std::string errorString=<span class="stringliteral">"Failed to create polygon feature in ogr vector dataset"</span>;</div>
-<div class="line"><a name="l01930"></a><span class="lineno"> 1930</span>             <span class="keywordflow">throw</span>(errorString);</div>
-<div class="line"><a name="l01931"></a><span class="lineno"> 1931</span>           }</div>
-<div class="line"><a name="l01932"></a><span class="lineno"> 1932</span>         }</div>
-<div class="line"><a name="l01933"></a><span class="lineno"> 1933</span>         <span class="keywordflow">else</span>{</div>
-<div class="line"><a name="l01934"></a><span class="lineno"> 1934</span>           <span class="keywordflow">if</span>(writeLayer->CreateFeature( writePolygonFeature ) != OGRERR_NONE ){</div>
-<div class="line"><a name="l01935"></a><span class="lineno"> 1935</span>             std::string errorString=<span class="stringliteral">"Failed to create polygon feature in ogr vector dataset"</span>;</div>
-<div class="line"><a name="l01936"></a><span class="lineno"> 1936</span>             <span class="keywordflow">throw</span>(errorString);</div>
-<div class="line"><a name="l01937"></a><span class="lineno"> 1937</span>           }</div>
-<div class="line"><a name="l01938"></a><span class="lineno"> 1938</span>         }</div>
-<div class="line"><a name="l01939"></a><span class="lineno"> 1939</span>         OGRFeature::DestroyFeature( writePolygonFeature );</div>
-<div class="line"><a name="l01940"></a><span class="lineno"> 1940</span>         ++ntotalvalid;</div>
-<div class="line"><a name="l01941"></a><span class="lineno"> 1941</span>         <span class="keywordflow">if</span>(verbose_opt[0])</div>
-<div class="line"><a name="l01942"></a><span class="lineno"> 1942</span>           std::cout << <span class="stringliteral">"ntotalvalid(1): "</span> << ntotalvalid << std::endl;</div>
-<div class="line"><a name="l01943"></a><span class="lineno"> 1943</span>           }</div>
+<div class="line"><a name="l01704"></a><span class="lineno"> 1704</span>           <span class="comment">//create feature</span></div>
+<div class="line"><a name="l01705"></a><span class="lineno"> 1705</span>           <span class="keywordflow">if</span>(ruleMap[rule_opt[0]]==rule::point){<span class="comment">//do not create in case of mean, stdev, median, sum or centroid (only create point at centroid)</span></div>
+<div class="line"><a name="l01706"></a><span class="lineno"> 1706</span>             <span class="keywordflow">if</span>(writeTest)</div>
+<div class="line"><a name="l01707"></a><span class="lineno"> 1707</span>               writePointFeature = OGRFeature::CreateFeature(writeTestLayer->GetLayerDefn());</div>
+<div class="line"><a name="l01708"></a><span class="lineno"> 1708</span>             <span class="keywordflow">else</span></div>
+<div class="line"><a name="l01709"></a><span class="lineno"> 1709</span>               writePointFeature = OGRFeature::CreateFeature(writeLayer->GetLayerDefn());</div>
+<div class="line"><a name="l01710"></a><span class="lineno"> 1710</span>             <span class="keywordflow">if</span>(verbose_opt[0]>1)</div>
+<div class="line"><a name="l01711"></a><span class="lineno"> 1711</span>               std::cout << <span class="stringliteral">"copying fields from polygons "</span> << std::endl;</div>
+<div class="line"><a name="l01712"></a><span class="lineno"> 1712</span>             <span class="keywordflow">if</span>(writePointFeature->SetFrom(readFeature)!= OGRERR_NONE)</div>
+<div class="line"><a name="l01713"></a><span class="lineno"> 1713</span>               cerr << <span class="stringliteral">"writing feature failed"</span> << std::endl;</div>
+<div class="line"><a name="l01714"></a><span class="lineno"> 1714</span>             <span class="keywordflow">if</span>(verbose_opt[0]>1)</div>
+<div class="line"><a name="l01715"></a><span class="lineno"> 1715</span>               std::cout << <span class="stringliteral">"set geometry as point "</span> << std::endl;</div>
+<div class="line"><a name="l01716"></a><span class="lineno"> 1716</span>             <span class="comment">//test</span></div>
+<div class="line"><a name="l01717"></a><span class="lineno"> 1717</span>             writePointFeature->SetGeometry(&thePoint);</div>
+<div class="line"><a name="l01718"></a><span class="lineno"> 1718</span>             assert(wkbFlatten(writePointFeature->GetGeometryRef()->getGeometryType()) == wkbPoint);</div>
+<div class="line"><a name="l01719"></a><span class="lineno"> 1719</span>             <span class="comment">// OGRGeometry *updateGeometry;</span></div>
+<div class="line"><a name="l01720"></a><span class="lineno"> 1720</span>             <span class="comment">// updateGeometry = writePointFeature->GetGeometryRef();</span></div>
+<div class="line"><a name="l01721"></a><span class="lineno"> 1721</span>             <span class="comment">// OGRPoint *poPoint = (OGRPoint *) updateGeometry;</span></div>
+<div class="line"><a name="l01722"></a><span class="lineno"> 1722</span>             <span class="keywordflow">if</span>(verbose_opt[0]>1)</div>
+<div class="line"><a name="l01723"></a><span class="lineno"> 1723</span>               std::cout << <span class="stringliteral">"write feature has "</span> << writePointFeature->GetFieldCount() << <span class="stringliteral">" fields"</span> << std::endl;</div>
+<div class="line"><a name="l01724"></a><span class="lineno"> 1724</span>           }</div>
+<div class="line"><a name="l01725"></a><span class="lineno"> 1725</span>         }</div>
+<div class="line"><a name="l01726"></a><span class="lineno"> 1726</span>         <span class="keywordflow">if</span>(class_opt.size()){</div>
+<div class="line"><a name="l01727"></a><span class="lineno"> 1727</span>           <span class="keywordtype">short</span> value=((readValues[0])[j-ulj])[i-uli];</div>
+<div class="line"><a name="l01728"></a><span class="lineno"> 1728</span>           <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iclass=0;iclass<class_opt.size();++iclass){</div>
+<div class="line"><a name="l01729"></a><span class="lineno"> 1729</span>             <span class="keywordflow">if</span>(value==class_opt[iclass])</div>
+<div class="line"><a name="l01730"></a><span class="lineno"> 1730</span>               polyClassValues[iclass]+=1;</div>
+<div class="line"><a name="l01731"></a><span class="lineno"> 1731</span>           }</div>
+<div class="line"><a name="l01732"></a><span class="lineno"> 1732</span>         }</div>
+<div class="line"><a name="l01733"></a><span class="lineno"> 1733</span>         <span class="keywordflow">else</span>{</div>
+<div class="line"><a name="l01734"></a><span class="lineno"> 1734</span>           <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iband=0;iband<nband;++iband){</div>
+<div class="line"><a name="l01735"></a><span class="lineno"> 1735</span>             <span class="keywordtype">double</span> value=((readValues[iband])[j-ulj])[i-uli];</div>
+<div class="line"><a name="l01736"></a><span class="lineno"> 1736</span>             <span class="keywordflow">if</span>(verbose_opt[0]>1)</div>
+<div class="line"><a name="l01737"></a><span class="lineno"> 1737</span>               std::cout << <span class="stringliteral">": "</span> << value << std::endl;</div>
+<div class="line"><a name="l01738"></a><span class="lineno"> 1738</span>             <span class="keywordflow">if</span>(polygon_opt[0]||ruleMap[rule_opt[0]]!=rule::point)</div>
+<div class="line"><a name="l01739"></a><span class="lineno"> 1739</span>               polyValues[iband].push_back(value);</div>
+<div class="line"><a name="l01740"></a><span class="lineno"> 1740</span>             <span class="keywordflow">else</span>{</div>
+<div class="line"><a name="l01741"></a><span class="lineno"> 1741</span>               <span class="keywordflow">if</span>(verbose_opt[0]>1)</div>
+<div class="line"><a name="l01742"></a><span class="lineno"> 1742</span>             std::cout << <span class="stringliteral">"set field "</span> << fieldname_opt[iband] << <span class="stringliteral">" to "</span> << value << std::endl;</div>
+<div class="line"><a name="l01743"></a><span class="lineno"> 1743</span>               <span class="keywordflow">switch</span>( fieldType ){</div>
+<div class="line"><a name="l01744"></a><span class="lineno"> 1744</span>               <span class="keywordflow">case</span> OFTInteger:</div>
+<div class="line"><a name="l01745"></a><span class="lineno"> 1745</span>               <span class="keywordflow">case</span> OFTReal:</div>
+<div class="line"><a name="l01746"></a><span class="lineno"> 1746</span>             writePointFeature->SetField(fieldname_opt[iband].c_str(),value);</div>
+<div class="line"><a name="l01747"></a><span class="lineno"> 1747</span>             <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l01748"></a><span class="lineno"> 1748</span>               <span class="keywordflow">case</span> OFTString:</div>
+<div class="line"><a name="l01749"></a><span class="lineno"> 1749</span>             writePointFeature->SetField(fieldname_opt[iband].c_str(),type2string<double>(value).c_str());</div>
+<div class="line"><a name="l01750"></a><span class="lineno"> 1750</span>             <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l01751"></a><span class="lineno"> 1751</span>               <span class="keywordflow">default</span>:<span class="comment">//not supported</span></div>
+<div class="line"><a name="l01752"></a><span class="lineno"> 1752</span>             assert(0);</div>
+<div class="line"><a name="l01753"></a><span class="lineno"> 1753</span>             <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l01754"></a><span class="lineno"> 1754</span>               }</div>
+<div class="line"><a name="l01755"></a><span class="lineno"> 1755</span>             }<span class="comment">//else</span></div>
+<div class="line"><a name="l01756"></a><span class="lineno"> 1756</span>           }<span class="comment">//iband</span></div>
+<div class="line"><a name="l01757"></a><span class="lineno"> 1757</span>         }<span class="comment">//else (class_opt.size())</span></div>
+<div class="line"><a name="l01758"></a><span class="lineno"> 1758</span>         <span class="keywordflow">if</span>(!polygon_opt[0]){</div>
+<div class="line"><a name="l01759"></a><span class="lineno"> 1759</span>           <span class="keywordflow">if</span>(ruleMap[rule_opt[0]]==rule::point){<span class="comment">//do not create in case of mean or median value (only at centroid)</span></div>
+<div class="line"><a name="l01760"></a><span class="lineno"> 1760</span>             <span class="comment">//write feature</span></div>
+<div class="line"><a name="l01761"></a><span class="lineno"> 1761</span>             <span class="keywordflow">if</span>(verbose_opt[0]>1)</div>
+<div class="line"><a name="l01762"></a><span class="lineno"> 1762</span>               std::cout << <span class="stringliteral">"creating point feature"</span> << std::endl;</div>
+<div class="line"><a name="l01763"></a><span class="lineno"> 1763</span>             <span class="keywordflow">if</span>(writeTest){</div>
+<div class="line"><a name="l01764"></a><span class="lineno"> 1764</span>               <span class="keywordflow">if</span>(writeTestLayer->CreateFeature( writePointFeature ) != OGRERR_NONE ){</div>
+<div class="line"><a name="l01765"></a><span class="lineno"> 1765</span>             std::string errorString=<span class="stringliteral">"Failed to create feature in test ogr vector dataset"</span>;</div>
+<div class="line"><a name="l01766"></a><span class="lineno"> 1766</span>             <span class="keywordflow">throw</span>(errorString);</div>
+<div class="line"><a name="l01767"></a><span class="lineno"> 1767</span>               }</div>
+<div class="line"><a name="l01768"></a><span class="lineno"> 1768</span>             }</div>
+<div class="line"><a name="l01769"></a><span class="lineno"> 1769</span>             <span class="keywordflow">else</span>{</div>
+<div class="line"><a name="l01770"></a><span class="lineno"> 1770</span>               <span class="keywordflow">if</span>(writeLayer->CreateFeature( writePointFeature ) != OGRERR_NONE ){</div>
+<div class="line"><a name="l01771"></a><span class="lineno"> 1771</span>             std::string errorString=<span class="stringliteral">"Failed to create feature in ogr vector dataset"</span>;</div>
+<div class="line"><a name="l01772"></a><span class="lineno"> 1772</span>             <span class="keywordflow">throw</span>(errorString);</div>
+<div class="line"><a name="l01773"></a><span class="lineno"> 1773</span>               }</div>
+<div class="line"><a name="l01774"></a><span class="lineno"> 1774</span>             }</div>
+<div class="line"><a name="l01775"></a><span class="lineno"> 1775</span>             <span class="comment">//destroy feature</span></div>
+<div class="line"><a name="l01776"></a><span class="lineno"> 1776</span>             OGRFeature::DestroyFeature( writePointFeature );</div>
+<div class="line"><a name="l01777"></a><span class="lineno"> 1777</span>             ++ntotalvalid;</div>
+<div class="line"><a name="l01778"></a><span class="lineno"> 1778</span>             <span class="keywordflow">if</span>(verbose_opt[0])</div>
+<div class="line"><a name="l01779"></a><span class="lineno"> 1779</span>               std::cout << <span class="stringliteral">"ntotalvalid(2): "</span> << ntotalvalid << std::endl;</div>
+<div class="line"><a name="l01780"></a><span class="lineno"> 1780</span>           }</div>
+<div class="line"><a name="l01781"></a><span class="lineno"> 1781</span>         }</div>
+<div class="line"><a name="l01782"></a><span class="lineno"> 1782</span>           }</div>
+<div class="line"><a name="l01783"></a><span class="lineno"> 1783</span>         }</div>
+<div class="line"><a name="l01784"></a><span class="lineno"> 1784</span>         <span class="keywordflow">if</span>(polygon_opt[0]||ruleMap[rule_opt[0]]!=rule::point){</div>
+<div class="line"><a name="l01785"></a><span class="lineno"> 1785</span>           <span class="comment">//do not create if no points found within polygon</span></div>
+<div class="line"><a name="l01786"></a><span class="lineno"> 1786</span>           <span class="keywordflow">if</span>(!nPointPolygon){</div>
+<div class="line"><a name="l01787"></a><span class="lineno"> 1787</span>         <span class="keywordflow">if</span>(verbose_opt[0])</div>
+<div class="line"><a name="l01788"></a><span class="lineno"> 1788</span>           cout << <span class="stringliteral">"no points found in polygon, continuing"</span> << endl;</div>
+<div class="line"><a name="l01789"></a><span class="lineno"> 1789</span>         <span class="keywordflow">continue</span>;</div>
+<div class="line"><a name="l01790"></a><span class="lineno"> 1790</span>           }</div>
+<div class="line"><a name="l01791"></a><span class="lineno"> 1791</span>           <span class="comment">//add ring to polygon</span></div>
+<div class="line"><a name="l01792"></a><span class="lineno"> 1792</span>           <span class="keywordflow">if</span>(polygon_opt[0]){</div>
+<div class="line"><a name="l01793"></a><span class="lineno"> 1793</span>         writePolygon.addRing(&writeRing);</div>
+<div class="line"><a name="l01794"></a><span class="lineno"> 1794</span>         writePolygon.closeRings();</div>
+<div class="line"><a name="l01795"></a><span class="lineno"> 1795</span>         <span class="comment">//write geometry of writePolygon</span></div>
+<div class="line"><a name="l01796"></a><span class="lineno"> 1796</span>         <span class="comment">//test</span></div>
+<div class="line"><a name="l01797"></a><span class="lineno"> 1797</span>         <span class="comment">//writePolygonFeature and readFeature are both of type wkbPolygon</span></div>
+<div class="line"><a name="l01798"></a><span class="lineno"> 1798</span>         <span class="comment">// writePolygonFeature->SetGeometry(&writePolygon);</span></div>
+<div class="line"><a name="l01799"></a><span class="lineno"> 1799</span>         <span class="keywordflow">if</span>(writePolygonFeature->SetFrom(readFeature)!= OGRERR_NONE)</div>
+<div class="line"><a name="l01800"></a><span class="lineno"> 1800</span>           cerr << <span class="stringliteral">"writing feature failed"</span> << std::endl;</div>
+<div class="line"><a name="l01801"></a><span class="lineno"> 1801</span>         <span class="keywordflow">if</span>(verbose_opt[0]>1)</div>
+<div class="line"><a name="l01802"></a><span class="lineno"> 1802</span>           std::cout << <span class="stringliteral">"copying new fields write polygon "</span> << std::endl;</div>
+<div class="line"><a name="l01803"></a><span class="lineno"> 1803</span>         <span class="keywordflow">if</span>(verbose_opt[0]>1)</div>
+<div class="line"><a name="l01804"></a><span class="lineno"> 1804</span>           std::cout << <span class="stringliteral">"write feature has "</span> << writePolygonFeature->GetFieldCount() << <span class="stringliteral">" fields"</span> << std::endl;</div>
+<div class="line"><a name="l01805"></a><span class="lineno"> 1805</span>         <span class="comment">//write polygon feature</span></div>
+<div class="line"><a name="l01806"></a><span class="lineno"> 1806</span>           }</div>
+<div class="line"><a name="l01807"></a><span class="lineno"> 1807</span>           <span class="keywordflow">else</span>{<span class="comment">//write value of polygon to centroid point</span></div>
+<div class="line"><a name="l01808"></a><span class="lineno"> 1808</span>         <span class="comment">//create feature</span></div>
+<div class="line"><a name="l01809"></a><span class="lineno"> 1809</span>         <span class="keywordflow">if</span>(verbose_opt[0]>1)</div>
+<div class="line"><a name="l01810"></a><span class="lineno"> 1810</span>           std::cout << <span class="stringliteral">"copying fields from polygons "</span> << std::endl;</div>
+<div class="line"><a name="l01811"></a><span class="lineno"> 1811</span>         <span class="keywordflow">if</span>(writeCentroidFeature->SetFrom(readFeature)!= OGRERR_NONE)</div>
+<div class="line"><a name="l01812"></a><span class="lineno"> 1812</span>           cerr << <span class="stringliteral">"writing feature failed"</span> << std::endl;</div>
+<div class="line"><a name="l01813"></a><span class="lineno"> 1813</span>         writeCentroidFeature->SetGeometry(&writeCentroidPoint);</div>
+<div class="line"><a name="l01814"></a><span class="lineno"> 1814</span>         assert(wkbFlatten(writeCentroidFeature->GetGeometryRef()->getGeometryType()) == wkbPoint );</div>
+<div class="line"><a name="l01815"></a><span class="lineno"> 1815</span>         <span class="keywordflow">if</span>(verbose_opt[0]>1)</div>
+<div class="line"><a name="l01816"></a><span class="lineno"> 1816</span>           std::cout << <span class="stringliteral">"write feature has "</span> << writeCentroidFeature->GetFieldCount() << <span class="stringliteral">" fields"</span> << std::endl;</div>
+<div class="line"><a name="l01817"></a><span class="lineno"> 1817</span>           }</div>
+<div class="line"><a name="l01818"></a><span class="lineno"> 1818</span>           <span class="keywordflow">if</span>(class_opt.empty()){</div>
+<div class="line"><a name="l01819"></a><span class="lineno"> 1819</span>         <span class="keywordflow">if</span>(ruleMap[rule_opt[0]]==rule::point){<span class="comment">//value at centroid of polygon</span></div>
+<div class="line"><a name="l01820"></a><span class="lineno"> 1820</span>           <span class="keywordflow">if</span>(verbose_opt[0])</div>
+<div class="line"><a name="l01821"></a><span class="lineno"> 1821</span>             std::cout << <span class="stringliteral">"number of points in polygon: "</span> << nPointPolygon << std::endl;</div>
+<div class="line"><a name="l01822"></a><span class="lineno"> 1822</span>           <span class="keywordflow">for</span>(<span class="keywordtype">int</span> index=0;index<polyValues.size();++index){</div>
+<div class="line"><a name="l01823"></a><span class="lineno"> 1823</span>             assert(polyValues[index].size()==1);</div>
+<div class="line"><a name="l01824"></a><span class="lineno"> 1824</span>             <span class="keywordtype">double</span> theValue=polyValues[index].back();</div>
+<div class="line"><a name="l01825"></a><span class="lineno"> 1825</span> </div>
+<div class="line"><a name="l01826"></a><span class="lineno"> 1826</span>             <span class="keywordflow">if</span>(verbose_opt[0])</div>
+<div class="line"><a name="l01827"></a><span class="lineno"> 1827</span>               std::cout << <span class="stringliteral">"number of points in polygon: "</span> << nPointPolygon << std::endl;</div>
+<div class="line"><a name="l01828"></a><span class="lineno"> 1828</span>             <span class="keywordtype">int</span> theBand=(band_opt.size()) ? band_opt[index] : index;</div>
+<div class="line"><a name="l01829"></a><span class="lineno"> 1829</span>             <span class="keywordflow">try</span>{</div>
+<div class="line"><a name="l01830"></a><span class="lineno"> 1830</span>               <span class="keywordflow">if</span>(verbose_opt[0]>1)</div>
+<div class="line"><a name="l01831"></a><span class="lineno"> 1831</span>             std::cout << <span class="stringliteral">"set field "</span> << fieldname_opt[index] << <span class="stringliteral">" to "</span> << theValue << std::endl;</div>
+<div class="line"><a name="l01832"></a><span class="lineno"> 1832</span>               <span class="keywordflow">switch</span>( fieldType ){</div>
+<div class="line"><a name="l01833"></a><span class="lineno"> 1833</span>               <span class="keywordflow">case</span> OFTInteger:</div>
+<div class="line"><a name="l01834"></a><span class="lineno"> 1834</span>               <span class="keywordflow">case</span> OFTReal:</div>
+<div class="line"><a name="l01835"></a><span class="lineno"> 1835</span>             <span class="keywordflow">if</span>(polygon_opt[0])</div>
+<div class="line"><a name="l01836"></a><span class="lineno"> 1836</span>               writePolygonFeature->SetField(fieldname_opt[index].c_str(),theValue);</div>
+<div class="line"><a name="l01837"></a><span class="lineno"> 1837</span>             <span class="keywordflow">else</span></div>
+<div class="line"><a name="l01838"></a><span class="lineno"> 1838</span>               writeCentroidFeature->SetField(fieldname_opt[index].c_str(),theValue);</div>
+<div class="line"><a name="l01839"></a><span class="lineno"> 1839</span>             <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l01840"></a><span class="lineno"> 1840</span>               <span class="keywordflow">case</span> OFTString:</div>
+<div class="line"><a name="l01841"></a><span class="lineno"> 1841</span>             <span class="keywordflow">if</span>(polygon_opt[0])</div>
+<div class="line"><a name="l01842"></a><span class="lineno"> 1842</span>               writePolygonFeature->SetField(fieldname_opt[index].c_str(),type2string<double>(theValue).c_str());</div>
+<div class="line"><a name="l01843"></a><span class="lineno"> 1843</span>             <span class="keywordflow">else</span></div>
+<div class="line"><a name="l01844"></a><span class="lineno"> 1844</span>               writeCentroidFeature->SetField(fieldname_opt[index].c_str(),type2string<double>(theValue).c_str());</div>
+<div class="line"><a name="l01845"></a><span class="lineno"> 1845</span>             <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l01846"></a><span class="lineno"> 1846</span>               <span class="keywordflow">default</span>:<span class="comment">//not supported</span></div>
+<div class="line"><a name="l01847"></a><span class="lineno"> 1847</span>             std::string errorString=<span class="stringliteral">"field type not supported"</span>;</div>
+<div class="line"><a name="l01848"></a><span class="lineno"> 1848</span>             <span class="keywordflow">throw</span>(errorString);</div>
+<div class="line"><a name="l01849"></a><span class="lineno"> 1849</span>             <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l01850"></a><span class="lineno"> 1850</span>               }</div>
+<div class="line"><a name="l01851"></a><span class="lineno"> 1851</span>             }</div>
+<div class="line"><a name="l01852"></a><span class="lineno"> 1852</span>             <span class="keywordflow">catch</span>(std::string e){</div>
+<div class="line"><a name="l01853"></a><span class="lineno"> 1853</span>               std::cout << e << std::endl;</div>
+<div class="line"><a name="l01854"></a><span class="lineno"> 1854</span>               exit(1);</div>
+<div class="line"><a name="l01855"></a><span class="lineno"> 1855</span>             }</div>
+<div class="line"><a name="l01856"></a><span class="lineno"> 1856</span>           }</div>
+<div class="line"><a name="l01857"></a><span class="lineno"> 1857</span>         }</div>
+<div class="line"><a name="l01858"></a><span class="lineno"> 1858</span>         <span class="keywordflow">else</span>{<span class="comment">//ruleMap[rule_opt[0]] is not rule::point</span></div>
+<div class="line"><a name="l01859"></a><span class="lineno"> 1859</span>           <span class="keywordtype">double</span> theValue=0;</div>
+<div class="line"><a name="l01860"></a><span class="lineno"> 1860</span>           <span class="keywordflow">for</span>(<span class="keywordtype">int</span> index=0;index<polyValues.size();++index){</div>
+<div class="line"><a name="l01861"></a><span class="lineno"> 1861</span>             <span class="keywordflow">try</span>{</div>
+<div class="line"><a name="l01862"></a><span class="lineno"> 1862</span>               <span class="keywordflow">if</span>(ruleMap[rule_opt[0]]==rule::mean)</div>
+<div class="line"><a name="l01863"></a><span class="lineno"> 1863</span>             theValue=stat.mean(polyValues[index]);</div>
+<div class="line"><a name="l01864"></a><span class="lineno"> 1864</span>               <span class="keywordflow">else</span> <span class="keywordflow">if</span>(ruleMap[rule_opt[0]]==rule::stdev)</div>
+<div class="line"><a name="l01865"></a><span class="lineno"> 1865</span>             theValue=sqrt(stat.var(polyValues[index]));</div>
+<div class="line"><a name="l01866"></a><span class="lineno"> 1866</span>               <span class="keywordflow">else</span> <span class="keywordflow">if</span>(ruleMap[rule_opt[0]]==rule::median)</div>
+<div class="line"><a name="l01867"></a><span class="lineno"> 1867</span>             theValue=stat.median(polyValues[index]);</div>
+<div class="line"><a name="l01868"></a><span class="lineno"> 1868</span>               <span class="keywordflow">else</span> <span class="keywordflow">if</span>(ruleMap[rule_opt[0]]==rule::percentile)</div>
+<div class="line"><a name="l01869"></a><span class="lineno"> 1869</span>             theValue=stat.percentile(polyValues[index],polyValues[index].begin(),polyValues[index].end(),percentile_opt[0]);</div>
+<div class="line"><a name="l01870"></a><span class="lineno"> 1870</span>               <span class="keywordflow">else</span> <span class="keywordflow">if</span>(ruleMap[rule_opt[0]]==rule::sum)</div>
+<div class="line"><a name="l01871"></a><span class="lineno"> 1871</span>             theValue=stat.sum(polyValues[index]);</div>
+<div class="line"><a name="l01872"></a><span class="lineno"> 1872</span>               <span class="keywordflow">else</span> <span class="keywordflow">if</span>(ruleMap[rule_opt[0]]==rule::max)</div>
+<div class="line"><a name="l01873"></a><span class="lineno"> 1873</span>             theValue=stat.mymax(polyValues[index]);</div>
+<div class="line"><a name="l01874"></a><span class="lineno"> 1874</span>               <span class="keywordflow">else</span> <span class="keywordflow">if</span>(ruleMap[rule_opt[0]]==rule::min)</div>
+<div class="line"><a name="l01875"></a><span class="lineno"> 1875</span>             theValue=stat.mymin(polyValues[index]);</div>
+<div class="line"><a name="l01876"></a><span class="lineno"> 1876</span>               <span class="keywordflow">else</span> <span class="keywordflow">if</span>(ruleMap[rule_opt[0]]==rule::centroid){</div>
+<div class="line"><a name="l01877"></a><span class="lineno"> 1877</span>             <span class="keywordflow">if</span>(verbose_opt[0])</div>
+<div class="line"><a name="l01878"></a><span class="lineno"> 1878</span>               std::cout << <span class="stringliteral">"number of points in polygon: "</span> << nPointPolygon << std::endl;</div>
+<div class="line"><a name="l01879"></a><span class="lineno"> 1879</span>             assert(nPointPolygon<=1);</div>
+<div class="line"><a name="l01880"></a><span class="lineno"> 1880</span>             assert(nPointPolygon==polyValues[index].size());</div>
+<div class="line"><a name="l01881"></a><span class="lineno"> 1881</span>             theValue=polyValues[index].back();</div>
+<div class="line"><a name="l01882"></a><span class="lineno"> 1882</span>               }</div>
+<div class="line"><a name="l01883"></a><span class="lineno"> 1883</span>               <span class="keywordflow">else</span>{</div>
+<div class="line"><a name="l01884"></a><span class="lineno"> 1884</span>             std::string errorString=<span class="stringliteral">"rule not supported"</span>;</div>
+<div class="line"><a name="l01885"></a><span class="lineno"> 1885</span>             <span class="keywordflow">throw</span>(errorString);</div>
+<div class="line"><a name="l01886"></a><span class="lineno"> 1886</span>               }</div>
+<div class="line"><a name="l01887"></a><span class="lineno"> 1887</span>               <span class="keywordflow">if</span>(verbose_opt[0]>1)</div>
+<div class="line"><a name="l01888"></a><span class="lineno"> 1888</span>             std::cout << <span class="stringliteral">"set field "</span> << fieldname_opt[index] << <span class="stringliteral">" to "</span> << theValue << std::endl;</div>
+<div class="line"><a name="l01889"></a><span class="lineno"> 1889</span>               <span class="keywordflow">switch</span>( fieldType ){</div>
+<div class="line"><a name="l01890"></a><span class="lineno"> 1890</span>               <span class="keywordflow">case</span> OFTInteger:</div>
+<div class="line"><a name="l01891"></a><span class="lineno"> 1891</span>               <span class="keywordflow">case</span> OFTReal:</div>
+<div class="line"><a name="l01892"></a><span class="lineno"> 1892</span>             <span class="keywordflow">if</span>(polygon_opt[0])</div>
+<div class="line"><a name="l01893"></a><span class="lineno"> 1893</span>               writePolygonFeature->SetField(fieldname_opt[index].c_str(),theValue);</div>
+<div class="line"><a name="l01894"></a><span class="lineno"> 1894</span>             <span class="keywordflow">else</span></div>
+<div class="line"><a name="l01895"></a><span class="lineno"> 1895</span>               writeCentroidFeature->SetField(fieldname_opt[index].c_str(),theValue);</div>
+<div class="line"><a name="l01896"></a><span class="lineno"> 1896</span>             <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l01897"></a><span class="lineno"> 1897</span>               <span class="keywordflow">case</span> OFTString:</div>
+<div class="line"><a name="l01898"></a><span class="lineno"> 1898</span>             <span class="keywordflow">if</span>(polygon_opt[0])</div>
+<div class="line"><a name="l01899"></a><span class="lineno"> 1899</span>               writePolygonFeature->SetField(fieldname_opt[index].c_str(),type2string<double>(theValue).c_str());</div>
+<div class="line"><a name="l01900"></a><span class="lineno"> 1900</span>             <span class="keywordflow">else</span></div>
+<div class="line"><a name="l01901"></a><span class="lineno"> 1901</span>               writeCentroidFeature->SetField(fieldname_opt[index].c_str(),type2string<double>(theValue).c_str());</div>
+<div class="line"><a name="l01902"></a><span class="lineno"> 1902</span>             <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l01903"></a><span class="lineno"> 1903</span>               <span class="keywordflow">default</span>:</div>
+<div class="line"><a name="l01904"></a><span class="lineno"> 1904</span>             std::string errorString=<span class="stringliteral">"field type not supported"</span>;</div>
+<div class="line"><a name="l01905"></a><span class="lineno"> 1905</span>             <span class="keywordflow">throw</span>(errorString);</div>
+<div class="line"><a name="l01906"></a><span class="lineno"> 1906</span>             <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l01907"></a><span class="lineno"> 1907</span>               }</div>
+<div class="line"><a name="l01908"></a><span class="lineno"> 1908</span>             }</div>
+<div class="line"><a name="l01909"></a><span class="lineno"> 1909</span>             <span class="keywordflow">catch</span>(std::string e){</div>
+<div class="line"><a name="l01910"></a><span class="lineno"> 1910</span>               std::cout << e << std::endl;</div>
+<div class="line"><a name="l01911"></a><span class="lineno"> 1911</span>               exit(1);</div>
+<div class="line"><a name="l01912"></a><span class="lineno"> 1912</span>             }</div>
+<div class="line"><a name="l01913"></a><span class="lineno"> 1913</span>           }</div>
+<div class="line"><a name="l01914"></a><span class="lineno"> 1914</span>         }</div>
+<div class="line"><a name="l01915"></a><span class="lineno"> 1915</span>           }</div>
+<div class="line"><a name="l01916"></a><span class="lineno"> 1916</span>           <span class="keywordflow">else</span>{<span class="comment">//class_opt is set</span></div>
+<div class="line"><a name="l01917"></a><span class="lineno"> 1917</span>         <span class="keywordflow">if</span>(ruleMap[rule_opt[0]]==rule::proportion||ruleMap[rule_opt[0]]==rule::count){</div>
+<div class="line"><a name="l01918"></a><span class="lineno"> 1918</span>           <span class="keywordflow">if</span>(verbose_opt[0])</div>
+<div class="line"><a name="l01919"></a><span class="lineno"> 1919</span>             std::cout << <span class="stringliteral">"number of points in polygon: "</span> << nPointPolygon << std::endl;</div>
+<div class="line"><a name="l01920"></a><span class="lineno"> 1920</span>           <span class="keywordflow">if</span>(ruleMap[rule_opt[0]]==rule::proportion)</div>
+<div class="line"><a name="l01921"></a><span class="lineno"> 1921</span>             stat.normalize_pct(polyClassValues);</div>
+<div class="line"><a name="l01922"></a><span class="lineno"> 1922</span>           <span class="keywordflow">for</span>(<span class="keywordtype">int</span> index=0;index<polyClassValues.size();++index){</div>
+<div class="line"><a name="l01923"></a><span class="lineno"> 1923</span>             <span class="keywordtype">double</span> theValue=polyClassValues[index];</div>
+<div class="line"><a name="l01924"></a><span class="lineno"> 1924</span>             ostringstream fs;</div>
+<div class="line"><a name="l01925"></a><span class="lineno"> 1925</span>             fs << class_opt[index];</div>
+<div class="line"><a name="l01926"></a><span class="lineno"> 1926</span>             <span class="keywordflow">if</span>(polygon_opt[0])</div>
+<div class="line"><a name="l01927"></a><span class="lineno"> 1927</span>               writePolygonFeature->SetField(fs.str().c_str(),<span class="keyword">static_cast<</span><span class="keywordtype">int</span><span class="keyword">></span>(theValue));</div>
+<div class="line"><a name="l01928"></a><span class="lineno"> 1928</span>             <span class="keywordflow">else</span></div>
+<div class="line"><a name="l01929"></a><span class="lineno"> 1929</span>               writeCentroidFeature->SetField(fs.str().c_str(),<span class="keyword">static_cast<</span><span class="keywordtype">int</span><span class="keyword">></span>(theValue));</div>
+<div class="line"><a name="l01930"></a><span class="lineno"> 1930</span>           }</div>
+<div class="line"><a name="l01931"></a><span class="lineno"> 1931</span>         }</div>
+<div class="line"><a name="l01932"></a><span class="lineno"> 1932</span>         <span class="keywordflow">else</span> <span class="keywordflow">if</span>(ruleMap[rule_opt[0]]==rule::custom){</div>
+<div class="line"><a name="l01933"></a><span class="lineno"> 1933</span>           assert(polygon_opt[0]);<span class="comment">//not implemented for points</span></div>
+<div class="line"><a name="l01934"></a><span class="lineno"> 1934</span>           <span class="keywordflow">if</span>(verbose_opt[0])</div>
+<div class="line"><a name="l01935"></a><span class="lineno"> 1935</span>             std::cout << <span class="stringliteral">"number of points in polygon: "</span> << nPointPolygon << std::endl;</div>
+<div class="line"><a name="l01936"></a><span class="lineno"> 1936</span>           stat.normalize_pct(polyClassValues);</div>
+<div class="line"><a name="l01937"></a><span class="lineno"> 1937</span>           assert(polyClassValues.size()==2);<span class="comment">//11:broadleaved, 12:coniferous</span></div>
+<div class="line"><a name="l01938"></a><span class="lineno"> 1938</span>           <span class="keywordflow">if</span>(polyClassValues[0]>=75)<span class="comment">//broadleaved</span></div>
+<div class="line"><a name="l01939"></a><span class="lineno"> 1939</span>             writePolygonFeature->SetField(label_opt[0].c_str(),static_cast<int>(11));</div>
+<div class="line"><a name="l01940"></a><span class="lineno"> 1940</span>           <span class="keywordflow">else</span> <span class="keywordflow">if</span>(polyClassValues[1]>=75)<span class="comment">//coniferous</span></div>
+<div class="line"><a name="l01941"></a><span class="lineno"> 1941</span>             writePolygonFeature->SetField(label_opt[0].c_str(),static_cast<int>(12));</div>
+<div class="line"><a name="l01942"></a><span class="lineno"> 1942</span>           <span class="keywordflow">else</span> <span class="keywordflow">if</span>(polyClassValues[0]>25&&polyClassValues[1]>25)<span class="comment">//mixed</span></div>
+<div class="line"><a name="l01943"></a><span class="lineno"> 1943</span>             writePolygonFeature->SetField(label_opt[0].c_str(),static_cast<int>(13));</div>
 <div class="line"><a name="l01944"></a><span class="lineno"> 1944</span>           <span class="keywordflow">else</span>{</div>
-<div class="line"><a name="l01945"></a><span class="lineno"> 1945</span>         <span class="keywordflow">if</span>(verbose_opt[0]>1)</div>
-<div class="line"><a name="l01946"></a><span class="lineno"> 1946</span>           std::cout << <span class="stringliteral">"creating point feature in centroid"</span> << std::endl;</div>
-<div class="line"><a name="l01947"></a><span class="lineno"> 1947</span>         <span class="keywordflow">if</span>(writeTest){</div>
-<div class="line"><a name="l01948"></a><span class="lineno"> 1948</span>           <span class="keywordflow">if</span>(writeTestLayer->CreateFeature( writeCentroidFeature ) != OGRERR_NONE ){</div>
-<div class="line"><a name="l01949"></a><span class="lineno"> 1949</span>             std::string errorString=<span class="stringliteral">"Failed to create point feature in ogr vector dataset"</span>;</div>
-<div class="line"><a name="l01950"></a><span class="lineno"> 1950</span>             <span class="keywordflow">throw</span>(errorString);</div>
-<div class="line"><a name="l01951"></a><span class="lineno"> 1951</span>           }</div>
-<div class="line"><a name="l01952"></a><span class="lineno"> 1952</span>         }</div>
-<div class="line"><a name="l01953"></a><span class="lineno"> 1953</span>         <span class="keywordflow">else</span>{</div>
-<div class="line"><a name="l01954"></a><span class="lineno"> 1954</span>           <span class="comment">//test</span></div>
-<div class="line"><a name="l01955"></a><span class="lineno"> 1955</span>           assert(validFeature);</div>
-<div class="line"><a name="l01956"></a><span class="lineno"> 1956</span>           <span class="keywordflow">if</span>(writeLayer->CreateFeature( writeCentroidFeature ) != OGRERR_NONE ){</div>
-<div class="line"><a name="l01957"></a><span class="lineno"> 1957</span>             std::string errorString=<span class="stringliteral">"Failed to create point feature in ogr vector dataset"</span>;</div>
-<div class="line"><a name="l01958"></a><span class="lineno"> 1958</span>             <span class="keywordflow">throw</span>(errorString);</div>
-<div class="line"><a name="l01959"></a><span class="lineno"> 1959</span>           }</div>
-<div class="line"><a name="l01960"></a><span class="lineno"> 1960</span>         }</div>
-<div class="line"><a name="l01961"></a><span class="lineno"> 1961</span>         OGRFeature::DestroyFeature( writeCentroidFeature );</div>
-<div class="line"><a name="l01962"></a><span class="lineno"> 1962</span>         ++ntotalvalid;</div>
-<div class="line"><a name="l01963"></a><span class="lineno"> 1963</span>         <span class="keywordflow">if</span>(verbose_opt[0])</div>
-<div class="line"><a name="l01964"></a><span class="lineno"> 1964</span>           std::cout << <span class="stringliteral">"ntotalvalid: "</span> << ntotalvalid << std::endl;</div>
-<div class="line"><a name="l01965"></a><span class="lineno"> 1965</span>           }</div>
-<div class="line"><a name="l01966"></a><span class="lineno"> 1966</span>         }</div>
-<div class="line"><a name="l01967"></a><span class="lineno"> 1967</span>       }</div>
-<div class="line"><a name="l01968"></a><span class="lineno"> 1968</span>       <span class="keywordflow">else</span> <span class="keywordflow">if</span>(wkbFlatten(poGeometry->getGeometryType()) == wkbMultiPolygon){<span class="comment">//todo: try to use virtual OGRGeometry instead of OGRMultiPolygon and OGRPolygon</span></div>
-<div class="line"><a name="l01969"></a><span class="lineno"> 1969</span>         OGRMultiPolygon readPolygon = *((OGRMultiPolygon *) poGeometry);</div>
-<div class="line"><a name="l01970"></a><span class="lineno"> 1970</span>         OGRPolygon writePolygon;</div>
-<div class="line"><a name="l01971"></a><span class="lineno"> 1971</span>         OGRLinearRing writeRing;</div>
-<div class="line"><a name="l01972"></a><span class="lineno"> 1972</span>         OGRPoint writeCentroidPoint;</div>
-<div class="line"><a name="l01973"></a><span class="lineno"> 1973</span>         OGRFeature *writePolygonFeature;</div>
-<div class="line"><a name="l01974"></a><span class="lineno"> 1974</span>         OGRFeature *writeCentroidFeature;</div>
-<div class="line"><a name="l01975"></a><span class="lineno"> 1975</span> </div>
-<div class="line"><a name="l01976"></a><span class="lineno"> 1976</span>         readPolygon.closeRings();</div>
-<div class="line"><a name="l01977"></a><span class="lineno"> 1977</span> </div>
-<div class="line"><a name="l01978"></a><span class="lineno"> 1978</span>         <span class="keywordflow">if</span>(verbose_opt[0]>1)</div>
-<div class="line"><a name="l01979"></a><span class="lineno"> 1979</span>           std::cout << <span class="stringliteral">"get centroid point from polygon"</span> << std::endl;</div>
-<div class="line"><a name="l01980"></a><span class="lineno"> 1980</span> </div>
-<div class="line"><a name="l01981"></a><span class="lineno"> 1981</span>         readPolygon.Centroid(&writeCentroidPoint);</div>
-<div class="line"><a name="l01982"></a><span class="lineno"> 1982</span> </div>
-<div class="line"><a name="l01983"></a><span class="lineno"> 1983</span>         <span class="keywordtype">double</span> ulx,uly,lrx,lry;</div>
-<div class="line"><a name="l01984"></a><span class="lineno"> 1984</span>         <span class="keywordtype">double</span> uli,ulj,lri,lrj;</div>
-<div class="line"><a name="l01985"></a><span class="lineno"> 1985</span>         <span class="keywordflow">if</span>((polygon_opt[0]&&ruleMap[rule_opt[0]]==rule::point)||(ruleMap[rule_opt[0]]==rule::centroid)){</div>
-<div class="line"><a name="l01986"></a><span class="lineno"> 1986</span>           ulx=writeCentroidPoint.getX();</div>
-<div class="line"><a name="l01987"></a><span class="lineno"> 1987</span>           uly=writeCentroidPoint.getY();</div>
-<div class="line"><a name="l01988"></a><span class="lineno"> 1988</span>           lrx=ulx;</div>
-<div class="line"><a name="l01989"></a><span class="lineno"> 1989</span>           lry=uly;</div>
-<div class="line"><a name="l01990"></a><span class="lineno"> 1990</span>         }</div>
-<div class="line"><a name="l01991"></a><span class="lineno"> 1991</span>         <span class="keywordflow">else</span>{</div>
-<div class="line"><a name="l01992"></a><span class="lineno"> 1992</span>           <span class="comment">//get envelope</span></div>
-<div class="line"><a name="l01993"></a><span class="lineno"> 1993</span>           <span class="keywordflow">if</span>(verbose_opt[0])</div>
-<div class="line"><a name="l01994"></a><span class="lineno"> 1994</span>         std::cout << <span class="stringliteral">"reading envelope for polygon "</span> << ifeature << std::endl;</div>
-<div class="line"><a name="l01995"></a><span class="lineno"> 1995</span>           OGREnvelope* psEnvelope=<span class="keyword">new</span> OGREnvelope();</div>
-<div class="line"><a name="l01996"></a><span class="lineno"> 1996</span>           readPolygon.getEnvelope(psEnvelope);</div>
-<div class="line"><a name="l01997"></a><span class="lineno"> 1997</span>           ulx=psEnvelope->MinX;</div>
-<div class="line"><a name="l01998"></a><span class="lineno"> 1998</span>           uly=psEnvelope->MaxY;</div>
-<div class="line"><a name="l01999"></a><span class="lineno"> 1999</span>           lrx=psEnvelope->MaxX;</div>
-<div class="line"><a name="l02000"></a><span class="lineno"> 2000</span>           lry=psEnvelope->MinY;</div>
-<div class="line"><a name="l02001"></a><span class="lineno"> 2001</span>           <span class="keyword">delete</span> psEnvelope;</div>
+<div class="line"><a name="l01945"></a><span class="lineno"> 1945</span>             <span class="keywordflow">if</span>(verbose_opt[0]){</div>
+<div class="line"><a name="l01946"></a><span class="lineno"> 1946</span>               std::cout << <span class="stringliteral">"No valid value in polyClassValues..."</span> << std::endl;</div>
+<div class="line"><a name="l01947"></a><span class="lineno"> 1947</span>               <span class="keywordflow">for</span>(<span class="keywordtype">int</span> index=0;index<polyClassValues.size();++index){</div>
+<div class="line"><a name="l01948"></a><span class="lineno"> 1948</span>             <span class="keywordtype">double</span> theValue=polyClassValues[index];</div>
+<div class="line"><a name="l01949"></a><span class="lineno"> 1949</span>             std::cout << theValue << <span class="stringliteral">" "</span>;</div>
+<div class="line"><a name="l01950"></a><span class="lineno"> 1950</span>               }</div>
+<div class="line"><a name="l01951"></a><span class="lineno"> 1951</span>               std::cout << std::endl;</div>
+<div class="line"><a name="l01952"></a><span class="lineno"> 1952</span>             }</div>
+<div class="line"><a name="l01953"></a><span class="lineno"> 1953</span>             writePolygonFeature->SetField(label_opt[0].c_str(),static_cast<int>(20));</div>
+<div class="line"><a name="l01954"></a><span class="lineno"> 1954</span>           }</div>
+<div class="line"><a name="l01955"></a><span class="lineno"> 1955</span>         }</div>
+<div class="line"><a name="l01956"></a><span class="lineno"> 1956</span>         <span class="keywordflow">else</span> <span class="keywordflow">if</span>(ruleMap[rule_opt[0]]==rule::mode){</div>
+<div class="line"><a name="l01957"></a><span class="lineno"> 1957</span>           <span class="comment">//maximum votes in polygon</span></div>
+<div class="line"><a name="l01958"></a><span class="lineno"> 1958</span>           <span class="keywordflow">if</span>(verbose_opt[0])</div>
+<div class="line"><a name="l01959"></a><span class="lineno"> 1959</span>             std::cout << <span class="stringliteral">"number of points in polygon: "</span> << nPointPolygon << std::endl;</div>
+<div class="line"><a name="l01960"></a><span class="lineno"> 1960</span>           <span class="comment">//search for class with maximum votes</span></div>
+<div class="line"><a name="l01961"></a><span class="lineno"> 1961</span>           <span class="keywordtype">int</span> maxClass=stat.mymin(class_opt);</div>
+<div class="line"><a name="l01962"></a><span class="lineno"> 1962</span>           vector<double>::iterator maxit;</div>
+<div class="line"><a name="l01963"></a><span class="lineno"> 1963</span>           maxit=stat.mymax(polyClassValues,polyClassValues.begin(),polyClassValues.end());</div>
+<div class="line"><a name="l01964"></a><span class="lineno"> 1964</span>           <span class="keywordtype">int</span> maxIndex=distance(polyClassValues.begin(),maxit);</div>
+<div class="line"><a name="l01965"></a><span class="lineno"> 1965</span>           maxClass=class_opt[maxIndex];</div>
+<div class="line"><a name="l01966"></a><span class="lineno"> 1966</span>           <span class="keywordflow">if</span>(verbose_opt[0]>0)</div>
+<div class="line"><a name="l01967"></a><span class="lineno"> 1967</span>             std::cout << <span class="stringliteral">"maxClass: "</span> << maxClass << std::endl;</div>
+<div class="line"><a name="l01968"></a><span class="lineno"> 1968</span>           <span class="keywordflow">if</span>(polygon_opt[0])</div>
+<div class="line"><a name="l01969"></a><span class="lineno"> 1969</span>             writePolygonFeature->SetField(label_opt[0].c_str(),maxClass);</div>
+<div class="line"><a name="l01970"></a><span class="lineno"> 1970</span>           <span class="keywordflow">else</span></div>
+<div class="line"><a name="l01971"></a><span class="lineno"> 1971</span>             writeCentroidFeature->SetField(label_opt[0].c_str(),maxClass);</div>
+<div class="line"><a name="l01972"></a><span class="lineno"> 1972</span>         }</div>
+<div class="line"><a name="l01973"></a><span class="lineno"> 1973</span>           }</div>
+<div class="line"><a name="l01974"></a><span class="lineno"> 1974</span>           <span class="keywordflow">if</span>(polygon_opt[0]){</div>
+<div class="line"><a name="l01975"></a><span class="lineno"> 1975</span>         <span class="keywordflow">if</span>(verbose_opt[0]>1)</div>
+<div class="line"><a name="l01976"></a><span class="lineno"> 1976</span>           std::cout << <span class="stringliteral">"creating polygon feature"</span> << std::endl;</div>
+<div class="line"><a name="l01977"></a><span class="lineno"> 1977</span>         <span class="keywordflow">if</span>(writeTest){</div>
+<div class="line"><a name="l01978"></a><span class="lineno"> 1978</span>           <span class="keywordflow">if</span>(writeTestLayer->CreateFeature( writePolygonFeature ) != OGRERR_NONE ){</div>
+<div class="line"><a name="l01979"></a><span class="lineno"> 1979</span>             std::string errorString=<span class="stringliteral">"Failed to create polygon feature in ogr vector dataset"</span>;</div>
+<div class="line"><a name="l01980"></a><span class="lineno"> 1980</span>             <span class="keywordflow">throw</span>(errorString);</div>
+<div class="line"><a name="l01981"></a><span class="lineno"> 1981</span>           }</div>
+<div class="line"><a name="l01982"></a><span class="lineno"> 1982</span>         }</div>
+<div class="line"><a name="l01983"></a><span class="lineno"> 1983</span>         <span class="keywordflow">else</span>{</div>
+<div class="line"><a name="l01984"></a><span class="lineno"> 1984</span>           <span class="keywordflow">if</span>(writeLayer->CreateFeature( writePolygonFeature ) != OGRERR_NONE ){</div>
+<div class="line"><a name="l01985"></a><span class="lineno"> 1985</span>             std::string errorString=<span class="stringliteral">"Failed to create polygon feature in ogr vector dataset"</span>;</div>
+<div class="line"><a name="l01986"></a><span class="lineno"> 1986</span>             <span class="keywordflow">throw</span>(errorString);</div>
+<div class="line"><a name="l01987"></a><span class="lineno"> 1987</span>           }</div>
+<div class="line"><a name="l01988"></a><span class="lineno"> 1988</span>         }</div>
+<div class="line"><a name="l01989"></a><span class="lineno"> 1989</span>         OGRFeature::DestroyFeature( writePolygonFeature );</div>
+<div class="line"><a name="l01990"></a><span class="lineno"> 1990</span>         ++ntotalvalid;</div>
+<div class="line"><a name="l01991"></a><span class="lineno"> 1991</span>         <span class="keywordflow">if</span>(verbose_opt[0])</div>
+<div class="line"><a name="l01992"></a><span class="lineno"> 1992</span>           std::cout << <span class="stringliteral">"ntotalvalid(1): "</span> << ntotalvalid << std::endl;</div>
+<div class="line"><a name="l01993"></a><span class="lineno"> 1993</span>           }</div>
+<div class="line"><a name="l01994"></a><span class="lineno"> 1994</span>           <span class="keywordflow">else</span>{</div>
+<div class="line"><a name="l01995"></a><span class="lineno"> 1995</span>         <span class="keywordflow">if</span>(verbose_opt[0]>1)</div>
+<div class="line"><a name="l01996"></a><span class="lineno"> 1996</span>           std::cout << <span class="stringliteral">"creating point feature in centroid"</span> << std::endl;</div>
+<div class="line"><a name="l01997"></a><span class="lineno"> 1997</span>         <span class="keywordflow">if</span>(writeTest){</div>
+<div class="line"><a name="l01998"></a><span class="lineno"> 1998</span>           <span class="keywordflow">if</span>(writeTestLayer->CreateFeature( writeCentroidFeature ) != OGRERR_NONE ){</div>
+<div class="line"><a name="l01999"></a><span class="lineno"> 1999</span>             std::string errorString=<span class="stringliteral">"Failed to create point feature in ogr vector dataset"</span>;</div>
+<div class="line"><a name="l02000"></a><span class="lineno"> 2000</span>             <span class="keywordflow">throw</span>(errorString);</div>
+<div class="line"><a name="l02001"></a><span class="lineno"> 2001</span>           }</div>
 <div class="line"><a name="l02002"></a><span class="lineno"> 2002</span>         }</div>
-<div class="line"><a name="l02003"></a><span class="lineno"> 2003</span>         <span class="comment">// if(geo_opt[0]){</span></div>
-<div class="line"><a name="l02004"></a><span class="lineno"> 2004</span>           imgReader.geo2image(ulx,uly,uli,ulj);</div>
-<div class="line"><a name="l02005"></a><span class="lineno"> 2005</span>           imgReader.geo2image(lrx,lry,lri,lrj);</div>
-<div class="line"><a name="l02006"></a><span class="lineno"> 2006</span>         <span class="comment">// }</span></div>
-<div class="line"><a name="l02007"></a><span class="lineno"> 2007</span>         <span class="comment">// else{</span></div>
-<div class="line"><a name="l02008"></a><span class="lineno"> 2008</span>         <span class="comment">//   uli=ulx;</span></div>
-<div class="line"><a name="l02009"></a><span class="lineno"> 2009</span>         <span class="comment">//   ulj=uly;</span></div>
-<div class="line"><a name="l02010"></a><span class="lineno"> 2010</span>         <span class="comment">//   lri=lrx;</span></div>
-<div class="line"><a name="l02011"></a><span class="lineno"> 2011</span>         <span class="comment">//   lrj=lry;</span></div>
-<div class="line"><a name="l02012"></a><span class="lineno"> 2012</span>         <span class="comment">// }</span></div>
-<div class="line"><a name="l02013"></a><span class="lineno"> 2013</span>         <span class="comment">//nearest neighbour</span></div>
-<div class="line"><a name="l02014"></a><span class="lineno"> 2014</span>         ulj=<span class="keyword">static_cast<</span><span class="keywordtype">int</span><span class="keyword">></span>(ulj);</div>
-<div class="line"><a name="l02015"></a><span class="lineno"> 2015</span>         uli=<span class="keyword">static_cast<</span><span class="keywordtype">int</span><span class="keyword">></span>(uli);</div>
-<div class="line"><a name="l02016"></a><span class="lineno"> 2016</span>         lrj=<span class="keyword">static_cast<</span><span class="keywordtype">int</span><span class="keyword">></span>(lrj);</div>
-<div class="line"><a name="l02017"></a><span class="lineno"> 2017</span>         lri=<span class="keyword">static_cast<</span><span class="keywordtype">int</span><span class="keyword">></span>(lri);</div>
-<div class="line"><a name="l02018"></a><span class="lineno"> 2018</span>         <span class="comment">//iterate through all pixels</span></div>
-<div class="line"><a name="l02019"></a><span class="lineno"> 2019</span>         <span class="keywordflow">if</span>(verbose_opt[0]>1)</div>
-<div class="line"><a name="l02020"></a><span class="lineno"> 2020</span>           std::cout << <span class="stringliteral">"bounding box for multipologon feature "</span> << ifeature << <span class="stringliteral">": "</span> << uli << <span class="stringliteral">" "</span> << ulj << <span class="stringliteral">" "</span> << lri << <span class="stringliteral">" "</span> <<  [...]
-<div class="line"><a name="l02021"></a><span class="lineno"> 2021</span> </div>
-<div class="line"><a name="l02022"></a><span class="lineno"> 2022</span>         <span class="keywordflow">if</span>(uli<0)</div>
-<div class="line"><a name="l02023"></a><span class="lineno"> 2023</span>           uli=0;</div>
-<div class="line"><a name="l02024"></a><span class="lineno"> 2024</span>         <span class="keywordflow">if</span>(lri<0)</div>
-<div class="line"><a name="l02025"></a><span class="lineno"> 2025</span>           lri=0;</div>
-<div class="line"><a name="l02026"></a><span class="lineno"> 2026</span>         <span class="keywordflow">if</span>(uli>=imgReader.nrOfCol())</div>
-<div class="line"><a name="l02027"></a><span class="lineno"> 2027</span>           uli=imgReader.nrOfCol()-1;</div>
-<div class="line"><a name="l02028"></a><span class="lineno"> 2028</span>         <span class="keywordflow">if</span>(lri>=imgReader.nrOfCol())</div>
-<div class="line"><a name="l02029"></a><span class="lineno"> 2029</span>           lri=imgReader.nrOfCol()-1;</div>
-<div class="line"><a name="l02030"></a><span class="lineno"> 2030</span>         <span class="keywordflow">if</span>(ulj<0)</div>
-<div class="line"><a name="l02031"></a><span class="lineno"> 2031</span>           ulj=0;</div>
-<div class="line"><a name="l02032"></a><span class="lineno"> 2032</span>         <span class="keywordflow">if</span>(lrj<0)</div>
-<div class="line"><a name="l02033"></a><span class="lineno"> 2033</span>           lrj=0;</div>
-<div class="line"><a name="l02034"></a><span class="lineno"> 2034</span>         <span class="keywordflow">if</span>(ulj>=imgReader.nrOfRow())</div>
-<div class="line"><a name="l02035"></a><span class="lineno"> 2035</span>           ulj=imgReader.nrOfRow()-1;</div>
-<div class="line"><a name="l02036"></a><span class="lineno"> 2036</span>         <span class="keywordflow">if</span>(lrj>=imgReader.nrOfRow())</div>
-<div class="line"><a name="l02037"></a><span class="lineno"> 2037</span>           lrj=imgReader.nrOfRow()-1;</div>
-<div class="line"><a name="l02038"></a><span class="lineno"> 2038</span>         <span class="comment">// if(uli<0||lri>=imgReader.nrOfCol()||ulj<0||lrj>=imgReader.nrOfRow())</span></div>
-<div class="line"><a name="l02039"></a><span class="lineno"> 2039</span>         <span class="comment">//   continue;</span></div>
-<div class="line"><a name="l02040"></a><span class="lineno"> 2040</span> </div>
-<div class="line"><a name="l02041"></a><span class="lineno"> 2041</span>         <span class="keywordtype">int</span> nPointPolygon=0;</div>
-<div class="line"><a name="l02042"></a><span class="lineno"> 2042</span>         <span class="keywordflow">if</span>(polygon_opt[0]){</div>
-<div class="line"><a name="l02043"></a><span class="lineno"> 2043</span>           <span class="keywordflow">if</span>(writeTest)</div>
-<div class="line"><a name="l02044"></a><span class="lineno"> 2044</span>         writePolygonFeature = OGRFeature::CreateFeature(writeTestLayer->GetLayerDefn());</div>
-<div class="line"><a name="l02045"></a><span class="lineno"> 2045</span>           <span class="keywordflow">else</span></div>
-<div class="line"><a name="l02046"></a><span class="lineno"> 2046</span>         writePolygonFeature = OGRFeature::CreateFeature(writeLayer->GetLayerDefn());</div>
-<div class="line"><a name="l02047"></a><span class="lineno"> 2047</span>         }</div>
-<div class="line"><a name="l02048"></a><span class="lineno"> 2048</span>         <span class="keywordflow">else</span> <span class="keywordflow">if</span>(ruleMap[rule_opt[0]]!=rule::point){</div>
-<div class="line"><a name="l02049"></a><span class="lineno"> 2049</span>           <span class="keywordflow">if</span>(writeTest)</div>
-<div class="line"><a name="l02050"></a><span class="lineno"> 2050</span>         writeCentroidFeature = OGRFeature::CreateFeature(writeTestLayer->GetLayerDefn());</div>
-<div class="line"><a name="l02051"></a><span class="lineno"> 2051</span>           <span class="keywordflow">else</span></div>
-<div class="line"><a name="l02052"></a><span class="lineno"> 2052</span>         writeCentroidFeature = OGRFeature::CreateFeature(writeLayer->GetLayerDefn());</div>
-<div class="line"><a name="l02053"></a><span class="lineno"> 2053</span>         }</div>
-<div class="line"><a name="l02054"></a><span class="lineno"> 2054</span>         <span class="comment">// vector<double> polyValues;</span></div>
-<div class="line"><a name="l02055"></a><span class="lineno"> 2055</span>         <a class="code" href="classVector2d.html">Vector2d<double></a> polyValues;</div>
-<div class="line"><a name="l02056"></a><span class="lineno"> 2056</span>         vector<double> polyClassValues;</div>
-<div class="line"><a name="l02057"></a><span class="lineno"> 2057</span> </div>
-<div class="line"><a name="l02058"></a><span class="lineno"> 2058</span>         <span class="keywordflow">if</span>(class_opt.size()){</div>
-<div class="line"><a name="l02059"></a><span class="lineno"> 2059</span>           polyClassValues.resize(class_opt.size());</div>
-<div class="line"><a name="l02060"></a><span class="lineno"> 2060</span>           <span class="comment">//initialize</span></div>
-<div class="line"><a name="l02061"></a><span class="lineno"> 2061</span>           <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iclass=0;iclass<class_opt.size();++iclass)</div>
-<div class="line"><a name="l02062"></a><span class="lineno"> 2062</span>         polyClassValues[iclass]=0;</div>
-<div class="line"><a name="l02063"></a><span class="lineno"> 2063</span>         }</div>
-<div class="line"><a name="l02064"></a><span class="lineno"> 2064</span>         <span class="keywordflow">else</span></div>
-<div class="line"><a name="l02065"></a><span class="lineno"> 2065</span>           polyValues.resize(nband);</div>
-<div class="line"><a name="l02066"></a><span class="lineno"> 2066</span>         vector< Vector2d<double> > readValues(nband);</div>
-<div class="line"><a name="l02067"></a><span class="lineno"> 2067</span>         <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iband=0;iband<nband;++iband){</div>
-<div class="line"><a name="l02068"></a><span class="lineno"> 2068</span>           <span class="keywordtype">int</span> theBand=(band_opt.size()) ? band_opt[iband] : iband;</div>
-<div class="line"><a name="l02069"></a><span class="lineno"> 2069</span>           <span class="comment">//test</span></div>
-<div class="line"><a name="l02070"></a><span class="lineno"> 2070</span>           assert(uli>=0);</div>
-<div class="line"><a name="l02071"></a><span class="lineno"> 2071</span>           assert(uli<imgReader.nrOfCol());        </div>
-<div class="line"><a name="l02072"></a><span class="lineno"> 2072</span>           assert(lri>=0);</div>
-<div class="line"><a name="l02073"></a><span class="lineno"> 2073</span>           assert(lri<imgReader.nrOfCol());        </div>
-<div class="line"><a name="l02074"></a><span class="lineno"> 2074</span>           assert(ulj>=0);</div>
-<div class="line"><a name="l02075"></a><span class="lineno"> 2075</span>           assert(ulj<imgReader.nrOfRow());        </div>
-<div class="line"><a name="l02076"></a><span class="lineno"> 2076</span>           assert(lrj>=0);</div>
-<div class="line"><a name="l02077"></a><span class="lineno"> 2077</span>           assert(lrj<imgReader.nrOfRow());        </div>
-<div class="line"><a name="l02078"></a><span class="lineno"> 2078</span>           imgReader.readDataBlock(readValues[iband],GDT_Float64,uli,lri,ulj,lrj,theBand);</div>
-<div class="line"><a name="l02079"></a><span class="lineno"> 2079</span>         }</div>
-<div class="line"><a name="l02080"></a><span class="lineno"> 2080</span> </div>
-<div class="line"><a name="l02081"></a><span class="lineno"> 2081</span>         OGRPoint thePoint;</div>
-<div class="line"><a name="l02082"></a><span class="lineno"> 2082</span>         <span class="keywordflow">for</span>(<span class="keywordtype">int</span> j=ulj;j<=lrj;++j){</div>
-<div class="line"><a name="l02083"></a><span class="lineno"> 2083</span>           <span class="keywordflow">for</span>(<span class="keywordtype">int</span> i=uli;i<=lri;++i){</div>
-<div class="line"><a name="l02084"></a><span class="lineno"> 2084</span>         <span class="comment">//check if within raster image</span></div>
-<div class="line"><a name="l02085"></a><span class="lineno"> 2085</span>         <span class="keywordflow">if</span>(i<0||i>=imgReader.nrOfCol())</div>
-<div class="line"><a name="l02086"></a><span class="lineno"> 2086</span>           <span class="keywordflow">continue</span>;</div>
-<div class="line"><a name="l02087"></a><span class="lineno"> 2087</span>         <span class="keywordflow">if</span>(j<0||j>=imgReader.nrOfRow())</div>
-<div class="line"><a name="l02088"></a><span class="lineno"> 2088</span>           <span class="keywordflow">continue</span>;</div>
-<div class="line"><a name="l02089"></a><span class="lineno"> 2089</span>         <span class="comment">//check if point is on surface</span></div>
-<div class="line"><a name="l02090"></a><span class="lineno"> 2090</span>         <span class="keywordtype">double</span> theX=0;</div>
-<div class="line"><a name="l02091"></a><span class="lineno"> 2091</span>         <span class="keywordtype">double</span> theY=0;</div>
-<div class="line"><a name="l02092"></a><span class="lineno"> 2092</span>         imgReader.image2geo(i,j,theX,theY);</div>
-<div class="line"><a name="l02093"></a><span class="lineno"> 2093</span>         thePoint.setX(theX);</div>
-<div class="line"><a name="l02094"></a><span class="lineno"> 2094</span>         thePoint.setY(theY);</div>
-<div class="line"><a name="l02095"></a><span class="lineno"> 2095</span> </div>
-<div class="line"><a name="l02096"></a><span class="lineno"> 2096</span>         <span class="keywordflow">if</span>(ruleMap[rule_opt[0]]!=rule::centroid&&!readPolygon.Contains(&thePoint))</div>
-<div class="line"><a name="l02097"></a><span class="lineno"> 2097</span>           <span class="keywordflow">continue</span>;</div>
-<div class="line"><a name="l02098"></a><span class="lineno"> 2098</span> </div>
-<div class="line"><a name="l02099"></a><span class="lineno"> 2099</span>         <span class="keywordtype">bool</span> valid=<span class="keyword">true</span>;</div>
-<div class="line"><a name="l02100"></a><span class="lineno"> 2100</span> </div>
-<div class="line"><a name="l02101"></a><span class="lineno"> 2101</span>         <span class="keywordflow">if</span>(srcnodata_opt.size()){</div>
-<div class="line"><a name="l02102"></a><span class="lineno"> 2102</span>           <span class="keywordflow">for</span>(<span class="keywordtype">int</span> vband=0;vband<bndnodata_opt.size();++vband){</div>
-<div class="line"><a name="l02103"></a><span class="lineno"> 2103</span>             <span class="keywordtype">double</span> value=((readValues[bndnodata_opt[vband]])[j-ulj])[i-uli];</div>
-<div class="line"><a name="l02104"></a><span class="lineno"> 2104</span>             <span class="keywordflow">if</span>(value==srcnodata_opt[vband]){</div>
-<div class="line"><a name="l02105"></a><span class="lineno"> 2105</span>               valid=<span class="keyword">false</span>;</div>
-<div class="line"><a name="l02106"></a><span class="lineno"> 2106</span>               <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l02107"></a><span class="lineno"> 2107</span>             }</div>
-<div class="line"><a name="l02108"></a><span class="lineno"> 2108</span>           }</div>
-<div class="line"><a name="l02109"></a><span class="lineno"> 2109</span>         }</div>
-<div class="line"><a name="l02110"></a><span class="lineno"> 2110</span> </div>
-<div class="line"><a name="l02111"></a><span class="lineno"> 2111</span>         <span class="keywordflow">if</span>(!valid)</div>
-<div class="line"><a name="l02112"></a><span class="lineno"> 2112</span>           <span class="keywordflow">continue</span>;</div>
+<div class="line"><a name="l02003"></a><span class="lineno"> 2003</span>         <span class="keywordflow">else</span>{</div>
+<div class="line"><a name="l02004"></a><span class="lineno"> 2004</span>           <span class="comment">//test</span></div>
+<div class="line"><a name="l02005"></a><span class="lineno"> 2005</span>           assert(validFeature);</div>
+<div class="line"><a name="l02006"></a><span class="lineno"> 2006</span>           <span class="keywordflow">if</span>(writeLayer->CreateFeature( writeCentroidFeature ) != OGRERR_NONE ){</div>
+<div class="line"><a name="l02007"></a><span class="lineno"> 2007</span>             std::string errorString=<span class="stringliteral">"Failed to create point feature in ogr vector dataset"</span>;</div>
+<div class="line"><a name="l02008"></a><span class="lineno"> 2008</span>             <span class="keywordflow">throw</span>(errorString);</div>
+<div class="line"><a name="l02009"></a><span class="lineno"> 2009</span>           }</div>
+<div class="line"><a name="l02010"></a><span class="lineno"> 2010</span>         }</div>
+<div class="line"><a name="l02011"></a><span class="lineno"> 2011</span>         OGRFeature::DestroyFeature( writeCentroidFeature );</div>
+<div class="line"><a name="l02012"></a><span class="lineno"> 2012</span>         ++ntotalvalid;</div>
+<div class="line"><a name="l02013"></a><span class="lineno"> 2013</span>         <span class="keywordflow">if</span>(verbose_opt[0])</div>
+<div class="line"><a name="l02014"></a><span class="lineno"> 2014</span>           std::cout << <span class="stringliteral">"ntotalvalid: "</span> << ntotalvalid << std::endl;</div>
+<div class="line"><a name="l02015"></a><span class="lineno"> 2015</span>           }</div>
+<div class="line"><a name="l02016"></a><span class="lineno"> 2016</span>         }</div>
+<div class="line"><a name="l02017"></a><span class="lineno"> 2017</span>       }</div>
+<div class="line"><a name="l02018"></a><span class="lineno"> 2018</span>       <span class="keywordflow">else</span> <span class="keywordflow">if</span>(wkbFlatten(poGeometry->getGeometryType()) == wkbMultiPolygon){<span class="comment">//todo: try to use virtual OGRGeometry instead of OGRMultiPolygon and OGRPolygon</span></div>
+<div class="line"><a name="l02019"></a><span class="lineno"> 2019</span>         OGRMultiPolygon readPolygon = *((OGRMultiPolygon *) poGeometry);</div>
+<div class="line"><a name="l02020"></a><span class="lineno"> 2020</span>         OGRPolygon writePolygon;</div>
+<div class="line"><a name="l02021"></a><span class="lineno"> 2021</span>         OGRLinearRing writeRing;</div>
+<div class="line"><a name="l02022"></a><span class="lineno"> 2022</span>         OGRPoint writeCentroidPoint;</div>
+<div class="line"><a name="l02023"></a><span class="lineno"> 2023</span>         OGRFeature *writePolygonFeature;</div>
+<div class="line"><a name="l02024"></a><span class="lineno"> 2024</span>         OGRFeature *writeCentroidFeature;</div>
+<div class="line"><a name="l02025"></a><span class="lineno"> 2025</span> </div>
+<div class="line"><a name="l02026"></a><span class="lineno"> 2026</span>         readPolygon.closeRings();</div>
+<div class="line"><a name="l02027"></a><span class="lineno"> 2027</span> </div>
+<div class="line"><a name="l02028"></a><span class="lineno"> 2028</span>         <span class="keywordflow">if</span>(verbose_opt[0]>1)</div>
+<div class="line"><a name="l02029"></a><span class="lineno"> 2029</span>           std::cout << <span class="stringliteral">"get centroid point from polygon"</span> << std::endl;</div>
+<div class="line"><a name="l02030"></a><span class="lineno"> 2030</span>         readPolygon.Centroid(&writeCentroidPoint);</div>
+<div class="line"><a name="l02031"></a><span class="lineno"> 2031</span> </div>
+<div class="line"><a name="l02032"></a><span class="lineno"> 2032</span>         <span class="keywordtype">double</span> ulx,uly,lrx,lry;</div>
+<div class="line"><a name="l02033"></a><span class="lineno"> 2033</span>         <span class="keywordtype">double</span> uli,ulj,lri,lrj;</div>
+<div class="line"><a name="l02034"></a><span class="lineno"> 2034</span>         <span class="keywordflow">if</span>((polygon_opt[0]&&ruleMap[rule_opt[0]]==rule::point)||(ruleMap[rule_opt[0]]==rule::centroid)){</div>
+<div class="line"><a name="l02035"></a><span class="lineno"> 2035</span>           ulx=writeCentroidPoint.getX();</div>
+<div class="line"><a name="l02036"></a><span class="lineno"> 2036</span>           uly=writeCentroidPoint.getY();</div>
+<div class="line"><a name="l02037"></a><span class="lineno"> 2037</span>           lrx=ulx;</div>
+<div class="line"><a name="l02038"></a><span class="lineno"> 2038</span>           lry=uly;</div>
+<div class="line"><a name="l02039"></a><span class="lineno"> 2039</span>         }</div>
+<div class="line"><a name="l02040"></a><span class="lineno"> 2040</span>         <span class="keywordflow">else</span>{</div>
+<div class="line"><a name="l02041"></a><span class="lineno"> 2041</span>           <span class="comment">//get envelope</span></div>
+<div class="line"><a name="l02042"></a><span class="lineno"> 2042</span>           <span class="keywordflow">if</span>(verbose_opt[0])</div>
+<div class="line"><a name="l02043"></a><span class="lineno"> 2043</span>         std::cout << <span class="stringliteral">"reading envelope for polygon "</span> << ifeature << std::endl;</div>
+<div class="line"><a name="l02044"></a><span class="lineno"> 2044</span>           OGREnvelope* psEnvelope=<span class="keyword">new</span> OGREnvelope();</div>
+<div class="line"><a name="l02045"></a><span class="lineno"> 2045</span>           readPolygon.getEnvelope(psEnvelope);</div>
+<div class="line"><a name="l02046"></a><span class="lineno"> 2046</span>           ulx=psEnvelope->MinX;</div>
+<div class="line"><a name="l02047"></a><span class="lineno"> 2047</span>           uly=psEnvelope->MaxY;</div>
+<div class="line"><a name="l02048"></a><span class="lineno"> 2048</span>           lrx=psEnvelope->MaxX;</div>
+<div class="line"><a name="l02049"></a><span class="lineno"> 2049</span>           lry=psEnvelope->MinY;</div>
+<div class="line"><a name="l02050"></a><span class="lineno"> 2050</span>           <span class="keyword">delete</span> psEnvelope;</div>
+<div class="line"><a name="l02051"></a><span class="lineno"> 2051</span>         }</div>
+<div class="line"><a name="l02052"></a><span class="lineno"> 2052</span>         <span class="comment">// if(geo_opt[0]){</span></div>
+<div class="line"><a name="l02053"></a><span class="lineno"> 2053</span>           imgReader.geo2image(ulx,uly,uli,ulj);</div>
+<div class="line"><a name="l02054"></a><span class="lineno"> 2054</span>           imgReader.geo2image(lrx,lry,lri,lrj);</div>
+<div class="line"><a name="l02055"></a><span class="lineno"> 2055</span>         <span class="comment">// }</span></div>
+<div class="line"><a name="l02056"></a><span class="lineno"> 2056</span>         <span class="comment">// else{</span></div>
+<div class="line"><a name="l02057"></a><span class="lineno"> 2057</span>         <span class="comment">//   uli=ulx;</span></div>
+<div class="line"><a name="l02058"></a><span class="lineno"> 2058</span>         <span class="comment">//   ulj=uly;</span></div>
+<div class="line"><a name="l02059"></a><span class="lineno"> 2059</span>         <span class="comment">//   lri=lrx;</span></div>
+<div class="line"><a name="l02060"></a><span class="lineno"> 2060</span>         <span class="comment">//   lrj=lry;</span></div>
+<div class="line"><a name="l02061"></a><span class="lineno"> 2061</span>         <span class="comment">// }</span></div>
+<div class="line"><a name="l02062"></a><span class="lineno"> 2062</span>         <span class="comment">//nearest neighbour</span></div>
+<div class="line"><a name="l02063"></a><span class="lineno"> 2063</span>         ulj=<span class="keyword">static_cast<</span><span class="keywordtype">int</span><span class="keyword">></span>(ulj);</div>
+<div class="line"><a name="l02064"></a><span class="lineno"> 2064</span>         uli=<span class="keyword">static_cast<</span><span class="keywordtype">int</span><span class="keyword">></span>(uli);</div>
+<div class="line"><a name="l02065"></a><span class="lineno"> 2065</span>         lrj=<span class="keyword">static_cast<</span><span class="keywordtype">int</span><span class="keyword">></span>(lrj);</div>
+<div class="line"><a name="l02066"></a><span class="lineno"> 2066</span>         lri=<span class="keyword">static_cast<</span><span class="keywordtype">int</span><span class="keyword">></span>(lri);</div>
+<div class="line"><a name="l02067"></a><span class="lineno"> 2067</span>         <span class="comment">//iterate through all pixels</span></div>
+<div class="line"><a name="l02068"></a><span class="lineno"> 2068</span>         <span class="keywordflow">if</span>(verbose_opt[0]>1)</div>
+<div class="line"><a name="l02069"></a><span class="lineno"> 2069</span>           std::cout << <span class="stringliteral">"bounding box for multipologon feature "</span> << ifeature << <span class="stringliteral">": "</span> << uli << <span class="stringliteral">" "</span> << ulj << <span class="stringliteral">" "</span> << lri << <span class="stringliteral">" "</span> <<  [...]
+<div class="line"><a name="l02070"></a><span class="lineno"> 2070</span> </div>
+<div class="line"><a name="l02071"></a><span class="lineno"> 2071</span>         <span class="keywordflow">if</span>(uli<0)</div>
+<div class="line"><a name="l02072"></a><span class="lineno"> 2072</span>           uli=0;</div>
+<div class="line"><a name="l02073"></a><span class="lineno"> 2073</span>         <span class="keywordflow">if</span>(lri<0)</div>
+<div class="line"><a name="l02074"></a><span class="lineno"> 2074</span>           lri=0;</div>
+<div class="line"><a name="l02075"></a><span class="lineno"> 2075</span>         <span class="keywordflow">if</span>(uli>=imgReader.nrOfCol())</div>
+<div class="line"><a name="l02076"></a><span class="lineno"> 2076</span>           uli=imgReader.nrOfCol()-1;</div>
+<div class="line"><a name="l02077"></a><span class="lineno"> 2077</span>         <span class="keywordflow">if</span>(lri>=imgReader.nrOfCol())</div>
+<div class="line"><a name="l02078"></a><span class="lineno"> 2078</span>           lri=imgReader.nrOfCol()-1;</div>
+<div class="line"><a name="l02079"></a><span class="lineno"> 2079</span>         <span class="keywordflow">if</span>(ulj<0)</div>
+<div class="line"><a name="l02080"></a><span class="lineno"> 2080</span>           ulj=0;</div>
+<div class="line"><a name="l02081"></a><span class="lineno"> 2081</span>         <span class="keywordflow">if</span>(lrj<0)</div>
+<div class="line"><a name="l02082"></a><span class="lineno"> 2082</span>           lrj=0;</div>
+<div class="line"><a name="l02083"></a><span class="lineno"> 2083</span>         <span class="keywordflow">if</span>(ulj>=imgReader.nrOfRow())</div>
+<div class="line"><a name="l02084"></a><span class="lineno"> 2084</span>           ulj=imgReader.nrOfRow()-1;</div>
+<div class="line"><a name="l02085"></a><span class="lineno"> 2085</span>         <span class="keywordflow">if</span>(lrj>=imgReader.nrOfRow())</div>
+<div class="line"><a name="l02086"></a><span class="lineno"> 2086</span>           lrj=imgReader.nrOfRow()-1;</div>
+<div class="line"><a name="l02087"></a><span class="lineno"> 2087</span>         <span class="comment">// if(uli<0||lri>=imgReader.nrOfCol()||ulj<0||lrj>=imgReader.nrOfRow())</span></div>
+<div class="line"><a name="l02088"></a><span class="lineno"> 2088</span>         <span class="comment">//   continue;</span></div>
+<div class="line"><a name="l02089"></a><span class="lineno"> 2089</span> </div>
+<div class="line"><a name="l02090"></a><span class="lineno"> 2090</span>         <span class="keywordtype">int</span> nPointPolygon=0;</div>
+<div class="line"><a name="l02091"></a><span class="lineno"> 2091</span>         <span class="keywordflow">if</span>(polygon_opt[0]){</div>
+<div class="line"><a name="l02092"></a><span class="lineno"> 2092</span>           <span class="keywordflow">if</span>(writeTest)</div>
+<div class="line"><a name="l02093"></a><span class="lineno"> 2093</span>         writePolygonFeature = OGRFeature::CreateFeature(writeTestLayer->GetLayerDefn());</div>
+<div class="line"><a name="l02094"></a><span class="lineno"> 2094</span>           <span class="keywordflow">else</span></div>
+<div class="line"><a name="l02095"></a><span class="lineno"> 2095</span>         writePolygonFeature = OGRFeature::CreateFeature(writeLayer->GetLayerDefn());</div>
+<div class="line"><a name="l02096"></a><span class="lineno"> 2096</span>         }</div>
+<div class="line"><a name="l02097"></a><span class="lineno"> 2097</span>         <span class="keywordflow">else</span> <span class="keywordflow">if</span>(ruleMap[rule_opt[0]]!=rule::point){</div>
+<div class="line"><a name="l02098"></a><span class="lineno"> 2098</span>           <span class="keywordflow">if</span>(writeTest)</div>
+<div class="line"><a name="l02099"></a><span class="lineno"> 2099</span>         writeCentroidFeature = OGRFeature::CreateFeature(writeTestLayer->GetLayerDefn());</div>
+<div class="line"><a name="l02100"></a><span class="lineno"> 2100</span>           <span class="keywordflow">else</span></div>
+<div class="line"><a name="l02101"></a><span class="lineno"> 2101</span>         writeCentroidFeature = OGRFeature::CreateFeature(writeLayer->GetLayerDefn());</div>
+<div class="line"><a name="l02102"></a><span class="lineno"> 2102</span>         }</div>
+<div class="line"><a name="l02103"></a><span class="lineno"> 2103</span>         <span class="comment">// vector<double> polyValues;</span></div>
+<div class="line"><a name="l02104"></a><span class="lineno"> 2104</span>         <a class="code" href="classVector2d.html">Vector2d<double></a> polyValues;</div>
+<div class="line"><a name="l02105"></a><span class="lineno"> 2105</span>         vector<double> polyClassValues;</div>
+<div class="line"><a name="l02106"></a><span class="lineno"> 2106</span> </div>
+<div class="line"><a name="l02107"></a><span class="lineno"> 2107</span>         <span class="keywordflow">if</span>(class_opt.size()){</div>
+<div class="line"><a name="l02108"></a><span class="lineno"> 2108</span>           polyClassValues.resize(class_opt.size());</div>
+<div class="line"><a name="l02109"></a><span class="lineno"> 2109</span>           <span class="comment">//initialize</span></div>
+<div class="line"><a name="l02110"></a><span class="lineno"> 2110</span>           <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iclass=0;iclass<class_opt.size();++iclass)</div>
+<div class="line"><a name="l02111"></a><span class="lineno"> 2111</span>         polyClassValues[iclass]=0;</div>
+<div class="line"><a name="l02112"></a><span class="lineno"> 2112</span>         }</div>
 <div class="line"><a name="l02113"></a><span class="lineno"> 2113</span>         <span class="keywordflow">else</span></div>
-<div class="line"><a name="l02114"></a><span class="lineno"> 2114</span>           validFeature=<span class="keyword">true</span>;</div>
-<div class="line"><a name="l02115"></a><span class="lineno"> 2115</span>         </div>
-<div class="line"><a name="l02116"></a><span class="lineno"> 2116</span>         writeRing.addPoint(&thePoint);</div>
-<div class="line"><a name="l02117"></a><span class="lineno"> 2117</span>         <span class="comment">// if(writeRing.isPointOnRingBoundary(&thePoint))</span></div>
-<div class="line"><a name="l02118"></a><span class="lineno"> 2118</span>         <span class="comment">//    writeRing.addPoint(&thePoint);</span></div>
-<div class="line"><a name="l02119"></a><span class="lineno"> 2119</span>         <span class="keywordflow">if</span>(verbose_opt[0]>1)</div>
-<div class="line"><a name="l02120"></a><span class="lineno"> 2120</span>             std::cout << <span class="stringliteral">"point is on surface:"</span> << thePoint.getX() << <span class="stringliteral">","</span> << thePoint.getY() << std::endl;</div>
-<div class="line"><a name="l02121"></a><span class="lineno"> 2121</span>           ++nPointPolygon;</div>
-<div class="line"><a name="l02122"></a><span class="lineno"> 2122</span> </div>
-<div class="line"><a name="l02123"></a><span class="lineno"> 2123</span>           <span class="keywordflow">if</span>(polythreshold_opt.size())</div>
-<div class="line"><a name="l02124"></a><span class="lineno"> 2124</span>             <span class="keywordflow">if</span>(nPointPolygon>polythreshold_opt[0])</div>
-<div class="line"><a name="l02125"></a><span class="lineno"> 2125</span>               <span class="keywordflow">continue</span>;</div>
-<div class="line"><a name="l02126"></a><span class="lineno"> 2126</span>           <span class="comment">// throw(nPointPolygon);</span></div>
-<div class="line"><a name="l02127"></a><span class="lineno"> 2127</span>           OGRFeature *writePointFeature;</div>
-<div class="line"><a name="l02128"></a><span class="lineno"> 2128</span>           <span class="keywordflow">if</span>(!polygon_opt[0]){</div>
-<div class="line"><a name="l02129"></a><span class="lineno"> 2129</span>             <span class="comment">//create feature</span></div>
-<div class="line"><a name="l02130"></a><span class="lineno"> 2130</span>             <span class="keywordflow">if</span>(ruleMap[rule_opt[0]]==rule::point){<span class="comment">//do not create in case of mean, stdev, median or sum (only create point at centroid)</span></div>
-<div class="line"><a name="l02131"></a><span class="lineno"> 2131</span>               <span class="keywordflow">if</span>(writeTest)</div>
-<div class="line"><a name="l02132"></a><span class="lineno"> 2132</span>             writePointFeature = OGRFeature::CreateFeature(writeTestLayer->GetLayerDefn());</div>
-<div class="line"><a name="l02133"></a><span class="lineno"> 2133</span>               <span class="keywordflow">else</span></div>
-<div class="line"><a name="l02134"></a><span class="lineno"> 2134</span>             writePointFeature = OGRFeature::CreateFeature(writeLayer->GetLayerDefn());</div>
-<div class="line"><a name="l02135"></a><span class="lineno"> 2135</span>               <span class="keywordflow">if</span>(verbose_opt[0]>1)</div>
-<div class="line"><a name="l02136"></a><span class="lineno"> 2136</span>             std::cout << <span class="stringliteral">"copying fields from polygons "</span> << std::endl;</div>
-<div class="line"><a name="l02137"></a><span class="lineno"> 2137</span>               <span class="comment">//test</span></div>
-<div class="line"><a name="l02138"></a><span class="lineno"> 2138</span>               <span class="comment">// writePointFeature->SetGeometry(&thePoint);</span></div>
-<div class="line"><a name="l02139"></a><span class="lineno"> 2139</span>               <span class="keywordflow">if</span>(writePointFeature->SetFrom(readFeature)!= OGRERR_NONE)</div>
-<div class="line"><a name="l02140"></a><span class="lineno"> 2140</span>             cerr << <span class="stringliteral">"writing feature failed"</span> << std::endl;</div>
-<div class="line"><a name="l02141"></a><span class="lineno"> 2141</span>               <span class="comment">//test</span></div>
-<div class="line"><a name="l02142"></a><span class="lineno"> 2142</span>               writePointFeature->SetGeometry(&thePoint);</div>
-<div class="line"><a name="l02143"></a><span class="lineno"> 2143</span>               assert(wkbFlatten(writePointFeature->GetGeometryRef()->getGeometryType()) == wkbPoint);</div>
-<div class="line"><a name="l02144"></a><span class="lineno"> 2144</span>               <span class="comment">// OGRGeometry *updateGeometry;</span></div>
-<div class="line"><a name="l02145"></a><span class="lineno"> 2145</span>               <span class="comment">// updateGeometry = writePointFeature->GetGeometryRef();</span></div>
-<div class="line"><a name="l02146"></a><span class="lineno"> 2146</span>               <span class="comment">// OGRPoint *poPoint = (OGRPoint *) updateGeometry;</span></div>
-<div class="line"><a name="l02147"></a><span class="lineno"> 2147</span>               <span class="keywordflow">if</span>(verbose_opt[0]>1)</div>
-<div class="line"><a name="l02148"></a><span class="lineno"> 2148</span>             std::cout << <span class="stringliteral">"write feature has "</span> << writePointFeature->GetFieldCount() << <span class="stringliteral">" fields"</span> << std::endl;</div>
-<div class="line"><a name="l02149"></a><span class="lineno"> 2149</span>             }</div>
-<div class="line"><a name="l02150"></a><span class="lineno"> 2150</span>           }</div>
-<div class="line"><a name="l02151"></a><span class="lineno"> 2151</span>           <span class="keywordflow">if</span>(class_opt.size()){</div>
-<div class="line"><a name="l02152"></a><span class="lineno"> 2152</span>             <span class="keywordtype">short</span> value=((readValues[0])[j-ulj])[i-uli];</div>
-<div class="line"><a name="l02153"></a><span class="lineno"> 2153</span>             <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iclass=0;iclass<class_opt.size();++iclass){</div>
-<div class="line"><a name="l02154"></a><span class="lineno"> 2154</span>               <span class="keywordflow">if</span>(value==class_opt[iclass])</div>
-<div class="line"><a name="l02155"></a><span class="lineno"> 2155</span>             polyClassValues[iclass]+=1;</div>
-<div class="line"><a name="l02156"></a><span class="lineno"> 2156</span>             }</div>
-<div class="line"><a name="l02157"></a><span class="lineno"> 2157</span>           }</div>
-<div class="line"><a name="l02158"></a><span class="lineno"> 2158</span>           <span class="keywordflow">else</span>{</div>
-<div class="line"><a name="l02159"></a><span class="lineno"> 2159</span>             <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iband=0;iband<nband;++iband){</div>
-<div class="line"><a name="l02160"></a><span class="lineno"> 2160</span>               <span class="comment">//test</span></div>
-<div class="line"><a name="l02161"></a><span class="lineno"> 2161</span>               assert(j-ulj>=0);</div>
-<div class="line"><a name="l02162"></a><span class="lineno"> 2162</span>               assert(j-ulj<readValues[iband].size());</div>
-<div class="line"><a name="l02163"></a><span class="lineno"> 2163</span>               assert(i-uli>=0);</div>
-<div class="line"><a name="l02164"></a><span class="lineno"> 2164</span>               assert(i-uli<((readValues[iband])[j-ulj]).size());</div>
-<div class="line"><a name="l02165"></a><span class="lineno"> 2165</span>               <span class="keywordtype">double</span> value=((readValues[iband])[j-ulj])[i-uli];</div>
-<div class="line"><a name="l02166"></a><span class="lineno"> 2166</span>               <span class="comment">// imgReader.readData(value,GDT_Float64,i,j,theBand);</span></div>
-<div class="line"><a name="l02167"></a><span class="lineno"> 2167</span>               <span class="keywordflow">if</span>(verbose_opt[0]>1)</div>
-<div class="line"><a name="l02168"></a><span class="lineno"> 2168</span>             std::cout << <span class="stringliteral">": "</span> << value << std::endl;</div>
-<div class="line"><a name="l02169"></a><span class="lineno"> 2169</span>               <span class="keywordflow">if</span>(polygon_opt[0]||ruleMap[rule_opt[0]]!=rule::point)</div>
-<div class="line"><a name="l02170"></a><span class="lineno"> 2170</span>             polyValues[iband].push_back(value);</div>
-<div class="line"><a name="l02171"></a><span class="lineno"> 2171</span>               <span class="keywordflow">else</span>{</div>
-<div class="line"><a name="l02172"></a><span class="lineno"> 2172</span>             <span class="keywordflow">if</span>(verbose_opt[0]>1)</div>
-<div class="line"><a name="l02173"></a><span class="lineno"> 2173</span>               std::cout << <span class="stringliteral">"set field "</span> << fieldname_opt[iband] << <span class="stringliteral">" to "</span> << value << std::endl;</div>
-<div class="line"><a name="l02174"></a><span class="lineno"> 2174</span>             <span class="keywordflow">switch</span>( fieldType ){</div>
-<div class="line"><a name="l02175"></a><span class="lineno"> 2175</span>             <span class="keywordflow">case</span> OFTInteger:</div>
-<div class="line"><a name="l02176"></a><span class="lineno"> 2176</span>             <span class="keywordflow">case</span> OFTReal:</div>
-<div class="line"><a name="l02177"></a><span class="lineno"> 2177</span>               writePointFeature->SetField(fieldname_opt[iband].c_str(),value);</div>
-<div class="line"><a name="l02178"></a><span class="lineno"> 2178</span>               <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l02179"></a><span class="lineno"> 2179</span>             <span class="keywordflow">case</span> OFTString:</div>
-<div class="line"><a name="l02180"></a><span class="lineno"> 2180</span>               writePointFeature->SetField(fieldname_opt[iband].c_str(),type2string<double>(value).c_str());</div>
-<div class="line"><a name="l02181"></a><span class="lineno"> 2181</span>               <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l02182"></a><span class="lineno"> 2182</span>               <span class="comment">// case OFTRealList:{</span></div>
-<div class="line"><a name="l02183"></a><span class="lineno"> 2183</span>               <span class="comment">//   int fieldIndex=writePointFeature->GetFieldIndex(fieldname_opt[iband].c_str());</span></div>
-<div class="line"><a name="l02184"></a><span class="lineno"> 2184</span>               <span class="comment">//   int nCount;</span></div>
-<div class="line"><a name="l02185"></a><span class="lineno"> 2185</span>               <span class="comment">//   const double *theList;</span></div>
-<div class="line"><a name="l02186"></a><span class="lineno"> 2186</span>               <span class="comment">//   theList=writePointFeature->GetFieldAsDoubleList(fieldIndex,&nCount);</span></div>
-<div class="line"><a name="l02187"></a><span class="lineno"> 2187</span>               <span class="comment">//   vector<double> vectorList(nCount+1);</span></div>
-<div class="line"><a name="l02188"></a><span class="lineno"> 2188</span>               <span class="comment">//   for(int index=0;index<nCount;++index)</span></div>
-<div class="line"><a name="l02189"></a><span class="lineno"> 2189</span>               <span class="comment">//    vectorList[nCount]=value;</span></div>
-<div class="line"><a name="l02190"></a><span class="lineno"> 2190</span>               <span class="comment">//   writePointFeature->SetField(fieldIndex,vectorList.size(),&(vectorList[0]));</span></div>
-<div class="line"><a name="l02191"></a><span class="lineno"> 2191</span>               <span class="comment">//   break;</span></div>
-<div class="line"><a name="l02192"></a><span class="lineno"> 2192</span>               <span class="comment">// }</span></div>
-<div class="line"><a name="l02193"></a><span class="lineno"> 2193</span>             <span class="keywordflow">default</span>:<span class="comment">//not supported</span></div>
-<div class="line"><a name="l02194"></a><span class="lineno"> 2194</span>               assert(0);</div>
-<div class="line"><a name="l02195"></a><span class="lineno"> 2195</span>               <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l02114"></a><span class="lineno"> 2114</span>           polyValues.resize(nband);</div>
+<div class="line"><a name="l02115"></a><span class="lineno"> 2115</span>         vector< Vector2d<double> > readValues(nband);</div>
+<div class="line"><a name="l02116"></a><span class="lineno"> 2116</span>         <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iband=0;iband<nband;++iband){</div>
+<div class="line"><a name="l02117"></a><span class="lineno"> 2117</span>           <span class="keywordtype">int</span> theBand=(band_opt.size()) ? band_opt[iband] : iband;</div>
+<div class="line"><a name="l02118"></a><span class="lineno"> 2118</span>           imgReader.readDataBlock(readValues[iband],GDT_Float64,uli,lri,ulj,lrj,theBand);</div>
+<div class="line"><a name="l02119"></a><span class="lineno"> 2119</span>         }</div>
+<div class="line"><a name="l02120"></a><span class="lineno"> 2120</span> </div>
+<div class="line"><a name="l02121"></a><span class="lineno"> 2121</span>         OGRPoint thePoint;</div>
+<div class="line"><a name="l02122"></a><span class="lineno"> 2122</span>         <span class="keywordflow">for</span>(<span class="keywordtype">int</span> j=ulj;j<=lrj;++j){</div>
+<div class="line"><a name="l02123"></a><span class="lineno"> 2123</span>           <span class="keywordflow">for</span>(<span class="keywordtype">int</span> i=uli;i<=lri;++i){</div>
+<div class="line"><a name="l02124"></a><span class="lineno"> 2124</span>         <span class="comment">//check if within raster image</span></div>
+<div class="line"><a name="l02125"></a><span class="lineno"> 2125</span>         <span class="keywordflow">if</span>(i<0||i>=imgReader.nrOfCol())</div>
+<div class="line"><a name="l02126"></a><span class="lineno"> 2126</span>           <span class="keywordflow">continue</span>;</div>
+<div class="line"><a name="l02127"></a><span class="lineno"> 2127</span>         <span class="keywordflow">if</span>(j<0||j>=imgReader.nrOfRow())</div>
+<div class="line"><a name="l02128"></a><span class="lineno"> 2128</span>           <span class="keywordflow">continue</span>;</div>
+<div class="line"><a name="l02129"></a><span class="lineno"> 2129</span>         <span class="comment">//check if point is on surface</span></div>
+<div class="line"><a name="l02130"></a><span class="lineno"> 2130</span>         <span class="keywordtype">double</span> theX=0;</div>
+<div class="line"><a name="l02131"></a><span class="lineno"> 2131</span>         <span class="keywordtype">double</span> theY=0;</div>
+<div class="line"><a name="l02132"></a><span class="lineno"> 2132</span>         imgReader.image2geo(i,j,theX,theY);</div>
+<div class="line"><a name="l02133"></a><span class="lineno"> 2133</span>         thePoint.setX(theX);</div>
+<div class="line"><a name="l02134"></a><span class="lineno"> 2134</span>         thePoint.setY(theY);</div>
+<div class="line"><a name="l02135"></a><span class="lineno"> 2135</span> </div>
+<div class="line"><a name="l02136"></a><span class="lineno"> 2136</span>         <span class="keywordflow">if</span>(ruleMap[rule_opt[0]]!=rule::centroid&&!readPolygon.Contains(&thePoint))</div>
+<div class="line"><a name="l02137"></a><span class="lineno"> 2137</span>           <span class="keywordflow">continue</span>;</div>
+<div class="line"><a name="l02138"></a><span class="lineno"> 2138</span> </div>
+<div class="line"><a name="l02139"></a><span class="lineno"> 2139</span>         <span class="keywordtype">bool</span> valid=<span class="keyword">true</span>;</div>
+<div class="line"><a name="l02140"></a><span class="lineno"> 2140</span> </div>
+<div class="line"><a name="l02141"></a><span class="lineno"> 2141</span>         <span class="keywordflow">if</span>(srcnodata_opt.size()){</div>
+<div class="line"><a name="l02142"></a><span class="lineno"> 2142</span>           <span class="keywordflow">for</span>(<span class="keywordtype">int</span> vband=0;vband<bndnodata_opt.size();++vband){</div>
+<div class="line"><a name="l02143"></a><span class="lineno"> 2143</span>             <span class="keywordtype">double</span> value=((readValues[bndnodata_opt[vband]])[j-ulj])[i-uli];</div>
+<div class="line"><a name="l02144"></a><span class="lineno"> 2144</span>             <span class="keywordflow">if</span>(value==srcnodata_opt[vband]){</div>
+<div class="line"><a name="l02145"></a><span class="lineno"> 2145</span>               valid=<span class="keyword">false</span>;</div>
+<div class="line"><a name="l02146"></a><span class="lineno"> 2146</span>               <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l02147"></a><span class="lineno"> 2147</span>             }</div>
+<div class="line"><a name="l02148"></a><span class="lineno"> 2148</span>           }</div>
+<div class="line"><a name="l02149"></a><span class="lineno"> 2149</span>         }</div>
+<div class="line"><a name="l02150"></a><span class="lineno"> 2150</span> </div>
+<div class="line"><a name="l02151"></a><span class="lineno"> 2151</span>         <span class="keywordflow">if</span>(!valid)</div>
+<div class="line"><a name="l02152"></a><span class="lineno"> 2152</span>           <span class="keywordflow">continue</span>;</div>
+<div class="line"><a name="l02153"></a><span class="lineno"> 2153</span>         <span class="keywordflow">else</span></div>
+<div class="line"><a name="l02154"></a><span class="lineno"> 2154</span>           validFeature=<span class="keyword">true</span>;</div>
+<div class="line"><a name="l02155"></a><span class="lineno"> 2155</span>         </div>
+<div class="line"><a name="l02156"></a><span class="lineno"> 2156</span>         writeRing.addPoint(&thePoint);</div>
+<div class="line"><a name="l02157"></a><span class="lineno"> 2157</span>         <span class="comment">// if(writeRing.isPointOnRingBoundary(&thePoint))</span></div>
+<div class="line"><a name="l02158"></a><span class="lineno"> 2158</span>         <span class="comment">//    writeRing.addPoint(&thePoint);</span></div>
+<div class="line"><a name="l02159"></a><span class="lineno"> 2159</span>         <span class="keywordflow">if</span>(verbose_opt[0]>1)</div>
+<div class="line"><a name="l02160"></a><span class="lineno"> 2160</span>             std::cout << <span class="stringliteral">"point is on surface:"</span> << thePoint.getX() << <span class="stringliteral">","</span> << thePoint.getY() << std::endl;</div>
+<div class="line"><a name="l02161"></a><span class="lineno"> 2161</span>           ++nPointPolygon;</div>
+<div class="line"><a name="l02162"></a><span class="lineno"> 2162</span> </div>
+<div class="line"><a name="l02163"></a><span class="lineno"> 2163</span>           <span class="keywordflow">if</span>(polythreshold_opt.size())</div>
+<div class="line"><a name="l02164"></a><span class="lineno"> 2164</span>             <span class="keywordflow">if</span>(nPointPolygon>polythreshold_opt[0])</div>
+<div class="line"><a name="l02165"></a><span class="lineno"> 2165</span>               <span class="keywordflow">continue</span>;</div>
+<div class="line"><a name="l02166"></a><span class="lineno"> 2166</span>           <span class="comment">// throw(nPointPolygon);</span></div>
+<div class="line"><a name="l02167"></a><span class="lineno"> 2167</span>           OGRFeature *writePointFeature;</div>
+<div class="line"><a name="l02168"></a><span class="lineno"> 2168</span>           <span class="keywordflow">if</span>(!polygon_opt[0]){</div>
+<div class="line"><a name="l02169"></a><span class="lineno"> 2169</span>             <span class="comment">//create feature</span></div>
+<div class="line"><a name="l02170"></a><span class="lineno"> 2170</span>             <span class="keywordflow">if</span>(ruleMap[rule_opt[0]]==rule::point){<span class="comment">//do not create in case of mean, stdev, median or sum (only create point at centroid)</span></div>
+<div class="line"><a name="l02171"></a><span class="lineno"> 2171</span>               <span class="keywordflow">if</span>(writeTest)</div>
+<div class="line"><a name="l02172"></a><span class="lineno"> 2172</span>             writePointFeature = OGRFeature::CreateFeature(writeTestLayer->GetLayerDefn());</div>
+<div class="line"><a name="l02173"></a><span class="lineno"> 2173</span>               <span class="keywordflow">else</span></div>
+<div class="line"><a name="l02174"></a><span class="lineno"> 2174</span>             writePointFeature = OGRFeature::CreateFeature(writeLayer->GetLayerDefn());</div>
+<div class="line"><a name="l02175"></a><span class="lineno"> 2175</span>               <span class="keywordflow">if</span>(verbose_opt[0]>1)</div>
+<div class="line"><a name="l02176"></a><span class="lineno"> 2176</span>             std::cout << <span class="stringliteral">"copying fields from polygons "</span> << std::endl;</div>
+<div class="line"><a name="l02177"></a><span class="lineno"> 2177</span>               <span class="keywordflow">if</span>(writePointFeature->SetFrom(readFeature)!= OGRERR_NONE)</div>
+<div class="line"><a name="l02178"></a><span class="lineno"> 2178</span>             cerr << <span class="stringliteral">"writing feature failed"</span> << std::endl;</div>
+<div class="line"><a name="l02179"></a><span class="lineno"> 2179</span>               <span class="keywordflow">if</span>(verbose_opt[0]>1)</div>
+<div class="line"><a name="l02180"></a><span class="lineno"> 2180</span>             std::cout << <span class="stringliteral">"set geometry as point "</span> << std::endl;</div>
+<div class="line"><a name="l02181"></a><span class="lineno"> 2181</span>               <span class="comment">//test</span></div>
+<div class="line"><a name="l02182"></a><span class="lineno"> 2182</span>               writePointFeature->SetGeometry(&thePoint);</div>
+<div class="line"><a name="l02183"></a><span class="lineno"> 2183</span>               assert(wkbFlatten(writePointFeature->GetGeometryRef()->getGeometryType()) == wkbPoint);</div>
+<div class="line"><a name="l02184"></a><span class="lineno"> 2184</span>               <span class="comment">// OGRGeometry *updateGeometry;</span></div>
+<div class="line"><a name="l02185"></a><span class="lineno"> 2185</span>               <span class="comment">// updateGeometry = writePointFeature->GetGeometryRef();</span></div>
+<div class="line"><a name="l02186"></a><span class="lineno"> 2186</span>               <span class="comment">// OGRPoint *poPoint = (OGRPoint *) updateGeometry;</span></div>
+<div class="line"><a name="l02187"></a><span class="lineno"> 2187</span>               <span class="keywordflow">if</span>(verbose_opt[0]>1)</div>
+<div class="line"><a name="l02188"></a><span class="lineno"> 2188</span>             std::cout << <span class="stringliteral">"write feature has "</span> << writePointFeature->GetFieldCount() << <span class="stringliteral">" fields"</span> << std::endl;</div>
+<div class="line"><a name="l02189"></a><span class="lineno"> 2189</span>             }</div>
+<div class="line"><a name="l02190"></a><span class="lineno"> 2190</span>           }</div>
+<div class="line"><a name="l02191"></a><span class="lineno"> 2191</span>           <span class="keywordflow">if</span>(class_opt.size()){</div>
+<div class="line"><a name="l02192"></a><span class="lineno"> 2192</span>             <span class="keywordtype">short</span> value=((readValues[0])[j-ulj])[i-uli];</div>
+<div class="line"><a name="l02193"></a><span class="lineno"> 2193</span>             <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iclass=0;iclass<class_opt.size();++iclass){</div>
+<div class="line"><a name="l02194"></a><span class="lineno"> 2194</span>               <span class="keywordflow">if</span>(value==class_opt[iclass])</div>
+<div class="line"><a name="l02195"></a><span class="lineno"> 2195</span>             polyClassValues[iclass]+=1;</div>
 <div class="line"><a name="l02196"></a><span class="lineno"> 2196</span>             }</div>
-<div class="line"><a name="l02197"></a><span class="lineno"> 2197</span>               }<span class="comment">//else</span></div>
-<div class="line"><a name="l02198"></a><span class="lineno"> 2198</span>             }<span class="comment">//iband</span></div>
-<div class="line"><a name="l02199"></a><span class="lineno"> 2199</span>           }<span class="comment">//else (class_opt.size())</span></div>
-<div class="line"><a name="l02200"></a><span class="lineno"> 2200</span>           <span class="keywordflow">if</span>(!polygon_opt[0]){</div>
-<div class="line"><a name="l02201"></a><span class="lineno"> 2201</span>             <span class="keywordflow">if</span>(ruleMap[rule_opt[0]]==rule::point){<span class="comment">//do not create in case of mean, stdev or median value (only at centroid)</span></div>
-<div class="line"><a name="l02202"></a><span class="lineno"> 2202</span>               <span class="comment">//write feature</span></div>
-<div class="line"><a name="l02203"></a><span class="lineno"> 2203</span>               <span class="keywordflow">if</span>(verbose_opt[0]>1)</div>
-<div class="line"><a name="l02204"></a><span class="lineno"> 2204</span>             std::cout << <span class="stringliteral">"creating point feature"</span> << std::endl;</div>
-<div class="line"><a name="l02205"></a><span class="lineno"> 2205</span>               <span class="keywordflow">if</span>(writeTest){</div>
-<div class="line"><a name="l02206"></a><span class="lineno"> 2206</span>             <span class="keywordflow">if</span>(writeTestLayer->CreateFeature( writePointFeature ) != OGRERR_NONE ){</div>
-<div class="line"><a name="l02207"></a><span class="lineno"> 2207</span>               std::string errorString=<span class="stringliteral">"Failed to create feature in ogr vector dataset"</span>;</div>
-<div class="line"><a name="l02208"></a><span class="lineno"> 2208</span>               <span class="keywordflow">throw</span>(errorString);</div>
-<div class="line"><a name="l02209"></a><span class="lineno"> 2209</span>             }</div>
-<div class="line"><a name="l02210"></a><span class="lineno"> 2210</span>               }</div>
-<div class="line"><a name="l02211"></a><span class="lineno"> 2211</span>               <span class="keywordflow">else</span>{</div>
-<div class="line"><a name="l02212"></a><span class="lineno"> 2212</span>             <span class="keywordflow">if</span>(writeLayer->CreateFeature( writePointFeature ) != OGRERR_NONE ){</div>
-<div class="line"><a name="l02213"></a><span class="lineno"> 2213</span>               std::string errorString=<span class="stringliteral">"Failed to create feature in ogr vector dataset"</span>;</div>
-<div class="line"><a name="l02214"></a><span class="lineno"> 2214</span>               <span class="keywordflow">throw</span>(errorString);</div>
-<div class="line"><a name="l02215"></a><span class="lineno"> 2215</span>             }</div>
-<div class="line"><a name="l02216"></a><span class="lineno"> 2216</span>               }</div>
-<div class="line"><a name="l02217"></a><span class="lineno"> 2217</span>               <span class="comment">//destroy feature</span></div>
-<div class="line"><a name="l02218"></a><span class="lineno"> 2218</span>               OGRFeature::DestroyFeature( writePointFeature );</div>
+<div class="line"><a name="l02197"></a><span class="lineno"> 2197</span>           }</div>
+<div class="line"><a name="l02198"></a><span class="lineno"> 2198</span>           <span class="keywordflow">else</span>{</div>
+<div class="line"><a name="l02199"></a><span class="lineno"> 2199</span>             <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iband=0;iband<nband;++iband){</div>
+<div class="line"><a name="l02200"></a><span class="lineno"> 2200</span>               <span class="keywordtype">double</span> value=((readValues[iband])[j-ulj])[i-uli];</div>
+<div class="line"><a name="l02201"></a><span class="lineno"> 2201</span>               <span class="keywordflow">if</span>(verbose_opt[0]>1)</div>
+<div class="line"><a name="l02202"></a><span class="lineno"> 2202</span>             std::cout << <span class="stringliteral">": "</span> << value << std::endl;</div>
+<div class="line"><a name="l02203"></a><span class="lineno"> 2203</span>               <span class="keywordflow">if</span>(polygon_opt[0]||ruleMap[rule_opt[0]]!=rule::point)</div>
+<div class="line"><a name="l02204"></a><span class="lineno"> 2204</span>             polyValues[iband].push_back(value);</div>
+<div class="line"><a name="l02205"></a><span class="lineno"> 2205</span>               <span class="keywordflow">else</span>{</div>
+<div class="line"><a name="l02206"></a><span class="lineno"> 2206</span>             <span class="keywordflow">if</span>(verbose_opt[0]>1)</div>
+<div class="line"><a name="l02207"></a><span class="lineno"> 2207</span>               std::cout << <span class="stringliteral">"set field "</span> << fieldname_opt[iband] << <span class="stringliteral">" to "</span> << value << std::endl;</div>
+<div class="line"><a name="l02208"></a><span class="lineno"> 2208</span>             <span class="keywordflow">switch</span>( fieldType ){</div>
+<div class="line"><a name="l02209"></a><span class="lineno"> 2209</span>             <span class="keywordflow">case</span> OFTInteger:</div>
+<div class="line"><a name="l02210"></a><span class="lineno"> 2210</span>             <span class="keywordflow">case</span> OFTReal:</div>
+<div class="line"><a name="l02211"></a><span class="lineno"> 2211</span>               writePointFeature->SetField(fieldname_opt[iband].c_str(),value);</div>
+<div class="line"><a name="l02212"></a><span class="lineno"> 2212</span>               <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l02213"></a><span class="lineno"> 2213</span>             <span class="keywordflow">case</span> OFTString:</div>
+<div class="line"><a name="l02214"></a><span class="lineno"> 2214</span>               writePointFeature->SetField(fieldname_opt[iband].c_str(),type2string<double>(value).c_str());</div>
+<div class="line"><a name="l02215"></a><span class="lineno"> 2215</span>               <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l02216"></a><span class="lineno"> 2216</span>             <span class="keywordflow">default</span>:<span class="comment">//not supported</span></div>
+<div class="line"><a name="l02217"></a><span class="lineno"> 2217</span>               assert(0);</div>
+<div class="line"><a name="l02218"></a><span class="lineno"> 2218</span>               <span class="keywordflow">break</span>;</div>
 <div class="line"><a name="l02219"></a><span class="lineno"> 2219</span>             }</div>
-<div class="line"><a name="l02220"></a><span class="lineno"> 2220</span>           }</div>
-<div class="line"><a name="l02221"></a><span class="lineno"> 2221</span>           <span class="comment">// ++isample;</span></div>
-<div class="line"><a name="l02222"></a><span class="lineno"> 2222</span>           ++ntotalvalid;</div>
-<div class="line"><a name="l02223"></a><span class="lineno"> 2223</span>           <span class="keywordflow">if</span>(verbose_opt[0])</div>
-<div class="line"><a name="l02224"></a><span class="lineno"> 2224</span>             std::cout << <span class="stringliteral">"ntotalvalid: "</span> << ntotalvalid << std::endl;</div>
-<div class="line"><a name="l02225"></a><span class="lineno"> 2225</span>           }</div>
-<div class="line"><a name="l02226"></a><span class="lineno"> 2226</span>         }</div>
-<div class="line"><a name="l02227"></a><span class="lineno"> 2227</span>         <span class="keywordflow">if</span>(!validFeature)</div>
-<div class="line"><a name="l02228"></a><span class="lineno"> 2228</span>           <span class="keywordflow">continue</span>;</div>
-<div class="line"><a name="l02229"></a><span class="lineno"> 2229</span>         <span class="keywordflow">if</span>(polygon_opt[0]||ruleMap[rule_opt[0]]!=rule::point){</div>
-<div class="line"><a name="l02230"></a><span class="lineno"> 2230</span>           <span class="comment">//do not create if no points found within polygon</span></div>
-<div class="line"><a name="l02231"></a><span class="lineno"> 2231</span>           <span class="keywordflow">if</span>(!nPointPolygon)</div>
-<div class="line"><a name="l02232"></a><span class="lineno"> 2232</span>         <span class="keywordflow">continue</span>;</div>
-<div class="line"><a name="l02233"></a><span class="lineno"> 2233</span>           <span class="comment">//add ring to polygon</span></div>
-<div class="line"><a name="l02234"></a><span class="lineno"> 2234</span>           <span class="keywordflow">if</span>(polygon_opt[0]){</div>
-<div class="line"><a name="l02235"></a><span class="lineno"> 2235</span>         writePolygon.addRing(&writeRing);</div>
-<div class="line"><a name="l02236"></a><span class="lineno"> 2236</span>         writePolygon.closeRings();</div>
-<div class="line"><a name="l02237"></a><span class="lineno"> 2237</span>         <span class="comment">//write geometry of writePolygon</span></div>
-<div class="line"><a name="l02238"></a><span class="lineno"> 2238</span>         <span class="comment">//test</span></div>
-<div class="line"><a name="l02239"></a><span class="lineno"> 2239</span>         <span class="comment">//writePolygon and readFeature are from geometry type wkbMultiPolygon</span></div>
-<div class="line"><a name="l02240"></a><span class="lineno"> 2240</span>         <span class="comment">// writePolygonFeature->SetGeometry(&writePolygon);</span></div>
-<div class="line"><a name="l02241"></a><span class="lineno"> 2241</span>         <span class="keywordflow">if</span>(writePolygonFeature->SetFrom(readFeature)!= OGRERR_NONE)</div>
-<div class="line"><a name="l02242"></a><span class="lineno"> 2242</span>           cerr << <span class="stringliteral">"writing feature failed"</span> << std::endl;</div>
-<div class="line"><a name="l02243"></a><span class="lineno"> 2243</span>         assert(writePolygonFeature->GetGeometryRef()->getGeometryType()==wkbMultiPolygon);</div>
-<div class="line"><a name="l02244"></a><span class="lineno"> 2244</span>         <span class="keywordflow">if</span>(verbose_opt[0]>1)</div>
-<div class="line"><a name="l02245"></a><span class="lineno"> 2245</span>           std::cout << <span class="stringliteral">"copying new fields write polygon "</span> << std::endl;</div>
-<div class="line"><a name="l02246"></a><span class="lineno"> 2246</span>         <span class="keywordflow">if</span>(verbose_opt[0]>1)</div>
-<div class="line"><a name="l02247"></a><span class="lineno"> 2247</span>           std::cout << <span class="stringliteral">"write feature has "</span> << writePolygonFeature->GetFieldCount() << <span class="stringliteral">" fields"</span> << std::endl;</div>
-<div class="line"><a name="l02248"></a><span class="lineno"> 2248</span>         <span class="comment">//write polygon feature</span></div>
-<div class="line"><a name="l02249"></a><span class="lineno"> 2249</span>           }</div>
-<div class="line"><a name="l02250"></a><span class="lineno"> 2250</span>           <span class="keywordflow">else</span>{<span class="comment">//write band information of polygon to centroid point</span></div>
-<div class="line"><a name="l02251"></a><span class="lineno"> 2251</span>         <span class="comment">//create feature</span></div>
-<div class="line"><a name="l02252"></a><span class="lineno"> 2252</span>         <span class="keywordflow">if</span>(verbose_opt[0]>1)</div>
-<div class="line"><a name="l02253"></a><span class="lineno"> 2253</span>           std::cout << <span class="stringliteral">"copying fields from polygons "</span> << std::endl;</div>
-<div class="line"><a name="l02254"></a><span class="lineno"> 2254</span>         <span class="comment">//test</span></div>
-<div class="line"><a name="l02255"></a><span class="lineno"> 2255</span>         <span class="comment">// writeCentroidFeature->SetGeometry(&writeCentroidPoint);</span></div>
-<div class="line"><a name="l02256"></a><span class="lineno"> 2256</span>         <span class="keywordflow">if</span>(writeCentroidFeature->SetFrom(readFeature)!= OGRERR_NONE)</div>
-<div class="line"><a name="l02257"></a><span class="lineno"> 2257</span>           cerr << <span class="stringliteral">"writing feature failed"</span> << std::endl;</div>
-<div class="line"><a name="l02258"></a><span class="lineno"> 2258</span>         writeCentroidFeature->SetGeometry(&writeCentroidPoint);</div>
-<div class="line"><a name="l02259"></a><span class="lineno"> 2259</span>         assert(wkbFlatten(writeCentroidFeature->GetGeometryRef()->getGeometryType()) == wkbPoint);</div>
-<div class="line"><a name="l02260"></a><span class="lineno"> 2260</span>         <span class="comment">//test</span></div>
-<div class="line"><a name="l02261"></a><span class="lineno"> 2261</span>         <span class="comment">// OGRGeometry *updateGeometry;</span></div>
-<div class="line"><a name="l02262"></a><span class="lineno"> 2262</span>         <span class="comment">// updateGeometry = writeCentroidFeature->GetGeometryRef();</span></div>
-<div class="line"><a name="l02263"></a><span class="lineno"> 2263</span>         <span class="comment">// assert(wkbFlatten(updateGeometry->getGeometryType()) == wkbPoint );</span></div>
-<div class="line"><a name="l02264"></a><span class="lineno"> 2264</span>         <span class="keywordflow">if</span>(verbose_opt[0]>1)</div>
-<div class="line"><a name="l02265"></a><span class="lineno"> 2265</span>           std::cout << <span class="stringliteral">"write feature has "</span> << writeCentroidFeature->GetFieldCount() << <span class="stringliteral">" fields"</span> << std::endl;</div>
-<div class="line"><a name="l02266"></a><span class="lineno"> 2266</span>           }</div>
-<div class="line"><a name="l02267"></a><span class="lineno"> 2267</span>           <span class="keywordflow">if</span>(class_opt.empty()){</div>
-<div class="line"><a name="l02268"></a><span class="lineno"> 2268</span>         <span class="keywordflow">if</span>(ruleMap[rule_opt[0]]==rule::point){<span class="comment">//value at centroid of polygon</span></div>
-<div class="line"><a name="l02269"></a><span class="lineno"> 2269</span>           <span class="keywordflow">if</span>(verbose_opt[0])</div>
-<div class="line"><a name="l02270"></a><span class="lineno"> 2270</span>             std::cout << <span class="stringliteral">"number of points in polygon: "</span> << nPointPolygon << std::endl;</div>
-<div class="line"><a name="l02271"></a><span class="lineno"> 2271</span>           <span class="keywordflow">for</span>(<span class="keywordtype">int</span> index=0;index<polyValues.size();++index){</div>
-<div class="line"><a name="l02272"></a><span class="lineno"> 2272</span>             <span class="comment">//test</span></div>
-<div class="line"><a name="l02273"></a><span class="lineno"> 2273</span>             assert(polyValues[index].size()==1);</div>
-<div class="line"><a name="l02274"></a><span class="lineno"> 2274</span>             <span class="keywordtype">double</span> theValue=polyValues[index].back();</div>
-<div class="line"><a name="l02275"></a><span class="lineno"> 2275</span>             <span class="keywordflow">if</span>(verbose_opt[0])</div>
-<div class="line"><a name="l02276"></a><span class="lineno"> 2276</span>               std::cout << <span class="stringliteral">"number of points in polygon: "</span> << nPointPolygon << std::endl;</div>
-<div class="line"><a name="l02277"></a><span class="lineno"> 2277</span>             <span class="keywordtype">int</span> theBand=(band_opt.size()) ? band_opt[index] : index;</div>
-<div class="line"><a name="l02278"></a><span class="lineno"> 2278</span>             <span class="keywordflow">try</span>{</div>
-<div class="line"><a name="l02279"></a><span class="lineno"> 2279</span>               <span class="keywordflow">if</span>(verbose_opt[0]>1)</div>
-<div class="line"><a name="l02280"></a><span class="lineno"> 2280</span>             std::cout << <span class="stringliteral">"set field "</span> << fieldname_opt[index] << <span class="stringliteral">" to "</span> << theValue << std::endl;</div>
-<div class="line"><a name="l02281"></a><span class="lineno"> 2281</span>               <span class="keywordflow">switch</span>( fieldType ){</div>
-<div class="line"><a name="l02282"></a><span class="lineno"> 2282</span>               <span class="keywordflow">case</span> OFTInteger:</div>
-<div class="line"><a name="l02283"></a><span class="lineno"> 2283</span>               <span class="keywordflow">case</span> OFTReal:</div>
-<div class="line"><a name="l02284"></a><span class="lineno"> 2284</span>             <span class="keywordflow">if</span>(polygon_opt[0])</div>
-<div class="line"><a name="l02285"></a><span class="lineno"> 2285</span>               writePolygonFeature->SetField(fieldname_opt[index].c_str(),theValue);</div>
-<div class="line"><a name="l02286"></a><span class="lineno"> 2286</span>             <span class="keywordflow">else</span></div>
-<div class="line"><a name="l02287"></a><span class="lineno"> 2287</span>               writeCentroidFeature->SetField(fieldname_opt[index].c_str(),theValue);</div>
-<div class="line"><a name="l02288"></a><span class="lineno"> 2288</span>             <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l02289"></a><span class="lineno"> 2289</span>               <span class="keywordflow">case</span> OFTString:</div>
-<div class="line"><a name="l02290"></a><span class="lineno"> 2290</span>             <span class="keywordflow">if</span>(polygon_opt[0])</div>
-<div class="line"><a name="l02291"></a><span class="lineno"> 2291</span>               writePolygonFeature->SetField(fieldname_opt[index].c_str(),type2string<double>(theValue).c_str());</div>
-<div class="line"><a name="l02292"></a><span class="lineno"> 2292</span>             <span class="keywordflow">else</span></div>
-<div class="line"><a name="l02293"></a><span class="lineno"> 2293</span>               writeCentroidFeature->SetField(fieldname_opt[index].c_str(),type2string<double>(theValue).c_str());</div>
-<div class="line"><a name="l02294"></a><span class="lineno"> 2294</span>             <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l02295"></a><span class="lineno"> 2295</span>               <span class="keywordflow">default</span>:<span class="comment">//not supported</span></div>
-<div class="line"><a name="l02296"></a><span class="lineno"> 2296</span>             std::string errorString=<span class="stringliteral">"field type not supported"</span>;</div>
-<div class="line"><a name="l02297"></a><span class="lineno"> 2297</span>             <span class="keywordflow">throw</span>(errorString);</div>
-<div class="line"><a name="l02298"></a><span class="lineno"> 2298</span>             <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l02299"></a><span class="lineno"> 2299</span>               }</div>
-<div class="line"><a name="l02300"></a><span class="lineno"> 2300</span>             }</div>
-<div class="line"><a name="l02301"></a><span class="lineno"> 2301</span>             <span class="keywordflow">catch</span>(std::string e){</div>
-<div class="line"><a name="l02302"></a><span class="lineno"> 2302</span>               std::cout << e << std::endl;</div>
-<div class="line"><a name="l02303"></a><span class="lineno"> 2303</span>               exit(1);</div>
-<div class="line"><a name="l02304"></a><span class="lineno"> 2304</span>             }</div>
-<div class="line"><a name="l02305"></a><span class="lineno"> 2305</span>           }</div>
-<div class="line"><a name="l02306"></a><span class="lineno"> 2306</span>         }</div>
-<div class="line"><a name="l02307"></a><span class="lineno"> 2307</span>         <span class="keywordflow">else</span>{<span class="comment">//ruleMap[rule_opt[0]] is not rule::point</span></div>
-<div class="line"><a name="l02308"></a><span class="lineno"> 2308</span>           <span class="keywordtype">double</span> theValue=0;</div>
-<div class="line"><a name="l02309"></a><span class="lineno"> 2309</span>           <span class="keywordflow">for</span>(<span class="keywordtype">int</span> index=0;index<polyValues.size();++index){</div>
-<div class="line"><a name="l02310"></a><span class="lineno"> 2310</span>             <span class="keywordflow">try</span>{</div>
-<div class="line"><a name="l02311"></a><span class="lineno"> 2311</span>               <span class="keywordflow">if</span>(ruleMap[rule_opt[0]]==rule::mean)</div>
-<div class="line"><a name="l02312"></a><span class="lineno"> 2312</span>             theValue=stat.mean(polyValues[index]);</div>
-<div class="line"><a name="l02313"></a><span class="lineno"> 2313</span>               <span class="keywordflow">else</span> <span class="keywordflow">if</span>(ruleMap[rule_opt[0]]==rule::stdev)</div>
-<div class="line"><a name="l02314"></a><span class="lineno"> 2314</span>             theValue=sqrt(stat.var(polyValues[index]));</div>
-<div class="line"><a name="l02315"></a><span class="lineno"> 2315</span>               <span class="keywordflow">else</span> <span class="keywordflow">if</span>(ruleMap[rule_opt[0]]==rule::median)</div>
-<div class="line"><a name="l02316"></a><span class="lineno"> 2316</span>             theValue=stat.median(polyValues[index]);</div>
-<div class="line"><a name="l02317"></a><span class="lineno"> 2317</span>               <span class="keywordflow">else</span> <span class="keywordflow">if</span>(ruleMap[rule_opt[0]]==rule::percentile)</div>
-<div class="line"><a name="l02318"></a><span class="lineno"> 2318</span>             theValue=stat.percentile(polyValues[index],polyValues[index].begin(),polyValues[index].end(),percentile_opt[0]);</div>
-<div class="line"><a name="l02319"></a><span class="lineno"> 2319</span>               <span class="keywordflow">else</span> <span class="keywordflow">if</span>(ruleMap[rule_opt[0]]==rule::sum)</div>
-<div class="line"><a name="l02320"></a><span class="lineno"> 2320</span>             theValue=stat.sum(polyValues[index]);</div>
-<div class="line"><a name="l02321"></a><span class="lineno"> 2321</span>               <span class="keywordflow">else</span> <span class="keywordflow">if</span>(ruleMap[rule_opt[0]]==rule::max)</div>
-<div class="line"><a name="l02322"></a><span class="lineno"> 2322</span>             theValue=stat.mymax(polyValues[index]);</div>
-<div class="line"><a name="l02323"></a><span class="lineno"> 2323</span>               <span class="keywordflow">else</span> <span class="keywordflow">if</span>(ruleMap[rule_opt[0]]==rule::min)</div>
-<div class="line"><a name="l02324"></a><span class="lineno"> 2324</span>             theValue=stat.mymin(polyValues[index]);</div>
-<div class="line"><a name="l02325"></a><span class="lineno"> 2325</span>               <span class="keywordflow">else</span> <span class="keywordflow">if</span>(ruleMap[rule_opt[0]]==rule::centroid){</div>
-<div class="line"><a name="l02326"></a><span class="lineno"> 2326</span>             <span class="keywordflow">if</span>(verbose_opt[0])</div>
-<div class="line"><a name="l02327"></a><span class="lineno"> 2327</span>               std::cout << <span class="stringliteral">"number of points in polygon: "</span> << nPointPolygon << std::endl;</div>
-<div class="line"><a name="l02328"></a><span class="lineno"> 2328</span>             assert(nPointPolygon<=1);</div>
-<div class="line"><a name="l02329"></a><span class="lineno"> 2329</span>             assert(nPointPolygon==polyValues[index].size());</div>
-<div class="line"><a name="l02330"></a><span class="lineno"> 2330</span>             theValue=polyValues[index].back();</div>
-<div class="line"><a name="l02331"></a><span class="lineno"> 2331</span>               }</div>
-<div class="line"><a name="l02332"></a><span class="lineno"> 2332</span>               <span class="keywordflow">else</span>{</div>
-<div class="line"><a name="l02333"></a><span class="lineno"> 2333</span>             std::string errorString=<span class="stringliteral">"rule not supported"</span>;</div>
-<div class="line"><a name="l02334"></a><span class="lineno"> 2334</span>             <span class="keywordflow">throw</span>(errorString);</div>
-<div class="line"><a name="l02335"></a><span class="lineno"> 2335</span>               }</div>
-<div class="line"><a name="l02336"></a><span class="lineno"> 2336</span>               <span class="keywordflow">if</span>(verbose_opt[0]>1)</div>
-<div class="line"><a name="l02337"></a><span class="lineno"> 2337</span>             std::cout << <span class="stringliteral">"set field "</span> << fieldname_opt[index] << <span class="stringliteral">" to "</span> << theValue << std::endl;</div>
-<div class="line"><a name="l02338"></a><span class="lineno"> 2338</span>               <span class="keywordflow">switch</span>( fieldType ){</div>
-<div class="line"><a name="l02339"></a><span class="lineno"> 2339</span>               <span class="keywordflow">case</span> OFTInteger:</div>
-<div class="line"><a name="l02340"></a><span class="lineno"> 2340</span>               <span class="keywordflow">case</span> OFTReal:</div>
-<div class="line"><a name="l02341"></a><span class="lineno"> 2341</span>             <span class="keywordflow">if</span>(polygon_opt[0])</div>
-<div class="line"><a name="l02342"></a><span class="lineno"> 2342</span>               writePolygonFeature->SetField(fieldname_opt[index].c_str(),theValue);</div>
-<div class="line"><a name="l02343"></a><span class="lineno"> 2343</span>             <span class="keywordflow">else</span></div>
-<div class="line"><a name="l02344"></a><span class="lineno"> 2344</span>               writeCentroidFeature->SetField(fieldname_opt[index].c_str(),theValue);</div>
-<div class="line"><a name="l02345"></a><span class="lineno"> 2345</span>             <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l02346"></a><span class="lineno"> 2346</span>               <span class="keywordflow">case</span> OFTString:</div>
-<div class="line"><a name="l02347"></a><span class="lineno"> 2347</span>             <span class="keywordflow">if</span>(polygon_opt[0])</div>
-<div class="line"><a name="l02348"></a><span class="lineno"> 2348</span>               writePolygonFeature->SetField(fieldname_opt[index].c_str(),type2string<double>(theValue).c_str());</div>
-<div class="line"><a name="l02349"></a><span class="lineno"> 2349</span>             <span class="keywordflow">else</span></div>
-<div class="line"><a name="l02350"></a><span class="lineno"> 2350</span>               writeCentroidFeature->SetField(fieldname_opt[index].c_str(),type2string<double>(theValue).c_str());</div>
-<div class="line"><a name="l02351"></a><span class="lineno"> 2351</span>             <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l02352"></a><span class="lineno"> 2352</span>               <span class="keywordflow">default</span>:<span class="comment">//not supported</span></div>
-<div class="line"><a name="l02353"></a><span class="lineno"> 2353</span>             std::string errorString=<span class="stringliteral">"field type not supported"</span>;</div>
-<div class="line"><a name="l02354"></a><span class="lineno"> 2354</span>             <span class="keywordflow">throw</span>(errorString);</div>
-<div class="line"><a name="l02355"></a><span class="lineno"> 2355</span>             <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l02356"></a><span class="lineno"> 2356</span>               }</div>
-<div class="line"><a name="l02357"></a><span class="lineno"> 2357</span>             }</div>
-<div class="line"><a name="l02358"></a><span class="lineno"> 2358</span>             <span class="keywordflow">catch</span>(std::string e){</div>
-<div class="line"><a name="l02359"></a><span class="lineno"> 2359</span>               std::cout << e << std::endl;</div>
-<div class="line"><a name="l02360"></a><span class="lineno"> 2360</span>               exit(1);</div>
-<div class="line"><a name="l02361"></a><span class="lineno"> 2361</span>             }</div>
-<div class="line"><a name="l02362"></a><span class="lineno"> 2362</span>           }</div>
-<div class="line"><a name="l02363"></a><span class="lineno"> 2363</span>         }</div>
-<div class="line"><a name="l02364"></a><span class="lineno"> 2364</span>           }</div>
-<div class="line"><a name="l02365"></a><span class="lineno"> 2365</span>           <span class="keywordflow">else</span>{<span class="comment">//class_opt is set</span></div>
-<div class="line"><a name="l02366"></a><span class="lineno"> 2366</span>         <span class="keywordflow">if</span>(ruleMap[rule_opt[0]]==rule::proportion){</div>
-<div class="line"><a name="l02367"></a><span class="lineno"> 2367</span>           <span class="keywordflow">if</span>(verbose_opt[0])</div>
-<div class="line"><a name="l02368"></a><span class="lineno"> 2368</span>             std::cout << <span class="stringliteral">"number of points in polygon: "</span> << nPointPolygon << std::endl;</div>
-<div class="line"><a name="l02369"></a><span class="lineno"> 2369</span>           stat.normalize_pct(polyClassValues);</div>
-<div class="line"><a name="l02370"></a><span class="lineno"> 2370</span>           <span class="keywordflow">for</span>(<span class="keywordtype">int</span> index=0;index<polyClassValues.size();++index){</div>
-<div class="line"><a name="l02371"></a><span class="lineno"> 2371</span>             <span class="keywordtype">double</span> theValue=polyClassValues[index];</div>
-<div class="line"><a name="l02372"></a><span class="lineno"> 2372</span>             ostringstream fs;</div>
-<div class="line"><a name="l02373"></a><span class="lineno"> 2373</span>             fs << class_opt[index];</div>
-<div class="line"><a name="l02374"></a><span class="lineno"> 2374</span>             <span class="keywordflow">if</span>(polygon_opt[0])</div>
-<div class="line"><a name="l02375"></a><span class="lineno"> 2375</span>               writePolygonFeature->SetField(fs.str().c_str(),<span class="keyword">static_cast<</span><span class="keywordtype">int</span><span class="keyword">></span>(theValue));</div>
-<div class="line"><a name="l02376"></a><span class="lineno"> 2376</span>             <span class="keywordflow">else</span></div>
-<div class="line"><a name="l02377"></a><span class="lineno"> 2377</span>               writeCentroidFeature->SetField(fs.str().c_str(),<span class="keyword">static_cast<</span><span class="keywordtype">int</span><span class="keyword">></span>(theValue));</div>
-<div class="line"><a name="l02378"></a><span class="lineno"> 2378</span>           }</div>
-<div class="line"><a name="l02379"></a><span class="lineno"> 2379</span>         }</div>
-<div class="line"><a name="l02380"></a><span class="lineno"> 2380</span>         <span class="keywordflow">else</span> <span class="keywordflow">if</span>(ruleMap[rule_opt[0]]==rule::custom){</div>
-<div class="line"><a name="l02381"></a><span class="lineno"> 2381</span>           assert(polygon_opt[0]);<span class="comment">//not implemented for points</span></div>
-<div class="line"><a name="l02382"></a><span class="lineno"> 2382</span>           <span class="keywordflow">if</span>(verbose_opt[0])</div>
-<div class="line"><a name="l02383"></a><span class="lineno"> 2383</span>             std::cout << <span class="stringliteral">"number of points in polygon: "</span> << nPointPolygon << std::endl;</div>
-<div class="line"><a name="l02384"></a><span class="lineno"> 2384</span>           stat.normalize_pct(polyClassValues);</div>
-<div class="line"><a name="l02385"></a><span class="lineno"> 2385</span>           assert(polyClassValues.size()==2);<span class="comment">//11:broadleaved, 12:coniferous</span></div>
-<div class="line"><a name="l02386"></a><span class="lineno"> 2386</span>           <span class="keywordflow">if</span>(polyClassValues[0]>=75)<span class="comment">//broadleaved</span></div>
-<div class="line"><a name="l02387"></a><span class="lineno"> 2387</span>             writePolygonFeature->SetField(label_opt[0].c_str(),static_cast<int>(11));</div>
-<div class="line"><a name="l02388"></a><span class="lineno"> 2388</span>           <span class="keywordflow">else</span> <span class="keywordflow">if</span>(polyClassValues[1]>=75)<span class="comment">//coniferous</span></div>
-<div class="line"><a name="l02389"></a><span class="lineno"> 2389</span>             writePolygonFeature->SetField(label_opt[0].c_str(),static_cast<int>(12));</div>
-<div class="line"><a name="l02390"></a><span class="lineno"> 2390</span>           <span class="keywordflow">else</span> <span class="keywordflow">if</span>(polyClassValues[0]>25&&polyClassValues[1]>25)<span class="comment">//mixed</span></div>
-<div class="line"><a name="l02391"></a><span class="lineno"> 2391</span>             writePolygonFeature->SetField(label_opt[0].c_str(),static_cast<int>(13));</div>
-<div class="line"><a name="l02392"></a><span class="lineno"> 2392</span>           <span class="keywordflow">else</span>{</div>
-<div class="line"><a name="l02393"></a><span class="lineno"> 2393</span>             <span class="keywordflow">if</span>(verbose_opt[0]){</div>
-<div class="line"><a name="l02394"></a><span class="lineno"> 2394</span>               std::cout << <span class="stringliteral">"No valid value in polyClassValues..."</span> << std::endl;</div>
-<div class="line"><a name="l02395"></a><span class="lineno"> 2395</span>               <span class="keywordflow">for</span>(<span class="keywordtype">int</span> index=0;index<polyClassValues.size();++index){</div>
-<div class="line"><a name="l02396"></a><span class="lineno"> 2396</span>             <span class="keywordtype">double</span> theValue=polyClassValues[index];</div>
-<div class="line"><a name="l02397"></a><span class="lineno"> 2397</span>             std::cout << theValue << <span class="stringliteral">" "</span>;</div>
-<div class="line"><a name="l02398"></a><span class="lineno"> 2398</span>               }</div>
-<div class="line"><a name="l02399"></a><span class="lineno"> 2399</span>               std::cout << std::endl;</div>
-<div class="line"><a name="l02400"></a><span class="lineno"> 2400</span>             }</div>
-<div class="line"><a name="l02401"></a><span class="lineno"> 2401</span>             writePolygonFeature->SetField(label_opt[0].c_str(),static_cast<int>(20));</div>
-<div class="line"><a name="l02402"></a><span class="lineno"> 2402</span>           }</div>
-<div class="line"><a name="l02403"></a><span class="lineno"> 2403</span>         }</div>
-<div class="line"><a name="l02404"></a><span class="lineno"> 2404</span>         <span class="keywordflow">else</span> <span class="keywordflow">if</span>(ruleMap[rule_opt[0]]==rule::mode){</div>
-<div class="line"><a name="l02405"></a><span class="lineno"> 2405</span>           <span class="comment">//maximum votes in polygon</span></div>
-<div class="line"><a name="l02406"></a><span class="lineno"> 2406</span>           <span class="keywordflow">if</span>(verbose_opt[0])</div>
-<div class="line"><a name="l02407"></a><span class="lineno"> 2407</span>             std::cout << <span class="stringliteral">"number of points in polygon: "</span> << nPointPolygon << std::endl;</div>
-<div class="line"><a name="l02408"></a><span class="lineno"> 2408</span>           <span class="comment">//search for class with maximum votes</span></div>
-<div class="line"><a name="l02409"></a><span class="lineno"> 2409</span>           <span class="keywordtype">int</span> maxClass=stat.mymin(class_opt);</div>
-<div class="line"><a name="l02410"></a><span class="lineno"> 2410</span>           vector<double>::iterator maxit;</div>
-<div class="line"><a name="l02411"></a><span class="lineno"> 2411</span>           maxit=stat.mymax(polyClassValues,polyClassValues.begin(),polyClassValues.end());</div>
-<div class="line"><a name="l02412"></a><span class="lineno"> 2412</span>           <span class="keywordtype">int</span> maxIndex=distance(polyClassValues.begin(),maxit);</div>
-<div class="line"><a name="l02413"></a><span class="lineno"> 2413</span>           maxClass=class_opt[maxIndex];</div>
-<div class="line"><a name="l02414"></a><span class="lineno"> 2414</span>           <span class="keywordflow">if</span>(verbose_opt[0]>0)</div>
-<div class="line"><a name="l02415"></a><span class="lineno"> 2415</span>             std::cout << <span class="stringliteral">"maxClass: "</span> << maxClass << std::endl;</div>
-<div class="line"><a name="l02416"></a><span class="lineno"> 2416</span>           <span class="keywordflow">if</span>(polygon_opt[0])</div>
-<div class="line"><a name="l02417"></a><span class="lineno"> 2417</span>             writePolygonFeature->SetField(label_opt[0].c_str(),maxClass);</div>
-<div class="line"><a name="l02418"></a><span class="lineno"> 2418</span>           <span class="keywordflow">else</span></div>
-<div class="line"><a name="l02419"></a><span class="lineno"> 2419</span>             writeCentroidFeature->SetField(label_opt[0].c_str(),maxClass);</div>
-<div class="line"><a name="l02420"></a><span class="lineno"> 2420</span>         }</div>
-<div class="line"><a name="l02421"></a><span class="lineno"> 2421</span>           }</div>
-<div class="line"><a name="l02422"></a><span class="lineno"> 2422</span> </div>
-<div class="line"><a name="l02423"></a><span class="lineno"> 2423</span>           <span class="keywordflow">if</span>(polygon_opt[0]){</div>
-<div class="line"><a name="l02424"></a><span class="lineno"> 2424</span>         <span class="keywordflow">if</span>(verbose_opt[0]>1)</div>
-<div class="line"><a name="l02425"></a><span class="lineno"> 2425</span>           std::cout << <span class="stringliteral">"creating polygon feature"</span> << std::endl;</div>
-<div class="line"><a name="l02426"></a><span class="lineno"> 2426</span>         <span class="keywordflow">if</span>(writeTest){</div>
-<div class="line"><a name="l02427"></a><span class="lineno"> 2427</span>           <span class="keywordflow">if</span>(writeTestLayer->CreateFeature( writePolygonFeature ) != OGRERR_NONE ){</div>
-<div class="line"><a name="l02428"></a><span class="lineno"> 2428</span>             std::string errorString=<span class="stringliteral">"Failed to create polygon feature in ogr vector dataset"</span>;</div>
-<div class="line"><a name="l02429"></a><span class="lineno"> 2429</span>             <span class="keywordflow">throw</span>(errorString);</div>
-<div class="line"><a name="l02430"></a><span class="lineno"> 2430</span>           }</div>
-<div class="line"><a name="l02431"></a><span class="lineno"> 2431</span>         }</div>
-<div class="line"><a name="l02432"></a><span class="lineno"> 2432</span>         <span class="keywordflow">else</span>{</div>
-<div class="line"><a name="l02433"></a><span class="lineno"> 2433</span>           <span class="keywordflow">if</span>(writeLayer->CreateFeature( writePolygonFeature ) != OGRERR_NONE ){</div>
-<div class="line"><a name="l02434"></a><span class="lineno"> 2434</span>             std::string errorString=<span class="stringliteral">"Failed to create polygon feature in ogr vector dataset"</span>;</div>
-<div class="line"><a name="l02435"></a><span class="lineno"> 2435</span>             <span class="keywordflow">throw</span>(errorString);</div>
-<div class="line"><a name="l02436"></a><span class="lineno"> 2436</span>           }</div>
-<div class="line"><a name="l02437"></a><span class="lineno"> 2437</span>         }</div>
-<div class="line"><a name="l02438"></a><span class="lineno"> 2438</span>         OGRFeature::DestroyFeature( writePolygonFeature );</div>
-<div class="line"><a name="l02439"></a><span class="lineno"> 2439</span>         ++ntotalvalid;</div>
-<div class="line"><a name="l02440"></a><span class="lineno"> 2440</span>         <span class="keywordflow">if</span>(verbose_opt[0])</div>
-<div class="line"><a name="l02441"></a><span class="lineno"> 2441</span>           std::cout << <span class="stringliteral">"ntotalvalid: "</span> << ntotalvalid << std::endl;</div>
-<div class="line"><a name="l02442"></a><span class="lineno"> 2442</span>           }</div>
-<div class="line"><a name="l02443"></a><span class="lineno"> 2443</span>           <span class="keywordflow">else</span>{</div>
-<div class="line"><a name="l02444"></a><span class="lineno"> 2444</span>         <span class="keywordflow">if</span>(verbose_opt[0]>1)</div>
-<div class="line"><a name="l02445"></a><span class="lineno"> 2445</span>           std::cout << <span class="stringliteral">"creating point feature in centroid"</span> << std::endl;</div>
-<div class="line"><a name="l02446"></a><span class="lineno"> 2446</span>         <span class="keywordflow">if</span>(writeTest){</div>
-<div class="line"><a name="l02447"></a><span class="lineno"> 2447</span>           <span class="keywordflow">if</span>(writeTestLayer->CreateFeature( writeCentroidFeature ) != OGRERR_NONE ){</div>
-<div class="line"><a name="l02448"></a><span class="lineno"> 2448</span>             std::string errorString=<span class="stringliteral">"Failed to create point feature in ogr vector dataset"</span>;</div>
-<div class="line"><a name="l02449"></a><span class="lineno"> 2449</span>             <span class="keywordflow">throw</span>(errorString);</div>
-<div class="line"><a name="l02450"></a><span class="lineno"> 2450</span>           }</div>
-<div class="line"><a name="l02451"></a><span class="lineno"> 2451</span>         }</div>
-<div class="line"><a name="l02452"></a><span class="lineno"> 2452</span>         <span class="keywordflow">else</span>{</div>
-<div class="line"><a name="l02453"></a><span class="lineno"> 2453</span>           <span class="comment">//test</span></div>
-<div class="line"><a name="l02454"></a><span class="lineno"> 2454</span>           assert(validFeature);</div>
-<div class="line"><a name="l02455"></a><span class="lineno"> 2455</span>           <span class="keywordflow">if</span>(writeLayer->CreateFeature( writeCentroidFeature ) != OGRERR_NONE ){</div>
-<div class="line"><a name="l02456"></a><span class="lineno"> 2456</span>             std::string errorString=<span class="stringliteral">"Failed to create point feature in ogr vector dataset"</span>;</div>
-<div class="line"><a name="l02457"></a><span class="lineno"> 2457</span>             <span class="keywordflow">throw</span>(errorString);</div>
-<div class="line"><a name="l02458"></a><span class="lineno"> 2458</span>           }</div>
-<div class="line"><a name="l02459"></a><span class="lineno"> 2459</span>         }</div>
-<div class="line"><a name="l02460"></a><span class="lineno"> 2460</span>         OGRFeature::DestroyFeature( writeCentroidFeature );</div>
-<div class="line"><a name="l02461"></a><span class="lineno"> 2461</span>         ++ntotalvalid;</div>
-<div class="line"><a name="l02462"></a><span class="lineno"> 2462</span>         <span class="keywordflow">if</span>(verbose_opt[0])</div>
-<div class="line"><a name="l02463"></a><span class="lineno"> 2463</span>           std::cout << <span class="stringliteral">"ntotalvalid: "</span> << ntotalvalid << std::endl;</div>
-<div class="line"><a name="l02464"></a><span class="lineno"> 2464</span>           }</div>
-<div class="line"><a name="l02465"></a><span class="lineno"> 2465</span>         }</div>
-<div class="line"><a name="l02466"></a><span class="lineno"> 2466</span>       }</div>
-<div class="line"><a name="l02467"></a><span class="lineno"> 2467</span>       <span class="keywordflow">else</span>{</div>
-<div class="line"><a name="l02468"></a><span class="lineno"> 2468</span>         std::string test;</div>
-<div class="line"><a name="l02469"></a><span class="lineno"> 2469</span>         test=poGeometry->getGeometryName();</div>
-<div class="line"><a name="l02470"></a><span class="lineno"> 2470</span>         ostringstream oss;</div>
-<div class="line"><a name="l02471"></a><span class="lineno"> 2471</span>         oss << <span class="stringliteral">"geometry "</span> << test << <span class="stringliteral">" not supported"</span>;</div>
-<div class="line"><a name="l02472"></a><span class="lineno"> 2472</span>         <span class="keywordflow">throw</span>(oss.str());</div>
-<div class="line"><a name="l02473"></a><span class="lineno"> 2473</span>       }</div>
-<div class="line"><a name="l02474"></a><span class="lineno"> 2474</span>       ++ifeature;</div>
-<div class="line"><a name="l02475"></a><span class="lineno"> 2475</span>       progress=<span class="keyword">static_cast<</span><span class="keywordtype">float</span><span class="keyword">></span>(ifeature+1)/nfeature;</div>
-<div class="line"><a name="l02476"></a><span class="lineno"> 2476</span>       pfnProgress(progress,pszMessage,pProgressArg);</div>
-<div class="line"><a name="l02477"></a><span class="lineno"> 2477</span>     }</div>
-<div class="line"><a name="l02478"></a><span class="lineno"> 2478</span>     <span class="keywordflow">catch</span>(std::string e){</div>
-<div class="line"><a name="l02479"></a><span class="lineno"> 2479</span>       std::cout << e << std::endl;</div>
-<div class="line"><a name="l02480"></a><span class="lineno"> 2480</span>       <span class="keywordflow">continue</span>;</div>
-<div class="line"><a name="l02481"></a><span class="lineno"> 2481</span>     }</div>
-<div class="line"><a name="l02482"></a><span class="lineno"> 2482</span>     <span class="keywordflow">catch</span>(<span class="keywordtype">int</span> npoint){</div>
-<div class="line"><a name="l02483"></a><span class="lineno"> 2483</span>       <span class="keywordflow">if</span>(verbose_opt[0])</div>
-<div class="line"><a name="l02484"></a><span class="lineno"> 2484</span>         std::cout << <span class="stringliteral">"number of points read in polygon: "</span> << npoint << std::endl;</div>
-<div class="line"><a name="l02485"></a><span class="lineno"> 2485</span>       <span class="keywordflow">continue</span>;</div>
-<div class="line"><a name="l02486"></a><span class="lineno"> 2486</span>     }</div>
-<div class="line"><a name="l02487"></a><span class="lineno"> 2487</span>       }<span class="comment">//end of getNextFeature</span></div>
-<div class="line"><a name="l02488"></a><span class="lineno"> 2488</span>       <span class="comment">// if(rbox_opt[0]>0||cbox_opt[0]>0)</span></div>
-<div class="line"><a name="l02489"></a><span class="lineno"> 2489</span>       <span class="comment">//   boxWriter.close();</span></div>
-<div class="line"><a name="l02490"></a><span class="lineno"> 2490</span>       progress=1.0;</div>
-<div class="line"><a name="l02491"></a><span class="lineno"> 2491</span>       pfnProgress(progress,pszMessage,pProgressArg);</div>
-<div class="line"><a name="l02492"></a><span class="lineno"> 2492</span>       ++ilayerWrite;</div>
-<div class="line"><a name="l02493"></a><span class="lineno"> 2493</span>     }<span class="comment">//for ilayer</span></div>
-<div class="line"><a name="l02494"></a><span class="lineno"> 2494</span>     ogrWriter.close();</div>
-<div class="line"><a name="l02495"></a><span class="lineno"> 2495</span>     <span class="keywordflow">if</span>(test_opt.size())</div>
-<div class="line"><a name="l02496"></a><span class="lineno"> 2496</span>       ogrTestWriter.close();</div>
-<div class="line"><a name="l02497"></a><span class="lineno"> 2497</span>   }<span class="comment">//else (vector)</span></div>
-<div class="line"><a name="l02498"></a><span class="lineno"> 2498</span>   progress=1.0;</div>
-<div class="line"><a name="l02499"></a><span class="lineno"> 2499</span>   pfnProgress(progress,pszMessage,pProgressArg);</div>
-<div class="line"><a name="l02500"></a><span class="lineno"> 2500</span>   imgReader.close();</div>
-<div class="line"><a name="l02501"></a><span class="lineno"> 2501</span> }</div>
-<div class="line"><a name="l02502"></a><span class="lineno"> 2502</span>   </div>
+<div class="line"><a name="l02220"></a><span class="lineno"> 2220</span>               }<span class="comment">//else</span></div>
+<div class="line"><a name="l02221"></a><span class="lineno"> 2221</span>             }<span class="comment">//iband</span></div>
+<div class="line"><a name="l02222"></a><span class="lineno"> 2222</span>           }<span class="comment">//else (class_opt.size())</span></div>
+<div class="line"><a name="l02223"></a><span class="lineno"> 2223</span>           <span class="keywordflow">if</span>(!polygon_opt[0]){</div>
+<div class="line"><a name="l02224"></a><span class="lineno"> 2224</span>             <span class="keywordflow">if</span>(ruleMap[rule_opt[0]]==rule::point){<span class="comment">//do not create in case of mean, stdev or median value (only at centroid)</span></div>
+<div class="line"><a name="l02225"></a><span class="lineno"> 2225</span>               <span class="comment">//write feature</span></div>
+<div class="line"><a name="l02226"></a><span class="lineno"> 2226</span>               <span class="keywordflow">if</span>(verbose_opt[0]>1)</div>
+<div class="line"><a name="l02227"></a><span class="lineno"> 2227</span>             std::cout << <span class="stringliteral">"creating point feature"</span> << std::endl;</div>
+<div class="line"><a name="l02228"></a><span class="lineno"> 2228</span>               <span class="keywordflow">if</span>(writeTest){</div>
+<div class="line"><a name="l02229"></a><span class="lineno"> 2229</span>             <span class="keywordflow">if</span>(writeTestLayer->CreateFeature( writePointFeature ) != OGRERR_NONE ){</div>
+<div class="line"><a name="l02230"></a><span class="lineno"> 2230</span>               std::string errorString=<span class="stringliteral">"Failed to create feature in ogr vector dataset"</span>;</div>
+<div class="line"><a name="l02231"></a><span class="lineno"> 2231</span>               <span class="keywordflow">throw</span>(errorString);</div>
+<div class="line"><a name="l02232"></a><span class="lineno"> 2232</span>             }</div>
+<div class="line"><a name="l02233"></a><span class="lineno"> 2233</span>               }</div>
+<div class="line"><a name="l02234"></a><span class="lineno"> 2234</span>               <span class="keywordflow">else</span>{</div>
+<div class="line"><a name="l02235"></a><span class="lineno"> 2235</span>             <span class="keywordflow">if</span>(writeLayer->CreateFeature( writePointFeature ) != OGRERR_NONE ){</div>
+<div class="line"><a name="l02236"></a><span class="lineno"> 2236</span>               std::string errorString=<span class="stringliteral">"Failed to create feature in ogr vector dataset"</span>;</div>
+<div class="line"><a name="l02237"></a><span class="lineno"> 2237</span>               <span class="keywordflow">throw</span>(errorString);</div>
+<div class="line"><a name="l02238"></a><span class="lineno"> 2238</span>             }</div>
+<div class="line"><a name="l02239"></a><span class="lineno"> 2239</span>               }</div>
+<div class="line"><a name="l02240"></a><span class="lineno"> 2240</span>               <span class="comment">//destroy feature</span></div>
+<div class="line"><a name="l02241"></a><span class="lineno"> 2241</span>               OGRFeature::DestroyFeature( writePointFeature );</div>
+<div class="line"><a name="l02242"></a><span class="lineno"> 2242</span>             }</div>
+<div class="line"><a name="l02243"></a><span class="lineno"> 2243</span>           }</div>
+<div class="line"><a name="l02244"></a><span class="lineno"> 2244</span>           <span class="comment">// ++isample;</span></div>
+<div class="line"><a name="l02245"></a><span class="lineno"> 2245</span>           ++ntotalvalid;</div>
+<div class="line"><a name="l02246"></a><span class="lineno"> 2246</span>           <span class="keywordflow">if</span>(verbose_opt[0])</div>
+<div class="line"><a name="l02247"></a><span class="lineno"> 2247</span>             std::cout << <span class="stringliteral">"ntotalvalid: "</span> << ntotalvalid << std::endl;</div>
+<div class="line"><a name="l02248"></a><span class="lineno"> 2248</span>           }</div>
+<div class="line"><a name="l02249"></a><span class="lineno"> 2249</span>         }</div>
+<div class="line"><a name="l02250"></a><span class="lineno"> 2250</span>         <span class="keywordflow">if</span>(!validFeature)</div>
+<div class="line"><a name="l02251"></a><span class="lineno"> 2251</span>           <span class="keywordflow">continue</span>;</div>
+<div class="line"><a name="l02252"></a><span class="lineno"> 2252</span>         <span class="keywordflow">if</span>(polygon_opt[0]||ruleMap[rule_opt[0]]!=rule::point){</div>
+<div class="line"><a name="l02253"></a><span class="lineno"> 2253</span>           <span class="comment">//do not create if no points found within polygon</span></div>
+<div class="line"><a name="l02254"></a><span class="lineno"> 2254</span>           <span class="keywordflow">if</span>(!nPointPolygon)</div>
+<div class="line"><a name="l02255"></a><span class="lineno"> 2255</span>         <span class="keywordflow">continue</span>;</div>
+<div class="line"><a name="l02256"></a><span class="lineno"> 2256</span>           <span class="comment">//add ring to polygon</span></div>
+<div class="line"><a name="l02257"></a><span class="lineno"> 2257</span>           <span class="keywordflow">if</span>(polygon_opt[0]){</div>
+<div class="line"><a name="l02258"></a><span class="lineno"> 2258</span>         writePolygon.addRing(&writeRing);</div>
+<div class="line"><a name="l02259"></a><span class="lineno"> 2259</span>         writePolygon.closeRings();</div>
+<div class="line"><a name="l02260"></a><span class="lineno"> 2260</span>         <span class="comment">//write geometry of writePolygon</span></div>
+<div class="line"><a name="l02261"></a><span class="lineno"> 2261</span>         <span class="comment">//test</span></div>
+<div class="line"><a name="l02262"></a><span class="lineno"> 2262</span>         <span class="comment">//writePolygon and readFeature are from geometry type wkbMultiPolygon</span></div>
+<div class="line"><a name="l02263"></a><span class="lineno"> 2263</span>         <span class="comment">// writePolygonFeature->SetGeometry(&writePolygon);</span></div>
+<div class="line"><a name="l02264"></a><span class="lineno"> 2264</span>         <span class="keywordflow">if</span>(writePolygonFeature->SetFrom(readFeature)!= OGRERR_NONE)</div>
+<div class="line"><a name="l02265"></a><span class="lineno"> 2265</span>           cerr << <span class="stringliteral">"writing feature failed"</span> << std::endl;</div>
+<div class="line"><a name="l02266"></a><span class="lineno"> 2266</span>         assert(writePolygonFeature->GetGeometryRef()->getGeometryType()==wkbMultiPolygon);</div>
+<div class="line"><a name="l02267"></a><span class="lineno"> 2267</span>         <span class="keywordflow">if</span>(verbose_opt[0]>1)</div>
+<div class="line"><a name="l02268"></a><span class="lineno"> 2268</span>           std::cout << <span class="stringliteral">"copying new fields write polygon "</span> << std::endl;</div>
+<div class="line"><a name="l02269"></a><span class="lineno"> 2269</span>         <span class="keywordflow">if</span>(verbose_opt[0]>1)</div>
+<div class="line"><a name="l02270"></a><span class="lineno"> 2270</span>           std::cout << <span class="stringliteral">"write feature has "</span> << writePolygonFeature->GetFieldCount() << <span class="stringliteral">" fields"</span> << std::endl;</div>
+<div class="line"><a name="l02271"></a><span class="lineno"> 2271</span>         <span class="comment">//write polygon feature</span></div>
+<div class="line"><a name="l02272"></a><span class="lineno"> 2272</span>           }</div>
+<div class="line"><a name="l02273"></a><span class="lineno"> 2273</span>           <span class="keywordflow">else</span>{<span class="comment">//write band information of polygon to centroid point</span></div>
+<div class="line"><a name="l02274"></a><span class="lineno"> 2274</span>         <span class="comment">//create feature</span></div>
+<div class="line"><a name="l02275"></a><span class="lineno"> 2275</span>         <span class="keywordflow">if</span>(verbose_opt[0]>1)</div>
+<div class="line"><a name="l02276"></a><span class="lineno"> 2276</span>           std::cout << <span class="stringliteral">"copying fields from polygons "</span> << std::endl;</div>
+<div class="line"><a name="l02277"></a><span class="lineno"> 2277</span>         <span class="keywordflow">if</span>(writeCentroidFeature->SetFrom(readFeature)!= OGRERR_NONE)</div>
+<div class="line"><a name="l02278"></a><span class="lineno"> 2278</span>           cerr << <span class="stringliteral">"writing feature failed"</span> << std::endl;</div>
+<div class="line"><a name="l02279"></a><span class="lineno"> 2279</span>         writeCentroidFeature->SetGeometry(&writeCentroidPoint);</div>
+<div class="line"><a name="l02280"></a><span class="lineno"> 2280</span>         assert(wkbFlatten(writeCentroidFeature->GetGeometryRef()->getGeometryType()) == wkbPoint);</div>
+<div class="line"><a name="l02281"></a><span class="lineno"> 2281</span>         <span class="keywordflow">if</span>(verbose_opt[0]>1)</div>
+<div class="line"><a name="l02282"></a><span class="lineno"> 2282</span>           std::cout << <span class="stringliteral">"write feature has "</span> << writeCentroidFeature->GetFieldCount() << <span class="stringliteral">" fields"</span> << std::endl;</div>
+<div class="line"><a name="l02283"></a><span class="lineno"> 2283</span>           }</div>
+<div class="line"><a name="l02284"></a><span class="lineno"> 2284</span>           <span class="keywordflow">if</span>(class_opt.empty()){</div>
+<div class="line"><a name="l02285"></a><span class="lineno"> 2285</span>         <span class="keywordflow">if</span>(ruleMap[rule_opt[0]]==rule::point){<span class="comment">//value at centroid of polygon</span></div>
+<div class="line"><a name="l02286"></a><span class="lineno"> 2286</span>           <span class="keywordflow">if</span>(verbose_opt[0])</div>
+<div class="line"><a name="l02287"></a><span class="lineno"> 2287</span>             std::cout << <span class="stringliteral">"number of points in polygon: "</span> << nPointPolygon << std::endl;</div>
+<div class="line"><a name="l02288"></a><span class="lineno"> 2288</span>           <span class="keywordflow">for</span>(<span class="keywordtype">int</span> index=0;index<polyValues.size();++index){</div>
+<div class="line"><a name="l02289"></a><span class="lineno"> 2289</span>             <span class="comment">//test</span></div>
+<div class="line"><a name="l02290"></a><span class="lineno"> 2290</span>             assert(polyValues[index].size()==1);</div>
+<div class="line"><a name="l02291"></a><span class="lineno"> 2291</span>             <span class="keywordtype">double</span> theValue=polyValues[index].back();</div>
+<div class="line"><a name="l02292"></a><span class="lineno"> 2292</span>             <span class="keywordflow">if</span>(verbose_opt[0])</div>
+<div class="line"><a name="l02293"></a><span class="lineno"> 2293</span>               std::cout << <span class="stringliteral">"number of points in polygon: "</span> << nPointPolygon << std::endl;</div>
+<div class="line"><a name="l02294"></a><span class="lineno"> 2294</span>             <span class="keywordtype">int</span> theBand=(band_opt.size()) ? band_opt[index] : index;</div>
+<div class="line"><a name="l02295"></a><span class="lineno"> 2295</span>             <span class="keywordflow">try</span>{</div>
+<div class="line"><a name="l02296"></a><span class="lineno"> 2296</span>               <span class="keywordflow">if</span>(verbose_opt[0]>1)</div>
+<div class="line"><a name="l02297"></a><span class="lineno"> 2297</span>             std::cout << <span class="stringliteral">"set field "</span> << fieldname_opt[index] << <span class="stringliteral">" to "</span> << theValue << std::endl;</div>
+<div class="line"><a name="l02298"></a><span class="lineno"> 2298</span>               <span class="keywordflow">switch</span>( fieldType ){</div>
+<div class="line"><a name="l02299"></a><span class="lineno"> 2299</span>               <span class="keywordflow">case</span> OFTInteger:</div>
+<div class="line"><a name="l02300"></a><span class="lineno"> 2300</span>               <span class="keywordflow">case</span> OFTReal:</div>
+<div class="line"><a name="l02301"></a><span class="lineno"> 2301</span>             <span class="keywordflow">if</span>(polygon_opt[0])</div>
+<div class="line"><a name="l02302"></a><span class="lineno"> 2302</span>               writePolygonFeature->SetField(fieldname_opt[index].c_str(),theValue);</div>
+<div class="line"><a name="l02303"></a><span class="lineno"> 2303</span>             <span class="keywordflow">else</span></div>
+<div class="line"><a name="l02304"></a><span class="lineno"> 2304</span>               writeCentroidFeature->SetField(fieldname_opt[index].c_str(),theValue);</div>
+<div class="line"><a name="l02305"></a><span class="lineno"> 2305</span>             <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l02306"></a><span class="lineno"> 2306</span>               <span class="keywordflow">case</span> OFTString:</div>
+<div class="line"><a name="l02307"></a><span class="lineno"> 2307</span>             <span class="keywordflow">if</span>(polygon_opt[0])</div>
+<div class="line"><a name="l02308"></a><span class="lineno"> 2308</span>               writePolygonFeature->SetField(fieldname_opt[index].c_str(),type2string<double>(theValue).c_str());</div>
+<div class="line"><a name="l02309"></a><span class="lineno"> 2309</span>             <span class="keywordflow">else</span></div>
+<div class="line"><a name="l02310"></a><span class="lineno"> 2310</span>               writeCentroidFeature->SetField(fieldname_opt[index].c_str(),type2string<double>(theValue).c_str());</div>
+<div class="line"><a name="l02311"></a><span class="lineno"> 2311</span>             <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l02312"></a><span class="lineno"> 2312</span>               <span class="keywordflow">default</span>:<span class="comment">//not supported</span></div>
+<div class="line"><a name="l02313"></a><span class="lineno"> 2313</span>             std::string errorString=<span class="stringliteral">"field type not supported"</span>;</div>
+<div class="line"><a name="l02314"></a><span class="lineno"> 2314</span>             <span class="keywordflow">throw</span>(errorString);</div>
+<div class="line"><a name="l02315"></a><span class="lineno"> 2315</span>             <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l02316"></a><span class="lineno"> 2316</span>               }</div>
+<div class="line"><a name="l02317"></a><span class="lineno"> 2317</span>             }</div>
+<div class="line"><a name="l02318"></a><span class="lineno"> 2318</span>             <span class="keywordflow">catch</span>(std::string e){</div>
+<div class="line"><a name="l02319"></a><span class="lineno"> 2319</span>               std::cout << e << std::endl;</div>
+<div class="line"><a name="l02320"></a><span class="lineno"> 2320</span>               exit(1);</div>
+<div class="line"><a name="l02321"></a><span class="lineno"> 2321</span>             }</div>
+<div class="line"><a name="l02322"></a><span class="lineno"> 2322</span>           }</div>
+<div class="line"><a name="l02323"></a><span class="lineno"> 2323</span>         }</div>
+<div class="line"><a name="l02324"></a><span class="lineno"> 2324</span>         <span class="keywordflow">else</span>{<span class="comment">//ruleMap[rule_opt[0]] is not rule::point</span></div>
+<div class="line"><a name="l02325"></a><span class="lineno"> 2325</span>           <span class="keywordtype">double</span> theValue=0;</div>
+<div class="line"><a name="l02326"></a><span class="lineno"> 2326</span>           <span class="keywordflow">for</span>(<span class="keywordtype">int</span> index=0;index<polyValues.size();++index){</div>
+<div class="line"><a name="l02327"></a><span class="lineno"> 2327</span>             <span class="keywordflow">try</span>{</div>
+<div class="line"><a name="l02328"></a><span class="lineno"> 2328</span>               <span class="keywordflow">if</span>(ruleMap[rule_opt[0]]==rule::mean)</div>
+<div class="line"><a name="l02329"></a><span class="lineno"> 2329</span>             theValue=stat.mean(polyValues[index]);</div>
+<div class="line"><a name="l02330"></a><span class="lineno"> 2330</span>               <span class="keywordflow">else</span> <span class="keywordflow">if</span>(ruleMap[rule_opt[0]]==rule::stdev)</div>
+<div class="line"><a name="l02331"></a><span class="lineno"> 2331</span>             theValue=sqrt(stat.var(polyValues[index]));</div>
+<div class="line"><a name="l02332"></a><span class="lineno"> 2332</span>               <span class="keywordflow">else</span> <span class="keywordflow">if</span>(ruleMap[rule_opt[0]]==rule::median)</div>
+<div class="line"><a name="l02333"></a><span class="lineno"> 2333</span>             theValue=stat.median(polyValues[index]);</div>
+<div class="line"><a name="l02334"></a><span class="lineno"> 2334</span>               <span class="keywordflow">else</span> <span class="keywordflow">if</span>(ruleMap[rule_opt[0]]==rule::percentile)</div>
+<div class="line"><a name="l02335"></a><span class="lineno"> 2335</span>             theValue=stat.percentile(polyValues[index],polyValues[index].begin(),polyValues[index].end(),percentile_opt[0]);</div>
+<div class="line"><a name="l02336"></a><span class="lineno"> 2336</span>               <span class="keywordflow">else</span> <span class="keywordflow">if</span>(ruleMap[rule_opt[0]]==rule::sum)</div>
+<div class="line"><a name="l02337"></a><span class="lineno"> 2337</span>             theValue=stat.sum(polyValues[index]);</div>
+<div class="line"><a name="l02338"></a><span class="lineno"> 2338</span>               <span class="keywordflow">else</span> <span class="keywordflow">if</span>(ruleMap[rule_opt[0]]==rule::max)</div>
+<div class="line"><a name="l02339"></a><span class="lineno"> 2339</span>             theValue=stat.mymax(polyValues[index]);</div>
+<div class="line"><a name="l02340"></a><span class="lineno"> 2340</span>               <span class="keywordflow">else</span> <span class="keywordflow">if</span>(ruleMap[rule_opt[0]]==rule::min)</div>
+<div class="line"><a name="l02341"></a><span class="lineno"> 2341</span>             theValue=stat.mymin(polyValues[index]);</div>
+<div class="line"><a name="l02342"></a><span class="lineno"> 2342</span>               <span class="keywordflow">else</span> <span class="keywordflow">if</span>(ruleMap[rule_opt[0]]==rule::centroid){</div>
+<div class="line"><a name="l02343"></a><span class="lineno"> 2343</span>             <span class="keywordflow">if</span>(verbose_opt[0])</div>
+<div class="line"><a name="l02344"></a><span class="lineno"> 2344</span>               std::cout << <span class="stringliteral">"number of points in polygon: "</span> << nPointPolygon << std::endl;</div>
+<div class="line"><a name="l02345"></a><span class="lineno"> 2345</span>             assert(nPointPolygon<=1);</div>
+<div class="line"><a name="l02346"></a><span class="lineno"> 2346</span>             assert(nPointPolygon==polyValues[index].size());</div>
+<div class="line"><a name="l02347"></a><span class="lineno"> 2347</span>             theValue=polyValues[index].back();</div>
+<div class="line"><a name="l02348"></a><span class="lineno"> 2348</span>               }</div>
+<div class="line"><a name="l02349"></a><span class="lineno"> 2349</span>               <span class="keywordflow">else</span>{</div>
+<div class="line"><a name="l02350"></a><span class="lineno"> 2350</span>             std::string errorString=<span class="stringliteral">"rule not supported"</span>;</div>
+<div class="line"><a name="l02351"></a><span class="lineno"> 2351</span>             <span class="keywordflow">throw</span>(errorString);</div>
+<div class="line"><a name="l02352"></a><span class="lineno"> 2352</span>               }</div>
+<div class="line"><a name="l02353"></a><span class="lineno"> 2353</span>               <span class="keywordflow">if</span>(verbose_opt[0]>1)</div>
+<div class="line"><a name="l02354"></a><span class="lineno"> 2354</span>             std::cout << <span class="stringliteral">"set field "</span> << fieldname_opt[index] << <span class="stringliteral">" to "</span> << theValue << std::endl;</div>
+<div class="line"><a name="l02355"></a><span class="lineno"> 2355</span>               <span class="keywordflow">switch</span>( fieldType ){</div>
+<div class="line"><a name="l02356"></a><span class="lineno"> 2356</span>               <span class="keywordflow">case</span> OFTInteger:</div>
+<div class="line"><a name="l02357"></a><span class="lineno"> 2357</span>               <span class="keywordflow">case</span> OFTReal:</div>
+<div class="line"><a name="l02358"></a><span class="lineno"> 2358</span>             <span class="keywordflow">if</span>(polygon_opt[0])</div>
+<div class="line"><a name="l02359"></a><span class="lineno"> 2359</span>               writePolygonFeature->SetField(fieldname_opt[index].c_str(),theValue);</div>
+<div class="line"><a name="l02360"></a><span class="lineno"> 2360</span>             <span class="keywordflow">else</span></div>
+<div class="line"><a name="l02361"></a><span class="lineno"> 2361</span>               writeCentroidFeature->SetField(fieldname_opt[index].c_str(),theValue);</div>
+<div class="line"><a name="l02362"></a><span class="lineno"> 2362</span>             <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l02363"></a><span class="lineno"> 2363</span>               <span class="keywordflow">case</span> OFTString:</div>
+<div class="line"><a name="l02364"></a><span class="lineno"> 2364</span>             <span class="keywordflow">if</span>(polygon_opt[0])</div>
+<div class="line"><a name="l02365"></a><span class="lineno"> 2365</span>               writePolygonFeature->SetField(fieldname_opt[index].c_str(),type2string<double>(theValue).c_str());</div>
+<div class="line"><a name="l02366"></a><span class="lineno"> 2366</span>             <span class="keywordflow">else</span></div>
+<div class="line"><a name="l02367"></a><span class="lineno"> 2367</span>               writeCentroidFeature->SetField(fieldname_opt[index].c_str(),type2string<double>(theValue).c_str());</div>
+<div class="line"><a name="l02368"></a><span class="lineno"> 2368</span>             <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l02369"></a><span class="lineno"> 2369</span>               <span class="keywordflow">default</span>:<span class="comment">//not supported</span></div>
+<div class="line"><a name="l02370"></a><span class="lineno"> 2370</span>             std::string errorString=<span class="stringliteral">"field type not supported"</span>;</div>
+<div class="line"><a name="l02371"></a><span class="lineno"> 2371</span>             <span class="keywordflow">throw</span>(errorString);</div>
+<div class="line"><a name="l02372"></a><span class="lineno"> 2372</span>             <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l02373"></a><span class="lineno"> 2373</span>               }</div>
+<div class="line"><a name="l02374"></a><span class="lineno"> 2374</span>             }</div>
+<div class="line"><a name="l02375"></a><span class="lineno"> 2375</span>             <span class="keywordflow">catch</span>(std::string e){</div>
+<div class="line"><a name="l02376"></a><span class="lineno"> 2376</span>               std::cout << e << std::endl;</div>
+<div class="line"><a name="l02377"></a><span class="lineno"> 2377</span>               exit(1);</div>
+<div class="line"><a name="l02378"></a><span class="lineno"> 2378</span>             }</div>
+<div class="line"><a name="l02379"></a><span class="lineno"> 2379</span>           }</div>
+<div class="line"><a name="l02380"></a><span class="lineno"> 2380</span>         }</div>
+<div class="line"><a name="l02381"></a><span class="lineno"> 2381</span>           }</div>
+<div class="line"><a name="l02382"></a><span class="lineno"> 2382</span>           <span class="keywordflow">else</span>{<span class="comment">//class_opt is set</span></div>
+<div class="line"><a name="l02383"></a><span class="lineno"> 2383</span>         <span class="keywordflow">if</span>(ruleMap[rule_opt[0]]==rule::proportion||ruleMap[rule_opt[0]]==rule::count){</div>
+<div class="line"><a name="l02384"></a><span class="lineno"> 2384</span>           <span class="keywordflow">if</span>(verbose_opt[0])</div>
+<div class="line"><a name="l02385"></a><span class="lineno"> 2385</span>             std::cout << <span class="stringliteral">"number of points in polygon: "</span> << nPointPolygon << std::endl;</div>
+<div class="line"><a name="l02386"></a><span class="lineno"> 2386</span>           <span class="keywordflow">if</span>(ruleMap[rule_opt[0]]==rule::proportion)</div>
+<div class="line"><a name="l02387"></a><span class="lineno"> 2387</span>             stat.normalize_pct(polyClassValues);</div>
+<div class="line"><a name="l02388"></a><span class="lineno"> 2388</span>           <span class="keywordflow">for</span>(<span class="keywordtype">int</span> index=0;index<polyClassValues.size();++index){</div>
+<div class="line"><a name="l02389"></a><span class="lineno"> 2389</span>             <span class="keywordtype">double</span> theValue=polyClassValues[index];</div>
+<div class="line"><a name="l02390"></a><span class="lineno"> 2390</span>             ostringstream fs;</div>
+<div class="line"><a name="l02391"></a><span class="lineno"> 2391</span>             fs << class_opt[index];</div>
+<div class="line"><a name="l02392"></a><span class="lineno"> 2392</span>             <span class="keywordflow">if</span>(polygon_opt[0])</div>
+<div class="line"><a name="l02393"></a><span class="lineno"> 2393</span>               writePolygonFeature->SetField(fs.str().c_str(),<span class="keyword">static_cast<</span><span class="keywordtype">int</span><span class="keyword">></span>(theValue));</div>
+<div class="line"><a name="l02394"></a><span class="lineno"> 2394</span>             <span class="keywordflow">else</span></div>
+<div class="line"><a name="l02395"></a><span class="lineno"> 2395</span>               writeCentroidFeature->SetField(fs.str().c_str(),<span class="keyword">static_cast<</span><span class="keywordtype">int</span><span class="keyword">></span>(theValue));</div>
+<div class="line"><a name="l02396"></a><span class="lineno"> 2396</span>           }</div>
+<div class="line"><a name="l02397"></a><span class="lineno"> 2397</span>         }</div>
+<div class="line"><a name="l02398"></a><span class="lineno"> 2398</span>         <span class="keywordflow">else</span> <span class="keywordflow">if</span>(ruleMap[rule_opt[0]]==rule::custom){</div>
+<div class="line"><a name="l02399"></a><span class="lineno"> 2399</span>           assert(polygon_opt[0]);<span class="comment">//not implemented for points</span></div>
+<div class="line"><a name="l02400"></a><span class="lineno"> 2400</span>           <span class="keywordflow">if</span>(verbose_opt[0])</div>
+<div class="line"><a name="l02401"></a><span class="lineno"> 2401</span>             std::cout << <span class="stringliteral">"number of points in polygon: "</span> << nPointPolygon << std::endl;</div>
+<div class="line"><a name="l02402"></a><span class="lineno"> 2402</span>           stat.normalize_pct(polyClassValues);</div>
+<div class="line"><a name="l02403"></a><span class="lineno"> 2403</span>           assert(polyClassValues.size()==2);<span class="comment">//11:broadleaved, 12:coniferous</span></div>
+<div class="line"><a name="l02404"></a><span class="lineno"> 2404</span>           <span class="keywordflow">if</span>(polyClassValues[0]>=75)<span class="comment">//broadleaved</span></div>
+<div class="line"><a name="l02405"></a><span class="lineno"> 2405</span>             writePolygonFeature->SetField(label_opt[0].c_str(),static_cast<int>(11));</div>
+<div class="line"><a name="l02406"></a><span class="lineno"> 2406</span>           <span class="keywordflow">else</span> <span class="keywordflow">if</span>(polyClassValues[1]>=75)<span class="comment">//coniferous</span></div>
+<div class="line"><a name="l02407"></a><span class="lineno"> 2407</span>             writePolygonFeature->SetField(label_opt[0].c_str(),static_cast<int>(12));</div>
+<div class="line"><a name="l02408"></a><span class="lineno"> 2408</span>           <span class="keywordflow">else</span> <span class="keywordflow">if</span>(polyClassValues[0]>25&&polyClassValues[1]>25)<span class="comment">//mixed</span></div>
+<div class="line"><a name="l02409"></a><span class="lineno"> 2409</span>             writePolygonFeature->SetField(label_opt[0].c_str(),static_cast<int>(13));</div>
+<div class="line"><a name="l02410"></a><span class="lineno"> 2410</span>           <span class="keywordflow">else</span>{</div>
+<div class="line"><a name="l02411"></a><span class="lineno"> 2411</span>             <span class="keywordflow">if</span>(verbose_opt[0]){</div>
+<div class="line"><a name="l02412"></a><span class="lineno"> 2412</span>               std::cout << <span class="stringliteral">"No valid value in polyClassValues..."</span> << std::endl;</div>
+<div class="line"><a name="l02413"></a><span class="lineno"> 2413</span>               <span class="keywordflow">for</span>(<span class="keywordtype">int</span> index=0;index<polyClassValues.size();++index){</div>
+<div class="line"><a name="l02414"></a><span class="lineno"> 2414</span>             <span class="keywordtype">double</span> theValue=polyClassValues[index];</div>
+<div class="line"><a name="l02415"></a><span class="lineno"> 2415</span>             std::cout << theValue << <span class="stringliteral">" "</span>;</div>
+<div class="line"><a name="l02416"></a><span class="lineno"> 2416</span>               }</div>
+<div class="line"><a name="l02417"></a><span class="lineno"> 2417</span>               std::cout << std::endl;</div>
+<div class="line"><a name="l02418"></a><span class="lineno"> 2418</span>             }</div>
+<div class="line"><a name="l02419"></a><span class="lineno"> 2419</span>             writePolygonFeature->SetField(label_opt[0].c_str(),static_cast<int>(20));</div>
+<div class="line"><a name="l02420"></a><span class="lineno"> 2420</span>           }</div>
+<div class="line"><a name="l02421"></a><span class="lineno"> 2421</span>         }</div>
+<div class="line"><a name="l02422"></a><span class="lineno"> 2422</span>         <span class="keywordflow">else</span> <span class="keywordflow">if</span>(ruleMap[rule_opt[0]]==rule::mode){</div>
+<div class="line"><a name="l02423"></a><span class="lineno"> 2423</span>           <span class="comment">//maximum votes in polygon</span></div>
+<div class="line"><a name="l02424"></a><span class="lineno"> 2424</span>           <span class="keywordflow">if</span>(verbose_opt[0])</div>
+<div class="line"><a name="l02425"></a><span class="lineno"> 2425</span>             std::cout << <span class="stringliteral">"number of points in polygon: "</span> << nPointPolygon << std::endl;</div>
+<div class="line"><a name="l02426"></a><span class="lineno"> 2426</span>           <span class="comment">//search for class with maximum votes</span></div>
+<div class="line"><a name="l02427"></a><span class="lineno"> 2427</span>           <span class="keywordtype">int</span> maxClass=stat.mymin(class_opt);</div>
+<div class="line"><a name="l02428"></a><span class="lineno"> 2428</span>           vector<double>::iterator maxit;</div>
+<div class="line"><a name="l02429"></a><span class="lineno"> 2429</span>           maxit=stat.mymax(polyClassValues,polyClassValues.begin(),polyClassValues.end());</div>
+<div class="line"><a name="l02430"></a><span class="lineno"> 2430</span>           <span class="keywordtype">int</span> maxIndex=distance(polyClassValues.begin(),maxit);</div>
+<div class="line"><a name="l02431"></a><span class="lineno"> 2431</span>           maxClass=class_opt[maxIndex];</div>
+<div class="line"><a name="l02432"></a><span class="lineno"> 2432</span>           <span class="keywordflow">if</span>(verbose_opt[0]>0)</div>
+<div class="line"><a name="l02433"></a><span class="lineno"> 2433</span>             std::cout << <span class="stringliteral">"maxClass: "</span> << maxClass << std::endl;</div>
+<div class="line"><a name="l02434"></a><span class="lineno"> 2434</span>           <span class="keywordflow">if</span>(polygon_opt[0])</div>
+<div class="line"><a name="l02435"></a><span class="lineno"> 2435</span>             writePolygonFeature->SetField(label_opt[0].c_str(),maxClass);</div>
+<div class="line"><a name="l02436"></a><span class="lineno"> 2436</span>           <span class="keywordflow">else</span></div>
+<div class="line"><a name="l02437"></a><span class="lineno"> 2437</span>             writeCentroidFeature->SetField(label_opt[0].c_str(),maxClass);</div>
+<div class="line"><a name="l02438"></a><span class="lineno"> 2438</span>         }</div>
+<div class="line"><a name="l02439"></a><span class="lineno"> 2439</span>           }</div>
+<div class="line"><a name="l02440"></a><span class="lineno"> 2440</span> </div>
+<div class="line"><a name="l02441"></a><span class="lineno"> 2441</span>           <span class="keywordflow">if</span>(polygon_opt[0]){</div>
+<div class="line"><a name="l02442"></a><span class="lineno"> 2442</span>         <span class="keywordflow">if</span>(verbose_opt[0]>1)</div>
+<div class="line"><a name="l02443"></a><span class="lineno"> 2443</span>           std::cout << <span class="stringliteral">"creating polygon feature"</span> << std::endl;</div>
+<div class="line"><a name="l02444"></a><span class="lineno"> 2444</span>         <span class="keywordflow">if</span>(writeTest){</div>
+<div class="line"><a name="l02445"></a><span class="lineno"> 2445</span>           <span class="keywordflow">if</span>(writeTestLayer->CreateFeature( writePolygonFeature ) != OGRERR_NONE ){</div>
+<div class="line"><a name="l02446"></a><span class="lineno"> 2446</span>             std::string errorString=<span class="stringliteral">"Failed to create polygon feature in ogr vector dataset"</span>;</div>
+<div class="line"><a name="l02447"></a><span class="lineno"> 2447</span>             <span class="keywordflow">throw</span>(errorString);</div>
+<div class="line"><a name="l02448"></a><span class="lineno"> 2448</span>           }</div>
+<div class="line"><a name="l02449"></a><span class="lineno"> 2449</span>         }</div>
+<div class="line"><a name="l02450"></a><span class="lineno"> 2450</span>         <span class="keywordflow">else</span>{</div>
+<div class="line"><a name="l02451"></a><span class="lineno"> 2451</span>           <span class="keywordflow">if</span>(writeLayer->CreateFeature( writePolygonFeature ) != OGRERR_NONE ){</div>
+<div class="line"><a name="l02452"></a><span class="lineno"> 2452</span>             std::string errorString=<span class="stringliteral">"Failed to create polygon feature in ogr vector dataset"</span>;</div>
+<div class="line"><a name="l02453"></a><span class="lineno"> 2453</span>             <span class="keywordflow">throw</span>(errorString);</div>
+<div class="line"><a name="l02454"></a><span class="lineno"> 2454</span>           }</div>
+<div class="line"><a name="l02455"></a><span class="lineno"> 2455</span>         }</div>
+<div class="line"><a name="l02456"></a><span class="lineno"> 2456</span>         OGRFeature::DestroyFeature( writePolygonFeature );</div>
+<div class="line"><a name="l02457"></a><span class="lineno"> 2457</span>         ++ntotalvalid;</div>
+<div class="line"><a name="l02458"></a><span class="lineno"> 2458</span>         <span class="keywordflow">if</span>(verbose_opt[0])</div>
+<div class="line"><a name="l02459"></a><span class="lineno"> 2459</span>           std::cout << <span class="stringliteral">"ntotalvalid: "</span> << ntotalvalid << std::endl;</div>
+<div class="line"><a name="l02460"></a><span class="lineno"> 2460</span>           }</div>
+<div class="line"><a name="l02461"></a><span class="lineno"> 2461</span>           <span class="keywordflow">else</span>{</div>
+<div class="line"><a name="l02462"></a><span class="lineno"> 2462</span>         <span class="keywordflow">if</span>(verbose_opt[0]>1)</div>
+<div class="line"><a name="l02463"></a><span class="lineno"> 2463</span>           std::cout << <span class="stringliteral">"creating point feature in centroid"</span> << std::endl;</div>
+<div class="line"><a name="l02464"></a><span class="lineno"> 2464</span>         <span class="keywordflow">if</span>(writeTest){</div>
+<div class="line"><a name="l02465"></a><span class="lineno"> 2465</span>           <span class="keywordflow">if</span>(writeTestLayer->CreateFeature( writeCentroidFeature ) != OGRERR_NONE ){</div>
+<div class="line"><a name="l02466"></a><span class="lineno"> 2466</span>             std::string errorString=<span class="stringliteral">"Failed to create point feature in ogr vector dataset"</span>;</div>
+<div class="line"><a name="l02467"></a><span class="lineno"> 2467</span>             <span class="keywordflow">throw</span>(errorString);</div>
+<div class="line"><a name="l02468"></a><span class="lineno"> 2468</span>           }</div>
+<div class="line"><a name="l02469"></a><span class="lineno"> 2469</span>         }</div>
+<div class="line"><a name="l02470"></a><span class="lineno"> 2470</span>         <span class="keywordflow">else</span>{</div>
+<div class="line"><a name="l02471"></a><span class="lineno"> 2471</span>           <span class="comment">//test</span></div>
+<div class="line"><a name="l02472"></a><span class="lineno"> 2472</span>           assert(validFeature);</div>
+<div class="line"><a name="l02473"></a><span class="lineno"> 2473</span>           <span class="keywordflow">if</span>(writeLayer->CreateFeature( writeCentroidFeature ) != OGRERR_NONE ){</div>
+<div class="line"><a name="l02474"></a><span class="lineno"> 2474</span>             std::string errorString=<span class="stringliteral">"Failed to create point feature in ogr vector dataset"</span>;</div>
+<div class="line"><a name="l02475"></a><span class="lineno"> 2475</span>             <span class="keywordflow">throw</span>(errorString);</div>
+<div class="line"><a name="l02476"></a><span class="lineno"> 2476</span>           }</div>
+<div class="line"><a name="l02477"></a><span class="lineno"> 2477</span>         }</div>
+<div class="line"><a name="l02478"></a><span class="lineno"> 2478</span>         OGRFeature::DestroyFeature( writeCentroidFeature );</div>
+<div class="line"><a name="l02479"></a><span class="lineno"> 2479</span>         ++ntotalvalid;</div>
+<div class="line"><a name="l02480"></a><span class="lineno"> 2480</span>         <span class="keywordflow">if</span>(verbose_opt[0])</div>
+<div class="line"><a name="l02481"></a><span class="lineno"> 2481</span>           std::cout << <span class="stringliteral">"ntotalvalid: "</span> << ntotalvalid << std::endl;</div>
+<div class="line"><a name="l02482"></a><span class="lineno"> 2482</span>           }</div>
+<div class="line"><a name="l02483"></a><span class="lineno"> 2483</span>         }</div>
+<div class="line"><a name="l02484"></a><span class="lineno"> 2484</span>       }</div>
+<div class="line"><a name="l02485"></a><span class="lineno"> 2485</span>       <span class="keywordflow">else</span>{</div>
+<div class="line"><a name="l02486"></a><span class="lineno"> 2486</span>         std::string test;</div>
+<div class="line"><a name="l02487"></a><span class="lineno"> 2487</span>         test=poGeometry->getGeometryName();</div>
+<div class="line"><a name="l02488"></a><span class="lineno"> 2488</span>         ostringstream oss;</div>
+<div class="line"><a name="l02489"></a><span class="lineno"> 2489</span>         oss << <span class="stringliteral">"geometry "</span> << test << <span class="stringliteral">" not supported"</span>;</div>
+<div class="line"><a name="l02490"></a><span class="lineno"> 2490</span>         <span class="keywordflow">throw</span>(oss.str());</div>
+<div class="line"><a name="l02491"></a><span class="lineno"> 2491</span>       }</div>
+<div class="line"><a name="l02492"></a><span class="lineno"> 2492</span>       ++ifeature;</div>
+<div class="line"><a name="l02493"></a><span class="lineno"> 2493</span>       progress=<span class="keyword">static_cast<</span><span class="keywordtype">float</span><span class="keyword">></span>(ifeature+1)/nfeature;</div>
+<div class="line"><a name="l02494"></a><span class="lineno"> 2494</span>       pfnProgress(progress,pszMessage,pProgressArg);</div>
+<div class="line"><a name="l02495"></a><span class="lineno"> 2495</span>     }</div>
+<div class="line"><a name="l02496"></a><span class="lineno"> 2496</span>     <span class="keywordflow">catch</span>(std::string e){</div>
+<div class="line"><a name="l02497"></a><span class="lineno"> 2497</span>       std::cout << e << std::endl;</div>
+<div class="line"><a name="l02498"></a><span class="lineno"> 2498</span>       <span class="keywordflow">continue</span>;</div>
+<div class="line"><a name="l02499"></a><span class="lineno"> 2499</span>     }</div>
+<div class="line"><a name="l02500"></a><span class="lineno"> 2500</span>     <span class="keywordflow">catch</span>(<span class="keywordtype">int</span> npoint){</div>
+<div class="line"><a name="l02501"></a><span class="lineno"> 2501</span>       <span class="keywordflow">if</span>(verbose_opt[0])</div>
+<div class="line"><a name="l02502"></a><span class="lineno"> 2502</span>         std::cout << <span class="stringliteral">"number of points read in polygon: "</span> << npoint << std::endl;</div>
+<div class="line"><a name="l02503"></a><span class="lineno"> 2503</span>       <span class="keywordflow">continue</span>;</div>
+<div class="line"><a name="l02504"></a><span class="lineno"> 2504</span>     }</div>
+<div class="line"><a name="l02505"></a><span class="lineno"> 2505</span>       }<span class="comment">//end of getNextFeature</span></div>
+<div class="line"><a name="l02506"></a><span class="lineno"> 2506</span>       <span class="comment">// if(rbox_opt[0]>0||cbox_opt[0]>0)</span></div>
+<div class="line"><a name="l02507"></a><span class="lineno"> 2507</span>       <span class="comment">//   boxWriter.close();</span></div>
+<div class="line"><a name="l02508"></a><span class="lineno"> 2508</span>       progress=1.0;</div>
+<div class="line"><a name="l02509"></a><span class="lineno"> 2509</span>       pfnProgress(progress,pszMessage,pProgressArg);</div>
+<div class="line"><a name="l02510"></a><span class="lineno"> 2510</span>       ++ilayerWrite;</div>
+<div class="line"><a name="l02511"></a><span class="lineno"> 2511</span>     }<span class="comment">//for ilayer</span></div>
+<div class="line"><a name="l02512"></a><span class="lineno"> 2512</span>     sampleReaderOgr.close();</div>
+<div class="line"><a name="l02513"></a><span class="lineno"> 2513</span>     ogrWriter.close();</div>
+<div class="line"><a name="l02514"></a><span class="lineno"> 2514</span>     <span class="keywordflow">if</span>(test_opt.size())</div>
+<div class="line"><a name="l02515"></a><span class="lineno"> 2515</span>       ogrTestWriter.close();</div>
+<div class="line"><a name="l02516"></a><span class="lineno"> 2516</span>   }<span class="comment">//else (vector)</span></div>
+<div class="line"><a name="l02517"></a><span class="lineno"> 2517</span>   progress=1.0;</div>
+<div class="line"><a name="l02518"></a><span class="lineno"> 2518</span>   pfnProgress(progress,pszMessage,pProgressArg);</div>
+<div class="line"><a name="l02519"></a><span class="lineno"> 2519</span>   imgReader.close();</div>
+<div class="line"><a name="l02520"></a><span class="lineno"> 2520</span> }</div>
+<div class="line"><a name="l02521"></a><span class="lineno"> 2521</span>   </div>
 <div class="ttc" id="classImgReaderGdal_html"><div class="ttname"><a href="classImgReaderGdal.html">ImgReaderGdal</a></div><div class="ttdef"><b>Definition:</b> <a href="ImgReaderGdal_8h_source.html#l00033">ImgReaderGdal.h:33</a></div></div>
 <div class="ttc" id="classVector2d_html"><div class="ttname"><a href="classVector2d.html">Vector2d</a></div><div class="ttdef"><b>Definition:</b> <a href="Vector2d_8h_source.html#l00031">Vector2d.h:31</a></div></div>
 <div class="ttc" id="classImgReaderOgr_html"><div class="ttname"><a href="classImgReaderOgr.html">ImgReaderOgr</a></div><div class="ttdef"><b>Definition:</b> <a href="ImgReaderOgr_8h_source.html#l00035">ImgReaderOgr.h:35</a></div></div>
@@ -2501,7 +2499,7 @@
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Jun 23 2015 17:09:36 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Tue Nov 3 2015 15:58:26 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/pkextract_8py_source.html b/doc/html/pkextract_8py_source.html
index 1827b12..1d5fc49 100644
--- a/doc/html/pkextract_8py_source.html
+++ b/doc/html/pkextract_8py_source.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.3</span>
+    <span id="projectnumber">2.6.4</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -145,7 +145,7 @@
 <div class="line"><a name="l00091"></a><span class="lineno">   91</span>     ITERATE = <span class="stringliteral">"ITERATE"</span></div>
 <div class="line"><a name="l00092"></a><span class="lineno">   92</span>     OUTPUT = <span class="stringliteral">"OUTPUT"</span></div>
 <div class="line"><a name="l00093"></a><span class="lineno">   93</span>     </div>
-<div class="line"><a name="l00094"></a><span class="lineno">   94</span>     RULE_OPTIONS = [<span class="stringliteral">'centroid'</span>, <span class="stringliteral">'point'</span>, <span class="stringliteral">'mean'</span>, <span class="stringliteral">'proportion'</span>, <span class="stringliteral">'min'</span>, <span class="stringliteral">'max'</span>, <span class="stringliteral">'mode'</span>, <span class="stringliteral"> [...]
+<div class="line"><a name="l00094"></a><span class="lineno">   94</span>     RULE_OPTIONS = [<span class="stringliteral">'centroid'</span>, <span class="stringliteral">'point'</span>, <span class="stringliteral">'mean'</span>, <span class="stringliteral">'proportion'</span>, <span class="stringliteral">'count'</span>, <span class="stringliteral">'min'</span>, <span class="stringliteral">'max'</span>, <span class="stringliteral" [...]
 <div class="line"><a name="l00095"></a><span class="lineno">   95</span> </div>
 <div class="line"><a name="l00096"></a><span class="lineno">   96</span>     RULE = <span class="stringliteral">"RULE"</span></div>
 <div class="line"><a name="l00097"></a><span class="lineno">   97</span>     POLYGON = <span class="stringliteral">"POLYGON"</span></div>
@@ -173,7 +173,7 @@
 <div class="line"><a name="l00119"></a><span class="lineno">  119</span>                           <span class="stringliteral">'Destination Format'</span>, FORMATS))</div>
 <div class="line"><a name="l00120"></a><span class="lineno">  120</span> </div>
 <div class="line"><a name="l00121"></a><span class="lineno">  121</span>         self.addParameter(ParameterBoolean(self.<a class="code" href="classqgis_1_1pkextract_1_1pkextract.html#ac120a3debadb9cbd38552fcdefba2fb0">POLYGON</a>, <span class="stringliteral">"Create OGRPolygon as geometry instead of OGRPoint"</span>,<span class="keyword">False</span>))</div>
-<div class="line"><a name="l00122"></a><span class="lineno">  122</span>         self.addParameter(ParameterNumber(self.<a class="code" href="classqgis_1_1pkextract_1_1pkextract.html#a0052109b006ae33bb2014a05ffd9226f">BUFFER</a>, <span class="stringliteral">"Buffer for calculating statistics for point features"</span>,1,25,1))</div>
+<div class="line"><a name="l00122"></a><span class="lineno">  122</span>         self.addParameter(ParameterNumber(self.<a class="code" href="classqgis_1_1pkextract_1_1pkextract.html#a0052109b006ae33bb2014a05ffd9226f">BUFFER</a>, <span class="stringliteral">"Buffer for calculating statistics for point features"</span>,0,19,0))</div>
 <div class="line"><a name="l00123"></a><span class="lineno">  123</span>         self.addParameter(ParameterString(self.<a class="code" href="classqgis_1_1pkextract_1_1pkextract.html#ab4431ebf4ce448655fcc25366f15abd3">SRCNODATA</a>, <span class="stringliteral">"invalid value(s) for input raster dataset (e.g., 0;255)"</span>,<span class="stringliteral">"none"</span>))</div>
 <div class="line"><a name="l00124"></a><span class="lineno">  124</span>         self.addParameter(ParameterString(self.<a class="code" href="classqgis_1_1pkextract_1_1pkextract.html#a1cb12c6b9a06225999395afa50b17987">BNDNODATA</a>, <span class="stringliteral">"Band(s) in input image to check if pixel is valid (e.g., 0;1)"</span>,<span class="stringliteral">"0"</span>))</div>
 <div class="line"><a name="l00125"></a><span class="lineno">  125</span> </div>
@@ -218,30 +218,28 @@
 <div class="line"><a name="l00164"></a><span class="lineno">  164</span>         commands.append(<span class="stringliteral">'-o'</span>)</div>
 <div class="line"><a name="l00165"></a><span class="lineno">  165</span>         commands.append(<span class="stringliteral">'"'</span> + outFile + <span class="stringliteral">'"'</span>)</div>
 <div class="line"><a name="l00166"></a><span class="lineno">  166</span> </div>
-<div class="line"><a name="l00167"></a><span class="lineno">  167</span>         <span class="keywordflow">if</span> self.getParameterValue(self.<a class="code" href="classqgis_1_1pkextract_1_1pkextract.html#ac120a3debadb9cbd38552fcdefba2fb0">POLYGON</a>):</div>
-<div class="line"><a name="l00168"></a><span class="lineno">  168</span>             commands.append(<span class="stringliteral">"-polygon"</span>)</div>
-<div class="line"><a name="l00169"></a><span class="lineno">  169</span>         buffer=self.getParameterValue(self.<a class="code" href="classqgis_1_1pkextract_1_1pkextract.html#a0052109b006ae33bb2014a05ffd9226f">BUFFER</a>)</div>
-<div class="line"><a name="l00170"></a><span class="lineno">  170</span>         <span class="keywordflow">if</span> buffer > 1:</div>
-<div class="line"><a name="l00171"></a><span class="lineno">  171</span>             commands.append(<span class="stringliteral">"-buf"</span>)</div>
-<div class="line"><a name="l00172"></a><span class="lineno">  172</span>             commands.append(str(buffer))</div>
-<div class="line"><a name="l00173"></a><span class="lineno">  173</span> </div>
-<div class="line"><a name="l00174"></a><span class="lineno">  174</span>         srcnodata=self.getParameterValue(self.<a class="code" href="classqgis_1_1pkextract_1_1pkextract.html#ab4431ebf4ce448655fcc25366f15abd3">SRCNODATA</a>)</div>
-<div class="line"><a name="l00175"></a><span class="lineno">  175</span>         <span class="keywordflow">if</span> srcnodata != <span class="stringliteral">"none"</span>:</div>
-<div class="line"><a name="l00176"></a><span class="lineno">  176</span>             srcnodataValues = srcnodata.split(<span class="stringliteral">';'</span>)</div>
-<div class="line"><a name="l00177"></a><span class="lineno">  177</span>             <span class="keywordflow">for</span> srcnodataValue <span class="keywordflow">in</span> srcnodataValues:</div>
-<div class="line"><a name="l00178"></a><span class="lineno">  178</span>                 commands.append(<span class="stringliteral">'-srcnodata'</span>)</div>
-<div class="line"><a name="l00179"></a><span class="lineno">  179</span>                 commands.append(srcnodataValue)</div>
-<div class="line"><a name="l00180"></a><span class="lineno">  180</span>         bndnodata=self.getParameterValue(self.<a class="code" href="classqgis_1_1pkextract_1_1pkextract.html#a1cb12c6b9a06225999395afa50b17987">BNDNODATA</a>)</div>
-<div class="line"><a name="l00181"></a><span class="lineno">  181</span>         bndnodataValues = bndnodata.split(<span class="stringliteral">';'</span>)</div>
-<div class="line"><a name="l00182"></a><span class="lineno">  182</span>         <span class="keywordflow">for</span> bndnodataValue <span class="keywordflow">in</span> bndnodataValues:</div>
-<div class="line"><a name="l00183"></a><span class="lineno">  183</span>             commands.append(<span class="stringliteral">'-bndnodata'</span>)</div>
-<div class="line"><a name="l00184"></a><span class="lineno">  184</span>             commands.append(bndnodataValue)</div>
-<div class="line"><a name="l00185"></a><span class="lineno">  185</span> </div>
-<div class="line"><a name="l00186"></a><span class="lineno">  186</span>         extra = str(self.getParameterValue(self.<a class="code" href="classqgis_1_1pkextract_1_1pkextract.html#a741cc5d777e44ecde629f16a2499ae6c">EXTRA</a>))</div>
-<div class="line"><a name="l00187"></a><span class="lineno">  187</span>         <span class="keywordflow">if</span> len(extra) > 0:</div>
-<div class="line"><a name="l00188"></a><span class="lineno">  188</span>             commands.append(extra)</div>
-<div class="line"><a name="l00189"></a><span class="lineno">  189</span> </div>
-<div class="line"><a name="l00190"></a><span class="lineno">  190</span>         pktoolsUtils.runpktools(commands, progress)</div>
+<div class="line"><a name="l00167"></a><span class="lineno">  167</span>         buffer=self.getParameterValue(self.<a class="code" href="classqgis_1_1pkextract_1_1pkextract.html#a0052109b006ae33bb2014a05ffd9226f">BUFFER</a>)</div>
+<div class="line"><a name="l00168"></a><span class="lineno">  168</span>         <span class="keywordflow">if</span> buffer > 1:</div>
+<div class="line"><a name="l00169"></a><span class="lineno">  169</span>             commands.append(<span class="stringliteral">"-buf"</span>)</div>
+<div class="line"><a name="l00170"></a><span class="lineno">  170</span>             commands.append(str(buffer))</div>
+<div class="line"><a name="l00171"></a><span class="lineno">  171</span> </div>
+<div class="line"><a name="l00172"></a><span class="lineno">  172</span>         srcnodata=self.getParameterValue(self.<a class="code" href="classqgis_1_1pkextract_1_1pkextract.html#ab4431ebf4ce448655fcc25366f15abd3">SRCNODATA</a>)</div>
+<div class="line"><a name="l00173"></a><span class="lineno">  173</span>         <span class="keywordflow">if</span> srcnodata != <span class="stringliteral">"none"</span>:</div>
+<div class="line"><a name="l00174"></a><span class="lineno">  174</span>             srcnodataValues = srcnodata.split(<span class="stringliteral">';'</span>)</div>
+<div class="line"><a name="l00175"></a><span class="lineno">  175</span>             <span class="keywordflow">for</span> srcnodataValue <span class="keywordflow">in</span> srcnodataValues:</div>
+<div class="line"><a name="l00176"></a><span class="lineno">  176</span>                 commands.append(<span class="stringliteral">'-srcnodata'</span>)</div>
+<div class="line"><a name="l00177"></a><span class="lineno">  177</span>                 commands.append(srcnodataValue)</div>
+<div class="line"><a name="l00178"></a><span class="lineno">  178</span>         bndnodata=self.getParameterValue(self.<a class="code" href="classqgis_1_1pkextract_1_1pkextract.html#a1cb12c6b9a06225999395afa50b17987">BNDNODATA</a>)</div>
+<div class="line"><a name="l00179"></a><span class="lineno">  179</span>         bndnodataValues = bndnodata.split(<span class="stringliteral">';'</span>)</div>
+<div class="line"><a name="l00180"></a><span class="lineno">  180</span>         <span class="keywordflow">for</span> bndnodataValue <span class="keywordflow">in</span> bndnodataValues:</div>
+<div class="line"><a name="l00181"></a><span class="lineno">  181</span>             commands.append(<span class="stringliteral">'-bndnodata'</span>)</div>
+<div class="line"><a name="l00182"></a><span class="lineno">  182</span>             commands.append(bndnodataValue)</div>
+<div class="line"><a name="l00183"></a><span class="lineno">  183</span> </div>
+<div class="line"><a name="l00184"></a><span class="lineno">  184</span>         extra = str(self.getParameterValue(self.<a class="code" href="classqgis_1_1pkextract_1_1pkextract.html#a741cc5d777e44ecde629f16a2499ae6c">EXTRA</a>))</div>
+<div class="line"><a name="l00185"></a><span class="lineno">  185</span>         <span class="keywordflow">if</span> len(extra) > 0:</div>
+<div class="line"><a name="l00186"></a><span class="lineno">  186</span>             commands.append(extra)</div>
+<div class="line"><a name="l00187"></a><span class="lineno">  187</span> </div>
+<div class="line"><a name="l00188"></a><span class="lineno">  188</span>         pktoolsUtils.runpktools(commands, progress)</div>
 <div class="ttc" id="classqgis_1_1pkextract_1_1pkextract_html_ac120a3debadb9cbd38552fcdefba2fb0"><div class="ttname"><a href="classqgis_1_1pkextract_1_1pkextract.html#ac120a3debadb9cbd38552fcdefba2fb0">qgis.pkextract.pkextract.POLYGON</a></div><div class="ttdeci">string POLYGON</div><div class="ttdef"><b>Definition:</b> <a href="pkextract_8py_source.html#l00097">pkextract.py:97</a></div></div>
 <div class="ttc" id="classqgis_1_1pkextract_1_1pkextract_html_a95e1c0317ddcaeda681980e70494a638"><div class="ttname"><a href="classqgis_1_1pkextract_1_1pkextract.html#a95e1c0317ddcaeda681980e70494a638">qgis.pkextract.pkextract.INPUT</a></div><div class="ttdeci">string INPUT</div><div class="ttdef"><b>Definition:</b> <a href="pkextract_8py_source.html#l00089">pkextract.py:89</a></div></div>
 <div class="ttc" id="classqgis_1_1pkextract_1_1pkextract_html_af5bc2523851ece32499990c6b9bd64f7"><div class="ttname"><a href="classqgis_1_1pkextract_1_1pkextract.html#af5bc2523851ece32499990c6b9bd64f7">qgis.pkextract.pkextract.cliName</a></div><div class="ttdeci">def cliName</div><div class="ttdef"><b>Definition:</b> <a href="pkextract_8py_source.html#l00106">pkextract.py:106</a></div></div>
@@ -262,7 +260,7 @@
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Jun 23 2015 17:09:36 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Tue Nov 3 2015 15:58:26 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/pkextract__grid_8py_source.html b/doc/html/pkextract__grid_8py_source.html
index 1b80f7a..04fc7cd 100644
--- a/doc/html/pkextract__grid_8py_source.html
+++ b/doc/html/pkextract__grid_8py_source.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.3</span>
+    <span id="projectnumber">2.6.4</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -246,7 +246,7 @@
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Jun 23 2015 17:09:36 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Tue Nov 3 2015 15:58:26 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/pkextract__gui_2main_8cpp_source.html b/doc/html/pkextract__gui_2main_8cpp_source.html
index f4de8e6..c79138e 100644
--- a/doc/html/pkextract__gui_2main_8cpp_source.html
+++ b/doc/html/pkextract__gui_2main_8cpp_source.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.3</span>
+    <span id="projectnumber">2.6.4</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -68,7 +68,7 @@
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Jun 23 2015 17:09:36 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Tue Nov 3 2015 15:58:26 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/pkextract__gui_2mainwindow_8cpp_source.html b/doc/html/pkextract__gui_2mainwindow_8cpp_source.html
index 1ac4746..64d2557 100644
--- a/doc/html/pkextract__gui_2mainwindow_8cpp_source.html
+++ b/doc/html/pkextract__gui_2mainwindow_8cpp_source.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.3</span>
+    <span id="projectnumber">2.6.4</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -262,7 +262,7 @@
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Jun 23 2015 17:09:36 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Tue Nov 3 2015 15:58:26 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/pkextract__gui_2mainwindow_8h_source.html b/doc/html/pkextract__gui_2mainwindow_8h_source.html
index 97f1381..0cec9f7 100644
--- a/doc/html/pkextract__gui_2mainwindow_8h_source.html
+++ b/doc/html/pkextract__gui_2mainwindow_8h_source.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.3</span>
+    <span id="projectnumber">2.6.4</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -103,7 +103,7 @@
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Jun 23 2015 17:09:36 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Tue Nov 3 2015 15:58:26 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/pkextract__random_8py_source.html b/doc/html/pkextract__random_8py_source.html
index 9f650c9..3649d14 100644
--- a/doc/html/pkextract__random_8py_source.html
+++ b/doc/html/pkextract__random_8py_source.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.3</span>
+    <span id="projectnumber">2.6.4</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -249,7 +249,7 @@
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Jun 23 2015 17:09:36 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Tue Nov 3 2015 15:58:26 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/pkfillnodata.html b/doc/html/pkfillnodata.html
index 6ffc59c..78cdb54 100644
--- a/doc/html/pkfillnodata.html
+++ b/doc/html/pkfillnodata.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.3</span>
+    <span id="projectnumber">2.6.4</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -79,7 +79,7 @@ Usage: pkfillnodata -i input.txt -m mask -o output </li>
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Jun 23 2015 17:09:37 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/pkfillnodata_8cc_source.html b/doc/html/pkfillnodata_8cc_source.html
index 2fd5702..aec31b2 100644
--- a/doc/html/pkfillnodata_8cc_source.html
+++ b/doc/html/pkfillnodata_8cc_source.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.3</span>
+    <span id="projectnumber">2.6.4</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -208,7 +208,7 @@
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Jun 23 2015 17:09:36 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Tue Nov 3 2015 15:58:26 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/pkfilter.html b/doc/html/pkfilter.html
index ae2f69f..b7b3201 100644
--- a/doc/html/pkfilter.html
+++ b/doc/html/pkfilter.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.3</span>
+    <span id="projectnumber">2.6.4</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -51,34 +51,131 @@
 <h1><a class="anchor" id="pkfilter_description"></a>
 Description</h1>
 <p>This utility implements spatial and spectral filtering for raster data. In the spatial domain (X, Y), the filter typically involves a rectangular convolution kernel (moving window). To avoid image shifting, the size of the window should be odd (3, 5, 7, ...). You can set the window sizes in X and Y directions separately with the options -dx and -dy. A circular kernel (disc) is applied if option -circ is set. An overview of the supported filters (option -f|–filter) is given below [...]
-<p><a class="anchor" id="pkfilter_functions"></a>hiero </p>
+<p><a class="anchor" id="pkfilter_functions"></a> </p>
+<h2><a class="anchor" id="pkfilter_functions_1"></a>
+Filters in spatial (dx, dy) and spectral/temporal (dz) domain</h2>
+<h3><a class="anchor" id="pkfilter_functions_1_1"></a>
+Implemented as moving window: choose dx, dy or dz > 1 and odd (3, 5, 7, etc.)</h3>
+<p>The number of output bands equals number of input bands</p>
 <table class="doxtable">
 <tr>
-<th>composite rule </th><th>composite output  </th></tr>
+<th>filter</th><th>description  </th></tr>
 <tr>
-<td>overwrite </td><td>Overwrite overlapping pixels: the latter input image on the command line overrules the previous image </td></tr>
+<td>dilate</td><td>morphological dilation </td></tr>
 <tr>
-<td>maxndvi </td><td>Create a maximum NDVI (normalized difference vegetation index) composite from multi-band input images. Use option -cb to set the indexes of the red and near infrared bands respectively (e.g., -cb 0 -cb 1) </td></tr>
+<td>erode</td><td>morphological erosion </td></tr>
 <tr>
-<td>maxband </td><td>Select the pixel with a maximum value in the band specified by option -cb </td></tr>
+<td>close</td><td>morpholigical closing (dilate+erode) </td></tr>
 <tr>
-<td>minband </td><td>Select the pixel with a minimum value in the band specified by option -cb </td></tr>
+<td>open</td><td>morpholigical opening (erode+dilate) </td></tr>
 <tr>
-<td>mean </td><td>Calculate the mean (average) of overlapping pixels </td></tr>
+<td>smoothnodata values</td><td>smooth nodata values (set nodata option!) </td></tr>
+</table>
+<p>Example: "Smooth" (interpolate) nodata in spectral/temporal domain (-dz 1), using a linear interpolation </p>
+<div class="fragment"><div class="line">pkfilter -i input.tif -o smoothed.tif -dz 1 -f smoothnodata -interp linear</div>
+</div><!-- fragment --><p>Example: Filter input.tif in spatial domain with morphological dilation filter with kernel size 3x3.</p>
+<div class="fragment"><div class="line">pkfilter -i input.tif -o dilated.tif -dx 3 -dy 3 -f dilate</div>
+</div><!-- fragment --><h3><a class="anchor" id="pkfilter_functions_1_2"></a>
+Implemented as either moving window or statistical function in spectral/temporal domain (choose dz=1).</h3>
+<p>In case of moving window, the number of output bands equals number of input bands. In case dz=1, the single output band is calculated as the result of the statistical function applied to all bands.</p>
+<table class="doxtable">
+<tr>
+<th>filter </th><th>description  </th></tr>
+<tr>
+<td>median </td><td>perform a median filter in spatial (dx, dy) or spectral/temporal (dz) domain </td></tr>
+<tr>
+<td>var </td><td>calculate variance in window </td></tr>
+<tr>
+<td>min </td><td>calculate minimum in window </td></tr>
+<tr>
+<td>max </td><td>calculate maximum in window </td></tr>
+<tr>
+<td>sum </td><td>calculate sum in window </td></tr>
+<tr>
+<td>mean </td><td>calculate mean in window </td></tr>
+<tr>
+<td>stdev </td><td>calculate standard deviation in window </td></tr>
+<tr>
+<td>savgolay </td><td>Savitzky-Golay filter (check examples page!) </td></tr>
+<tr>
+<td>percentile </td><td>calculate percentile value in window </td></tr>
+<tr>
+<td>proportion </td><td>calculate proportion in windoww </td></tr>
+</table>
+<p>Example: Median filter in spatial domain</p>
+<div class="fragment"><div class="line">pkfilter -i input.tif -o median.tif -dx 3 -dy 3 -f median</div>
+</div><!-- fragment --><p>Example: Calculate statistical variance in spectral/temporal domain (single output band)</p>
+<div class="fragment"><div class="line">pkfilter -i input.tif -o var.tif -dz 1 -f var</div>
+</div><!-- fragment --><h2><a class="anchor" id="pkfilter_functions_2"></a>
+Wavelet filters</h2>
+<h3><a class="anchor" id="pkfilter_functions_2_1"></a>
+Wavelet filter in in spatial or spectral/temporal (set dz = 1) domain.</h3>
+<p>The number of output bands equals number of input bands</p>
+<table class="doxtable">
+<tr>
+<th>filter </th><th>description  </th></tr>
+<tr>
+<td>dwt </td><td>discrete wavelet transform </td></tr>
+<tr>
+<td>dwti </td><td>discrete inverse wavelet transform </td></tr>
+<tr>
+<td>dwt_cut </td><td>discrete wavelet + inverse transform, using threshold option to cut percentile of coefficients </td></tr>
+</table>
+<p>Example: Calculate discrete wavelet in spatial domain</p>
+<div class="fragment"><div class="line">pkfilter -i lena.tif -o lena_dwt.tif -f dwt</div>
+</div><!-- fragment --><p>Example: Calculate discrete wavelet in spectral/temporal domain</p>
+<div class="fragment"><div class="line">pkfilter -i timeseries.tif -o dwt.tif -f dwt -dz 1</div>
+</div><!-- fragment --><h3><a class="anchor" id="pkfilter_functions_2_2"></a>
+Wavelet filter implemented in spectral/temporal domain only.</h3>
+<p>The number of output bands equals number of input bands</p>
+<table class="doxtable">
+<tr>
+<th>filter </th><th>description  </th></tr>
+<tr>
+<td>dwt_cut_from </td><td>discrete wavelet + inverse transform, setting all high frequence coefficients to zero (scale >= threshold) </td></tr>
+</table>
+<p>Example: Calculate low frequency time series based on discrete wavelet + inverse transform in spectral/temporal domain, retaining only coefficients until scale 3</p>
+<div class="fragment"><div class="line">pkfilter -i timeseries.tif -o lowfrequency.tif -f dwt_cut_from -dz 1 -t 4</div>
+</div><!-- fragment --><h2><a class="anchor" id="pkfilter_functions_3"></a>
+Filters in spatial domain only (dx, dy > 1 and odd).</h2>
+<p>The number of output bands equals number of input bands.</p>
+<table class="doxtable">
+<tr>
+<th>filter </th><th>description  </th></tr>
+<tr>
+<td>mrf </td><td>Markov random field </td></tr>
+<tr>
+<td>ismin </td><td>pixel is minimum? </td></tr>
+<tr>
+<td>ismax </td><td>pixel is maximum? </td></tr>
+<tr>
+<td>shift </td><td>perform a pixel shift in spatial window </td></tr>
+<tr>
+<td>scramble </td><td>scramble pixels in a spatial window </td></tr>
+<tr>
+<td>mode (majority voting </td><td>perform a majority voring (set class option) </td></tr>
+<tr>
+<td>sobelx </td><td>horizontal edge detection </td></tr>
+<tr>
+<td>sobely </td><td>vertical edge detection </td></tr>
+<tr>
+<td>sobelxy </td><td>diagonal edge detection (NE-SW) </td></tr>
 <tr>
-<td>stdev </td><td>Calculate the standard deviation of overlapping pixels </td></tr>
+<td>sobelyx </td><td>diagonal edge detection (NW-SE) </td></tr>
 <tr>
-<td>median </td><td>Calculate the median of overlapping pixels </td></tr>
+<td>countid </td><td>count digital numbers in window </td></tr>
 <tr>
-<td>mode </td><td>Select the mode of overlapping pixels (maximum voting): use for Byte images only </td></tr>
+<td>order </td><td>rank pixels in order </td></tr>
 <tr>
-<td>sum </td><td>Calculate the arithmetic sum of overlapping pixels </td></tr>
+<td>density </td><td>calculated the density </td></tr>
 <tr>
-<td>maxallbands </td><td>For each individual band, assign the maximum value found in all overlapping pixels. Unlike maxband, output band values cannot be attributed to a single (date) pixel in the input time series </td></tr>
+<td>homog </td><td>central pixel must be identical to all other pixels within window </td></tr>
 <tr>
-<td>minallbands </td><td>For each individual band, assign the minimum value found in all overlapping pixels. Unlike minband, output band values cannot be attributed to a single (date) pixel in the input time series </td></tr>
+<td>heterog </td><td>central pixel must be different than all other pixels within window </td></tr>
 </table>
-<h1><a class="anchor" id="pkfilter_options"></a>
+<p>Example: Sobel edge detection in horizontal direction</p>
+<div class="fragment"><div class="line">pkfilter -i lena.tif -o sobelx.tif -f sobelx -dx 5 -dy 5</div>
+</div><!-- fragment --><h1><a class="anchor" id="pkfilter_options"></a>
 Options</h1>
 <ul>
 <li>use either <code>-short</code> or <code>--long</code> options (both <code>--long=value</code> and <code>--long value</code> are supported)</li>
@@ -90,15 +187,15 @@ Options</h1>
 <tr>
 <td>o </td><td>output </td><td>std::string </td><td></td><td>Output image file </td></tr>
 <tr>
-<td>f </td><td>filter </td><td>std::string </td><td></td><td>filter function (median, var, min, max, sum, mean, dilate, erode, close, open, homog (central pixel must be identical to all other pixels within window), heterog (central pixel must be different than all other pixels within window), sobelx (horizontal edge detection), sobely (vertical edge detection), sobelxy (diagonal edge detection NE-SW),sobelyx (diagonal edge detection NW-SE), smooth, density, countid, mode (majority voting [...]
+<td>f </td><td>filter </td><td>std::string </td><td></td><td>filter function (median, var, min, max, sum, mean, dilate, erode, close, open, homog (central pixel must be identical to all other pixels within window), heterog (central pixel must be different than all other pixels within window), sobelx (horizontal edge detection), sobely (vertical edge detection), sobelxy (diagonal edge detection NE-SW),sobelyx (diagonal edge detection NW-SE), density, countid, mode (majority voting, only f [...]
 <tr>
 <td>srf </td><td>srf </td><td>std::string </td><td></td><td>list of ASCII files containing spectral response functions (two columns: wavelength response) </td></tr>
 <tr>
 <td>fwhm </td><td>fwhm </td><td>double </td><td></td><td>list of full width half to apply spectral filtering (-fwhm band1 -fwhm band2 ...) </td></tr>
 <tr>
-<td>dx </td><td>dx </td><td>double </td><td>3 </td><td>filter kernel size in x, better use odd value to avoid image shift </td></tr>
+<td>dx </td><td>dx </td><td>double </td><td>3 </td><td>filter kernel size in x, use odd values only </td></tr>
 <tr>
-<td>dy </td><td>dy </td><td>double </td><td>3 </td><td>filter kernel size in y, better use odd value to avoid image shift </td></tr>
+<td>dy </td><td>dy </td><td>double </td><td>3 </td><td>filter kernel size in y, use odd values only </td></tr>
 <tr>
 <td>dz </td><td>dz </td><td>int </td><td></td><td>filter kernel size in z (spectral/temporal dimension), must be odd (example: 3).. Set dz>0 if 1-D filter must be used in band domain </td></tr>
 <tr>
@@ -156,7 +253,7 @@ Usage: pkfilter -i input -o ouptut [-f filter | -perc value | -srf file [-srf fi
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Jun 23 2015 17:09:37 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/pkfilter_8cc_source.html b/doc/html/pkfilter_8cc_source.html
index 94b57fc..f395259 100644
--- a/doc/html/pkfilter_8cc_source.html
+++ b/doc/html/pkfilter_8cc_source.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.3</span>
+    <span id="projectnumber">2.6.4</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -89,934 +89,935 @@
 <div class="line"><a name="l00035"></a><span class="lineno">   35</span> <span class="preprocessor">#include "algorithms/StatFactory.h"</span></div>
 <div class="line"><a name="l00036"></a><span class="lineno">   36</span> </div>
 <div class="line"><a name="l00037"></a><span class="lineno">   37</span> <span class="comment">/******************************************************************************/</span></div>
-<div class="line"><a name="l00117"></a><span class="lineno">  117</span> <span class="keyword">using namespace </span>std;</div>
-<div class="line"><a name="l00118"></a><span class="lineno">  118</span> <span class="comment">/*------------------</span></div>
-<div class="line"><a name="l00119"></a><span class="lineno">  119</span> <span class="comment">  Main procedure</span></div>
-<div class="line"><a name="l00120"></a><span class="lineno">  120</span> <span class="comment">  ----------------*/</span></div>
-<div class="line"><a name="l00121"></a><span class="lineno">  121</span> <span class="keywordtype">int</span> main(<span class="keywordtype">int</span> argc,<span class="keywordtype">char</span> **argv) {</div>
-<div class="line"><a name="l00122"></a><span class="lineno">  122</span>   <a class="code" href="classOptionpk.html">Optionpk<std::string></a> input_opt(<span class="stringliteral">"i"</span>,<span class="stringliteral">"input"</span>,<span class="stringliteral">"input image file"</span>);</div>
-<div class="line"><a name="l00123"></a><span class="lineno">  123</span>   <a class="code" href="classOptionpk.html">Optionpk<std::string></a> output_opt(<span class="stringliteral">"o"</span>, <span class="stringliteral">"output"</span>, <span class="stringliteral">"Output image file"</span>);</div>
-<div class="line"><a name="l00124"></a><span class="lineno">  124</span>   <span class="comment">// Optionpk<std::string> tmpdir_opt("tmp", "tmp", "Temporary directory","/tmp",2);</span></div>
-<div class="line"><a name="l00125"></a><span class="lineno">  125</span>   <a class="code" href="classOptionpk.html">Optionpk<bool></a> disc_opt(<span class="stringliteral">"circ"</span>, <span class="stringliteral">"circular"</span>, <span class="stringliteral">"circular disc kernel for dilation and erosion"</span>, <span class="keyword">false</span>);</div>
-<div class="line"><a name="l00126"></a><span class="lineno">  126</span>   <span class="comment">// Optionpk<double> angle_opt("a", "angle", "angle used for directional filtering in dilation (North=0, East=90, South=180, West=270).");</span></div>
-<div class="line"><a name="l00127"></a><span class="lineno">  127</span>   <a class="code" href="classOptionpk.html">Optionpk<std::string></a> method_opt(<span class="stringliteral">"f"</span>, <span class="stringliteral">"filter"</span>, <span class="stringliteral">"filter function (median, var, min, max, sum, mean, dilate, erode, close, open, homog (central pixel must be identical to all other pixels within window), heterog (central pixel must be dif [...]
-<div class="line"><a name="l00128"></a><span class="lineno">  128</span>   <a class="code" href="classOptionpk.html">Optionpk<std::string></a> resample_opt(<span class="stringliteral">"r"</span>, <span class="stringliteral">"resampling-method"</span>, <span class="stringliteral">"Resampling method for shifting operation (near: nearest neighbour, bilinear: bi-linear interpolation)."</span>, <span class="stringliteral">"near"</span>);</div>
-<div class="line"><a name="l00129"></a><span class="lineno">  129</span>   <a class="code" href="classOptionpk.html">Optionpk<double></a> dimX_opt(<span class="stringliteral">"dx"</span>, <span class="stringliteral">"dx"</span>, <span class="stringliteral">"filter kernel size in x, better use odd value to avoid image shift"</span>, 3);</div>
-<div class="line"><a name="l00130"></a><span class="lineno">  130</span>   <a class="code" href="classOptionpk.html">Optionpk<double></a> dimY_opt(<span class="stringliteral">"dy"</span>, <span class="stringliteral">"dy"</span>, <span class="stringliteral">"filter kernel size in y, better use odd value to avoid image shift"</span>, 3);</div>
-<div class="line"><a name="l00131"></a><span class="lineno">  131</span>   <a class="code" href="classOptionpk.html">Optionpk<int></a> dimZ_opt(<span class="stringliteral">"dz"</span>, <span class="stringliteral">"dz"</span>, <span class="stringliteral">"filter kernel size in z (spectral/temporal dimension), must be odd (example: 3).. Set dz>0 if 1-D filter must be used in band domain"</span>);</div>
-<div class="line"><a name="l00132"></a><span class="lineno">  132</span>   <a class="code" href="classOptionpk.html">Optionpk<std::string></a> wavelet_type_opt(<span class="stringliteral">"wt"</span>, <span class="stringliteral">"wavelet"</span>, <span class="stringliteral">"wavelet type: daubechies,daubechies_centered, haar, haar_centered, bspline, bspline_centered"</span>, <span class="stringliteral">"daubechies"</span>);</div>
-<div class="line"><a name="l00133"></a><span class="lineno">  133</span>   <a class="code" href="classOptionpk.html">Optionpk<int></a> family_opt(<span class="stringliteral">"wf"</span>, <span class="stringliteral">"family"</span>, <span class="stringliteral">"wavelet family (vanishing moment, see also http://www.gnu.org/software/gsl/manual/html_node/DWT-Initialization.html)"</span>, 4);</div>
-<div class="line"><a name="l00134"></a><span class="lineno">  134</span>   <a class="code" href="classOptionpk.html">Optionpk<int></a> savgolay_nl_opt(<span class="stringliteral">"nl"</span>, <span class="stringliteral">"nl"</span>, <span class="stringliteral">"Number of leftward (past) data points used in Savitzky-Golay filter)"</span>, 2);</div>
-<div class="line"><a name="l00135"></a><span class="lineno">  135</span>   <a class="code" href="classOptionpk.html">Optionpk<int></a> savgolay_nr_opt(<span class="stringliteral">"nr"</span>, <span class="stringliteral">"nr"</span>, <span class="stringliteral">"Number of rightward (future) data points used in Savitzky-Golay filter)"</span>, 2);</div>
-<div class="line"><a name="l00136"></a><span class="lineno">  136</span>   <a class="code" href="classOptionpk.html">Optionpk<int></a> savgolay_ld_opt(<span class="stringliteral">"ld"</span>, <span class="stringliteral">"ld"</span>, <span class="stringliteral">"order of the derivative desired in Savitzky-Golay filter (e.g., ld=0 for smoothed function)"</span>, 0);</div>
-<div class="line"><a name="l00137"></a><span class="lineno">  137</span>   <a class="code" href="classOptionpk.html">Optionpk<int></a> savgolay_m_opt(<span class="stringliteral">"m"</span>, <span class="stringliteral">"m"</span>, <span class="stringliteral">"order of the smoothing polynomial in Savitzky-Golay filter, also equal to the highest conserved moment; usual values are m = 2 or m = 4)"</span>, 2);</div>
-<div class="line"><a name="l00138"></a><span class="lineno">  138</span>   <a class="code" href="classOptionpk.html">Optionpk<short></a> class_opt(<span class="stringliteral">"class"</span>, <span class="stringliteral">"class"</span>, <span class="stringliteral">"class value(s) to use for density, erosion, dilation, openening and closing, thresholding"</span>);</div>
-<div class="line"><a name="l00139"></a><span class="lineno">  139</span>   <a class="code" href="classOptionpk.html">Optionpk<double></a> threshold_opt(<span class="stringliteral">"t"</span>, <span class="stringliteral">"threshold"</span>, <span class="stringliteral">"threshold value(s) to use for threshold filter (one for each class), or threshold to cut for dwt_cut (use 0 to keep all) or dwt_cut_from, or sigma for shift"</span>, 0);</div>
-<div class="line"><a name="l00140"></a><span class="lineno">  140</span>   <a class="code" href="classOptionpk.html">Optionpk<double></a> nodata_opt(<span class="stringliteral">"nodata"</span>, <span class="stringliteral">"nodata"</span>, <span class="stringliteral">"nodata value(s) (used for smoothnodata filter)"</span>);</div>
-<div class="line"><a name="l00141"></a><span class="lineno">  141</span>   <a class="code" href="classOptionpk.html">Optionpk<std::string></a> tap_opt(<span class="stringliteral">"tap"</span>, <span class="stringliteral">"tap"</span>, <span class="stringliteral">"text file containing taps used for spatial filtering (from ul to lr). Use dimX and dimY to specify tap dimensions in x and y. Leave empty for not using taps"</span>);</div>
-<div class="line"><a name="l00142"></a><span class="lineno">  142</span>   <a class="code" href="classOptionpk.html">Optionpk<double></a> tapz_opt(<span class="stringliteral">"tapz"</span>, <span class="stringliteral">"tapz"</span>, <span class="stringliteral">"taps used for spectral filtering"</span>);</div>
-<div class="line"><a name="l00143"></a><span class="lineno">  143</span>   <a class="code" href="classOptionpk.html">Optionpk<string></a> padding_opt(<span class="stringliteral">"pad"</span>,<span class="stringliteral">"pad"</span>, <span class="stringliteral">"Padding method for filtering (how to handle edge effects). Choose between: symmetric, replicate, circular, zero (pad with 0)."</span>, <span class="stringliteral">"symmetric"</spa [...]
-<div class="line"><a name="l00144"></a><span class="lineno">  144</span>   <a class="code" href="classOptionpk.html">Optionpk<double></a> fwhm_opt(<span class="stringliteral">"fwhm"</span>, <span class="stringliteral">"fwhm"</span>, <span class="stringliteral">"list of full width half to apply spectral filtering (-fwhm band1 -fwhm band2 ...)"</span>);</div>
-<div class="line"><a name="l00145"></a><span class="lineno">  145</span>   <a class="code" href="classOptionpk.html">Optionpk<std::string></a> srf_opt(<span class="stringliteral">"srf"</span>, <span class="stringliteral">"srf"</span>, <span class="stringliteral">"list of ASCII files containing spectral response functions (two columns: wavelength response)"</span>);</div>
-<div class="line"><a name="l00146"></a><span class="lineno">  146</span>   <a class="code" href="classOptionpk.html">Optionpk<double></a> wavelengthIn_opt(<span class="stringliteral">"win"</span>, <span class="stringliteral">"wavelengthIn"</span>, <span class="stringliteral">"list of wavelengths in input spectrum (-win band1 -win band2 ...)"</span>);</div>
-<div class="line"><a name="l00147"></a><span class="lineno">  147</span>   <a class="code" href="classOptionpk.html">Optionpk<double></a> wavelengthOut_opt(<span class="stringliteral">"wout"</span>, <span class="stringliteral">"wavelengthOut"</span>, <span class="stringliteral">"list of wavelengths in output spectrum (-wout band1 -wout band2 ...)"</span>);</div>
-<div class="line"><a name="l00148"></a><span class="lineno">  148</span>   <a class="code" href="classOptionpk.html">Optionpk<std::string></a> interpolationType_opt(<span class="stringliteral">"interp"</span>, <span class="stringliteral">"interp"</span>, <span class="stringliteral">"type of interpolation for spectral filtering (see http://www.gnu.org/software/gsl/manual/html_node/Interpolation-Types.html)"</span>,<span class="stringliteral">" [...]
-<div class="line"><a name="l00149"></a><span class="lineno">  149</span>   <a class="code" href="classOptionpk.html">Optionpk<std::string></a>  otype_opt(<span class="stringliteral">"ot"</span>, <span class="stringliteral">"otype"</span>, <span class="stringliteral">"Data type for output image ({Byte/Int16/UInt16/UInt32/Int32/Float32/Float64/CInt16/CInt32/CFloat32/CFloat64}). Empty string: inherit type from input image"</span>,<span class="stringl [...]
-<div class="line"><a name="l00150"></a><span class="lineno">  150</span>   <a class="code" href="classOptionpk.html">Optionpk<string></a>  oformat_opt(<span class="stringliteral">"of"</span>, <span class="stringliteral">"oformat"</span>, <span class="stringliteral">"Output image format (see also gdal_translate). Empty string: inherit from input image"</span>);</div>
-<div class="line"><a name="l00151"></a><span class="lineno">  151</span>   <a class="code" href="classOptionpk.html">Optionpk<string></a>  colorTable_opt(<span class="stringliteral">"ct"</span>, <span class="stringliteral">"ct"</span>, <span class="stringliteral">"color table (file with 5 columns: id R G B ALFA (0: transparent, 255: solid). Use none to ommit color table"</span>);</div>
-<div class="line"><a name="l00152"></a><span class="lineno">  152</span>   <a class="code" href="classOptionpk.html">Optionpk<string></a> option_opt(<span class="stringliteral">"co"</span>, <span class="stringliteral">"co"</span>, <span class="stringliteral">"Creation option for output file. Multiple options can be specified."</span>);</div>
-<div class="line"><a name="l00153"></a><span class="lineno">  153</span>   <a class="code" href="classOptionpk.html">Optionpk<short></a> down_opt(<span class="stringliteral">"d"</span>, <span class="stringliteral">"down"</span>, <span class="stringliteral">"down sampling factor. Use value 1 for no downsampling). Use value n>1 for downsampling (aggregation)"</span>, 1);</div>
-<div class="line"><a name="l00154"></a><span class="lineno">  154</span>   <a class="code" href="classOptionpk.html">Optionpk<string></a> beta_opt(<span class="stringliteral">"beta"</span>, <span class="stringliteral">"beta"</span>, <span class="stringliteral">"ASCII file with beta for each class transition in Markov Random Field"</span>);</div>
-<div class="line"><a name="l00155"></a><span class="lineno">  155</span>   <span class="comment">// Optionpk<double> eps_opt("eps","eps", "error marging for linear feature",0);</span></div>
-<div class="line"><a name="l00156"></a><span class="lineno">  156</span>   <span class="comment">// Optionpk<bool> l1_opt("l1","l1", "obtain longest object length for linear feature",false);</span></div>
-<div class="line"><a name="l00157"></a><span class="lineno">  157</span>   <span class="comment">// Optionpk<bool> l2_opt("l2","l2", "obtain shortest object length for linear feature",false,2);</span></div>
-<div class="line"><a name="l00158"></a><span class="lineno">  158</span>   <span class="comment">// Optionpk<bool> a1_opt("a1","a1", "obtain angle found for longest object length for linear feature",false);</span></div>
-<div class="line"><a name="l00159"></a><span class="lineno">  159</span>   <span class="comment">// Optionpk<bool> a2_opt("a2","a2", "obtain angle found for shortest object length for linear feature",false);</span></div>
-<div class="line"><a name="l00160"></a><span class="lineno">  160</span>   <a class="code" href="classOptionpk.html">Optionpk<short></a> verbose_opt(<span class="stringliteral">"v"</span>, <span class="stringliteral">"verbose"</span>, <span class="stringliteral">"verbose mode if > 0"</span>, 0,2);</div>
-<div class="line"><a name="l00161"></a><span class="lineno">  161</span> </div>
-<div class="line"><a name="l00162"></a><span class="lineno">  162</span>   resample_opt.setHide(1);</div>
-<div class="line"><a name="l00163"></a><span class="lineno">  163</span>   option_opt.setHide(1);</div>
-<div class="line"><a name="l00164"></a><span class="lineno">  164</span>   wavelet_type_opt.setHide(1);</div>
-<div class="line"><a name="l00165"></a><span class="lineno">  165</span>   family_opt.setHide(1);</div>
-<div class="line"><a name="l00166"></a><span class="lineno">  166</span>   savgolay_nl_opt.setHide(1);</div>
-<div class="line"><a name="l00167"></a><span class="lineno">  167</span>   savgolay_nr_opt.setHide(1);</div>
-<div class="line"><a name="l00168"></a><span class="lineno">  168</span>   savgolay_ld_opt.setHide(1);</div>
-<div class="line"><a name="l00169"></a><span class="lineno">  169</span>   savgolay_m_opt.setHide(1);</div>
-<div class="line"><a name="l00170"></a><span class="lineno">  170</span>   class_opt.setHide(1);</div>
-<div class="line"><a name="l00171"></a><span class="lineno">  171</span>   threshold_opt.setHide(1);</div>
-<div class="line"><a name="l00172"></a><span class="lineno">  172</span>   tap_opt.setHide(1);</div>
-<div class="line"><a name="l00173"></a><span class="lineno">  173</span>   tapz_opt.setHide(1);</div>
-<div class="line"><a name="l00174"></a><span class="lineno">  174</span>   padding_opt.setHide(1);</div>
-<div class="line"><a name="l00175"></a><span class="lineno">  175</span>   wavelengthIn_opt.setHide(1);</div>
-<div class="line"><a name="l00176"></a><span class="lineno">  176</span>   wavelengthOut_opt.setHide(1);</div>
-<div class="line"><a name="l00177"></a><span class="lineno">  177</span>   down_opt.setHide(1);</div>
-<div class="line"><a name="l00178"></a><span class="lineno">  178</span>   beta_opt.setHide(1);</div>
-<div class="line"><a name="l00179"></a><span class="lineno">  179</span>   <span class="comment">// eps_opt.setHide(1);</span></div>
-<div class="line"><a name="l00180"></a><span class="lineno">  180</span>   <span class="comment">// l1_opt.setHide(1);</span></div>
-<div class="line"><a name="l00181"></a><span class="lineno">  181</span>   <span class="comment">// l2_opt.setHide(1);</span></div>
-<div class="line"><a name="l00182"></a><span class="lineno">  182</span>   <span class="comment">// a1_opt.setHide(1);</span></div>
-<div class="line"><a name="l00183"></a><span class="lineno">  183</span>   <span class="comment">// a2_opt.setHide(1);</span></div>
-<div class="line"><a name="l00184"></a><span class="lineno">  184</span>   interpolationType_opt.setHide(1);</div>
-<div class="line"><a name="l00185"></a><span class="lineno">  185</span>   otype_opt.setHide(1);</div>
-<div class="line"><a name="l00186"></a><span class="lineno">  186</span>   oformat_opt.setHide(1);</div>
-<div class="line"><a name="l00187"></a><span class="lineno">  187</span>   colorTable_opt.setHide(1);</div>
-<div class="line"><a name="l00188"></a><span class="lineno">  188</span>   disc_opt.setHide(1);</div>
-<div class="line"><a name="l00189"></a><span class="lineno">  189</span> </div>
-<div class="line"><a name="l00190"></a><span class="lineno">  190</span>   <span class="keywordtype">bool</span> doProcess;<span class="comment">//stop process when program was invoked with help option (-h --help)</span></div>
-<div class="line"><a name="l00191"></a><span class="lineno">  191</span>   <span class="keywordflow">try</span>{</div>
-<div class="line"><a name="l00192"></a><span class="lineno">  192</span>     doProcess=input_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00193"></a><span class="lineno">  193</span>     output_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00194"></a><span class="lineno">  194</span>     <span class="comment">// tmpdir_opt.retrieveOption(argc,argv);</span></div>
-<div class="line"><a name="l00195"></a><span class="lineno">  195</span>     <span class="comment">// angle_opt.retrieveOption(argc,argv);</span></div>
-<div class="line"><a name="l00196"></a><span class="lineno">  196</span>     method_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00197"></a><span class="lineno">  197</span>     srf_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00198"></a><span class="lineno">  198</span>     fwhm_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00199"></a><span class="lineno">  199</span>     dimX_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00200"></a><span class="lineno">  200</span>     dimY_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00201"></a><span class="lineno">  201</span>     dimZ_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00202"></a><span class="lineno">  202</span>     nodata_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00203"></a><span class="lineno">  203</span>     resample_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00204"></a><span class="lineno">  204</span>     option_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00205"></a><span class="lineno">  205</span>     wavelet_type_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00206"></a><span class="lineno">  206</span>     family_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00207"></a><span class="lineno">  207</span>     savgolay_nl_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00208"></a><span class="lineno">  208</span>     savgolay_nr_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00209"></a><span class="lineno">  209</span>     savgolay_ld_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00210"></a><span class="lineno">  210</span>     savgolay_m_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00211"></a><span class="lineno">  211</span>     class_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00212"></a><span class="lineno">  212</span>     threshold_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00213"></a><span class="lineno">  213</span>     tap_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00214"></a><span class="lineno">  214</span>     tapz_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00215"></a><span class="lineno">  215</span>     padding_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00216"></a><span class="lineno">  216</span>     wavelengthIn_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00217"></a><span class="lineno">  217</span>     wavelengthOut_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00218"></a><span class="lineno">  218</span>     down_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00219"></a><span class="lineno">  219</span>     beta_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00220"></a><span class="lineno">  220</span>     <span class="comment">// eps_opt.retrieveOption(argc,argv);</span></div>
-<div class="line"><a name="l00221"></a><span class="lineno">  221</span>     <span class="comment">// l1_opt.retrieveOption(argc,argv);</span></div>
-<div class="line"><a name="l00222"></a><span class="lineno">  222</span>     <span class="comment">// l2_opt.retrieveOption(argc,argv);</span></div>
-<div class="line"><a name="l00223"></a><span class="lineno">  223</span>     <span class="comment">// a1_opt.retrieveOption(argc,argv);</span></div>
-<div class="line"><a name="l00224"></a><span class="lineno">  224</span>     <span class="comment">// a2_opt.retrieveOption(argc,argv);</span></div>
-<div class="line"><a name="l00225"></a><span class="lineno">  225</span>     interpolationType_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00226"></a><span class="lineno">  226</span>     otype_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00227"></a><span class="lineno">  227</span>     oformat_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00228"></a><span class="lineno">  228</span>     colorTable_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00229"></a><span class="lineno">  229</span>     disc_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00230"></a><span class="lineno">  230</span>     verbose_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00231"></a><span class="lineno">  231</span>   }</div>
-<div class="line"><a name="l00232"></a><span class="lineno">  232</span>   <span class="keywordflow">catch</span>(<span class="keywordtype">string</span> predefinedString){</div>
-<div class="line"><a name="l00233"></a><span class="lineno">  233</span>     std::cout << predefinedString << std::endl;</div>
-<div class="line"><a name="l00234"></a><span class="lineno">  234</span>     exit(0);</div>
-<div class="line"><a name="l00235"></a><span class="lineno">  235</span>   }</div>
-<div class="line"><a name="l00236"></a><span class="lineno">  236</span>   <span class="keywordflow">if</span>(!doProcess){</div>
-<div class="line"><a name="l00237"></a><span class="lineno">  237</span>     cout << endl;</div>
-<div class="line"><a name="l00238"></a><span class="lineno">  238</span>     cout << <span class="stringliteral">"Usage: pkfilter -i input -o ouptut [-f filter | -perc value | -srf file [-srf file]* -win wavelength [-win wavelength]* | -wout wavelength -fwhm value [-wout wavelength -fwhm value]* -win wavelength [-win wavelength]*]"</span> << endl;</div>
-<div class="line"><a name="l00239"></a><span class="lineno">  239</span>     cout << endl;</div>
-<div class="line"><a name="l00240"></a><span class="lineno">  240</span>     std::cout << <span class="stringliteral">"short option -h shows basic options only, use long option --help to show all options"</span> << std::endl;</div>
-<div class="line"><a name="l00241"></a><span class="lineno">  241</span>     exit(0);<span class="comment">//help was invoked, stop processing</span></div>
-<div class="line"><a name="l00242"></a><span class="lineno">  242</span>   }</div>
-<div class="line"><a name="l00243"></a><span class="lineno">  243</span> </div>
-<div class="line"><a name="l00244"></a><span class="lineno">  244</span>   <span class="comment">//not implemented yet, must debug first...</span></div>
-<div class="line"><a name="l00245"></a><span class="lineno">  245</span>   vector<double> angle_opt;</div>
-<div class="line"><a name="l00246"></a><span class="lineno">  246</span> </div>
-<div class="line"><a name="l00247"></a><span class="lineno">  247</span>   <a class="code" href="classImgReaderGdal.html">ImgReaderGdal</a> input;</div>
-<div class="line"><a name="l00248"></a><span class="lineno">  248</span>   <a class="code" href="classImgWriterGdal.html">ImgWriterGdal</a> output;</div>
-<div class="line"><a name="l00249"></a><span class="lineno">  249</span>   <span class="keywordflow">if</span>(input_opt.empty()){</div>
-<div class="line"><a name="l00250"></a><span class="lineno">  250</span>     cerr << <span class="stringliteral">"Error: no input file selected, use option -i"</span> << endl;</div>
-<div class="line"><a name="l00251"></a><span class="lineno">  251</span>     exit(1);</div>
-<div class="line"><a name="l00252"></a><span class="lineno">  252</span>   }</div>
-<div class="line"><a name="l00253"></a><span class="lineno">  253</span>   <span class="keywordflow">if</span>(output_opt.empty()){</div>
-<div class="line"><a name="l00254"></a><span class="lineno">  254</span>     cerr << <span class="stringliteral">"Error: no output file selected, use option -o"</span> << endl;</div>
-<div class="line"><a name="l00255"></a><span class="lineno">  255</span>     exit(1);</div>
-<div class="line"><a name="l00256"></a><span class="lineno">  256</span>   }</div>
-<div class="line"><a name="l00257"></a><span class="lineno">  257</span>   input.open(input_opt[0]);</div>
-<div class="line"><a name="l00258"></a><span class="lineno">  258</span>   GDALDataType theType=GDT_Unknown;</div>
-<div class="line"><a name="l00259"></a><span class="lineno">  259</span>   <span class="keywordflow">if</span>(verbose_opt[0])</div>
-<div class="line"><a name="l00260"></a><span class="lineno">  260</span>     cout << <span class="stringliteral">"possible output data types: "</span>;</div>
-<div class="line"><a name="l00261"></a><span class="lineno">  261</span>   <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iType = 0; iType < GDT_TypeCount; ++iType){</div>
-<div class="line"><a name="l00262"></a><span class="lineno">  262</span>     <span class="keywordflow">if</span>(verbose_opt[0])</div>
-<div class="line"><a name="l00263"></a><span class="lineno">  263</span>       cout << <span class="stringliteral">" "</span> << GDALGetDataTypeName((GDALDataType)iType);</div>
-<div class="line"><a name="l00264"></a><span class="lineno">  264</span>     <span class="keywordflow">if</span>( GDALGetDataTypeName((GDALDataType)iType) != NULL</div>
-<div class="line"><a name="l00265"></a><span class="lineno">  265</span>         && EQUAL(GDALGetDataTypeName((GDALDataType)iType),</div>
-<div class="line"><a name="l00266"></a><span class="lineno">  266</span>                  otype_opt[0].c_str()))</div>
-<div class="line"><a name="l00267"></a><span class="lineno">  267</span>       theType=(GDALDataType) iType;</div>
-<div class="line"><a name="l00268"></a><span class="lineno">  268</span>   }</div>
-<div class="line"><a name="l00269"></a><span class="lineno">  269</span>   <span class="keywordflow">if</span>(theType==GDT_Unknown)</div>
-<div class="line"><a name="l00270"></a><span class="lineno">  270</span>     theType=input.getDataType();</div>
-<div class="line"><a name="l00271"></a><span class="lineno">  271</span> </div>
-<div class="line"><a name="l00272"></a><span class="lineno">  272</span>   <span class="keywordflow">if</span>(verbose_opt[0])</div>
-<div class="line"><a name="l00273"></a><span class="lineno">  273</span>     std::cout << std::endl << <span class="stringliteral">"Output pixel type:  "</span> << GDALGetDataTypeName(theType) << endl;</div>
-<div class="line"><a name="l00274"></a><span class="lineno">  274</span> </div>
-<div class="line"><a name="l00275"></a><span class="lineno">  275</span>   <span class="keywordtype">string</span> imageType=input.getImageType();</div>
-<div class="line"><a name="l00276"></a><span class="lineno">  276</span>   <span class="keywordflow">if</span>(oformat_opt.size())</div>
-<div class="line"><a name="l00277"></a><span class="lineno">  277</span>     imageType=oformat_opt[0];</div>
-<div class="line"><a name="l00278"></a><span class="lineno">  278</span> </div>
-<div class="line"><a name="l00279"></a><span class="lineno">  279</span>   <span class="keywordflow">if</span>(option_opt.findSubstring(<span class="stringliteral">"INTERLEAVE="</span>)==option_opt.end()){</div>
-<div class="line"><a name="l00280"></a><span class="lineno">  280</span>     <span class="keywordtype">string</span> theInterleave=<span class="stringliteral">"INTERLEAVE="</span>;</div>
-<div class="line"><a name="l00281"></a><span class="lineno">  281</span>     theInterleave+=input.getInterleave();</div>
-<div class="line"><a name="l00282"></a><span class="lineno">  282</span>     option_opt.push_back(theInterleave);</div>
-<div class="line"><a name="l00283"></a><span class="lineno">  283</span>   }</div>
-<div class="line"><a name="l00284"></a><span class="lineno">  284</span>   <span class="keywordflow">try</span>{</div>
-<div class="line"><a name="l00285"></a><span class="lineno">  285</span>     <span class="keywordtype">int</span> nband=input.nrOfBand();</div>
-<div class="line"><a name="l00286"></a><span class="lineno">  286</span> </div>
-<div class="line"><a name="l00287"></a><span class="lineno">  287</span>     <span class="keywordflow">if</span>(fwhm_opt.size())</div>
-<div class="line"><a name="l00288"></a><span class="lineno">  288</span>       nband=fwhm_opt.size();</div>
-<div class="line"><a name="l00289"></a><span class="lineno">  289</span>     <span class="keywordflow">else</span> <span class="keywordflow">if</span>(srf_opt.size())</div>
-<div class="line"><a name="l00290"></a><span class="lineno">  290</span>       nband=srf_opt.size();</div>
-<div class="line"><a name="l00291"></a><span class="lineno">  291</span>     <span class="keywordflow">else</span> <span class="keywordflow">if</span>(tap_opt.size()||tapz_opt.size())</div>
-<div class="line"><a name="l00292"></a><span class="lineno">  292</span>       nband=input.nrOfBand();</div>
-<div class="line"><a name="l00293"></a><span class="lineno">  293</span>     <span class="keywordflow">else</span>{</div>
-<div class="line"><a name="l00294"></a><span class="lineno">  294</span>       <span class="keywordflow">if</span>(method_opt.empty()){</div>
-<div class="line"><a name="l00295"></a><span class="lineno">  295</span>     cerr << <span class="stringliteral">"Error: no filter selected, use option -f"</span> << endl;</div>
-<div class="line"><a name="l00296"></a><span class="lineno">  296</span>     exit(1);</div>
-<div class="line"><a name="l00297"></a><span class="lineno">  297</span>       }</div>
-<div class="line"><a name="l00298"></a><span class="lineno">  298</span>       <span class="keywordflow">switch</span>(filter2d::Filter2d::getFilterType(method_opt[0])){</div>
-<div class="line"><a name="l00299"></a><span class="lineno">  299</span>       <span class="keywordflow">case</span>(filter2d::dilate):</div>
-<div class="line"><a name="l00300"></a><span class="lineno">  300</span>       <span class="keywordflow">case</span>(filter2d::erode):</div>
-<div class="line"><a name="l00301"></a><span class="lineno">  301</span>       <span class="keywordflow">case</span>(filter2d::close):</div>
-<div class="line"><a name="l00302"></a><span class="lineno">  302</span>       <span class="keywordflow">case</span>(filter2d::open):</div>
-<div class="line"><a name="l00303"></a><span class="lineno">  303</span>       <span class="keywordflow">case</span>(filter2d::smooth):</div>
-<div class="line"><a name="l00304"></a><span class="lineno">  304</span>     <span class="comment">//implemented in spectral/temporal domain (dimZ>1) and spatial domain</span></div>
-<div class="line"><a name="l00305"></a><span class="lineno">  305</span>     <span class="keywordflow">if</span>(dimZ_opt.size())</div>
-<div class="line"><a name="l00306"></a><span class="lineno">  306</span>       assert(dimZ_opt[0]>1);</div>
-<div class="line"><a name="l00307"></a><span class="lineno">  307</span>       nband=input.nrOfBand();</div>
-<div class="line"><a name="l00308"></a><span class="lineno">  308</span>       <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l00309"></a><span class="lineno">  309</span>       <span class="keywordflow">case</span>(filter2d::dwt):</div>
-<div class="line"><a name="l00310"></a><span class="lineno">  310</span>       <span class="keywordflow">case</span>(filter2d::dwti):</div>
-<div class="line"><a name="l00311"></a><span class="lineno">  311</span>       <span class="keywordflow">case</span>(filter2d::dwt_cut):</div>
-<div class="line"><a name="l00312"></a><span class="lineno">  312</span>       <span class="keywordflow">case</span>(filter2d::smoothnodata):</div>
-<div class="line"><a name="l00313"></a><span class="lineno">  313</span>     <span class="comment">//implemented in spectral/temporal/spatial domain and nband always input.nrOfBand()</span></div>
-<div class="line"><a name="l00314"></a><span class="lineno">  314</span>     nband=input.nrOfBand();</div>
-<div class="line"><a name="l00315"></a><span class="lineno">  315</span>     <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l00316"></a><span class="lineno">  316</span>       <span class="keywordflow">case</span>(filter2d::savgolay):</div>
-<div class="line"><a name="l00317"></a><span class="lineno">  317</span>     nband=input.nrOfBand();</div>
-<div class="line"><a name="l00318"></a><span class="lineno">  318</span>     <span class="keywordflow">if</span>(dimZ_opt.empty())</div>
-<div class="line"><a name="l00319"></a><span class="lineno">  319</span>       dimZ_opt.push_back(1);</div>
-<div class="line"><a name="l00320"></a><span class="lineno">  320</span>       <span class="keywordflow">case</span>(filter2d::dwt_cut_from):</div>
-<div class="line"><a name="l00321"></a><span class="lineno">  321</span>     <span class="comment">//only implemented in spectral/temporal domain</span></div>
-<div class="line"><a name="l00322"></a><span class="lineno">  322</span>     <span class="keywordflow">if</span>(dimZ_opt.size()){</div>
-<div class="line"><a name="l00323"></a><span class="lineno">  323</span>       nband=input.nrOfBand();</div>
-<div class="line"><a name="l00324"></a><span class="lineno">  324</span>       assert(threshold_opt.size());</div>
-<div class="line"><a name="l00325"></a><span class="lineno">  325</span>     }</div>
-<div class="line"><a name="l00326"></a><span class="lineno">  326</span>     <span class="keywordflow">else</span>{</div>
-<div class="line"><a name="l00327"></a><span class="lineno">  327</span>       cerr << <span class="stringliteral">"filter not implemented in spectral/temporal domain"</span> << endl;</div>
-<div class="line"><a name="l00328"></a><span class="lineno">  328</span>       exit(1);</div>
-<div class="line"><a name="l00329"></a><span class="lineno">  329</span>     }</div>
-<div class="line"><a name="l00330"></a><span class="lineno">  330</span>     <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l00331"></a><span class="lineno">  331</span>       <span class="keywordflow">case</span>(filter2d::mrf):<span class="comment">//deliberate fall through</span></div>
-<div class="line"><a name="l00332"></a><span class="lineno">  332</span>     assert(class_opt.size()>1);</div>
-<div class="line"><a name="l00333"></a><span class="lineno">  333</span>     <span class="keywordflow">if</span>(verbose_opt[0])</div>
-<div class="line"><a name="l00334"></a><span class="lineno">  334</span>       std::cout << <span class="stringliteral">"opening output image "</span> << output_opt[0] << std::endl;</div>
-<div class="line"><a name="l00335"></a><span class="lineno">  335</span>     nband=class_opt.size();</div>
-<div class="line"><a name="l00336"></a><span class="lineno">  336</span>       <span class="keywordflow">case</span>(filter2d::ismin):</div>
-<div class="line"><a name="l00337"></a><span class="lineno">  337</span>       <span class="keywordflow">case</span>(filter2d::ismax):</div>
-<div class="line"><a name="l00338"></a><span class="lineno">  338</span>       <span class="keywordflow">case</span>(filter2d::shift):</div>
-<div class="line"><a name="l00339"></a><span class="lineno">  339</span>       <span class="keywordflow">case</span>(filter2d::scramble):</div>
-<div class="line"><a name="l00340"></a><span class="lineno">  340</span>       <span class="keywordflow">case</span>(filter2d::mode):</div>
-<div class="line"><a name="l00341"></a><span class="lineno">  341</span>       <span class="keywordflow">case</span>(filter2d::sobelx):</div>
-<div class="line"><a name="l00342"></a><span class="lineno">  342</span>       <span class="keywordflow">case</span>(filter2d::sobely):</div>
-<div class="line"><a name="l00343"></a><span class="lineno">  343</span>       <span class="keywordflow">case</span>(filter2d::sobelxy):</div>
-<div class="line"><a name="l00344"></a><span class="lineno">  344</span>       <span class="keywordflow">case</span>(filter2d::countid):</div>
-<div class="line"><a name="l00345"></a><span class="lineno">  345</span>       <span class="keywordflow">case</span>(filter2d::order):</div>
-<div class="line"><a name="l00346"></a><span class="lineno">  346</span>       <span class="keywordflow">case</span>(filter2d::density):</div>
-<div class="line"><a name="l00347"></a><span class="lineno">  347</span>       <span class="keywordflow">case</span>(filter2d::homog):</div>
-<div class="line"><a name="l00348"></a><span class="lineno">  348</span>       <span class="keywordflow">case</span>(filter2d::heterog):</div>
-<div class="line"><a name="l00349"></a><span class="lineno">  349</span>     <span class="comment">//only implemented in spatial domain</span></div>
-<div class="line"><a name="l00350"></a><span class="lineno">  350</span>     <span class="keywordflow">if</span>(dimZ_opt.size()){</div>
-<div class="line"><a name="l00351"></a><span class="lineno">  351</span>       cerr << <span class="stringliteral">"filter not implemented in spectral/temporal domain"</span> << endl;</div>
-<div class="line"><a name="l00352"></a><span class="lineno">  352</span>       exit(1);</div>
-<div class="line"><a name="l00353"></a><span class="lineno">  353</span>     }</div>
-<div class="line"><a name="l00354"></a><span class="lineno">  354</span>     <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l00355"></a><span class="lineno">  355</span>       <span class="comment">// case(filter2d::percentile):</span></div>
-<div class="line"><a name="l00356"></a><span class="lineno">  356</span>       <span class="comment">//    //implemented in spectral/temporal/spatial domain and nband 1 if dimZ>0</span></div>
-<div class="line"><a name="l00357"></a><span class="lineno">  357</span>       <span class="comment">//    if(dimZ_opt.size()){</span></div>
-<div class="line"><a name="l00358"></a><span class="lineno">  358</span>       <span class="comment">//      dimZ_opt[0]=1;</span></div>
-<div class="line"><a name="l00359"></a><span class="lineno">  359</span>       <span class="comment">//      nband=1;</span></div>
-<div class="line"><a name="l00360"></a><span class="lineno">  360</span>       <span class="comment">//    }</span></div>
-<div class="line"><a name="l00361"></a><span class="lineno">  361</span>       <span class="comment">//    else</span></div>
-<div class="line"><a name="l00362"></a><span class="lineno">  362</span>       <span class="comment">//      nband=input.nrOfBand();</span></div>
-<div class="line"><a name="l00363"></a><span class="lineno">  363</span>       <span class="comment">//    break;</span></div>
-<div class="line"><a name="l00364"></a><span class="lineno">  364</span>       <span class="keywordflow">case</span>(filter2d::sum):</div>
-<div class="line"><a name="l00365"></a><span class="lineno">  365</span>       <span class="keywordflow">case</span>(filter2d::mean):</div>
-<div class="line"><a name="l00366"></a><span class="lineno">  366</span>       <span class="keywordflow">case</span>(filter2d::min):</div>
-<div class="line"><a name="l00367"></a><span class="lineno">  367</span>       <span class="keywordflow">case</span>(filter2d::max):</div>
-<div class="line"><a name="l00368"></a><span class="lineno">  368</span>       <span class="keywordflow">case</span>(filter2d::var):</div>
-<div class="line"><a name="l00369"></a><span class="lineno">  369</span>       <span class="keywordflow">case</span>(filter2d::stdev):</div>
-<div class="line"><a name="l00370"></a><span class="lineno">  370</span>       <span class="keywordflow">case</span>(filter2d::median):</div>
-<div class="line"><a name="l00371"></a><span class="lineno">  371</span>       <span class="keywordflow">case</span>(filter2d::percentile):</div>
-<div class="line"><a name="l00372"></a><span class="lineno">  372</span>     <span class="comment">//implemented in spectral/temporal/spatial domain and nband 1 if dimZ==1</span></div>
-<div class="line"><a name="l00373"></a><span class="lineno">  373</span>     <span class="keywordflow">if</span>(dimZ_opt.size()==1)</div>
-<div class="line"><a name="l00374"></a><span class="lineno">  374</span>       <span class="keywordflow">if</span>(dimZ_opt[0]==1)</div>
-<div class="line"><a name="l00375"></a><span class="lineno">  375</span>         nband=1;</div>
-<div class="line"><a name="l00376"></a><span class="lineno">  376</span>     <span class="keywordflow">else</span></div>
-<div class="line"><a name="l00377"></a><span class="lineno">  377</span>       nband=input.nrOfBand();</div>
-<div class="line"><a name="l00378"></a><span class="lineno">  378</span>     <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l00379"></a><span class="lineno">  379</span>       <span class="keywordflow">default</span>:</div>
-<div class="line"><a name="l00380"></a><span class="lineno">  380</span>     cerr << <span class="stringliteral">"filter not implemented"</span> << endl;</div>
-<div class="line"><a name="l00381"></a><span class="lineno">  381</span>     exit(1);</div>
-<div class="line"><a name="l00382"></a><span class="lineno">  382</span>     <span class="comment">// if(dimZ_opt.size())</span></div>
-<div class="line"><a name="l00383"></a><span class="lineno">  383</span>     <span class="comment">//   nband=dimZ_opt[0];</span></div>
-<div class="line"><a name="l00384"></a><span class="lineno">  384</span>     <span class="comment">// else</span></div>
-<div class="line"><a name="l00385"></a><span class="lineno">  385</span>     <span class="comment">//   nband=input.nrOfBand();</span></div>
-<div class="line"><a name="l00386"></a><span class="lineno">  386</span>     <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l00387"></a><span class="lineno">  387</span>       }</div>
-<div class="line"><a name="l00388"></a><span class="lineno">  388</span>     }</div>
-<div class="line"><a name="l00389"></a><span class="lineno">  389</span>     std::cout << <span class="stringliteral">"opening output image "</span> << output_opt[0] << <span class="stringliteral">" with "</span> << nband << <span class="stringliteral">" bands"</span> << std::endl;</div>
-<div class="line"><a name="l00390"></a><span class="lineno">  390</span>     output.open(output_opt[0],(input.nrOfCol()+down_opt[0]-1)/down_opt[0],(input.nrOfRow()+down_opt[0]-1)/down_opt[0],nband,theType,imageType,option_opt);</div>
-<div class="line"><a name="l00391"></a><span class="lineno">  391</span>   }</div>
-<div class="line"><a name="l00392"></a><span class="lineno">  392</span>   <span class="keywordflow">catch</span>(<span class="keywordtype">string</span> errorstring){</div>
-<div class="line"><a name="l00393"></a><span class="lineno">  393</span>     cout << errorstring << endl;</div>
-<div class="line"><a name="l00394"></a><span class="lineno">  394</span>     exit(4);</div>
-<div class="line"><a name="l00395"></a><span class="lineno">  395</span>   }</div>
-<div class="line"><a name="l00396"></a><span class="lineno">  396</span>   output.setProjection(input.getProjection());</div>
-<div class="line"><a name="l00397"></a><span class="lineno">  397</span>   <span class="keywordtype">double</span> gt[6];</div>
-<div class="line"><a name="l00398"></a><span class="lineno">  398</span>   input.getGeoTransform(gt);</div>
-<div class="line"><a name="l00399"></a><span class="lineno">  399</span>   gt[1]*=down_opt[0];<span class="comment">//dx</span></div>
-<div class="line"><a name="l00400"></a><span class="lineno">  400</span>   gt[5]*=down_opt[0];<span class="comment">//dy</span></div>
-<div class="line"><a name="l00401"></a><span class="lineno">  401</span>   output.setGeoTransform(gt);</div>
-<div class="line"><a name="l00402"></a><span class="lineno">  402</span>   </div>
-<div class="line"><a name="l00403"></a><span class="lineno">  403</span>   <span class="keywordflow">if</span>(colorTable_opt.size()){</div>
-<div class="line"><a name="l00404"></a><span class="lineno">  404</span>     <span class="keywordflow">if</span>(colorTable_opt[0]!=<span class="stringliteral">"none"</span>){</div>
-<div class="line"><a name="l00405"></a><span class="lineno">  405</span>       <span class="keywordflow">if</span>(verbose_opt[0])</div>
-<div class="line"><a name="l00406"></a><span class="lineno">  406</span>     cout << <span class="stringliteral">"set colortable "</span> << colorTable_opt[0] << endl;</div>
-<div class="line"><a name="l00407"></a><span class="lineno">  407</span>       assert(output.getDataType()==GDT_Byte);</div>
-<div class="line"><a name="l00408"></a><span class="lineno">  408</span>       output.setColorTable(colorTable_opt[0]);</div>
-<div class="line"><a name="l00409"></a><span class="lineno">  409</span>     }</div>
-<div class="line"><a name="l00410"></a><span class="lineno">  410</span>   }</div>
-<div class="line"><a name="l00411"></a><span class="lineno">  411</span>   <span class="keywordflow">else</span> <span class="keywordflow">if</span>(input.getColorTable()!=NULL)</div>
-<div class="line"><a name="l00412"></a><span class="lineno">  412</span>     output.setColorTable(input.getColorTable());</div>
-<div class="line"><a name="l00413"></a><span class="lineno">  413</span>   </div>
-<div class="line"><a name="l00414"></a><span class="lineno">  414</span>   <span class="keywordflow">if</span>(nodata_opt.size()){</div>
-<div class="line"><a name="l00415"></a><span class="lineno">  415</span>       <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iband=0;iband<output.nrOfBand();++iband)</div>
-<div class="line"><a name="l00416"></a><span class="lineno">  416</span>     output.GDALSetNoDataValue(nodata_opt[0],iband);</div>
-<div class="line"><a name="l00417"></a><span class="lineno">  417</span>   }</div>
-<div class="line"><a name="l00418"></a><span class="lineno">  418</span> </div>
-<div class="line"><a name="l00419"></a><span class="lineno">  419</span>   <a class="code" href="classfilter2d_1_1Filter2d.html">filter2d::Filter2d</a> filter2d;</div>
-<div class="line"><a name="l00420"></a><span class="lineno">  420</span>   <a class="code" href="classfilter_1_1Filter.html">filter::Filter</a> filter1d;</div>
-<div class="line"><a name="l00421"></a><span class="lineno">  421</span>   <span class="keywordflow">if</span>(verbose_opt[0])</div>
-<div class="line"><a name="l00422"></a><span class="lineno">  422</span>     cout << <span class="stringliteral">"Set padding to "</span> << padding_opt[0] << endl;</div>
-<div class="line"><a name="l00423"></a><span class="lineno">  423</span>   filter1d.setPadding(padding_opt[0]);</div>
-<div class="line"><a name="l00424"></a><span class="lineno">  424</span>   <span class="keywordflow">if</span>(class_opt.size()){</div>
-<div class="line"><a name="l00425"></a><span class="lineno">  425</span>     <span class="keywordflow">if</span>(verbose_opt[0])</div>
-<div class="line"><a name="l00426"></a><span class="lineno">  426</span>       std::cout<< <span class="stringliteral">"class values: "</span>;</div>
-<div class="line"><a name="l00427"></a><span class="lineno">  427</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iclass=0;iclass<class_opt.size();++iclass){</div>
-<div class="line"><a name="l00428"></a><span class="lineno">  428</span>       <span class="keywordflow">if</span>(!dimZ_opt.size())</div>
-<div class="line"><a name="l00429"></a><span class="lineno">  429</span>         filter2d.pushClass(class_opt[iclass]);</div>
-<div class="line"><a name="l00430"></a><span class="lineno">  430</span>       <span class="keywordflow">else</span></div>
-<div class="line"><a name="l00431"></a><span class="lineno">  431</span>         filter1d.pushClass(class_opt[iclass]);</div>
-<div class="line"><a name="l00432"></a><span class="lineno">  432</span>       <span class="keywordflow">if</span>(verbose_opt[0])</div>
-<div class="line"><a name="l00433"></a><span class="lineno">  433</span>         std::cout<< class_opt[iclass] << <span class="stringliteral">" "</span>;</div>
-<div class="line"><a name="l00434"></a><span class="lineno">  434</span>     }</div>
-<div class="line"><a name="l00435"></a><span class="lineno">  435</span>     <span class="keywordflow">if</span>(verbose_opt[0])</div>
-<div class="line"><a name="l00436"></a><span class="lineno">  436</span>       std::cout<< std::endl;</div>
-<div class="line"><a name="l00437"></a><span class="lineno">  437</span>   }</div>
-<div class="line"><a name="l00438"></a><span class="lineno">  438</span> </div>
-<div class="line"><a name="l00439"></a><span class="lineno">  439</span>   <span class="keywordflow">if</span>(nodata_opt.size()){</div>
+<div class="line"><a name="l00224"></a><span class="lineno">  224</span> <span class="keyword">using namespace </span>std;</div>
+<div class="line"><a name="l00225"></a><span class="lineno">  225</span> <span class="comment">/*------------------</span></div>
+<div class="line"><a name="l00226"></a><span class="lineno">  226</span> <span class="comment">  Main procedure</span></div>
+<div class="line"><a name="l00227"></a><span class="lineno">  227</span> <span class="comment">  ----------------*/</span></div>
+<div class="line"><a name="l00228"></a><span class="lineno">  228</span> <span class="keywordtype">int</span> main(<span class="keywordtype">int</span> argc,<span class="keywordtype">char</span> **argv) {</div>
+<div class="line"><a name="l00229"></a><span class="lineno">  229</span>   <a class="code" href="classOptionpk.html">Optionpk<std::string></a> input_opt(<span class="stringliteral">"i"</span>,<span class="stringliteral">"input"</span>,<span class="stringliteral">"input image file"</span>);</div>
+<div class="line"><a name="l00230"></a><span class="lineno">  230</span>   <a class="code" href="classOptionpk.html">Optionpk<std::string></a> output_opt(<span class="stringliteral">"o"</span>, <span class="stringliteral">"output"</span>, <span class="stringliteral">"Output image file"</span>);</div>
+<div class="line"><a name="l00231"></a><span class="lineno">  231</span>   <span class="comment">// Optionpk<std::string> tmpdir_opt("tmp", "tmp", "Temporary directory","/tmp",2);</span></div>
+<div class="line"><a name="l00232"></a><span class="lineno">  232</span>   <a class="code" href="classOptionpk.html">Optionpk<bool></a> disc_opt(<span class="stringliteral">"circ"</span>, <span class="stringliteral">"circular"</span>, <span class="stringliteral">"circular disc kernel for dilation and erosion"</span>, <span class="keyword">false</span>);</div>
+<div class="line"><a name="l00233"></a><span class="lineno">  233</span>   <span class="comment">// Optionpk<double> angle_opt("a", "angle", "angle used for directional filtering in dilation (North=0, East=90, South=180, West=270).");</span></div>
+<div class="line"><a name="l00234"></a><span class="lineno">  234</span>   <a class="code" href="classOptionpk.html">Optionpk<std::string></a> method_opt(<span class="stringliteral">"f"</span>, <span class="stringliteral">"filter"</span>, <span class="stringliteral">"filter function (median, var, min, max, sum, mean, dilate, erode, close, open, homog (central pixel must be identical to all other pixels within window), heterog (central pixel must be dif [...]
+<div class="line"><a name="l00235"></a><span class="lineno">  235</span>   <a class="code" href="classOptionpk.html">Optionpk<std::string></a> resample_opt(<span class="stringliteral">"r"</span>, <span class="stringliteral">"resampling-method"</span>, <span class="stringliteral">"Resampling method for shifting operation (near: nearest neighbour, bilinear: bi-linear interpolation)."</span>, <span class="stringliteral">"near"</span>);</div>
+<div class="line"><a name="l00236"></a><span class="lineno">  236</span>   <a class="code" href="classOptionpk.html">Optionpk<double></a> dimX_opt(<span class="stringliteral">"dx"</span>, <span class="stringliteral">"dx"</span>, <span class="stringliteral">"filter kernel size in x, use odd values only"</span>, 3);</div>
+<div class="line"><a name="l00237"></a><span class="lineno">  237</span>   <a class="code" href="classOptionpk.html">Optionpk<double></a> dimY_opt(<span class="stringliteral">"dy"</span>, <span class="stringliteral">"dy"</span>, <span class="stringliteral">"filter kernel size in y, use odd values only"</span>, 3);</div>
+<div class="line"><a name="l00238"></a><span class="lineno">  238</span>   <a class="code" href="classOptionpk.html">Optionpk<int></a> dimZ_opt(<span class="stringliteral">"dz"</span>, <span class="stringliteral">"dz"</span>, <span class="stringliteral">"filter kernel size in z (spectral/temporal dimension), must be odd (example: 3).. Set dz>0 if 1-D filter must be used in band domain"</span>);</div>
+<div class="line"><a name="l00239"></a><span class="lineno">  239</span>   <a class="code" href="classOptionpk.html">Optionpk<std::string></a> wavelet_type_opt(<span class="stringliteral">"wt"</span>, <span class="stringliteral">"wavelet"</span>, <span class="stringliteral">"wavelet type: daubechies,daubechies_centered, haar, haar_centered, bspline, bspline_centered"</span>, <span class="stringliteral">"daubechies"</span>);</div>
+<div class="line"><a name="l00240"></a><span class="lineno">  240</span>   <a class="code" href="classOptionpk.html">Optionpk<int></a> family_opt(<span class="stringliteral">"wf"</span>, <span class="stringliteral">"family"</span>, <span class="stringliteral">"wavelet family (vanishing moment, see also http://www.gnu.org/software/gsl/manual/html_node/DWT-Initialization.html)"</span>, 4);</div>
+<div class="line"><a name="l00241"></a><span class="lineno">  241</span>   <a class="code" href="classOptionpk.html">Optionpk<int></a> savgolay_nl_opt(<span class="stringliteral">"nl"</span>, <span class="stringliteral">"nl"</span>, <span class="stringliteral">"Number of leftward (past) data points used in Savitzky-Golay filter)"</span>, 2);</div>
+<div class="line"><a name="l00242"></a><span class="lineno">  242</span>   <a class="code" href="classOptionpk.html">Optionpk<int></a> savgolay_nr_opt(<span class="stringliteral">"nr"</span>, <span class="stringliteral">"nr"</span>, <span class="stringliteral">"Number of rightward (future) data points used in Savitzky-Golay filter)"</span>, 2);</div>
+<div class="line"><a name="l00243"></a><span class="lineno">  243</span>   <a class="code" href="classOptionpk.html">Optionpk<int></a> savgolay_ld_opt(<span class="stringliteral">"ld"</span>, <span class="stringliteral">"ld"</span>, <span class="stringliteral">"order of the derivative desired in Savitzky-Golay filter (e.g., ld=0 for smoothed function)"</span>, 0);</div>
+<div class="line"><a name="l00244"></a><span class="lineno">  244</span>   <a class="code" href="classOptionpk.html">Optionpk<int></a> savgolay_m_opt(<span class="stringliteral">"m"</span>, <span class="stringliteral">"m"</span>, <span class="stringliteral">"order of the smoothing polynomial in Savitzky-Golay filter, also equal to the highest conserved moment; usual values are m = 2 or m = 4)"</span>, 2);</div>
+<div class="line"><a name="l00245"></a><span class="lineno">  245</span>   <a class="code" href="classOptionpk.html">Optionpk<short></a> class_opt(<span class="stringliteral">"class"</span>, <span class="stringliteral">"class"</span>, <span class="stringliteral">"class value(s) to use for density, erosion, dilation, openening and closing, thresholding"</span>);</div>
+<div class="line"><a name="l00246"></a><span class="lineno">  246</span>   <a class="code" href="classOptionpk.html">Optionpk<double></a> threshold_opt(<span class="stringliteral">"t"</span>, <span class="stringliteral">"threshold"</span>, <span class="stringliteral">"threshold value(s) to use for threshold filter (one for each class), or threshold to cut for dwt_cut (use 0 to keep all) or dwt_cut_from, or sigma for shift"</span>, 0);</div>
+<div class="line"><a name="l00247"></a><span class="lineno">  247</span>   <a class="code" href="classOptionpk.html">Optionpk<double></a> nodata_opt(<span class="stringliteral">"nodata"</span>, <span class="stringliteral">"nodata"</span>, <span class="stringliteral">"nodata value(s) (used for smoothnodata filter)"</span>);</div>
+<div class="line"><a name="l00248"></a><span class="lineno">  248</span>   <a class="code" href="classOptionpk.html">Optionpk<std::string></a> tap_opt(<span class="stringliteral">"tap"</span>, <span class="stringliteral">"tap"</span>, <span class="stringliteral">"text file containing taps used for spatial filtering (from ul to lr). Use dimX and dimY to specify tap dimensions in x and y. Leave empty for not using taps"</span>);</div>
+<div class="line"><a name="l00249"></a><span class="lineno">  249</span>   <a class="code" href="classOptionpk.html">Optionpk<double></a> tapz_opt(<span class="stringliteral">"tapz"</span>, <span class="stringliteral">"tapz"</span>, <span class="stringliteral">"taps used for spectral filtering"</span>);</div>
+<div class="line"><a name="l00250"></a><span class="lineno">  250</span>   <a class="code" href="classOptionpk.html">Optionpk<string></a> padding_opt(<span class="stringliteral">"pad"</span>,<span class="stringliteral">"pad"</span>, <span class="stringliteral">"Padding method for filtering (how to handle edge effects). Choose between: symmetric, replicate, circular, zero (pad with 0)."</span>, <span class="stringliteral">"symmetric"</spa [...]
+<div class="line"><a name="l00251"></a><span class="lineno">  251</span>   <a class="code" href="classOptionpk.html">Optionpk<double></a> fwhm_opt(<span class="stringliteral">"fwhm"</span>, <span class="stringliteral">"fwhm"</span>, <span class="stringliteral">"list of full width half to apply spectral filtering (-fwhm band1 -fwhm band2 ...)"</span>);</div>
+<div class="line"><a name="l00252"></a><span class="lineno">  252</span>   <a class="code" href="classOptionpk.html">Optionpk<std::string></a> srf_opt(<span class="stringliteral">"srf"</span>, <span class="stringliteral">"srf"</span>, <span class="stringliteral">"list of ASCII files containing spectral response functions (two columns: wavelength response)"</span>);</div>
+<div class="line"><a name="l00253"></a><span class="lineno">  253</span>   <a class="code" href="classOptionpk.html">Optionpk<double></a> wavelengthIn_opt(<span class="stringliteral">"win"</span>, <span class="stringliteral">"wavelengthIn"</span>, <span class="stringliteral">"list of wavelengths in input spectrum (-win band1 -win band2 ...)"</span>);</div>
+<div class="line"><a name="l00254"></a><span class="lineno">  254</span>   <a class="code" href="classOptionpk.html">Optionpk<double></a> wavelengthOut_opt(<span class="stringliteral">"wout"</span>, <span class="stringliteral">"wavelengthOut"</span>, <span class="stringliteral">"list of wavelengths in output spectrum (-wout band1 -wout band2 ...)"</span>);</div>
+<div class="line"><a name="l00255"></a><span class="lineno">  255</span>   <a class="code" href="classOptionpk.html">Optionpk<std::string></a> interpolationType_opt(<span class="stringliteral">"interp"</span>, <span class="stringliteral">"interp"</span>, <span class="stringliteral">"type of interpolation for spectral filtering (see http://www.gnu.org/software/gsl/manual/html_node/Interpolation-Types.html)"</span>,<span class="stringliteral">" [...]
+<div class="line"><a name="l00256"></a><span class="lineno">  256</span>   <a class="code" href="classOptionpk.html">Optionpk<std::string></a>  otype_opt(<span class="stringliteral">"ot"</span>, <span class="stringliteral">"otype"</span>, <span class="stringliteral">"Data type for output image ({Byte/Int16/UInt16/UInt32/Int32/Float32/Float64/CInt16/CInt32/CFloat32/CFloat64}). Empty string: inherit type from input image"</span>,<span class="stringl [...]
+<div class="line"><a name="l00257"></a><span class="lineno">  257</span>   <a class="code" href="classOptionpk.html">Optionpk<string></a>  oformat_opt(<span class="stringliteral">"of"</span>, <span class="stringliteral">"oformat"</span>, <span class="stringliteral">"Output image format (see also gdal_translate). Empty string: inherit from input image"</span>);</div>
+<div class="line"><a name="l00258"></a><span class="lineno">  258</span>   <a class="code" href="classOptionpk.html">Optionpk<string></a>  colorTable_opt(<span class="stringliteral">"ct"</span>, <span class="stringliteral">"ct"</span>, <span class="stringliteral">"color table (file with 5 columns: id R G B ALFA (0: transparent, 255: solid). Use none to ommit color table"</span>);</div>
+<div class="line"><a name="l00259"></a><span class="lineno">  259</span>   <a class="code" href="classOptionpk.html">Optionpk<string></a> option_opt(<span class="stringliteral">"co"</span>, <span class="stringliteral">"co"</span>, <span class="stringliteral">"Creation option for output file. Multiple options can be specified."</span>);</div>
+<div class="line"><a name="l00260"></a><span class="lineno">  260</span>   <a class="code" href="classOptionpk.html">Optionpk<short></a> down_opt(<span class="stringliteral">"d"</span>, <span class="stringliteral">"down"</span>, <span class="stringliteral">"down sampling factor. Use value 1 for no downsampling). Use value n>1 for downsampling (aggregation)"</span>, 1);</div>
+<div class="line"><a name="l00261"></a><span class="lineno">  261</span>   <a class="code" href="classOptionpk.html">Optionpk<string></a> beta_opt(<span class="stringliteral">"beta"</span>, <span class="stringliteral">"beta"</span>, <span class="stringliteral">"ASCII file with beta for each class transition in Markov Random Field"</span>);</div>
+<div class="line"><a name="l00262"></a><span class="lineno">  262</span>   <span class="comment">// Optionpk<double> eps_opt("eps","eps", "error marging for linear feature",0);</span></div>
+<div class="line"><a name="l00263"></a><span class="lineno">  263</span>   <span class="comment">// Optionpk<bool> l1_opt("l1","l1", "obtain longest object length for linear feature",false);</span></div>
+<div class="line"><a name="l00264"></a><span class="lineno">  264</span>   <span class="comment">// Optionpk<bool> l2_opt("l2","l2", "obtain shortest object length for linear feature",false,2);</span></div>
+<div class="line"><a name="l00265"></a><span class="lineno">  265</span>   <span class="comment">// Optionpk<bool> a1_opt("a1","a1", "obtain angle found for longest object length for linear feature",false);</span></div>
+<div class="line"><a name="l00266"></a><span class="lineno">  266</span>   <span class="comment">// Optionpk<bool> a2_opt("a2","a2", "obtain angle found for shortest object length for linear feature",false);</span></div>
+<div class="line"><a name="l00267"></a><span class="lineno">  267</span>   <a class="code" href="classOptionpk.html">Optionpk<short></a> verbose_opt(<span class="stringliteral">"v"</span>, <span class="stringliteral">"verbose"</span>, <span class="stringliteral">"verbose mode if > 0"</span>, 0,2);</div>
+<div class="line"><a name="l00268"></a><span class="lineno">  268</span> </div>
+<div class="line"><a name="l00269"></a><span class="lineno">  269</span>   resample_opt.setHide(1);</div>
+<div class="line"><a name="l00270"></a><span class="lineno">  270</span>   option_opt.setHide(1);</div>
+<div class="line"><a name="l00271"></a><span class="lineno">  271</span>   wavelet_type_opt.setHide(1);</div>
+<div class="line"><a name="l00272"></a><span class="lineno">  272</span>   family_opt.setHide(1);</div>
+<div class="line"><a name="l00273"></a><span class="lineno">  273</span>   savgolay_nl_opt.setHide(1);</div>
+<div class="line"><a name="l00274"></a><span class="lineno">  274</span>   savgolay_nr_opt.setHide(1);</div>
+<div class="line"><a name="l00275"></a><span class="lineno">  275</span>   savgolay_ld_opt.setHide(1);</div>
+<div class="line"><a name="l00276"></a><span class="lineno">  276</span>   savgolay_m_opt.setHide(1);</div>
+<div class="line"><a name="l00277"></a><span class="lineno">  277</span>   class_opt.setHide(1);</div>
+<div class="line"><a name="l00278"></a><span class="lineno">  278</span>   threshold_opt.setHide(1);</div>
+<div class="line"><a name="l00279"></a><span class="lineno">  279</span>   tap_opt.setHide(1);</div>
+<div class="line"><a name="l00280"></a><span class="lineno">  280</span>   tapz_opt.setHide(1);</div>
+<div class="line"><a name="l00281"></a><span class="lineno">  281</span>   padding_opt.setHide(1);</div>
+<div class="line"><a name="l00282"></a><span class="lineno">  282</span>   wavelengthIn_opt.setHide(1);</div>
+<div class="line"><a name="l00283"></a><span class="lineno">  283</span>   wavelengthOut_opt.setHide(1);</div>
+<div class="line"><a name="l00284"></a><span class="lineno">  284</span>   down_opt.setHide(1);</div>
+<div class="line"><a name="l00285"></a><span class="lineno">  285</span>   beta_opt.setHide(1);</div>
+<div class="line"><a name="l00286"></a><span class="lineno">  286</span>   <span class="comment">// eps_opt.setHide(1);</span></div>
+<div class="line"><a name="l00287"></a><span class="lineno">  287</span>   <span class="comment">// l1_opt.setHide(1);</span></div>
+<div class="line"><a name="l00288"></a><span class="lineno">  288</span>   <span class="comment">// l2_opt.setHide(1);</span></div>
+<div class="line"><a name="l00289"></a><span class="lineno">  289</span>   <span class="comment">// a1_opt.setHide(1);</span></div>
+<div class="line"><a name="l00290"></a><span class="lineno">  290</span>   <span class="comment">// a2_opt.setHide(1);</span></div>
+<div class="line"><a name="l00291"></a><span class="lineno">  291</span>   interpolationType_opt.setHide(1);</div>
+<div class="line"><a name="l00292"></a><span class="lineno">  292</span>   otype_opt.setHide(1);</div>
+<div class="line"><a name="l00293"></a><span class="lineno">  293</span>   oformat_opt.setHide(1);</div>
+<div class="line"><a name="l00294"></a><span class="lineno">  294</span>   colorTable_opt.setHide(1);</div>
+<div class="line"><a name="l00295"></a><span class="lineno">  295</span>   disc_opt.setHide(1);</div>
+<div class="line"><a name="l00296"></a><span class="lineno">  296</span> </div>
+<div class="line"><a name="l00297"></a><span class="lineno">  297</span>   <span class="keywordtype">bool</span> doProcess;<span class="comment">//stop process when program was invoked with help option (-h --help)</span></div>
+<div class="line"><a name="l00298"></a><span class="lineno">  298</span>   <span class="keywordflow">try</span>{</div>
+<div class="line"><a name="l00299"></a><span class="lineno">  299</span>     doProcess=input_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00300"></a><span class="lineno">  300</span>     output_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00301"></a><span class="lineno">  301</span>     <span class="comment">// tmpdir_opt.retrieveOption(argc,argv);</span></div>
+<div class="line"><a name="l00302"></a><span class="lineno">  302</span>     <span class="comment">// angle_opt.retrieveOption(argc,argv);</span></div>
+<div class="line"><a name="l00303"></a><span class="lineno">  303</span>     method_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00304"></a><span class="lineno">  304</span>     srf_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00305"></a><span class="lineno">  305</span>     fwhm_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00306"></a><span class="lineno">  306</span>     dimX_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00307"></a><span class="lineno">  307</span>     dimY_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00308"></a><span class="lineno">  308</span>     dimZ_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00309"></a><span class="lineno">  309</span>     nodata_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00310"></a><span class="lineno">  310</span>     resample_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00311"></a><span class="lineno">  311</span>     option_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00312"></a><span class="lineno">  312</span>     wavelet_type_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00313"></a><span class="lineno">  313</span>     family_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00314"></a><span class="lineno">  314</span>     savgolay_nl_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00315"></a><span class="lineno">  315</span>     savgolay_nr_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00316"></a><span class="lineno">  316</span>     savgolay_ld_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00317"></a><span class="lineno">  317</span>     savgolay_m_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00318"></a><span class="lineno">  318</span>     class_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00319"></a><span class="lineno">  319</span>     threshold_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00320"></a><span class="lineno">  320</span>     tap_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00321"></a><span class="lineno">  321</span>     tapz_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00322"></a><span class="lineno">  322</span>     padding_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00323"></a><span class="lineno">  323</span>     wavelengthIn_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00324"></a><span class="lineno">  324</span>     wavelengthOut_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00325"></a><span class="lineno">  325</span>     down_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00326"></a><span class="lineno">  326</span>     beta_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00327"></a><span class="lineno">  327</span>     <span class="comment">// eps_opt.retrieveOption(argc,argv);</span></div>
+<div class="line"><a name="l00328"></a><span class="lineno">  328</span>     <span class="comment">// l1_opt.retrieveOption(argc,argv);</span></div>
+<div class="line"><a name="l00329"></a><span class="lineno">  329</span>     <span class="comment">// l2_opt.retrieveOption(argc,argv);</span></div>
+<div class="line"><a name="l00330"></a><span class="lineno">  330</span>     <span class="comment">// a1_opt.retrieveOption(argc,argv);</span></div>
+<div class="line"><a name="l00331"></a><span class="lineno">  331</span>     <span class="comment">// a2_opt.retrieveOption(argc,argv);</span></div>
+<div class="line"><a name="l00332"></a><span class="lineno">  332</span>     interpolationType_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00333"></a><span class="lineno">  333</span>     otype_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00334"></a><span class="lineno">  334</span>     oformat_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00335"></a><span class="lineno">  335</span>     colorTable_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00336"></a><span class="lineno">  336</span>     disc_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00337"></a><span class="lineno">  337</span>     verbose_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00338"></a><span class="lineno">  338</span>   }</div>
+<div class="line"><a name="l00339"></a><span class="lineno">  339</span>   <span class="keywordflow">catch</span>(<span class="keywordtype">string</span> predefinedString){</div>
+<div class="line"><a name="l00340"></a><span class="lineno">  340</span>     std::cout << predefinedString << std::endl;</div>
+<div class="line"><a name="l00341"></a><span class="lineno">  341</span>     exit(0);</div>
+<div class="line"><a name="l00342"></a><span class="lineno">  342</span>   }</div>
+<div class="line"><a name="l00343"></a><span class="lineno">  343</span>   <span class="keywordflow">if</span>(!doProcess){</div>
+<div class="line"><a name="l00344"></a><span class="lineno">  344</span>     cout << endl;</div>
+<div class="line"><a name="l00345"></a><span class="lineno">  345</span>     cout << <span class="stringliteral">"Usage: pkfilter -i input -o ouptut [-f filter | -perc value | -srf file [-srf file]* -win wavelength [-win wavelength]* | -wout wavelength -fwhm value [-wout wavelength -fwhm value]* -win wavelength [-win wavelength]*]"</span> << endl;</div>
+<div class="line"><a name="l00346"></a><span class="lineno">  346</span>     cout << endl;</div>
+<div class="line"><a name="l00347"></a><span class="lineno">  347</span>     std::cout << <span class="stringliteral">"short option -h shows basic options only, use long option --help to show all options"</span> << std::endl;</div>
+<div class="line"><a name="l00348"></a><span class="lineno">  348</span>     exit(0);<span class="comment">//help was invoked, stop processing</span></div>
+<div class="line"><a name="l00349"></a><span class="lineno">  349</span>   }</div>
+<div class="line"><a name="l00350"></a><span class="lineno">  350</span> </div>
+<div class="line"><a name="l00351"></a><span class="lineno">  351</span>   <span class="comment">//not implemented yet, must debug first...</span></div>
+<div class="line"><a name="l00352"></a><span class="lineno">  352</span>   vector<double> angle_opt;</div>
+<div class="line"><a name="l00353"></a><span class="lineno">  353</span> </div>
+<div class="line"><a name="l00354"></a><span class="lineno">  354</span>   <a class="code" href="classImgReaderGdal.html">ImgReaderGdal</a> input;</div>
+<div class="line"><a name="l00355"></a><span class="lineno">  355</span>   <a class="code" href="classImgWriterGdal.html">ImgWriterGdal</a> output;</div>
+<div class="line"><a name="l00356"></a><span class="lineno">  356</span>   <span class="keywordflow">if</span>(input_opt.empty()){</div>
+<div class="line"><a name="l00357"></a><span class="lineno">  357</span>     cerr << <span class="stringliteral">"Error: no input file selected, use option -i"</span> << endl;</div>
+<div class="line"><a name="l00358"></a><span class="lineno">  358</span>     exit(1);</div>
+<div class="line"><a name="l00359"></a><span class="lineno">  359</span>   }</div>
+<div class="line"><a name="l00360"></a><span class="lineno">  360</span>   <span class="keywordflow">if</span>(output_opt.empty()){</div>
+<div class="line"><a name="l00361"></a><span class="lineno">  361</span>     cerr << <span class="stringliteral">"Error: no output file selected, use option -o"</span> << endl;</div>
+<div class="line"><a name="l00362"></a><span class="lineno">  362</span>     exit(1);</div>
+<div class="line"><a name="l00363"></a><span class="lineno">  363</span>   }</div>
+<div class="line"><a name="l00364"></a><span class="lineno">  364</span>   input.open(input_opt[0]);</div>
+<div class="line"><a name="l00365"></a><span class="lineno">  365</span>   GDALDataType theType=GDT_Unknown;</div>
+<div class="line"><a name="l00366"></a><span class="lineno">  366</span>   <span class="keywordflow">if</span>(verbose_opt[0])</div>
+<div class="line"><a name="l00367"></a><span class="lineno">  367</span>     cout << <span class="stringliteral">"possible output data types: "</span>;</div>
+<div class="line"><a name="l00368"></a><span class="lineno">  368</span>   <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iType = 0; iType < GDT_TypeCount; ++iType){</div>
+<div class="line"><a name="l00369"></a><span class="lineno">  369</span>     <span class="keywordflow">if</span>(verbose_opt[0])</div>
+<div class="line"><a name="l00370"></a><span class="lineno">  370</span>       cout << <span class="stringliteral">" "</span> << GDALGetDataTypeName((GDALDataType)iType);</div>
+<div class="line"><a name="l00371"></a><span class="lineno">  371</span>     <span class="keywordflow">if</span>( GDALGetDataTypeName((GDALDataType)iType) != NULL</div>
+<div class="line"><a name="l00372"></a><span class="lineno">  372</span>         && EQUAL(GDALGetDataTypeName((GDALDataType)iType),</div>
+<div class="line"><a name="l00373"></a><span class="lineno">  373</span>                  otype_opt[0].c_str()))</div>
+<div class="line"><a name="l00374"></a><span class="lineno">  374</span>       theType=(GDALDataType) iType;</div>
+<div class="line"><a name="l00375"></a><span class="lineno">  375</span>   }</div>
+<div class="line"><a name="l00376"></a><span class="lineno">  376</span>   <span class="keywordflow">if</span>(theType==GDT_Unknown)</div>
+<div class="line"><a name="l00377"></a><span class="lineno">  377</span>     theType=input.getDataType();</div>
+<div class="line"><a name="l00378"></a><span class="lineno">  378</span> </div>
+<div class="line"><a name="l00379"></a><span class="lineno">  379</span>   <span class="keywordflow">if</span>(verbose_opt[0])</div>
+<div class="line"><a name="l00380"></a><span class="lineno">  380</span>     std::cout << std::endl << <span class="stringliteral">"Output pixel type:  "</span> << GDALGetDataTypeName(theType) << endl;</div>
+<div class="line"><a name="l00381"></a><span class="lineno">  381</span> </div>
+<div class="line"><a name="l00382"></a><span class="lineno">  382</span>   <span class="keywordtype">string</span> imageType=input.getImageType();</div>
+<div class="line"><a name="l00383"></a><span class="lineno">  383</span>   <span class="keywordflow">if</span>(oformat_opt.size())</div>
+<div class="line"><a name="l00384"></a><span class="lineno">  384</span>     imageType=oformat_opt[0];</div>
+<div class="line"><a name="l00385"></a><span class="lineno">  385</span> </div>
+<div class="line"><a name="l00386"></a><span class="lineno">  386</span>   <span class="keywordflow">if</span>(option_opt.findSubstring(<span class="stringliteral">"INTERLEAVE="</span>)==option_opt.end()){</div>
+<div class="line"><a name="l00387"></a><span class="lineno">  387</span>     <span class="keywordtype">string</span> theInterleave=<span class="stringliteral">"INTERLEAVE="</span>;</div>
+<div class="line"><a name="l00388"></a><span class="lineno">  388</span>     theInterleave+=input.getInterleave();</div>
+<div class="line"><a name="l00389"></a><span class="lineno">  389</span>     option_opt.push_back(theInterleave);</div>
+<div class="line"><a name="l00390"></a><span class="lineno">  390</span>   }</div>
+<div class="line"><a name="l00391"></a><span class="lineno">  391</span>   <span class="keywordflow">try</span>{</div>
+<div class="line"><a name="l00392"></a><span class="lineno">  392</span>     <span class="keywordtype">int</span> nband=input.nrOfBand();</div>
+<div class="line"><a name="l00393"></a><span class="lineno">  393</span> </div>
+<div class="line"><a name="l00394"></a><span class="lineno">  394</span>     <span class="keywordflow">if</span>(fwhm_opt.size())</div>
+<div class="line"><a name="l00395"></a><span class="lineno">  395</span>       nband=fwhm_opt.size();</div>
+<div class="line"><a name="l00396"></a><span class="lineno">  396</span>     <span class="keywordflow">else</span> <span class="keywordflow">if</span>(srf_opt.size())</div>
+<div class="line"><a name="l00397"></a><span class="lineno">  397</span>       nband=srf_opt.size();</div>
+<div class="line"><a name="l00398"></a><span class="lineno">  398</span>     <span class="keywordflow">else</span> <span class="keywordflow">if</span>(tap_opt.size()||tapz_opt.size())</div>
+<div class="line"><a name="l00399"></a><span class="lineno">  399</span>       nband=input.nrOfBand();</div>
+<div class="line"><a name="l00400"></a><span class="lineno">  400</span>     <span class="keywordflow">else</span>{</div>
+<div class="line"><a name="l00401"></a><span class="lineno">  401</span>       <span class="keywordflow">if</span>(method_opt.empty()){</div>
+<div class="line"><a name="l00402"></a><span class="lineno">  402</span>     cerr << <span class="stringliteral">"Error: no filter selected, use option -f"</span> << endl;</div>
+<div class="line"><a name="l00403"></a><span class="lineno">  403</span>     exit(1);</div>
+<div class="line"><a name="l00404"></a><span class="lineno">  404</span>       }</div>
+<div class="line"><a name="l00405"></a><span class="lineno">  405</span>       <span class="keywordflow">switch</span>(filter2d::Filter2d::getFilterType(method_opt[0])){</div>
+<div class="line"><a name="l00406"></a><span class="lineno">  406</span>       <span class="keywordflow">case</span>(filter2d::dilate):</div>
+<div class="line"><a name="l00407"></a><span class="lineno">  407</span>       <span class="keywordflow">case</span>(filter2d::erode):</div>
+<div class="line"><a name="l00408"></a><span class="lineno">  408</span>       <span class="keywordflow">case</span>(filter2d::close):</div>
+<div class="line"><a name="l00409"></a><span class="lineno">  409</span>       <span class="keywordflow">case</span>(filter2d::open):</div>
+<div class="line"><a name="l00410"></a><span class="lineno">  410</span>       <span class="keywordflow">case</span>(filter2d::smooth):</div>
+<div class="line"><a name="l00411"></a><span class="lineno">  411</span>     <span class="comment">//implemented in spectral/temporal domain (dimZ>1) and spatial domain</span></div>
+<div class="line"><a name="l00412"></a><span class="lineno">  412</span>     <span class="keywordflow">if</span>(dimZ_opt.size())</div>
+<div class="line"><a name="l00413"></a><span class="lineno">  413</span>       assert(dimZ_opt[0]>1);</div>
+<div class="line"><a name="l00414"></a><span class="lineno">  414</span>       nband=input.nrOfBand();</div>
+<div class="line"><a name="l00415"></a><span class="lineno">  415</span>       <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l00416"></a><span class="lineno">  416</span>       <span class="keywordflow">case</span>(filter2d::dwt):</div>
+<div class="line"><a name="l00417"></a><span class="lineno">  417</span>       <span class="keywordflow">case</span>(filter2d::dwti):</div>
+<div class="line"><a name="l00418"></a><span class="lineno">  418</span>       <span class="keywordflow">case</span>(filter2d::dwt_cut):</div>
+<div class="line"><a name="l00419"></a><span class="lineno">  419</span>       <span class="keywordflow">case</span>(filter2d::smoothnodata):</div>
+<div class="line"><a name="l00420"></a><span class="lineno">  420</span>     <span class="comment">//implemented in spectral/temporal/spatial domain and nband always input.nrOfBand()</span></div>
+<div class="line"><a name="l00421"></a><span class="lineno">  421</span>     nband=input.nrOfBand();</div>
+<div class="line"><a name="l00422"></a><span class="lineno">  422</span>     <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l00423"></a><span class="lineno">  423</span>       <span class="keywordflow">case</span>(filter2d::savgolay):</div>
+<div class="line"><a name="l00424"></a><span class="lineno">  424</span>     nband=input.nrOfBand();</div>
+<div class="line"><a name="l00425"></a><span class="lineno">  425</span>     <span class="keywordflow">if</span>(dimZ_opt.empty())</div>
+<div class="line"><a name="l00426"></a><span class="lineno">  426</span>       dimZ_opt.push_back(1);</div>
+<div class="line"><a name="l00427"></a><span class="lineno">  427</span>       <span class="keywordflow">case</span>(filter2d::dwt_cut_from):</div>
+<div class="line"><a name="l00428"></a><span class="lineno">  428</span>     <span class="comment">//only implemented in spectral/temporal domain</span></div>
+<div class="line"><a name="l00429"></a><span class="lineno">  429</span>     <span class="keywordflow">if</span>(dimZ_opt.size()){</div>
+<div class="line"><a name="l00430"></a><span class="lineno">  430</span>       nband=input.nrOfBand();</div>
+<div class="line"><a name="l00431"></a><span class="lineno">  431</span>       assert(threshold_opt.size());</div>
+<div class="line"><a name="l00432"></a><span class="lineno">  432</span>     }</div>
+<div class="line"><a name="l00433"></a><span class="lineno">  433</span>     <span class="keywordflow">else</span>{</div>
+<div class="line"><a name="l00434"></a><span class="lineno">  434</span>       cerr << <span class="stringliteral">"filter not implemented in spatial domain"</span> << endl;</div>
+<div class="line"><a name="l00435"></a><span class="lineno">  435</span>       exit(1);</div>
+<div class="line"><a name="l00436"></a><span class="lineno">  436</span>     }</div>
+<div class="line"><a name="l00437"></a><span class="lineno">  437</span>     <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l00438"></a><span class="lineno">  438</span>       <span class="keywordflow">case</span>(filter2d::mrf):<span class="comment">//deliberate fall through</span></div>
+<div class="line"><a name="l00439"></a><span class="lineno">  439</span>     assert(class_opt.size()>1);</div>
 <div class="line"><a name="l00440"></a><span class="lineno">  440</span>     <span class="keywordflow">if</span>(verbose_opt[0])</div>
-<div class="line"><a name="l00441"></a><span class="lineno">  441</span>       std::cout<< <span class="stringliteral">"mask values: "</span>;</div>
-<div class="line"><a name="l00442"></a><span class="lineno">  442</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> imask=0;imask<nodata_opt.size();++imask){</div>
-<div class="line"><a name="l00443"></a><span class="lineno">  443</span>       <span class="keywordflow">if</span>(verbose_opt[0])</div>
-<div class="line"><a name="l00444"></a><span class="lineno">  444</span>         std::cout<< nodata_opt[imask] << <span class="stringliteral">" "</span>;</div>
-<div class="line"><a name="l00445"></a><span class="lineno">  445</span>       filter1d.pushNoDataValue(nodata_opt[imask]);</div>
-<div class="line"><a name="l00446"></a><span class="lineno">  446</span>       filter2d.pushNoDataValue(nodata_opt[imask]);</div>
-<div class="line"><a name="l00447"></a><span class="lineno">  447</span>     }</div>
-<div class="line"><a name="l00448"></a><span class="lineno">  448</span>     <span class="keywordflow">if</span>(verbose_opt[0])</div>
-<div class="line"><a name="l00449"></a><span class="lineno">  449</span>       std::cout<< std::endl;</div>
-<div class="line"><a name="l00450"></a><span class="lineno">  450</span>   }</div>
-<div class="line"><a name="l00451"></a><span class="lineno">  451</span>   <span class="keywordflow">if</span>(tap_opt.size()){</div>
-<div class="line"><a name="l00452"></a><span class="lineno">  452</span>     ifstream tapfile(tap_opt[0].c_str());</div>
-<div class="line"><a name="l00453"></a><span class="lineno">  453</span>     assert(tapfile);</div>
-<div class="line"><a name="l00454"></a><span class="lineno">  454</span>     <a class="code" href="classVector2d.html">Vector2d<double></a> taps(dimY_opt[0],dimX_opt[0]);</div>
-<div class="line"><a name="l00455"></a><span class="lineno">  455</span> </div>
-<div class="line"><a name="l00456"></a><span class="lineno">  456</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> j=0;j<dimY_opt[0];++j){</div>
-<div class="line"><a name="l00457"></a><span class="lineno">  457</span>       <span class="keywordflow">for</span>(<span class="keywordtype">int</span> i=0;i<dimX_opt[0];++i){</div>
-<div class="line"><a name="l00458"></a><span class="lineno">  458</span>         tapfile >> taps[j][i];</div>
-<div class="line"><a name="l00459"></a><span class="lineno">  459</span>       }</div>
+<div class="line"><a name="l00441"></a><span class="lineno">  441</span>       std::cout << <span class="stringliteral">"opening output image "</span> << output_opt[0] << std::endl;</div>
+<div class="line"><a name="l00442"></a><span class="lineno">  442</span>     nband=class_opt.size();</div>
+<div class="line"><a name="l00443"></a><span class="lineno">  443</span>       <span class="keywordflow">case</span>(filter2d::ismin):</div>
+<div class="line"><a name="l00444"></a><span class="lineno">  444</span>       <span class="keywordflow">case</span>(filter2d::ismax):</div>
+<div class="line"><a name="l00445"></a><span class="lineno">  445</span>       <span class="keywordflow">case</span>(filter2d::shift):</div>
+<div class="line"><a name="l00446"></a><span class="lineno">  446</span>       <span class="keywordflow">case</span>(filter2d::scramble):</div>
+<div class="line"><a name="l00447"></a><span class="lineno">  447</span>       <span class="keywordflow">case</span>(filter2d::mode):</div>
+<div class="line"><a name="l00448"></a><span class="lineno">  448</span>       <span class="keywordflow">case</span>(filter2d::sobelx):</div>
+<div class="line"><a name="l00449"></a><span class="lineno">  449</span>       <span class="keywordflow">case</span>(filter2d::sobely):</div>
+<div class="line"><a name="l00450"></a><span class="lineno">  450</span>       <span class="keywordflow">case</span>(filter2d::sobelxy):</div>
+<div class="line"><a name="l00451"></a><span class="lineno">  451</span>       <span class="keywordflow">case</span>(filter2d::countid):</div>
+<div class="line"><a name="l00452"></a><span class="lineno">  452</span>       <span class="keywordflow">case</span>(filter2d::order):</div>
+<div class="line"><a name="l00453"></a><span class="lineno">  453</span>       <span class="keywordflow">case</span>(filter2d::density):</div>
+<div class="line"><a name="l00454"></a><span class="lineno">  454</span>       <span class="keywordflow">case</span>(filter2d::homog):</div>
+<div class="line"><a name="l00455"></a><span class="lineno">  455</span>       <span class="keywordflow">case</span>(filter2d::heterog):</div>
+<div class="line"><a name="l00456"></a><span class="lineno">  456</span>     <span class="comment">//only implemented in spatial domain</span></div>
+<div class="line"><a name="l00457"></a><span class="lineno">  457</span>     <span class="keywordflow">if</span>(dimZ_opt.size()){</div>
+<div class="line"><a name="l00458"></a><span class="lineno">  458</span>       cerr << <span class="stringliteral">"filter not implemented in spectral/temporal domain"</span> << endl;</div>
+<div class="line"><a name="l00459"></a><span class="lineno">  459</span>       exit(1);</div>
 <div class="line"><a name="l00460"></a><span class="lineno">  460</span>     }</div>
-<div class="line"><a name="l00461"></a><span class="lineno">  461</span>     <span class="keywordflow">if</span>(verbose_opt[0]){</div>
-<div class="line"><a name="l00462"></a><span class="lineno">  462</span>       std::cout << <span class="stringliteral">"taps: "</span>;</div>
-<div class="line"><a name="l00463"></a><span class="lineno">  463</span>       <span class="keywordflow">for</span>(<span class="keywordtype">int</span> j=0;j<dimY_opt[0];++j){</div>
-<div class="line"><a name="l00464"></a><span class="lineno">  464</span>         <span class="keywordflow">for</span>(<span class="keywordtype">int</span> i=0;i<dimX_opt[0];++i){</div>
-<div class="line"><a name="l00465"></a><span class="lineno">  465</span>           std::cout<< taps[j][i] << <span class="stringliteral">" "</span>;</div>
-<div class="line"><a name="l00466"></a><span class="lineno">  466</span>         }</div>
-<div class="line"><a name="l00467"></a><span class="lineno">  467</span>         std::cout<< std::endl;</div>
-<div class="line"><a name="l00468"></a><span class="lineno">  468</span>       }</div>
-<div class="line"><a name="l00469"></a><span class="lineno">  469</span>     }</div>
-<div class="line"><a name="l00470"></a><span class="lineno">  470</span>     filter2d.setTaps(taps);</div>
-<div class="line"><a name="l00471"></a><span class="lineno">  471</span>     <span class="keywordflow">try</span>{</div>
-<div class="line"><a name="l00472"></a><span class="lineno">  472</span>       filter2d.filter(input,output);</div>
-<div class="line"><a name="l00473"></a><span class="lineno">  473</span>     }</div>
-<div class="line"><a name="l00474"></a><span class="lineno">  474</span>     <span class="keywordflow">catch</span>(<span class="keywordtype">string</span> errorstring){</div>
-<div class="line"><a name="l00475"></a><span class="lineno">  475</span>       cerr << errorstring << endl;</div>
-<div class="line"><a name="l00476"></a><span class="lineno">  476</span>     }</div>
-<div class="line"><a name="l00477"></a><span class="lineno">  477</span>     tapfile.close();</div>
-<div class="line"><a name="l00478"></a><span class="lineno">  478</span>   }</div>
-<div class="line"><a name="l00479"></a><span class="lineno">  479</span>   <span class="keywordflow">else</span> <span class="keywordflow">if</span>(tapz_opt.size()){</div>
-<div class="line"><a name="l00480"></a><span class="lineno">  480</span>     <span class="keywordflow">if</span>(verbose_opt[0]){</div>
-<div class="line"><a name="l00481"></a><span class="lineno">  481</span>       std::cout << <span class="stringliteral">"taps: "</span>;</div>
-<div class="line"><a name="l00482"></a><span class="lineno">  482</span>       <span class="keywordflow">for</span>(<span class="keywordtype">int</span> itap=0;itap<tapz_opt.size();++itap)</div>
-<div class="line"><a name="l00483"></a><span class="lineno">  483</span>     std::cout<< tapz_opt[itap] << <span class="stringliteral">" "</span>;</div>
-<div class="line"><a name="l00484"></a><span class="lineno">  484</span>       std::cout<< std::endl;</div>
-<div class="line"><a name="l00485"></a><span class="lineno">  485</span>     }</div>
-<div class="line"><a name="l00486"></a><span class="lineno">  486</span>     filter1d.setTaps(tapz_opt);</div>
-<div class="line"><a name="l00487"></a><span class="lineno">  487</span>     filter1d.filter(input,output);</div>
-<div class="line"><a name="l00488"></a><span class="lineno">  488</span>   }</div>
-<div class="line"><a name="l00489"></a><span class="lineno">  489</span>   <span class="keywordflow">else</span> <span class="keywordflow">if</span>(fwhm_opt.size()){</div>
-<div class="line"><a name="l00490"></a><span class="lineno">  490</span>     <span class="keywordflow">if</span>(verbose_opt[0])</div>
-<div class="line"><a name="l00491"></a><span class="lineno">  491</span>       std::cout << <span class="stringliteral">"spectral filtering to "</span> << fwhm_opt.size() << <span class="stringliteral">" bands with provided fwhm "</span> << std::endl;</div>
-<div class="line"><a name="l00492"></a><span class="lineno">  492</span>     assert(wavelengthOut_opt.size()==fwhm_opt.size());</div>
-<div class="line"><a name="l00493"></a><span class="lineno">  493</span>     assert(wavelengthIn_opt.size());</div>
-<div class="line"><a name="l00494"></a><span class="lineno">  494</span> </div>
-<div class="line"><a name="l00495"></a><span class="lineno">  495</span>     <a class="code" href="classVector2d.html">Vector2d<double></a> lineInput(input.nrOfBand(),input.nrOfCol());</div>
-<div class="line"><a name="l00496"></a><span class="lineno">  496</span>     <a class="code" href="classVector2d.html">Vector2d<double></a> lineOutput(wavelengthOut_opt.size(),input.nrOfCol());</div>
-<div class="line"><a name="l00497"></a><span class="lineno">  497</span>     <span class="keyword">const</span> <span class="keywordtype">char</span>* pszMessage;</div>
-<div class="line"><a name="l00498"></a><span class="lineno">  498</span>     <span class="keywordtype">void</span>* pProgressArg=NULL;</div>
-<div class="line"><a name="l00499"></a><span class="lineno">  499</span>     GDALProgressFunc pfnProgress=GDALTermProgress;</div>
-<div class="line"><a name="l00500"></a><span class="lineno">  500</span>     <span class="keywordtype">double</span> progress=0;</div>
-<div class="line"><a name="l00501"></a><span class="lineno">  501</span>     pfnProgress(progress,pszMessage,pProgressArg);</div>
-<div class="line"><a name="l00502"></a><span class="lineno">  502</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> y=0;y<input.nrOfRow();++y){</div>
-<div class="line"><a name="l00503"></a><span class="lineno">  503</span>       <span class="keywordflow">if</span>((y+1+down_opt[0]/2)%down_opt[0])</div>
-<div class="line"><a name="l00504"></a><span class="lineno">  504</span>         <span class="keywordflow">continue</span>;</div>
-<div class="line"><a name="l00505"></a><span class="lineno">  505</span>       <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iband=0;iband<input.nrOfBand();++iband)</div>
-<div class="line"><a name="l00506"></a><span class="lineno">  506</span>         input.readData(lineInput[iband],GDT_Float64,y,iband);</div>
-<div class="line"><a name="l00507"></a><span class="lineno">  507</span>       filter1d.applyFwhm<<span class="keywordtype">double</span>>(wavelengthIn_opt,lineInput,wavelengthOut_opt,fwhm_opt, interpolationType_opt[0], lineOutput, down_opt[0], verbose_opt[0]);</div>
-<div class="line"><a name="l00508"></a><span class="lineno">  508</span>       <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iband=0;iband<output.nrOfBand();++iband){</div>
-<div class="line"><a name="l00509"></a><span class="lineno">  509</span>         <span class="keywordflow">try</span>{</div>
-<div class="line"><a name="l00510"></a><span class="lineno">  510</span>           output.writeData(lineOutput[iband],GDT_Float64,y/down_opt[0],iband);</div>
-<div class="line"><a name="l00511"></a><span class="lineno">  511</span>         }</div>
-<div class="line"><a name="l00512"></a><span class="lineno">  512</span>         <span class="keywordflow">catch</span>(<span class="keywordtype">string</span> errorstring){</div>
-<div class="line"><a name="l00513"></a><span class="lineno">  513</span>           cerr << errorstring << <span class="stringliteral">"in band "</span> << iband << <span class="stringliteral">", line "</span> << y << endl;</div>
-<div class="line"><a name="l00514"></a><span class="lineno">  514</span>         }</div>
-<div class="line"><a name="l00515"></a><span class="lineno">  515</span>       }</div>
-<div class="line"><a name="l00516"></a><span class="lineno">  516</span>       progress=(1.0+y)/output.nrOfRow();</div>
-<div class="line"><a name="l00517"></a><span class="lineno">  517</span>       pfnProgress(progress,pszMessage,pProgressArg);</div>
-<div class="line"><a name="l00518"></a><span class="lineno">  518</span>     }</div>
-<div class="line"><a name="l00519"></a><span class="lineno">  519</span>   }</div>
-<div class="line"><a name="l00520"></a><span class="lineno">  520</span>   <span class="keywordflow">else</span> <span class="keywordflow">if</span>(srf_opt.size()){</div>
-<div class="line"><a name="l00521"></a><span class="lineno">  521</span>     <span class="keywordflow">if</span>(verbose_opt[0])</div>
-<div class="line"><a name="l00522"></a><span class="lineno">  522</span>       std::cout << <span class="stringliteral">"spectral filtering to "</span> << srf_opt.size() << <span class="stringliteral">" bands with provided SRF "</span> << std::endl;</div>
-<div class="line"><a name="l00523"></a><span class="lineno">  523</span>     assert(wavelengthIn_opt.size());</div>
-<div class="line"><a name="l00524"></a><span class="lineno">  524</span>     vector< Vector2d<double> > srf(srf_opt.size());<span class="comment">//[0] srf_nr, [1]: wavelength, [2]: response</span></div>
-<div class="line"><a name="l00525"></a><span class="lineno">  525</span>     ifstream srfFile;</div>
-<div class="line"><a name="l00526"></a><span class="lineno">  526</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> isrf=0;isrf<srf_opt.size();++isrf){</div>
-<div class="line"><a name="l00527"></a><span class="lineno">  527</span>       srf[isrf].resize(2);</div>
-<div class="line"><a name="l00528"></a><span class="lineno">  528</span>       srfFile.open(srf_opt[isrf].c_str());</div>
-<div class="line"><a name="l00529"></a><span class="lineno">  529</span>       <span class="keywordtype">double</span> v;</div>
-<div class="line"><a name="l00530"></a><span class="lineno">  530</span>       <span class="comment">//add 0 to make sure srf is 0 at boundaries after interpolation step</span></div>
-<div class="line"><a name="l00531"></a><span class="lineno">  531</span>       srf[isrf][0].push_back(0);</div>
-<div class="line"><a name="l00532"></a><span class="lineno">  532</span>       srf[isrf][1].push_back(0);</div>
-<div class="line"><a name="l00533"></a><span class="lineno">  533</span>       srf[isrf][0].push_back(1);</div>
-<div class="line"><a name="l00534"></a><span class="lineno">  534</span>       srf[isrf][1].push_back(0);</div>
-<div class="line"><a name="l00535"></a><span class="lineno">  535</span>       <span class="keywordflow">while</span>(srfFile >> v){</div>
-<div class="line"><a name="l00536"></a><span class="lineno">  536</span>         srf[isrf][0].push_back(v);</div>
-<div class="line"><a name="l00537"></a><span class="lineno">  537</span>         srfFile >> v;</div>
-<div class="line"><a name="l00538"></a><span class="lineno">  538</span>         srf[isrf][1].push_back(v);</div>
-<div class="line"><a name="l00539"></a><span class="lineno">  539</span>       }</div>
-<div class="line"><a name="l00540"></a><span class="lineno">  540</span>       srfFile.close();</div>
-<div class="line"><a name="l00541"></a><span class="lineno">  541</span>       <span class="comment">//add 0 to make sure srf[isrf] is 0 at boundaries after interpolation step</span></div>
-<div class="line"><a name="l00542"></a><span class="lineno">  542</span>       srf[isrf][0].push_back(srf[isrf][0].back()+1);</div>
-<div class="line"><a name="l00543"></a><span class="lineno">  543</span>       srf[isrf][1].push_back(0);    </div>
-<div class="line"><a name="l00544"></a><span class="lineno">  544</span>       srf[isrf][0].push_back(srf[isrf][0].back()+1);</div>
-<div class="line"><a name="l00545"></a><span class="lineno">  545</span>       srf[isrf][1].push_back(0);</div>
-<div class="line"><a name="l00546"></a><span class="lineno">  546</span>       <span class="keywordflow">if</span>(verbose_opt[0])</div>
-<div class="line"><a name="l00547"></a><span class="lineno">  547</span>         cout << <span class="stringliteral">"srf file details: "</span> << srf[isrf][0].size() << <span class="stringliteral">" wavelengths defined"</span> << endl;    </div>
-<div class="line"><a name="l00548"></a><span class="lineno">  548</span>     }</div>
-<div class="line"><a name="l00549"></a><span class="lineno">  549</span>     assert(output.nrOfBand()==srf.size());</div>
-<div class="line"><a name="l00550"></a><span class="lineno">  550</span>     <span class="keywordtype">double</span> centreWavelength=0;</div>
-<div class="line"><a name="l00551"></a><span class="lineno">  551</span>     <a class="code" href="classVector2d.html">Vector2d<double></a> lineInput(input.nrOfBand(),input.nrOfCol());</div>
-<div class="line"><a name="l00552"></a><span class="lineno">  552</span>     <span class="keyword">const</span> <span class="keywordtype">char</span>* pszMessage;</div>
-<div class="line"><a name="l00553"></a><span class="lineno">  553</span>     <span class="keywordtype">void</span>* pProgressArg=NULL;</div>
-<div class="line"><a name="l00554"></a><span class="lineno">  554</span>     GDALProgressFunc pfnProgress=GDALTermProgress;</div>
-<div class="line"><a name="l00555"></a><span class="lineno">  555</span>     <span class="keywordtype">double</span> progress=0;</div>
-<div class="line"><a name="l00556"></a><span class="lineno">  556</span>     pfnProgress(progress,pszMessage,pProgressArg);</div>
-<div class="line"><a name="l00557"></a><span class="lineno">  557</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> y=0;y<input.nrOfRow();++y){</div>
-<div class="line"><a name="l00558"></a><span class="lineno">  558</span>       <span class="keywordflow">if</span>((y+1+down_opt[0]/2)%down_opt[0])</div>
-<div class="line"><a name="l00559"></a><span class="lineno">  559</span>         <span class="keywordflow">continue</span>;</div>
-<div class="line"><a name="l00560"></a><span class="lineno">  560</span>       <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iband=0;iband<input.nrOfBand();++iband)</div>
-<div class="line"><a name="l00561"></a><span class="lineno">  561</span>         input.readData(lineInput[iband],GDT_Float64,y,iband);</div>
-<div class="line"><a name="l00562"></a><span class="lineno">  562</span>       <span class="keywordflow">for</span>(<span class="keywordtype">int</span> isrf=0;isrf<srf.size();++isrf){</div>
-<div class="line"><a name="l00563"></a><span class="lineno">  563</span>         vector<double> lineOutput(output.nrOfCol());</div>
-<div class="line"><a name="l00564"></a><span class="lineno">  564</span>         <span class="keywordtype">double</span> delta=1.0;</div>
-<div class="line"><a name="l00565"></a><span class="lineno">  565</span>         <span class="keywordtype">bool</span> normalize=<span class="keyword">true</span>;</div>
-<div class="line"><a name="l00566"></a><span class="lineno">  566</span>     centreWavelength=filter1d.applySrf<<span class="keywordtype">double</span>>(wavelengthIn_opt,lineInput,srf[isrf], interpolationType_opt[0], lineOutput, delta, normalize);</div>
-<div class="line"><a name="l00567"></a><span class="lineno">  567</span>         <span class="keywordflow">if</span>(verbose_opt[0])</div>
-<div class="line"><a name="l00568"></a><span class="lineno">  568</span>           std::cout << <span class="stringliteral">"centre wavelength srf "</span> << isrf << <span class="stringliteral">": "</span> << centreWavelength << std::endl;</div>
-<div class="line"><a name="l00569"></a><span class="lineno">  569</span>         <span class="keywordflow">try</span>{</div>
-<div class="line"><a name="l00570"></a><span class="lineno">  570</span>           output.writeData(lineOutput,GDT_Float64,y/down_opt[0],isrf);</div>
-<div class="line"><a name="l00571"></a><span class="lineno">  571</span>         }</div>
-<div class="line"><a name="l00572"></a><span class="lineno">  572</span>         <span class="keywordflow">catch</span>(<span class="keywordtype">string</span> errorstring){</div>
-<div class="line"><a name="l00573"></a><span class="lineno">  573</span>           cerr << errorstring << <span class="stringliteral">"in srf "</span> << srf_opt[isrf] << <span class="stringliteral">", line "</span> << y << endl;</div>
+<div class="line"><a name="l00461"></a><span class="lineno">  461</span>     <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l00462"></a><span class="lineno">  462</span>       <span class="comment">// case(filter2d::percentile):</span></div>
+<div class="line"><a name="l00463"></a><span class="lineno">  463</span>       <span class="comment">//    //implemented in spectral/temporal/spatial domain and nband 1 if dimZ>0</span></div>
+<div class="line"><a name="l00464"></a><span class="lineno">  464</span>       <span class="comment">//    if(dimZ_opt.size()){</span></div>
+<div class="line"><a name="l00465"></a><span class="lineno">  465</span>       <span class="comment">//      dimZ_opt[0]=1;</span></div>
+<div class="line"><a name="l00466"></a><span class="lineno">  466</span>       <span class="comment">//      nband=1;</span></div>
+<div class="line"><a name="l00467"></a><span class="lineno">  467</span>       <span class="comment">//    }</span></div>
+<div class="line"><a name="l00468"></a><span class="lineno">  468</span>       <span class="comment">//    else</span></div>
+<div class="line"><a name="l00469"></a><span class="lineno">  469</span>       <span class="comment">//      nband=input.nrOfBand();</span></div>
+<div class="line"><a name="l00470"></a><span class="lineno">  470</span>       <span class="comment">//    break;</span></div>
+<div class="line"><a name="l00471"></a><span class="lineno">  471</span>       <span class="keywordflow">case</span>(filter2d::sum):</div>
+<div class="line"><a name="l00472"></a><span class="lineno">  472</span>       <span class="keywordflow">case</span>(filter2d::mean):</div>
+<div class="line"><a name="l00473"></a><span class="lineno">  473</span>       <span class="keywordflow">case</span>(filter2d::min):</div>
+<div class="line"><a name="l00474"></a><span class="lineno">  474</span>       <span class="keywordflow">case</span>(filter2d::max):</div>
+<div class="line"><a name="l00475"></a><span class="lineno">  475</span>       <span class="keywordflow">case</span>(filter2d::var):</div>
+<div class="line"><a name="l00476"></a><span class="lineno">  476</span>       <span class="keywordflow">case</span>(filter2d::stdev):</div>
+<div class="line"><a name="l00477"></a><span class="lineno">  477</span>       <span class="keywordflow">case</span>(filter2d::median):</div>
+<div class="line"><a name="l00478"></a><span class="lineno">  478</span>       <span class="keywordflow">case</span>(filter2d::percentile):</div>
+<div class="line"><a name="l00479"></a><span class="lineno">  479</span>       <span class="keywordflow">case</span>(filter2d::proportion):</div>
+<div class="line"><a name="l00480"></a><span class="lineno">  480</span>     <span class="comment">//implemented in spectral/temporal/spatial domain and nband 1 if dimZ==1</span></div>
+<div class="line"><a name="l00481"></a><span class="lineno">  481</span>     <span class="keywordflow">if</span>(dimZ_opt.size()==1)</div>
+<div class="line"><a name="l00482"></a><span class="lineno">  482</span>       <span class="keywordflow">if</span>(dimZ_opt[0]==1)</div>
+<div class="line"><a name="l00483"></a><span class="lineno">  483</span>         nband=1;</div>
+<div class="line"><a name="l00484"></a><span class="lineno">  484</span>     <span class="keywordflow">else</span></div>
+<div class="line"><a name="l00485"></a><span class="lineno">  485</span>       nband=input.nrOfBand();</div>
+<div class="line"><a name="l00486"></a><span class="lineno">  486</span>     <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l00487"></a><span class="lineno">  487</span>       <span class="keywordflow">default</span>:</div>
+<div class="line"><a name="l00488"></a><span class="lineno">  488</span>     cerr << <span class="stringliteral">"filter not implemented"</span> << endl;</div>
+<div class="line"><a name="l00489"></a><span class="lineno">  489</span>     exit(1);</div>
+<div class="line"><a name="l00490"></a><span class="lineno">  490</span>     <span class="comment">// if(dimZ_opt.size())</span></div>
+<div class="line"><a name="l00491"></a><span class="lineno">  491</span>     <span class="comment">//   nband=dimZ_opt[0];</span></div>
+<div class="line"><a name="l00492"></a><span class="lineno">  492</span>     <span class="comment">// else</span></div>
+<div class="line"><a name="l00493"></a><span class="lineno">  493</span>     <span class="comment">//   nband=input.nrOfBand();</span></div>
+<div class="line"><a name="l00494"></a><span class="lineno">  494</span>     <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l00495"></a><span class="lineno">  495</span>       }</div>
+<div class="line"><a name="l00496"></a><span class="lineno">  496</span>     }</div>
+<div class="line"><a name="l00497"></a><span class="lineno">  497</span>     std::cout << <span class="stringliteral">"opening output image "</span> << output_opt[0] << <span class="stringliteral">" with "</span> << nband << <span class="stringliteral">" bands"</span> << std::endl;</div>
+<div class="line"><a name="l00498"></a><span class="lineno">  498</span>     output.open(output_opt[0],(input.nrOfCol()+down_opt[0]-1)/down_opt[0],(input.nrOfRow()+down_opt[0]-1)/down_opt[0],nband,theType,imageType,option_opt);</div>
+<div class="line"><a name="l00499"></a><span class="lineno">  499</span>   }</div>
+<div class="line"><a name="l00500"></a><span class="lineno">  500</span>   <span class="keywordflow">catch</span>(<span class="keywordtype">string</span> errorstring){</div>
+<div class="line"><a name="l00501"></a><span class="lineno">  501</span>     cout << errorstring << endl;</div>
+<div class="line"><a name="l00502"></a><span class="lineno">  502</span>     exit(4);</div>
+<div class="line"><a name="l00503"></a><span class="lineno">  503</span>   }</div>
+<div class="line"><a name="l00504"></a><span class="lineno">  504</span>   output.setProjection(input.getProjection());</div>
+<div class="line"><a name="l00505"></a><span class="lineno">  505</span>   <span class="keywordtype">double</span> gt[6];</div>
+<div class="line"><a name="l00506"></a><span class="lineno">  506</span>   input.getGeoTransform(gt);</div>
+<div class="line"><a name="l00507"></a><span class="lineno">  507</span>   gt[1]*=down_opt[0];<span class="comment">//dx</span></div>
+<div class="line"><a name="l00508"></a><span class="lineno">  508</span>   gt[5]*=down_opt[0];<span class="comment">//dy</span></div>
+<div class="line"><a name="l00509"></a><span class="lineno">  509</span>   output.setGeoTransform(gt);</div>
+<div class="line"><a name="l00510"></a><span class="lineno">  510</span>   </div>
+<div class="line"><a name="l00511"></a><span class="lineno">  511</span>   <span class="keywordflow">if</span>(colorTable_opt.size()){</div>
+<div class="line"><a name="l00512"></a><span class="lineno">  512</span>     <span class="keywordflow">if</span>(colorTable_opt[0]!=<span class="stringliteral">"none"</span>){</div>
+<div class="line"><a name="l00513"></a><span class="lineno">  513</span>       <span class="keywordflow">if</span>(verbose_opt[0])</div>
+<div class="line"><a name="l00514"></a><span class="lineno">  514</span>     cout << <span class="stringliteral">"set colortable "</span> << colorTable_opt[0] << endl;</div>
+<div class="line"><a name="l00515"></a><span class="lineno">  515</span>       assert(output.getDataType()==GDT_Byte);</div>
+<div class="line"><a name="l00516"></a><span class="lineno">  516</span>       output.setColorTable(colorTable_opt[0]);</div>
+<div class="line"><a name="l00517"></a><span class="lineno">  517</span>     }</div>
+<div class="line"><a name="l00518"></a><span class="lineno">  518</span>   }</div>
+<div class="line"><a name="l00519"></a><span class="lineno">  519</span>   <span class="keywordflow">else</span> <span class="keywordflow">if</span>(input.getColorTable()!=NULL)</div>
+<div class="line"><a name="l00520"></a><span class="lineno">  520</span>     output.setColorTable(input.getColorTable());</div>
+<div class="line"><a name="l00521"></a><span class="lineno">  521</span>   </div>
+<div class="line"><a name="l00522"></a><span class="lineno">  522</span>   <span class="keywordflow">if</span>(nodata_opt.size()){</div>
+<div class="line"><a name="l00523"></a><span class="lineno">  523</span>       <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iband=0;iband<output.nrOfBand();++iband)</div>
+<div class="line"><a name="l00524"></a><span class="lineno">  524</span>     output.GDALSetNoDataValue(nodata_opt[0],iband);</div>
+<div class="line"><a name="l00525"></a><span class="lineno">  525</span>   }</div>
+<div class="line"><a name="l00526"></a><span class="lineno">  526</span> </div>
+<div class="line"><a name="l00527"></a><span class="lineno">  527</span>   <a class="code" href="classfilter2d_1_1Filter2d.html">filter2d::Filter2d</a> filter2d;</div>
+<div class="line"><a name="l00528"></a><span class="lineno">  528</span>   <a class="code" href="classfilter_1_1Filter.html">filter::Filter</a> filter1d;</div>
+<div class="line"><a name="l00529"></a><span class="lineno">  529</span>   <span class="keywordflow">if</span>(verbose_opt[0])</div>
+<div class="line"><a name="l00530"></a><span class="lineno">  530</span>     cout << <span class="stringliteral">"Set padding to "</span> << padding_opt[0] << endl;</div>
+<div class="line"><a name="l00531"></a><span class="lineno">  531</span>   filter1d.setPadding(padding_opt[0]);</div>
+<div class="line"><a name="l00532"></a><span class="lineno">  532</span>   <span class="keywordflow">if</span>(class_opt.size()){</div>
+<div class="line"><a name="l00533"></a><span class="lineno">  533</span>     <span class="keywordflow">if</span>(verbose_opt[0])</div>
+<div class="line"><a name="l00534"></a><span class="lineno">  534</span>       std::cout<< <span class="stringliteral">"class values: "</span>;</div>
+<div class="line"><a name="l00535"></a><span class="lineno">  535</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iclass=0;iclass<class_opt.size();++iclass){</div>
+<div class="line"><a name="l00536"></a><span class="lineno">  536</span>       <span class="keywordflow">if</span>(!dimZ_opt.size())</div>
+<div class="line"><a name="l00537"></a><span class="lineno">  537</span>         filter2d.pushClass(class_opt[iclass]);</div>
+<div class="line"><a name="l00538"></a><span class="lineno">  538</span>       <span class="keywordflow">else</span></div>
+<div class="line"><a name="l00539"></a><span class="lineno">  539</span>         filter1d.pushClass(class_opt[iclass]);</div>
+<div class="line"><a name="l00540"></a><span class="lineno">  540</span>       <span class="keywordflow">if</span>(verbose_opt[0])</div>
+<div class="line"><a name="l00541"></a><span class="lineno">  541</span>         std::cout<< class_opt[iclass] << <span class="stringliteral">" "</span>;</div>
+<div class="line"><a name="l00542"></a><span class="lineno">  542</span>     }</div>
+<div class="line"><a name="l00543"></a><span class="lineno">  543</span>     <span class="keywordflow">if</span>(verbose_opt[0])</div>
+<div class="line"><a name="l00544"></a><span class="lineno">  544</span>       std::cout<< std::endl;</div>
+<div class="line"><a name="l00545"></a><span class="lineno">  545</span>   }</div>
+<div class="line"><a name="l00546"></a><span class="lineno">  546</span> </div>
+<div class="line"><a name="l00547"></a><span class="lineno">  547</span>   <span class="keywordflow">if</span>(nodata_opt.size()){</div>
+<div class="line"><a name="l00548"></a><span class="lineno">  548</span>     <span class="keywordflow">if</span>(verbose_opt[0])</div>
+<div class="line"><a name="l00549"></a><span class="lineno">  549</span>       std::cout<< <span class="stringliteral">"mask values: "</span>;</div>
+<div class="line"><a name="l00550"></a><span class="lineno">  550</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> imask=0;imask<nodata_opt.size();++imask){</div>
+<div class="line"><a name="l00551"></a><span class="lineno">  551</span>       <span class="keywordflow">if</span>(verbose_opt[0])</div>
+<div class="line"><a name="l00552"></a><span class="lineno">  552</span>         std::cout<< nodata_opt[imask] << <span class="stringliteral">" "</span>;</div>
+<div class="line"><a name="l00553"></a><span class="lineno">  553</span>       filter1d.pushNoDataValue(nodata_opt[imask]);</div>
+<div class="line"><a name="l00554"></a><span class="lineno">  554</span>       filter2d.pushNoDataValue(nodata_opt[imask]);</div>
+<div class="line"><a name="l00555"></a><span class="lineno">  555</span>     }</div>
+<div class="line"><a name="l00556"></a><span class="lineno">  556</span>     <span class="keywordflow">if</span>(verbose_opt[0])</div>
+<div class="line"><a name="l00557"></a><span class="lineno">  557</span>       std::cout<< std::endl;</div>
+<div class="line"><a name="l00558"></a><span class="lineno">  558</span>   }</div>
+<div class="line"><a name="l00559"></a><span class="lineno">  559</span>   <span class="keywordflow">if</span>(tap_opt.size()){</div>
+<div class="line"><a name="l00560"></a><span class="lineno">  560</span>     ifstream tapfile(tap_opt[0].c_str());</div>
+<div class="line"><a name="l00561"></a><span class="lineno">  561</span>     assert(tapfile);</div>
+<div class="line"><a name="l00562"></a><span class="lineno">  562</span>     <a class="code" href="classVector2d.html">Vector2d<double></a> taps(dimY_opt[0],dimX_opt[0]);</div>
+<div class="line"><a name="l00563"></a><span class="lineno">  563</span> </div>
+<div class="line"><a name="l00564"></a><span class="lineno">  564</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> j=0;j<dimY_opt[0];++j){</div>
+<div class="line"><a name="l00565"></a><span class="lineno">  565</span>       <span class="keywordflow">for</span>(<span class="keywordtype">int</span> i=0;i<dimX_opt[0];++i){</div>
+<div class="line"><a name="l00566"></a><span class="lineno">  566</span>         tapfile >> taps[j][i];</div>
+<div class="line"><a name="l00567"></a><span class="lineno">  567</span>       }</div>
+<div class="line"><a name="l00568"></a><span class="lineno">  568</span>     }</div>
+<div class="line"><a name="l00569"></a><span class="lineno">  569</span>     <span class="keywordflow">if</span>(verbose_opt[0]){</div>
+<div class="line"><a name="l00570"></a><span class="lineno">  570</span>       std::cout << <span class="stringliteral">"taps: "</span>;</div>
+<div class="line"><a name="l00571"></a><span class="lineno">  571</span>       <span class="keywordflow">for</span>(<span class="keywordtype">int</span> j=0;j<dimY_opt[0];++j){</div>
+<div class="line"><a name="l00572"></a><span class="lineno">  572</span>         <span class="keywordflow">for</span>(<span class="keywordtype">int</span> i=0;i<dimX_opt[0];++i){</div>
+<div class="line"><a name="l00573"></a><span class="lineno">  573</span>           std::cout<< taps[j][i] << <span class="stringliteral">" "</span>;</div>
 <div class="line"><a name="l00574"></a><span class="lineno">  574</span>         }</div>
-<div class="line"><a name="l00575"></a><span class="lineno">  575</span> </div>
+<div class="line"><a name="l00575"></a><span class="lineno">  575</span>         std::cout<< std::endl;</div>
 <div class="line"><a name="l00576"></a><span class="lineno">  576</span>       }</div>
-<div class="line"><a name="l00577"></a><span class="lineno">  577</span>       progress=(1.0+y)/output.nrOfRow();</div>
-<div class="line"><a name="l00578"></a><span class="lineno">  578</span>       pfnProgress(progress,pszMessage,pProgressArg);</div>
-<div class="line"><a name="l00579"></a><span class="lineno">  579</span>     }</div>
-<div class="line"><a name="l00580"></a><span class="lineno">  580</span> </div>
-<div class="line"><a name="l00581"></a><span class="lineno">  581</span>   }</div>
-<div class="line"><a name="l00582"></a><span class="lineno">  582</span>   <span class="keywordflow">else</span>{</div>
-<div class="line"><a name="l00583"></a><span class="lineno">  583</span>     <span class="keywordflow">switch</span>(filter2d::Filter2d::getFilterType(method_opt[0])){</div>
-<div class="line"><a name="l00584"></a><span class="lineno">  584</span>     <span class="keywordflow">case</span>(filter2d::dilate):</div>
-<div class="line"><a name="l00585"></a><span class="lineno">  585</span>       <span class="keywordflow">if</span>(down_opt[0]!=1){</div>
-<div class="line"><a name="l00586"></a><span class="lineno">  586</span>     std::cerr << <span class="stringliteral">"Error: down option not supported for morphological operator"</span> << std::endl;</div>
-<div class="line"><a name="l00587"></a><span class="lineno">  587</span>     exit(1);</div>
-<div class="line"><a name="l00588"></a><span class="lineno">  588</span>       }</div>
-<div class="line"><a name="l00589"></a><span class="lineno">  589</span>       <span class="keywordflow">try</span>{</div>
-<div class="line"><a name="l00590"></a><span class="lineno">  590</span>     <span class="keywordflow">if</span>(dimZ_opt.size()){</div>
-<div class="line"><a name="l00591"></a><span class="lineno">  591</span>       <span class="keywordflow">if</span>(verbose_opt[0])</div>
-<div class="line"><a name="l00592"></a><span class="lineno">  592</span>           std::cout<< <span class="stringliteral">"1-D filtering: dilate"</span> << std::endl;</div>
-<div class="line"><a name="l00593"></a><span class="lineno">  593</span>       filter1d.morphology(input,output,<span class="stringliteral">"dilate"</span>,dimZ_opt[0],verbose_opt[0]);</div>
-<div class="line"><a name="l00594"></a><span class="lineno">  594</span>     }</div>
-<div class="line"><a name="l00595"></a><span class="lineno">  595</span>     <span class="keywordflow">else</span></div>
-<div class="line"><a name="l00596"></a><span class="lineno">  596</span>       filter2d.morphology(input,output,<span class="stringliteral">"dilate"</span>,dimX_opt[0],dimY_opt[0],angle_opt,disc_opt[0]);</div>
-<div class="line"><a name="l00597"></a><span class="lineno">  597</span>       }</div>
-<div class="line"><a name="l00598"></a><span class="lineno">  598</span>       <span class="keywordflow">catch</span>(<span class="keywordtype">string</span> errorstring){</div>
-<div class="line"><a name="l00599"></a><span class="lineno">  599</span>     cerr << errorstring << endl;</div>
-<div class="line"><a name="l00600"></a><span class="lineno">  600</span>       }</div>
-<div class="line"><a name="l00601"></a><span class="lineno">  601</span>       <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l00602"></a><span class="lineno">  602</span>     <span class="keywordflow">case</span>(filter2d::erode):</div>
-<div class="line"><a name="l00603"></a><span class="lineno">  603</span>       <span class="keywordflow">if</span>(down_opt[0]!=1){</div>
-<div class="line"><a name="l00604"></a><span class="lineno">  604</span>     std::cerr << <span class="stringliteral">"Error: down option not supported for morphological operator"</span> << std::endl;</div>
-<div class="line"><a name="l00605"></a><span class="lineno">  605</span>     exit(1);</div>
-<div class="line"><a name="l00606"></a><span class="lineno">  606</span>       }</div>
-<div class="line"><a name="l00607"></a><span class="lineno">  607</span>       <span class="keywordflow">try</span>{</div>
-<div class="line"><a name="l00608"></a><span class="lineno">  608</span>     <span class="keywordflow">if</span>(dimZ_opt.size()>0){</div>
-<div class="line"><a name="l00609"></a><span class="lineno">  609</span>       <span class="keywordflow">if</span>(verbose_opt[0])</div>
-<div class="line"><a name="l00610"></a><span class="lineno">  610</span>         std::cout<< <span class="stringliteral">"1-D filtering: dilate"</span> << std::endl;</div>
-<div class="line"><a name="l00611"></a><span class="lineno">  611</span>       filter1d.morphology(input,output,<span class="stringliteral">"erode"</span>,dimZ_opt[0]);</div>
-<div class="line"><a name="l00612"></a><span class="lineno">  612</span>     }</div>
-<div class="line"><a name="l00613"></a><span class="lineno">  613</span>     <span class="keywordflow">else</span>{</div>
-<div class="line"><a name="l00614"></a><span class="lineno">  614</span>       filter2d.morphology(input,output,<span class="stringliteral">"erode"</span>,dimX_opt[0],dimY_opt[0],angle_opt,disc_opt[0]);</div>
-<div class="line"><a name="l00615"></a><span class="lineno">  615</span>     }</div>
-<div class="line"><a name="l00616"></a><span class="lineno">  616</span>       }</div>
-<div class="line"><a name="l00617"></a><span class="lineno">  617</span>       <span class="keywordflow">catch</span>(<span class="keywordtype">string</span> errorstring){</div>
-<div class="line"><a name="l00618"></a><span class="lineno">  618</span>     cerr << errorstring << endl;</div>
-<div class="line"><a name="l00619"></a><span class="lineno">  619</span>       }</div>
-<div class="line"><a name="l00620"></a><span class="lineno">  620</span>     <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l00621"></a><span class="lineno">  621</span>     <span class="keywordflow">case</span>(filter2d::close):{<span class="comment">//closing</span></div>
-<div class="line"><a name="l00622"></a><span class="lineno">  622</span>       <span class="keywordflow">if</span>(down_opt[0]!=1){</div>
-<div class="line"><a name="l00623"></a><span class="lineno">  623</span>     std::cerr << <span class="stringliteral">"Error: down option not supported for morphological operator"</span> << std::endl;</div>
-<div class="line"><a name="l00624"></a><span class="lineno">  624</span>     exit(1);</div>
-<div class="line"><a name="l00625"></a><span class="lineno">  625</span>       }</div>
-<div class="line"><a name="l00626"></a><span class="lineno">  626</span> </div>
-<div class="line"><a name="l00627"></a><span class="lineno">  627</span>       <a class="code" href="classImgWriterGdal.html">ImgWriterGdal</a> tmpout;</div>
-<div class="line"><a name="l00628"></a><span class="lineno">  628</span>       tmpout.open(<span class="stringliteral">"/vsimem/dilation.tif"</span>,input.nrOfCol(),input.nrOfRow(),input.nrOfBand(),input.getDataType(),input.getImageType());</div>
-<div class="line"><a name="l00629"></a><span class="lineno">  629</span>       <span class="keywordflow">try</span>{</div>
-<div class="line"><a name="l00630"></a><span class="lineno">  630</span>         <span class="keywordflow">if</span>(dimZ_opt.size()){</div>
-<div class="line"><a name="l00631"></a><span class="lineno">  631</span>           filter1d.morphology(input,tmpout,<span class="stringliteral">"dilate"</span>,dimZ_opt[0]);</div>
-<div class="line"><a name="l00632"></a><span class="lineno">  632</span>         }</div>
-<div class="line"><a name="l00633"></a><span class="lineno">  633</span>         <span class="keywordflow">else</span>{</div>
-<div class="line"><a name="l00634"></a><span class="lineno">  634</span>       filter2d.morphology(input,tmpout,<span class="stringliteral">"dilate"</span>,dimX_opt[0],dimY_opt[0],angle_opt,disc_opt[0]);</div>
-<div class="line"><a name="l00635"></a><span class="lineno">  635</span>         }</div>
-<div class="line"><a name="l00636"></a><span class="lineno">  636</span>       }</div>
-<div class="line"><a name="l00637"></a><span class="lineno">  637</span>       <span class="keywordflow">catch</span>(std::string errorString){</div>
-<div class="line"><a name="l00638"></a><span class="lineno">  638</span>     std::cout<< errorString;</div>
-<div class="line"><a name="l00639"></a><span class="lineno">  639</span>     exit(1);</div>
-<div class="line"><a name="l00640"></a><span class="lineno">  640</span>       }</div>
-<div class="line"><a name="l00641"></a><span class="lineno">  641</span>       tmpout.close();</div>
-<div class="line"><a name="l00642"></a><span class="lineno">  642</span>       <a class="code" href="classImgReaderGdal.html">ImgReaderGdal</a> tmpin;</div>
-<div class="line"><a name="l00643"></a><span class="lineno">  643</span>       tmpin.open(<span class="stringliteral">"/vsimem/dilation.tif"</span>);</div>
-<div class="line"><a name="l00644"></a><span class="lineno">  644</span>       <span class="keywordflow">try</span>{</div>
-<div class="line"><a name="l00645"></a><span class="lineno">  645</span>     <span class="keywordflow">if</span>(dimZ_opt.size()){</div>
-<div class="line"><a name="l00646"></a><span class="lineno">  646</span>       filter1d.morphology(tmpin,output,<span class="stringliteral">"erode"</span>,dimZ_opt[0]);</div>
-<div class="line"><a name="l00647"></a><span class="lineno">  647</span>     }</div>
-<div class="line"><a name="l00648"></a><span class="lineno">  648</span>     <span class="keywordflow">else</span>{</div>
-<div class="line"><a name="l00649"></a><span class="lineno">  649</span>       filter2d.morphology(tmpin,output,<span class="stringliteral">"erode"</span>,dimX_opt[0],dimY_opt[0],angle_opt,disc_opt[0]);</div>
-<div class="line"><a name="l00650"></a><span class="lineno">  650</span>     }</div>
-<div class="line"><a name="l00651"></a><span class="lineno">  651</span>       }</div>
-<div class="line"><a name="l00652"></a><span class="lineno">  652</span>       <span class="keywordflow">catch</span>(<span class="keywordtype">string</span> errorstring){</div>
-<div class="line"><a name="l00653"></a><span class="lineno">  653</span>     cerr << errorstring << endl;</div>
-<div class="line"><a name="l00654"></a><span class="lineno">  654</span>       }</div>
-<div class="line"><a name="l00655"></a><span class="lineno">  655</span>       tmpin.close();</div>
-<div class="line"><a name="l00656"></a><span class="lineno">  656</span>       <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l00657"></a><span class="lineno">  657</span>     }</div>
-<div class="line"><a name="l00658"></a><span class="lineno">  658</span>     <span class="keywordflow">case</span>(filter2d::open):{<span class="comment">//opening</span></div>
-<div class="line"><a name="l00659"></a><span class="lineno">  659</span>       <span class="keywordflow">if</span>(down_opt[0]!=1){</div>
-<div class="line"><a name="l00660"></a><span class="lineno">  660</span>     std::cerr << <span class="stringliteral">"Error: down option not supported for morphological operator"</span> << std::endl;</div>
-<div class="line"><a name="l00661"></a><span class="lineno">  661</span>     exit(1);</div>
-<div class="line"><a name="l00662"></a><span class="lineno">  662</span>       }</div>
-<div class="line"><a name="l00663"></a><span class="lineno">  663</span>       <a class="code" href="classImgWriterGdal.html">ImgWriterGdal</a> tmpout;</div>
-<div class="line"><a name="l00664"></a><span class="lineno">  664</span>       tmpout.open(<span class="stringliteral">"/vsimem/erosion.tif"</span>,input.nrOfCol(),input.nrOfRow(),input.nrOfBand(),input.getDataType(),input.getImageType());</div>
-<div class="line"><a name="l00665"></a><span class="lineno">  665</span>       <span class="keywordflow">try</span>{</div>
-<div class="line"><a name="l00666"></a><span class="lineno">  666</span>     <span class="keywordflow">if</span>(dimZ_opt.size()){</div>
-<div class="line"><a name="l00667"></a><span class="lineno">  667</span>       filter1d.morphology(input,tmpout,<span class="stringliteral">"erode"</span>,dimZ_opt[0]);</div>
-<div class="line"><a name="l00668"></a><span class="lineno">  668</span>     }</div>
-<div class="line"><a name="l00669"></a><span class="lineno">  669</span>     <span class="keywordflow">else</span>{</div>
-<div class="line"><a name="l00670"></a><span class="lineno">  670</span>       filter2d.morphology(input,tmpout,<span class="stringliteral">"erode"</span>,dimX_opt[0],dimY_opt[0],angle_opt,disc_opt[0]);</div>
-<div class="line"><a name="l00671"></a><span class="lineno">  671</span>     }</div>
-<div class="line"><a name="l00672"></a><span class="lineno">  672</span>       }</div>
-<div class="line"><a name="l00673"></a><span class="lineno">  673</span>       <span class="keywordflow">catch</span>(std::string errorString){</div>
-<div class="line"><a name="l00674"></a><span class="lineno">  674</span>     std::cout<< errorString;</div>
-<div class="line"><a name="l00675"></a><span class="lineno">  675</span>     exit(1);</div>
-<div class="line"><a name="l00676"></a><span class="lineno">  676</span>       }</div>
-<div class="line"><a name="l00677"></a><span class="lineno">  677</span>       tmpout.close();</div>
-<div class="line"><a name="l00678"></a><span class="lineno">  678</span>       <a class="code" href="classImgReaderGdal.html">ImgReaderGdal</a> tmpin;</div>
-<div class="line"><a name="l00679"></a><span class="lineno">  679</span>       <span class="keywordflow">try</span>{</div>
-<div class="line"><a name="l00680"></a><span class="lineno">  680</span>     tmpin.open(<span class="stringliteral">"/vsimem/erosion.tif"</span>);</div>
-<div class="line"><a name="l00681"></a><span class="lineno">  681</span>     <span class="keywordflow">if</span>(dimZ_opt.size()){</div>
-<div class="line"><a name="l00682"></a><span class="lineno">  682</span>       filter1d.morphology(tmpin,output,<span class="stringliteral">"dilate"</span>,dimZ_opt[0]);</div>
-<div class="line"><a name="l00683"></a><span class="lineno">  683</span>     }</div>
-<div class="line"><a name="l00684"></a><span class="lineno">  684</span>     <span class="keywordflow">else</span>{</div>
-<div class="line"><a name="l00685"></a><span class="lineno">  685</span>       filter2d.morphology(tmpin,output,<span class="stringliteral">"dilate"</span>,dimX_opt[0],dimY_opt[0],angle_opt,disc_opt[0]);</div>
-<div class="line"><a name="l00686"></a><span class="lineno">  686</span>     }</div>
-<div class="line"><a name="l00687"></a><span class="lineno">  687</span>     tmpin.close();</div>
-<div class="line"><a name="l00688"></a><span class="lineno">  688</span>     tmpout.close();</div>
-<div class="line"><a name="l00689"></a><span class="lineno">  689</span>       }</div>
-<div class="line"><a name="l00690"></a><span class="lineno">  690</span>       <span class="keywordflow">catch</span>(<span class="keywordtype">string</span> errorstring){</div>
-<div class="line"><a name="l00691"></a><span class="lineno">  691</span>     cerr << errorstring << endl;</div>
-<div class="line"><a name="l00692"></a><span class="lineno">  692</span>       }</div>
-<div class="line"><a name="l00693"></a><span class="lineno">  693</span>       <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l00694"></a><span class="lineno">  694</span>     }</div>
-<div class="line"><a name="l00695"></a><span class="lineno">  695</span>     <span class="keywordflow">case</span>(filter2d::homog):{<span class="comment">//spatially homogeneous</span></div>
-<div class="line"><a name="l00696"></a><span class="lineno">  696</span>       <span class="keywordflow">try</span>{</div>
-<div class="line"><a name="l00697"></a><span class="lineno">  697</span>     filter2d.doit(input,output,<span class="stringliteral">"homog"</span>,dimX_opt[0],dimY_opt[0],down_opt[0],disc_opt[0]);</div>
-<div class="line"><a name="l00698"></a><span class="lineno">  698</span>       }</div>
-<div class="line"><a name="l00699"></a><span class="lineno">  699</span>       <span class="keywordflow">catch</span>(<span class="keywordtype">string</span> errorstring){</div>
-<div class="line"><a name="l00700"></a><span class="lineno">  700</span>     cerr << errorstring << endl;</div>
-<div class="line"><a name="l00701"></a><span class="lineno">  701</span>       }</div>
-<div class="line"><a name="l00702"></a><span class="lineno">  702</span>     <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l00703"></a><span class="lineno">  703</span>     }</div>
-<div class="line"><a name="l00704"></a><span class="lineno">  704</span>     <span class="keywordflow">case</span>(filter2d::heterog):{<span class="comment">//spatially heterogeneous</span></div>
-<div class="line"><a name="l00705"></a><span class="lineno">  705</span>       <span class="keywordflow">try</span>{</div>
-<div class="line"><a name="l00706"></a><span class="lineno">  706</span>     filter2d.doit(input,output,<span class="stringliteral">"heterog"</span>,dimX_opt[0],dimY_opt[0],down_opt[0],disc_opt[0]);</div>
-<div class="line"><a name="l00707"></a><span class="lineno">  707</span>       }</div>
-<div class="line"><a name="l00708"></a><span class="lineno">  708</span>       <span class="keywordflow">catch</span>(<span class="keywordtype">string</span> errorstring){</div>
-<div class="line"><a name="l00709"></a><span class="lineno">  709</span>     cerr << errorstring << endl;</div>
-<div class="line"><a name="l00710"></a><span class="lineno">  710</span>       }</div>
-<div class="line"><a name="l00711"></a><span class="lineno">  711</span>       <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l00712"></a><span class="lineno">  712</span>     }</div>
-<div class="line"><a name="l00713"></a><span class="lineno">  713</span>     <span class="keywordflow">case</span>(filter2d::shift):{<span class="comment">//shift</span></div>
-<div class="line"><a name="l00714"></a><span class="lineno">  714</span>       <span class="keywordflow">if</span>(down_opt[0]!=1){</div>
-<div class="line"><a name="l00715"></a><span class="lineno">  715</span>     std::cerr << <span class="stringliteral">"Error: down option not supported for shift operator"</span> << std::endl;</div>
-<div class="line"><a name="l00716"></a><span class="lineno">  716</span>     exit(1);</div>
-<div class="line"><a name="l00717"></a><span class="lineno">  717</span>       }</div>
-<div class="line"><a name="l00718"></a><span class="lineno">  718</span>       assert(input.nrOfBand());</div>
-<div class="line"><a name="l00719"></a><span class="lineno">  719</span>       assert(input.nrOfCol());</div>
-<div class="line"><a name="l00720"></a><span class="lineno">  720</span>       assert(input.nrOfRow());</div>
-<div class="line"><a name="l00721"></a><span class="lineno">  721</span>       <span class="keywordflow">try</span>{</div>
-<div class="line"><a name="l00722"></a><span class="lineno">  722</span>         filter2d.shift(input,output,dimX_opt[0],dimY_opt[0],threshold_opt[0],filter2d::Filter2d::getResampleType(resample_opt[0]));</div>
-<div class="line"><a name="l00723"></a><span class="lineno">  723</span>       }</div>
-<div class="line"><a name="l00724"></a><span class="lineno">  724</span>       <span class="keywordflow">catch</span>(<span class="keywordtype">string</span> errorstring){</div>
-<div class="line"><a name="l00725"></a><span class="lineno">  725</span>         cerr << errorstring << endl;</div>
-<div class="line"><a name="l00726"></a><span class="lineno">  726</span>       }</div>
-<div class="line"><a name="l00727"></a><span class="lineno">  727</span>       <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l00728"></a><span class="lineno">  728</span>     }</div>
-<div class="line"><a name="l00729"></a><span class="lineno">  729</span>     <span class="comment">// case(filter2d::linearfeature):{</span></div>
-<div class="line"><a name="l00730"></a><span class="lineno">  730</span>     <span class="comment">//   if(down_opt[0]!=1){</span></div>
-<div class="line"><a name="l00731"></a><span class="lineno">  731</span>     <span class="comment">//  std::cerr << "Error: down option not supported for linear feature" << std::endl;</span></div>
-<div class="line"><a name="l00732"></a><span class="lineno">  732</span>     <span class="comment">//  exit(1);</span></div>
-<div class="line"><a name="l00733"></a><span class="lineno">  733</span>     <span class="comment">//   }</span></div>
-<div class="line"><a name="l00734"></a><span class="lineno">  734</span>     <span class="comment">//   assert(input.nrOfBand());</span></div>
-<div class="line"><a name="l00735"></a><span class="lineno">  735</span>     <span class="comment">//   assert(input.nrOfCol());</span></div>
-<div class="line"><a name="l00736"></a><span class="lineno">  736</span>     <span class="comment">//   assert(input.nrOfRow());</span></div>
-<div class="line"><a name="l00737"></a><span class="lineno">  737</span>     <span class="comment">//   float theAngle=361;</span></div>
-<div class="line"><a name="l00738"></a><span class="lineno">  738</span>     <span class="comment">//   if(angle_opt.size())</span></div>
-<div class="line"><a name="l00739"></a><span class="lineno">  739</span>     <span class="comment">//  theAngle=angle_opt[0];</span></div>
-<div class="line"><a name="l00740"></a><span class="lineno">  740</span>     <span class="comment">//   if(verbose_opt[0])</span></div>
-<div class="line"><a name="l00741"></a><span class="lineno">  741</span>     <span class="comment">//  std::cout << "using angle " << theAngle << std::endl;</span></div>
-<div class="line"><a name="l00742"></a><span class="lineno">  742</span>     <span class="comment">//   try{</span></div>
-<div class="line"><a name="l00743"></a><span class="lineno">  743</span>     <span class="comment">//  //using an angle step of 5 degrees and no maximum distance</span></div>
-<div class="line"><a name="l00744"></a><span class="lineno">  744</span>     <span class="comment">//     filter2d.linearFeature(input,output,theAngle,5,0,eps_opt[0],l1_opt[0],a1_opt[0],l2_opt[0],a2_opt[0],0,verbose_opt[0]);</span></div>
-<div class="line"><a name="l00745"></a><span class="lineno">  745</span>     <span class="comment">//   }</span></div>
-<div class="line"><a name="l00746"></a><span class="lineno">  746</span>     <span class="comment">//   catch(string errorstring){</span></div>
-<div class="line"><a name="l00747"></a><span class="lineno">  747</span>     <span class="comment">//     cerr << errorstring << endl;</span></div>
-<div class="line"><a name="l00748"></a><span class="lineno">  748</span>     <span class="comment">//   }</span></div>
-<div class="line"><a name="l00749"></a><span class="lineno">  749</span>     <span class="comment">//   break;</span></div>
-<div class="line"><a name="l00750"></a><span class="lineno">  750</span>     <span class="comment">// }</span></div>
-<div class="line"><a name="l00751"></a><span class="lineno">  751</span>     <span class="keywordflow">case</span>(filter2d::mrf):{<span class="comment">//Markov Random Field</span></div>
-<div class="line"><a name="l00752"></a><span class="lineno">  752</span>       <span class="keywordflow">if</span>(verbose_opt[0])</div>
-<div class="line"><a name="l00753"></a><span class="lineno">  753</span>     std::cout << <span class="stringliteral">"Markov Random Field filtering"</span> << std::endl;</div>
-<div class="line"><a name="l00754"></a><span class="lineno">  754</span>       <span class="keywordflow">try</span>{</div>
-<div class="line"><a name="l00755"></a><span class="lineno">  755</span>     <span class="keywordflow">if</span>(beta_opt.size()){</div>
-<div class="line"><a name="l00756"></a><span class="lineno">  756</span>       <span class="comment">//in file: classFrom classTo</span></div>
-<div class="line"><a name="l00757"></a><span class="lineno">  757</span>       <span class="comment">//in variable: beta[classTo][classFrom]</span></div>
-<div class="line"><a name="l00758"></a><span class="lineno">  758</span>       <a class="code" href="classFileReaderAscii.html">FileReaderAscii</a> betaReader(beta_opt[0]);</div>
-<div class="line"><a name="l00759"></a><span class="lineno">  759</span>       <a class="code" href="classVector2d.html">Vector2d<double></a> beta(class_opt.size(),class_opt.size());</div>
-<div class="line"><a name="l00760"></a><span class="lineno">  760</span>       vector<int> cols(class_opt.size());</div>
-<div class="line"><a name="l00761"></a><span class="lineno">  761</span>       <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iclass=0;iclass<class_opt.size();++iclass)</div>
-<div class="line"><a name="l00762"></a><span class="lineno">  762</span>         cols[iclass]=iclass;</div>
-<div class="line"><a name="l00763"></a><span class="lineno">  763</span>       betaReader.readData(beta,cols);</div>
-<div class="line"><a name="l00764"></a><span class="lineno">  764</span>       <span class="keywordflow">if</span>(verbose_opt[0]){</div>
-<div class="line"><a name="l00765"></a><span class="lineno">  765</span>         std::cout << <span class="stringliteral">"using values for beta:"</span> << std::endl;</div>
-<div class="line"><a name="l00766"></a><span class="lineno">  766</span>         <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iclass1=0;iclass1<class_opt.size();++iclass1)</div>
-<div class="line"><a name="l00767"></a><span class="lineno">  767</span>           std::cout << <span class="stringliteral">"      "</span> << iclass1 << <span class="stringliteral">" ("</span> << class_opt[iclass1] << <span class="stringliteral">")"</span>;</div>
-<div class="line"><a name="l00768"></a><span class="lineno">  768</span>         std::cout << std::endl;</div>
-<div class="line"><a name="l00769"></a><span class="lineno">  769</span>         <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iclass1=0;iclass1<class_opt.size();++iclass1){</div>
-<div class="line"><a name="l00770"></a><span class="lineno">  770</span>           std::cout << iclass1 << <span class="stringliteral">" ("</span> << class_opt[iclass1] << <span class="stringliteral">")"</span>;</div>
-<div class="line"><a name="l00771"></a><span class="lineno">  771</span>           <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iclass2=0;iclass2<class_opt.size();++iclass2)</div>
-<div class="line"><a name="l00772"></a><span class="lineno">  772</span>         std::cout << <span class="stringliteral">" "</span> << beta[iclass2][iclass1] << <span class="stringliteral">" ("</span> << class_opt[iclass2] << <span class="stringliteral">")"</span>;</div>
-<div class="line"><a name="l00773"></a><span class="lineno">  773</span>           std::cout << std::endl;</div>
-<div class="line"><a name="l00774"></a><span class="lineno">  774</span>         }</div>
-<div class="line"><a name="l00775"></a><span class="lineno">  775</span>       }</div>
-<div class="line"><a name="l00776"></a><span class="lineno">  776</span>       filter2d.mrf(input, output, dimX_opt[0], dimY_opt[0], beta, <span class="keyword">true</span>, down_opt[0], verbose_opt[0]);</div>
-<div class="line"><a name="l00777"></a><span class="lineno">  777</span>     }</div>
-<div class="line"><a name="l00778"></a><span class="lineno">  778</span>     <span class="keywordflow">else</span></div>
-<div class="line"><a name="l00779"></a><span class="lineno">  779</span>       filter2d.mrf(input, output, dimX_opt[0], dimY_opt[0], 1, <span class="keyword">true</span>, down_opt[0], verbose_opt[0]);</div>
+<div class="line"><a name="l00577"></a><span class="lineno">  577</span>     }</div>
+<div class="line"><a name="l00578"></a><span class="lineno">  578</span>     filter2d.setTaps(taps);</div>
+<div class="line"><a name="l00579"></a><span class="lineno">  579</span>     <span class="keywordflow">try</span>{</div>
+<div class="line"><a name="l00580"></a><span class="lineno">  580</span>       filter2d.filter(input,output);</div>
+<div class="line"><a name="l00581"></a><span class="lineno">  581</span>     }</div>
+<div class="line"><a name="l00582"></a><span class="lineno">  582</span>     <span class="keywordflow">catch</span>(<span class="keywordtype">string</span> errorstring){</div>
+<div class="line"><a name="l00583"></a><span class="lineno">  583</span>       cerr << errorstring << endl;</div>
+<div class="line"><a name="l00584"></a><span class="lineno">  584</span>     }</div>
+<div class="line"><a name="l00585"></a><span class="lineno">  585</span>     tapfile.close();</div>
+<div class="line"><a name="l00586"></a><span class="lineno">  586</span>   }</div>
+<div class="line"><a name="l00587"></a><span class="lineno">  587</span>   <span class="keywordflow">else</span> <span class="keywordflow">if</span>(tapz_opt.size()){</div>
+<div class="line"><a name="l00588"></a><span class="lineno">  588</span>     <span class="keywordflow">if</span>(verbose_opt[0]){</div>
+<div class="line"><a name="l00589"></a><span class="lineno">  589</span>       std::cout << <span class="stringliteral">"taps: "</span>;</div>
+<div class="line"><a name="l00590"></a><span class="lineno">  590</span>       <span class="keywordflow">for</span>(<span class="keywordtype">int</span> itap=0;itap<tapz_opt.size();++itap)</div>
+<div class="line"><a name="l00591"></a><span class="lineno">  591</span>     std::cout<< tapz_opt[itap] << <span class="stringliteral">" "</span>;</div>
+<div class="line"><a name="l00592"></a><span class="lineno">  592</span>       std::cout<< std::endl;</div>
+<div class="line"><a name="l00593"></a><span class="lineno">  593</span>     }</div>
+<div class="line"><a name="l00594"></a><span class="lineno">  594</span>     filter1d.setTaps(tapz_opt);</div>
+<div class="line"><a name="l00595"></a><span class="lineno">  595</span>     filter1d.filter(input,output);</div>
+<div class="line"><a name="l00596"></a><span class="lineno">  596</span>   }</div>
+<div class="line"><a name="l00597"></a><span class="lineno">  597</span>   <span class="keywordflow">else</span> <span class="keywordflow">if</span>(fwhm_opt.size()){</div>
+<div class="line"><a name="l00598"></a><span class="lineno">  598</span>     <span class="keywordflow">if</span>(verbose_opt[0])</div>
+<div class="line"><a name="l00599"></a><span class="lineno">  599</span>       std::cout << <span class="stringliteral">"spectral filtering to "</span> << fwhm_opt.size() << <span class="stringliteral">" bands with provided fwhm "</span> << std::endl;</div>
+<div class="line"><a name="l00600"></a><span class="lineno">  600</span>     assert(wavelengthOut_opt.size()==fwhm_opt.size());</div>
+<div class="line"><a name="l00601"></a><span class="lineno">  601</span>     assert(wavelengthIn_opt.size());</div>
+<div class="line"><a name="l00602"></a><span class="lineno">  602</span> </div>
+<div class="line"><a name="l00603"></a><span class="lineno">  603</span>     <a class="code" href="classVector2d.html">Vector2d<double></a> lineInput(input.nrOfBand(),input.nrOfCol());</div>
+<div class="line"><a name="l00604"></a><span class="lineno">  604</span>     <a class="code" href="classVector2d.html">Vector2d<double></a> lineOutput(wavelengthOut_opt.size(),input.nrOfCol());</div>
+<div class="line"><a name="l00605"></a><span class="lineno">  605</span>     <span class="keyword">const</span> <span class="keywordtype">char</span>* pszMessage;</div>
+<div class="line"><a name="l00606"></a><span class="lineno">  606</span>     <span class="keywordtype">void</span>* pProgressArg=NULL;</div>
+<div class="line"><a name="l00607"></a><span class="lineno">  607</span>     GDALProgressFunc pfnProgress=GDALTermProgress;</div>
+<div class="line"><a name="l00608"></a><span class="lineno">  608</span>     <span class="keywordtype">double</span> progress=0;</div>
+<div class="line"><a name="l00609"></a><span class="lineno">  609</span>     pfnProgress(progress,pszMessage,pProgressArg);</div>
+<div class="line"><a name="l00610"></a><span class="lineno">  610</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> y=0;y<input.nrOfRow();++y){</div>
+<div class="line"><a name="l00611"></a><span class="lineno">  611</span>       <span class="keywordflow">if</span>((y+1+down_opt[0]/2)%down_opt[0])</div>
+<div class="line"><a name="l00612"></a><span class="lineno">  612</span>         <span class="keywordflow">continue</span>;</div>
+<div class="line"><a name="l00613"></a><span class="lineno">  613</span>       <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iband=0;iband<input.nrOfBand();++iband)</div>
+<div class="line"><a name="l00614"></a><span class="lineno">  614</span>         input.readData(lineInput[iband],GDT_Float64,y,iband);</div>
+<div class="line"><a name="l00615"></a><span class="lineno">  615</span>       filter1d.applyFwhm<<span class="keywordtype">double</span>>(wavelengthIn_opt,lineInput,wavelengthOut_opt,fwhm_opt, interpolationType_opt[0], lineOutput, down_opt[0], verbose_opt[0]);</div>
+<div class="line"><a name="l00616"></a><span class="lineno">  616</span>       <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iband=0;iband<output.nrOfBand();++iband){</div>
+<div class="line"><a name="l00617"></a><span class="lineno">  617</span>         <span class="keywordflow">try</span>{</div>
+<div class="line"><a name="l00618"></a><span class="lineno">  618</span>           output.writeData(lineOutput[iband],GDT_Float64,y/down_opt[0],iband);</div>
+<div class="line"><a name="l00619"></a><span class="lineno">  619</span>         }</div>
+<div class="line"><a name="l00620"></a><span class="lineno">  620</span>         <span class="keywordflow">catch</span>(<span class="keywordtype">string</span> errorstring){</div>
+<div class="line"><a name="l00621"></a><span class="lineno">  621</span>           cerr << errorstring << <span class="stringliteral">"in band "</span> << iband << <span class="stringliteral">", line "</span> << y << endl;</div>
+<div class="line"><a name="l00622"></a><span class="lineno">  622</span>         }</div>
+<div class="line"><a name="l00623"></a><span class="lineno">  623</span>       }</div>
+<div class="line"><a name="l00624"></a><span class="lineno">  624</span>       progress=(1.0+y)/output.nrOfRow();</div>
+<div class="line"><a name="l00625"></a><span class="lineno">  625</span>       pfnProgress(progress,pszMessage,pProgressArg);</div>
+<div class="line"><a name="l00626"></a><span class="lineno">  626</span>     }</div>
+<div class="line"><a name="l00627"></a><span class="lineno">  627</span>   }</div>
+<div class="line"><a name="l00628"></a><span class="lineno">  628</span>   <span class="keywordflow">else</span> <span class="keywordflow">if</span>(srf_opt.size()){</div>
+<div class="line"><a name="l00629"></a><span class="lineno">  629</span>     <span class="keywordflow">if</span>(verbose_opt[0])</div>
+<div class="line"><a name="l00630"></a><span class="lineno">  630</span>       std::cout << <span class="stringliteral">"spectral filtering to "</span> << srf_opt.size() << <span class="stringliteral">" bands with provided SRF "</span> << std::endl;</div>
+<div class="line"><a name="l00631"></a><span class="lineno">  631</span>     assert(wavelengthIn_opt.size());</div>
+<div class="line"><a name="l00632"></a><span class="lineno">  632</span>     vector< Vector2d<double> > srf(srf_opt.size());<span class="comment">//[0] srf_nr, [1]: wavelength, [2]: response</span></div>
+<div class="line"><a name="l00633"></a><span class="lineno">  633</span>     ifstream srfFile;</div>
+<div class="line"><a name="l00634"></a><span class="lineno">  634</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> isrf=0;isrf<srf_opt.size();++isrf){</div>
+<div class="line"><a name="l00635"></a><span class="lineno">  635</span>       srf[isrf].resize(2);</div>
+<div class="line"><a name="l00636"></a><span class="lineno">  636</span>       srfFile.open(srf_opt[isrf].c_str());</div>
+<div class="line"><a name="l00637"></a><span class="lineno">  637</span>       <span class="keywordtype">double</span> v;</div>
+<div class="line"><a name="l00638"></a><span class="lineno">  638</span>       <span class="comment">//add 0 to make sure srf is 0 at boundaries after interpolation step</span></div>
+<div class="line"><a name="l00639"></a><span class="lineno">  639</span>       srf[isrf][0].push_back(0);</div>
+<div class="line"><a name="l00640"></a><span class="lineno">  640</span>       srf[isrf][1].push_back(0);</div>
+<div class="line"><a name="l00641"></a><span class="lineno">  641</span>       srf[isrf][0].push_back(1);</div>
+<div class="line"><a name="l00642"></a><span class="lineno">  642</span>       srf[isrf][1].push_back(0);</div>
+<div class="line"><a name="l00643"></a><span class="lineno">  643</span>       <span class="keywordflow">while</span>(srfFile >> v){</div>
+<div class="line"><a name="l00644"></a><span class="lineno">  644</span>         srf[isrf][0].push_back(v);</div>
+<div class="line"><a name="l00645"></a><span class="lineno">  645</span>         srfFile >> v;</div>
+<div class="line"><a name="l00646"></a><span class="lineno">  646</span>         srf[isrf][1].push_back(v);</div>
+<div class="line"><a name="l00647"></a><span class="lineno">  647</span>       }</div>
+<div class="line"><a name="l00648"></a><span class="lineno">  648</span>       srfFile.close();</div>
+<div class="line"><a name="l00649"></a><span class="lineno">  649</span>       <span class="comment">//add 0 to make sure srf[isrf] is 0 at boundaries after interpolation step</span></div>
+<div class="line"><a name="l00650"></a><span class="lineno">  650</span>       srf[isrf][0].push_back(srf[isrf][0].back()+1);</div>
+<div class="line"><a name="l00651"></a><span class="lineno">  651</span>       srf[isrf][1].push_back(0);    </div>
+<div class="line"><a name="l00652"></a><span class="lineno">  652</span>       srf[isrf][0].push_back(srf[isrf][0].back()+1);</div>
+<div class="line"><a name="l00653"></a><span class="lineno">  653</span>       srf[isrf][1].push_back(0);</div>
+<div class="line"><a name="l00654"></a><span class="lineno">  654</span>       <span class="keywordflow">if</span>(verbose_opt[0])</div>
+<div class="line"><a name="l00655"></a><span class="lineno">  655</span>         cout << <span class="stringliteral">"srf file details: "</span> << srf[isrf][0].size() << <span class="stringliteral">" wavelengths defined"</span> << endl;    </div>
+<div class="line"><a name="l00656"></a><span class="lineno">  656</span>     }</div>
+<div class="line"><a name="l00657"></a><span class="lineno">  657</span>     assert(output.nrOfBand()==srf.size());</div>
+<div class="line"><a name="l00658"></a><span class="lineno">  658</span>     <span class="keywordtype">double</span> centreWavelength=0;</div>
+<div class="line"><a name="l00659"></a><span class="lineno">  659</span>     <a class="code" href="classVector2d.html">Vector2d<double></a> lineInput(input.nrOfBand(),input.nrOfCol());</div>
+<div class="line"><a name="l00660"></a><span class="lineno">  660</span>     <span class="keyword">const</span> <span class="keywordtype">char</span>* pszMessage;</div>
+<div class="line"><a name="l00661"></a><span class="lineno">  661</span>     <span class="keywordtype">void</span>* pProgressArg=NULL;</div>
+<div class="line"><a name="l00662"></a><span class="lineno">  662</span>     GDALProgressFunc pfnProgress=GDALTermProgress;</div>
+<div class="line"><a name="l00663"></a><span class="lineno">  663</span>     <span class="keywordtype">double</span> progress=0;</div>
+<div class="line"><a name="l00664"></a><span class="lineno">  664</span>     pfnProgress(progress,pszMessage,pProgressArg);</div>
+<div class="line"><a name="l00665"></a><span class="lineno">  665</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> y=0;y<input.nrOfRow();++y){</div>
+<div class="line"><a name="l00666"></a><span class="lineno">  666</span>       <span class="keywordflow">if</span>((y+1+down_opt[0]/2)%down_opt[0])</div>
+<div class="line"><a name="l00667"></a><span class="lineno">  667</span>         <span class="keywordflow">continue</span>;</div>
+<div class="line"><a name="l00668"></a><span class="lineno">  668</span>       <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iband=0;iband<input.nrOfBand();++iband)</div>
+<div class="line"><a name="l00669"></a><span class="lineno">  669</span>         input.readData(lineInput[iband],GDT_Float64,y,iband);</div>
+<div class="line"><a name="l00670"></a><span class="lineno">  670</span>       <span class="keywordflow">for</span>(<span class="keywordtype">int</span> isrf=0;isrf<srf.size();++isrf){</div>
+<div class="line"><a name="l00671"></a><span class="lineno">  671</span>         vector<double> lineOutput(output.nrOfCol());</div>
+<div class="line"><a name="l00672"></a><span class="lineno">  672</span>         <span class="keywordtype">double</span> delta=1.0;</div>
+<div class="line"><a name="l00673"></a><span class="lineno">  673</span>         <span class="keywordtype">bool</span> normalize=<span class="keyword">true</span>;</div>
+<div class="line"><a name="l00674"></a><span class="lineno">  674</span>     centreWavelength=filter1d.applySrf<<span class="keywordtype">double</span>>(wavelengthIn_opt,lineInput,srf[isrf], interpolationType_opt[0], lineOutput, delta, normalize);</div>
+<div class="line"><a name="l00675"></a><span class="lineno">  675</span>         <span class="keywordflow">if</span>(verbose_opt[0])</div>
+<div class="line"><a name="l00676"></a><span class="lineno">  676</span>           std::cout << <span class="stringliteral">"centre wavelength srf "</span> << isrf << <span class="stringliteral">": "</span> << centreWavelength << std::endl;</div>
+<div class="line"><a name="l00677"></a><span class="lineno">  677</span>         <span class="keywordflow">try</span>{</div>
+<div class="line"><a name="l00678"></a><span class="lineno">  678</span>           output.writeData(lineOutput,GDT_Float64,y/down_opt[0],isrf);</div>
+<div class="line"><a name="l00679"></a><span class="lineno">  679</span>         }</div>
+<div class="line"><a name="l00680"></a><span class="lineno">  680</span>         <span class="keywordflow">catch</span>(<span class="keywordtype">string</span> errorstring){</div>
+<div class="line"><a name="l00681"></a><span class="lineno">  681</span>           cerr << errorstring << <span class="stringliteral">"in srf "</span> << srf_opt[isrf] << <span class="stringliteral">", line "</span> << y << endl;</div>
+<div class="line"><a name="l00682"></a><span class="lineno">  682</span>         }</div>
+<div class="line"><a name="l00683"></a><span class="lineno">  683</span> </div>
+<div class="line"><a name="l00684"></a><span class="lineno">  684</span>       }</div>
+<div class="line"><a name="l00685"></a><span class="lineno">  685</span>       progress=(1.0+y)/output.nrOfRow();</div>
+<div class="line"><a name="l00686"></a><span class="lineno">  686</span>       pfnProgress(progress,pszMessage,pProgressArg);</div>
+<div class="line"><a name="l00687"></a><span class="lineno">  687</span>     }</div>
+<div class="line"><a name="l00688"></a><span class="lineno">  688</span> </div>
+<div class="line"><a name="l00689"></a><span class="lineno">  689</span>   }</div>
+<div class="line"><a name="l00690"></a><span class="lineno">  690</span>   <span class="keywordflow">else</span>{</div>
+<div class="line"><a name="l00691"></a><span class="lineno">  691</span>     <span class="keywordflow">switch</span>(filter2d::Filter2d::getFilterType(method_opt[0])){</div>
+<div class="line"><a name="l00692"></a><span class="lineno">  692</span>     <span class="keywordflow">case</span>(filter2d::dilate):</div>
+<div class="line"><a name="l00693"></a><span class="lineno">  693</span>       <span class="keywordflow">if</span>(down_opt[0]!=1){</div>
+<div class="line"><a name="l00694"></a><span class="lineno">  694</span>     std::cerr << <span class="stringliteral">"Error: down option not supported for morphological operator"</span> << std::endl;</div>
+<div class="line"><a name="l00695"></a><span class="lineno">  695</span>     exit(1);</div>
+<div class="line"><a name="l00696"></a><span class="lineno">  696</span>       }</div>
+<div class="line"><a name="l00697"></a><span class="lineno">  697</span>       <span class="keywordflow">try</span>{</div>
+<div class="line"><a name="l00698"></a><span class="lineno">  698</span>     <span class="keywordflow">if</span>(dimZ_opt.size()){</div>
+<div class="line"><a name="l00699"></a><span class="lineno">  699</span>       <span class="keywordflow">if</span>(verbose_opt[0])</div>
+<div class="line"><a name="l00700"></a><span class="lineno">  700</span>           std::cout<< <span class="stringliteral">"1-D filtering: dilate"</span> << std::endl;</div>
+<div class="line"><a name="l00701"></a><span class="lineno">  701</span>       filter1d.morphology(input,output,<span class="stringliteral">"dilate"</span>,dimZ_opt[0],verbose_opt[0]);</div>
+<div class="line"><a name="l00702"></a><span class="lineno">  702</span>     }</div>
+<div class="line"><a name="l00703"></a><span class="lineno">  703</span>     <span class="keywordflow">else</span></div>
+<div class="line"><a name="l00704"></a><span class="lineno">  704</span>       filter2d.morphology(input,output,<span class="stringliteral">"dilate"</span>,dimX_opt[0],dimY_opt[0],angle_opt,disc_opt[0]);</div>
+<div class="line"><a name="l00705"></a><span class="lineno">  705</span>       }</div>
+<div class="line"><a name="l00706"></a><span class="lineno">  706</span>       <span class="keywordflow">catch</span>(<span class="keywordtype">string</span> errorstring){</div>
+<div class="line"><a name="l00707"></a><span class="lineno">  707</span>     cerr << errorstring << endl;</div>
+<div class="line"><a name="l00708"></a><span class="lineno">  708</span>       }</div>
+<div class="line"><a name="l00709"></a><span class="lineno">  709</span>       <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l00710"></a><span class="lineno">  710</span>     <span class="keywordflow">case</span>(filter2d::erode):</div>
+<div class="line"><a name="l00711"></a><span class="lineno">  711</span>       <span class="keywordflow">if</span>(down_opt[0]!=1){</div>
+<div class="line"><a name="l00712"></a><span class="lineno">  712</span>     std::cerr << <span class="stringliteral">"Error: down option not supported for morphological operator"</span> << std::endl;</div>
+<div class="line"><a name="l00713"></a><span class="lineno">  713</span>     exit(1);</div>
+<div class="line"><a name="l00714"></a><span class="lineno">  714</span>       }</div>
+<div class="line"><a name="l00715"></a><span class="lineno">  715</span>       <span class="keywordflow">try</span>{</div>
+<div class="line"><a name="l00716"></a><span class="lineno">  716</span>     <span class="keywordflow">if</span>(dimZ_opt.size()>0){</div>
+<div class="line"><a name="l00717"></a><span class="lineno">  717</span>       <span class="keywordflow">if</span>(verbose_opt[0])</div>
+<div class="line"><a name="l00718"></a><span class="lineno">  718</span>         std::cout<< <span class="stringliteral">"1-D filtering: dilate"</span> << std::endl;</div>
+<div class="line"><a name="l00719"></a><span class="lineno">  719</span>       filter1d.morphology(input,output,<span class="stringliteral">"erode"</span>,dimZ_opt[0]);</div>
+<div class="line"><a name="l00720"></a><span class="lineno">  720</span>     }</div>
+<div class="line"><a name="l00721"></a><span class="lineno">  721</span>     <span class="keywordflow">else</span>{</div>
+<div class="line"><a name="l00722"></a><span class="lineno">  722</span>       filter2d.morphology(input,output,<span class="stringliteral">"erode"</span>,dimX_opt[0],dimY_opt[0],angle_opt,disc_opt[0]);</div>
+<div class="line"><a name="l00723"></a><span class="lineno">  723</span>     }</div>
+<div class="line"><a name="l00724"></a><span class="lineno">  724</span>       }</div>
+<div class="line"><a name="l00725"></a><span class="lineno">  725</span>       <span class="keywordflow">catch</span>(<span class="keywordtype">string</span> errorstring){</div>
+<div class="line"><a name="l00726"></a><span class="lineno">  726</span>     cerr << errorstring << endl;</div>
+<div class="line"><a name="l00727"></a><span class="lineno">  727</span>       }</div>
+<div class="line"><a name="l00728"></a><span class="lineno">  728</span>     <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l00729"></a><span class="lineno">  729</span>     <span class="keywordflow">case</span>(filter2d::close):{<span class="comment">//closing</span></div>
+<div class="line"><a name="l00730"></a><span class="lineno">  730</span>       <span class="keywordflow">if</span>(down_opt[0]!=1){</div>
+<div class="line"><a name="l00731"></a><span class="lineno">  731</span>     std::cerr << <span class="stringliteral">"Error: down option not supported for morphological operator"</span> << std::endl;</div>
+<div class="line"><a name="l00732"></a><span class="lineno">  732</span>     exit(1);</div>
+<div class="line"><a name="l00733"></a><span class="lineno">  733</span>       }</div>
+<div class="line"><a name="l00734"></a><span class="lineno">  734</span> </div>
+<div class="line"><a name="l00735"></a><span class="lineno">  735</span>       <a class="code" href="classImgWriterGdal.html">ImgWriterGdal</a> tmpout;</div>
+<div class="line"><a name="l00736"></a><span class="lineno">  736</span>       tmpout.open(<span class="stringliteral">"/vsimem/dilation.tif"</span>,input.nrOfCol(),input.nrOfRow(),input.nrOfBand(),input.getDataType(),input.getImageType());</div>
+<div class="line"><a name="l00737"></a><span class="lineno">  737</span>       <span class="keywordflow">try</span>{</div>
+<div class="line"><a name="l00738"></a><span class="lineno">  738</span>         <span class="keywordflow">if</span>(dimZ_opt.size()){</div>
+<div class="line"><a name="l00739"></a><span class="lineno">  739</span>           filter1d.morphology(input,tmpout,<span class="stringliteral">"dilate"</span>,dimZ_opt[0]);</div>
+<div class="line"><a name="l00740"></a><span class="lineno">  740</span>         }</div>
+<div class="line"><a name="l00741"></a><span class="lineno">  741</span>         <span class="keywordflow">else</span>{</div>
+<div class="line"><a name="l00742"></a><span class="lineno">  742</span>       filter2d.morphology(input,tmpout,<span class="stringliteral">"dilate"</span>,dimX_opt[0],dimY_opt[0],angle_opt,disc_opt[0]);</div>
+<div class="line"><a name="l00743"></a><span class="lineno">  743</span>         }</div>
+<div class="line"><a name="l00744"></a><span class="lineno">  744</span>       }</div>
+<div class="line"><a name="l00745"></a><span class="lineno">  745</span>       <span class="keywordflow">catch</span>(std::string errorString){</div>
+<div class="line"><a name="l00746"></a><span class="lineno">  746</span>     std::cout<< errorString;</div>
+<div class="line"><a name="l00747"></a><span class="lineno">  747</span>     exit(1);</div>
+<div class="line"><a name="l00748"></a><span class="lineno">  748</span>       }</div>
+<div class="line"><a name="l00749"></a><span class="lineno">  749</span>       tmpout.close();</div>
+<div class="line"><a name="l00750"></a><span class="lineno">  750</span>       <a class="code" href="classImgReaderGdal.html">ImgReaderGdal</a> tmpin;</div>
+<div class="line"><a name="l00751"></a><span class="lineno">  751</span>       tmpin.open(<span class="stringliteral">"/vsimem/dilation.tif"</span>);</div>
+<div class="line"><a name="l00752"></a><span class="lineno">  752</span>       <span class="keywordflow">try</span>{</div>
+<div class="line"><a name="l00753"></a><span class="lineno">  753</span>     <span class="keywordflow">if</span>(dimZ_opt.size()){</div>
+<div class="line"><a name="l00754"></a><span class="lineno">  754</span>       filter1d.morphology(tmpin,output,<span class="stringliteral">"erode"</span>,dimZ_opt[0]);</div>
+<div class="line"><a name="l00755"></a><span class="lineno">  755</span>     }</div>
+<div class="line"><a name="l00756"></a><span class="lineno">  756</span>     <span class="keywordflow">else</span>{</div>
+<div class="line"><a name="l00757"></a><span class="lineno">  757</span>       filter2d.morphology(tmpin,output,<span class="stringliteral">"erode"</span>,dimX_opt[0],dimY_opt[0],angle_opt,disc_opt[0]);</div>
+<div class="line"><a name="l00758"></a><span class="lineno">  758</span>     }</div>
+<div class="line"><a name="l00759"></a><span class="lineno">  759</span>       }</div>
+<div class="line"><a name="l00760"></a><span class="lineno">  760</span>       <span class="keywordflow">catch</span>(<span class="keywordtype">string</span> errorstring){</div>
+<div class="line"><a name="l00761"></a><span class="lineno">  761</span>     cerr << errorstring << endl;</div>
+<div class="line"><a name="l00762"></a><span class="lineno">  762</span>       }</div>
+<div class="line"><a name="l00763"></a><span class="lineno">  763</span>       tmpin.close();</div>
+<div class="line"><a name="l00764"></a><span class="lineno">  764</span>       <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l00765"></a><span class="lineno">  765</span>     }</div>
+<div class="line"><a name="l00766"></a><span class="lineno">  766</span>     <span class="keywordflow">case</span>(filter2d::open):{<span class="comment">//opening</span></div>
+<div class="line"><a name="l00767"></a><span class="lineno">  767</span>       <span class="keywordflow">if</span>(down_opt[0]!=1){</div>
+<div class="line"><a name="l00768"></a><span class="lineno">  768</span>     std::cerr << <span class="stringliteral">"Error: down option not supported for morphological operator"</span> << std::endl;</div>
+<div class="line"><a name="l00769"></a><span class="lineno">  769</span>     exit(1);</div>
+<div class="line"><a name="l00770"></a><span class="lineno">  770</span>       }</div>
+<div class="line"><a name="l00771"></a><span class="lineno">  771</span>       <a class="code" href="classImgWriterGdal.html">ImgWriterGdal</a> tmpout;</div>
+<div class="line"><a name="l00772"></a><span class="lineno">  772</span>       tmpout.open(<span class="stringliteral">"/vsimem/erosion.tif"</span>,input.nrOfCol(),input.nrOfRow(),input.nrOfBand(),input.getDataType(),input.getImageType());</div>
+<div class="line"><a name="l00773"></a><span class="lineno">  773</span>       <span class="keywordflow">try</span>{</div>
+<div class="line"><a name="l00774"></a><span class="lineno">  774</span>     <span class="keywordflow">if</span>(dimZ_opt.size()){</div>
+<div class="line"><a name="l00775"></a><span class="lineno">  775</span>       filter1d.morphology(input,tmpout,<span class="stringliteral">"erode"</span>,dimZ_opt[0]);</div>
+<div class="line"><a name="l00776"></a><span class="lineno">  776</span>     }</div>
+<div class="line"><a name="l00777"></a><span class="lineno">  777</span>     <span class="keywordflow">else</span>{</div>
+<div class="line"><a name="l00778"></a><span class="lineno">  778</span>       filter2d.morphology(input,tmpout,<span class="stringliteral">"erode"</span>,dimX_opt[0],dimY_opt[0],angle_opt,disc_opt[0]);</div>
+<div class="line"><a name="l00779"></a><span class="lineno">  779</span>     }</div>
 <div class="line"><a name="l00780"></a><span class="lineno">  780</span>       }</div>
-<div class="line"><a name="l00781"></a><span class="lineno">  781</span>       <span class="keywordflow">catch</span>(<span class="keywordtype">string</span> errorstring){</div>
-<div class="line"><a name="l00782"></a><span class="lineno">  782</span>     cerr << errorstring << endl;</div>
-<div class="line"><a name="l00783"></a><span class="lineno">  783</span>       }</div>
-<div class="line"><a name="l00784"></a><span class="lineno">  784</span>       <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l00785"></a><span class="lineno">  785</span>     }</div>
-<div class="line"><a name="l00786"></a><span class="lineno">  786</span>     <span class="keywordflow">case</span>(filter2d::sobelx):{<span class="comment">//Sobel edge detection in X</span></div>
-<div class="line"><a name="l00787"></a><span class="lineno">  787</span>       <span class="keywordflow">if</span>(down_opt[0]!=1){</div>
-<div class="line"><a name="l00788"></a><span class="lineno">  788</span>     std::cerr << <span class="stringliteral">"Error: down option not supported for sobel edge detection"</span> << std::endl;</div>
-<div class="line"><a name="l00789"></a><span class="lineno">  789</span>     exit(1);</div>
-<div class="line"><a name="l00790"></a><span class="lineno">  790</span>       }</div>
-<div class="line"><a name="l00791"></a><span class="lineno">  791</span>       <a class="code" href="classVector2d.html">Vector2d<double></a> theTaps(3,3);</div>
-<div class="line"><a name="l00792"></a><span class="lineno">  792</span>       theTaps[0][0]=-1.0;</div>
-<div class="line"><a name="l00793"></a><span class="lineno">  793</span>       theTaps[0][1]=0.0;</div>
-<div class="line"><a name="l00794"></a><span class="lineno">  794</span>       theTaps[0][2]=1.0;</div>
-<div class="line"><a name="l00795"></a><span class="lineno">  795</span>       theTaps[1][0]=-2.0;</div>
-<div class="line"><a name="l00796"></a><span class="lineno">  796</span>       theTaps[1][1]=0.0;</div>
-<div class="line"><a name="l00797"></a><span class="lineno">  797</span>       theTaps[1][2]=2.0;</div>
-<div class="line"><a name="l00798"></a><span class="lineno">  798</span>       theTaps[2][0]=-1.0;</div>
-<div class="line"><a name="l00799"></a><span class="lineno">  799</span>       theTaps[2][1]=0.0;</div>
-<div class="line"><a name="l00800"></a><span class="lineno">  800</span>       theTaps[2][2]=1.0;</div>
-<div class="line"><a name="l00801"></a><span class="lineno">  801</span>       filter2d.setTaps(theTaps);</div>
-<div class="line"><a name="l00802"></a><span class="lineno">  802</span>       <span class="keywordflow">try</span>{</div>
-<div class="line"><a name="l00803"></a><span class="lineno">  803</span>     filter2d.filter(input,output,<span class="keyword">true</span>,<span class="keyword">true</span>);<span class="comment">//absolute and normalize</span></div>
-<div class="line"><a name="l00804"></a><span class="lineno">  804</span>       }</div>
-<div class="line"><a name="l00805"></a><span class="lineno">  805</span>       <span class="keywordflow">catch</span>(<span class="keywordtype">string</span> errorstring){</div>
-<div class="line"><a name="l00806"></a><span class="lineno">  806</span>     cerr << errorstring << endl;</div>
-<div class="line"><a name="l00807"></a><span class="lineno">  807</span>       }</div>
-<div class="line"><a name="l00808"></a><span class="lineno">  808</span>       <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l00809"></a><span class="lineno">  809</span>     }</div>
-<div class="line"><a name="l00810"></a><span class="lineno">  810</span>     <span class="keywordflow">case</span>(filter2d::sobely):{<span class="comment">//Sobel edge detection in Y</span></div>
-<div class="line"><a name="l00811"></a><span class="lineno">  811</span>       <span class="keywordflow">if</span>(down_opt[0]!=1){</div>
-<div class="line"><a name="l00812"></a><span class="lineno">  812</span>     std::cerr << <span class="stringliteral">"Error: down option not supported for sobel edge detection"</span> << std::endl;</div>
-<div class="line"><a name="l00813"></a><span class="lineno">  813</span>     exit(1);</div>
-<div class="line"><a name="l00814"></a><span class="lineno">  814</span>       }</div>
-<div class="line"><a name="l00815"></a><span class="lineno">  815</span>       <a class="code" href="classVector2d.html">Vector2d<double></a> theTaps(3,3);</div>
-<div class="line"><a name="l00816"></a><span class="lineno">  816</span>       theTaps[0][0]=1.0;</div>
-<div class="line"><a name="l00817"></a><span class="lineno">  817</span>       theTaps[0][1]=2.0;</div>
-<div class="line"><a name="l00818"></a><span class="lineno">  818</span>       theTaps[0][2]=1.0;</div>
-<div class="line"><a name="l00819"></a><span class="lineno">  819</span>       theTaps[1][0]=0.0;</div>
-<div class="line"><a name="l00820"></a><span class="lineno">  820</span>       theTaps[1][1]=0.0;</div>
-<div class="line"><a name="l00821"></a><span class="lineno">  821</span>       theTaps[1][2]=0.0;</div>
-<div class="line"><a name="l00822"></a><span class="lineno">  822</span>       theTaps[2][0]=-1.0;</div>
-<div class="line"><a name="l00823"></a><span class="lineno">  823</span>       theTaps[2][1]=-2.0;</div>
-<div class="line"><a name="l00824"></a><span class="lineno">  824</span>       theTaps[2][2]=-1.0;</div>
-<div class="line"><a name="l00825"></a><span class="lineno">  825</span>       filter2d.setTaps(theTaps);</div>
-<div class="line"><a name="l00826"></a><span class="lineno">  826</span>       <span class="keywordflow">try</span>{</div>
-<div class="line"><a name="l00827"></a><span class="lineno">  827</span>     filter2d.filter(input,output,<span class="keyword">true</span>,<span class="keyword">true</span>);<span class="comment">//absolute and normalize</span></div>
-<div class="line"><a name="l00828"></a><span class="lineno">  828</span>       }</div>
-<div class="line"><a name="l00829"></a><span class="lineno">  829</span>       <span class="keywordflow">catch</span>(<span class="keywordtype">string</span> errorstring){</div>
-<div class="line"><a name="l00830"></a><span class="lineno">  830</span>     cerr << errorstring << endl;</div>
+<div class="line"><a name="l00781"></a><span class="lineno">  781</span>       <span class="keywordflow">catch</span>(std::string errorString){</div>
+<div class="line"><a name="l00782"></a><span class="lineno">  782</span>     std::cout<< errorString;</div>
+<div class="line"><a name="l00783"></a><span class="lineno">  783</span>     exit(1);</div>
+<div class="line"><a name="l00784"></a><span class="lineno">  784</span>       }</div>
+<div class="line"><a name="l00785"></a><span class="lineno">  785</span>       tmpout.close();</div>
+<div class="line"><a name="l00786"></a><span class="lineno">  786</span>       <a class="code" href="classImgReaderGdal.html">ImgReaderGdal</a> tmpin;</div>
+<div class="line"><a name="l00787"></a><span class="lineno">  787</span>       <span class="keywordflow">try</span>{</div>
+<div class="line"><a name="l00788"></a><span class="lineno">  788</span>     tmpin.open(<span class="stringliteral">"/vsimem/erosion.tif"</span>);</div>
+<div class="line"><a name="l00789"></a><span class="lineno">  789</span>     <span class="keywordflow">if</span>(dimZ_opt.size()){</div>
+<div class="line"><a name="l00790"></a><span class="lineno">  790</span>       filter1d.morphology(tmpin,output,<span class="stringliteral">"dilate"</span>,dimZ_opt[0]);</div>
+<div class="line"><a name="l00791"></a><span class="lineno">  791</span>     }</div>
+<div class="line"><a name="l00792"></a><span class="lineno">  792</span>     <span class="keywordflow">else</span>{</div>
+<div class="line"><a name="l00793"></a><span class="lineno">  793</span>       filter2d.morphology(tmpin,output,<span class="stringliteral">"dilate"</span>,dimX_opt[0],dimY_opt[0],angle_opt,disc_opt[0]);</div>
+<div class="line"><a name="l00794"></a><span class="lineno">  794</span>     }</div>
+<div class="line"><a name="l00795"></a><span class="lineno">  795</span>     tmpin.close();</div>
+<div class="line"><a name="l00796"></a><span class="lineno">  796</span>     tmpout.close();</div>
+<div class="line"><a name="l00797"></a><span class="lineno">  797</span>       }</div>
+<div class="line"><a name="l00798"></a><span class="lineno">  798</span>       <span class="keywordflow">catch</span>(<span class="keywordtype">string</span> errorstring){</div>
+<div class="line"><a name="l00799"></a><span class="lineno">  799</span>     cerr << errorstring << endl;</div>
+<div class="line"><a name="l00800"></a><span class="lineno">  800</span>       }</div>
+<div class="line"><a name="l00801"></a><span class="lineno">  801</span>       <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l00802"></a><span class="lineno">  802</span>     }</div>
+<div class="line"><a name="l00803"></a><span class="lineno">  803</span>     <span class="keywordflow">case</span>(filter2d::homog):{<span class="comment">//spatially homogeneous</span></div>
+<div class="line"><a name="l00804"></a><span class="lineno">  804</span>       <span class="keywordflow">try</span>{</div>
+<div class="line"><a name="l00805"></a><span class="lineno">  805</span>     filter2d.doit(input,output,<span class="stringliteral">"homog"</span>,dimX_opt[0],dimY_opt[0],down_opt[0],disc_opt[0]);</div>
+<div class="line"><a name="l00806"></a><span class="lineno">  806</span>       }</div>
+<div class="line"><a name="l00807"></a><span class="lineno">  807</span>       <span class="keywordflow">catch</span>(<span class="keywordtype">string</span> errorstring){</div>
+<div class="line"><a name="l00808"></a><span class="lineno">  808</span>     cerr << errorstring << endl;</div>
+<div class="line"><a name="l00809"></a><span class="lineno">  809</span>       }</div>
+<div class="line"><a name="l00810"></a><span class="lineno">  810</span>     <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l00811"></a><span class="lineno">  811</span>     }</div>
+<div class="line"><a name="l00812"></a><span class="lineno">  812</span>     <span class="keywordflow">case</span>(filter2d::heterog):{<span class="comment">//spatially heterogeneous</span></div>
+<div class="line"><a name="l00813"></a><span class="lineno">  813</span>       <span class="keywordflow">try</span>{</div>
+<div class="line"><a name="l00814"></a><span class="lineno">  814</span>     filter2d.doit(input,output,<span class="stringliteral">"heterog"</span>,dimX_opt[0],dimY_opt[0],down_opt[0],disc_opt[0]);</div>
+<div class="line"><a name="l00815"></a><span class="lineno">  815</span>       }</div>
+<div class="line"><a name="l00816"></a><span class="lineno">  816</span>       <span class="keywordflow">catch</span>(<span class="keywordtype">string</span> errorstring){</div>
+<div class="line"><a name="l00817"></a><span class="lineno">  817</span>     cerr << errorstring << endl;</div>
+<div class="line"><a name="l00818"></a><span class="lineno">  818</span>       }</div>
+<div class="line"><a name="l00819"></a><span class="lineno">  819</span>       <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l00820"></a><span class="lineno">  820</span>     }</div>
+<div class="line"><a name="l00821"></a><span class="lineno">  821</span>     <span class="keywordflow">case</span>(filter2d::shift):{<span class="comment">//shift</span></div>
+<div class="line"><a name="l00822"></a><span class="lineno">  822</span>       <span class="keywordflow">if</span>(down_opt[0]!=1){</div>
+<div class="line"><a name="l00823"></a><span class="lineno">  823</span>     std::cerr << <span class="stringliteral">"Error: down option not supported for shift operator"</span> << std::endl;</div>
+<div class="line"><a name="l00824"></a><span class="lineno">  824</span>     exit(1);</div>
+<div class="line"><a name="l00825"></a><span class="lineno">  825</span>       }</div>
+<div class="line"><a name="l00826"></a><span class="lineno">  826</span>       assert(input.nrOfBand());</div>
+<div class="line"><a name="l00827"></a><span class="lineno">  827</span>       assert(input.nrOfCol());</div>
+<div class="line"><a name="l00828"></a><span class="lineno">  828</span>       assert(input.nrOfRow());</div>
+<div class="line"><a name="l00829"></a><span class="lineno">  829</span>       <span class="keywordflow">try</span>{</div>
+<div class="line"><a name="l00830"></a><span class="lineno">  830</span>         filter2d.shift(input,output,dimX_opt[0],dimY_opt[0],threshold_opt[0],filter2d::Filter2d::getResampleType(resample_opt[0]));</div>
 <div class="line"><a name="l00831"></a><span class="lineno">  831</span>       }</div>
-<div class="line"><a name="l00832"></a><span class="lineno">  832</span>       <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l00833"></a><span class="lineno">  833</span>     }</div>
-<div class="line"><a name="l00834"></a><span class="lineno">  834</span>     <span class="keywordflow">case</span>(filter2d::sobelxy):{<span class="comment">//Sobel edge detection in XY</span></div>
-<div class="line"><a name="l00835"></a><span class="lineno">  835</span>       <span class="keywordflow">if</span>(down_opt[0]!=1){</div>
-<div class="line"><a name="l00836"></a><span class="lineno">  836</span>     std::cerr << <span class="stringliteral">"Error: down option not supported for sobel edge detection"</span> << std::endl;</div>
-<div class="line"><a name="l00837"></a><span class="lineno">  837</span>     exit(1);</div>
-<div class="line"><a name="l00838"></a><span class="lineno">  838</span>       }</div>
-<div class="line"><a name="l00839"></a><span class="lineno">  839</span>       <a class="code" href="classVector2d.html">Vector2d<double></a> theTaps(3,3);</div>
-<div class="line"><a name="l00840"></a><span class="lineno">  840</span>       theTaps[0][0]=0.0;</div>
-<div class="line"><a name="l00841"></a><span class="lineno">  841</span>       theTaps[0][1]=1.0;</div>
-<div class="line"><a name="l00842"></a><span class="lineno">  842</span>       theTaps[0][2]=2.0;</div>
-<div class="line"><a name="l00843"></a><span class="lineno">  843</span>       theTaps[1][0]=-1.0;</div>
-<div class="line"><a name="l00844"></a><span class="lineno">  844</span>       theTaps[1][1]=0.0;</div>
-<div class="line"><a name="l00845"></a><span class="lineno">  845</span>       theTaps[1][2]=1.0;</div>
-<div class="line"><a name="l00846"></a><span class="lineno">  846</span>       theTaps[2][0]=-2.0;</div>
-<div class="line"><a name="l00847"></a><span class="lineno">  847</span>       theTaps[2][1]=-1.0;</div>
-<div class="line"><a name="l00848"></a><span class="lineno">  848</span>       theTaps[2][2]=0.0;</div>
-<div class="line"><a name="l00849"></a><span class="lineno">  849</span>       filter2d.setTaps(theTaps);</div>
-<div class="line"><a name="l00850"></a><span class="lineno">  850</span>       <span class="keywordflow">try</span>{</div>
-<div class="line"><a name="l00851"></a><span class="lineno">  851</span>     filter2d.filter(input,output,<span class="keyword">true</span>,<span class="keyword">true</span>);<span class="comment">//absolute and normalize</span></div>
-<div class="line"><a name="l00852"></a><span class="lineno">  852</span>       }</div>
-<div class="line"><a name="l00853"></a><span class="lineno">  853</span>       <span class="keywordflow">catch</span>(<span class="keywordtype">string</span> errorstring){</div>
-<div class="line"><a name="l00854"></a><span class="lineno">  854</span>     cerr << errorstring << endl;</div>
-<div class="line"><a name="l00855"></a><span class="lineno">  855</span>       }</div>
-<div class="line"><a name="l00856"></a><span class="lineno">  856</span>       <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l00857"></a><span class="lineno">  857</span>     }</div>
-<div class="line"><a name="l00858"></a><span class="lineno">  858</span>     <span class="keywordflow">case</span>(filter2d::sobelyx):{<span class="comment">//Sobel edge detection in XY</span></div>
-<div class="line"><a name="l00859"></a><span class="lineno">  859</span>       <span class="keywordflow">if</span>(down_opt[0]!=1){</div>
-<div class="line"><a name="l00860"></a><span class="lineno">  860</span>     std::cerr << <span class="stringliteral">"Error: down option not supported for sobel edge detection"</span> << std::endl;</div>
-<div class="line"><a name="l00861"></a><span class="lineno">  861</span>     exit(1);</div>
-<div class="line"><a name="l00862"></a><span class="lineno">  862</span>       }</div>
-<div class="line"><a name="l00863"></a><span class="lineno">  863</span>       <a class="code" href="classVector2d.html">Vector2d<double></a> theTaps(3,3);</div>
-<div class="line"><a name="l00864"></a><span class="lineno">  864</span>       theTaps[0][0]=2.0;</div>
-<div class="line"><a name="l00865"></a><span class="lineno">  865</span>       theTaps[0][1]=1.0;</div>
-<div class="line"><a name="l00866"></a><span class="lineno">  866</span>       theTaps[0][2]=0.0;</div>
-<div class="line"><a name="l00867"></a><span class="lineno">  867</span>       theTaps[1][0]=1.0;</div>
-<div class="line"><a name="l00868"></a><span class="lineno">  868</span>       theTaps[1][1]=0.0;</div>
-<div class="line"><a name="l00869"></a><span class="lineno">  869</span>       theTaps[1][2]=-1.0;</div>
-<div class="line"><a name="l00870"></a><span class="lineno">  870</span>       theTaps[2][0]=0.0;</div>
-<div class="line"><a name="l00871"></a><span class="lineno">  871</span>       theTaps[2][1]=-1.0;</div>
-<div class="line"><a name="l00872"></a><span class="lineno">  872</span>       theTaps[2][2]=-2.0;</div>
-<div class="line"><a name="l00873"></a><span class="lineno">  873</span>       filter2d.setTaps(theTaps);</div>
-<div class="line"><a name="l00874"></a><span class="lineno">  874</span>       <span class="keywordflow">try</span>{</div>
-<div class="line"><a name="l00875"></a><span class="lineno">  875</span>     filter2d.filter(input,output,<span class="keyword">true</span>,<span class="keyword">true</span>);<span class="comment">//absolute and normalize</span></div>
-<div class="line"><a name="l00876"></a><span class="lineno">  876</span>       }</div>
-<div class="line"><a name="l00877"></a><span class="lineno">  877</span>       <span class="keywordflow">catch</span>(<span class="keywordtype">string</span> errorstring){</div>
-<div class="line"><a name="l00878"></a><span class="lineno">  878</span>     cerr << errorstring << endl;</div>
-<div class="line"><a name="l00879"></a><span class="lineno">  879</span>       }</div>
-<div class="line"><a name="l00880"></a><span class="lineno">  880</span>       <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l00881"></a><span class="lineno">  881</span>     }</div>
-<div class="line"><a name="l00882"></a><span class="lineno">  882</span>     <span class="keywordflow">case</span>(filter2d::smooth):{<span class="comment">//Smoothing filter</span></div>
-<div class="line"><a name="l00883"></a><span class="lineno">  883</span>       <span class="keywordflow">if</span>(down_opt[0]!=1){</div>
-<div class="line"><a name="l00884"></a><span class="lineno">  884</span>     std::cerr << <span class="stringliteral">"Error: down option not supported for this filter"</span> << std::endl;</div>
-<div class="line"><a name="l00885"></a><span class="lineno">  885</span>     exit(1);</div>
-<div class="line"><a name="l00886"></a><span class="lineno">  886</span>       }</div>
-<div class="line"><a name="l00887"></a><span class="lineno">  887</span>       <span class="keywordflow">try</span>{</div>
-<div class="line"><a name="l00888"></a><span class="lineno">  888</span>     <span class="keywordflow">if</span>(dimZ_opt.size()){</div>
-<div class="line"><a name="l00889"></a><span class="lineno">  889</span>       <span class="keywordflow">if</span>(verbose_opt[0])</div>
-<div class="line"><a name="l00890"></a><span class="lineno">  890</span>         std::cout<< <span class="stringliteral">"1-D filtering: smooth"</span> << std::endl;</div>
-<div class="line"><a name="l00891"></a><span class="lineno">  891</span>       filter1d.smooth(input,output,dimZ_opt[0]);</div>
-<div class="line"><a name="l00892"></a><span class="lineno">  892</span>     }</div>
-<div class="line"><a name="l00893"></a><span class="lineno">  893</span>     <span class="keywordflow">else</span>{</div>
-<div class="line"><a name="l00894"></a><span class="lineno">  894</span>       filter2d.smooth(input,output,dimX_opt[0],dimY_opt[0]);</div>
-<div class="line"><a name="l00895"></a><span class="lineno">  895</span>     }</div>
-<div class="line"><a name="l00896"></a><span class="lineno">  896</span>       }</div>
-<div class="line"><a name="l00897"></a><span class="lineno">  897</span>       <span class="keywordflow">catch</span>(<span class="keywordtype">string</span> errorstring){</div>
-<div class="line"><a name="l00898"></a><span class="lineno">  898</span>     cerr << errorstring << endl;</div>
-<div class="line"><a name="l00899"></a><span class="lineno">  899</span>       }</div>
-<div class="line"><a name="l00900"></a><span class="lineno">  900</span>       <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l00901"></a><span class="lineno">  901</span>     }</div>
-<div class="line"><a name="l00902"></a><span class="lineno">  902</span>     <span class="keywordflow">case</span>(filter2d::smoothnodata):{<span class="comment">//Smoothing filter</span></div>
-<div class="line"><a name="l00903"></a><span class="lineno">  903</span>       <span class="keywordflow">if</span>(down_opt[0]!=1){</div>
-<div class="line"><a name="l00904"></a><span class="lineno">  904</span>     std::cerr << <span class="stringliteral">"Error: down option not supported for this filter"</span> << std::endl;</div>
-<div class="line"><a name="l00905"></a><span class="lineno">  905</span>     exit(1);</div>
-<div class="line"><a name="l00906"></a><span class="lineno">  906</span>       }</div>
-<div class="line"><a name="l00907"></a><span class="lineno">  907</span>       <span class="keywordflow">try</span>{</div>
-<div class="line"><a name="l00908"></a><span class="lineno">  908</span>     <span class="keywordflow">if</span>(dimZ_opt.size()){</div>
-<div class="line"><a name="l00909"></a><span class="lineno">  909</span>       <span class="keywordflow">if</span>(verbose_opt[0])</div>
-<div class="line"><a name="l00910"></a><span class="lineno">  910</span>         std::cout<< <span class="stringliteral">"1-D filtering: smooth"</span> << std::endl;</div>
-<div class="line"><a name="l00911"></a><span class="lineno">  911</span>       filter1d.smoothNoData(input,interpolationType_opt[0],output);</div>
-<div class="line"><a name="l00912"></a><span class="lineno">  912</span>     }</div>
-<div class="line"><a name="l00913"></a><span class="lineno">  913</span>     <span class="keywordflow">else</span>{</div>
-<div class="line"><a name="l00914"></a><span class="lineno">  914</span>       <span class="keywordflow">if</span>(verbose_opt[0])</div>
-<div class="line"><a name="l00915"></a><span class="lineno">  915</span>         std::cout<< <span class="stringliteral">"2-D filtering: smooth"</span> << std::endl;</div>
-<div class="line"><a name="l00916"></a><span class="lineno">  916</span>       filter2d.smoothNoData(input,output,dimX_opt[0],dimY_opt[0]);</div>
+<div class="line"><a name="l00832"></a><span class="lineno">  832</span>       <span class="keywordflow">catch</span>(<span class="keywordtype">string</span> errorstring){</div>
+<div class="line"><a name="l00833"></a><span class="lineno">  833</span>         cerr << errorstring << endl;</div>
+<div class="line"><a name="l00834"></a><span class="lineno">  834</span>       }</div>
+<div class="line"><a name="l00835"></a><span class="lineno">  835</span>       <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l00836"></a><span class="lineno">  836</span>     }</div>
+<div class="line"><a name="l00837"></a><span class="lineno">  837</span>     <span class="comment">// case(filter2d::linearfeature):{</span></div>
+<div class="line"><a name="l00838"></a><span class="lineno">  838</span>     <span class="comment">//   if(down_opt[0]!=1){</span></div>
+<div class="line"><a name="l00839"></a><span class="lineno">  839</span>     <span class="comment">//  std::cerr << "Error: down option not supported for linear feature" << std::endl;</span></div>
+<div class="line"><a name="l00840"></a><span class="lineno">  840</span>     <span class="comment">//  exit(1);</span></div>
+<div class="line"><a name="l00841"></a><span class="lineno">  841</span>     <span class="comment">//   }</span></div>
+<div class="line"><a name="l00842"></a><span class="lineno">  842</span>     <span class="comment">//   assert(input.nrOfBand());</span></div>
+<div class="line"><a name="l00843"></a><span class="lineno">  843</span>     <span class="comment">//   assert(input.nrOfCol());</span></div>
+<div class="line"><a name="l00844"></a><span class="lineno">  844</span>     <span class="comment">//   assert(input.nrOfRow());</span></div>
+<div class="line"><a name="l00845"></a><span class="lineno">  845</span>     <span class="comment">//   float theAngle=361;</span></div>
+<div class="line"><a name="l00846"></a><span class="lineno">  846</span>     <span class="comment">//   if(angle_opt.size())</span></div>
+<div class="line"><a name="l00847"></a><span class="lineno">  847</span>     <span class="comment">//  theAngle=angle_opt[0];</span></div>
+<div class="line"><a name="l00848"></a><span class="lineno">  848</span>     <span class="comment">//   if(verbose_opt[0])</span></div>
+<div class="line"><a name="l00849"></a><span class="lineno">  849</span>     <span class="comment">//  std::cout << "using angle " << theAngle << std::endl;</span></div>
+<div class="line"><a name="l00850"></a><span class="lineno">  850</span>     <span class="comment">//   try{</span></div>
+<div class="line"><a name="l00851"></a><span class="lineno">  851</span>     <span class="comment">//  //using an angle step of 5 degrees and no maximum distance</span></div>
+<div class="line"><a name="l00852"></a><span class="lineno">  852</span>     <span class="comment">//     filter2d.linearFeature(input,output,theAngle,5,0,eps_opt[0],l1_opt[0],a1_opt[0],l2_opt[0],a2_opt[0],0,verbose_opt[0]);</span></div>
+<div class="line"><a name="l00853"></a><span class="lineno">  853</span>     <span class="comment">//   }</span></div>
+<div class="line"><a name="l00854"></a><span class="lineno">  854</span>     <span class="comment">//   catch(string errorstring){</span></div>
+<div class="line"><a name="l00855"></a><span class="lineno">  855</span>     <span class="comment">//     cerr << errorstring << endl;</span></div>
+<div class="line"><a name="l00856"></a><span class="lineno">  856</span>     <span class="comment">//   }</span></div>
+<div class="line"><a name="l00857"></a><span class="lineno">  857</span>     <span class="comment">//   break;</span></div>
+<div class="line"><a name="l00858"></a><span class="lineno">  858</span>     <span class="comment">// }</span></div>
+<div class="line"><a name="l00859"></a><span class="lineno">  859</span>     <span class="keywordflow">case</span>(filter2d::mrf):{<span class="comment">//Markov Random Field</span></div>
+<div class="line"><a name="l00860"></a><span class="lineno">  860</span>       <span class="keywordflow">if</span>(verbose_opt[0])</div>
+<div class="line"><a name="l00861"></a><span class="lineno">  861</span>     std::cout << <span class="stringliteral">"Markov Random Field filtering"</span> << std::endl;</div>
+<div class="line"><a name="l00862"></a><span class="lineno">  862</span>       <span class="keywordflow">try</span>{</div>
+<div class="line"><a name="l00863"></a><span class="lineno">  863</span>     <span class="keywordflow">if</span>(beta_opt.size()){</div>
+<div class="line"><a name="l00864"></a><span class="lineno">  864</span>       <span class="comment">//in file: classFrom classTo</span></div>
+<div class="line"><a name="l00865"></a><span class="lineno">  865</span>       <span class="comment">//in variable: beta[classTo][classFrom]</span></div>
+<div class="line"><a name="l00866"></a><span class="lineno">  866</span>       <a class="code" href="classFileReaderAscii.html">FileReaderAscii</a> betaReader(beta_opt[0]);</div>
+<div class="line"><a name="l00867"></a><span class="lineno">  867</span>       <a class="code" href="classVector2d.html">Vector2d<double></a> beta(class_opt.size(),class_opt.size());</div>
+<div class="line"><a name="l00868"></a><span class="lineno">  868</span>       vector<int> cols(class_opt.size());</div>
+<div class="line"><a name="l00869"></a><span class="lineno">  869</span>       <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iclass=0;iclass<class_opt.size();++iclass)</div>
+<div class="line"><a name="l00870"></a><span class="lineno">  870</span>         cols[iclass]=iclass;</div>
+<div class="line"><a name="l00871"></a><span class="lineno">  871</span>       betaReader.readData(beta,cols);</div>
+<div class="line"><a name="l00872"></a><span class="lineno">  872</span>       <span class="keywordflow">if</span>(verbose_opt[0]){</div>
+<div class="line"><a name="l00873"></a><span class="lineno">  873</span>         std::cout << <span class="stringliteral">"using values for beta:"</span> << std::endl;</div>
+<div class="line"><a name="l00874"></a><span class="lineno">  874</span>         <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iclass1=0;iclass1<class_opt.size();++iclass1)</div>
+<div class="line"><a name="l00875"></a><span class="lineno">  875</span>           std::cout << <span class="stringliteral">"      "</span> << iclass1 << <span class="stringliteral">" ("</span> << class_opt[iclass1] << <span class="stringliteral">")"</span>;</div>
+<div class="line"><a name="l00876"></a><span class="lineno">  876</span>         std::cout << std::endl;</div>
+<div class="line"><a name="l00877"></a><span class="lineno">  877</span>         <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iclass1=0;iclass1<class_opt.size();++iclass1){</div>
+<div class="line"><a name="l00878"></a><span class="lineno">  878</span>           std::cout << iclass1 << <span class="stringliteral">" ("</span> << class_opt[iclass1] << <span class="stringliteral">")"</span>;</div>
+<div class="line"><a name="l00879"></a><span class="lineno">  879</span>           <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iclass2=0;iclass2<class_opt.size();++iclass2)</div>
+<div class="line"><a name="l00880"></a><span class="lineno">  880</span>         std::cout << <span class="stringliteral">" "</span> << beta[iclass2][iclass1] << <span class="stringliteral">" ("</span> << class_opt[iclass2] << <span class="stringliteral">")"</span>;</div>
+<div class="line"><a name="l00881"></a><span class="lineno">  881</span>           std::cout << std::endl;</div>
+<div class="line"><a name="l00882"></a><span class="lineno">  882</span>         }</div>
+<div class="line"><a name="l00883"></a><span class="lineno">  883</span>       }</div>
+<div class="line"><a name="l00884"></a><span class="lineno">  884</span>       filter2d.mrf(input, output, dimX_opt[0], dimY_opt[0], beta, <span class="keyword">true</span>, down_opt[0], verbose_opt[0]);</div>
+<div class="line"><a name="l00885"></a><span class="lineno">  885</span>     }</div>
+<div class="line"><a name="l00886"></a><span class="lineno">  886</span>     <span class="keywordflow">else</span></div>
+<div class="line"><a name="l00887"></a><span class="lineno">  887</span>       filter2d.mrf(input, output, dimX_opt[0], dimY_opt[0], 1, <span class="keyword">true</span>, down_opt[0], verbose_opt[0]);</div>
+<div class="line"><a name="l00888"></a><span class="lineno">  888</span>       }</div>
+<div class="line"><a name="l00889"></a><span class="lineno">  889</span>       <span class="keywordflow">catch</span>(<span class="keywordtype">string</span> errorstring){</div>
+<div class="line"><a name="l00890"></a><span class="lineno">  890</span>     cerr << errorstring << endl;</div>
+<div class="line"><a name="l00891"></a><span class="lineno">  891</span>       }</div>
+<div class="line"><a name="l00892"></a><span class="lineno">  892</span>       <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l00893"></a><span class="lineno">  893</span>     }</div>
+<div class="line"><a name="l00894"></a><span class="lineno">  894</span>     <span class="keywordflow">case</span>(filter2d::sobelx):{<span class="comment">//Sobel edge detection in X</span></div>
+<div class="line"><a name="l00895"></a><span class="lineno">  895</span>       <span class="keywordflow">if</span>(down_opt[0]!=1){</div>
+<div class="line"><a name="l00896"></a><span class="lineno">  896</span>     std::cerr << <span class="stringliteral">"Error: down option not supported for sobel edge detection"</span> << std::endl;</div>
+<div class="line"><a name="l00897"></a><span class="lineno">  897</span>     exit(1);</div>
+<div class="line"><a name="l00898"></a><span class="lineno">  898</span>       }</div>
+<div class="line"><a name="l00899"></a><span class="lineno">  899</span>       <a class="code" href="classVector2d.html">Vector2d<double></a> theTaps(3,3);</div>
+<div class="line"><a name="l00900"></a><span class="lineno">  900</span>       theTaps[0][0]=-1.0;</div>
+<div class="line"><a name="l00901"></a><span class="lineno">  901</span>       theTaps[0][1]=0.0;</div>
+<div class="line"><a name="l00902"></a><span class="lineno">  902</span>       theTaps[0][2]=1.0;</div>
+<div class="line"><a name="l00903"></a><span class="lineno">  903</span>       theTaps[1][0]=-2.0;</div>
+<div class="line"><a name="l00904"></a><span class="lineno">  904</span>       theTaps[1][1]=0.0;</div>
+<div class="line"><a name="l00905"></a><span class="lineno">  905</span>       theTaps[1][2]=2.0;</div>
+<div class="line"><a name="l00906"></a><span class="lineno">  906</span>       theTaps[2][0]=-1.0;</div>
+<div class="line"><a name="l00907"></a><span class="lineno">  907</span>       theTaps[2][1]=0.0;</div>
+<div class="line"><a name="l00908"></a><span class="lineno">  908</span>       theTaps[2][2]=1.0;</div>
+<div class="line"><a name="l00909"></a><span class="lineno">  909</span>       filter2d.setTaps(theTaps);</div>
+<div class="line"><a name="l00910"></a><span class="lineno">  910</span>       <span class="keywordflow">try</span>{</div>
+<div class="line"><a name="l00911"></a><span class="lineno">  911</span>     filter2d.filter(input,output,<span class="keyword">true</span>,<span class="keyword">true</span>);<span class="comment">//absolute and normalize</span></div>
+<div class="line"><a name="l00912"></a><span class="lineno">  912</span>       }</div>
+<div class="line"><a name="l00913"></a><span class="lineno">  913</span>       <span class="keywordflow">catch</span>(<span class="keywordtype">string</span> errorstring){</div>
+<div class="line"><a name="l00914"></a><span class="lineno">  914</span>     cerr << errorstring << endl;</div>
+<div class="line"><a name="l00915"></a><span class="lineno">  915</span>       }</div>
+<div class="line"><a name="l00916"></a><span class="lineno">  916</span>       <span class="keywordflow">break</span>;</div>
 <div class="line"><a name="l00917"></a><span class="lineno">  917</span>     }</div>
-<div class="line"><a name="l00918"></a><span class="lineno">  918</span>       }</div>
-<div class="line"><a name="l00919"></a><span class="lineno">  919</span>       <span class="keywordflow">catch</span>(<span class="keywordtype">string</span> errorstring){</div>
-<div class="line"><a name="l00920"></a><span class="lineno">  920</span>     cerr << errorstring << endl;</div>
-<div class="line"><a name="l00921"></a><span class="lineno">  921</span>       }</div>
-<div class="line"><a name="l00922"></a><span class="lineno">  922</span>       <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l00923"></a><span class="lineno">  923</span>     }</div>
-<div class="line"><a name="l00924"></a><span class="lineno">  924</span>     <span class="keywordflow">case</span>(filter2d::dwt):</div>
-<div class="line"><a name="l00925"></a><span class="lineno">  925</span>       <span class="keywordflow">if</span>(down_opt[0]!=1){</div>
-<div class="line"><a name="l00926"></a><span class="lineno">  926</span>     std::cerr << <span class="stringliteral">"Error: down option not supported for this filter"</span> << std::endl;</div>
-<div class="line"><a name="l00927"></a><span class="lineno">  927</span>     exit(1);</div>
-<div class="line"><a name="l00928"></a><span class="lineno">  928</span>       }</div>
-<div class="line"><a name="l00929"></a><span class="lineno">  929</span>       <span class="keywordflow">try</span>{</div>
-<div class="line"><a name="l00930"></a><span class="lineno">  930</span>     <span class="keywordflow">if</span>(dimZ_opt.size()){</div>
-<div class="line"><a name="l00931"></a><span class="lineno">  931</span>       <span class="keywordflow">if</span>(verbose_opt[0])</div>
-<div class="line"><a name="l00932"></a><span class="lineno">  932</span>         std::cout<< <span class="stringliteral">"DWT in spectral domain"</span> << std::endl;</div>
-<div class="line"><a name="l00933"></a><span class="lineno">  933</span>       filter1d.dwtForward(input, output, wavelet_type_opt[0], family_opt[0]);</div>
-<div class="line"><a name="l00934"></a><span class="lineno">  934</span>     }</div>
-<div class="line"><a name="l00935"></a><span class="lineno">  935</span>     <span class="keywordflow">else</span></div>
-<div class="line"><a name="l00936"></a><span class="lineno">  936</span>       filter2d.dwtForward(input, output, wavelet_type_opt[0], family_opt[0]);</div>
-<div class="line"><a name="l00937"></a><span class="lineno">  937</span>       }</div>
-<div class="line"><a name="l00938"></a><span class="lineno">  938</span>       <span class="keywordflow">catch</span>(<span class="keywordtype">string</span> errorstring){</div>
-<div class="line"><a name="l00939"></a><span class="lineno">  939</span>     cerr << errorstring << endl;</div>
-<div class="line"><a name="l00940"></a><span class="lineno">  940</span>       }</div>
-<div class="line"><a name="l00941"></a><span class="lineno">  941</span>       <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l00942"></a><span class="lineno">  942</span>     <span class="keywordflow">case</span>(filter2d::dwti):</div>
+<div class="line"><a name="l00918"></a><span class="lineno">  918</span>     <span class="keywordflow">case</span>(filter2d::sobely):{<span class="comment">//Sobel edge detection in Y</span></div>
+<div class="line"><a name="l00919"></a><span class="lineno">  919</span>       <span class="keywordflow">if</span>(down_opt[0]!=1){</div>
+<div class="line"><a name="l00920"></a><span class="lineno">  920</span>     std::cerr << <span class="stringliteral">"Error: down option not supported for sobel edge detection"</span> << std::endl;</div>
+<div class="line"><a name="l00921"></a><span class="lineno">  921</span>     exit(1);</div>
+<div class="line"><a name="l00922"></a><span class="lineno">  922</span>       }</div>
+<div class="line"><a name="l00923"></a><span class="lineno">  923</span>       <a class="code" href="classVector2d.html">Vector2d<double></a> theTaps(3,3);</div>
+<div class="line"><a name="l00924"></a><span class="lineno">  924</span>       theTaps[0][0]=1.0;</div>
+<div class="line"><a name="l00925"></a><span class="lineno">  925</span>       theTaps[0][1]=2.0;</div>
+<div class="line"><a name="l00926"></a><span class="lineno">  926</span>       theTaps[0][2]=1.0;</div>
+<div class="line"><a name="l00927"></a><span class="lineno">  927</span>       theTaps[1][0]=0.0;</div>
+<div class="line"><a name="l00928"></a><span class="lineno">  928</span>       theTaps[1][1]=0.0;</div>
+<div class="line"><a name="l00929"></a><span class="lineno">  929</span>       theTaps[1][2]=0.0;</div>
+<div class="line"><a name="l00930"></a><span class="lineno">  930</span>       theTaps[2][0]=-1.0;</div>
+<div class="line"><a name="l00931"></a><span class="lineno">  931</span>       theTaps[2][1]=-2.0;</div>
+<div class="line"><a name="l00932"></a><span class="lineno">  932</span>       theTaps[2][2]=-1.0;</div>
+<div class="line"><a name="l00933"></a><span class="lineno">  933</span>       filter2d.setTaps(theTaps);</div>
+<div class="line"><a name="l00934"></a><span class="lineno">  934</span>       <span class="keywordflow">try</span>{</div>
+<div class="line"><a name="l00935"></a><span class="lineno">  935</span>     filter2d.filter(input,output,<span class="keyword">true</span>,<span class="keyword">true</span>);<span class="comment">//absolute and normalize</span></div>
+<div class="line"><a name="l00936"></a><span class="lineno">  936</span>       }</div>
+<div class="line"><a name="l00937"></a><span class="lineno">  937</span>       <span class="keywordflow">catch</span>(<span class="keywordtype">string</span> errorstring){</div>
+<div class="line"><a name="l00938"></a><span class="lineno">  938</span>     cerr << errorstring << endl;</div>
+<div class="line"><a name="l00939"></a><span class="lineno">  939</span>       }</div>
+<div class="line"><a name="l00940"></a><span class="lineno">  940</span>       <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l00941"></a><span class="lineno">  941</span>     }</div>
+<div class="line"><a name="l00942"></a><span class="lineno">  942</span>     <span class="keywordflow">case</span>(filter2d::sobelxy):{<span class="comment">//Sobel edge detection in XY</span></div>
 <div class="line"><a name="l00943"></a><span class="lineno">  943</span>       <span class="keywordflow">if</span>(down_opt[0]!=1){</div>
-<div class="line"><a name="l00944"></a><span class="lineno">  944</span>     std::cerr << <span class="stringliteral">"Error: down option not supported for this filter"</span> << std::endl;</div>
+<div class="line"><a name="l00944"></a><span class="lineno">  944</span>     std::cerr << <span class="stringliteral">"Error: down option not supported for sobel edge detection"</span> << std::endl;</div>
 <div class="line"><a name="l00945"></a><span class="lineno">  945</span>     exit(1);</div>
 <div class="line"><a name="l00946"></a><span class="lineno">  946</span>       }</div>
-<div class="line"><a name="l00947"></a><span class="lineno">  947</span>       <span class="keywordflow">try</span>{</div>
-<div class="line"><a name="l00948"></a><span class="lineno">  948</span>     <span class="keywordflow">if</span>(dimZ_opt.size()){</div>
-<div class="line"><a name="l00949"></a><span class="lineno">  949</span>       <span class="keywordflow">if</span>(verbose_opt[0])</div>
-<div class="line"><a name="l00950"></a><span class="lineno">  950</span>         std::cout<< <span class="stringliteral">"inverse DWT in spectral domain"</span> << std::endl;</div>
-<div class="line"><a name="l00951"></a><span class="lineno">  951</span>       filter1d.dwtInverse(input, output, wavelet_type_opt[0], family_opt[0]);</div>
-<div class="line"><a name="l00952"></a><span class="lineno">  952</span>     }</div>
-<div class="line"><a name="l00953"></a><span class="lineno">  953</span>     <span class="keywordflow">else</span></div>
-<div class="line"><a name="l00954"></a><span class="lineno">  954</span>       filter2d.dwtInverse(input, output, wavelet_type_opt[0], family_opt[0]);</div>
-<div class="line"><a name="l00955"></a><span class="lineno">  955</span>       }</div>
-<div class="line"><a name="l00956"></a><span class="lineno">  956</span>       <span class="keywordflow">catch</span>(<span class="keywordtype">string</span> errorstring){</div>
-<div class="line"><a name="l00957"></a><span class="lineno">  957</span>     cerr << errorstring << endl;</div>
-<div class="line"><a name="l00958"></a><span class="lineno">  958</span>       }</div>
-<div class="line"><a name="l00959"></a><span class="lineno">  959</span>       <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l00960"></a><span class="lineno">  960</span>     <span class="keywordflow">case</span>(filter2d::dwt_cut):</div>
-<div class="line"><a name="l00961"></a><span class="lineno">  961</span>       <span class="keywordflow">if</span>(down_opt[0]!=1){</div>
-<div class="line"><a name="l00962"></a><span class="lineno">  962</span>     std::cerr << <span class="stringliteral">"Error: down option not supported for this filter"</span> << std::endl;</div>
-<div class="line"><a name="l00963"></a><span class="lineno">  963</span>     exit(1);</div>
-<div class="line"><a name="l00964"></a><span class="lineno">  964</span>       }</div>
-<div class="line"><a name="l00965"></a><span class="lineno">  965</span>       <span class="keywordflow">if</span>(dimZ_opt.size()){</div>
-<div class="line"><a name="l00966"></a><span class="lineno">  966</span>         <span class="keywordflow">if</span>(verbose_opt[0])</div>
-<div class="line"><a name="l00967"></a><span class="lineno">  967</span>           std::cout<< <span class="stringliteral">"DWT approximation in spectral domain"</span> << std::endl;</div>
-<div class="line"><a name="l00968"></a><span class="lineno">  968</span>     filter1d.dwtCut(input, output, wavelet_type_opt[0], family_opt[0], threshold_opt[0]);</div>
-<div class="line"><a name="l00969"></a><span class="lineno">  969</span>       }</div>
-<div class="line"><a name="l00970"></a><span class="lineno">  970</span>       <span class="keywordflow">else</span></div>
-<div class="line"><a name="l00971"></a><span class="lineno">  971</span>     filter2d.dwtCut(input, output, wavelet_type_opt[0], family_opt[0], threshold_opt[0]);</div>
-<div class="line"><a name="l00972"></a><span class="lineno">  972</span>       <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l00973"></a><span class="lineno">  973</span>     <span class="keywordflow">case</span>(filter2d::dwt_cut_from):</div>
-<div class="line"><a name="l00974"></a><span class="lineno">  974</span>       <span class="keywordflow">if</span>(down_opt[0]!=1){</div>
-<div class="line"><a name="l00975"></a><span class="lineno">  975</span>     std::cerr << <span class="stringliteral">"Error: down option not supported for this filter"</span> << std::endl;</div>
-<div class="line"><a name="l00976"></a><span class="lineno">  976</span>     exit(1);</div>
-<div class="line"><a name="l00977"></a><span class="lineno">  977</span>       }</div>
-<div class="line"><a name="l00978"></a><span class="lineno">  978</span>       <span class="keywordflow">try</span>{</div>
-<div class="line"><a name="l00979"></a><span class="lineno">  979</span>     <span class="keywordflow">if</span>(dimZ_opt.size()){</div>
-<div class="line"><a name="l00980"></a><span class="lineno">  980</span>       <span class="keywordflow">if</span>(verbose_opt[0])</div>
-<div class="line"><a name="l00981"></a><span class="lineno">  981</span>         std::cout<< <span class="stringliteral">"DWT approximation in spectral domain"</span> << std::endl;</div>
-<div class="line"><a name="l00982"></a><span class="lineno">  982</span>       filter1d.dwtCutFrom(input, output, wavelet_type_opt[0], family_opt[0], static_cast<int>(threshold_opt[0]));</div>
-<div class="line"><a name="l00983"></a><span class="lineno">  983</span>     }</div>
-<div class="line"><a name="l00984"></a><span class="lineno">  984</span>     <span class="keywordflow">else</span>{</div>
-<div class="line"><a name="l00985"></a><span class="lineno">  985</span>       <span class="keywordtype">string</span> errorString=<span class="stringliteral">"Error: this filter is not supported in 2D"</span>;</div>
-<div class="line"><a name="l00986"></a><span class="lineno">  986</span>       <span class="keywordflow">throw</span>(errorString);</div>
-<div class="line"><a name="l00987"></a><span class="lineno">  987</span>     }</div>
-<div class="line"><a name="l00988"></a><span class="lineno">  988</span>       }</div>
-<div class="line"><a name="l00989"></a><span class="lineno">  989</span>       <span class="keywordflow">catch</span>(<span class="keywordtype">string</span> errorstring){</div>
-<div class="line"><a name="l00990"></a><span class="lineno">  990</span>     cerr << errorstring << endl;</div>
-<div class="line"><a name="l00991"></a><span class="lineno">  991</span>       }</div>
-<div class="line"><a name="l00992"></a><span class="lineno">  992</span>       <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l00993"></a><span class="lineno">  993</span>     <span class="keywordflow">case</span>(filter2d::savgolay):{</div>
-<div class="line"><a name="l00994"></a><span class="lineno">  994</span>       assert(savgolay_nl_opt.size());</div>
-<div class="line"><a name="l00995"></a><span class="lineno">  995</span>       assert(savgolay_nr_opt.size());</div>
-<div class="line"><a name="l00996"></a><span class="lineno">  996</span>       assert(savgolay_ld_opt.size());</div>
-<div class="line"><a name="l00997"></a><span class="lineno">  997</span>       assert(savgolay_m_opt.size());</div>
-<div class="line"><a name="l00998"></a><span class="lineno">  998</span>       <span class="keywordflow">if</span>(verbose_opt[0])</div>
-<div class="line"><a name="l00999"></a><span class="lineno">  999</span>         std::cout << <span class="stringliteral">"Calculating Savitzky-Golay coefficients: "</span> << endl;</div>
-<div class="line"><a name="l01000"></a><span class="lineno"> 1000</span>       filter1d.getSavGolayCoefficients(tapz_opt, input.nrOfBand(), savgolay_nl_opt[0], savgolay_nr_opt[0], savgolay_ld_opt[0], savgolay_m_opt[0]);</div>
-<div class="line"><a name="l01001"></a><span class="lineno"> 1001</span>       <span class="keywordflow">if</span>(verbose_opt[0]){</div>
-<div class="line"><a name="l01002"></a><span class="lineno"> 1002</span>         std::cout << <span class="stringliteral">"taps (size is "</span> << tapz_opt.size() << <span class="stringliteral">"): "</span>;</div>
-<div class="line"><a name="l01003"></a><span class="lineno"> 1003</span>         <span class="keywordflow">for</span>(<span class="keywordtype">int</span> itap=0;itap<tapz_opt.size();++itap)</div>
-<div class="line"><a name="l01004"></a><span class="lineno"> 1004</span>           std::cout<< tapz_opt[itap] << <span class="stringliteral">" "</span>;</div>
-<div class="line"><a name="l01005"></a><span class="lineno"> 1005</span>         std::cout<< std::endl;</div>
-<div class="line"><a name="l01006"></a><span class="lineno"> 1006</span>       }</div>
-<div class="line"><a name="l01007"></a><span class="lineno"> 1007</span>       filter1d.setTaps(tapz_opt);</div>
-<div class="line"><a name="l01008"></a><span class="lineno"> 1008</span>       filter1d.filter(input,output);</div>
-<div class="line"><a name="l01009"></a><span class="lineno"> 1009</span>       <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l01010"></a><span class="lineno"> 1010</span>     }</div>
-<div class="line"><a name="l01011"></a><span class="lineno"> 1011</span>     <span class="keywordflow">case</span>(filter2d::percentile):<span class="comment">//deliberate fall through</span></div>
-<div class="line"><a name="l01012"></a><span class="lineno"> 1012</span>     <span class="keywordflow">case</span>(filter2d::threshold):<span class="comment">//deliberate fall through</span></div>
-<div class="line"><a name="l01013"></a><span class="lineno"> 1013</span>       assert(threshold_opt.size());</div>
-<div class="line"><a name="l01014"></a><span class="lineno"> 1014</span>       <span class="keywordflow">if</span>(dimZ_opt.size())</div>
-<div class="line"><a name="l01015"></a><span class="lineno"> 1015</span>     filter1d.setThresholds(threshold_opt);</div>
-<div class="line"><a name="l01016"></a><span class="lineno"> 1016</span>       <span class="keywordflow">else</span></div>
-<div class="line"><a name="l01017"></a><span class="lineno"> 1017</span>     filter2d.setThresholds(threshold_opt);</div>
-<div class="line"><a name="l01018"></a><span class="lineno"> 1018</span>     <span class="keywordflow">case</span>(filter2d::density):<span class="comment">//deliberate fall through</span></div>
-<div class="line"><a name="l01019"></a><span class="lineno"> 1019</span>       filter2d.setClasses(class_opt);</div>
-<div class="line"><a name="l01020"></a><span class="lineno"> 1020</span>       <span class="keywordflow">if</span>(verbose_opt[0])</div>
-<div class="line"><a name="l01021"></a><span class="lineno"> 1021</span>     std::cout << <span class="stringliteral">"classes set"</span> << std::endl;</div>
-<div class="line"><a name="l01022"></a><span class="lineno"> 1022</span>     <span class="keywordflow">default</span>:</div>
-<div class="line"><a name="l01023"></a><span class="lineno"> 1023</span>       <span class="keywordflow">try</span>{</div>
-<div class="line"><a name="l01024"></a><span class="lineno"> 1024</span>     <span class="keywordflow">if</span>(dimZ_opt.size()){</div>
-<div class="line"><a name="l01025"></a><span class="lineno"> 1025</span>       <span class="keywordflow">if</span>(dimZ_opt[0]==1)</div>
-<div class="line"><a name="l01026"></a><span class="lineno"> 1026</span>         filter1d.stat(input,output,method_opt[0]);</div>
-<div class="line"><a name="l01027"></a><span class="lineno"> 1027</span>       <span class="keywordflow">else</span>{</div>
-<div class="line"><a name="l01028"></a><span class="lineno"> 1028</span>         assert(down_opt[0]==1);<span class="comment">//not implemented yet...</span></div>
-<div class="line"><a name="l01029"></a><span class="lineno"> 1029</span>         filter1d.filter(input,output,method_opt[0],dimZ_opt[0]);</div>
-<div class="line"><a name="l01030"></a><span class="lineno"> 1030</span>       }</div>
+<div class="line"><a name="l00947"></a><span class="lineno">  947</span>       <a class="code" href="classVector2d.html">Vector2d<double></a> theTaps(3,3);</div>
+<div class="line"><a name="l00948"></a><span class="lineno">  948</span>       theTaps[0][0]=0.0;</div>
+<div class="line"><a name="l00949"></a><span class="lineno">  949</span>       theTaps[0][1]=1.0;</div>
+<div class="line"><a name="l00950"></a><span class="lineno">  950</span>       theTaps[0][2]=2.0;</div>
+<div class="line"><a name="l00951"></a><span class="lineno">  951</span>       theTaps[1][0]=-1.0;</div>
+<div class="line"><a name="l00952"></a><span class="lineno">  952</span>       theTaps[1][1]=0.0;</div>
+<div class="line"><a name="l00953"></a><span class="lineno">  953</span>       theTaps[1][2]=1.0;</div>
+<div class="line"><a name="l00954"></a><span class="lineno">  954</span>       theTaps[2][0]=-2.0;</div>
+<div class="line"><a name="l00955"></a><span class="lineno">  955</span>       theTaps[2][1]=-1.0;</div>
+<div class="line"><a name="l00956"></a><span class="lineno">  956</span>       theTaps[2][2]=0.0;</div>
+<div class="line"><a name="l00957"></a><span class="lineno">  957</span>       filter2d.setTaps(theTaps);</div>
+<div class="line"><a name="l00958"></a><span class="lineno">  958</span>       <span class="keywordflow">try</span>{</div>
+<div class="line"><a name="l00959"></a><span class="lineno">  959</span>     filter2d.filter(input,output,<span class="keyword">true</span>,<span class="keyword">true</span>);<span class="comment">//absolute and normalize</span></div>
+<div class="line"><a name="l00960"></a><span class="lineno">  960</span>       }</div>
+<div class="line"><a name="l00961"></a><span class="lineno">  961</span>       <span class="keywordflow">catch</span>(<span class="keywordtype">string</span> errorstring){</div>
+<div class="line"><a name="l00962"></a><span class="lineno">  962</span>     cerr << errorstring << endl;</div>
+<div class="line"><a name="l00963"></a><span class="lineno">  963</span>       }</div>
+<div class="line"><a name="l00964"></a><span class="lineno">  964</span>       <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l00965"></a><span class="lineno">  965</span>     }</div>
+<div class="line"><a name="l00966"></a><span class="lineno">  966</span>     <span class="keywordflow">case</span>(filter2d::sobelyx):{<span class="comment">//Sobel edge detection in XY</span></div>
+<div class="line"><a name="l00967"></a><span class="lineno">  967</span>       <span class="keywordflow">if</span>(down_opt[0]!=1){</div>
+<div class="line"><a name="l00968"></a><span class="lineno">  968</span>     std::cerr << <span class="stringliteral">"Error: down option not supported for sobel edge detection"</span> << std::endl;</div>
+<div class="line"><a name="l00969"></a><span class="lineno">  969</span>     exit(1);</div>
+<div class="line"><a name="l00970"></a><span class="lineno">  970</span>       }</div>
+<div class="line"><a name="l00971"></a><span class="lineno">  971</span>       <a class="code" href="classVector2d.html">Vector2d<double></a> theTaps(3,3);</div>
+<div class="line"><a name="l00972"></a><span class="lineno">  972</span>       theTaps[0][0]=2.0;</div>
+<div class="line"><a name="l00973"></a><span class="lineno">  973</span>       theTaps[0][1]=1.0;</div>
+<div class="line"><a name="l00974"></a><span class="lineno">  974</span>       theTaps[0][2]=0.0;</div>
+<div class="line"><a name="l00975"></a><span class="lineno">  975</span>       theTaps[1][0]=1.0;</div>
+<div class="line"><a name="l00976"></a><span class="lineno">  976</span>       theTaps[1][1]=0.0;</div>
+<div class="line"><a name="l00977"></a><span class="lineno">  977</span>       theTaps[1][2]=-1.0;</div>
+<div class="line"><a name="l00978"></a><span class="lineno">  978</span>       theTaps[2][0]=0.0;</div>
+<div class="line"><a name="l00979"></a><span class="lineno">  979</span>       theTaps[2][1]=-1.0;</div>
+<div class="line"><a name="l00980"></a><span class="lineno">  980</span>       theTaps[2][2]=-2.0;</div>
+<div class="line"><a name="l00981"></a><span class="lineno">  981</span>       filter2d.setTaps(theTaps);</div>
+<div class="line"><a name="l00982"></a><span class="lineno">  982</span>       <span class="keywordflow">try</span>{</div>
+<div class="line"><a name="l00983"></a><span class="lineno">  983</span>     filter2d.filter(input,output,<span class="keyword">true</span>,<span class="keyword">true</span>);<span class="comment">//absolute and normalize</span></div>
+<div class="line"><a name="l00984"></a><span class="lineno">  984</span>       }</div>
+<div class="line"><a name="l00985"></a><span class="lineno">  985</span>       <span class="keywordflow">catch</span>(<span class="keywordtype">string</span> errorstring){</div>
+<div class="line"><a name="l00986"></a><span class="lineno">  986</span>     cerr << errorstring << endl;</div>
+<div class="line"><a name="l00987"></a><span class="lineno">  987</span>       }</div>
+<div class="line"><a name="l00988"></a><span class="lineno">  988</span>       <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l00989"></a><span class="lineno">  989</span>     }</div>
+<div class="line"><a name="l00990"></a><span class="lineno">  990</span>     <span class="keywordflow">case</span>(filter2d::smooth):{<span class="comment">//Smoothing filter</span></div>
+<div class="line"><a name="l00991"></a><span class="lineno">  991</span>       <span class="keywordflow">if</span>(down_opt[0]!=1){</div>
+<div class="line"><a name="l00992"></a><span class="lineno">  992</span>     std::cerr << <span class="stringliteral">"Error: down option not supported for this filter"</span> << std::endl;</div>
+<div class="line"><a name="l00993"></a><span class="lineno">  993</span>     exit(1);</div>
+<div class="line"><a name="l00994"></a><span class="lineno">  994</span>       }</div>
+<div class="line"><a name="l00995"></a><span class="lineno">  995</span>       <span class="keywordflow">try</span>{</div>
+<div class="line"><a name="l00996"></a><span class="lineno">  996</span>     <span class="keywordflow">if</span>(dimZ_opt.size()){</div>
+<div class="line"><a name="l00997"></a><span class="lineno">  997</span>       <span class="keywordflow">if</span>(verbose_opt[0])</div>
+<div class="line"><a name="l00998"></a><span class="lineno">  998</span>         std::cout<< <span class="stringliteral">"1-D filtering: smooth"</span> << std::endl;</div>
+<div class="line"><a name="l00999"></a><span class="lineno">  999</span>       filter1d.smooth(input,output,dimZ_opt[0]);</div>
+<div class="line"><a name="l01000"></a><span class="lineno"> 1000</span>     }</div>
+<div class="line"><a name="l01001"></a><span class="lineno"> 1001</span>     <span class="keywordflow">else</span>{</div>
+<div class="line"><a name="l01002"></a><span class="lineno"> 1002</span>       filter2d.smooth(input,output,dimX_opt[0],dimY_opt[0]);</div>
+<div class="line"><a name="l01003"></a><span class="lineno"> 1003</span>     }</div>
+<div class="line"><a name="l01004"></a><span class="lineno"> 1004</span>       }</div>
+<div class="line"><a name="l01005"></a><span class="lineno"> 1005</span>       <span class="keywordflow">catch</span>(<span class="keywordtype">string</span> errorstring){</div>
+<div class="line"><a name="l01006"></a><span class="lineno"> 1006</span>     cerr << errorstring << endl;</div>
+<div class="line"><a name="l01007"></a><span class="lineno"> 1007</span>       }</div>
+<div class="line"><a name="l01008"></a><span class="lineno"> 1008</span>       <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l01009"></a><span class="lineno"> 1009</span>     }</div>
+<div class="line"><a name="l01010"></a><span class="lineno"> 1010</span>     <span class="keywordflow">case</span>(filter2d::smoothnodata):{<span class="comment">//Smoothing filter</span></div>
+<div class="line"><a name="l01011"></a><span class="lineno"> 1011</span>       <span class="keywordflow">if</span>(down_opt[0]!=1){</div>
+<div class="line"><a name="l01012"></a><span class="lineno"> 1012</span>     std::cerr << <span class="stringliteral">"Error: down option not supported for this filter"</span> << std::endl;</div>
+<div class="line"><a name="l01013"></a><span class="lineno"> 1013</span>     exit(1);</div>
+<div class="line"><a name="l01014"></a><span class="lineno"> 1014</span>       }</div>
+<div class="line"><a name="l01015"></a><span class="lineno"> 1015</span>       <span class="keywordflow">try</span>{</div>
+<div class="line"><a name="l01016"></a><span class="lineno"> 1016</span>     <span class="keywordflow">if</span>(dimZ_opt.size()){</div>
+<div class="line"><a name="l01017"></a><span class="lineno"> 1017</span>       <span class="keywordflow">if</span>(verbose_opt[0])</div>
+<div class="line"><a name="l01018"></a><span class="lineno"> 1018</span>         std::cout<< <span class="stringliteral">"1-D filtering: smooth"</span> << std::endl;</div>
+<div class="line"><a name="l01019"></a><span class="lineno"> 1019</span>       filter1d.smoothNoData(input,interpolationType_opt[0],output);</div>
+<div class="line"><a name="l01020"></a><span class="lineno"> 1020</span>     }</div>
+<div class="line"><a name="l01021"></a><span class="lineno"> 1021</span>     <span class="keywordflow">else</span>{</div>
+<div class="line"><a name="l01022"></a><span class="lineno"> 1022</span>       <span class="keywordflow">if</span>(verbose_opt[0])</div>
+<div class="line"><a name="l01023"></a><span class="lineno"> 1023</span>         std::cout<< <span class="stringliteral">"2-D filtering: smooth"</span> << std::endl;</div>
+<div class="line"><a name="l01024"></a><span class="lineno"> 1024</span>       filter2d.smoothNoData(input,output,dimX_opt[0],dimY_opt[0]);</div>
+<div class="line"><a name="l01025"></a><span class="lineno"> 1025</span>     }</div>
+<div class="line"><a name="l01026"></a><span class="lineno"> 1026</span>       }</div>
+<div class="line"><a name="l01027"></a><span class="lineno"> 1027</span>       <span class="keywordflow">catch</span>(<span class="keywordtype">string</span> errorstring){</div>
+<div class="line"><a name="l01028"></a><span class="lineno"> 1028</span>     cerr << errorstring << endl;</div>
+<div class="line"><a name="l01029"></a><span class="lineno"> 1029</span>       }</div>
+<div class="line"><a name="l01030"></a><span class="lineno"> 1030</span>       <span class="keywordflow">break</span>;</div>
 <div class="line"><a name="l01031"></a><span class="lineno"> 1031</span>     }</div>
-<div class="line"><a name="l01032"></a><span class="lineno"> 1032</span>     <span class="keywordflow">else</span></div>
-<div class="line"><a name="l01033"></a><span class="lineno"> 1033</span>       filter2d.doit(input,output,method_opt[0],dimX_opt[0],dimY_opt[0],down_opt[0],disc_opt[0]);</div>
-<div class="line"><a name="l01034"></a><span class="lineno"> 1034</span>       }</div>
-<div class="line"><a name="l01035"></a><span class="lineno"> 1035</span>       <span class="keywordflow">catch</span>(<span class="keywordtype">string</span> errorstring){</div>
-<div class="line"><a name="l01036"></a><span class="lineno"> 1036</span>     cerr << errorstring << endl;</div>
-<div class="line"><a name="l01037"></a><span class="lineno"> 1037</span>       }</div>
-<div class="line"><a name="l01038"></a><span class="lineno"> 1038</span>       <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l01039"></a><span class="lineno"> 1039</span>     }</div>
-<div class="line"><a name="l01040"></a><span class="lineno"> 1040</span>   }</div>
-<div class="line"><a name="l01041"></a><span class="lineno"> 1041</span>   input.close();</div>
-<div class="line"><a name="l01042"></a><span class="lineno"> 1042</span>   output.close();</div>
-<div class="line"><a name="l01043"></a><span class="lineno"> 1043</span>   <span class="keywordflow">return</span> 0;</div>
-<div class="line"><a name="l01044"></a><span class="lineno"> 1044</span> }</div>
+<div class="line"><a name="l01032"></a><span class="lineno"> 1032</span>     <span class="keywordflow">case</span>(filter2d::dwt):</div>
+<div class="line"><a name="l01033"></a><span class="lineno"> 1033</span>       <span class="keywordflow">if</span>(down_opt[0]!=1){</div>
+<div class="line"><a name="l01034"></a><span class="lineno"> 1034</span>     std::cerr << <span class="stringliteral">"Error: down option not supported for this filter"</span> << std::endl;</div>
+<div class="line"><a name="l01035"></a><span class="lineno"> 1035</span>     exit(1);</div>
+<div class="line"><a name="l01036"></a><span class="lineno"> 1036</span>       }</div>
+<div class="line"><a name="l01037"></a><span class="lineno"> 1037</span>       <span class="keywordflow">try</span>{</div>
+<div class="line"><a name="l01038"></a><span class="lineno"> 1038</span>     <span class="keywordflow">if</span>(dimZ_opt.size()){</div>
+<div class="line"><a name="l01039"></a><span class="lineno"> 1039</span>       <span class="keywordflow">if</span>(verbose_opt[0])</div>
+<div class="line"><a name="l01040"></a><span class="lineno"> 1040</span>         std::cout<< <span class="stringliteral">"DWT in spectral domain"</span> << std::endl;</div>
+<div class="line"><a name="l01041"></a><span class="lineno"> 1041</span>       filter1d.dwtForward(input, output, wavelet_type_opt[0], family_opt[0]);</div>
+<div class="line"><a name="l01042"></a><span class="lineno"> 1042</span>     }</div>
+<div class="line"><a name="l01043"></a><span class="lineno"> 1043</span>     <span class="keywordflow">else</span></div>
+<div class="line"><a name="l01044"></a><span class="lineno"> 1044</span>       filter2d.dwtForward(input, output, wavelet_type_opt[0], family_opt[0]);</div>
+<div class="line"><a name="l01045"></a><span class="lineno"> 1045</span>       }</div>
+<div class="line"><a name="l01046"></a><span class="lineno"> 1046</span>       <span class="keywordflow">catch</span>(<span class="keywordtype">string</span> errorstring){</div>
+<div class="line"><a name="l01047"></a><span class="lineno"> 1047</span>     cerr << errorstring << endl;</div>
+<div class="line"><a name="l01048"></a><span class="lineno"> 1048</span>       }</div>
+<div class="line"><a name="l01049"></a><span class="lineno"> 1049</span>       <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l01050"></a><span class="lineno"> 1050</span>     <span class="keywordflow">case</span>(filter2d::dwti):</div>
+<div class="line"><a name="l01051"></a><span class="lineno"> 1051</span>       <span class="keywordflow">if</span>(down_opt[0]!=1){</div>
+<div class="line"><a name="l01052"></a><span class="lineno"> 1052</span>     std::cerr << <span class="stringliteral">"Error: down option not supported for this filter"</span> << std::endl;</div>
+<div class="line"><a name="l01053"></a><span class="lineno"> 1053</span>     exit(1);</div>
+<div class="line"><a name="l01054"></a><span class="lineno"> 1054</span>       }</div>
+<div class="line"><a name="l01055"></a><span class="lineno"> 1055</span>       <span class="keywordflow">try</span>{</div>
+<div class="line"><a name="l01056"></a><span class="lineno"> 1056</span>     <span class="keywordflow">if</span>(dimZ_opt.size()){</div>
+<div class="line"><a name="l01057"></a><span class="lineno"> 1057</span>       <span class="keywordflow">if</span>(verbose_opt[0])</div>
+<div class="line"><a name="l01058"></a><span class="lineno"> 1058</span>         std::cout<< <span class="stringliteral">"inverse DWT in spectral domain"</span> << std::endl;</div>
+<div class="line"><a name="l01059"></a><span class="lineno"> 1059</span>       filter1d.dwtInverse(input, output, wavelet_type_opt[0], family_opt[0]);</div>
+<div class="line"><a name="l01060"></a><span class="lineno"> 1060</span>     }</div>
+<div class="line"><a name="l01061"></a><span class="lineno"> 1061</span>     <span class="keywordflow">else</span></div>
+<div class="line"><a name="l01062"></a><span class="lineno"> 1062</span>       filter2d.dwtInverse(input, output, wavelet_type_opt[0], family_opt[0]);</div>
+<div class="line"><a name="l01063"></a><span class="lineno"> 1063</span>       }</div>
+<div class="line"><a name="l01064"></a><span class="lineno"> 1064</span>       <span class="keywordflow">catch</span>(<span class="keywordtype">string</span> errorstring){</div>
+<div class="line"><a name="l01065"></a><span class="lineno"> 1065</span>     cerr << errorstring << endl;</div>
+<div class="line"><a name="l01066"></a><span class="lineno"> 1066</span>       }</div>
+<div class="line"><a name="l01067"></a><span class="lineno"> 1067</span>       <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l01068"></a><span class="lineno"> 1068</span>     <span class="keywordflow">case</span>(filter2d::dwt_cut):</div>
+<div class="line"><a name="l01069"></a><span class="lineno"> 1069</span>       <span class="keywordflow">if</span>(down_opt[0]!=1){</div>
+<div class="line"><a name="l01070"></a><span class="lineno"> 1070</span>     std::cerr << <span class="stringliteral">"Error: down option not supported for this filter"</span> << std::endl;</div>
+<div class="line"><a name="l01071"></a><span class="lineno"> 1071</span>     exit(1);</div>
+<div class="line"><a name="l01072"></a><span class="lineno"> 1072</span>       }</div>
+<div class="line"><a name="l01073"></a><span class="lineno"> 1073</span>       <span class="keywordflow">if</span>(dimZ_opt.size()){</div>
+<div class="line"><a name="l01074"></a><span class="lineno"> 1074</span>         <span class="keywordflow">if</span>(verbose_opt[0])</div>
+<div class="line"><a name="l01075"></a><span class="lineno"> 1075</span>           std::cout<< <span class="stringliteral">"DWT approximation in spectral domain"</span> << std::endl;</div>
+<div class="line"><a name="l01076"></a><span class="lineno"> 1076</span>     filter1d.dwtCut(input, output, wavelet_type_opt[0], family_opt[0], threshold_opt[0]);</div>
+<div class="line"><a name="l01077"></a><span class="lineno"> 1077</span>       }</div>
+<div class="line"><a name="l01078"></a><span class="lineno"> 1078</span>       <span class="keywordflow">else</span></div>
+<div class="line"><a name="l01079"></a><span class="lineno"> 1079</span>     filter2d.dwtCut(input, output, wavelet_type_opt[0], family_opt[0], threshold_opt[0]);</div>
+<div class="line"><a name="l01080"></a><span class="lineno"> 1080</span>       <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l01081"></a><span class="lineno"> 1081</span>     <span class="keywordflow">case</span>(filter2d::dwt_cut_from):</div>
+<div class="line"><a name="l01082"></a><span class="lineno"> 1082</span>       <span class="keywordflow">if</span>(down_opt[0]!=1){</div>
+<div class="line"><a name="l01083"></a><span class="lineno"> 1083</span>     std::cerr << <span class="stringliteral">"Error: down option not supported for this filter"</span> << std::endl;</div>
+<div class="line"><a name="l01084"></a><span class="lineno"> 1084</span>     exit(1);</div>
+<div class="line"><a name="l01085"></a><span class="lineno"> 1085</span>       }</div>
+<div class="line"><a name="l01086"></a><span class="lineno"> 1086</span>       <span class="keywordflow">try</span>{</div>
+<div class="line"><a name="l01087"></a><span class="lineno"> 1087</span>     <span class="keywordflow">if</span>(dimZ_opt.size()){</div>
+<div class="line"><a name="l01088"></a><span class="lineno"> 1088</span>       <span class="keywordflow">if</span>(verbose_opt[0])</div>
+<div class="line"><a name="l01089"></a><span class="lineno"> 1089</span>         std::cout<< <span class="stringliteral">"DWT approximation in spectral domain"</span> << std::endl;</div>
+<div class="line"><a name="l01090"></a><span class="lineno"> 1090</span>       filter1d.dwtCutFrom(input, output, wavelet_type_opt[0], family_opt[0], static_cast<int>(threshold_opt[0]));</div>
+<div class="line"><a name="l01091"></a><span class="lineno"> 1091</span>     }</div>
+<div class="line"><a name="l01092"></a><span class="lineno"> 1092</span>     <span class="keywordflow">else</span>{</div>
+<div class="line"><a name="l01093"></a><span class="lineno"> 1093</span>       <span class="keywordtype">string</span> errorString=<span class="stringliteral">"Error: this filter is not supported in 2D"</span>;</div>
+<div class="line"><a name="l01094"></a><span class="lineno"> 1094</span>       <span class="keywordflow">throw</span>(errorString);</div>
+<div class="line"><a name="l01095"></a><span class="lineno"> 1095</span>     }</div>
+<div class="line"><a name="l01096"></a><span class="lineno"> 1096</span>       }</div>
+<div class="line"><a name="l01097"></a><span class="lineno"> 1097</span>       <span class="keywordflow">catch</span>(<span class="keywordtype">string</span> errorstring){</div>
+<div class="line"><a name="l01098"></a><span class="lineno"> 1098</span>     cerr << errorstring << endl;</div>
+<div class="line"><a name="l01099"></a><span class="lineno"> 1099</span>       }</div>
+<div class="line"><a name="l01100"></a><span class="lineno"> 1100</span>       <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l01101"></a><span class="lineno"> 1101</span>     <span class="keywordflow">case</span>(filter2d::savgolay):{</div>
+<div class="line"><a name="l01102"></a><span class="lineno"> 1102</span>       assert(savgolay_nl_opt.size());</div>
+<div class="line"><a name="l01103"></a><span class="lineno"> 1103</span>       assert(savgolay_nr_opt.size());</div>
+<div class="line"><a name="l01104"></a><span class="lineno"> 1104</span>       assert(savgolay_ld_opt.size());</div>
+<div class="line"><a name="l01105"></a><span class="lineno"> 1105</span>       assert(savgolay_m_opt.size());</div>
+<div class="line"><a name="l01106"></a><span class="lineno"> 1106</span>       <span class="keywordflow">if</span>(verbose_opt[0])</div>
+<div class="line"><a name="l01107"></a><span class="lineno"> 1107</span>         std::cout << <span class="stringliteral">"Calculating Savitzky-Golay coefficients: "</span> << endl;</div>
+<div class="line"><a name="l01108"></a><span class="lineno"> 1108</span>       filter1d.getSavGolayCoefficients(tapz_opt, input.nrOfBand(), savgolay_nl_opt[0], savgolay_nr_opt[0], savgolay_ld_opt[0], savgolay_m_opt[0]);</div>
+<div class="line"><a name="l01109"></a><span class="lineno"> 1109</span>       <span class="keywordflow">if</span>(verbose_opt[0]){</div>
+<div class="line"><a name="l01110"></a><span class="lineno"> 1110</span>         std::cout << <span class="stringliteral">"taps (size is "</span> << tapz_opt.size() << <span class="stringliteral">"): "</span>;</div>
+<div class="line"><a name="l01111"></a><span class="lineno"> 1111</span>         <span class="keywordflow">for</span>(<span class="keywordtype">int</span> itap=0;itap<tapz_opt.size();++itap)</div>
+<div class="line"><a name="l01112"></a><span class="lineno"> 1112</span>           std::cout<< tapz_opt[itap] << <span class="stringliteral">" "</span>;</div>
+<div class="line"><a name="l01113"></a><span class="lineno"> 1113</span>         std::cout<< std::endl;</div>
+<div class="line"><a name="l01114"></a><span class="lineno"> 1114</span>       }</div>
+<div class="line"><a name="l01115"></a><span class="lineno"> 1115</span>       filter1d.setTaps(tapz_opt);</div>
+<div class="line"><a name="l01116"></a><span class="lineno"> 1116</span>       filter1d.filter(input,output);</div>
+<div class="line"><a name="l01117"></a><span class="lineno"> 1117</span>       <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l01118"></a><span class="lineno"> 1118</span>     }</div>
+<div class="line"><a name="l01119"></a><span class="lineno"> 1119</span>     <span class="keywordflow">case</span>(filter2d::percentile):<span class="comment">//deliberate fall through</span></div>
+<div class="line"><a name="l01120"></a><span class="lineno"> 1120</span>     <span class="keywordflow">case</span>(filter2d::threshold):<span class="comment">//deliberate fall through</span></div>
+<div class="line"><a name="l01121"></a><span class="lineno"> 1121</span>       assert(threshold_opt.size());</div>
+<div class="line"><a name="l01122"></a><span class="lineno"> 1122</span>       <span class="keywordflow">if</span>(dimZ_opt.size())</div>
+<div class="line"><a name="l01123"></a><span class="lineno"> 1123</span>     filter1d.setThresholds(threshold_opt);</div>
+<div class="line"><a name="l01124"></a><span class="lineno"> 1124</span>       <span class="keywordflow">else</span></div>
+<div class="line"><a name="l01125"></a><span class="lineno"> 1125</span>     filter2d.setThresholds(threshold_opt);</div>
+<div class="line"><a name="l01126"></a><span class="lineno"> 1126</span>     <span class="keywordflow">case</span>(filter2d::density):<span class="comment">//deliberate fall through</span></div>
+<div class="line"><a name="l01127"></a><span class="lineno"> 1127</span>       filter2d.setClasses(class_opt);</div>
+<div class="line"><a name="l01128"></a><span class="lineno"> 1128</span>       <span class="keywordflow">if</span>(verbose_opt[0])</div>
+<div class="line"><a name="l01129"></a><span class="lineno"> 1129</span>     std::cout << <span class="stringliteral">"classes set"</span> << std::endl;</div>
+<div class="line"><a name="l01130"></a><span class="lineno"> 1130</span>     <span class="keywordflow">default</span>:</div>
+<div class="line"><a name="l01131"></a><span class="lineno"> 1131</span>       <span class="keywordflow">try</span>{</div>
+<div class="line"><a name="l01132"></a><span class="lineno"> 1132</span>     <span class="keywordflow">if</span>(dimZ_opt.size()){</div>
+<div class="line"><a name="l01133"></a><span class="lineno"> 1133</span>       <span class="keywordflow">if</span>(dimZ_opt[0]==1)</div>
+<div class="line"><a name="l01134"></a><span class="lineno"> 1134</span>         filter1d.stat(input,output,method_opt[0]);</div>
+<div class="line"><a name="l01135"></a><span class="lineno"> 1135</span>       <span class="keywordflow">else</span>{</div>
+<div class="line"><a name="l01136"></a><span class="lineno"> 1136</span>         assert(down_opt[0]==1);<span class="comment">//not implemented yet...</span></div>
+<div class="line"><a name="l01137"></a><span class="lineno"> 1137</span>         filter1d.filter(input,output,method_opt[0],dimZ_opt[0]);</div>
+<div class="line"><a name="l01138"></a><span class="lineno"> 1138</span>       }</div>
+<div class="line"><a name="l01139"></a><span class="lineno"> 1139</span>     }</div>
+<div class="line"><a name="l01140"></a><span class="lineno"> 1140</span>     <span class="keywordflow">else</span></div>
+<div class="line"><a name="l01141"></a><span class="lineno"> 1141</span>       filter2d.doit(input,output,method_opt[0],dimX_opt[0],dimY_opt[0],down_opt[0],disc_opt[0]);</div>
+<div class="line"><a name="l01142"></a><span class="lineno"> 1142</span>       }</div>
+<div class="line"><a name="l01143"></a><span class="lineno"> 1143</span>       <span class="keywordflow">catch</span>(<span class="keywordtype">string</span> errorstring){</div>
+<div class="line"><a name="l01144"></a><span class="lineno"> 1144</span>     cerr << errorstring << endl;</div>
+<div class="line"><a name="l01145"></a><span class="lineno"> 1145</span>       }</div>
+<div class="line"><a name="l01146"></a><span class="lineno"> 1146</span>       <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l01147"></a><span class="lineno"> 1147</span>     }</div>
+<div class="line"><a name="l01148"></a><span class="lineno"> 1148</span>   }</div>
+<div class="line"><a name="l01149"></a><span class="lineno"> 1149</span>   input.close();</div>
+<div class="line"><a name="l01150"></a><span class="lineno"> 1150</span>   output.close();</div>
+<div class="line"><a name="l01151"></a><span class="lineno"> 1151</span>   <span class="keywordflow">return</span> 0;</div>
+<div class="line"><a name="l01152"></a><span class="lineno"> 1152</span> }</div>
 <div class="ttc" id="classFileReaderAscii_html"><div class="ttname"><a href="classFileReaderAscii.html">FileReaderAscii</a></div><div class="ttdef"><b>Definition:</b> <a href="FileReaderAscii_8h_source.html#l00030">FileReaderAscii.h:30</a></div></div>
 <div class="ttc" id="classfilter_1_1Filter_html"><div class="ttname"><a href="classfilter_1_1Filter.html">filter::Filter</a></div><div class="ttdef"><b>Definition:</b> <a href="Filter_8h_source.html#l00040">Filter.h:40</a></div></div>
 <div class="ttc" id="classImgReaderGdal_html"><div class="ttname"><a href="classImgReaderGdal.html">ImgReaderGdal</a></div><div class="ttdef"><b>Definition:</b> <a href="ImgReaderGdal_8h_source.html#l00033">ImgReaderGdal.h:33</a></div></div>
@@ -1028,7 +1029,7 @@
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Jun 23 2015 17:09:36 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Tue Nov 3 2015 15:58:26 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/pkfilter__spatial_8py_source.html b/doc/html/pkfilter__spatial_8py_source.html
index d8b3c71..d51c916 100644
--- a/doc/html/pkfilter__spatial_8py_source.html
+++ b/doc/html/pkfilter__spatial_8py_source.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.3</span>
+    <span id="projectnumber">2.6.4</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -183,7 +183,7 @@
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Jun 23 2015 17:09:36 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Tue Nov 3 2015 15:58:26 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/pkfilter__spectral_8py_source.html b/doc/html/pkfilter__spectral_8py_source.html
index 503a272..ecbc049 100644
--- a/doc/html/pkfilter__spectral_8py_source.html
+++ b/doc/html/pkfilter__spectral_8py_source.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.3</span>
+    <span id="projectnumber">2.6.4</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -177,7 +177,7 @@
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Jun 23 2015 17:09:36 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Tue Nov 3 2015 15:58:26 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/pkfilterascii.html b/doc/html/pkfilterascii.html
index 485366a..f9df8ba 100644
--- a/doc/html/pkfilterascii.html
+++ b/doc/html/pkfilterascii.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.3</span>
+    <span id="projectnumber">2.6.4</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -97,7 +97,7 @@ Usage: pkfilterascii -i input.txt [-ic column]* </li>
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Jun 23 2015 17:09:37 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/pkfilterascii_8cc_source.html b/doc/html/pkfilterascii_8cc_source.html
index 1de0c11..3eddc0b 100644
--- a/doc/html/pkfilterascii_8cc_source.html
+++ b/doc/html/pkfilterascii_8cc_source.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.3</span>
+    <span id="projectnumber">2.6.4</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -369,7 +369,7 @@
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Jun 23 2015 17:09:36 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Tue Nov 3 2015 15:58:26 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/pkfilterdem.html b/doc/html/pkfilterdem.html
index 0a8855d..dd326bb 100644
--- a/doc/html/pkfilterdem.html
+++ b/doc/html/pkfilterdem.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.3</span>
+    <span id="projectnumber">2.6.4</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -91,7 +91,7 @@ Usage: pkfilterdem -i input.txt -o output </li>
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Jun 23 2015 17:09:37 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/pkfilterdem_8cc_source.html b/doc/html/pkfilterdem_8cc_source.html
index b3a992e..25316f3 100644
--- a/doc/html/pkfilterdem_8cc_source.html
+++ b/doc/html/pkfilterdem_8cc_source.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.3</span>
+    <span id="projectnumber">2.6.4</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -446,7 +446,7 @@
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Jun 23 2015 17:09:36 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Tue Nov 3 2015 15:58:26 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/pkfilterdem_8py_source.html b/doc/html/pkfilterdem_8py_source.html
index 7f835cc..98e8fd5 100644
--- a/doc/html/pkfilterdem_8py_source.html
+++ b/doc/html/pkfilterdem_8py_source.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.3</span>
+    <span id="projectnumber">2.6.4</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -163,7 +163,7 @@
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Jun 23 2015 17:09:36 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Tue Nov 3 2015 15:58:26 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/pkfsann.html b/doc/html/pkfsann.html
index 7eb0172..52c144a 100644
--- a/doc/html/pkfsann.html
+++ b/doc/html/pkfsann.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.3</span>
+    <span id="projectnumber">2.6.4</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -77,15 +77,15 @@ Options</h1>
 <tr>
 <td>min </td><td>min </td><td>int </td><td>0 </td><td>if number of training pixels is less then min, do not take this class into account </td></tr>
 <tr>
-<td>b </td><td>band </td><td>short </td><td></td><td>band index (starting from 0, either use band option or use start to end) </td></tr>
+<td>b </td><td>band </td><td>unsigned short </td><td></td><td>band index (starting from 0, either use band option or use start to end) </td></tr>
 <tr>
-<td>s </td><td>start </td><td>double </td><td>0 </td><td>start band sequence number </td></tr>
+<td>sband </td><td>startband </td><td>unsigned short </td><td></td><td>Start band sequence number </td></tr>
 <tr>
-<td>e </td><td>end </td><td>double </td><td>0 </td><td>end band sequence number (set to 0 to include all bands) </td></tr>
+<td>eband </td><td>endband </td><td>unsigned short </td><td></td><td>End band sequence number </td></tr>
 <tr>
-<td></td><td>offset </td><td>double </td><td>0 </td><td>offset value for each spectral band input features: refl[band]=(DN[band]-offset[band])/scale[band] </td></tr>
+<td>offset </td><td>offset </td><td>double </td><td>0 </td><td>offset value for each spectral band input features: refl[band]=(DN[band]-offset[band])/scale[band] </td></tr>
 <tr>
-<td></td><td>scale </td><td>double </td><td>0 </td><td>scale value for each spectral band input features: refl=(DN[band]-offset[band])/scale<a href="use 0 if scale min and max in each band to -1.0 and 1.0">band</a> </td></tr>
+<td>scale </td><td>scale </td><td>double </td><td>0 </td><td>scale value for each spectral band input features: refl=(DN[band]-offset[band])/scale<a href="use 0 if scale min and max in each band to -1.0 and 1.0">band</a> </td></tr>
 <tr>
 <td>a </td><td>aggreg </td><td>unsigned short </td><td>0 </td><td>how to combine aggregated classifiers, see also rc option (0: no aggregation, 1: sum rule, 2: max rule). </td></tr>
 <tr>
@@ -115,7 +115,7 @@ Usage: pkfsann -t training -n number </li>
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Jun 23 2015 17:09:37 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/pkfsann_8cc_source.html b/doc/html/pkfsann_8cc_source.html
index 5f3dc62..353f2a7 100644
--- a/doc/html/pkfsann_8cc_source.html
+++ b/doc/html/pkfsann_8cc_source.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.3</span>
+    <span id="projectnumber">2.6.4</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -234,9 +234,9 @@
 <div class="line"><a name="l00235"></a><span class="lineno">  235</span>   <a class="code" href="classOptionpk.html">Optionpk<unsigned int></a> balance_opt(<span class="stringliteral">"\0"</span>, <span class="stringliteral">"balance"</span>, <span class="stringliteral">"balance the input data to this number of samples for each class"</span>, 0);</div>
 <div class="line"><a name="l00236"></a><span class="lineno">  236</span>   <a class="code" href="classOptionpk.html">Optionpk<bool></a> random_opt(<span class="stringliteral">"random"</span>,<span class="stringliteral">"random"</span>, <span class="stringliteral">"in case of balance, randomize input data"</span>, <span class="keyword">true</span>);</div>
 <div class="line"><a name="l00237"></a><span class="lineno">  237</span>   <a class="code" href="classOptionpk.html">Optionpk<int></a> minSize_opt(<span class="stringliteral">"min"</span>, <span class="stringliteral">"min"</span>, <span class="stringliteral">"if number of training pixels is less then min, do not take this class into account"</span>, 0);</div>
-<div class="line"><a name="l00238"></a><span class="lineno">  238</span>   <a class="code" href="classOptionpk.html">Optionpk<short></a> band_opt(<span class="stringliteral">"b"</span>, <span class="stringliteral">"band"</span>, <span class="stringliteral">"band index (starting from 0, either use band option or use start to end)"</span>);</div>
-<div class="line"><a name="l00239"></a><span class="lineno">  239</span>   <a class="code" href="classOptionpk.html">Optionpk<double></a> bstart_opt(<span class="stringliteral">"s"</span>, <span class="stringliteral">"start"</span>, <span class="stringliteral">"start band sequence number"</span>,0); </div>
-<div class="line"><a name="l00240"></a><span class="lineno">  240</span>   <a class="code" href="classOptionpk.html">Optionpk<double></a> bend_opt(<span class="stringliteral">"e"</span>, <span class="stringliteral">"end"</span>, <span class="stringliteral">"end band sequence number (set to 0 to include all bands)"</span>, 0); </div>
+<div class="line"><a name="l00238"></a><span class="lineno">  238</span>   <a class="code" href="classOptionpk.html">Optionpk<unsigned short></a> band_opt(<span class="stringliteral">"b"</span>, <span class="stringliteral">"band"</span>, <span class="stringliteral">"band index (starting from 0, either use band option or use start to end)"</span>);</div>
+<div class="line"><a name="l00239"></a><span class="lineno">  239</span>   <a class="code" href="classOptionpk.html">Optionpk<unsigned short></a> bstart_opt(<span class="stringliteral">"sband"</span>, <span class="stringliteral">"startband"</span>, <span class="stringliteral">"Start band sequence number"</span>); </div>
+<div class="line"><a name="l00240"></a><span class="lineno">  240</span>   <a class="code" href="classOptionpk.html">Optionpk<unsigned short></a> bend_opt(<span class="stringliteral">"eband"</span>, <span class="stringliteral">"endband"</span>, <span class="stringliteral">"End band sequence number"</span>); </div>
 <div class="line"><a name="l00241"></a><span class="lineno">  241</span>   <a class="code" href="classOptionpk.html">Optionpk<double></a> offset_opt(<span class="stringliteral">"\0"</span>, <span class="stringliteral">"offset"</span>, <span class="stringliteral">"offset value for each spectral band input features: refl[band]=(DN[band]-offset[band])/scale[band]"</span>, 0.0);</div>
 <div class="line"><a name="l00242"></a><span class="lineno">  242</span>   <a class="code" href="classOptionpk.html">Optionpk<double></a> scale_opt(<span class="stringliteral">"\0"</span>, <span class="stringliteral">"scale"</span>, <span class="stringliteral">"scale value for each spectral band input features: refl=(DN[band]-offset[band])/scale[band] (use 0 if scale min and max in each band to -1.0 and 1.0)"</span>, 0.0);</div>
 <div class="line"><a name="l00243"></a><span class="lineno">  243</span>   <a class="code" href="classOptionpk.html">Optionpk<unsigned short></a> aggreg_opt(<span class="stringliteral">"a"</span>, <span class="stringliteral">"aggreg"</span>, <span class="stringliteral">"how to combine aggregated classifiers, see also rc option (0: no aggregation, 1: sum rule, 2: max rule)."</span>,0);</div>
@@ -363,340 +363,362 @@
 <div class="line"><a name="l00364"></a><span class="lineno">  364</span>   <span class="comment">//     priors[iclass]/=normPrior;</span></div>
 <div class="line"><a name="l00365"></a><span class="lineno">  365</span>   <span class="comment">// }</span></div>
 <div class="line"><a name="l00366"></a><span class="lineno">  366</span> </div>
-<div class="line"><a name="l00367"></a><span class="lineno">  367</span>   <span class="comment">//sort bands</span></div>
-<div class="line"><a name="l00368"></a><span class="lineno">  368</span>   <span class="keywordflow">if</span>(band_opt.size())</div>
-<div class="line"><a name="l00369"></a><span class="lineno">  369</span>     std::sort(band_opt.begin(),band_opt.end());</div>
-<div class="line"><a name="l00370"></a><span class="lineno">  370</span> </div>
-<div class="line"><a name="l00371"></a><span class="lineno">  371</span>   <span class="comment">// map<string,short> classValueMap;//global variable for now (due to getCost)</span></div>
-<div class="line"><a name="l00372"></a><span class="lineno">  372</span>   <span class="keywordflow">if</span>(classname_opt.size()){</div>
-<div class="line"><a name="l00373"></a><span class="lineno">  373</span>     assert(classname_opt.size()==classvalue_opt.size());</div>
-<div class="line"><a name="l00374"></a><span class="lineno">  374</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iclass=0;iclass<classname_opt.size();++iclass)</div>
-<div class="line"><a name="l00375"></a><span class="lineno">  375</span>       costfactory.setClassValueMap(classname_opt[iclass],classvalue_opt[iclass]);</div>
-<div class="line"><a name="l00376"></a><span class="lineno">  376</span>   }</div>
-<div class="line"><a name="l00377"></a><span class="lineno">  377</span>   <span class="comment">//----------------------------------- Training -------------------------------</span></div>
-<div class="line"><a name="l00378"></a><span class="lineno">  378</span>   vector<double> offset;</div>
-<div class="line"><a name="l00379"></a><span class="lineno">  379</span>   vector<double> scale;</div>
-<div class="line"><a name="l00380"></a><span class="lineno">  380</span>   vector< Vector2d<float> > trainingPixels;<span class="comment">//[class][sample][band]</span></div>
-<div class="line"><a name="l00381"></a><span class="lineno">  381</span>   vector< Vector2d<float> > testPixels;<span class="comment">//[class][sample][band]</span></div>
-<div class="line"><a name="l00382"></a><span class="lineno">  382</span>   map<string,Vector2d<float> > trainingMap;</div>
-<div class="line"><a name="l00383"></a><span class="lineno">  383</span>   map<string,Vector2d<float> > testMap;</div>
-<div class="line"><a name="l00384"></a><span class="lineno">  384</span>   vector<string> fields;</div>
-<div class="line"><a name="l00385"></a><span class="lineno">  385</span> </div>
-<div class="line"><a name="l00386"></a><span class="lineno">  386</span>   <span class="comment">//organize training data</span></div>
-<div class="line"><a name="l00387"></a><span class="lineno">  387</span>   trainingPixels.clear();</div>
-<div class="line"><a name="l00388"></a><span class="lineno">  388</span>   <span class="keywordflow">if</span>(verbose_opt[0]>=1)</div>
-<div class="line"><a name="l00389"></a><span class="lineno">  389</span>     std::cout << <span class="stringliteral">"reading imageVector file "</span> << training_opt[0] << std::endl;</div>
-<div class="line"><a name="l00390"></a><span class="lineno">  390</span>   <span class="keywordflow">try</span>{</div>
-<div class="line"><a name="l00391"></a><span class="lineno">  391</span>     <a class="code" href="classImgReaderOgr.html">ImgReaderOgr</a> trainingReader(training_opt[0]);</div>
-<div class="line"><a name="l00392"></a><span class="lineno">  392</span>     <span class="keywordflow">if</span>(band_opt.size()){</div>
-<div class="line"><a name="l00393"></a><span class="lineno">  393</span>       totalSamples=trainingReader.readDataImageOgr(trainingMap,fields,band_opt,label_opt[0],tlayer_opt,verbose_opt[0]);</div>
-<div class="line"><a name="l00394"></a><span class="lineno">  394</span>       <span class="keywordflow">if</span>(input_opt.size()){</div>
-<div class="line"><a name="l00395"></a><span class="lineno">  395</span>     <a class="code" href="classImgReaderOgr.html">ImgReaderOgr</a> inputReader(input_opt[0]);</div>
-<div class="line"><a name="l00396"></a><span class="lineno">  396</span>     totalTestSamples=trainingReader.readDataImageOgr(testMap,fields,band_opt,label_opt[0],tlayer_opt,verbose_opt[0]);</div>
-<div class="line"><a name="l00397"></a><span class="lineno">  397</span>     inputReader.close();</div>
-<div class="line"><a name="l00398"></a><span class="lineno">  398</span>       }</div>
-<div class="line"><a name="l00399"></a><span class="lineno">  399</span>     }</div>
-<div class="line"><a name="l00400"></a><span class="lineno">  400</span>     <span class="keywordflow">else</span>{</div>
-<div class="line"><a name="l00401"></a><span class="lineno">  401</span>       totalSamples=trainingReader.readDataImageOgr(trainingMap,fields,bstart_opt[0],bend_opt[0],label_opt[0],tlayer_opt,verbose_opt[0]);</div>
-<div class="line"><a name="l00402"></a><span class="lineno">  402</span>       <span class="keywordflow">if</span>(input_opt.size()){</div>
-<div class="line"><a name="l00403"></a><span class="lineno">  403</span>     <a class="code" href="classImgReaderOgr.html">ImgReaderOgr</a> inputReader(input_opt[0]);</div>
-<div class="line"><a name="l00404"></a><span class="lineno">  404</span>     totalTestSamples=trainingReader.readDataImageOgr(testMap,fields,bstart_opt[0],bend_opt[0],label_opt[0],tlayer_opt,verbose_opt[0]);</div>
-<div class="line"><a name="l00405"></a><span class="lineno">  405</span>     inputReader.close();</div>
-<div class="line"><a name="l00406"></a><span class="lineno">  406</span>       }</div>
-<div class="line"><a name="l00407"></a><span class="lineno">  407</span>     }</div>
-<div class="line"><a name="l00408"></a><span class="lineno">  408</span>     <span class="keywordflow">if</span>(trainingMap.size()<2){</div>
-<div class="line"><a name="l00409"></a><span class="lineno">  409</span>       <span class="keywordtype">string</span> errorstring=<span class="stringliteral">"Error: could not read at least two classes from training file"</span>;</div>
-<div class="line"><a name="l00410"></a><span class="lineno">  410</span>       <span class="keywordflow">throw</span>(errorstring);</div>
-<div class="line"><a name="l00411"></a><span class="lineno">  411</span>     }</div>
-<div class="line"><a name="l00412"></a><span class="lineno">  412</span>     <span class="keywordflow">if</span>(input_opt.size()&&testMap.size()<2){</div>
-<div class="line"><a name="l00413"></a><span class="lineno">  413</span>       <span class="keywordtype">string</span> errorstring=<span class="stringliteral">"Error: could not read at least two classes from test input file"</span>;</div>
-<div class="line"><a name="l00414"></a><span class="lineno">  414</span>       <span class="keywordflow">throw</span>(errorstring);</div>
-<div class="line"><a name="l00415"></a><span class="lineno">  415</span>     }</div>
-<div class="line"><a name="l00416"></a><span class="lineno">  416</span>     trainingReader.close();</div>
-<div class="line"><a name="l00417"></a><span class="lineno">  417</span>   }</div>
-<div class="line"><a name="l00418"></a><span class="lineno">  418</span>   <span class="keywordflow">catch</span>(<span class="keywordtype">string</span> error){</div>
-<div class="line"><a name="l00419"></a><span class="lineno">  419</span>     cerr << error << std::endl;</div>
-<div class="line"><a name="l00420"></a><span class="lineno">  420</span>     exit(1);</div>
-<div class="line"><a name="l00421"></a><span class="lineno">  421</span>   }</div>
-<div class="line"><a name="l00422"></a><span class="lineno">  422</span>   <span class="keywordflow">catch</span>(std::exception& e){</div>
-<div class="line"><a name="l00423"></a><span class="lineno">  423</span>     std::cerr << <span class="stringliteral">"Error: "</span>;</div>
-<div class="line"><a name="l00424"></a><span class="lineno">  424</span>     std::cerr << e.what() << std::endl;</div>
-<div class="line"><a name="l00425"></a><span class="lineno">  425</span>     std::cerr << CPLGetLastErrorMsg() << std::endl; </div>
-<div class="line"><a name="l00426"></a><span class="lineno">  426</span>     exit(1);</div>
-<div class="line"><a name="l00427"></a><span class="lineno">  427</span>   }</div>
-<div class="line"><a name="l00428"></a><span class="lineno">  428</span>   <span class="keywordflow">catch</span>(...){</div>
-<div class="line"><a name="l00429"></a><span class="lineno">  429</span>     cerr << <span class="stringliteral">"error catched"</span> << std::endl;</div>
-<div class="line"><a name="l00430"></a><span class="lineno">  430</span>     exit(1);</div>
-<div class="line"><a name="l00431"></a><span class="lineno">  431</span>   }</div>
-<div class="line"><a name="l00432"></a><span class="lineno">  432</span>   <span class="comment">//delete class 0 ?</span></div>
-<div class="line"><a name="l00433"></a><span class="lineno">  433</span>   <span class="comment">// if(verbose_opt[0]>=1)</span></div>
-<div class="line"><a name="l00434"></a><span class="lineno">  434</span>   <span class="comment">//   std::cout << "erasing class 0 from training set (" << trainingMap[0].size() << " from " << totalSamples << ") samples" << std::endl;</span></div>
-<div class="line"><a name="l00435"></a><span class="lineno">  435</span>   <span class="comment">// totalSamples-=trainingMap[0].size();</span></div>
-<div class="line"><a name="l00436"></a><span class="lineno">  436</span>   <span class="comment">// trainingMap.erase(0);</span></div>
-<div class="line"><a name="l00437"></a><span class="lineno">  437</span>   <span class="comment">//convert map to vector</span></div>
-<div class="line"><a name="l00438"></a><span class="lineno">  438</span> </div>
-<div class="line"><a name="l00439"></a><span class="lineno">  439</span>   <span class="keywordflow">if</span>(verbose_opt[0]>1)</div>
-<div class="line"><a name="l00440"></a><span class="lineno">  440</span>     std::cout << <span class="stringliteral">"training pixels: "</span> << std::endl;</div>
-<div class="line"><a name="l00441"></a><span class="lineno">  441</span>   map<string,Vector2d<float> >::iterator mapit=trainingMap.begin();</div>
-<div class="line"><a name="l00442"></a><span class="lineno">  442</span>   <span class="keywordflow">while</span>(mapit!=trainingMap.end()){</div>
-<div class="line"><a name="l00443"></a><span class="lineno">  443</span>     <span class="comment">// if(classValueMap.size()){</span></div>
-<div class="line"><a name="l00444"></a><span class="lineno">  444</span>     <span class="comment">//   //check if name in training is covered by classname_opt (values can not be 0)</span></div>
-<div class="line"><a name="l00445"></a><span class="lineno">  445</span>     <span class="comment">//   if(classValueMap[mapit->first]>0){</span></div>
-<div class="line"><a name="l00446"></a><span class="lineno">  446</span>     <span class="comment">//  if(verbose_opt[0])</span></div>
-<div class="line"><a name="l00447"></a><span class="lineno">  447</span>     <span class="comment">//    std::cout << mapit->first << " -> " << classValueMap[mapit->first] << std::endl;</span></div>
-<div class="line"><a name="l00448"></a><span class="lineno">  448</span>     <span class="comment">//   }</span></div>
-<div class="line"><a name="l00449"></a><span class="lineno">  449</span>     <span class="comment">//   else{</span></div>
-<div class="line"><a name="l00450"></a><span class="lineno">  450</span>     <span class="comment">//  std::cerr << "Error: names in classname option are not complete, please check names in training vector and make sure classvalue is > 0" << std::endl;</span></div>
-<div class="line"><a name="l00451"></a><span class="lineno">  451</span>     <span class="comment">//  exit(1);</span></div>
-<div class="line"><a name="l00452"></a><span class="lineno">  452</span>     <span class="comment">//   }</span></div>
-<div class="line"><a name="l00453"></a><span class="lineno">  453</span>     <span class="comment">// }    </span></div>
-<div class="line"><a name="l00454"></a><span class="lineno">  454</span>     <span class="comment">//delete small classes</span></div>
-<div class="line"><a name="l00455"></a><span class="lineno">  455</span>     <span class="keywordflow">if</span>((mapit->second).size()<minSize_opt[0]){</div>
-<div class="line"><a name="l00456"></a><span class="lineno">  456</span>       trainingMap.erase(mapit);</div>
-<div class="line"><a name="l00457"></a><span class="lineno">  457</span>       <span class="keywordflow">continue</span>;</div>
-<div class="line"><a name="l00458"></a><span class="lineno">  458</span>     }</div>
-<div class="line"><a name="l00459"></a><span class="lineno">  459</span>     trainingPixels.push_back(mapit->second);</div>
-<div class="line"><a name="l00460"></a><span class="lineno">  460</span>     <span class="keywordflow">if</span>(verbose_opt[0]>1)</div>
-<div class="line"><a name="l00461"></a><span class="lineno">  461</span>       std::cout << mapit->first << <span class="stringliteral">": "</span> << (mapit->second).size() << <span class="stringliteral">" samples"</span> << std::endl;</div>
-<div class="line"><a name="l00462"></a><span class="lineno">  462</span>     ++mapit;</div>
-<div class="line"><a name="l00463"></a><span class="lineno">  463</span>   }</div>
-<div class="line"><a name="l00464"></a><span class="lineno">  464</span>   nclass=trainingPixels.size();</div>
-<div class="line"><a name="l00465"></a><span class="lineno">  465</span>   <span class="keywordflow">if</span>(classname_opt.size())</div>
-<div class="line"><a name="l00466"></a><span class="lineno">  466</span>     assert(nclass==classname_opt.size());</div>
-<div class="line"><a name="l00467"></a><span class="lineno">  467</span>   nband=trainingPixels[0][0].size()-2;<span class="comment">//X and Y//trainingPixels[0][0].size();</span></div>
-<div class="line"><a name="l00468"></a><span class="lineno">  468</span> </div>
-<div class="line"><a name="l00469"></a><span class="lineno">  469</span>   mapit=testMap.begin();</div>
-<div class="line"><a name="l00470"></a><span class="lineno">  470</span>   <span class="keywordflow">while</span>(mapit!=testMap.end()){</div>
-<div class="line"><a name="l00471"></a><span class="lineno">  471</span>     <span class="comment">//no need to delete small classes for test sample</span></div>
-<div class="line"><a name="l00472"></a><span class="lineno">  472</span>     testPixels.push_back(mapit->second);</div>
-<div class="line"><a name="l00473"></a><span class="lineno">  473</span>     <span class="keywordflow">if</span>(verbose_opt[0]>1)</div>
-<div class="line"><a name="l00474"></a><span class="lineno">  474</span>       std::cout << mapit->first << <span class="stringliteral">": "</span> << (mapit->second).size() << <span class="stringliteral">" samples"</span> << std::endl;</div>
-<div class="line"><a name="l00475"></a><span class="lineno">  475</span>     ++mapit;</div>
-<div class="line"><a name="l00476"></a><span class="lineno">  476</span>   }</div>
-<div class="line"><a name="l00477"></a><span class="lineno">  477</span>   <span class="keywordflow">if</span>(input_opt.size()){</div>
-<div class="line"><a name="l00478"></a><span class="lineno">  478</span>     assert(nclass==testPixels.size());</div>
-<div class="line"><a name="l00479"></a><span class="lineno">  479</span>     assert(nband=testPixels[0][0].size()-2);<span class="comment">//X and Y//testPixels[0][0].size();</span></div>
-<div class="line"><a name="l00480"></a><span class="lineno">  480</span>     assert(!cv_opt[0]);</div>
-<div class="line"><a name="l00481"></a><span class="lineno">  481</span>   }</div>
-<div class="line"><a name="l00482"></a><span class="lineno">  482</span> </div>
-<div class="line"><a name="l00483"></a><span class="lineno">  483</span>   <span class="comment">//do not remove outliers here: could easily be obtained through ogr2ogr -where 'B2<110' output.shp input.shp</span></div>
-<div class="line"><a name="l00484"></a><span class="lineno">  484</span>   <span class="comment">//balance training data</span></div>
-<div class="line"><a name="l00485"></a><span class="lineno">  485</span>   <span class="keywordflow">if</span>(balance_opt[0]>0){</div>
-<div class="line"><a name="l00486"></a><span class="lineno">  486</span>     <span class="keywordflow">if</span>(random_opt[0])</div>
-<div class="line"><a name="l00487"></a><span class="lineno">  487</span>       srand(time(NULL));</div>
-<div class="line"><a name="l00488"></a><span class="lineno">  488</span>     totalSamples=0;</div>
-<div class="line"><a name="l00489"></a><span class="lineno">  489</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iclass=0;iclass<nclass;++iclass){</div>
-<div class="line"><a name="l00490"></a><span class="lineno">  490</span>       <span class="keywordflow">if</span>(trainingPixels[iclass].size()>balance_opt[0]){</div>
-<div class="line"><a name="l00491"></a><span class="lineno">  491</span>         <span class="keywordflow">while</span>(trainingPixels[iclass].size()>balance_opt[0]){</div>
-<div class="line"><a name="l00492"></a><span class="lineno">  492</span>           <span class="keywordtype">int</span> index=rand()%trainingPixels[iclass].size();</div>
-<div class="line"><a name="l00493"></a><span class="lineno">  493</span>           trainingPixels[iclass].erase(trainingPixels[iclass].begin()+index);</div>
-<div class="line"><a name="l00494"></a><span class="lineno">  494</span>         }</div>
-<div class="line"><a name="l00495"></a><span class="lineno">  495</span>       }</div>
-<div class="line"><a name="l00496"></a><span class="lineno">  496</span>       <span class="keywordflow">else</span>{</div>
-<div class="line"><a name="l00497"></a><span class="lineno">  497</span>         <span class="keywordtype">int</span> oldsize=trainingPixels[iclass].size();</div>
-<div class="line"><a name="l00498"></a><span class="lineno">  498</span>         <span class="keywordflow">for</span>(<span class="keywordtype">int</span> isample=trainingPixels[iclass].size();isample<balance_opt[0];++isample){</div>
-<div class="line"><a name="l00499"></a><span class="lineno">  499</span>           <span class="keywordtype">int</span> index = rand()%oldsize;</div>
-<div class="line"><a name="l00500"></a><span class="lineno">  500</span>           trainingPixels[iclass].push_back(trainingPixels[iclass][index]);</div>
-<div class="line"><a name="l00501"></a><span class="lineno">  501</span>         }</div>
-<div class="line"><a name="l00502"></a><span class="lineno">  502</span>       }</div>
-<div class="line"><a name="l00503"></a><span class="lineno">  503</span>       totalSamples+=trainingPixels[iclass].size();</div>
-<div class="line"><a name="l00504"></a><span class="lineno">  504</span>     }</div>
-<div class="line"><a name="l00505"></a><span class="lineno">  505</span>     assert(totalSamples==nclass*balance_opt[0]);</div>
-<div class="line"><a name="l00506"></a><span class="lineno">  506</span>   }</div>
-<div class="line"><a name="l00507"></a><span class="lineno">  507</span>     </div>
-<div class="line"><a name="l00508"></a><span class="lineno">  508</span>   <span class="comment">//set scale and offset</span></div>
-<div class="line"><a name="l00509"></a><span class="lineno">  509</span>   offset.resize(nband);</div>
-<div class="line"><a name="l00510"></a><span class="lineno">  510</span>   scale.resize(nband);</div>
-<div class="line"><a name="l00511"></a><span class="lineno">  511</span>   <span class="keywordflow">if</span>(offset_opt.size()>1)</div>
-<div class="line"><a name="l00512"></a><span class="lineno">  512</span>     assert(offset_opt.size()==nband);</div>
-<div class="line"><a name="l00513"></a><span class="lineno">  513</span>   <span class="keywordflow">if</span>(scale_opt.size()>1)</div>
-<div class="line"><a name="l00514"></a><span class="lineno">  514</span>     assert(scale_opt.size()==nband);</div>
-<div class="line"><a name="l00515"></a><span class="lineno">  515</span>   <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iband=0;iband<nband;++iband){</div>
-<div class="line"><a name="l00516"></a><span class="lineno">  516</span>     <span class="keywordflow">if</span>(verbose_opt[0]>1)</div>
-<div class="line"><a name="l00517"></a><span class="lineno">  517</span>       std::cout << <span class="stringliteral">"scaling for band"</span> << iband << std::endl;</div>
-<div class="line"><a name="l00518"></a><span class="lineno">  518</span>     offset[iband]=(offset_opt.size()==1)?offset_opt[0]:offset_opt[iband];</div>
-<div class="line"><a name="l00519"></a><span class="lineno">  519</span>     scale[iband]=(scale_opt.size()==1)?scale_opt[0]:scale_opt[iband];</div>
-<div class="line"><a name="l00520"></a><span class="lineno">  520</span>     <span class="comment">//search for min and maximum</span></div>
-<div class="line"><a name="l00521"></a><span class="lineno">  521</span>     <span class="keywordflow">if</span>(scale[iband]<=0){</div>
-<div class="line"><a name="l00522"></a><span class="lineno">  522</span>       <span class="keywordtype">float</span> theMin=trainingPixels[0][0][iband+startBand];</div>
-<div class="line"><a name="l00523"></a><span class="lineno">  523</span>       <span class="keywordtype">float</span> theMax=trainingPixels[0][0][iband+startBand];</div>
-<div class="line"><a name="l00524"></a><span class="lineno">  524</span>       <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iclass=0;iclass<nclass;++iclass){</div>
-<div class="line"><a name="l00525"></a><span class="lineno">  525</span>         <span class="keywordflow">for</span>(<span class="keywordtype">int</span> isample=0;isample<trainingPixels[iclass].size();++isample){</div>
-<div class="line"><a name="l00526"></a><span class="lineno">  526</span>           <span class="keywordflow">if</span>(theMin>trainingPixels[iclass][isample][iband+startBand])</div>
-<div class="line"><a name="l00527"></a><span class="lineno">  527</span>             theMin=trainingPixels[iclass][isample][iband+startBand];</div>
-<div class="line"><a name="l00528"></a><span class="lineno">  528</span>           <span class="keywordflow">if</span>(theMax<trainingPixels[iclass][isample][iband+startBand])</div>
-<div class="line"><a name="l00529"></a><span class="lineno">  529</span>             theMax=trainingPixels[iclass][isample][iband+startBand];</div>
-<div class="line"><a name="l00530"></a><span class="lineno">  530</span>         }</div>
-<div class="line"><a name="l00531"></a><span class="lineno">  531</span>       }</div>
-<div class="line"><a name="l00532"></a><span class="lineno">  532</span>       offset[iband]=theMin+(theMax-theMin)/2.0;</div>
-<div class="line"><a name="l00533"></a><span class="lineno">  533</span>       scale[iband]=(theMax-theMin)/2.0;</div>
-<div class="line"><a name="l00534"></a><span class="lineno">  534</span>       <span class="keywordflow">if</span>(verbose_opt[0]>1){</div>
-<div class="line"><a name="l00535"></a><span class="lineno">  535</span>         std::cout << <span class="stringliteral">"Extreme image values for band "</span> << iband << <span class="stringliteral">": ["</span> << theMin << <span class="stringliteral">","</span> << theMax << <span class="stringliteral">"]"</span> << std::endl;</div>
-<div class="line"><a name="l00536"></a><span class="lineno">  536</span>         std::cout << <span class="stringliteral">"Using offset, scale: "</span> << offset[iband] << <span class="stringliteral">", "</span> << scale[iband] << std::endl;</div>
-<div class="line"><a name="l00537"></a><span class="lineno">  537</span>         std::cout << <span class="stringliteral">"scaled values for band "</span> << iband << <span class="stringliteral">": ["</span> << (theMin-offset[iband])/scale[iband] << <span class="stringliteral">","</span> << (theMax-offset[iband])/scale[iband] << <span class="stringliteral">"]"</span> << std::endl;</div>
-<div class="line"><a name="l00538"></a><span class="lineno">  538</span>       }</div>
-<div class="line"><a name="l00539"></a><span class="lineno">  539</span>     }</div>
-<div class="line"><a name="l00540"></a><span class="lineno">  540</span>   }</div>
-<div class="line"><a name="l00541"></a><span class="lineno">  541</span> </div>
-<div class="line"><a name="l00542"></a><span class="lineno">  542</span>   <span class="comment">// if(priors_opt.size()==1){//default: equal priors for each class</span></div>
-<div class="line"><a name="l00543"></a><span class="lineno">  543</span>   <span class="comment">//   priors.resize(nclass);</span></div>
-<div class="line"><a name="l00544"></a><span class="lineno">  544</span>   <span class="comment">//   for(int iclass=0;iclass<nclass;++iclass)</span></div>
-<div class="line"><a name="l00545"></a><span class="lineno">  545</span>   <span class="comment">//     priors[iclass]=1.0/nclass;</span></div>
-<div class="line"><a name="l00546"></a><span class="lineno">  546</span>   <span class="comment">// }</span></div>
-<div class="line"><a name="l00547"></a><span class="lineno">  547</span>   <span class="comment">// assert(priors_opt.size()==1||priors_opt.size()==nclass);</span></div>
-<div class="line"><a name="l00548"></a><span class="lineno">  548</span>     </div>
-<div class="line"><a name="l00549"></a><span class="lineno">  549</span>   <span class="keywordflow">if</span>(verbose_opt[0]>=1){</div>
-<div class="line"><a name="l00550"></a><span class="lineno">  550</span>     std::cout << <span class="stringliteral">"number of bands: "</span> << nband << std::endl;</div>
-<div class="line"><a name="l00551"></a><span class="lineno">  551</span>     std::cout << <span class="stringliteral">"number of classes: "</span> << nclass << std::endl;</div>
-<div class="line"><a name="l00552"></a><span class="lineno">  552</span>     <span class="comment">// std::cout << "priors:";</span></div>
-<div class="line"><a name="l00553"></a><span class="lineno">  553</span>     <span class="comment">// for(int iclass=0;iclass<nclass;++iclass)</span></div>
-<div class="line"><a name="l00554"></a><span class="lineno">  554</span>     <span class="comment">//   std::cout << " " << priors[iclass];</span></div>
-<div class="line"><a name="l00555"></a><span class="lineno">  555</span>     <span class="comment">// std::cout << std::endl;</span></div>
-<div class="line"><a name="l00556"></a><span class="lineno">  556</span>   }</div>
-<div class="line"><a name="l00557"></a><span class="lineno">  557</span> </div>
-<div class="line"><a name="l00558"></a><span class="lineno">  558</span>   <span class="comment">//set names in confusion matrix using nameVector</span></div>
-<div class="line"><a name="l00559"></a><span class="lineno">  559</span>   vector<string> nameVector=costfactory.getNameVector();</div>
-<div class="line"><a name="l00560"></a><span class="lineno">  560</span>   <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iname=0;iname<nameVector.size();++iname){</div>
-<div class="line"><a name="l00561"></a><span class="lineno">  561</span>     <span class="keywordflow">if</span>(costfactory.getClassValueMap().empty())</div>
-<div class="line"><a name="l00562"></a><span class="lineno">  562</span>       costfactory.pushBackClassName(nameVector[iname]);</div>
-<div class="line"><a name="l00563"></a><span class="lineno">  563</span>       <span class="comment">// cm.pushBackClassName(nameVector[iname]);</span></div>
-<div class="line"><a name="l00564"></a><span class="lineno">  564</span>     <span class="keywordflow">else</span> <span class="keywordflow">if</span>(costfactory.getClassIndex(type2string<short>((costfactory.getClassValueMap())[nameVector[iname]]))<0)</div>
-<div class="line"><a name="l00565"></a><span class="lineno">  565</span>       costfactory.pushBackClassName(type2string<short>((costfactory.getClassValueMap())[nameVector[iname]]));</div>
-<div class="line"><a name="l00566"></a><span class="lineno">  566</span>   }</div>
-<div class="line"><a name="l00567"></a><span class="lineno">  567</span> </div>
-<div class="line"><a name="l00568"></a><span class="lineno">  568</span>   <span class="comment">// if(classname_opt.empty()){</span></div>
-<div class="line"><a name="l00569"></a><span class="lineno">  569</span>   <span class="comment">//   for(int iclass=0;iclass<nclass;++iclass){</span></div>
-<div class="line"><a name="l00570"></a><span class="lineno">  570</span>   <span class="comment">//     if(verbose_opt[0])</span></div>
-<div class="line"><a name="l00571"></a><span class="lineno">  571</span>   <span class="comment">//    std::cout << iclass << " " << cm.getClass(iclass) << " -> " << string2type<short>(cm.getClass(iclass)) << std::endl;</span></div>
-<div class="line"><a name="l00572"></a><span class="lineno">  572</span>   <span class="comment">//     classValueMap[cm.getClass(iclass)]=string2type<short>(cm.getClass(iclass));</span></div>
-<div class="line"><a name="l00573"></a><span class="lineno">  573</span>   <span class="comment">//   }</span></div>
-<div class="line"><a name="l00574"></a><span class="lineno">  574</span>   <span class="comment">// }</span></div>
-<div class="line"><a name="l00575"></a><span class="lineno">  575</span> </div>
-<div class="line"><a name="l00576"></a><span class="lineno">  576</span>   <span class="comment">//Calculate features of trainig set</span></div>
-<div class="line"><a name="l00577"></a><span class="lineno">  577</span> </div>
-<div class="line"><a name="l00578"></a><span class="lineno">  578</span>   vector<unsigned int> nctraining;</div>
-<div class="line"><a name="l00579"></a><span class="lineno">  579</span>   vector<unsigned int> nctest;</div>
-<div class="line"><a name="l00580"></a><span class="lineno">  580</span>   nctraining.resize(nclass);</div>
-<div class="line"><a name="l00581"></a><span class="lineno">  581</span>   nctest.resize(nclass);</div>
-<div class="line"><a name="l00582"></a><span class="lineno">  582</span>   vector< Vector2d<float> > trainingFeatures(nclass);</div>
-<div class="line"><a name="l00583"></a><span class="lineno">  583</span>   <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iclass=0;iclass<nclass;++iclass){</div>
-<div class="line"><a name="l00584"></a><span class="lineno">  584</span>     <span class="keywordflow">if</span>(verbose_opt[0]>=1)</div>
-<div class="line"><a name="l00585"></a><span class="lineno">  585</span>       std::cout << <span class="stringliteral">"calculating features for class "</span> << iclass << std::endl;</div>
-<div class="line"><a name="l00586"></a><span class="lineno">  586</span>     nctraining[iclass]=trainingPixels[iclass].size();</div>
-<div class="line"><a name="l00587"></a><span class="lineno">  587</span>     <span class="keywordflow">if</span>(verbose_opt[0]>=1)</div>
-<div class="line"><a name="l00588"></a><span class="lineno">  588</span>       std::cout << <span class="stringliteral">"nctraining["</span> << iclass << <span class="stringliteral">"]: "</span> << nctraining[iclass] << std::endl;</div>
-<div class="line"><a name="l00589"></a><span class="lineno">  589</span>     <span class="keywordflow">if</span>(testPixels.size()>iclass){</div>
-<div class="line"><a name="l00590"></a><span class="lineno">  590</span>       nctest[iclass]=testPixels[iclass].size();</div>
-<div class="line"><a name="l00591"></a><span class="lineno">  591</span>       <span class="keywordflow">if</span>(verbose_opt[0]>=1){</div>
-<div class="line"><a name="l00592"></a><span class="lineno">  592</span>     std::cout << <span class="stringliteral">"nctest["</span> << iclass << <span class="stringliteral">"]: "</span> << nctest[iclass] << std::endl;</div>
-<div class="line"><a name="l00593"></a><span class="lineno">  593</span>       }</div>
-<div class="line"><a name="l00594"></a><span class="lineno">  594</span>     }</div>
-<div class="line"><a name="l00595"></a><span class="lineno">  595</span>     <span class="keywordflow">else</span></div>
-<div class="line"><a name="l00596"></a><span class="lineno">  596</span>       nctest[iclass]=0;</div>
-<div class="line"><a name="l00597"></a><span class="lineno">  597</span>       </div>
-<div class="line"><a name="l00598"></a><span class="lineno">  598</span>     trainingFeatures[iclass].resize(nctraining[iclass]+nctest[iclass]);</div>
-<div class="line"><a name="l00599"></a><span class="lineno">  599</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> isample=0;isample<nctraining[iclass];++isample){</div>
-<div class="line"><a name="l00600"></a><span class="lineno">  600</span>       <span class="comment">//scale pixel values according to scale and offset!!!</span></div>
-<div class="line"><a name="l00601"></a><span class="lineno">  601</span>       <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iband=0;iband<nband;++iband){</div>
-<div class="line"><a name="l00602"></a><span class="lineno">  602</span>         assert(trainingPixels[iclass].size()>isample);</div>
-<div class="line"><a name="l00603"></a><span class="lineno">  603</span>         assert(trainingPixels[iclass][isample].size()>iband+startBand);</div>
-<div class="line"><a name="l00604"></a><span class="lineno">  604</span>         assert(offset.size()>iband);</div>
-<div class="line"><a name="l00605"></a><span class="lineno">  605</span>         assert(scale.size()>iband);</div>
-<div class="line"><a name="l00606"></a><span class="lineno">  606</span>         <span class="keywordtype">float</span> value=trainingPixels[iclass][isample][iband+startBand];</div>
-<div class="line"><a name="l00607"></a><span class="lineno">  607</span>         trainingFeatures[iclass][isample].push_back((value-offset[iband])/scale[iband]);</div>
-<div class="line"><a name="l00608"></a><span class="lineno">  608</span>       }</div>
-<div class="line"><a name="l00609"></a><span class="lineno">  609</span>     }</div>
-<div class="line"><a name="l00610"></a><span class="lineno">  610</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> isample=0;isample<nctest[iclass];++isample){</div>
-<div class="line"><a name="l00611"></a><span class="lineno">  611</span>       <span class="comment">//scale pixel values according to scale and offset!!!</span></div>
-<div class="line"><a name="l00612"></a><span class="lineno">  612</span>       <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iband=0;iband<nband;++iband){</div>
-<div class="line"><a name="l00613"></a><span class="lineno">  613</span>         assert(testPixels[iclass].size()>isample);</div>
-<div class="line"><a name="l00614"></a><span class="lineno">  614</span>         assert(testPixels[iclass][isample].size()>iband+startBand);</div>
-<div class="line"><a name="l00615"></a><span class="lineno">  615</span>         assert(offset.size()>iband);</div>
-<div class="line"><a name="l00616"></a><span class="lineno">  616</span>         assert(scale.size()>iband);</div>
-<div class="line"><a name="l00617"></a><span class="lineno">  617</span>         <span class="keywordtype">float</span> value=testPixels[iclass][isample][iband+startBand];</div>
-<div class="line"><a name="l00618"></a><span class="lineno">  618</span>         <span class="comment">// testFeatures[iclass][isample].push_back((value-offset[iband])/scale[iband]);</span></div>
-<div class="line"><a name="l00619"></a><span class="lineno">  619</span>         trainingFeatures[iclass][nctraining[iclass]+isample].push_back((value-offset[iband])/scale[iband]);</div>
-<div class="line"><a name="l00620"></a><span class="lineno">  620</span>       }</div>
-<div class="line"><a name="l00621"></a><span class="lineno">  621</span>     }</div>
-<div class="line"><a name="l00622"></a><span class="lineno">  622</span>     assert(trainingFeatures[iclass].size()==nctraining[iclass]+nctest[iclass]);</div>
-<div class="line"><a name="l00623"></a><span class="lineno">  623</span>   }</div>
-<div class="line"><a name="l00624"></a><span class="lineno">  624</span>     </div>
-<div class="line"><a name="l00625"></a><span class="lineno">  625</span>   costfactory.setNcTraining(nctraining);</div>
-<div class="line"><a name="l00626"></a><span class="lineno">  626</span>   costfactory.setNcTest(nctest);</div>
-<div class="line"><a name="l00627"></a><span class="lineno">  627</span>   <span class="keywordtype">int</span> nFeatures=trainingFeatures[0][0].size();</div>
-<div class="line"><a name="l00628"></a><span class="lineno">  628</span>   <span class="keywordtype">int</span> maxFeatures=(maxFeatures_opt[0])? maxFeatures_opt[0] : 1;</div>
-<div class="line"><a name="l00629"></a><span class="lineno">  629</span>   <span class="keywordtype">double</span> previousCost=-1;</div>
-<div class="line"><a name="l00630"></a><span class="lineno">  630</span>   <span class="keywordtype">double</span> cost=0;</div>
-<div class="line"><a name="l00631"></a><span class="lineno">  631</span>   list<int> subset;<span class="comment">//set of selected features (levels) for each class combination</span></div>
-<div class="line"><a name="l00632"></a><span class="lineno">  632</span>   <a class="code" href="classFeatureSelector.html">FeatureSelector</a> selector;</div>
-<div class="line"><a name="l00633"></a><span class="lineno">  633</span>   <span class="keywordflow">try</span>{</div>
-<div class="line"><a name="l00634"></a><span class="lineno">  634</span>     <span class="keywordflow">if</span>(maxFeatures>=nFeatures){</div>
-<div class="line"><a name="l00635"></a><span class="lineno">  635</span>       subset.clear();</div>
-<div class="line"><a name="l00636"></a><span class="lineno">  636</span>       <span class="keywordflow">for</span>(<span class="keywordtype">int</span> ifeature=0;ifeature<nFeatures;++ifeature)</div>
-<div class="line"><a name="l00637"></a><span class="lineno">  637</span>         subset.push_back(ifeature);</div>
-<div class="line"><a name="l00638"></a><span class="lineno">  638</span>       cost=costfactory.getCost(trainingFeatures);</div>
-<div class="line"><a name="l00639"></a><span class="lineno">  639</span>     }</div>
-<div class="line"><a name="l00640"></a><span class="lineno">  640</span>     <span class="keywordflow">else</span>{</div>
-<div class="line"><a name="l00641"></a><span class="lineno">  641</span>       <span class="keywordflow">while</span>(fabs(cost-previousCost)>=epsilon_cost_opt[0]){</div>
-<div class="line"><a name="l00642"></a><span class="lineno">  642</span>         previousCost=cost;</div>
-<div class="line"><a name="l00643"></a><span class="lineno">  643</span>         <span class="keywordflow">switch</span>(selMap[selector_opt[0]]){</div>
-<div class="line"><a name="l00644"></a><span class="lineno">  644</span>         <span class="keywordflow">case</span>(SFFS):</div>
-<div class="line"><a name="l00645"></a><span class="lineno">  645</span>           subset.clear();<span class="comment">//needed to clear in case of floating and brute force search</span></div>
-<div class="line"><a name="l00646"></a><span class="lineno">  646</span>           cost=selector.floating(trainingFeatures,costfactory,subset,maxFeatures,epsilon_cost_opt[0],verbose_opt[0]);</div>
-<div class="line"><a name="l00647"></a><span class="lineno">  647</span>           <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l00648"></a><span class="lineno">  648</span>         <span class="keywordflow">case</span>(SFS):</div>
-<div class="line"><a name="l00649"></a><span class="lineno">  649</span>           cost=selector.forward(trainingFeatures,costfactory,subset,maxFeatures,verbose_opt[0]);</div>
-<div class="line"><a name="l00650"></a><span class="lineno">  650</span>           <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l00651"></a><span class="lineno">  651</span>         <span class="keywordflow">case</span>(SBS):</div>
-<div class="line"><a name="l00652"></a><span class="lineno">  652</span>           cost=selector.backward(trainingFeatures,costfactory,subset,maxFeatures,verbose_opt[0]);</div>
-<div class="line"><a name="l00653"></a><span class="lineno">  653</span>           <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l00654"></a><span class="lineno">  654</span>         <span class="keywordflow">case</span>(BFS):</div>
-<div class="line"><a name="l00655"></a><span class="lineno">  655</span>           subset.clear();<span class="comment">//needed to clear in case of floating and brute force search</span></div>
-<div class="line"><a name="l00656"></a><span class="lineno">  656</span>           cost=selector.bruteForce(trainingFeatures,costfactory,subset,maxFeatures,verbose_opt[0]);</div>
-<div class="line"><a name="l00657"></a><span class="lineno">  657</span>           <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l00658"></a><span class="lineno">  658</span>         <span class="keywordflow">default</span>:</div>
-<div class="line"><a name="l00659"></a><span class="lineno">  659</span>           std::cout << <span class="stringliteral">"Error: selector not supported, please use sffs, sfs, sbs or bfs"</span> << std::endl;</div>
-<div class="line"><a name="l00660"></a><span class="lineno">  660</span>           exit(1);</div>
-<div class="line"><a name="l00661"></a><span class="lineno">  661</span>           <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l00662"></a><span class="lineno">  662</span>         }</div>
-<div class="line"><a name="l00663"></a><span class="lineno">  663</span>         <span class="keywordflow">if</span>(verbose_opt[0]>1){</div>
-<div class="line"><a name="l00664"></a><span class="lineno">  664</span>           std::cout << <span class="stringliteral">"cost: "</span> << cost << std::endl;</div>
-<div class="line"><a name="l00665"></a><span class="lineno">  665</span>           std::cout << <span class="stringliteral">"previousCost: "</span> << previousCost << std::endl;</div>
-<div class="line"><a name="l00666"></a><span class="lineno">  666</span>           std::cout << std::setprecision(12) << <span class="stringliteral">"cost-previousCost: "</span> << cost - previousCost << <span class="stringliteral">" ( "</span> << epsilon_cost_opt[0] << <span class="stringliteral">")"</span> << std::endl;</div>
-<div class="line"><a name="l00667"></a><span class="lineno">  667</span>         }</div>
-<div class="line"><a name="l00668"></a><span class="lineno">  668</span>         <span class="keywordflow">if</span>(!maxFeatures_opt[0])</div>
-<div class="line"><a name="l00669"></a><span class="lineno">  669</span>           ++maxFeatures;</div>
-<div class="line"><a name="l00670"></a><span class="lineno">  670</span>         <span class="keywordflow">else</span></div>
-<div class="line"><a name="l00671"></a><span class="lineno">  671</span>           <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l00672"></a><span class="lineno">  672</span>       }</div>
-<div class="line"><a name="l00673"></a><span class="lineno">  673</span>     }</div>
-<div class="line"><a name="l00674"></a><span class="lineno">  674</span>   }</div>
-<div class="line"><a name="l00675"></a><span class="lineno">  675</span>   <span class="keywordflow">catch</span>(...){</div>
-<div class="line"><a name="l00676"></a><span class="lineno">  676</span>     std::cout << <span class="stringliteral">"catched feature selection"</span> << std::endl;</div>
-<div class="line"><a name="l00677"></a><span class="lineno">  677</span>     exit(1);</div>
-<div class="line"><a name="l00678"></a><span class="lineno">  678</span>   }</div>
-<div class="line"><a name="l00679"></a><span class="lineno">  679</span> </div>
-<div class="line"><a name="l00680"></a><span class="lineno">  680</span>   <span class="keywordflow">if</span>(verbose_opt[0])</div>
-<div class="line"><a name="l00681"></a><span class="lineno">  681</span>     cout <<<span class="stringliteral">"cost: "</span> << cost << endl;</div>
-<div class="line"><a name="l00682"></a><span class="lineno">  682</span>   subset.sort();</div>
-<div class="line"><a name="l00683"></a><span class="lineno">  683</span>   <span class="keywordflow">for</span>(list<int>::const_iterator lit=subset.begin();lit!=subset.end();++lit)</div>
-<div class="line"><a name="l00684"></a><span class="lineno">  684</span>     std::cout << <span class="stringliteral">" -b "</span> << *lit;</div>
-<div class="line"><a name="l00685"></a><span class="lineno">  685</span>   std::cout << std::endl;</div>
-<div class="line"><a name="l00686"></a><span class="lineno">  686</span>     <span class="comment">// if((*(lit))!=subset.back())</span></div>
-<div class="line"><a name="l00687"></a><span class="lineno">  687</span>     <span class="comment">// else</span></div>
-<div class="line"><a name="l00688"></a><span class="lineno">  688</span>     <span class="comment">//   cout << endl;</span></div>
-<div class="line"><a name="l00689"></a><span class="lineno">  689</span> </div>
-<div class="line"><a name="l00690"></a><span class="lineno">  690</span>   <span class="comment">// *NOTE* Because svm_model contains pointers to svm_problem, you can</span></div>
-<div class="line"><a name="l00691"></a><span class="lineno">  691</span>   <span class="comment">// not free the memory used by svm_problem if you are still using the</span></div>
-<div class="line"><a name="l00692"></a><span class="lineno">  692</span>   <span class="comment">// svm_model produced by svm_train(). </span></div>
-<div class="line"><a name="l00693"></a><span class="lineno">  693</span> </div>
-<div class="line"><a name="l00694"></a><span class="lineno">  694</span>   <span class="comment">// free(prob.y);</span></div>
-<div class="line"><a name="l00695"></a><span class="lineno">  695</span>   <span class="comment">// free(prob.x);</span></div>
-<div class="line"><a name="l00696"></a><span class="lineno">  696</span>   <span class="comment">// free(x_space);</span></div>
-<div class="line"><a name="l00697"></a><span class="lineno">  697</span>   <span class="comment">// svm_destroy_param(&param);</span></div>
-<div class="line"><a name="l00698"></a><span class="lineno">  698</span>   <span class="keywordflow">return</span> 0;</div>
-<div class="line"><a name="l00699"></a><span class="lineno">  699</span> }</div>
-<div class="line"><a name="l00700"></a><span class="lineno">  700</span>                             </div>
+<div class="line"><a name="l00367"></a><span class="lineno">  367</span>   <span class="comment">//convert start and end band options to vector of band indexes</span></div>
+<div class="line"><a name="l00368"></a><span class="lineno">  368</span>   <span class="keywordflow">try</span>{</div>
+<div class="line"><a name="l00369"></a><span class="lineno">  369</span>     <span class="keywordflow">if</span>(bstart_opt.size()){</div>
+<div class="line"><a name="l00370"></a><span class="lineno">  370</span>       <span class="keywordflow">if</span>(bend_opt.size()!=bstart_opt.size()){</div>
+<div class="line"><a name="l00371"></a><span class="lineno">  371</span>     <span class="keywordtype">string</span> errorstring=<span class="stringliteral">"Error: options for start and end band indexes must be provided as pairs, missing end band"</span>;</div>
+<div class="line"><a name="l00372"></a><span class="lineno">  372</span>     <span class="keywordflow">throw</span>(errorstring);</div>
+<div class="line"><a name="l00373"></a><span class="lineno">  373</span>       }</div>
+<div class="line"><a name="l00374"></a><span class="lineno">  374</span>       band_opt.clear();</div>
+<div class="line"><a name="l00375"></a><span class="lineno">  375</span>       <span class="keywordflow">for</span>(<span class="keywordtype">int</span> ipair=0;ipair<bstart_opt.size();++ipair){</div>
+<div class="line"><a name="l00376"></a><span class="lineno">  376</span>     <span class="keywordflow">if</span>(bend_opt[ipair]<=bstart_opt[ipair]){</div>
+<div class="line"><a name="l00377"></a><span class="lineno">  377</span>       <span class="keywordtype">string</span> errorstring=<span class="stringliteral">"Error: index for end band must be smaller then start band"</span>;</div>
+<div class="line"><a name="l00378"></a><span class="lineno">  378</span>       <span class="keywordflow">throw</span>(errorstring);</div>
+<div class="line"><a name="l00379"></a><span class="lineno">  379</span>     }</div>
+<div class="line"><a name="l00380"></a><span class="lineno">  380</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iband=bstart_opt[ipair];iband<=bend_opt[ipair];++iband)</div>
+<div class="line"><a name="l00381"></a><span class="lineno">  381</span>       band_opt.push_back(iband);</div>
+<div class="line"><a name="l00382"></a><span class="lineno">  382</span>       }</div>
+<div class="line"><a name="l00383"></a><span class="lineno">  383</span>     }</div>
+<div class="line"><a name="l00384"></a><span class="lineno">  384</span>   }</div>
+<div class="line"><a name="l00385"></a><span class="lineno">  385</span>   <span class="keywordflow">catch</span>(<span class="keywordtype">string</span> error){</div>
+<div class="line"><a name="l00386"></a><span class="lineno">  386</span>     cerr << error << std::endl;</div>
+<div class="line"><a name="l00387"></a><span class="lineno">  387</span>     exit(1);</div>
+<div class="line"><a name="l00388"></a><span class="lineno">  388</span>   }</div>
+<div class="line"><a name="l00389"></a><span class="lineno">  389</span>   <span class="comment">//sort bands</span></div>
+<div class="line"><a name="l00390"></a><span class="lineno">  390</span>   <span class="keywordflow">if</span>(band_opt.size())</div>
+<div class="line"><a name="l00391"></a><span class="lineno">  391</span>     std::sort(band_opt.begin(),band_opt.end());</div>
+<div class="line"><a name="l00392"></a><span class="lineno">  392</span> </div>
+<div class="line"><a name="l00393"></a><span class="lineno">  393</span>   <span class="comment">// map<string,short> classValueMap;//global variable for now (due to getCost)</span></div>
+<div class="line"><a name="l00394"></a><span class="lineno">  394</span>   <span class="keywordflow">if</span>(classname_opt.size()){</div>
+<div class="line"><a name="l00395"></a><span class="lineno">  395</span>     assert(classname_opt.size()==classvalue_opt.size());</div>
+<div class="line"><a name="l00396"></a><span class="lineno">  396</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iclass=0;iclass<classname_opt.size();++iclass)</div>
+<div class="line"><a name="l00397"></a><span class="lineno">  397</span>       costfactory.setClassValueMap(classname_opt[iclass],classvalue_opt[iclass]);</div>
+<div class="line"><a name="l00398"></a><span class="lineno">  398</span>   }</div>
+<div class="line"><a name="l00399"></a><span class="lineno">  399</span>   <span class="comment">//----------------------------------- Training -------------------------------</span></div>
+<div class="line"><a name="l00400"></a><span class="lineno">  400</span>   vector<double> offset;</div>
+<div class="line"><a name="l00401"></a><span class="lineno">  401</span>   vector<double> scale;</div>
+<div class="line"><a name="l00402"></a><span class="lineno">  402</span>   vector< Vector2d<float> > trainingPixels;<span class="comment">//[class][sample][band]</span></div>
+<div class="line"><a name="l00403"></a><span class="lineno">  403</span>   vector< Vector2d<float> > testPixels;<span class="comment">//[class][sample][band]</span></div>
+<div class="line"><a name="l00404"></a><span class="lineno">  404</span>   map<string,Vector2d<float> > trainingMap;</div>
+<div class="line"><a name="l00405"></a><span class="lineno">  405</span>   map<string,Vector2d<float> > testMap;</div>
+<div class="line"><a name="l00406"></a><span class="lineno">  406</span>   vector<string> fields;</div>
+<div class="line"><a name="l00407"></a><span class="lineno">  407</span> </div>
+<div class="line"><a name="l00408"></a><span class="lineno">  408</span>   <span class="comment">//organize training data</span></div>
+<div class="line"><a name="l00409"></a><span class="lineno">  409</span>   trainingPixels.clear();</div>
+<div class="line"><a name="l00410"></a><span class="lineno">  410</span>   <span class="keywordflow">if</span>(verbose_opt[0]>=1)</div>
+<div class="line"><a name="l00411"></a><span class="lineno">  411</span>     std::cout << <span class="stringliteral">"reading imageVector file "</span> << training_opt[0] << std::endl;</div>
+<div class="line"><a name="l00412"></a><span class="lineno">  412</span>   <span class="keywordflow">try</span>{</div>
+<div class="line"><a name="l00413"></a><span class="lineno">  413</span>     <a class="code" href="classImgReaderOgr.html">ImgReaderOgr</a> trainingReader(training_opt[0]);</div>
+<div class="line"><a name="l00414"></a><span class="lineno">  414</span>     <span class="keywordflow">if</span>(band_opt.size()){</div>
+<div class="line"><a name="l00415"></a><span class="lineno">  415</span>       totalSamples=trainingReader.readDataImageOgr(trainingMap,fields,band_opt,label_opt[0],tlayer_opt,verbose_opt[0]);</div>
+<div class="line"><a name="l00416"></a><span class="lineno">  416</span>       <span class="keywordflow">if</span>(input_opt.size()){</div>
+<div class="line"><a name="l00417"></a><span class="lineno">  417</span>     <a class="code" href="classImgReaderOgr.html">ImgReaderOgr</a> inputReader(input_opt[0]);</div>
+<div class="line"><a name="l00418"></a><span class="lineno">  418</span>     totalTestSamples=trainingReader.readDataImageOgr(testMap,fields,band_opt,label_opt[0],tlayer_opt,verbose_opt[0]);</div>
+<div class="line"><a name="l00419"></a><span class="lineno">  419</span>     inputReader.close();</div>
+<div class="line"><a name="l00420"></a><span class="lineno">  420</span>       }</div>
+<div class="line"><a name="l00421"></a><span class="lineno">  421</span>     }</div>
+<div class="line"><a name="l00422"></a><span class="lineno">  422</span>     <span class="keywordflow">else</span>{</div>
+<div class="line"><a name="l00423"></a><span class="lineno">  423</span>       totalSamples=trainingReader.readDataImageOgr(trainingMap,fields,0,0,label_opt[0],tlayer_opt,verbose_opt[0]);</div>
+<div class="line"><a name="l00424"></a><span class="lineno">  424</span>       <span class="keywordflow">if</span>(input_opt.size()){</div>
+<div class="line"><a name="l00425"></a><span class="lineno">  425</span>     <a class="code" href="classImgReaderOgr.html">ImgReaderOgr</a> inputReader(input_opt[0]);</div>
+<div class="line"><a name="l00426"></a><span class="lineno">  426</span>     totalTestSamples=trainingReader.readDataImageOgr(testMap,fields,0,0,label_opt[0],tlayer_opt,verbose_opt[0]);</div>
+<div class="line"><a name="l00427"></a><span class="lineno">  427</span>     inputReader.close();</div>
+<div class="line"><a name="l00428"></a><span class="lineno">  428</span>       }</div>
+<div class="line"><a name="l00429"></a><span class="lineno">  429</span>     }</div>
+<div class="line"><a name="l00430"></a><span class="lineno">  430</span>     <span class="keywordflow">if</span>(trainingMap.size()<2){</div>
+<div class="line"><a name="l00431"></a><span class="lineno">  431</span>       <span class="keywordtype">string</span> errorstring=<span class="stringliteral">"Error: could not read at least two classes from training file"</span>;</div>
+<div class="line"><a name="l00432"></a><span class="lineno">  432</span>       <span class="keywordflow">throw</span>(errorstring);</div>
+<div class="line"><a name="l00433"></a><span class="lineno">  433</span>     }</div>
+<div class="line"><a name="l00434"></a><span class="lineno">  434</span>     <span class="keywordflow">if</span>(input_opt.size()&&testMap.size()<2){</div>
+<div class="line"><a name="l00435"></a><span class="lineno">  435</span>       <span class="keywordtype">string</span> errorstring=<span class="stringliteral">"Error: could not read at least two classes from test input file"</span>;</div>
+<div class="line"><a name="l00436"></a><span class="lineno">  436</span>       <span class="keywordflow">throw</span>(errorstring);</div>
+<div class="line"><a name="l00437"></a><span class="lineno">  437</span>     }</div>
+<div class="line"><a name="l00438"></a><span class="lineno">  438</span>     trainingReader.close();</div>
+<div class="line"><a name="l00439"></a><span class="lineno">  439</span>   }</div>
+<div class="line"><a name="l00440"></a><span class="lineno">  440</span>   <span class="keywordflow">catch</span>(<span class="keywordtype">string</span> error){</div>
+<div class="line"><a name="l00441"></a><span class="lineno">  441</span>     cerr << error << std::endl;</div>
+<div class="line"><a name="l00442"></a><span class="lineno">  442</span>     exit(1);</div>
+<div class="line"><a name="l00443"></a><span class="lineno">  443</span>   }</div>
+<div class="line"><a name="l00444"></a><span class="lineno">  444</span>   <span class="keywordflow">catch</span>(std::exception& e){</div>
+<div class="line"><a name="l00445"></a><span class="lineno">  445</span>     std::cerr << <span class="stringliteral">"Error: "</span>;</div>
+<div class="line"><a name="l00446"></a><span class="lineno">  446</span>     std::cerr << e.what() << std::endl;</div>
+<div class="line"><a name="l00447"></a><span class="lineno">  447</span>     std::cerr << CPLGetLastErrorMsg() << std::endl; </div>
+<div class="line"><a name="l00448"></a><span class="lineno">  448</span>     exit(1);</div>
+<div class="line"><a name="l00449"></a><span class="lineno">  449</span>   }</div>
+<div class="line"><a name="l00450"></a><span class="lineno">  450</span>   <span class="keywordflow">catch</span>(...){</div>
+<div class="line"><a name="l00451"></a><span class="lineno">  451</span>     cerr << <span class="stringliteral">"error catched"</span> << std::endl;</div>
+<div class="line"><a name="l00452"></a><span class="lineno">  452</span>     exit(1);</div>
+<div class="line"><a name="l00453"></a><span class="lineno">  453</span>   }</div>
+<div class="line"><a name="l00454"></a><span class="lineno">  454</span>   <span class="comment">//delete class 0 ?</span></div>
+<div class="line"><a name="l00455"></a><span class="lineno">  455</span>   <span class="comment">// if(verbose_opt[0]>=1)</span></div>
+<div class="line"><a name="l00456"></a><span class="lineno">  456</span>   <span class="comment">//   std::cout << "erasing class 0 from training set (" << trainingMap[0].size() << " from " << totalSamples << ") samples" << std::endl;</span></div>
+<div class="line"><a name="l00457"></a><span class="lineno">  457</span>   <span class="comment">// totalSamples-=trainingMap[0].size();</span></div>
+<div class="line"><a name="l00458"></a><span class="lineno">  458</span>   <span class="comment">// trainingMap.erase(0);</span></div>
+<div class="line"><a name="l00459"></a><span class="lineno">  459</span>   <span class="comment">//convert map to vector</span></div>
+<div class="line"><a name="l00460"></a><span class="lineno">  460</span> </div>
+<div class="line"><a name="l00461"></a><span class="lineno">  461</span>   <span class="keywordflow">if</span>(verbose_opt[0]>1)</div>
+<div class="line"><a name="l00462"></a><span class="lineno">  462</span>     std::cout << <span class="stringliteral">"training pixels: "</span> << std::endl;</div>
+<div class="line"><a name="l00463"></a><span class="lineno">  463</span>   map<string,Vector2d<float> >::iterator mapit=trainingMap.begin();</div>
+<div class="line"><a name="l00464"></a><span class="lineno">  464</span>   <span class="keywordflow">while</span>(mapit!=trainingMap.end()){</div>
+<div class="line"><a name="l00465"></a><span class="lineno">  465</span>     <span class="comment">// if(classValueMap.size()){</span></div>
+<div class="line"><a name="l00466"></a><span class="lineno">  466</span>     <span class="comment">//   //check if name in training is covered by classname_opt (values can not be 0)</span></div>
+<div class="line"><a name="l00467"></a><span class="lineno">  467</span>     <span class="comment">//   if(classValueMap[mapit->first]>0){</span></div>
+<div class="line"><a name="l00468"></a><span class="lineno">  468</span>     <span class="comment">//  if(verbose_opt[0])</span></div>
+<div class="line"><a name="l00469"></a><span class="lineno">  469</span>     <span class="comment">//    std::cout << mapit->first << " -> " << classValueMap[mapit->first] << std::endl;</span></div>
+<div class="line"><a name="l00470"></a><span class="lineno">  470</span>     <span class="comment">//   }</span></div>
+<div class="line"><a name="l00471"></a><span class="lineno">  471</span>     <span class="comment">//   else{</span></div>
+<div class="line"><a name="l00472"></a><span class="lineno">  472</span>     <span class="comment">//  std::cerr << "Error: names in classname option are not complete, please check names in training vector and make sure classvalue is > 0" << std::endl;</span></div>
+<div class="line"><a name="l00473"></a><span class="lineno">  473</span>     <span class="comment">//  exit(1);</span></div>
+<div class="line"><a name="l00474"></a><span class="lineno">  474</span>     <span class="comment">//   }</span></div>
+<div class="line"><a name="l00475"></a><span class="lineno">  475</span>     <span class="comment">// }    </span></div>
+<div class="line"><a name="l00476"></a><span class="lineno">  476</span>     <span class="comment">//delete small classes</span></div>
+<div class="line"><a name="l00477"></a><span class="lineno">  477</span>     <span class="keywordflow">if</span>((mapit->second).size()<minSize_opt[0]){</div>
+<div class="line"><a name="l00478"></a><span class="lineno">  478</span>       trainingMap.erase(mapit);</div>
+<div class="line"><a name="l00479"></a><span class="lineno">  479</span>       <span class="keywordflow">continue</span>;</div>
+<div class="line"><a name="l00480"></a><span class="lineno">  480</span>     }</div>
+<div class="line"><a name="l00481"></a><span class="lineno">  481</span>     trainingPixels.push_back(mapit->second);</div>
+<div class="line"><a name="l00482"></a><span class="lineno">  482</span>     <span class="keywordflow">if</span>(verbose_opt[0]>1)</div>
+<div class="line"><a name="l00483"></a><span class="lineno">  483</span>       std::cout << mapit->first << <span class="stringliteral">": "</span> << (mapit->second).size() << <span class="stringliteral">" samples"</span> << std::endl;</div>
+<div class="line"><a name="l00484"></a><span class="lineno">  484</span>     ++mapit;</div>
+<div class="line"><a name="l00485"></a><span class="lineno">  485</span>   }</div>
+<div class="line"><a name="l00486"></a><span class="lineno">  486</span>   nclass=trainingPixels.size();</div>
+<div class="line"><a name="l00487"></a><span class="lineno">  487</span>   <span class="keywordflow">if</span>(classname_opt.size())</div>
+<div class="line"><a name="l00488"></a><span class="lineno">  488</span>     assert(nclass==classname_opt.size());</div>
+<div class="line"><a name="l00489"></a><span class="lineno">  489</span>   nband=trainingPixels[0][0].size()-2;<span class="comment">//X and Y//trainingPixels[0][0].size();</span></div>
+<div class="line"><a name="l00490"></a><span class="lineno">  490</span> </div>
+<div class="line"><a name="l00491"></a><span class="lineno">  491</span>   mapit=testMap.begin();</div>
+<div class="line"><a name="l00492"></a><span class="lineno">  492</span>   <span class="keywordflow">while</span>(mapit!=testMap.end()){</div>
+<div class="line"><a name="l00493"></a><span class="lineno">  493</span>     <span class="comment">//no need to delete small classes for test sample</span></div>
+<div class="line"><a name="l00494"></a><span class="lineno">  494</span>     testPixels.push_back(mapit->second);</div>
+<div class="line"><a name="l00495"></a><span class="lineno">  495</span>     <span class="keywordflow">if</span>(verbose_opt[0]>1)</div>
+<div class="line"><a name="l00496"></a><span class="lineno">  496</span>       std::cout << mapit->first << <span class="stringliteral">": "</span> << (mapit->second).size() << <span class="stringliteral">" samples"</span> << std::endl;</div>
+<div class="line"><a name="l00497"></a><span class="lineno">  497</span>     ++mapit;</div>
+<div class="line"><a name="l00498"></a><span class="lineno">  498</span>   }</div>
+<div class="line"><a name="l00499"></a><span class="lineno">  499</span>   <span class="keywordflow">if</span>(input_opt.size()){</div>
+<div class="line"><a name="l00500"></a><span class="lineno">  500</span>     assert(nclass==testPixels.size());</div>
+<div class="line"><a name="l00501"></a><span class="lineno">  501</span>     assert(nband=testPixels[0][0].size()-2);<span class="comment">//X and Y//testPixels[0][0].size();</span></div>
+<div class="line"><a name="l00502"></a><span class="lineno">  502</span>     assert(!cv_opt[0]);</div>
+<div class="line"><a name="l00503"></a><span class="lineno">  503</span>   }</div>
+<div class="line"><a name="l00504"></a><span class="lineno">  504</span> </div>
+<div class="line"><a name="l00505"></a><span class="lineno">  505</span>   <span class="comment">//do not remove outliers here: could easily be obtained through ogr2ogr -where 'B2<110' output.shp input.shp</span></div>
+<div class="line"><a name="l00506"></a><span class="lineno">  506</span>   <span class="comment">//balance training data</span></div>
+<div class="line"><a name="l00507"></a><span class="lineno">  507</span>   <span class="keywordflow">if</span>(balance_opt[0]>0){</div>
+<div class="line"><a name="l00508"></a><span class="lineno">  508</span>     <span class="keywordflow">if</span>(random_opt[0])</div>
+<div class="line"><a name="l00509"></a><span class="lineno">  509</span>       srand(time(NULL));</div>
+<div class="line"><a name="l00510"></a><span class="lineno">  510</span>     totalSamples=0;</div>
+<div class="line"><a name="l00511"></a><span class="lineno">  511</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iclass=0;iclass<nclass;++iclass){</div>
+<div class="line"><a name="l00512"></a><span class="lineno">  512</span>       <span class="keywordflow">if</span>(trainingPixels[iclass].size()>balance_opt[0]){</div>
+<div class="line"><a name="l00513"></a><span class="lineno">  513</span>         <span class="keywordflow">while</span>(trainingPixels[iclass].size()>balance_opt[0]){</div>
+<div class="line"><a name="l00514"></a><span class="lineno">  514</span>           <span class="keywordtype">int</span> index=rand()%trainingPixels[iclass].size();</div>
+<div class="line"><a name="l00515"></a><span class="lineno">  515</span>           trainingPixels[iclass].erase(trainingPixels[iclass].begin()+index);</div>
+<div class="line"><a name="l00516"></a><span class="lineno">  516</span>         }</div>
+<div class="line"><a name="l00517"></a><span class="lineno">  517</span>       }</div>
+<div class="line"><a name="l00518"></a><span class="lineno">  518</span>       <span class="keywordflow">else</span>{</div>
+<div class="line"><a name="l00519"></a><span class="lineno">  519</span>         <span class="keywordtype">int</span> oldsize=trainingPixels[iclass].size();</div>
+<div class="line"><a name="l00520"></a><span class="lineno">  520</span>         <span class="keywordflow">for</span>(<span class="keywordtype">int</span> isample=trainingPixels[iclass].size();isample<balance_opt[0];++isample){</div>
+<div class="line"><a name="l00521"></a><span class="lineno">  521</span>           <span class="keywordtype">int</span> index = rand()%oldsize;</div>
+<div class="line"><a name="l00522"></a><span class="lineno">  522</span>           trainingPixels[iclass].push_back(trainingPixels[iclass][index]);</div>
+<div class="line"><a name="l00523"></a><span class="lineno">  523</span>         }</div>
+<div class="line"><a name="l00524"></a><span class="lineno">  524</span>       }</div>
+<div class="line"><a name="l00525"></a><span class="lineno">  525</span>       totalSamples+=trainingPixels[iclass].size();</div>
+<div class="line"><a name="l00526"></a><span class="lineno">  526</span>     }</div>
+<div class="line"><a name="l00527"></a><span class="lineno">  527</span>     assert(totalSamples==nclass*balance_opt[0]);</div>
+<div class="line"><a name="l00528"></a><span class="lineno">  528</span>   }</div>
+<div class="line"><a name="l00529"></a><span class="lineno">  529</span>     </div>
+<div class="line"><a name="l00530"></a><span class="lineno">  530</span>   <span class="comment">//set scale and offset</span></div>
+<div class="line"><a name="l00531"></a><span class="lineno">  531</span>   offset.resize(nband);</div>
+<div class="line"><a name="l00532"></a><span class="lineno">  532</span>   scale.resize(nband);</div>
+<div class="line"><a name="l00533"></a><span class="lineno">  533</span>   <span class="keywordflow">if</span>(offset_opt.size()>1)</div>
+<div class="line"><a name="l00534"></a><span class="lineno">  534</span>     assert(offset_opt.size()==nband);</div>
+<div class="line"><a name="l00535"></a><span class="lineno">  535</span>   <span class="keywordflow">if</span>(scale_opt.size()>1)</div>
+<div class="line"><a name="l00536"></a><span class="lineno">  536</span>     assert(scale_opt.size()==nband);</div>
+<div class="line"><a name="l00537"></a><span class="lineno">  537</span>   <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iband=0;iband<nband;++iband){</div>
+<div class="line"><a name="l00538"></a><span class="lineno">  538</span>     <span class="keywordflow">if</span>(verbose_opt[0]>1)</div>
+<div class="line"><a name="l00539"></a><span class="lineno">  539</span>       std::cout << <span class="stringliteral">"scaling for band"</span> << iband << std::endl;</div>
+<div class="line"><a name="l00540"></a><span class="lineno">  540</span>     offset[iband]=(offset_opt.size()==1)?offset_opt[0]:offset_opt[iband];</div>
+<div class="line"><a name="l00541"></a><span class="lineno">  541</span>     scale[iband]=(scale_opt.size()==1)?scale_opt[0]:scale_opt[iband];</div>
+<div class="line"><a name="l00542"></a><span class="lineno">  542</span>     <span class="comment">//search for min and maximum</span></div>
+<div class="line"><a name="l00543"></a><span class="lineno">  543</span>     <span class="keywordflow">if</span>(scale[iband]<=0){</div>
+<div class="line"><a name="l00544"></a><span class="lineno">  544</span>       <span class="keywordtype">float</span> theMin=trainingPixels[0][0][iband+startBand];</div>
+<div class="line"><a name="l00545"></a><span class="lineno">  545</span>       <span class="keywordtype">float</span> theMax=trainingPixels[0][0][iband+startBand];</div>
+<div class="line"><a name="l00546"></a><span class="lineno">  546</span>       <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iclass=0;iclass<nclass;++iclass){</div>
+<div class="line"><a name="l00547"></a><span class="lineno">  547</span>         <span class="keywordflow">for</span>(<span class="keywordtype">int</span> isample=0;isample<trainingPixels[iclass].size();++isample){</div>
+<div class="line"><a name="l00548"></a><span class="lineno">  548</span>           <span class="keywordflow">if</span>(theMin>trainingPixels[iclass][isample][iband+startBand])</div>
+<div class="line"><a name="l00549"></a><span class="lineno">  549</span>             theMin=trainingPixels[iclass][isample][iband+startBand];</div>
+<div class="line"><a name="l00550"></a><span class="lineno">  550</span>           <span class="keywordflow">if</span>(theMax<trainingPixels[iclass][isample][iband+startBand])</div>
+<div class="line"><a name="l00551"></a><span class="lineno">  551</span>             theMax=trainingPixels[iclass][isample][iband+startBand];</div>
+<div class="line"><a name="l00552"></a><span class="lineno">  552</span>         }</div>
+<div class="line"><a name="l00553"></a><span class="lineno">  553</span>       }</div>
+<div class="line"><a name="l00554"></a><span class="lineno">  554</span>       offset[iband]=theMin+(theMax-theMin)/2.0;</div>
+<div class="line"><a name="l00555"></a><span class="lineno">  555</span>       scale[iband]=(theMax-theMin)/2.0;</div>
+<div class="line"><a name="l00556"></a><span class="lineno">  556</span>       <span class="keywordflow">if</span>(verbose_opt[0]>1){</div>
+<div class="line"><a name="l00557"></a><span class="lineno">  557</span>         std::cout << <span class="stringliteral">"Extreme image values for band "</span> << iband << <span class="stringliteral">": ["</span> << theMin << <span class="stringliteral">","</span> << theMax << <span class="stringliteral">"]"</span> << std::endl;</div>
+<div class="line"><a name="l00558"></a><span class="lineno">  558</span>         std::cout << <span class="stringliteral">"Using offset, scale: "</span> << offset[iband] << <span class="stringliteral">", "</span> << scale[iband] << std::endl;</div>
+<div class="line"><a name="l00559"></a><span class="lineno">  559</span>         std::cout << <span class="stringliteral">"scaled values for band "</span> << iband << <span class="stringliteral">": ["</span> << (theMin-offset[iband])/scale[iband] << <span class="stringliteral">","</span> << (theMax-offset[iband])/scale[iband] << <span class="stringliteral">"]"</span> << std::endl;</div>
+<div class="line"><a name="l00560"></a><span class="lineno">  560</span>       }</div>
+<div class="line"><a name="l00561"></a><span class="lineno">  561</span>     }</div>
+<div class="line"><a name="l00562"></a><span class="lineno">  562</span>   }</div>
+<div class="line"><a name="l00563"></a><span class="lineno">  563</span> </div>
+<div class="line"><a name="l00564"></a><span class="lineno">  564</span>   <span class="comment">// if(priors_opt.size()==1){//default: equal priors for each class</span></div>
+<div class="line"><a name="l00565"></a><span class="lineno">  565</span>   <span class="comment">//   priors.resize(nclass);</span></div>
+<div class="line"><a name="l00566"></a><span class="lineno">  566</span>   <span class="comment">//   for(int iclass=0;iclass<nclass;++iclass)</span></div>
+<div class="line"><a name="l00567"></a><span class="lineno">  567</span>   <span class="comment">//     priors[iclass]=1.0/nclass;</span></div>
+<div class="line"><a name="l00568"></a><span class="lineno">  568</span>   <span class="comment">// }</span></div>
+<div class="line"><a name="l00569"></a><span class="lineno">  569</span>   <span class="comment">// assert(priors_opt.size()==1||priors_opt.size()==nclass);</span></div>
+<div class="line"><a name="l00570"></a><span class="lineno">  570</span>     </div>
+<div class="line"><a name="l00571"></a><span class="lineno">  571</span>   <span class="keywordflow">if</span>(verbose_opt[0]>=1){</div>
+<div class="line"><a name="l00572"></a><span class="lineno">  572</span>     std::cout << <span class="stringliteral">"number of bands: "</span> << nband << std::endl;</div>
+<div class="line"><a name="l00573"></a><span class="lineno">  573</span>     std::cout << <span class="stringliteral">"number of classes: "</span> << nclass << std::endl;</div>
+<div class="line"><a name="l00574"></a><span class="lineno">  574</span>     <span class="comment">// std::cout << "priors:";</span></div>
+<div class="line"><a name="l00575"></a><span class="lineno">  575</span>     <span class="comment">// for(int iclass=0;iclass<nclass;++iclass)</span></div>
+<div class="line"><a name="l00576"></a><span class="lineno">  576</span>     <span class="comment">//   std::cout << " " << priors[iclass];</span></div>
+<div class="line"><a name="l00577"></a><span class="lineno">  577</span>     <span class="comment">// std::cout << std::endl;</span></div>
+<div class="line"><a name="l00578"></a><span class="lineno">  578</span>   }</div>
+<div class="line"><a name="l00579"></a><span class="lineno">  579</span> </div>
+<div class="line"><a name="l00580"></a><span class="lineno">  580</span>   <span class="comment">//set names in confusion matrix using nameVector</span></div>
+<div class="line"><a name="l00581"></a><span class="lineno">  581</span>   vector<string> nameVector=costfactory.getNameVector();</div>
+<div class="line"><a name="l00582"></a><span class="lineno">  582</span>   <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iname=0;iname<nameVector.size();++iname){</div>
+<div class="line"><a name="l00583"></a><span class="lineno">  583</span>     <span class="keywordflow">if</span>(costfactory.getClassValueMap().empty())</div>
+<div class="line"><a name="l00584"></a><span class="lineno">  584</span>       costfactory.pushBackClassName(nameVector[iname]);</div>
+<div class="line"><a name="l00585"></a><span class="lineno">  585</span>       <span class="comment">// cm.pushBackClassName(nameVector[iname]);</span></div>
+<div class="line"><a name="l00586"></a><span class="lineno">  586</span>     <span class="keywordflow">else</span> <span class="keywordflow">if</span>(costfactory.getClassIndex(type2string<short>((costfactory.getClassValueMap())[nameVector[iname]]))<0)</div>
+<div class="line"><a name="l00587"></a><span class="lineno">  587</span>       costfactory.pushBackClassName(type2string<short>((costfactory.getClassValueMap())[nameVector[iname]]));</div>
+<div class="line"><a name="l00588"></a><span class="lineno">  588</span>   }</div>
+<div class="line"><a name="l00589"></a><span class="lineno">  589</span> </div>
+<div class="line"><a name="l00590"></a><span class="lineno">  590</span>   <span class="comment">// if(classname_opt.empty()){</span></div>
+<div class="line"><a name="l00591"></a><span class="lineno">  591</span>   <span class="comment">//   for(int iclass=0;iclass<nclass;++iclass){</span></div>
+<div class="line"><a name="l00592"></a><span class="lineno">  592</span>   <span class="comment">//     if(verbose_opt[0])</span></div>
+<div class="line"><a name="l00593"></a><span class="lineno">  593</span>   <span class="comment">//    std::cout << iclass << " " << cm.getClass(iclass) << " -> " << string2type<short>(cm.getClass(iclass)) << std::endl;</span></div>
+<div class="line"><a name="l00594"></a><span class="lineno">  594</span>   <span class="comment">//     classValueMap[cm.getClass(iclass)]=string2type<short>(cm.getClass(iclass));</span></div>
+<div class="line"><a name="l00595"></a><span class="lineno">  595</span>   <span class="comment">//   }</span></div>
+<div class="line"><a name="l00596"></a><span class="lineno">  596</span>   <span class="comment">// }</span></div>
+<div class="line"><a name="l00597"></a><span class="lineno">  597</span> </div>
+<div class="line"><a name="l00598"></a><span class="lineno">  598</span>   <span class="comment">//Calculate features of trainig set</span></div>
+<div class="line"><a name="l00599"></a><span class="lineno">  599</span> </div>
+<div class="line"><a name="l00600"></a><span class="lineno">  600</span>   vector<unsigned int> nctraining;</div>
+<div class="line"><a name="l00601"></a><span class="lineno">  601</span>   vector<unsigned int> nctest;</div>
+<div class="line"><a name="l00602"></a><span class="lineno">  602</span>   nctraining.resize(nclass);</div>
+<div class="line"><a name="l00603"></a><span class="lineno">  603</span>   nctest.resize(nclass);</div>
+<div class="line"><a name="l00604"></a><span class="lineno">  604</span>   vector< Vector2d<float> > trainingFeatures(nclass);</div>
+<div class="line"><a name="l00605"></a><span class="lineno">  605</span>   <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iclass=0;iclass<nclass;++iclass){</div>
+<div class="line"><a name="l00606"></a><span class="lineno">  606</span>     <span class="keywordflow">if</span>(verbose_opt[0]>=1)</div>
+<div class="line"><a name="l00607"></a><span class="lineno">  607</span>       std::cout << <span class="stringliteral">"calculating features for class "</span> << iclass << std::endl;</div>
+<div class="line"><a name="l00608"></a><span class="lineno">  608</span>     nctraining[iclass]=trainingPixels[iclass].size();</div>
+<div class="line"><a name="l00609"></a><span class="lineno">  609</span>     <span class="keywordflow">if</span>(verbose_opt[0]>=1)</div>
+<div class="line"><a name="l00610"></a><span class="lineno">  610</span>       std::cout << <span class="stringliteral">"nctraining["</span> << iclass << <span class="stringliteral">"]: "</span> << nctraining[iclass] << std::endl;</div>
+<div class="line"><a name="l00611"></a><span class="lineno">  611</span>     <span class="keywordflow">if</span>(testPixels.size()>iclass){</div>
+<div class="line"><a name="l00612"></a><span class="lineno">  612</span>       nctest[iclass]=testPixels[iclass].size();</div>
+<div class="line"><a name="l00613"></a><span class="lineno">  613</span>       <span class="keywordflow">if</span>(verbose_opt[0]>=1){</div>
+<div class="line"><a name="l00614"></a><span class="lineno">  614</span>     std::cout << <span class="stringliteral">"nctest["</span> << iclass << <span class="stringliteral">"]: "</span> << nctest[iclass] << std::endl;</div>
+<div class="line"><a name="l00615"></a><span class="lineno">  615</span>       }</div>
+<div class="line"><a name="l00616"></a><span class="lineno">  616</span>     }</div>
+<div class="line"><a name="l00617"></a><span class="lineno">  617</span>     <span class="keywordflow">else</span></div>
+<div class="line"><a name="l00618"></a><span class="lineno">  618</span>       nctest[iclass]=0;</div>
+<div class="line"><a name="l00619"></a><span class="lineno">  619</span>       </div>
+<div class="line"><a name="l00620"></a><span class="lineno">  620</span>     trainingFeatures[iclass].resize(nctraining[iclass]+nctest[iclass]);</div>
+<div class="line"><a name="l00621"></a><span class="lineno">  621</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> isample=0;isample<nctraining[iclass];++isample){</div>
+<div class="line"><a name="l00622"></a><span class="lineno">  622</span>       <span class="comment">//scale pixel values according to scale and offset!!!</span></div>
+<div class="line"><a name="l00623"></a><span class="lineno">  623</span>       <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iband=0;iband<nband;++iband){</div>
+<div class="line"><a name="l00624"></a><span class="lineno">  624</span>         assert(trainingPixels[iclass].size()>isample);</div>
+<div class="line"><a name="l00625"></a><span class="lineno">  625</span>         assert(trainingPixels[iclass][isample].size()>iband+startBand);</div>
+<div class="line"><a name="l00626"></a><span class="lineno">  626</span>         assert(offset.size()>iband);</div>
+<div class="line"><a name="l00627"></a><span class="lineno">  627</span>         assert(scale.size()>iband);</div>
+<div class="line"><a name="l00628"></a><span class="lineno">  628</span>         <span class="keywordtype">float</span> value=trainingPixels[iclass][isample][iband+startBand];</div>
+<div class="line"><a name="l00629"></a><span class="lineno">  629</span>         trainingFeatures[iclass][isample].push_back((value-offset[iband])/scale[iband]);</div>
+<div class="line"><a name="l00630"></a><span class="lineno">  630</span>       }</div>
+<div class="line"><a name="l00631"></a><span class="lineno">  631</span>     }</div>
+<div class="line"><a name="l00632"></a><span class="lineno">  632</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> isample=0;isample<nctest[iclass];++isample){</div>
+<div class="line"><a name="l00633"></a><span class="lineno">  633</span>       <span class="comment">//scale pixel values according to scale and offset!!!</span></div>
+<div class="line"><a name="l00634"></a><span class="lineno">  634</span>       <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iband=0;iband<nband;++iband){</div>
+<div class="line"><a name="l00635"></a><span class="lineno">  635</span>         assert(testPixels[iclass].size()>isample);</div>
+<div class="line"><a name="l00636"></a><span class="lineno">  636</span>         assert(testPixels[iclass][isample].size()>iband+startBand);</div>
+<div class="line"><a name="l00637"></a><span class="lineno">  637</span>         assert(offset.size()>iband);</div>
+<div class="line"><a name="l00638"></a><span class="lineno">  638</span>         assert(scale.size()>iband);</div>
+<div class="line"><a name="l00639"></a><span class="lineno">  639</span>         <span class="keywordtype">float</span> value=testPixels[iclass][isample][iband+startBand];</div>
+<div class="line"><a name="l00640"></a><span class="lineno">  640</span>         <span class="comment">// testFeatures[iclass][isample].push_back((value-offset[iband])/scale[iband]);</span></div>
+<div class="line"><a name="l00641"></a><span class="lineno">  641</span>         trainingFeatures[iclass][nctraining[iclass]+isample].push_back((value-offset[iband])/scale[iband]);</div>
+<div class="line"><a name="l00642"></a><span class="lineno">  642</span>       }</div>
+<div class="line"><a name="l00643"></a><span class="lineno">  643</span>     }</div>
+<div class="line"><a name="l00644"></a><span class="lineno">  644</span>     assert(trainingFeatures[iclass].size()==nctraining[iclass]+nctest[iclass]);</div>
+<div class="line"><a name="l00645"></a><span class="lineno">  645</span>   }</div>
+<div class="line"><a name="l00646"></a><span class="lineno">  646</span>     </div>
+<div class="line"><a name="l00647"></a><span class="lineno">  647</span>   costfactory.setNcTraining(nctraining);</div>
+<div class="line"><a name="l00648"></a><span class="lineno">  648</span>   costfactory.setNcTest(nctest);</div>
+<div class="line"><a name="l00649"></a><span class="lineno">  649</span>   <span class="keywordtype">int</span> nFeatures=trainingFeatures[0][0].size();</div>
+<div class="line"><a name="l00650"></a><span class="lineno">  650</span>   <span class="keywordtype">int</span> maxFeatures=(maxFeatures_opt[0])? maxFeatures_opt[0] : 1;</div>
+<div class="line"><a name="l00651"></a><span class="lineno">  651</span>   <span class="keywordtype">double</span> previousCost=-1;</div>
+<div class="line"><a name="l00652"></a><span class="lineno">  652</span>   <span class="keywordtype">double</span> cost=0;</div>
+<div class="line"><a name="l00653"></a><span class="lineno">  653</span>   list<int> subset;<span class="comment">//set of selected features (levels) for each class combination</span></div>
+<div class="line"><a name="l00654"></a><span class="lineno">  654</span>   <a class="code" href="classFeatureSelector.html">FeatureSelector</a> selector;</div>
+<div class="line"><a name="l00655"></a><span class="lineno">  655</span>   <span class="keywordflow">try</span>{</div>
+<div class="line"><a name="l00656"></a><span class="lineno">  656</span>     <span class="keywordflow">if</span>(maxFeatures>=nFeatures){</div>
+<div class="line"><a name="l00657"></a><span class="lineno">  657</span>       subset.clear();</div>
+<div class="line"><a name="l00658"></a><span class="lineno">  658</span>       <span class="keywordflow">for</span>(<span class="keywordtype">int</span> ifeature=0;ifeature<nFeatures;++ifeature)</div>
+<div class="line"><a name="l00659"></a><span class="lineno">  659</span>         subset.push_back(ifeature);</div>
+<div class="line"><a name="l00660"></a><span class="lineno">  660</span>       cost=costfactory.getCost(trainingFeatures);</div>
+<div class="line"><a name="l00661"></a><span class="lineno">  661</span>     }</div>
+<div class="line"><a name="l00662"></a><span class="lineno">  662</span>     <span class="keywordflow">else</span>{</div>
+<div class="line"><a name="l00663"></a><span class="lineno">  663</span>       <span class="keywordflow">while</span>(fabs(cost-previousCost)>=epsilon_cost_opt[0]){</div>
+<div class="line"><a name="l00664"></a><span class="lineno">  664</span>         previousCost=cost;</div>
+<div class="line"><a name="l00665"></a><span class="lineno">  665</span>         <span class="keywordflow">switch</span>(selMap[selector_opt[0]]){</div>
+<div class="line"><a name="l00666"></a><span class="lineno">  666</span>         <span class="keywordflow">case</span>(SFFS):</div>
+<div class="line"><a name="l00667"></a><span class="lineno">  667</span>           subset.clear();<span class="comment">//needed to clear in case of floating and brute force search</span></div>
+<div class="line"><a name="l00668"></a><span class="lineno">  668</span>           cost=selector.floating(trainingFeatures,costfactory,subset,maxFeatures,epsilon_cost_opt[0],verbose_opt[0]);</div>
+<div class="line"><a name="l00669"></a><span class="lineno">  669</span>           <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l00670"></a><span class="lineno">  670</span>         <span class="keywordflow">case</span>(SFS):</div>
+<div class="line"><a name="l00671"></a><span class="lineno">  671</span>           cost=selector.forward(trainingFeatures,costfactory,subset,maxFeatures,verbose_opt[0]);</div>
+<div class="line"><a name="l00672"></a><span class="lineno">  672</span>           <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l00673"></a><span class="lineno">  673</span>         <span class="keywordflow">case</span>(SBS):</div>
+<div class="line"><a name="l00674"></a><span class="lineno">  674</span>           cost=selector.backward(trainingFeatures,costfactory,subset,maxFeatures,verbose_opt[0]);</div>
+<div class="line"><a name="l00675"></a><span class="lineno">  675</span>           <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l00676"></a><span class="lineno">  676</span>         <span class="keywordflow">case</span>(BFS):</div>
+<div class="line"><a name="l00677"></a><span class="lineno">  677</span>           subset.clear();<span class="comment">//needed to clear in case of floating and brute force search</span></div>
+<div class="line"><a name="l00678"></a><span class="lineno">  678</span>           cost=selector.bruteForce(trainingFeatures,costfactory,subset,maxFeatures,verbose_opt[0]);</div>
+<div class="line"><a name="l00679"></a><span class="lineno">  679</span>           <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l00680"></a><span class="lineno">  680</span>         <span class="keywordflow">default</span>:</div>
+<div class="line"><a name="l00681"></a><span class="lineno">  681</span>           std::cout << <span class="stringliteral">"Error: selector not supported, please use sffs, sfs, sbs or bfs"</span> << std::endl;</div>
+<div class="line"><a name="l00682"></a><span class="lineno">  682</span>           exit(1);</div>
+<div class="line"><a name="l00683"></a><span class="lineno">  683</span>           <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l00684"></a><span class="lineno">  684</span>         }</div>
+<div class="line"><a name="l00685"></a><span class="lineno">  685</span>         <span class="keywordflow">if</span>(verbose_opt[0]>1){</div>
+<div class="line"><a name="l00686"></a><span class="lineno">  686</span>           std::cout << <span class="stringliteral">"cost: "</span> << cost << std::endl;</div>
+<div class="line"><a name="l00687"></a><span class="lineno">  687</span>           std::cout << <span class="stringliteral">"previousCost: "</span> << previousCost << std::endl;</div>
+<div class="line"><a name="l00688"></a><span class="lineno">  688</span>           std::cout << std::setprecision(12) << <span class="stringliteral">"cost-previousCost: "</span> << cost - previousCost << <span class="stringliteral">" ( "</span> << epsilon_cost_opt[0] << <span class="stringliteral">")"</span> << std::endl;</div>
+<div class="line"><a name="l00689"></a><span class="lineno">  689</span>         }</div>
+<div class="line"><a name="l00690"></a><span class="lineno">  690</span>         <span class="keywordflow">if</span>(!maxFeatures_opt[0])</div>
+<div class="line"><a name="l00691"></a><span class="lineno">  691</span>           ++maxFeatures;</div>
+<div class="line"><a name="l00692"></a><span class="lineno">  692</span>         <span class="keywordflow">else</span></div>
+<div class="line"><a name="l00693"></a><span class="lineno">  693</span>           <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l00694"></a><span class="lineno">  694</span>       }</div>
+<div class="line"><a name="l00695"></a><span class="lineno">  695</span>     }</div>
+<div class="line"><a name="l00696"></a><span class="lineno">  696</span>   }</div>
+<div class="line"><a name="l00697"></a><span class="lineno">  697</span>   <span class="keywordflow">catch</span>(...){</div>
+<div class="line"><a name="l00698"></a><span class="lineno">  698</span>     std::cout << <span class="stringliteral">"catched feature selection"</span> << std::endl;</div>
+<div class="line"><a name="l00699"></a><span class="lineno">  699</span>     exit(1);</div>
+<div class="line"><a name="l00700"></a><span class="lineno">  700</span>   }</div>
+<div class="line"><a name="l00701"></a><span class="lineno">  701</span> </div>
+<div class="line"><a name="l00702"></a><span class="lineno">  702</span>   <span class="keywordflow">if</span>(verbose_opt[0])</div>
+<div class="line"><a name="l00703"></a><span class="lineno">  703</span>     cout <<<span class="stringliteral">"cost: "</span> << cost << endl;</div>
+<div class="line"><a name="l00704"></a><span class="lineno">  704</span>   subset.sort();</div>
+<div class="line"><a name="l00705"></a><span class="lineno">  705</span>   <span class="keywordflow">for</span>(list<int>::const_iterator lit=subset.begin();lit!=subset.end();++lit)</div>
+<div class="line"><a name="l00706"></a><span class="lineno">  706</span>     std::cout << <span class="stringliteral">" -b "</span> << *lit;</div>
+<div class="line"><a name="l00707"></a><span class="lineno">  707</span>   std::cout << std::endl;</div>
+<div class="line"><a name="l00708"></a><span class="lineno">  708</span>     <span class="comment">// if((*(lit))!=subset.back())</span></div>
+<div class="line"><a name="l00709"></a><span class="lineno">  709</span>     <span class="comment">// else</span></div>
+<div class="line"><a name="l00710"></a><span class="lineno">  710</span>     <span class="comment">//   cout << endl;</span></div>
+<div class="line"><a name="l00711"></a><span class="lineno">  711</span> </div>
+<div class="line"><a name="l00712"></a><span class="lineno">  712</span>   <span class="comment">// *NOTE* Because svm_model contains pointers to svm_problem, you can</span></div>
+<div class="line"><a name="l00713"></a><span class="lineno">  713</span>   <span class="comment">// not free the memory used by svm_problem if you are still using the</span></div>
+<div class="line"><a name="l00714"></a><span class="lineno">  714</span>   <span class="comment">// svm_model produced by svm_train(). </span></div>
+<div class="line"><a name="l00715"></a><span class="lineno">  715</span> </div>
+<div class="line"><a name="l00716"></a><span class="lineno">  716</span>   <span class="comment">// free(prob.y);</span></div>
+<div class="line"><a name="l00717"></a><span class="lineno">  717</span>   <span class="comment">// free(prob.x);</span></div>
+<div class="line"><a name="l00718"></a><span class="lineno">  718</span>   <span class="comment">// free(x_space);</span></div>
+<div class="line"><a name="l00719"></a><span class="lineno">  719</span>   <span class="comment">// svm_destroy_param(&param);</span></div>
+<div class="line"><a name="l00720"></a><span class="lineno">  720</span>   <span class="keywordflow">return</span> 0;</div>
+<div class="line"><a name="l00721"></a><span class="lineno">  721</span> }</div>
+<div class="line"><a name="l00722"></a><span class="lineno">  722</span>                             </div>
 <div class="ttc" id="classVector2d_html"><div class="ttname"><a href="classVector2d.html">Vector2d</a></div><div class="ttdef"><b>Definition:</b> <a href="Vector2d_8h_source.html#l00031">Vector2d.h:31</a></div></div>
 <div class="ttc" id="classCostFactoryANN_html"><div class="ttname"><a href="classCostFactoryANN.html">CostFactoryANN</a></div><div class="ttdef"><b>Definition:</b> <a href="pkfsann_8h_source.html#l00029">pkfsann.h:29</a></div></div>
 <div class="ttc" id="classImgReaderOgr_html"><div class="ttname"><a href="classImgReaderOgr.html">ImgReaderOgr</a></div><div class="ttdef"><b>Definition:</b> <a href="ImgReaderOgr_8h_source.html#l00035">ImgReaderOgr.h:35</a></div></div>
@@ -708,7 +730,7 @@
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Jun 23 2015 17:09:36 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Tue Nov 3 2015 15:58:26 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/pkfsann_8h_source.html b/doc/html/pkfsann_8h_source.html
index 03baae8..f9befaf 100644
--- a/doc/html/pkfsann_8h_source.html
+++ b/doc/html/pkfsann_8h_source.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.3</span>
+    <span id="projectnumber">2.6.4</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -105,7 +105,7 @@
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Jun 23 2015 17:09:36 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Tue Nov 3 2015 15:58:26 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/pkfssvm.html b/doc/html/pkfssvm.html
index 45a3115..9c7fa8c 100644
--- a/doc/html/pkfssvm.html
+++ b/doc/html/pkfssvm.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.3</span>
+    <span id="projectnumber">2.6.4</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -77,15 +77,15 @@ Options</h1>
 <tr>
 <td>min </td><td>min </td><td>int </td><td>0 </td><td>if number of training pixels is less then min, do not take this class into account </td></tr>
 <tr>
-<td>b </td><td>band </td><td>short </td><td></td><td>band index (starting from 0, either use band option or use start to end) </td></tr>
+<td>b </td><td>band </td><td>unsigned short </td><td></td><td>band index (starting from 0, either use band option or use start to end) </td></tr>
 <tr>
-<td>s </td><td>start </td><td>double </td><td>0 </td><td>start band sequence number </td></tr>
+<td>sband </td><td>startband </td><td>unsigned short </td><td></td><td>Start band sequence number </td></tr>
 <tr>
-<td>e </td><td>end </td><td>double </td><td>0 </td><td>end band sequence number (set to 0 to include all bands) </td></tr>
+<td>eband </td><td>endband </td><td>unsigned short </td><td></td><td>End band sequence number </td></tr>
 <tr>
-<td></td><td>offset </td><td>double </td><td>0 </td><td>offset value for each spectral band input features: refl[band]=(DN[band]-offset[band])/scale[band] </td></tr>
+<td>offset </td><td>offset </td><td>double </td><td>0 </td><td>offset value for each spectral band input features: refl[band]=(DN[band]-offset[band])/scale[band] </td></tr>
 <tr>
-<td></td><td>scale </td><td>double </td><td>0 </td><td>scale value for each spectral band input features: refl=(DN[band]-offset[band])/scale<a href="use 0 if scale min and max in each band to -1.0 and 1.0">band</a> </td></tr>
+<td>scale </td><td>scale </td><td>double </td><td>0 </td><td>scale value for each spectral band input features: refl=(DN[band]-offset[band])/scale<a href="use 0 if scale min and max in each band to -1.0 and 1.0">band</a> </td></tr>
 <tr>
 <td>svmt </td><td>svmtype </td><td>std::string </td><td>C_SVC </td><td>type of SVM (C_SVC, nu_SVC,one_class, epsilon_SVR, nu_SVR) </td></tr>
 <tr>
@@ -127,7 +127,7 @@ Usage: pkfssvm -t training -n number </li>
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Jun 23 2015 17:09:37 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/pkfssvm_8cc_source.html b/doc/html/pkfssvm_8cc_source.html
index 6f79cc8..4f5e181 100644
--- a/doc/html/pkfssvm_8cc_source.html
+++ b/doc/html/pkfssvm_8cc_source.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.3</span>
+    <span id="projectnumber">2.6.4</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -260,11 +260,11 @@
 <div class="line"><a name="l00267"></a><span class="lineno">  267</span>   <a class="code" href="classOptionpk.html">Optionpk<unsigned int></a> balance_opt(<span class="stringliteral">"bal"</span>, <span class="stringliteral">"balance"</span>, <span class="stringliteral">"balance the input data to this number of samples for each class"</span>, 0);</div>
 <div class="line"><a name="l00268"></a><span class="lineno">  268</span>   <a class="code" href="classOptionpk.html">Optionpk<bool></a> random_opt(<span class="stringliteral">"random"</span>,<span class="stringliteral">"random"</span>, <span class="stringliteral">"in case of balance, randomize input data"</span>, <span class="keyword">true</span>);</div>
 <div class="line"><a name="l00269"></a><span class="lineno">  269</span>   <a class="code" href="classOptionpk.html">Optionpk<int></a> minSize_opt(<span class="stringliteral">"min"</span>, <span class="stringliteral">"min"</span>, <span class="stringliteral">"if number of training pixels is less then min, do not take this class into account"</span>, 0);</div>
-<div class="line"><a name="l00270"></a><span class="lineno">  270</span>   <a class="code" href="classOptionpk.html">Optionpk<short></a> band_opt(<span class="stringliteral">"b"</span>, <span class="stringliteral">"band"</span>, <span class="stringliteral">"band index (starting from 0, either use band option or use start to end)"</span>);</div>
-<div class="line"><a name="l00271"></a><span class="lineno">  271</span>   <a class="code" href="classOptionpk.html">Optionpk<double></a> bstart_opt(<span class="stringliteral">"s"</span>, <span class="stringliteral">"start"</span>, <span class="stringliteral">"start band sequence number"</span>,0); </div>
-<div class="line"><a name="l00272"></a><span class="lineno">  272</span>   <a class="code" href="classOptionpk.html">Optionpk<double></a> bend_opt(<span class="stringliteral">"e"</span>, <span class="stringliteral">"end"</span>, <span class="stringliteral">"end band sequence number (set to 0 to include all bands)"</span>, 0); </div>
-<div class="line"><a name="l00273"></a><span class="lineno">  273</span>   <a class="code" href="classOptionpk.html">Optionpk<double></a> offset_opt(<span class="stringliteral">"\0"</span>, <span class="stringliteral">"offset"</span>, <span class="stringliteral">"offset value for each spectral band input features: refl[band]=(DN[band]-offset[band])/scale[band]"</span>, 0.0);</div>
-<div class="line"><a name="l00274"></a><span class="lineno">  274</span>   <a class="code" href="classOptionpk.html">Optionpk<double></a> scale_opt(<span class="stringliteral">"\0"</span>, <span class="stringliteral">"scale"</span>, <span class="stringliteral">"scale value for each spectral band input features: refl=(DN[band]-offset[band])/scale[band] (use 0 if scale min and max in each band to -1.0 and 1.0)"</span>, 0.0);</div>
+<div class="line"><a name="l00270"></a><span class="lineno">  270</span>   <a class="code" href="classOptionpk.html">Optionpk<unsigned short></a> band_opt(<span class="stringliteral">"b"</span>, <span class="stringliteral">"band"</span>, <span class="stringliteral">"band index (starting from 0, either use band option or use start to end)"</span>);</div>
+<div class="line"><a name="l00271"></a><span class="lineno">  271</span>   <a class="code" href="classOptionpk.html">Optionpk<unsigned short></a> bstart_opt(<span class="stringliteral">"sband"</span>, <span class="stringliteral">"startband"</span>, <span class="stringliteral">"Start band sequence number"</span>); </div>
+<div class="line"><a name="l00272"></a><span class="lineno">  272</span>   <a class="code" href="classOptionpk.html">Optionpk<unsigned short></a> bend_opt(<span class="stringliteral">"eband"</span>, <span class="stringliteral">"endband"</span>, <span class="stringliteral">"End band sequence number"</span>); </div>
+<div class="line"><a name="l00273"></a><span class="lineno">  273</span>   <a class="code" href="classOptionpk.html">Optionpk<double></a> offset_opt(<span class="stringliteral">"offset"</span>, <span class="stringliteral">"offset"</span>, <span class="stringliteral">"offset value for each spectral band input features: refl[band]=(DN[band]-offset[band])/scale[band]"</span>, 0.0);</div>
+<div class="line"><a name="l00274"></a><span class="lineno">  274</span>   <a class="code" href="classOptionpk.html">Optionpk<double></a> scale_opt(<span class="stringliteral">"scale"</span>, <span class="stringliteral">"scale"</span>, <span class="stringliteral">"scale value for each spectral band input features: refl=(DN[band]-offset[band])/scale[band] (use 0 if scale min and max in each band to -1.0 and 1.0)"</span>, 0.0);</div>
 <div class="line"><a name="l00275"></a><span class="lineno">  275</span>   <a class="code" href="classOptionpk.html">Optionpk<string></a> selector_opt(<span class="stringliteral">"sm"</span>, <span class="stringliteral">"sm"</span>, <span class="stringliteral">"feature selection method (sffs=sequential floating forward search,sfs=sequential forward search, sbs, sequential backward search ,bfs=brute force search)"</span>,<span class="stringliteral" [...]
 <div class="line"><a name="l00276"></a><span class="lineno">  276</span>   <a class="code" href="classOptionpk.html">Optionpk<float></a> epsilon_cost_opt(<span class="stringliteral">"ecost"</span>, <span class="stringliteral">"ecost"</span>, <span class="stringliteral">"epsilon for stopping criterion in cost function to determine optimal number of features"</span>,0.001);</div>
 <div class="line"><a name="l00277"></a><span class="lineno">  277</span> </div>
@@ -399,336 +399,358 @@
 <div class="line"><a name="l00406"></a><span class="lineno">  406</span>   <span class="comment">//     priors[iclass]/=normPrior;</span></div>
 <div class="line"><a name="l00407"></a><span class="lineno">  407</span>   <span class="comment">// }</span></div>
 <div class="line"><a name="l00408"></a><span class="lineno">  408</span> </div>
-<div class="line"><a name="l00409"></a><span class="lineno">  409</span>   <span class="comment">//sort bands</span></div>
-<div class="line"><a name="l00410"></a><span class="lineno">  410</span>   <span class="keywordflow">if</span>(band_opt.size())</div>
-<div class="line"><a name="l00411"></a><span class="lineno">  411</span>     std::sort(band_opt.begin(),band_opt.end());</div>
-<div class="line"><a name="l00412"></a><span class="lineno">  412</span> </div>
-<div class="line"><a name="l00413"></a><span class="lineno">  413</span>   <span class="keywordflow">if</span>(classname_opt.size()){</div>
-<div class="line"><a name="l00414"></a><span class="lineno">  414</span>     assert(classname_opt.size()==classvalue_opt.size());</div>
-<div class="line"><a name="l00415"></a><span class="lineno">  415</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iclass=0;iclass<classname_opt.size();++iclass)</div>
-<div class="line"><a name="l00416"></a><span class="lineno">  416</span>       costfactory.setClassValueMap(classname_opt[iclass],classvalue_opt[iclass]);</div>
-<div class="line"><a name="l00417"></a><span class="lineno">  417</span>   }</div>
-<div class="line"><a name="l00418"></a><span class="lineno">  418</span> </div>
-<div class="line"><a name="l00419"></a><span class="lineno">  419</span>   <span class="comment">//----------------------------------- Training -------------------------------</span></div>
-<div class="line"><a name="l00420"></a><span class="lineno">  420</span>   vector<double> offset;</div>
-<div class="line"><a name="l00421"></a><span class="lineno">  421</span>   vector<double> scale;</div>
-<div class="line"><a name="l00422"></a><span class="lineno">  422</span>   vector< Vector2d<float> > trainingPixels;<span class="comment">//[class][sample][band]</span></div>
-<div class="line"><a name="l00423"></a><span class="lineno">  423</span>   vector< Vector2d<float> > testPixels;<span class="comment">//[class][sample][band]</span></div>
-<div class="line"><a name="l00424"></a><span class="lineno">  424</span>   map<string,Vector2d<float> > trainingMap;</div>
-<div class="line"><a name="l00425"></a><span class="lineno">  425</span>   map<string,Vector2d<float> > testMap;</div>
-<div class="line"><a name="l00426"></a><span class="lineno">  426</span>   vector<string> fields;</div>
-<div class="line"><a name="l00427"></a><span class="lineno">  427</span> </div>
-<div class="line"><a name="l00428"></a><span class="lineno">  428</span>   <span class="keyword">struct </span><a class="code" href="structsvm__problem.html">svm_problem</a> prob;</div>
-<div class="line"><a name="l00429"></a><span class="lineno">  429</span>   <span class="comment">//organize training data</span></div>
-<div class="line"><a name="l00430"></a><span class="lineno">  430</span>   trainingPixels.clear();</div>
-<div class="line"><a name="l00431"></a><span class="lineno">  431</span>   testPixels.clear();</div>
-<div class="line"><a name="l00432"></a><span class="lineno">  432</span>   <span class="keywordflow">if</span>(verbose_opt[0]>=1)</div>
-<div class="line"><a name="l00433"></a><span class="lineno">  433</span>     std::cout << <span class="stringliteral">"reading training file "</span> << training_opt[0] << std::endl;</div>
-<div class="line"><a name="l00434"></a><span class="lineno">  434</span>   <span class="keywordflow">try</span>{</div>
-<div class="line"><a name="l00435"></a><span class="lineno">  435</span>     <a class="code" href="classImgReaderOgr.html">ImgReaderOgr</a> trainingReader(training_opt[0]);</div>
-<div class="line"><a name="l00436"></a><span class="lineno">  436</span>     <span class="keywordflow">if</span>(band_opt.size()){</div>
-<div class="line"><a name="l00437"></a><span class="lineno">  437</span>       totalSamples=trainingReader.readDataImageOgr(trainingMap,fields,band_opt,label_opt[0],tlayer_opt,verbose_opt[0]);</div>
-<div class="line"><a name="l00438"></a><span class="lineno">  438</span>       <span class="keywordflow">if</span>(input_opt.size()){</div>
-<div class="line"><a name="l00439"></a><span class="lineno">  439</span>     <a class="code" href="classImgReaderOgr.html">ImgReaderOgr</a> inputReader(input_opt[0]);</div>
-<div class="line"><a name="l00440"></a><span class="lineno">  440</span>     totalTestSamples=inputReader.readDataImageOgr(testMap,fields,band_opt,label_opt[0],tlayer_opt,verbose_opt[0]);</div>
-<div class="line"><a name="l00441"></a><span class="lineno">  441</span>     inputReader.close();</div>
-<div class="line"><a name="l00442"></a><span class="lineno">  442</span>       }</div>
-<div class="line"><a name="l00443"></a><span class="lineno">  443</span>     }</div>
-<div class="line"><a name="l00444"></a><span class="lineno">  444</span>     <span class="keywordflow">else</span>{</div>
-<div class="line"><a name="l00445"></a><span class="lineno">  445</span>       totalSamples=trainingReader.readDataImageOgr(trainingMap,fields,bstart_opt[0],bend_opt[0],label_opt[0],tlayer_opt,verbose_opt[0]);</div>
-<div class="line"><a name="l00446"></a><span class="lineno">  446</span>       <span class="keywordflow">if</span>(input_opt.size()){</div>
-<div class="line"><a name="l00447"></a><span class="lineno">  447</span>     <a class="code" href="classImgReaderOgr.html">ImgReaderOgr</a> inputReader(input_opt[0]);</div>
-<div class="line"><a name="l00448"></a><span class="lineno">  448</span>     totalTestSamples=inputReader.readDataImageOgr(testMap,fields,bstart_opt[0],bend_opt[0],label_opt[0],tlayer_opt,verbose_opt[0]);</div>
-<div class="line"><a name="l00449"></a><span class="lineno">  449</span>     inputReader.close();</div>
-<div class="line"><a name="l00450"></a><span class="lineno">  450</span>       }</div>
-<div class="line"><a name="l00451"></a><span class="lineno">  451</span>     }</div>
-<div class="line"><a name="l00452"></a><span class="lineno">  452</span>     <span class="keywordflow">if</span>(trainingMap.size()<2){</div>
-<div class="line"><a name="l00453"></a><span class="lineno">  453</span>       <span class="keywordtype">string</span> errorstring=<span class="stringliteral">"Error: could not read at least two classes from training input file"</span>;</div>
-<div class="line"><a name="l00454"></a><span class="lineno">  454</span>       <span class="keywordflow">throw</span>(errorstring);</div>
-<div class="line"><a name="l00455"></a><span class="lineno">  455</span>     }</div>
-<div class="line"><a name="l00456"></a><span class="lineno">  456</span>     <span class="keywordflow">if</span>(input_opt.size()&&testMap.size()<2){</div>
-<div class="line"><a name="l00457"></a><span class="lineno">  457</span>       <span class="keywordtype">string</span> errorstring=<span class="stringliteral">"Error: could not read at least two classes from test input file"</span>;</div>
-<div class="line"><a name="l00458"></a><span class="lineno">  458</span>       <span class="keywordflow">throw</span>(errorstring);</div>
-<div class="line"><a name="l00459"></a><span class="lineno">  459</span>     }</div>
-<div class="line"><a name="l00460"></a><span class="lineno">  460</span>     trainingReader.close();</div>
-<div class="line"><a name="l00461"></a><span class="lineno">  461</span>   }</div>
-<div class="line"><a name="l00462"></a><span class="lineno">  462</span>   <span class="keywordflow">catch</span>(<span class="keywordtype">string</span> error){</div>
-<div class="line"><a name="l00463"></a><span class="lineno">  463</span>     cerr << error << std::endl;</div>
-<div class="line"><a name="l00464"></a><span class="lineno">  464</span>     exit(1);</div>
-<div class="line"><a name="l00465"></a><span class="lineno">  465</span>   }</div>
-<div class="line"><a name="l00466"></a><span class="lineno">  466</span>   <span class="keywordflow">catch</span>(std::exception& e){</div>
-<div class="line"><a name="l00467"></a><span class="lineno">  467</span>     std::cerr << <span class="stringliteral">"Error: "</span>;</div>
-<div class="line"><a name="l00468"></a><span class="lineno">  468</span>     std::cerr << e.what() << std::endl;</div>
-<div class="line"><a name="l00469"></a><span class="lineno">  469</span>     std::cerr << CPLGetLastErrorMsg() << std::endl; </div>
-<div class="line"><a name="l00470"></a><span class="lineno">  470</span>     exit(1);</div>
-<div class="line"><a name="l00471"></a><span class="lineno">  471</span>   }</div>
-<div class="line"><a name="l00472"></a><span class="lineno">  472</span>   <span class="keywordflow">catch</span>(...){</div>
-<div class="line"><a name="l00473"></a><span class="lineno">  473</span>     cerr << <span class="stringliteral">"error catched"</span> << std::endl;</div>
-<div class="line"><a name="l00474"></a><span class="lineno">  474</span>     exit(1);</div>
-<div class="line"><a name="l00475"></a><span class="lineno">  475</span>   }</div>
-<div class="line"><a name="l00476"></a><span class="lineno">  476</span>   <span class="comment">//todo: delete class 0 ?</span></div>
-<div class="line"><a name="l00477"></a><span class="lineno">  477</span>   <span class="comment">// if(verbose_opt[0]>=1)</span></div>
-<div class="line"><a name="l00478"></a><span class="lineno">  478</span>   <span class="comment">//   std::cout << "erasing class 0 from training set (" << trainingMap[0].size() << " from " << totalSamples << ") samples" << std::endl;</span></div>
-<div class="line"><a name="l00479"></a><span class="lineno">  479</span>   <span class="comment">// totalSamples-=trainingMap[0].size();</span></div>
-<div class="line"><a name="l00480"></a><span class="lineno">  480</span>   <span class="comment">// trainingMap.erase(0);</span></div>
-<div class="line"><a name="l00481"></a><span class="lineno">  481</span> </div>
-<div class="line"><a name="l00482"></a><span class="lineno">  482</span>   <span class="keywordflow">if</span>(verbose_opt[0]>1)</div>
-<div class="line"><a name="l00483"></a><span class="lineno">  483</span>     std::cout << <span class="stringliteral">"training pixels: "</span> << std::endl;</div>
-<div class="line"><a name="l00484"></a><span class="lineno">  484</span>   map<string,Vector2d<float> >::iterator mapit=trainingMap.begin();</div>
-<div class="line"><a name="l00485"></a><span class="lineno">  485</span>   <span class="keywordflow">while</span>(mapit!=trainingMap.end()){</div>
-<div class="line"><a name="l00486"></a><span class="lineno">  486</span>     <span class="comment">//delete small classes</span></div>
-<div class="line"><a name="l00487"></a><span class="lineno">  487</span>     <span class="keywordflow">if</span>((mapit->second).size()<minSize_opt[0]){</div>
-<div class="line"><a name="l00488"></a><span class="lineno">  488</span>       trainingMap.erase(mapit);</div>
-<div class="line"><a name="l00489"></a><span class="lineno">  489</span>       <span class="keywordflow">continue</span>;</div>
-<div class="line"><a name="l00490"></a><span class="lineno">  490</span>     }</div>
-<div class="line"><a name="l00491"></a><span class="lineno">  491</span>     costfactory.pushBackName(mapit->first);</div>
-<div class="line"><a name="l00492"></a><span class="lineno">  492</span>     trainingPixels.push_back(mapit->second);</div>
-<div class="line"><a name="l00493"></a><span class="lineno">  493</span>     <span class="keywordflow">if</span>(verbose_opt[0]>1)</div>
-<div class="line"><a name="l00494"></a><span class="lineno">  494</span>       std::cout << mapit->first << <span class="stringliteral">": "</span> << (mapit->second).size() << <span class="stringliteral">" samples"</span> << std::endl;</div>
-<div class="line"><a name="l00495"></a><span class="lineno">  495</span>     ++mapit;</div>
-<div class="line"><a name="l00496"></a><span class="lineno">  496</span>   }</div>
-<div class="line"><a name="l00497"></a><span class="lineno">  497</span>   nclass=trainingPixels.size();</div>
-<div class="line"><a name="l00498"></a><span class="lineno">  498</span>   <span class="keywordflow">if</span>(classname_opt.size())</div>
-<div class="line"><a name="l00499"></a><span class="lineno">  499</span>     assert(nclass==classname_opt.size());</div>
-<div class="line"><a name="l00500"></a><span class="lineno">  500</span>   nband=trainingPixels[0][0].size()-2;<span class="comment">//X and Y//trainingPixels[0][0].size();</span></div>
-<div class="line"><a name="l00501"></a><span class="lineno">  501</span> </div>
-<div class="line"><a name="l00502"></a><span class="lineno">  502</span>   mapit=testMap.begin();</div>
-<div class="line"><a name="l00503"></a><span class="lineno">  503</span>   <span class="keywordflow">while</span>(mapit!=testMap.end()){</div>
-<div class="line"><a name="l00504"></a><span class="lineno">  504</span>     <span class="keywordflow">if</span>(costfactory.getClassValueMap().size()){</div>
-<div class="line"><a name="l00505"></a><span class="lineno">  505</span>     <span class="comment">// if(classValueMap.size()){</span></div>
-<div class="line"><a name="l00506"></a><span class="lineno">  506</span>       <span class="comment">//check if name in test is covered by classname_opt (values can not be 0)</span></div>
-<div class="line"><a name="l00507"></a><span class="lineno">  507</span>       <span class="keywordflow">if</span>((costfactory.getClassValueMap())[mapit->first]>0){</div>
-<div class="line"><a name="l00508"></a><span class="lineno">  508</span>         ;<span class="comment">//ok, no need to print to std::cout </span></div>
-<div class="line"><a name="l00509"></a><span class="lineno">  509</span>       }</div>
-<div class="line"><a name="l00510"></a><span class="lineno">  510</span>       <span class="keywordflow">else</span>{</div>
-<div class="line"><a name="l00511"></a><span class="lineno">  511</span>         std::cerr << <span class="stringliteral">"Error: names in classname option are not complete, please check names in test vector and make sure classvalue is > 0"</span> << std::endl;</div>
-<div class="line"><a name="l00512"></a><span class="lineno">  512</span>         exit(1);</div>
-<div class="line"><a name="l00513"></a><span class="lineno">  513</span>       }</div>
-<div class="line"><a name="l00514"></a><span class="lineno">  514</span>     }    </div>
-<div class="line"><a name="l00515"></a><span class="lineno">  515</span>     <span class="comment">//no need to delete small classes for test sample</span></div>
-<div class="line"><a name="l00516"></a><span class="lineno">  516</span>     testPixels.push_back(mapit->second);</div>
-<div class="line"><a name="l00517"></a><span class="lineno">  517</span>     <span class="keywordflow">if</span>(verbose_opt[0]>1)</div>
-<div class="line"><a name="l00518"></a><span class="lineno">  518</span>       std::cout << mapit->first << <span class="stringliteral">": "</span> << (mapit->second).size() << <span class="stringliteral">" samples"</span> << std::endl;</div>
-<div class="line"><a name="l00519"></a><span class="lineno">  519</span>     ++mapit;</div>
-<div class="line"><a name="l00520"></a><span class="lineno">  520</span>   }</div>
-<div class="line"><a name="l00521"></a><span class="lineno">  521</span>   <span class="keywordflow">if</span>(input_opt.size()){</div>
-<div class="line"><a name="l00522"></a><span class="lineno">  522</span>     assert(nclass==testPixels.size());</div>
-<div class="line"><a name="l00523"></a><span class="lineno">  523</span>     assert(nband=testPixels[0][0].size()-2);<span class="comment">//X and Y//testPixels[0][0].size();</span></div>
-<div class="line"><a name="l00524"></a><span class="lineno">  524</span>     assert(!cv_opt[0]);</div>
-<div class="line"><a name="l00525"></a><span class="lineno">  525</span>   }</div>
-<div class="line"><a name="l00526"></a><span class="lineno">  526</span> </div>
-<div class="line"><a name="l00527"></a><span class="lineno">  527</span>   <span class="comment">//do not remove outliers here: could easily be obtained through ogr2ogr -where 'B2<110' output.shp input.shp</span></div>
-<div class="line"><a name="l00528"></a><span class="lineno">  528</span>   <span class="comment">//balance training data</span></div>
-<div class="line"><a name="l00529"></a><span class="lineno">  529</span>   <span class="comment">//todo: do I mean to use random_opt?</span></div>
-<div class="line"><a name="l00530"></a><span class="lineno">  530</span>   <span class="keywordflow">if</span>(balance_opt[0]>0){</div>
-<div class="line"><a name="l00531"></a><span class="lineno">  531</span>     <span class="keywordflow">if</span>(random_opt[0])</div>
-<div class="line"><a name="l00532"></a><span class="lineno">  532</span>       srand(time(NULL));</div>
-<div class="line"><a name="l00533"></a><span class="lineno">  533</span>     totalSamples=0;</div>
-<div class="line"><a name="l00534"></a><span class="lineno">  534</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iclass=0;iclass<nclass;++iclass){</div>
-<div class="line"><a name="l00535"></a><span class="lineno">  535</span>       <span class="keywordflow">if</span>(trainingPixels[iclass].size()>balance_opt[0]){</div>
-<div class="line"><a name="l00536"></a><span class="lineno">  536</span>         <span class="keywordflow">while</span>(trainingPixels[iclass].size()>balance_opt[0]){</div>
-<div class="line"><a name="l00537"></a><span class="lineno">  537</span>           <span class="keywordtype">int</span> index=rand()%trainingPixels[iclass].size();</div>
-<div class="line"><a name="l00538"></a><span class="lineno">  538</span>           trainingPixels[iclass].erase(trainingPixels[iclass].begin()+index);</div>
-<div class="line"><a name="l00539"></a><span class="lineno">  539</span>         }</div>
-<div class="line"><a name="l00540"></a><span class="lineno">  540</span>       }</div>
-<div class="line"><a name="l00541"></a><span class="lineno">  541</span>       <span class="keywordflow">else</span>{</div>
-<div class="line"><a name="l00542"></a><span class="lineno">  542</span>         <span class="keywordtype">int</span> oldsize=trainingPixels[iclass].size();</div>
-<div class="line"><a name="l00543"></a><span class="lineno">  543</span>         <span class="keywordflow">for</span>(<span class="keywordtype">int</span> isample=trainingPixels[iclass].size();isample<balance_opt[0];++isample){</div>
-<div class="line"><a name="l00544"></a><span class="lineno">  544</span>           <span class="keywordtype">int</span> index = rand()%oldsize;</div>
-<div class="line"><a name="l00545"></a><span class="lineno">  545</span>           trainingPixels[iclass].push_back(trainingPixels[iclass][index]);</div>
-<div class="line"><a name="l00546"></a><span class="lineno">  546</span>         }</div>
-<div class="line"><a name="l00547"></a><span class="lineno">  547</span>       }</div>
-<div class="line"><a name="l00548"></a><span class="lineno">  548</span>       totalSamples+=trainingPixels[iclass].size();</div>
-<div class="line"><a name="l00549"></a><span class="lineno">  549</span>     }</div>
-<div class="line"><a name="l00550"></a><span class="lineno">  550</span>     assert(totalSamples==nclass*balance_opt[0]);</div>
-<div class="line"><a name="l00551"></a><span class="lineno">  551</span>   }</div>
-<div class="line"><a name="l00552"></a><span class="lineno">  552</span>     </div>
-<div class="line"><a name="l00553"></a><span class="lineno">  553</span>   <span class="comment">//set scale and offset</span></div>
-<div class="line"><a name="l00554"></a><span class="lineno">  554</span>   offset.resize(nband);</div>
-<div class="line"><a name="l00555"></a><span class="lineno">  555</span>   scale.resize(nband);</div>
-<div class="line"><a name="l00556"></a><span class="lineno">  556</span>   <span class="keywordflow">if</span>(offset_opt.size()>1)</div>
-<div class="line"><a name="l00557"></a><span class="lineno">  557</span>     assert(offset_opt.size()==nband);</div>
-<div class="line"><a name="l00558"></a><span class="lineno">  558</span>   <span class="keywordflow">if</span>(scale_opt.size()>1)</div>
-<div class="line"><a name="l00559"></a><span class="lineno">  559</span>     assert(scale_opt.size()==nband);</div>
-<div class="line"><a name="l00560"></a><span class="lineno">  560</span>   <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iband=0;iband<nband;++iband){</div>
-<div class="line"><a name="l00561"></a><span class="lineno">  561</span>     <span class="keywordflow">if</span>(verbose_opt[0]>1)</div>
-<div class="line"><a name="l00562"></a><span class="lineno">  562</span>       std::cout << <span class="stringliteral">"scaling for band"</span> << iband << std::endl;</div>
-<div class="line"><a name="l00563"></a><span class="lineno">  563</span>     offset[iband]=(offset_opt.size()==1)?offset_opt[0]:offset_opt[iband];</div>
-<div class="line"><a name="l00564"></a><span class="lineno">  564</span>     scale[iband]=(scale_opt.size()==1)?scale_opt[0]:scale_opt[iband];</div>
-<div class="line"><a name="l00565"></a><span class="lineno">  565</span>     <span class="comment">//search for min and maximum</span></div>
-<div class="line"><a name="l00566"></a><span class="lineno">  566</span>     <span class="keywordflow">if</span>(scale[iband]<=0){</div>
-<div class="line"><a name="l00567"></a><span class="lineno">  567</span>       <span class="keywordtype">float</span> theMin=trainingPixels[0][0][iband+startBand];</div>
-<div class="line"><a name="l00568"></a><span class="lineno">  568</span>       <span class="keywordtype">float</span> theMax=trainingPixels[0][0][iband+startBand];</div>
-<div class="line"><a name="l00569"></a><span class="lineno">  569</span>       <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iclass=0;iclass<nclass;++iclass){</div>
-<div class="line"><a name="l00570"></a><span class="lineno">  570</span>         <span class="keywordflow">for</span>(<span class="keywordtype">int</span> isample=0;isample<trainingPixels[iclass].size();++isample){</div>
-<div class="line"><a name="l00571"></a><span class="lineno">  571</span>           <span class="keywordflow">if</span>(theMin>trainingPixels[iclass][isample][iband+startBand])</div>
-<div class="line"><a name="l00572"></a><span class="lineno">  572</span>             theMin=trainingPixels[iclass][isample][iband+startBand];</div>
-<div class="line"><a name="l00573"></a><span class="lineno">  573</span>           <span class="keywordflow">if</span>(theMax<trainingPixels[iclass][isample][iband+startBand])</div>
-<div class="line"><a name="l00574"></a><span class="lineno">  574</span>             theMax=trainingPixels[iclass][isample][iband+startBand];</div>
-<div class="line"><a name="l00575"></a><span class="lineno">  575</span>         }</div>
-<div class="line"><a name="l00576"></a><span class="lineno">  576</span>       }</div>
-<div class="line"><a name="l00577"></a><span class="lineno">  577</span>       offset[iband]=theMin+(theMax-theMin)/2.0;</div>
-<div class="line"><a name="l00578"></a><span class="lineno">  578</span>       scale[iband]=(theMax-theMin)/2.0;</div>
-<div class="line"><a name="l00579"></a><span class="lineno">  579</span>       <span class="keywordflow">if</span>(verbose_opt[0]>1){</div>
-<div class="line"><a name="l00580"></a><span class="lineno">  580</span>         std::cout << <span class="stringliteral">"Extreme image values for band "</span> << iband << <span class="stringliteral">": ["</span> << theMin << <span class="stringliteral">","</span> << theMax << <span class="stringliteral">"]"</span> << std::endl;</div>
-<div class="line"><a name="l00581"></a><span class="lineno">  581</span>         std::cout << <span class="stringliteral">"Using offset, scale: "</span> << offset[iband] << <span class="stringliteral">", "</span> << scale[iband] << std::endl;</div>
-<div class="line"><a name="l00582"></a><span class="lineno">  582</span>         std::cout << <span class="stringliteral">"scaled values for band "</span> << iband << <span class="stringliteral">": ["</span> << (theMin-offset[iband])/scale[iband] << <span class="stringliteral">","</span> << (theMax-offset[iband])/scale[iband] << <span class="stringliteral">"]"</span> << std::endl;</div>
-<div class="line"><a name="l00583"></a><span class="lineno">  583</span>       }</div>
-<div class="line"><a name="l00584"></a><span class="lineno">  584</span>     }</div>
-<div class="line"><a name="l00585"></a><span class="lineno">  585</span>   }</div>
-<div class="line"><a name="l00586"></a><span class="lineno">  586</span> </div>
-<div class="line"><a name="l00587"></a><span class="lineno">  587</span>   <span class="comment">// if(priors_opt.size()==1){//default: equal priors for each class</span></div>
-<div class="line"><a name="l00588"></a><span class="lineno">  588</span>   <span class="comment">//   priors.resize(nclass);</span></div>
-<div class="line"><a name="l00589"></a><span class="lineno">  589</span>   <span class="comment">//   for(int iclass=0;iclass<nclass;++iclass)</span></div>
-<div class="line"><a name="l00590"></a><span class="lineno">  590</span>   <span class="comment">//     priors[iclass]=1.0/nclass;</span></div>
-<div class="line"><a name="l00591"></a><span class="lineno">  591</span>   <span class="comment">// }</span></div>
-<div class="line"><a name="l00592"></a><span class="lineno">  592</span>   <span class="comment">// assert(priors_opt.size()==1||priors_opt.size()==nclass);</span></div>
-<div class="line"><a name="l00593"></a><span class="lineno">  593</span>     </div>
-<div class="line"><a name="l00594"></a><span class="lineno">  594</span>   <span class="keywordflow">if</span>(verbose_opt[0]>=1){</div>
-<div class="line"><a name="l00595"></a><span class="lineno">  595</span>     std::cout << <span class="stringliteral">"number of bands: "</span> << nband << std::endl;</div>
-<div class="line"><a name="l00596"></a><span class="lineno">  596</span>     std::cout << <span class="stringliteral">"number of classes: "</span> << nclass << std::endl;</div>
-<div class="line"><a name="l00597"></a><span class="lineno">  597</span>     <span class="comment">// std::cout << "priors:";</span></div>
-<div class="line"><a name="l00598"></a><span class="lineno">  598</span>     <span class="comment">// for(int iclass=0;iclass<nclass;++iclass)</span></div>
-<div class="line"><a name="l00599"></a><span class="lineno">  599</span>     <span class="comment">//   std::cout << " " << priors[iclass];</span></div>
-<div class="line"><a name="l00600"></a><span class="lineno">  600</span>     <span class="comment">// std::cout << std::endl;</span></div>
-<div class="line"><a name="l00601"></a><span class="lineno">  601</span>   }</div>
-<div class="line"><a name="l00602"></a><span class="lineno">  602</span> </div>
-<div class="line"><a name="l00603"></a><span class="lineno">  603</span>   <span class="comment">//set names in confusion matrix using nameVector</span></div>
-<div class="line"><a name="l00604"></a><span class="lineno">  604</span>   vector<string> nameVector=costfactory.getNameVector();</div>
-<div class="line"><a name="l00605"></a><span class="lineno">  605</span>   <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iname=0;iname<nameVector.size();++iname){</div>
-<div class="line"><a name="l00606"></a><span class="lineno">  606</span>     <span class="keywordflow">if</span>(costfactory.getClassValueMap().empty())</div>
-<div class="line"><a name="l00607"></a><span class="lineno">  607</span>       costfactory.pushBackClassName(nameVector[iname]);</div>
-<div class="line"><a name="l00608"></a><span class="lineno">  608</span>       <span class="comment">// cm.pushBackClassName(nameVector[iname]);</span></div>
-<div class="line"><a name="l00609"></a><span class="lineno">  609</span>     <span class="keywordflow">else</span> <span class="keywordflow">if</span>(costfactory.getClassIndex(type2string<short>((costfactory.getClassValueMap())[nameVector[iname]]))<0)</div>
-<div class="line"><a name="l00610"></a><span class="lineno">  610</span>       costfactory.pushBackClassName(type2string<short>((costfactory.getClassValueMap())[nameVector[iname]]));</div>
-<div class="line"><a name="l00611"></a><span class="lineno">  611</span>   }</div>
-<div class="line"><a name="l00612"></a><span class="lineno">  612</span> </div>
-<div class="line"><a name="l00613"></a><span class="lineno">  613</span> </div>
-<div class="line"><a name="l00614"></a><span class="lineno">  614</span>   <span class="comment">//Calculate features of training (and test) set</span></div>
-<div class="line"><a name="l00615"></a><span class="lineno">  615</span> </div>
-<div class="line"><a name="l00616"></a><span class="lineno">  616</span>   vector<unsigned int> nctraining;</div>
-<div class="line"><a name="l00617"></a><span class="lineno">  617</span>   vector<unsigned int> nctest;</div>
-<div class="line"><a name="l00618"></a><span class="lineno">  618</span>   nctraining.resize(nclass);</div>
-<div class="line"><a name="l00619"></a><span class="lineno">  619</span>   nctest.resize(nclass);</div>
-<div class="line"><a name="l00620"></a><span class="lineno">  620</span>   vector< Vector2d<float> > trainingFeatures(nclass);</div>
-<div class="line"><a name="l00621"></a><span class="lineno">  621</span>   <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iclass=0;iclass<nclass;++iclass){</div>
-<div class="line"><a name="l00622"></a><span class="lineno">  622</span>     <span class="keywordflow">if</span>(verbose_opt[0]>=1)</div>
-<div class="line"><a name="l00623"></a><span class="lineno">  623</span>       std::cout << <span class="stringliteral">"calculating features for class "</span> << iclass << std::endl;</div>
-<div class="line"><a name="l00624"></a><span class="lineno">  624</span>     nctraining[iclass]=trainingPixels[iclass].size();</div>
-<div class="line"><a name="l00625"></a><span class="lineno">  625</span>     <span class="keywordflow">if</span>(verbose_opt[0]>=1)</div>
-<div class="line"><a name="l00626"></a><span class="lineno">  626</span>       std::cout << <span class="stringliteral">"nctraining["</span> << iclass << <span class="stringliteral">"]: "</span> << nctraining[iclass] << std::endl;</div>
-<div class="line"><a name="l00627"></a><span class="lineno">  627</span>     <span class="keywordflow">if</span>(testPixels.size()>iclass){</div>
-<div class="line"><a name="l00628"></a><span class="lineno">  628</span>       nctest[iclass]=testPixels[iclass].size();</div>
-<div class="line"><a name="l00629"></a><span class="lineno">  629</span>       <span class="keywordflow">if</span>(verbose_opt[0]>=1){</div>
-<div class="line"><a name="l00630"></a><span class="lineno">  630</span>     std::cout << <span class="stringliteral">"nctest["</span> << iclass << <span class="stringliteral">"]: "</span> << nctest[iclass] << std::endl;</div>
-<div class="line"><a name="l00631"></a><span class="lineno">  631</span>       }</div>
-<div class="line"><a name="l00632"></a><span class="lineno">  632</span>     }</div>
-<div class="line"><a name="l00633"></a><span class="lineno">  633</span>     <span class="keywordflow">else</span></div>
-<div class="line"><a name="l00634"></a><span class="lineno">  634</span>       nctest[iclass]=0;</div>
+<div class="line"><a name="l00409"></a><span class="lineno">  409</span>   <span class="comment">//convert start and end band options to vector of band indexes</span></div>
+<div class="line"><a name="l00410"></a><span class="lineno">  410</span>   <span class="keywordflow">try</span>{</div>
+<div class="line"><a name="l00411"></a><span class="lineno">  411</span>     <span class="keywordflow">if</span>(bstart_opt.size()){</div>
+<div class="line"><a name="l00412"></a><span class="lineno">  412</span>       <span class="keywordflow">if</span>(bend_opt.size()!=bstart_opt.size()){</div>
+<div class="line"><a name="l00413"></a><span class="lineno">  413</span>     <span class="keywordtype">string</span> errorstring=<span class="stringliteral">"Error: options for start and end band indexes must be provided as pairs, missing end band"</span>;</div>
+<div class="line"><a name="l00414"></a><span class="lineno">  414</span>     <span class="keywordflow">throw</span>(errorstring);</div>
+<div class="line"><a name="l00415"></a><span class="lineno">  415</span>       }</div>
+<div class="line"><a name="l00416"></a><span class="lineno">  416</span>       band_opt.clear();</div>
+<div class="line"><a name="l00417"></a><span class="lineno">  417</span>       <span class="keywordflow">for</span>(<span class="keywordtype">int</span> ipair=0;ipair<bstart_opt.size();++ipair){</div>
+<div class="line"><a name="l00418"></a><span class="lineno">  418</span>     <span class="keywordflow">if</span>(bend_opt[ipair]<=bstart_opt[ipair]){</div>
+<div class="line"><a name="l00419"></a><span class="lineno">  419</span>       <span class="keywordtype">string</span> errorstring=<span class="stringliteral">"Error: index for end band must be smaller then start band"</span>;</div>
+<div class="line"><a name="l00420"></a><span class="lineno">  420</span>       <span class="keywordflow">throw</span>(errorstring);</div>
+<div class="line"><a name="l00421"></a><span class="lineno">  421</span>     }</div>
+<div class="line"><a name="l00422"></a><span class="lineno">  422</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iband=bstart_opt[ipair];iband<=bend_opt[ipair];++iband)</div>
+<div class="line"><a name="l00423"></a><span class="lineno">  423</span>       band_opt.push_back(iband);</div>
+<div class="line"><a name="l00424"></a><span class="lineno">  424</span>       }</div>
+<div class="line"><a name="l00425"></a><span class="lineno">  425</span>     }</div>
+<div class="line"><a name="l00426"></a><span class="lineno">  426</span>   }</div>
+<div class="line"><a name="l00427"></a><span class="lineno">  427</span>   <span class="keywordflow">catch</span>(<span class="keywordtype">string</span> error){</div>
+<div class="line"><a name="l00428"></a><span class="lineno">  428</span>     cerr << error << std::endl;</div>
+<div class="line"><a name="l00429"></a><span class="lineno">  429</span>     exit(1);</div>
+<div class="line"><a name="l00430"></a><span class="lineno">  430</span>   }</div>
+<div class="line"><a name="l00431"></a><span class="lineno">  431</span>   <span class="comment">//sort bands</span></div>
+<div class="line"><a name="l00432"></a><span class="lineno">  432</span>   <span class="keywordflow">if</span>(band_opt.size())</div>
+<div class="line"><a name="l00433"></a><span class="lineno">  433</span>     std::sort(band_opt.begin(),band_opt.end());</div>
+<div class="line"><a name="l00434"></a><span class="lineno">  434</span> </div>
+<div class="line"><a name="l00435"></a><span class="lineno">  435</span>   <span class="keywordflow">if</span>(classname_opt.size()){</div>
+<div class="line"><a name="l00436"></a><span class="lineno">  436</span>     assert(classname_opt.size()==classvalue_opt.size());</div>
+<div class="line"><a name="l00437"></a><span class="lineno">  437</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iclass=0;iclass<classname_opt.size();++iclass)</div>
+<div class="line"><a name="l00438"></a><span class="lineno">  438</span>       costfactory.setClassValueMap(classname_opt[iclass],classvalue_opt[iclass]);</div>
+<div class="line"><a name="l00439"></a><span class="lineno">  439</span>   }</div>
+<div class="line"><a name="l00440"></a><span class="lineno">  440</span> </div>
+<div class="line"><a name="l00441"></a><span class="lineno">  441</span>   <span class="comment">//----------------------------------- Training -------------------------------</span></div>
+<div class="line"><a name="l00442"></a><span class="lineno">  442</span>   vector<double> offset;</div>
+<div class="line"><a name="l00443"></a><span class="lineno">  443</span>   vector<double> scale;</div>
+<div class="line"><a name="l00444"></a><span class="lineno">  444</span>   vector< Vector2d<float> > trainingPixels;<span class="comment">//[class][sample][band]</span></div>
+<div class="line"><a name="l00445"></a><span class="lineno">  445</span>   vector< Vector2d<float> > testPixels;<span class="comment">//[class][sample][band]</span></div>
+<div class="line"><a name="l00446"></a><span class="lineno">  446</span>   map<string,Vector2d<float> > trainingMap;</div>
+<div class="line"><a name="l00447"></a><span class="lineno">  447</span>   map<string,Vector2d<float> > testMap;</div>
+<div class="line"><a name="l00448"></a><span class="lineno">  448</span>   vector<string> fields;</div>
+<div class="line"><a name="l00449"></a><span class="lineno">  449</span> </div>
+<div class="line"><a name="l00450"></a><span class="lineno">  450</span>   <span class="keyword">struct </span><a class="code" href="structsvm__problem.html">svm_problem</a> prob;</div>
+<div class="line"><a name="l00451"></a><span class="lineno">  451</span>   <span class="comment">//organize training data</span></div>
+<div class="line"><a name="l00452"></a><span class="lineno">  452</span>   trainingPixels.clear();</div>
+<div class="line"><a name="l00453"></a><span class="lineno">  453</span>   testPixels.clear();</div>
+<div class="line"><a name="l00454"></a><span class="lineno">  454</span>   <span class="keywordflow">if</span>(verbose_opt[0]>=1)</div>
+<div class="line"><a name="l00455"></a><span class="lineno">  455</span>     std::cout << <span class="stringliteral">"reading training file "</span> << training_opt[0] << std::endl;</div>
+<div class="line"><a name="l00456"></a><span class="lineno">  456</span>   <span class="keywordflow">try</span>{</div>
+<div class="line"><a name="l00457"></a><span class="lineno">  457</span>     <a class="code" href="classImgReaderOgr.html">ImgReaderOgr</a> trainingReader(training_opt[0]);</div>
+<div class="line"><a name="l00458"></a><span class="lineno">  458</span>     <span class="keywordflow">if</span>(band_opt.size()){</div>
+<div class="line"><a name="l00459"></a><span class="lineno">  459</span>       totalSamples=trainingReader.readDataImageOgr(trainingMap,fields,band_opt,label_opt[0],tlayer_opt,verbose_opt[0]);</div>
+<div class="line"><a name="l00460"></a><span class="lineno">  460</span>       <span class="keywordflow">if</span>(input_opt.size()){</div>
+<div class="line"><a name="l00461"></a><span class="lineno">  461</span>     <a class="code" href="classImgReaderOgr.html">ImgReaderOgr</a> inputReader(input_opt[0]);</div>
+<div class="line"><a name="l00462"></a><span class="lineno">  462</span>     totalTestSamples=inputReader.readDataImageOgr(testMap,fields,band_opt,label_opt[0],tlayer_opt,verbose_opt[0]);</div>
+<div class="line"><a name="l00463"></a><span class="lineno">  463</span>     inputReader.close();</div>
+<div class="line"><a name="l00464"></a><span class="lineno">  464</span>       }</div>
+<div class="line"><a name="l00465"></a><span class="lineno">  465</span>     }</div>
+<div class="line"><a name="l00466"></a><span class="lineno">  466</span>     <span class="keywordflow">else</span>{</div>
+<div class="line"><a name="l00467"></a><span class="lineno">  467</span>       totalSamples=trainingReader.readDataImageOgr(trainingMap,fields,0,0,label_opt[0],tlayer_opt,verbose_opt[0]);</div>
+<div class="line"><a name="l00468"></a><span class="lineno">  468</span>       <span class="keywordflow">if</span>(input_opt.size()){</div>
+<div class="line"><a name="l00469"></a><span class="lineno">  469</span>     <a class="code" href="classImgReaderOgr.html">ImgReaderOgr</a> inputReader(input_opt[0]);</div>
+<div class="line"><a name="l00470"></a><span class="lineno">  470</span>     totalTestSamples=inputReader.readDataImageOgr(testMap,fields,0,0,label_opt[0],tlayer_opt,verbose_opt[0]);</div>
+<div class="line"><a name="l00471"></a><span class="lineno">  471</span>     inputReader.close();</div>
+<div class="line"><a name="l00472"></a><span class="lineno">  472</span>       }</div>
+<div class="line"><a name="l00473"></a><span class="lineno">  473</span>     }</div>
+<div class="line"><a name="l00474"></a><span class="lineno">  474</span>     <span class="keywordflow">if</span>(trainingMap.size()<2){</div>
+<div class="line"><a name="l00475"></a><span class="lineno">  475</span>       <span class="keywordtype">string</span> errorstring=<span class="stringliteral">"Error: could not read at least two classes from training input file"</span>;</div>
+<div class="line"><a name="l00476"></a><span class="lineno">  476</span>       <span class="keywordflow">throw</span>(errorstring);</div>
+<div class="line"><a name="l00477"></a><span class="lineno">  477</span>     }</div>
+<div class="line"><a name="l00478"></a><span class="lineno">  478</span>     <span class="keywordflow">if</span>(input_opt.size()&&testMap.size()<2){</div>
+<div class="line"><a name="l00479"></a><span class="lineno">  479</span>       <span class="keywordtype">string</span> errorstring=<span class="stringliteral">"Error: could not read at least two classes from test input file"</span>;</div>
+<div class="line"><a name="l00480"></a><span class="lineno">  480</span>       <span class="keywordflow">throw</span>(errorstring);</div>
+<div class="line"><a name="l00481"></a><span class="lineno">  481</span>     }</div>
+<div class="line"><a name="l00482"></a><span class="lineno">  482</span>     trainingReader.close();</div>
+<div class="line"><a name="l00483"></a><span class="lineno">  483</span>   }</div>
+<div class="line"><a name="l00484"></a><span class="lineno">  484</span>   <span class="keywordflow">catch</span>(<span class="keywordtype">string</span> error){</div>
+<div class="line"><a name="l00485"></a><span class="lineno">  485</span>     cerr << error << std::endl;</div>
+<div class="line"><a name="l00486"></a><span class="lineno">  486</span>     exit(1);</div>
+<div class="line"><a name="l00487"></a><span class="lineno">  487</span>   }</div>
+<div class="line"><a name="l00488"></a><span class="lineno">  488</span>   <span class="keywordflow">catch</span>(std::exception& e){</div>
+<div class="line"><a name="l00489"></a><span class="lineno">  489</span>     std::cerr << <span class="stringliteral">"Error: "</span>;</div>
+<div class="line"><a name="l00490"></a><span class="lineno">  490</span>     std::cerr << e.what() << std::endl;</div>
+<div class="line"><a name="l00491"></a><span class="lineno">  491</span>     std::cerr << CPLGetLastErrorMsg() << std::endl; </div>
+<div class="line"><a name="l00492"></a><span class="lineno">  492</span>     exit(1);</div>
+<div class="line"><a name="l00493"></a><span class="lineno">  493</span>   }</div>
+<div class="line"><a name="l00494"></a><span class="lineno">  494</span>   <span class="keywordflow">catch</span>(...){</div>
+<div class="line"><a name="l00495"></a><span class="lineno">  495</span>     cerr << <span class="stringliteral">"error catched"</span> << std::endl;</div>
+<div class="line"><a name="l00496"></a><span class="lineno">  496</span>     exit(1);</div>
+<div class="line"><a name="l00497"></a><span class="lineno">  497</span>   }</div>
+<div class="line"><a name="l00498"></a><span class="lineno">  498</span>   <span class="comment">//todo: delete class 0 ?</span></div>
+<div class="line"><a name="l00499"></a><span class="lineno">  499</span>   <span class="comment">// if(verbose_opt[0]>=1)</span></div>
+<div class="line"><a name="l00500"></a><span class="lineno">  500</span>   <span class="comment">//   std::cout << "erasing class 0 from training set (" << trainingMap[0].size() << " from " << totalSamples << ") samples" << std::endl;</span></div>
+<div class="line"><a name="l00501"></a><span class="lineno">  501</span>   <span class="comment">// totalSamples-=trainingMap[0].size();</span></div>
+<div class="line"><a name="l00502"></a><span class="lineno">  502</span>   <span class="comment">// trainingMap.erase(0);</span></div>
+<div class="line"><a name="l00503"></a><span class="lineno">  503</span> </div>
+<div class="line"><a name="l00504"></a><span class="lineno">  504</span>   <span class="keywordflow">if</span>(verbose_opt[0]>1)</div>
+<div class="line"><a name="l00505"></a><span class="lineno">  505</span>     std::cout << <span class="stringliteral">"training pixels: "</span> << std::endl;</div>
+<div class="line"><a name="l00506"></a><span class="lineno">  506</span>   map<string,Vector2d<float> >::iterator mapit=trainingMap.begin();</div>
+<div class="line"><a name="l00507"></a><span class="lineno">  507</span>   <span class="keywordflow">while</span>(mapit!=trainingMap.end()){</div>
+<div class="line"><a name="l00508"></a><span class="lineno">  508</span>     <span class="comment">//delete small classes</span></div>
+<div class="line"><a name="l00509"></a><span class="lineno">  509</span>     <span class="keywordflow">if</span>((mapit->second).size()<minSize_opt[0]){</div>
+<div class="line"><a name="l00510"></a><span class="lineno">  510</span>       trainingMap.erase(mapit);</div>
+<div class="line"><a name="l00511"></a><span class="lineno">  511</span>       <span class="keywordflow">continue</span>;</div>
+<div class="line"><a name="l00512"></a><span class="lineno">  512</span>     }</div>
+<div class="line"><a name="l00513"></a><span class="lineno">  513</span>     costfactory.pushBackName(mapit->first);</div>
+<div class="line"><a name="l00514"></a><span class="lineno">  514</span>     trainingPixels.push_back(mapit->second);</div>
+<div class="line"><a name="l00515"></a><span class="lineno">  515</span>     <span class="keywordflow">if</span>(verbose_opt[0]>1)</div>
+<div class="line"><a name="l00516"></a><span class="lineno">  516</span>       std::cout << mapit->first << <span class="stringliteral">": "</span> << (mapit->second).size() << <span class="stringliteral">" samples"</span> << std::endl;</div>
+<div class="line"><a name="l00517"></a><span class="lineno">  517</span>     ++mapit;</div>
+<div class="line"><a name="l00518"></a><span class="lineno">  518</span>   }</div>
+<div class="line"><a name="l00519"></a><span class="lineno">  519</span>   nclass=trainingPixels.size();</div>
+<div class="line"><a name="l00520"></a><span class="lineno">  520</span>   <span class="keywordflow">if</span>(classname_opt.size())</div>
+<div class="line"><a name="l00521"></a><span class="lineno">  521</span>     assert(nclass==classname_opt.size());</div>
+<div class="line"><a name="l00522"></a><span class="lineno">  522</span>   nband=trainingPixels[0][0].size()-2;<span class="comment">//X and Y//trainingPixels[0][0].size();</span></div>
+<div class="line"><a name="l00523"></a><span class="lineno">  523</span> </div>
+<div class="line"><a name="l00524"></a><span class="lineno">  524</span>   mapit=testMap.begin();</div>
+<div class="line"><a name="l00525"></a><span class="lineno">  525</span>   <span class="keywordflow">while</span>(mapit!=testMap.end()){</div>
+<div class="line"><a name="l00526"></a><span class="lineno">  526</span>     <span class="keywordflow">if</span>(costfactory.getClassValueMap().size()){</div>
+<div class="line"><a name="l00527"></a><span class="lineno">  527</span>     <span class="comment">// if(classValueMap.size()){</span></div>
+<div class="line"><a name="l00528"></a><span class="lineno">  528</span>       <span class="comment">//check if name in test is covered by classname_opt (values can not be 0)</span></div>
+<div class="line"><a name="l00529"></a><span class="lineno">  529</span>       <span class="keywordflow">if</span>((costfactory.getClassValueMap())[mapit->first]>0){</div>
+<div class="line"><a name="l00530"></a><span class="lineno">  530</span>         ;<span class="comment">//ok, no need to print to std::cout </span></div>
+<div class="line"><a name="l00531"></a><span class="lineno">  531</span>       }</div>
+<div class="line"><a name="l00532"></a><span class="lineno">  532</span>       <span class="keywordflow">else</span>{</div>
+<div class="line"><a name="l00533"></a><span class="lineno">  533</span>         std::cerr << <span class="stringliteral">"Error: names in classname option are not complete, please check names in test vector and make sure classvalue is > 0"</span> << std::endl;</div>
+<div class="line"><a name="l00534"></a><span class="lineno">  534</span>         exit(1);</div>
+<div class="line"><a name="l00535"></a><span class="lineno">  535</span>       }</div>
+<div class="line"><a name="l00536"></a><span class="lineno">  536</span>     }    </div>
+<div class="line"><a name="l00537"></a><span class="lineno">  537</span>     <span class="comment">//no need to delete small classes for test sample</span></div>
+<div class="line"><a name="l00538"></a><span class="lineno">  538</span>     testPixels.push_back(mapit->second);</div>
+<div class="line"><a name="l00539"></a><span class="lineno">  539</span>     <span class="keywordflow">if</span>(verbose_opt[0]>1)</div>
+<div class="line"><a name="l00540"></a><span class="lineno">  540</span>       std::cout << mapit->first << <span class="stringliteral">": "</span> << (mapit->second).size() << <span class="stringliteral">" samples"</span> << std::endl;</div>
+<div class="line"><a name="l00541"></a><span class="lineno">  541</span>     ++mapit;</div>
+<div class="line"><a name="l00542"></a><span class="lineno">  542</span>   }</div>
+<div class="line"><a name="l00543"></a><span class="lineno">  543</span>   <span class="keywordflow">if</span>(input_opt.size()){</div>
+<div class="line"><a name="l00544"></a><span class="lineno">  544</span>     assert(nclass==testPixels.size());</div>
+<div class="line"><a name="l00545"></a><span class="lineno">  545</span>     assert(nband=testPixels[0][0].size()-2);<span class="comment">//X and Y//testPixels[0][0].size();</span></div>
+<div class="line"><a name="l00546"></a><span class="lineno">  546</span>     assert(!cv_opt[0]);</div>
+<div class="line"><a name="l00547"></a><span class="lineno">  547</span>   }</div>
+<div class="line"><a name="l00548"></a><span class="lineno">  548</span> </div>
+<div class="line"><a name="l00549"></a><span class="lineno">  549</span>   <span class="comment">//do not remove outliers here: could easily be obtained through ogr2ogr -where 'B2<110' output.shp input.shp</span></div>
+<div class="line"><a name="l00550"></a><span class="lineno">  550</span>   <span class="comment">//balance training data</span></div>
+<div class="line"><a name="l00551"></a><span class="lineno">  551</span>   <span class="comment">//todo: do I mean to use random_opt?</span></div>
+<div class="line"><a name="l00552"></a><span class="lineno">  552</span>   <span class="keywordflow">if</span>(balance_opt[0]>0){</div>
+<div class="line"><a name="l00553"></a><span class="lineno">  553</span>     <span class="keywordflow">if</span>(random_opt[0])</div>
+<div class="line"><a name="l00554"></a><span class="lineno">  554</span>       srand(time(NULL));</div>
+<div class="line"><a name="l00555"></a><span class="lineno">  555</span>     totalSamples=0;</div>
+<div class="line"><a name="l00556"></a><span class="lineno">  556</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iclass=0;iclass<nclass;++iclass){</div>
+<div class="line"><a name="l00557"></a><span class="lineno">  557</span>       <span class="keywordflow">if</span>(trainingPixels[iclass].size()>balance_opt[0]){</div>
+<div class="line"><a name="l00558"></a><span class="lineno">  558</span>         <span class="keywordflow">while</span>(trainingPixels[iclass].size()>balance_opt[0]){</div>
+<div class="line"><a name="l00559"></a><span class="lineno">  559</span>           <span class="keywordtype">int</span> index=rand()%trainingPixels[iclass].size();</div>
+<div class="line"><a name="l00560"></a><span class="lineno">  560</span>           trainingPixels[iclass].erase(trainingPixels[iclass].begin()+index);</div>
+<div class="line"><a name="l00561"></a><span class="lineno">  561</span>         }</div>
+<div class="line"><a name="l00562"></a><span class="lineno">  562</span>       }</div>
+<div class="line"><a name="l00563"></a><span class="lineno">  563</span>       <span class="keywordflow">else</span>{</div>
+<div class="line"><a name="l00564"></a><span class="lineno">  564</span>         <span class="keywordtype">int</span> oldsize=trainingPixels[iclass].size();</div>
+<div class="line"><a name="l00565"></a><span class="lineno">  565</span>         <span class="keywordflow">for</span>(<span class="keywordtype">int</span> isample=trainingPixels[iclass].size();isample<balance_opt[0];++isample){</div>
+<div class="line"><a name="l00566"></a><span class="lineno">  566</span>           <span class="keywordtype">int</span> index = rand()%oldsize;</div>
+<div class="line"><a name="l00567"></a><span class="lineno">  567</span>           trainingPixels[iclass].push_back(trainingPixels[iclass][index]);</div>
+<div class="line"><a name="l00568"></a><span class="lineno">  568</span>         }</div>
+<div class="line"><a name="l00569"></a><span class="lineno">  569</span>       }</div>
+<div class="line"><a name="l00570"></a><span class="lineno">  570</span>       totalSamples+=trainingPixels[iclass].size();</div>
+<div class="line"><a name="l00571"></a><span class="lineno">  571</span>     }</div>
+<div class="line"><a name="l00572"></a><span class="lineno">  572</span>     assert(totalSamples==nclass*balance_opt[0]);</div>
+<div class="line"><a name="l00573"></a><span class="lineno">  573</span>   }</div>
+<div class="line"><a name="l00574"></a><span class="lineno">  574</span>     </div>
+<div class="line"><a name="l00575"></a><span class="lineno">  575</span>   <span class="comment">//set scale and offset</span></div>
+<div class="line"><a name="l00576"></a><span class="lineno">  576</span>   offset.resize(nband);</div>
+<div class="line"><a name="l00577"></a><span class="lineno">  577</span>   scale.resize(nband);</div>
+<div class="line"><a name="l00578"></a><span class="lineno">  578</span>   <span class="keywordflow">if</span>(offset_opt.size()>1)</div>
+<div class="line"><a name="l00579"></a><span class="lineno">  579</span>     assert(offset_opt.size()==nband);</div>
+<div class="line"><a name="l00580"></a><span class="lineno">  580</span>   <span class="keywordflow">if</span>(scale_opt.size()>1)</div>
+<div class="line"><a name="l00581"></a><span class="lineno">  581</span>     assert(scale_opt.size()==nband);</div>
+<div class="line"><a name="l00582"></a><span class="lineno">  582</span>   <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iband=0;iband<nband;++iband){</div>
+<div class="line"><a name="l00583"></a><span class="lineno">  583</span>     <span class="keywordflow">if</span>(verbose_opt[0]>1)</div>
+<div class="line"><a name="l00584"></a><span class="lineno">  584</span>       std::cout << <span class="stringliteral">"scaling for band"</span> << iband << std::endl;</div>
+<div class="line"><a name="l00585"></a><span class="lineno">  585</span>     offset[iband]=(offset_opt.size()==1)?offset_opt[0]:offset_opt[iband];</div>
+<div class="line"><a name="l00586"></a><span class="lineno">  586</span>     scale[iband]=(scale_opt.size()==1)?scale_opt[0]:scale_opt[iband];</div>
+<div class="line"><a name="l00587"></a><span class="lineno">  587</span>     <span class="comment">//search for min and maximum</span></div>
+<div class="line"><a name="l00588"></a><span class="lineno">  588</span>     <span class="keywordflow">if</span>(scale[iband]<=0){</div>
+<div class="line"><a name="l00589"></a><span class="lineno">  589</span>       <span class="keywordtype">float</span> theMin=trainingPixels[0][0][iband+startBand];</div>
+<div class="line"><a name="l00590"></a><span class="lineno">  590</span>       <span class="keywordtype">float</span> theMax=trainingPixels[0][0][iband+startBand];</div>
+<div class="line"><a name="l00591"></a><span class="lineno">  591</span>       <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iclass=0;iclass<nclass;++iclass){</div>
+<div class="line"><a name="l00592"></a><span class="lineno">  592</span>         <span class="keywordflow">for</span>(<span class="keywordtype">int</span> isample=0;isample<trainingPixels[iclass].size();++isample){</div>
+<div class="line"><a name="l00593"></a><span class="lineno">  593</span>           <span class="keywordflow">if</span>(theMin>trainingPixels[iclass][isample][iband+startBand])</div>
+<div class="line"><a name="l00594"></a><span class="lineno">  594</span>             theMin=trainingPixels[iclass][isample][iband+startBand];</div>
+<div class="line"><a name="l00595"></a><span class="lineno">  595</span>           <span class="keywordflow">if</span>(theMax<trainingPixels[iclass][isample][iband+startBand])</div>
+<div class="line"><a name="l00596"></a><span class="lineno">  596</span>             theMax=trainingPixels[iclass][isample][iband+startBand];</div>
+<div class="line"><a name="l00597"></a><span class="lineno">  597</span>         }</div>
+<div class="line"><a name="l00598"></a><span class="lineno">  598</span>       }</div>
+<div class="line"><a name="l00599"></a><span class="lineno">  599</span>       offset[iband]=theMin+(theMax-theMin)/2.0;</div>
+<div class="line"><a name="l00600"></a><span class="lineno">  600</span>       scale[iband]=(theMax-theMin)/2.0;</div>
+<div class="line"><a name="l00601"></a><span class="lineno">  601</span>       <span class="keywordflow">if</span>(verbose_opt[0]>1){</div>
+<div class="line"><a name="l00602"></a><span class="lineno">  602</span>         std::cout << <span class="stringliteral">"Extreme image values for band "</span> << iband << <span class="stringliteral">": ["</span> << theMin << <span class="stringliteral">","</span> << theMax << <span class="stringliteral">"]"</span> << std::endl;</div>
+<div class="line"><a name="l00603"></a><span class="lineno">  603</span>         std::cout << <span class="stringliteral">"Using offset, scale: "</span> << offset[iband] << <span class="stringliteral">", "</span> << scale[iband] << std::endl;</div>
+<div class="line"><a name="l00604"></a><span class="lineno">  604</span>         std::cout << <span class="stringliteral">"scaled values for band "</span> << iband << <span class="stringliteral">": ["</span> << (theMin-offset[iband])/scale[iband] << <span class="stringliteral">","</span> << (theMax-offset[iband])/scale[iband] << <span class="stringliteral">"]"</span> << std::endl;</div>
+<div class="line"><a name="l00605"></a><span class="lineno">  605</span>       }</div>
+<div class="line"><a name="l00606"></a><span class="lineno">  606</span>     }</div>
+<div class="line"><a name="l00607"></a><span class="lineno">  607</span>   }</div>
+<div class="line"><a name="l00608"></a><span class="lineno">  608</span> </div>
+<div class="line"><a name="l00609"></a><span class="lineno">  609</span>   <span class="comment">// if(priors_opt.size()==1){//default: equal priors for each class</span></div>
+<div class="line"><a name="l00610"></a><span class="lineno">  610</span>   <span class="comment">//   priors.resize(nclass);</span></div>
+<div class="line"><a name="l00611"></a><span class="lineno">  611</span>   <span class="comment">//   for(int iclass=0;iclass<nclass;++iclass)</span></div>
+<div class="line"><a name="l00612"></a><span class="lineno">  612</span>   <span class="comment">//     priors[iclass]=1.0/nclass;</span></div>
+<div class="line"><a name="l00613"></a><span class="lineno">  613</span>   <span class="comment">// }</span></div>
+<div class="line"><a name="l00614"></a><span class="lineno">  614</span>   <span class="comment">// assert(priors_opt.size()==1||priors_opt.size()==nclass);</span></div>
+<div class="line"><a name="l00615"></a><span class="lineno">  615</span>     </div>
+<div class="line"><a name="l00616"></a><span class="lineno">  616</span>   <span class="keywordflow">if</span>(verbose_opt[0]>=1){</div>
+<div class="line"><a name="l00617"></a><span class="lineno">  617</span>     std::cout << <span class="stringliteral">"number of bands: "</span> << nband << std::endl;</div>
+<div class="line"><a name="l00618"></a><span class="lineno">  618</span>     std::cout << <span class="stringliteral">"number of classes: "</span> << nclass << std::endl;</div>
+<div class="line"><a name="l00619"></a><span class="lineno">  619</span>     <span class="comment">// std::cout << "priors:";</span></div>
+<div class="line"><a name="l00620"></a><span class="lineno">  620</span>     <span class="comment">// for(int iclass=0;iclass<nclass;++iclass)</span></div>
+<div class="line"><a name="l00621"></a><span class="lineno">  621</span>     <span class="comment">//   std::cout << " " << priors[iclass];</span></div>
+<div class="line"><a name="l00622"></a><span class="lineno">  622</span>     <span class="comment">// std::cout << std::endl;</span></div>
+<div class="line"><a name="l00623"></a><span class="lineno">  623</span>   }</div>
+<div class="line"><a name="l00624"></a><span class="lineno">  624</span> </div>
+<div class="line"><a name="l00625"></a><span class="lineno">  625</span>   <span class="comment">//set names in confusion matrix using nameVector</span></div>
+<div class="line"><a name="l00626"></a><span class="lineno">  626</span>   vector<string> nameVector=costfactory.getNameVector();</div>
+<div class="line"><a name="l00627"></a><span class="lineno">  627</span>   <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iname=0;iname<nameVector.size();++iname){</div>
+<div class="line"><a name="l00628"></a><span class="lineno">  628</span>     <span class="keywordflow">if</span>(costfactory.getClassValueMap().empty())</div>
+<div class="line"><a name="l00629"></a><span class="lineno">  629</span>       costfactory.pushBackClassName(nameVector[iname]);</div>
+<div class="line"><a name="l00630"></a><span class="lineno">  630</span>       <span class="comment">// cm.pushBackClassName(nameVector[iname]);</span></div>
+<div class="line"><a name="l00631"></a><span class="lineno">  631</span>     <span class="keywordflow">else</span> <span class="keywordflow">if</span>(costfactory.getClassIndex(type2string<short>((costfactory.getClassValueMap())[nameVector[iname]]))<0)</div>
+<div class="line"><a name="l00632"></a><span class="lineno">  632</span>       costfactory.pushBackClassName(type2string<short>((costfactory.getClassValueMap())[nameVector[iname]]));</div>
+<div class="line"><a name="l00633"></a><span class="lineno">  633</span>   }</div>
+<div class="line"><a name="l00634"></a><span class="lineno">  634</span> </div>
 <div class="line"><a name="l00635"></a><span class="lineno">  635</span> </div>
-<div class="line"><a name="l00636"></a><span class="lineno">  636</span>     trainingFeatures[iclass].resize(nctraining[iclass]+nctest[iclass]);</div>
-<div class="line"><a name="l00637"></a><span class="lineno">  637</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> isample=0;isample<nctraining[iclass];++isample){</div>
-<div class="line"><a name="l00638"></a><span class="lineno">  638</span>       <span class="comment">//scale pixel values according to scale and offset!!!</span></div>
-<div class="line"><a name="l00639"></a><span class="lineno">  639</span>       <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iband=0;iband<nband;++iband){</div>
-<div class="line"><a name="l00640"></a><span class="lineno">  640</span>         assert(trainingPixels[iclass].size()>isample);</div>
-<div class="line"><a name="l00641"></a><span class="lineno">  641</span>         assert(trainingPixels[iclass][isample].size()>iband+startBand);</div>
-<div class="line"><a name="l00642"></a><span class="lineno">  642</span>         assert(offset.size()>iband);</div>
-<div class="line"><a name="l00643"></a><span class="lineno">  643</span>         assert(scale.size()>iband);</div>
-<div class="line"><a name="l00644"></a><span class="lineno">  644</span>         <span class="keywordtype">float</span> value=trainingPixels[iclass][isample][iband+startBand];</div>
-<div class="line"><a name="l00645"></a><span class="lineno">  645</span>         trainingFeatures[iclass][isample].push_back((value-offset[iband])/scale[iband]);</div>
-<div class="line"><a name="l00646"></a><span class="lineno">  646</span>       }</div>
-<div class="line"><a name="l00647"></a><span class="lineno">  647</span>     }</div>
-<div class="line"><a name="l00648"></a><span class="lineno">  648</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> isample=0;isample<nctest[iclass];++isample){</div>
-<div class="line"><a name="l00649"></a><span class="lineno">  649</span>       <span class="comment">//scale pixel values according to scale and offset!!!</span></div>
-<div class="line"><a name="l00650"></a><span class="lineno">  650</span>       <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iband=0;iband<nband;++iband){</div>
-<div class="line"><a name="l00651"></a><span class="lineno">  651</span>         assert(testPixels[iclass].size()>isample);</div>
-<div class="line"><a name="l00652"></a><span class="lineno">  652</span>         assert(testPixels[iclass][isample].size()>iband+startBand);</div>
-<div class="line"><a name="l00653"></a><span class="lineno">  653</span>         assert(offset.size()>iband);</div>
-<div class="line"><a name="l00654"></a><span class="lineno">  654</span>         assert(scale.size()>iband);</div>
-<div class="line"><a name="l00655"></a><span class="lineno">  655</span>         <span class="keywordtype">float</span> value=testPixels[iclass][isample][iband+startBand];</div>
-<div class="line"><a name="l00656"></a><span class="lineno">  656</span>         <span class="comment">// testFeatures[iclass][isample].push_back((value-offset[iband])/scale[iband]);</span></div>
-<div class="line"><a name="l00657"></a><span class="lineno">  657</span>         trainingFeatures[iclass][nctraining[iclass]+isample].push_back((value-offset[iband])/scale[iband]);</div>
-<div class="line"><a name="l00658"></a><span class="lineno">  658</span>       }</div>
-<div class="line"><a name="l00659"></a><span class="lineno">  659</span>     }</div>
-<div class="line"><a name="l00660"></a><span class="lineno">  660</span>     assert(trainingFeatures[iclass].size()==nctraining[iclass]+nctest[iclass]);</div>
-<div class="line"><a name="l00661"></a><span class="lineno">  661</span>   }</div>
-<div class="line"><a name="l00662"></a><span class="lineno">  662</span> </div>
-<div class="line"><a name="l00663"></a><span class="lineno">  663</span>   costfactory.setNcTraining(nctraining);</div>
-<div class="line"><a name="l00664"></a><span class="lineno">  664</span>   costfactory.setNcTest(nctest);</div>
-<div class="line"><a name="l00665"></a><span class="lineno">  665</span>   <span class="keywordtype">int</span> nFeatures=trainingFeatures[0][0].size();</div>
-<div class="line"><a name="l00666"></a><span class="lineno">  666</span>   <span class="keywordtype">int</span> maxFeatures=(maxFeatures_opt[0])? maxFeatures_opt[0] : 1;</div>
-<div class="line"><a name="l00667"></a><span class="lineno">  667</span>   <span class="keywordtype">double</span> previousCost=-1;</div>
-<div class="line"><a name="l00668"></a><span class="lineno">  668</span>   <span class="keywordtype">double</span> cost=0;</div>
-<div class="line"><a name="l00669"></a><span class="lineno">  669</span>   list<int> subset;<span class="comment">//set of selected features (levels) for each class combination</span></div>
-<div class="line"><a name="l00670"></a><span class="lineno">  670</span>   <a class="code" href="classFeatureSelector.html">FeatureSelector</a> selector;</div>
-<div class="line"><a name="l00671"></a><span class="lineno">  671</span>   <span class="keywordflow">try</span>{</div>
-<div class="line"><a name="l00672"></a><span class="lineno">  672</span>     <span class="keywordflow">if</span>(maxFeatures>=nFeatures){</div>
-<div class="line"><a name="l00673"></a><span class="lineno">  673</span>       subset.clear();</div>
-<div class="line"><a name="l00674"></a><span class="lineno">  674</span>       <span class="keywordflow">for</span>(<span class="keywordtype">int</span> ifeature=0;ifeature<nFeatures;++ifeature)</div>
-<div class="line"><a name="l00675"></a><span class="lineno">  675</span>         subset.push_back(ifeature);</div>
-<div class="line"><a name="l00676"></a><span class="lineno">  676</span>       cost=costfactory.getCost(trainingFeatures);</div>
-<div class="line"><a name="l00677"></a><span class="lineno">  677</span>     }</div>
-<div class="line"><a name="l00678"></a><span class="lineno">  678</span>     <span class="keywordflow">else</span>{</div>
-<div class="line"><a name="l00679"></a><span class="lineno">  679</span>       <span class="keywordflow">while</span>(fabs(cost-previousCost)>=epsilon_cost_opt[0]){</div>
-<div class="line"><a name="l00680"></a><span class="lineno">  680</span>         previousCost=cost;</div>
-<div class="line"><a name="l00681"></a><span class="lineno">  681</span>         <span class="keywordflow">switch</span>(selMap[selector_opt[0]]){</div>
-<div class="line"><a name="l00682"></a><span class="lineno">  682</span>         <span class="keywordflow">case</span>(SFFS):</div>
-<div class="line"><a name="l00683"></a><span class="lineno">  683</span>           subset.clear();<span class="comment">//needed to clear in case of floating and brute force search</span></div>
-<div class="line"><a name="l00684"></a><span class="lineno">  684</span>           cost=selector.floating(trainingFeatures,costfactory,subset,maxFeatures,epsilon_cost_opt[0],verbose_opt[0]);</div>
-<div class="line"><a name="l00685"></a><span class="lineno">  685</span>           <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l00686"></a><span class="lineno">  686</span>         <span class="keywordflow">case</span>(SFS):</div>
-<div class="line"><a name="l00687"></a><span class="lineno">  687</span>           cost=selector.forward(trainingFeatures,costfactory,subset,maxFeatures,verbose_opt[0]);</div>
-<div class="line"><a name="l00688"></a><span class="lineno">  688</span>           <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l00689"></a><span class="lineno">  689</span>         <span class="keywordflow">case</span>(SBS):</div>
-<div class="line"><a name="l00690"></a><span class="lineno">  690</span>           cost=selector.backward(trainingFeatures,costfactory,subset,maxFeatures,verbose_opt[0]);</div>
-<div class="line"><a name="l00691"></a><span class="lineno">  691</span>           <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l00692"></a><span class="lineno">  692</span>         <span class="keywordflow">case</span>(BFS):</div>
-<div class="line"><a name="l00693"></a><span class="lineno">  693</span>           subset.clear();<span class="comment">//needed to clear in case of floating and brute force search</span></div>
-<div class="line"><a name="l00694"></a><span class="lineno">  694</span>           cost=selector.bruteForce(trainingFeatures,costfactory,subset,maxFeatures,verbose_opt[0]);</div>
-<div class="line"><a name="l00695"></a><span class="lineno">  695</span>           <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l00696"></a><span class="lineno">  696</span>         <span class="keywordflow">default</span>:</div>
-<div class="line"><a name="l00697"></a><span class="lineno">  697</span>           std::cout << <span class="stringliteral">"Error: selector not supported, please use sffs, sfs, sbs or bfs"</span> << std::endl;</div>
-<div class="line"><a name="l00698"></a><span class="lineno">  698</span>           exit(1);</div>
-<div class="line"><a name="l00699"></a><span class="lineno">  699</span>           <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l00700"></a><span class="lineno">  700</span>         }</div>
-<div class="line"><a name="l00701"></a><span class="lineno">  701</span>         <span class="keywordflow">if</span>(verbose_opt[0]>1){</div>
-<div class="line"><a name="l00702"></a><span class="lineno">  702</span>           std::cout << <span class="stringliteral">"cost: "</span> << cost << std::endl;</div>
-<div class="line"><a name="l00703"></a><span class="lineno">  703</span>           std::cout << <span class="stringliteral">"previousCost: "</span> << previousCost << std::endl;</div>
-<div class="line"><a name="l00704"></a><span class="lineno">  704</span>           std::cout << std::setprecision(12) << <span class="stringliteral">"cost-previousCost: "</span> << cost - previousCost << <span class="stringliteral">" ( "</span> << epsilon_cost_opt[0] << <span class="stringliteral">")"</span> << std::endl;</div>
-<div class="line"><a name="l00705"></a><span class="lineno">  705</span>         }</div>
-<div class="line"><a name="l00706"></a><span class="lineno">  706</span>         <span class="keywordflow">if</span>(!maxFeatures_opt[0])</div>
-<div class="line"><a name="l00707"></a><span class="lineno">  707</span>           ++maxFeatures;</div>
-<div class="line"><a name="l00708"></a><span class="lineno">  708</span>         <span class="keywordflow">else</span></div>
-<div class="line"><a name="l00709"></a><span class="lineno">  709</span>           <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l00710"></a><span class="lineno">  710</span>       }</div>
-<div class="line"><a name="l00711"></a><span class="lineno">  711</span>     }</div>
-<div class="line"><a name="l00712"></a><span class="lineno">  712</span>   }</div>
-<div class="line"><a name="l00713"></a><span class="lineno">  713</span>   <span class="keywordflow">catch</span>(...){</div>
-<div class="line"><a name="l00714"></a><span class="lineno">  714</span>     std::cout << <span class="stringliteral">"catched feature selection"</span> << std::endl;</div>
-<div class="line"><a name="l00715"></a><span class="lineno">  715</span>     exit(1);</div>
-<div class="line"><a name="l00716"></a><span class="lineno">  716</span>   }</div>
-<div class="line"><a name="l00717"></a><span class="lineno">  717</span> </div>
-<div class="line"><a name="l00718"></a><span class="lineno">  718</span>   <span class="keywordflow">if</span>(verbose_opt[0])</div>
-<div class="line"><a name="l00719"></a><span class="lineno">  719</span>     cout <<<span class="stringliteral">"cost: "</span> << cost << endl;</div>
-<div class="line"><a name="l00720"></a><span class="lineno">  720</span>   subset.sort();</div>
-<div class="line"><a name="l00721"></a><span class="lineno">  721</span>   <span class="keywordflow">for</span>(list<int>::const_iterator lit=subset.begin();lit!=subset.end();++lit)</div>
-<div class="line"><a name="l00722"></a><span class="lineno">  722</span>     std::cout << <span class="stringliteral">" -b "</span> << *lit;</div>
-<div class="line"><a name="l00723"></a><span class="lineno">  723</span>   std::cout << std::endl;</div>
-<div class="line"><a name="l00724"></a><span class="lineno">  724</span>     <span class="comment">// if((*(lit))!=subset.back())</span></div>
-<div class="line"><a name="l00725"></a><span class="lineno">  725</span>     <span class="comment">// else</span></div>
-<div class="line"><a name="l00726"></a><span class="lineno">  726</span>     <span class="comment">//   cout << endl;</span></div>
-<div class="line"><a name="l00727"></a><span class="lineno">  727</span> </div>
-<div class="line"><a name="l00728"></a><span class="lineno">  728</span>   <span class="comment">// *NOTE* Because svm_model contains pointers to svm_problem, you can</span></div>
-<div class="line"><a name="l00729"></a><span class="lineno">  729</span>   <span class="comment">// not free the memory used by svm_problem if you are still using the</span></div>
-<div class="line"><a name="l00730"></a><span class="lineno">  730</span>   <span class="comment">// svm_model produced by svm_train(). </span></div>
-<div class="line"><a name="l00731"></a><span class="lineno">  731</span> </div>
-<div class="line"><a name="l00732"></a><span class="lineno">  732</span>   <span class="comment">// free(prob.y);</span></div>
-<div class="line"><a name="l00733"></a><span class="lineno">  733</span>   <span class="comment">// free(prob.x);</span></div>
-<div class="line"><a name="l00734"></a><span class="lineno">  734</span>   <span class="comment">// free(x_space);</span></div>
-<div class="line"><a name="l00735"></a><span class="lineno">  735</span>   <span class="comment">// svm_destroy_param(&param);</span></div>
-<div class="line"><a name="l00736"></a><span class="lineno">  736</span>   <span class="keywordflow">return</span> 0;</div>
-<div class="line"><a name="l00737"></a><span class="lineno">  737</span> }</div>
-<div class="line"><a name="l00738"></a><span class="lineno">  738</span>                             </div>
+<div class="line"><a name="l00636"></a><span class="lineno">  636</span>   <span class="comment">//Calculate features of training (and test) set</span></div>
+<div class="line"><a name="l00637"></a><span class="lineno">  637</span> </div>
+<div class="line"><a name="l00638"></a><span class="lineno">  638</span>   vector<unsigned int> nctraining;</div>
+<div class="line"><a name="l00639"></a><span class="lineno">  639</span>   vector<unsigned int> nctest;</div>
+<div class="line"><a name="l00640"></a><span class="lineno">  640</span>   nctraining.resize(nclass);</div>
+<div class="line"><a name="l00641"></a><span class="lineno">  641</span>   nctest.resize(nclass);</div>
+<div class="line"><a name="l00642"></a><span class="lineno">  642</span>   vector< Vector2d<float> > trainingFeatures(nclass);</div>
+<div class="line"><a name="l00643"></a><span class="lineno">  643</span>   <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iclass=0;iclass<nclass;++iclass){</div>
+<div class="line"><a name="l00644"></a><span class="lineno">  644</span>     <span class="keywordflow">if</span>(verbose_opt[0]>=1)</div>
+<div class="line"><a name="l00645"></a><span class="lineno">  645</span>       std::cout << <span class="stringliteral">"calculating features for class "</span> << iclass << std::endl;</div>
+<div class="line"><a name="l00646"></a><span class="lineno">  646</span>     nctraining[iclass]=trainingPixels[iclass].size();</div>
+<div class="line"><a name="l00647"></a><span class="lineno">  647</span>     <span class="keywordflow">if</span>(verbose_opt[0]>=1)</div>
+<div class="line"><a name="l00648"></a><span class="lineno">  648</span>       std::cout << <span class="stringliteral">"nctraining["</span> << iclass << <span class="stringliteral">"]: "</span> << nctraining[iclass] << std::endl;</div>
+<div class="line"><a name="l00649"></a><span class="lineno">  649</span>     <span class="keywordflow">if</span>(testPixels.size()>iclass){</div>
+<div class="line"><a name="l00650"></a><span class="lineno">  650</span>       nctest[iclass]=testPixels[iclass].size();</div>
+<div class="line"><a name="l00651"></a><span class="lineno">  651</span>       <span class="keywordflow">if</span>(verbose_opt[0]>=1){</div>
+<div class="line"><a name="l00652"></a><span class="lineno">  652</span>     std::cout << <span class="stringliteral">"nctest["</span> << iclass << <span class="stringliteral">"]: "</span> << nctest[iclass] << std::endl;</div>
+<div class="line"><a name="l00653"></a><span class="lineno">  653</span>       }</div>
+<div class="line"><a name="l00654"></a><span class="lineno">  654</span>     }</div>
+<div class="line"><a name="l00655"></a><span class="lineno">  655</span>     <span class="keywordflow">else</span></div>
+<div class="line"><a name="l00656"></a><span class="lineno">  656</span>       nctest[iclass]=0;</div>
+<div class="line"><a name="l00657"></a><span class="lineno">  657</span> </div>
+<div class="line"><a name="l00658"></a><span class="lineno">  658</span>     trainingFeatures[iclass].resize(nctraining[iclass]+nctest[iclass]);</div>
+<div class="line"><a name="l00659"></a><span class="lineno">  659</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> isample=0;isample<nctraining[iclass];++isample){</div>
+<div class="line"><a name="l00660"></a><span class="lineno">  660</span>       <span class="comment">//scale pixel values according to scale and offset!!!</span></div>
+<div class="line"><a name="l00661"></a><span class="lineno">  661</span>       <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iband=0;iband<nband;++iband){</div>
+<div class="line"><a name="l00662"></a><span class="lineno">  662</span>         assert(trainingPixels[iclass].size()>isample);</div>
+<div class="line"><a name="l00663"></a><span class="lineno">  663</span>         assert(trainingPixels[iclass][isample].size()>iband+startBand);</div>
+<div class="line"><a name="l00664"></a><span class="lineno">  664</span>         assert(offset.size()>iband);</div>
+<div class="line"><a name="l00665"></a><span class="lineno">  665</span>         assert(scale.size()>iband);</div>
+<div class="line"><a name="l00666"></a><span class="lineno">  666</span>         <span class="keywordtype">float</span> value=trainingPixels[iclass][isample][iband+startBand];</div>
+<div class="line"><a name="l00667"></a><span class="lineno">  667</span>         trainingFeatures[iclass][isample].push_back((value-offset[iband])/scale[iband]);</div>
+<div class="line"><a name="l00668"></a><span class="lineno">  668</span>       }</div>
+<div class="line"><a name="l00669"></a><span class="lineno">  669</span>     }</div>
+<div class="line"><a name="l00670"></a><span class="lineno">  670</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> isample=0;isample<nctest[iclass];++isample){</div>
+<div class="line"><a name="l00671"></a><span class="lineno">  671</span>       <span class="comment">//scale pixel values according to scale and offset!!!</span></div>
+<div class="line"><a name="l00672"></a><span class="lineno">  672</span>       <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iband=0;iband<nband;++iband){</div>
+<div class="line"><a name="l00673"></a><span class="lineno">  673</span>         assert(testPixels[iclass].size()>isample);</div>
+<div class="line"><a name="l00674"></a><span class="lineno">  674</span>         assert(testPixels[iclass][isample].size()>iband+startBand);</div>
+<div class="line"><a name="l00675"></a><span class="lineno">  675</span>         assert(offset.size()>iband);</div>
+<div class="line"><a name="l00676"></a><span class="lineno">  676</span>         assert(scale.size()>iband);</div>
+<div class="line"><a name="l00677"></a><span class="lineno">  677</span>         <span class="keywordtype">float</span> value=testPixels[iclass][isample][iband+startBand];</div>
+<div class="line"><a name="l00678"></a><span class="lineno">  678</span>         <span class="comment">// testFeatures[iclass][isample].push_back((value-offset[iband])/scale[iband]);</span></div>
+<div class="line"><a name="l00679"></a><span class="lineno">  679</span>         trainingFeatures[iclass][nctraining[iclass]+isample].push_back((value-offset[iband])/scale[iband]);</div>
+<div class="line"><a name="l00680"></a><span class="lineno">  680</span>       }</div>
+<div class="line"><a name="l00681"></a><span class="lineno">  681</span>     }</div>
+<div class="line"><a name="l00682"></a><span class="lineno">  682</span>     assert(trainingFeatures[iclass].size()==nctraining[iclass]+nctest[iclass]);</div>
+<div class="line"><a name="l00683"></a><span class="lineno">  683</span>   }</div>
+<div class="line"><a name="l00684"></a><span class="lineno">  684</span> </div>
+<div class="line"><a name="l00685"></a><span class="lineno">  685</span>   costfactory.setNcTraining(nctraining);</div>
+<div class="line"><a name="l00686"></a><span class="lineno">  686</span>   costfactory.setNcTest(nctest);</div>
+<div class="line"><a name="l00687"></a><span class="lineno">  687</span>   <span class="keywordtype">int</span> nFeatures=trainingFeatures[0][0].size();</div>
+<div class="line"><a name="l00688"></a><span class="lineno">  688</span>   <span class="keywordtype">int</span> maxFeatures=(maxFeatures_opt[0])? maxFeatures_opt[0] : 1;</div>
+<div class="line"><a name="l00689"></a><span class="lineno">  689</span>   <span class="keywordtype">double</span> previousCost=-1;</div>
+<div class="line"><a name="l00690"></a><span class="lineno">  690</span>   <span class="keywordtype">double</span> cost=0;</div>
+<div class="line"><a name="l00691"></a><span class="lineno">  691</span>   list<int> subset;<span class="comment">//set of selected features (levels) for each class combination</span></div>
+<div class="line"><a name="l00692"></a><span class="lineno">  692</span>   <a class="code" href="classFeatureSelector.html">FeatureSelector</a> selector;</div>
+<div class="line"><a name="l00693"></a><span class="lineno">  693</span>   <span class="keywordflow">try</span>{</div>
+<div class="line"><a name="l00694"></a><span class="lineno">  694</span>     <span class="keywordflow">if</span>(maxFeatures>=nFeatures){</div>
+<div class="line"><a name="l00695"></a><span class="lineno">  695</span>       subset.clear();</div>
+<div class="line"><a name="l00696"></a><span class="lineno">  696</span>       <span class="keywordflow">for</span>(<span class="keywordtype">int</span> ifeature=0;ifeature<nFeatures;++ifeature)</div>
+<div class="line"><a name="l00697"></a><span class="lineno">  697</span>         subset.push_back(ifeature);</div>
+<div class="line"><a name="l00698"></a><span class="lineno">  698</span>       cost=costfactory.getCost(trainingFeatures);</div>
+<div class="line"><a name="l00699"></a><span class="lineno">  699</span>     }</div>
+<div class="line"><a name="l00700"></a><span class="lineno">  700</span>     <span class="keywordflow">else</span>{</div>
+<div class="line"><a name="l00701"></a><span class="lineno">  701</span>       <span class="keywordflow">while</span>(fabs(cost-previousCost)>=epsilon_cost_opt[0]){</div>
+<div class="line"><a name="l00702"></a><span class="lineno">  702</span>         previousCost=cost;</div>
+<div class="line"><a name="l00703"></a><span class="lineno">  703</span>         <span class="keywordflow">switch</span>(selMap[selector_opt[0]]){</div>
+<div class="line"><a name="l00704"></a><span class="lineno">  704</span>         <span class="keywordflow">case</span>(SFFS):</div>
+<div class="line"><a name="l00705"></a><span class="lineno">  705</span>           subset.clear();<span class="comment">//needed to clear in case of floating and brute force search</span></div>
+<div class="line"><a name="l00706"></a><span class="lineno">  706</span>           cost=selector.floating(trainingFeatures,costfactory,subset,maxFeatures,epsilon_cost_opt[0],verbose_opt[0]);</div>
+<div class="line"><a name="l00707"></a><span class="lineno">  707</span>           <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l00708"></a><span class="lineno">  708</span>         <span class="keywordflow">case</span>(SFS):</div>
+<div class="line"><a name="l00709"></a><span class="lineno">  709</span>           cost=selector.forward(trainingFeatures,costfactory,subset,maxFeatures,verbose_opt[0]);</div>
+<div class="line"><a name="l00710"></a><span class="lineno">  710</span>           <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l00711"></a><span class="lineno">  711</span>         <span class="keywordflow">case</span>(SBS):</div>
+<div class="line"><a name="l00712"></a><span class="lineno">  712</span>           cost=selector.backward(trainingFeatures,costfactory,subset,maxFeatures,verbose_opt[0]);</div>
+<div class="line"><a name="l00713"></a><span class="lineno">  713</span>           <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l00714"></a><span class="lineno">  714</span>         <span class="keywordflow">case</span>(BFS):</div>
+<div class="line"><a name="l00715"></a><span class="lineno">  715</span>           subset.clear();<span class="comment">//needed to clear in case of floating and brute force search</span></div>
+<div class="line"><a name="l00716"></a><span class="lineno">  716</span>           cost=selector.bruteForce(trainingFeatures,costfactory,subset,maxFeatures,verbose_opt[0]);</div>
+<div class="line"><a name="l00717"></a><span class="lineno">  717</span>           <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l00718"></a><span class="lineno">  718</span>         <span class="keywordflow">default</span>:</div>
+<div class="line"><a name="l00719"></a><span class="lineno">  719</span>           std::cout << <span class="stringliteral">"Error: selector not supported, please use sffs, sfs, sbs or bfs"</span> << std::endl;</div>
+<div class="line"><a name="l00720"></a><span class="lineno">  720</span>           exit(1);</div>
+<div class="line"><a name="l00721"></a><span class="lineno">  721</span>           <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l00722"></a><span class="lineno">  722</span>         }</div>
+<div class="line"><a name="l00723"></a><span class="lineno">  723</span>         <span class="keywordflow">if</span>(verbose_opt[0]>1){</div>
+<div class="line"><a name="l00724"></a><span class="lineno">  724</span>           std::cout << <span class="stringliteral">"cost: "</span> << cost << std::endl;</div>
+<div class="line"><a name="l00725"></a><span class="lineno">  725</span>           std::cout << <span class="stringliteral">"previousCost: "</span> << previousCost << std::endl;</div>
+<div class="line"><a name="l00726"></a><span class="lineno">  726</span>           std::cout << std::setprecision(12) << <span class="stringliteral">"cost-previousCost: "</span> << cost - previousCost << <span class="stringliteral">" ( "</span> << epsilon_cost_opt[0] << <span class="stringliteral">")"</span> << std::endl;</div>
+<div class="line"><a name="l00727"></a><span class="lineno">  727</span>         }</div>
+<div class="line"><a name="l00728"></a><span class="lineno">  728</span>         <span class="keywordflow">if</span>(!maxFeatures_opt[0])</div>
+<div class="line"><a name="l00729"></a><span class="lineno">  729</span>           ++maxFeatures;</div>
+<div class="line"><a name="l00730"></a><span class="lineno">  730</span>         <span class="keywordflow">else</span></div>
+<div class="line"><a name="l00731"></a><span class="lineno">  731</span>           <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l00732"></a><span class="lineno">  732</span>       }</div>
+<div class="line"><a name="l00733"></a><span class="lineno">  733</span>     }</div>
+<div class="line"><a name="l00734"></a><span class="lineno">  734</span>   }</div>
+<div class="line"><a name="l00735"></a><span class="lineno">  735</span>   <span class="keywordflow">catch</span>(...){</div>
+<div class="line"><a name="l00736"></a><span class="lineno">  736</span>     std::cout << <span class="stringliteral">"catched feature selection"</span> << std::endl;</div>
+<div class="line"><a name="l00737"></a><span class="lineno">  737</span>     exit(1);</div>
+<div class="line"><a name="l00738"></a><span class="lineno">  738</span>   }</div>
+<div class="line"><a name="l00739"></a><span class="lineno">  739</span> </div>
+<div class="line"><a name="l00740"></a><span class="lineno">  740</span>   <span class="keywordflow">if</span>(verbose_opt[0])</div>
+<div class="line"><a name="l00741"></a><span class="lineno">  741</span>     cout <<<span class="stringliteral">"cost: "</span> << cost << endl;</div>
+<div class="line"><a name="l00742"></a><span class="lineno">  742</span>   subset.sort();</div>
+<div class="line"><a name="l00743"></a><span class="lineno">  743</span>   <span class="keywordflow">for</span>(list<int>::const_iterator lit=subset.begin();lit!=subset.end();++lit)</div>
+<div class="line"><a name="l00744"></a><span class="lineno">  744</span>     std::cout << <span class="stringliteral">" -b "</span> << *lit;</div>
+<div class="line"><a name="l00745"></a><span class="lineno">  745</span>   std::cout << std::endl;</div>
+<div class="line"><a name="l00746"></a><span class="lineno">  746</span>     <span class="comment">// if((*(lit))!=subset.back())</span></div>
+<div class="line"><a name="l00747"></a><span class="lineno">  747</span>     <span class="comment">// else</span></div>
+<div class="line"><a name="l00748"></a><span class="lineno">  748</span>     <span class="comment">//   cout << endl;</span></div>
+<div class="line"><a name="l00749"></a><span class="lineno">  749</span> </div>
+<div class="line"><a name="l00750"></a><span class="lineno">  750</span>   <span class="comment">// *NOTE* Because svm_model contains pointers to svm_problem, you can</span></div>
+<div class="line"><a name="l00751"></a><span class="lineno">  751</span>   <span class="comment">// not free the memory used by svm_problem if you are still using the</span></div>
+<div class="line"><a name="l00752"></a><span class="lineno">  752</span>   <span class="comment">// svm_model produced by svm_train(). </span></div>
+<div class="line"><a name="l00753"></a><span class="lineno">  753</span> </div>
+<div class="line"><a name="l00754"></a><span class="lineno">  754</span>   <span class="comment">// free(prob.y);</span></div>
+<div class="line"><a name="l00755"></a><span class="lineno">  755</span>   <span class="comment">// free(prob.x);</span></div>
+<div class="line"><a name="l00756"></a><span class="lineno">  756</span>   <span class="comment">// free(x_space);</span></div>
+<div class="line"><a name="l00757"></a><span class="lineno">  757</span>   <span class="comment">// svm_destroy_param(&param);</span></div>
+<div class="line"><a name="l00758"></a><span class="lineno">  758</span>   <span class="keywordflow">return</span> 0;</div>
+<div class="line"><a name="l00759"></a><span class="lineno">  759</span> }</div>
+<div class="line"><a name="l00760"></a><span class="lineno">  760</span>                             </div>
 <div class="ttc" id="classImgReaderOgr_html"><div class="ttname"><a href="classImgReaderOgr.html">ImgReaderOgr</a></div><div class="ttdef"><b>Definition:</b> <a href="ImgReaderOgr_8h_source.html#l00035">ImgReaderOgr.h:35</a></div></div>
 <div class="ttc" id="classOptionpk_html"><div class="ttname"><a href="classOptionpk.html">Optionpk</a></div><div class="ttdef"><b>Definition:</b> <a href="Optionpk_8h_source.html#l00106">Optionpk.h:106</a></div></div>
 <div class="ttc" id="classFeatureSelector_html"><div class="ttname"><a href="classFeatureSelector.html">FeatureSelector</a></div><div class="ttdef"><b>Definition:</b> <a href="FeatureSelector_8h_source.html#l00035">FeatureSelector.h:35</a></div></div>
@@ -738,7 +760,7 @@
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Jun 23 2015 17:09:36 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Tue Nov 3 2015 15:58:26 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/pkgetmask.html b/doc/html/pkgetmask.html
index 5d7edf5..f97cf71 100644
--- a/doc/html/pkgetmask.html
+++ b/doc/html/pkgetmask.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.3</span>
+    <span id="projectnumber">2.6.4</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -93,7 +93,7 @@ Usage: pkgetmask -i input -o output</li>
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Jun 23 2015 17:09:37 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/pkgetmask_8cc_source.html b/doc/html/pkgetmask_8cc_source.html
index 0ea4402..867e3c9 100644
--- a/doc/html/pkgetmask_8cc_source.html
+++ b/doc/html/pkgetmask_8cc_source.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.3</span>
+    <span id="projectnumber">2.6.4</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -286,7 +286,7 @@
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Jun 23 2015 17:09:36 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Tue Nov 3 2015 15:58:26 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/pkgetmask_8py_source.html b/doc/html/pkgetmask_8py_source.html
index 1a6b48a..c33f8eb 100644
--- a/doc/html/pkgetmask_8py_source.html
+++ b/doc/html/pkgetmask_8py_source.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.3</span>
+    <span id="projectnumber">2.6.4</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -149,32 +149,33 @@
 <div class="line"><a name="l00095"></a><span class="lineno">   95</span>                 commands.append(maxValue)</div>
 <div class="line"><a name="l00096"></a><span class="lineno">   96</span>         commands.append(<span class="stringliteral">"-p"</span>)</div>
 <div class="line"><a name="l00097"></a><span class="lineno">   97</span>         commands.append(self.<a class="code" href="classqgis_1_1pkgetmask_1_1pkgetmask.html#a418e9d844d597fb600d16afc0b7e70cd">OPERATOR_OPTIONS</a>[self.getParameterValue(self.<a class="code" href="classqgis_1_1pkgetmask_1_1pkgetmask.html#a2a1d0302fefa56238c42d3ea6f747941">OPERATOR</a>)])</div>
-<div class="line"><a name="l00098"></a><span class="lineno">   98</span>         <span class="keywordflow">if</span> data != <span class="stringliteral">"none"</span>:</div>
-<div class="line"><a name="l00099"></a><span class="lineno">   99</span>             dataValues = data.split(<span class="stringliteral">';'</span>)</div>
-<div class="line"><a name="l00100"></a><span class="lineno">  100</span>             <span class="keywordflow">for</span> dataValue <span class="keywordflow">in</span> dataValues:</div>
-<div class="line"><a name="l00101"></a><span class="lineno">  101</span>                 commands.append(<span class="stringliteral">'-data'</span>)</div>
-<div class="line"><a name="l00102"></a><span class="lineno">  102</span>                 commands.append(dataValue)</div>
-<div class="line"><a name="l00103"></a><span class="lineno">  103</span>         nodata=self.getParameterValue(self.<a class="code" href="classqgis_1_1pkgetmask_1_1pkgetmask.html#ab851d0b2d6acf47df89a9d89373f804b">NODATA</a>)</div>
-<div class="line"><a name="l00104"></a><span class="lineno">  104</span>         <span class="keywordflow">if</span> nodata != <span class="stringliteral">"none"</span>:</div>
-<div class="line"><a name="l00105"></a><span class="lineno">  105</span>             nodataValues = nodata.split(<span class="stringliteral">';'</span>)</div>
-<div class="line"><a name="l00106"></a><span class="lineno">  106</span>             <span class="keywordflow">for</span> nodataValue <span class="keywordflow">in</span> nodataValues:</div>
-<div class="line"><a name="l00107"></a><span class="lineno">  107</span>                 commands.append(<span class="stringliteral">'-nodata'</span>)</div>
-<div class="line"><a name="l00108"></a><span class="lineno">  108</span>                 commands.append(nodataValue)</div>
-<div class="line"><a name="l00109"></a><span class="lineno">  109</span>         <span class="keywordflow">if</span> self.<a class="code" href="classqgis_1_1pkgetmask_1_1pkgetmask.html#a7f1272eeb8cf07f429440cdf387c2d17">TYPE</a>[self.getParameterValue(self.<a class="code" href="classqgis_1_1pkgetmask_1_1pkgetmask.html#a091f5ee5165bde746ed9841909d06d5c">RTYPE</a>)] != <span class="stringliteral">"none"</span>:</div>
-<div class="line"><a name="l00110"></a><span class="lineno">  110</span>             commands.append(<span class="stringliteral">'-ot'</span>)</div>
-<div class="line"><a name="l00111"></a><span class="lineno">  111</span>             commands.append(self.<a class="code" href="classqgis_1_1pkgetmask_1_1pkgetmask.html#a7f1272eeb8cf07f429440cdf387c2d17">TYPE</a>[self.getParameterValue(self.<a class="code" href="classqgis_1_1pkgetmask_1_1pkgetmask.html#a091f5ee5165bde746ed9841909d06d5c">RTYPE</a>)])</div>
-<div class="line"><a name="l00112"></a><span class="lineno">  112</span>         output=self.getOutputValue(self.<a class="code" href="classqgis_1_1pkgetmask_1_1pkgetmask.html#a5eedd82f4dda4923e8560ff43b657f73">OUTPUT</a>)</div>
-<div class="line"><a name="l00113"></a><span class="lineno">  113</span>         <span class="keywordflow">if</span> output != <span class="stringliteral">""</span>:</div>
-<div class="line"><a name="l00114"></a><span class="lineno">  114</span>             commands.append(<span class="stringliteral">"-o"</span>)</div>
-<div class="line"><a name="l00115"></a><span class="lineno">  115</span>             commands.append(<span class="stringliteral">'"'</span> + output + <span class="stringliteral">'"'</span>)</div>
-<div class="line"><a name="l00116"></a><span class="lineno">  116</span> </div>
-<div class="line"><a name="l00117"></a><span class="lineno">  117</span>         data=self.getParameterValue(self.<a class="code" href="classqgis_1_1pkgetmask_1_1pkgetmask.html#a579e059d072a57554c9a61180a9fd08c">DATA</a>)</div>
-<div class="line"><a name="l00118"></a><span class="lineno">  118</span> </div>
-<div class="line"><a name="l00119"></a><span class="lineno">  119</span>         extra = str(self.getParameterValue(self.<a class="code" href="classqgis_1_1pkgetmask_1_1pkgetmask.html#a7c46da38f871a5211efe90216afff4ef">EXTRA</a>))</div>
-<div class="line"><a name="l00120"></a><span class="lineno">  120</span>         <span class="keywordflow">if</span> len(extra) > 0:</div>
-<div class="line"><a name="l00121"></a><span class="lineno">  121</span>             commands.append(extra)</div>
-<div class="line"><a name="l00122"></a><span class="lineno">  122</span> </div>
-<div class="line"><a name="l00123"></a><span class="lineno">  123</span>         pktoolsUtils.runpktools(commands, progress)</div>
+<div class="line"><a name="l00098"></a><span class="lineno">   98</span>         data=self.getParameterValue(self.<a class="code" href="classqgis_1_1pkgetmask_1_1pkgetmask.html#a579e059d072a57554c9a61180a9fd08c">DATA</a>)</div>
+<div class="line"><a name="l00099"></a><span class="lineno">   99</span>         <span class="keywordflow">if</span> data != <span class="stringliteral">"none"</span>:</div>
+<div class="line"><a name="l00100"></a><span class="lineno">  100</span>             dataValues = data.split(<span class="stringliteral">';'</span>)</div>
+<div class="line"><a name="l00101"></a><span class="lineno">  101</span>             <span class="keywordflow">for</span> dataValue <span class="keywordflow">in</span> dataValues:</div>
+<div class="line"><a name="l00102"></a><span class="lineno">  102</span>                 commands.append(<span class="stringliteral">'-data'</span>)</div>
+<div class="line"><a name="l00103"></a><span class="lineno">  103</span>                 commands.append(dataValue)</div>
+<div class="line"><a name="l00104"></a><span class="lineno">  104</span>         nodata=self.getParameterValue(self.<a class="code" href="classqgis_1_1pkgetmask_1_1pkgetmask.html#ab851d0b2d6acf47df89a9d89373f804b">NODATA</a>)</div>
+<div class="line"><a name="l00105"></a><span class="lineno">  105</span>         <span class="keywordflow">if</span> nodata != <span class="stringliteral">"none"</span>:</div>
+<div class="line"><a name="l00106"></a><span class="lineno">  106</span>             nodataValues = nodata.split(<span class="stringliteral">';'</span>)</div>
+<div class="line"><a name="l00107"></a><span class="lineno">  107</span>             <span class="keywordflow">for</span> nodataValue <span class="keywordflow">in</span> nodataValues:</div>
+<div class="line"><a name="l00108"></a><span class="lineno">  108</span>                 commands.append(<span class="stringliteral">'-nodata'</span>)</div>
+<div class="line"><a name="l00109"></a><span class="lineno">  109</span>                 commands.append(nodataValue)</div>
+<div class="line"><a name="l00110"></a><span class="lineno">  110</span>         <span class="keywordflow">if</span> self.<a class="code" href="classqgis_1_1pkgetmask_1_1pkgetmask.html#a7f1272eeb8cf07f429440cdf387c2d17">TYPE</a>[self.getParameterValue(self.<a class="code" href="classqgis_1_1pkgetmask_1_1pkgetmask.html#a091f5ee5165bde746ed9841909d06d5c">RTYPE</a>)] != <span class="stringliteral">"none"</span>:</div>
+<div class="line"><a name="l00111"></a><span class="lineno">  111</span>             commands.append(<span class="stringliteral">'-ot'</span>)</div>
+<div class="line"><a name="l00112"></a><span class="lineno">  112</span>             commands.append(self.<a class="code" href="classqgis_1_1pkgetmask_1_1pkgetmask.html#a7f1272eeb8cf07f429440cdf387c2d17">TYPE</a>[self.getParameterValue(self.<a class="code" href="classqgis_1_1pkgetmask_1_1pkgetmask.html#a091f5ee5165bde746ed9841909d06d5c">RTYPE</a>)])</div>
+<div class="line"><a name="l00113"></a><span class="lineno">  113</span>         output=self.getOutputValue(self.<a class="code" href="classqgis_1_1pkgetmask_1_1pkgetmask.html#a5eedd82f4dda4923e8560ff43b657f73">OUTPUT</a>)</div>
+<div class="line"><a name="l00114"></a><span class="lineno">  114</span>         <span class="keywordflow">if</span> output != <span class="stringliteral">""</span>:</div>
+<div class="line"><a name="l00115"></a><span class="lineno">  115</span>             commands.append(<span class="stringliteral">"-o"</span>)</div>
+<div class="line"><a name="l00116"></a><span class="lineno">  116</span>             commands.append(<span class="stringliteral">'"'</span> + output + <span class="stringliteral">'"'</span>)</div>
+<div class="line"><a name="l00117"></a><span class="lineno">  117</span> </div>
+<div class="line"><a name="l00118"></a><span class="lineno">  118</span>         data=self.getParameterValue(self.<a class="code" href="classqgis_1_1pkgetmask_1_1pkgetmask.html#a579e059d072a57554c9a61180a9fd08c">DATA</a>)</div>
+<div class="line"><a name="l00119"></a><span class="lineno">  119</span> </div>
+<div class="line"><a name="l00120"></a><span class="lineno">  120</span>         extra = str(self.getParameterValue(self.<a class="code" href="classqgis_1_1pkgetmask_1_1pkgetmask.html#a7c46da38f871a5211efe90216afff4ef">EXTRA</a>))</div>
+<div class="line"><a name="l00121"></a><span class="lineno">  121</span>         <span class="keywordflow">if</span> len(extra) > 0:</div>
+<div class="line"><a name="l00122"></a><span class="lineno">  122</span>             commands.append(extra)</div>
+<div class="line"><a name="l00123"></a><span class="lineno">  123</span> </div>
+<div class="line"><a name="l00124"></a><span class="lineno">  124</span>         pktoolsUtils.runpktools(commands, progress)</div>
 <div class="ttc" id="classqgis_1_1pkgetmask_1_1pkgetmask_html_a418e9d844d597fb600d16afc0b7e70cd"><div class="ttname"><a href="classqgis_1_1pkgetmask_1_1pkgetmask.html#a418e9d844d597fb600d16afc0b7e70cd">qgis.pkgetmask.pkgetmask.OPERATOR_OPTIONS</a></div><div class="ttdeci">list OPERATOR_OPTIONS</div><div class="ttdef"><b>Definition:</b> <a href="pkgetmask_8py_source.html#l00044">pkgetmask.py:44</a></div></div>
 <div class="ttc" id="classqgis_1_1pkgetmask_1_1pkgetmask_html_a091f5ee5165bde746ed9841909d06d5c"><div class="ttname"><a href="classqgis_1_1pkgetmask_1_1pkgetmask.html#a091f5ee5165bde746ed9841909d06d5c">qgis.pkgetmask.pkgetmask.RTYPE</a></div><div class="ttdeci">string RTYPE</div><div class="ttdef"><b>Definition:</b> <a href="pkgetmask_8py_source.html#l00049">pkgetmask.py:49</a></div></div>
 <div class="ttc" id="classqgis_1_1pkgetmask_1_1pkgetmask_html_a7f1272eeb8cf07f429440cdf387c2d17"><div class="ttname"><a href="classqgis_1_1pkgetmask_1_1pkgetmask.html#a7f1272eeb8cf07f429440cdf387c2d17">qgis.pkgetmask.pkgetmask.TYPE</a></div><div class="ttdeci">list TYPE</div><div class="ttdef"><b>Definition:</b> <a href="pkgetmask_8py_source.html#l00050">pkgetmask.py:50</a></div></div>
@@ -195,7 +196,7 @@
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Jun 23 2015 17:09:36 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Tue Nov 3 2015 15:58:26 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/pkinfo.html b/doc/html/pkinfo.html
index 0211df7..d5f548d 100644
--- a/doc/html/pkinfo.html
+++ b/doc/html/pkinfo.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.3</span>
+    <span id="projectnumber">2.6.4</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -135,7 +135,7 @@ Usage: pkinfo -i input [options]</li>
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Jun 23 2015 17:09:37 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/pkinfo_8cc_source.html b/doc/html/pkinfo_8cc_source.html
index bb7ca54..a8aa662 100644
--- a/doc/html/pkinfo_8cc_source.html
+++ b/doc/html/pkinfo_8cc_source.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.3</span>
+    <span id="projectnumber">2.6.4</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -444,7 +444,7 @@
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Jun 23 2015 17:09:36 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Tue Nov 3 2015 15:58:26 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/pkkalman.html b/doc/html/pkkalman.html
index 5662863..2f41143 100644
--- a/doc/html/pkkalman.html
+++ b/doc/html/pkkalman.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.3</span>
+    <span id="projectnumber">2.6.4</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -79,6 +79,62 @@ Options</h1>
 <tr>
 <td>obsnodata </td><td>obsnodata </td><td>double </td><td>0 </td><td>invalid value for observation input </td></tr>
 <tr>
+<td>obsmin </td><td>obsmin </td><td>double </td><td></td><td>Minimum value for observation data </td></tr>
+<tr>
+<td>obsmax </td><td>obsmax </td><td>double </td><td></td><td>Maximum value for observation data </td></tr>
+<tr>
+<td>eps </td><td>eps </td><td>double </td><td>1e-05 </td><td>epsilon for non zero division </td></tr>
+<tr>
+<td>um </td><td>uncertmodel </td><td>double </td><td>2 </td><td>Multiply this value with std dev of first model image to obtain uncertainty of model </td></tr>
+<tr>
+<td>uo </td><td>uncertobs </td><td>double </td><td>0 </td><td>Uncertainty of valid observations </td></tr>
+<tr>
+<td>unodata </td><td>uncertnodata </td><td>double </td><td>10000 </td><td>Uncertainty in case of no-data values in observation </td></tr>
+<tr>
+<td>q </td><td>q </td><td>double </td><td>1 </td><td>Process noise: expresses instability (variance) of proportions of fine res pixels within a moderate resolution pixel </td></tr>
+<tr>
+<td>down </td><td>down </td><td>int </td><td></td><td>Downsampling factor for reading model data to calculate regression </td></tr>
+<tr>
+<td>co </td><td>co </td><td>std::string </td><td></td><td>Creation option for output file. Multiple options can be specified. </td></tr>
+<tr>
+<td>v </td><td>verbose </td><td>short </td><td>0 </td><td>verbose mode when positive </td></tr>
+</table>
+<p>produce kalman filtered raster time series </p>
+<h2>SYNOPSIS</h2>
+<p><code></code></p>
+<p><code></code></p>
+<h1><a class="anchor" id="pkkalman_options"></a>
+Options</h1>
+<ul>
+<li>use either <code>-short</code> or <code>--long</code> options (both <code>--long=value</code> and <code>--long value</code> are supported)</li>
+<li>short option <code>-h</code> shows basic options only, long option <code>--help</code> shows all options</li>
+</ul>
+<table class="doxtable">
+<tr>
+<th>short</th><th>long</th><th>type</th><th>default</th><th>description  </th></tr>
+<tr>
+<td>dir </td><td>direction </td><td>std::string </td><td>forward </td><td>direction to run model (forward|backward|smooth) </td></tr>
+<tr>
+<td>mod </td><td>model </td><td>std::string </td><td></td><td>model input datasets, e.g., MODIS (use: -mod model1 -mod model2 etc. </td></tr>
+<tr>
+<td>obs </td><td>observation </td><td>std::string </td><td></td><td>observation input datasets, e.g., landsat (use: -obs obs1 -obs obs2 etc. </td></tr>
+<tr>
+<td>tmod </td><td>tmodel </td><td>int </td><td></td><td>time sequence of model input. Sequence must have exact same length as model input. Leave empty to have default sequence 0,1,2,etc. </td></tr>
+<tr>
+<td>tobs </td><td>tobservation </td><td>int </td><td></td><td>time sequence of observation input. Sequence must have exact same length as observation input) </td></tr>
+<tr>
+<td>a_srs </td><td>a_srs </td><td>std::string </td><td></td><td>Override the projection for the output file (leave blank to copy from input file, use epsg:3035 to use European projection and force to European grid </td></tr>
+<tr>
+<td>ofw </td><td>outputfw </td><td>std::string </td><td></td><td>Output raster dataset for forward model </td></tr>
+<tr>
+<td>obw </td><td>outputbw </td><td>std::string </td><td></td><td>Output raster dataset for backward model </td></tr>
+<tr>
+<td>ofb </td><td>outputfb </td><td>std::string </td><td></td><td>Output raster dataset for smooth model </td></tr>
+<tr>
+<td>modnodata </td><td>modnodata </td><td>double </td><td>0 </td><td>invalid value for model input </td></tr>
+<tr>
+<td>obsnodata </td><td>obsnodata </td><td>double </td><td>0 </td><td>invalid value for observation input </td></tr>
+<tr>
 <td>modoffset </td><td>modoffset </td><td>double </td><td></td><td>offset used to read model input dataset (value=offset+scale*readValue </td></tr>
 <tr>
 <td>modscale </td><td>modscale </td><td>double </td><td></td><td>scale used to read model input dataset (value=offset+scale*readValue </td></tr>
@@ -117,7 +173,7 @@ Options</h1>
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Jun 23 2015 17:09:37 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/pkkalman_8cc_source.html b/doc/html/pkkalman1_8cc_source.html
similarity index 65%
copy from doc/html/pkkalman_8cc_source.html
copy to doc/html/pkkalman1_8cc_source.html
index 878419b..0935788 100644
--- a/doc/html/pkkalman_8cc_source.html
+++ b/doc/html/pkkalman1_8cc_source.html
@@ -4,7 +4,7 @@
 <meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
 <meta http-equiv="X-UA-Compatible" content="IE=9"/>
 <meta name="generator" content="Doxygen 1.8.6"/>
-<title>pktools: /home/kempenep/pktools/src/apps/pkkalman.cc Source File</title>
+<title>pktools: /home/kempenep/pktools/src/apps/pkkalman1.cc Source File</title>
 <link href="tabs.css" rel="stylesheet" type="text/css"/>
 <script type="text/javascript" src="jquery.js"></script>
 <script type="text/javascript" src="dynsections.js"></script>
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.3</span>
+    <span id="projectnumber">2.6.4</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -49,7 +49,7 @@
 </div><!-- top -->
 <div class="header">
   <div class="headertitle">
-<div class="title">pkkalman.cc</div>  </div>
+<div class="title">pkkalman1.cc</div>  </div>
 </div><!--header-->
 <div class="contents">
 <div class="fragment"><div class="line"><a name="l00001"></a><span class="lineno">    1</span> <span class="comment">/**********************************************************************</span></div>
@@ -96,1547 +96,1844 @@
 <div class="line"><a name="l00087"></a><span class="lineno">   87</span>   <a class="code" href="classOptionpk.html">Optionpk<string></a> outputfw_opt(<span class="stringliteral">"ofw"</span>, <span class="stringliteral">"outputfw"</span>, <span class="stringliteral">"Output raster dataset for forward model"</span>);</div>
 <div class="line"><a name="l00088"></a><span class="lineno">   88</span>   <a class="code" href="classOptionpk.html">Optionpk<string></a> outputbw_opt(<span class="stringliteral">"obw"</span>, <span class="stringliteral">"outputbw"</span>, <span class="stringliteral">"Output raster dataset for backward model"</span>);</div>
 <div class="line"><a name="l00089"></a><span class="lineno">   89</span>   <a class="code" href="classOptionpk.html">Optionpk<string></a> outputfb_opt(<span class="stringliteral">"ofb"</span>, <span class="stringliteral">"outputfb"</span>, <span class="stringliteral">"Output raster dataset for smooth model"</span>);</div>
-<div class="line"><a name="l00090"></a><span class="lineno">   90</span>   <a class="code" href="classOptionpk.html">Optionpk<double></a> modnodata_opt(<span class="stringliteral">"modnodata"</span>, <span class="stringliteral">"modnodata"</span>, <span class="stringliteral">"invalid value for model input"</span>, 0);</div>
-<div class="line"><a name="l00091"></a><span class="lineno">   91</span>   <a class="code" href="classOptionpk.html">Optionpk<double></a> obsnodata_opt(<span class="stringliteral">"obsnodata"</span>, <span class="stringliteral">"obsnodata"</span>, <span class="stringliteral">"invalid value for observation input"</span>, 0);</div>
-<div class="line"><a name="l00092"></a><span class="lineno">   92</span>   <a class="code" href="classOptionpk.html">Optionpk<double></a> modoffset_opt(<span class="stringliteral">"modoffset"</span>, <span class="stringliteral">"modoffset"</span>, <span class="stringliteral">"offset used to read model input dataset (value=offset+scale*readValue)"</span>);</div>
-<div class="line"><a name="l00093"></a><span class="lineno">   93</span>   <a class="code" href="classOptionpk.html">Optionpk<double></a> obsoffset_opt(<span class="stringliteral">"obsoffset"</span>, <span class="stringliteral">"obsoffset"</span>, <span class="stringliteral">"offset used to read observation input dataset (value=offset+scale*readValue)"</span>);</div>
-<div class="line"><a name="l00094"></a><span class="lineno">   94</span>   <a class="code" href="classOptionpk.html">Optionpk<double></a> modscale_opt(<span class="stringliteral">"modscale"</span>, <span class="stringliteral">"modscale"</span>, <span class="stringliteral">"scale used to read model input dataset (value=offset+scale*readValue)"</span>);</div>
-<div class="line"><a name="l00095"></a><span class="lineno">   95</span>   <a class="code" href="classOptionpk.html">Optionpk<double></a> obsscale_opt(<span class="stringliteral">"obsscale"</span>, <span class="stringliteral">"obsscale"</span>, <span class="stringliteral">"scale used to read observation input dataset (value=offset+scale*readValue)"</span>);</div>
-<div class="line"><a name="l00096"></a><span class="lineno">   96</span>   <a class="code" href="classOptionpk.html">Optionpk<double></a> eps_opt(<span class="stringliteral">"eps"</span>, <span class="stringliteral">"eps"</span>, <span class="stringliteral">"epsilon for non zero division"</span>, 0.00001);</div>
-<div class="line"><a name="l00097"></a><span class="lineno">   97</span>   <a class="code" href="classOptionpk.html">Optionpk<double></a> uncertModel_opt(<span class="stringliteral">"um"</span>, <span class="stringliteral">"uncertmodel"</span>, <span class="stringliteral">"Multiply this value with std dev of first model image to obtain uncertainty of model"</span>,2);</div>
-<div class="line"><a name="l00098"></a><span class="lineno">   98</span>   <a class="code" href="classOptionpk.html">Optionpk<double></a> uncertObs_opt(<span class="stringliteral">"uo"</span>, <span class="stringliteral">"uncertobs"</span>, <span class="stringliteral">"Uncertainty of valid observations"</span>,0);</div>
-<div class="line"><a name="l00099"></a><span class="lineno">   99</span>   <a class="code" href="classOptionpk.html">Optionpk<double></a> weight_opt(<span class="stringliteral">"w"</span>, <span class="stringliteral">"weight"</span>, <span class="stringliteral">"Penalize outliers in measurement via weights. Use first weight to penalize small measurements wrt model and second weight to penalize large measurements wrt model"</span>);</div>
-<div class="line"><a name="l00100"></a><span class="lineno">  100</span>   <a class="code" href="classOptionpk.html">Optionpk<double></a> deltaObs_opt(<span class="stringliteral">"dobs"</span>, <span class="stringliteral">"deltaobs"</span>, <span class="stringliteral">"Lower and upper thresholds for relative pixel differences (in percentage): (observation-model)/model. For instance to force the observation within a +/- 10 % interval, use: -dobs -10 -do [...]
-<div class="line"><a name="l00101"></a><span class="lineno">  101</span>   <a class="code" href="classOptionpk.html">Optionpk<double></a> uncertNodata_opt(<span class="stringliteral">"unodata"</span>, <span class="stringliteral">"uncertnodata"</span>, <span class="stringliteral">"Uncertainty in case of no-data values in observation"</span>, 10000);</div>
-<div class="line"><a name="l00102"></a><span class="lineno">  102</span>   <a class="code" href="classOptionpk.html">Optionpk<double></a> regTime_opt(<span class="stringliteral">"rt"</span>, <span class="stringliteral">"regtime"</span>, <span class="stringliteral">"Weight for regression in time series"</span>, 1.0);</div>
-<div class="line"><a name="l00103"></a><span class="lineno">  103</span>   <a class="code" href="classOptionpk.html">Optionpk<double></a> regSensor_opt(<span class="stringliteral">"rs"</span>, <span class="stringliteral">"regsensor"</span>, <span class="stringliteral">"Weight for regression model - measurement (model - observation)."</span>);</div>
-<div class="line"><a name="l00104"></a><span class="lineno">  104</span>   <a class="code" href="classOptionpk.html">Optionpk<int></a> down_opt(<span class="stringliteral">"down"</span>, <span class="stringliteral">"down"</span>, <span class="stringliteral">"Downsampling factor for reading model data to calculate regression"</span>);</div>
-<div class="line"><a name="l00105"></a><span class="lineno">  105</span>   <a class="code" href="classOptionpk.html">Optionpk<float></a> threshold_opt(<span class="stringliteral">"th"</span>, <span class="stringliteral">"threshold"</span>, <span class="stringliteral">"threshold for selecting samples (randomly). Provide probability in percentage (>0) or absolute (<0)."</span>, 0);</div>
-<div class="line"><a name="l00106"></a><span class="lineno">  106</span>   <a class="code" href="classOptionpk.html">Optionpk<int></a> minreg_opt(<span class="stringliteral">"minreg"</span>, <span class="stringliteral">"minreg"</span>, <span class="stringliteral">"Minimum number of pixels to take into account for regression"</span>, 5, 2);</div>
-<div class="line"><a name="l00107"></a><span class="lineno">  107</span>   <span class="comment">// Optionpk<bool> regObs_opt("regobs", "regobs", "Perform regression between modeled and observed value",false);</span></div>
-<div class="line"><a name="l00108"></a><span class="lineno">  108</span>   <span class="comment">// Optionpk<double> checkDiff_opt("diff", "diff", "Flag observation as invalid if difference with model is above uncertainty",false);</span></div>
-<div class="line"><a name="l00109"></a><span class="lineno">  109</span>   <a class="code" href="classOptionpk.html">Optionpk<unsigned short></a> window_opt(<span class="stringliteral">"win"</span>, <span class="stringliteral">"window"</span>, <span class="stringliteral">"window size for calculating regression (use 0 for global)"</span>, 0);</div>
-<div class="line"><a name="l00110"></a><span class="lineno">  110</span>   <span class="comment">// Optionpk<string> mask_opt("m", "mask", "Use the first band of the specified file as a validity mask. Nodata values can be set with the option msknodata.");</span></div>
-<div class="line"><a name="l00111"></a><span class="lineno">  111</span>   <span class="comment">// Optionpk<double> msknodata_opt("msknodata", "msknodata", "Mask value(s) not to consider for filtering. First value will be set in output image.", 0);</span></div>
-<div class="line"><a name="l00112"></a><span class="lineno">  112</span> </div>
-<div class="line"><a name="l00113"></a><span class="lineno">  113</span>   <a class="code" href="classOptionpk.html">Optionpk<string></a>  oformat_opt(<span class="stringliteral">"of"</span>, <span class="stringliteral">"oformat"</span>, <span class="stringliteral">"Output image format (see also gdal_translate). Empty string: inherit from input image"</span>,<span class="stringliteral">"GTiff"</span>,2);</div>
-<div class="line"><a name="l00114"></a><span class="lineno">  114</span>   <a class="code" href="classOptionpk.html">Optionpk<string></a> option_opt(<span class="stringliteral">"co"</span>, <span class="stringliteral">"co"</span>, <span class="stringliteral">"Creation option for output file. Multiple options can be specified."</span>);</div>
-<div class="line"><a name="l00115"></a><span class="lineno">  115</span>   <a class="code" href="classOptionpk.html">Optionpk<short></a> verbose_opt(<span class="stringliteral">"v"</span>, <span class="stringliteral">"verbose"</span>, <span class="stringliteral">"verbose mode when positive"</span>, 0);</div>
-<div class="line"><a name="l00116"></a><span class="lineno">  116</span> </div>
-<div class="line"><a name="l00117"></a><span class="lineno">  117</span>   <span class="keywordtype">bool</span> doProcess;<span class="comment">//stop process when program was invoked with help option (-h --help)</span></div>
-<div class="line"><a name="l00118"></a><span class="lineno">  118</span>   <span class="keywordflow">try</span>{</div>
-<div class="line"><a name="l00119"></a><span class="lineno">  119</span>     doProcess=direction_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00120"></a><span class="lineno">  120</span>     model_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00121"></a><span class="lineno">  121</span>     observation_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00122"></a><span class="lineno">  122</span>     tmodel_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00123"></a><span class="lineno">  123</span>     tobservation_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00124"></a><span class="lineno">  124</span>     projection_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00125"></a><span class="lineno">  125</span>     outputfw_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00126"></a><span class="lineno">  126</span>     outputbw_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00127"></a><span class="lineno">  127</span>     outputfb_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00128"></a><span class="lineno">  128</span>     modnodata_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00129"></a><span class="lineno">  129</span>     obsnodata_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00130"></a><span class="lineno">  130</span>     modoffset_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00131"></a><span class="lineno">  131</span>     modscale_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00132"></a><span class="lineno">  132</span>     obsoffset_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00133"></a><span class="lineno">  133</span>     obsscale_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00134"></a><span class="lineno">  134</span>     eps_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00135"></a><span class="lineno">  135</span>     uncertModel_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00136"></a><span class="lineno">  136</span>     uncertObs_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00137"></a><span class="lineno">  137</span>     weight_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00138"></a><span class="lineno">  138</span>     deltaObs_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00139"></a><span class="lineno">  139</span>     uncertNodata_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00140"></a><span class="lineno">  140</span>     regTime_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00141"></a><span class="lineno">  141</span>     regSensor_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00142"></a><span class="lineno">  142</span>     down_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00143"></a><span class="lineno">  143</span>     threshold_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00144"></a><span class="lineno">  144</span>     minreg_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00145"></a><span class="lineno">  145</span>     <span class="comment">// regObs_opt.retrieveOption(argc,argv);</span></div>
-<div class="line"><a name="l00146"></a><span class="lineno">  146</span>     <span class="comment">// checkDiff_opt.retrieveOption(argc,argv);</span></div>
-<div class="line"><a name="l00147"></a><span class="lineno">  147</span>     window_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00148"></a><span class="lineno">  148</span>     <span class="comment">// mask_opt.retrieveOption(argc,argv);</span></div>
-<div class="line"><a name="l00149"></a><span class="lineno">  149</span>     <span class="comment">// msknodata_opt.retrieveOption(argc,argv);</span></div>
-<div class="line"><a name="l00150"></a><span class="lineno">  150</span>     oformat_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00151"></a><span class="lineno">  151</span>     option_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00152"></a><span class="lineno">  152</span>     verbose_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00153"></a><span class="lineno">  153</span>   }</div>
-<div class="line"><a name="l00154"></a><span class="lineno">  154</span>   <span class="keywordflow">catch</span>(<span class="keywordtype">string</span> predefinedString){</div>
-<div class="line"><a name="l00155"></a><span class="lineno">  155</span>     std::cout << predefinedString << std::endl;</div>
-<div class="line"><a name="l00156"></a><span class="lineno">  156</span>     exit(0);</div>
-<div class="line"><a name="l00157"></a><span class="lineno">  157</span>   }</div>
-<div class="line"><a name="l00158"></a><span class="lineno">  158</span>   <span class="keywordflow">if</span>(!doProcess){</div>
-<div class="line"><a name="l00159"></a><span class="lineno">  159</span>     std::cerr << <span class="stringliteral">"short option -h shows basic options only, use long option --help to show all options"</span> << std::endl;</div>
-<div class="line"><a name="l00160"></a><span class="lineno">  160</span>     exit(0);<span class="comment">//help was invoked, stop processing</span></div>
-<div class="line"><a name="l00161"></a><span class="lineno">  161</span>   }</div>
-<div class="line"><a name="l00162"></a><span class="lineno">  162</span> </div>
-<div class="line"><a name="l00163"></a><span class="lineno">  163</span>   <span class="keywordflow">if</span>(deltaObs_opt.size()==1){</div>
-<div class="line"><a name="l00164"></a><span class="lineno">  164</span>     <span class="keywordflow">if</span>(deltaObs_opt[0]<=0)</div>
-<div class="line"><a name="l00165"></a><span class="lineno">  165</span>       deltaObs_opt.push_back(-deltaObs_opt[0]);</div>
-<div class="line"><a name="l00166"></a><span class="lineno">  166</span>     <span class="keywordflow">else</span></div>
-<div class="line"><a name="l00167"></a><span class="lineno">  167</span>       deltaObs_opt.insert(deltaObs_opt.begin(),-deltaObs_opt[0]);</div>
+<div class="line"><a name="l00090"></a><span class="lineno">   90</span>   <a class="code" href="classOptionpk.html">Optionpk<string></a> gain_opt(<span class="stringliteral">"gain"</span>, <span class="stringliteral">"gain"</span>, <span class="stringliteral">"Output raster dataset for gain"</span>);</div>
+<div class="line"><a name="l00091"></a><span class="lineno">   91</span>   </div>
+<div class="line"><a name="l00092"></a><span class="lineno">   92</span>   <a class="code" href="classOptionpk.html">Optionpk<double></a> modnodata_opt(<span class="stringliteral">"modnodata"</span>, <span class="stringliteral">"modnodata"</span>, <span class="stringliteral">"invalid value for model input"</span>, 0);</div>
+<div class="line"><a name="l00093"></a><span class="lineno">   93</span>   <a class="code" href="classOptionpk.html">Optionpk<double></a> obsnodata_opt(<span class="stringliteral">"obsnodata"</span>, <span class="stringliteral">"obsnodata"</span>, <span class="stringliteral">"invalid value for observation input"</span>, 0);</div>
+<div class="line"><a name="l00094"></a><span class="lineno">   94</span>   <a class="code" href="classOptionpk.html">Optionpk<double></a> obsmin_opt(<span class="stringliteral">"obsmin"</span>, <span class="stringliteral">"obsmin"</span>, <span class="stringliteral">"Minimum value for observation data"</span>);</div>
+<div class="line"><a name="l00095"></a><span class="lineno">   95</span>   <a class="code" href="classOptionpk.html">Optionpk<double></a> obsmax_opt(<span class="stringliteral">"obsmax"</span>, <span class="stringliteral">"obsmax"</span>, <span class="stringliteral">"Maximum value for observation data"</span>);</div>
+<div class="line"><a name="l00096"></a><span class="lineno">   96</span>   <a class="code" href="classOptionpk.html">Optionpk<double></a> modoffset_opt(<span class="stringliteral">"modoffset"</span>, <span class="stringliteral">"modoffset"</span>, <span class="stringliteral">"offset used to read model input dataset (value=offset+scale*readValue)"</span>);</div>
+<div class="line"><a name="l00097"></a><span class="lineno">   97</span>   <a class="code" href="classOptionpk.html">Optionpk<double></a> obsoffset_opt(<span class="stringliteral">"obsoffset"</span>, <span class="stringliteral">"obsoffset"</span>, <span class="stringliteral">"offset used to read observation input dataset (value=offset+scale*readValue)"</span>);</div>
+<div class="line"><a name="l00098"></a><span class="lineno">   98</span>   <a class="code" href="classOptionpk.html">Optionpk<double></a> modscale_opt(<span class="stringliteral">"modscale"</span>, <span class="stringliteral">"modscale"</span>, <span class="stringliteral">"scale used to read model input dataset (value=offset+scale*readValue)"</span>);</div>
+<div class="line"><a name="l00099"></a><span class="lineno">   99</span>   <a class="code" href="classOptionpk.html">Optionpk<double></a> obsscale_opt(<span class="stringliteral">"obsscale"</span>, <span class="stringliteral">"obsscale"</span>, <span class="stringliteral">"scale used to read observation input dataset (value=offset+scale*readValue)"</span>);</div>
+<div class="line"><a name="l00100"></a><span class="lineno">  100</span>   <a class="code" href="classOptionpk.html">Optionpk<double></a> eps_opt(<span class="stringliteral">"eps"</span>, <span class="stringliteral">"eps"</span>, <span class="stringliteral">"epsilon for non zero division"</span>, 0.00001);</div>
+<div class="line"><a name="l00101"></a><span class="lineno">  101</span>   <a class="code" href="classOptionpk.html">Optionpk<double></a> uncertModel_opt(<span class="stringliteral">"um"</span>, <span class="stringliteral">"uncertmodel"</span>, <span class="stringliteral">"Multiply this value with std dev of first model image to obtain uncertainty of model"</span>,2);</div>
+<div class="line"><a name="l00102"></a><span class="lineno">  102</span>   <a class="code" href="classOptionpk.html">Optionpk<double></a> uncertObs_opt(<span class="stringliteral">"uo"</span>, <span class="stringliteral">"uncertobs"</span>, <span class="stringliteral">"Uncertainty of valid observations"</span>,0);</div>
+<div class="line"><a name="l00103"></a><span class="lineno">  103</span>   <a class="code" href="classOptionpk.html">Optionpk<double></a> weight_opt(<span class="stringliteral">"w"</span>, <span class="stringliteral">"weight"</span>, <span class="stringliteral">"Penalize outliers in measurement via weights. Use first weight to penalize small measurements wrt model and second weight to penalize large measurements wrt model"</span>);</div>
+<div class="line"><a name="l00104"></a><span class="lineno">  104</span>   <a class="code" href="classOptionpk.html">Optionpk<double></a> deltaObs_opt(<span class="stringliteral">"dobs"</span>, <span class="stringliteral">"deltaobs"</span>, <span class="stringliteral">"Lower and upper thresholds for relative pixel differences (in percentage): (observation-model)/model. For instance to force the observation within a +/- 10 % interval, use: -dobs -10 -do [...]
+<div class="line"><a name="l00105"></a><span class="lineno">  105</span>   <a class="code" href="classOptionpk.html">Optionpk<double></a> uncertNodata_opt(<span class="stringliteral">"unodata"</span>, <span class="stringliteral">"uncertnodata"</span>, <span class="stringliteral">"Uncertainty in case of no-data values in observation"</span>, 10000);</div>
+<div class="line"><a name="l00106"></a><span class="lineno">  106</span>   <a class="code" href="classOptionpk.html">Optionpk<double></a> regTime_opt(<span class="stringliteral">"rt"</span>, <span class="stringliteral">"regtime"</span>, <span class="stringliteral">"Weight for regression in time series"</span>, 1.0);</div>
+<div class="line"><a name="l00107"></a><span class="lineno">  107</span>   <a class="code" href="classOptionpk.html">Optionpk<double></a> regSensor_opt(<span class="stringliteral">"rs"</span>, <span class="stringliteral">"regsensor"</span>, <span class="stringliteral">"Weight for regression model - measurement (model - observation)."</span>);</div>
+<div class="line"><a name="l00108"></a><span class="lineno">  108</span>   <a class="code" href="classOptionpk.html">Optionpk<int></a> down_opt(<span class="stringliteral">"down"</span>, <span class="stringliteral">"down"</span>, <span class="stringliteral">"Downsampling factor for reading model data to calculate regression"</span>);</div>
+<div class="line"><a name="l00109"></a><span class="lineno">  109</span>   <a class="code" href="classOptionpk.html">Optionpk<float></a> threshold_opt(<span class="stringliteral">"th"</span>, <span class="stringliteral">"threshold"</span>, <span class="stringliteral">"threshold for selecting samples (randomly). Provide probability in percentage (>0) or absolute (<0)."</span>, 0);</div>
+<div class="line"><a name="l00110"></a><span class="lineno">  110</span>   <a class="code" href="classOptionpk.html">Optionpk<int></a> minreg_opt(<span class="stringliteral">"minreg"</span>, <span class="stringliteral">"minreg"</span>, <span class="stringliteral">"Minimum number of pixels to take into account for regression"</span>, 5, 2);</div>
+<div class="line"><a name="l00111"></a><span class="lineno">  111</span>   <a class="code" href="classOptionpk.html">Optionpk<float></a> c0modGlobalMin_opt(<span class="stringliteral">"c0modmin"</span>, <span class="stringliteral">"c0modmin"</span>, <span class="stringliteral">"Minimum value for c0 in model regression"</span>, -65, 2);</div>
+<div class="line"><a name="l00112"></a><span class="lineno">  112</span>   <a class="code" href="classOptionpk.html">Optionpk<float></a> c0modGlobalMax_opt(<span class="stringliteral">"c0modmax"</span>, <span class="stringliteral">"c0modmax"</span>, <span class="stringliteral">"Maximum value for c0 in model regression"</span>, 65, 2);</div>
+<div class="line"><a name="l00113"></a><span class="lineno">  113</span>   <a class="code" href="classOptionpk.html">Optionpk<float></a> c1modGlobalMin_opt(<span class="stringliteral">"c1modmin"</span>, <span class="stringliteral">"c1modmin"</span>, <span class="stringliteral">"Minimum value for c1 in model regression"</span>, 0.7, 2);</div>
+<div class="line"><a name="l00114"></a><span class="lineno">  114</span>   <a class="code" href="classOptionpk.html">Optionpk<float></a> c1modGlobalMax_opt(<span class="stringliteral">"c1modmax"</span>, <span class="stringliteral">"c1modmax"</span>, <span class="stringliteral">"Maximum value for c1 in model regression"</span>, 1.3, 2);</div>
+<div class="line"><a name="l00115"></a><span class="lineno">  115</span>   <span class="comment">// Optionpk<bool> regObs_opt("regobs", "regobs", "Perform regression between modeled and observed value",false);</span></div>
+<div class="line"><a name="l00116"></a><span class="lineno">  116</span>   <span class="comment">// Optionpk<double> checkDiff_opt("diff", "diff", "Flag observation as invalid if difference with model is above uncertainty",false);</span></div>
+<div class="line"><a name="l00117"></a><span class="lineno">  117</span>   <a class="code" href="classOptionpk.html">Optionpk<unsigned short></a> window_opt(<span class="stringliteral">"win"</span>, <span class="stringliteral">"window"</span>, <span class="stringliteral">"window size for calculating regression (use 0 for global)"</span>, 0);</div>
+<div class="line"><a name="l00118"></a><span class="lineno">  118</span>   <span class="comment">// Optionpk<string> mask_opt("m", "mask", "Use the first band of the specified file as a validity mask. Nodata values can be set with the option msknodata.");</span></div>
+<div class="line"><a name="l00119"></a><span class="lineno">  119</span>   <span class="comment">// Optionpk<double> msknodata_opt("msknodata", "msknodata", "Mask value(s) not to consider for filtering. First value will be set in output image.", 0);</span></div>
+<div class="line"><a name="l00120"></a><span class="lineno">  120</span> </div>
+<div class="line"><a name="l00121"></a><span class="lineno">  121</span>   <a class="code" href="classOptionpk.html">Optionpk<string></a>  oformat_opt(<span class="stringliteral">"of"</span>, <span class="stringliteral">"oformat"</span>, <span class="stringliteral">"Output image format (see also gdal_translate). Empty string: inherit from input image"</span>,<span class="stringliteral">"GTiff"</span>,2);</div>
+<div class="line"><a name="l00122"></a><span class="lineno">  122</span>   <a class="code" href="classOptionpk.html">Optionpk<string></a> option_opt(<span class="stringliteral">"co"</span>, <span class="stringliteral">"co"</span>, <span class="stringliteral">"Creation option for output file. Multiple options can be specified."</span>);</div>
+<div class="line"><a name="l00123"></a><span class="lineno">  123</span>   <a class="code" href="classOptionpk.html">Optionpk<short></a> verbose_opt(<span class="stringliteral">"v"</span>, <span class="stringliteral">"verbose"</span>, <span class="stringliteral">"verbose mode when positive"</span>, 0);</div>
+<div class="line"><a name="l00124"></a><span class="lineno">  124</span> </div>
+<div class="line"><a name="l00125"></a><span class="lineno">  125</span>   <span class="keywordtype">bool</span> doProcess;<span class="comment">//stop process when program was invoked with help option (-h --help)</span></div>
+<div class="line"><a name="l00126"></a><span class="lineno">  126</span>   <span class="keywordflow">try</span>{</div>
+<div class="line"><a name="l00127"></a><span class="lineno">  127</span>     doProcess=direction_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00128"></a><span class="lineno">  128</span>     model_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00129"></a><span class="lineno">  129</span>     observation_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00130"></a><span class="lineno">  130</span>     tmodel_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00131"></a><span class="lineno">  131</span>     tobservation_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00132"></a><span class="lineno">  132</span>     projection_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00133"></a><span class="lineno">  133</span>     outputfw_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00134"></a><span class="lineno">  134</span>     outputbw_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00135"></a><span class="lineno">  135</span>     outputfb_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00136"></a><span class="lineno">  136</span>     gain_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00137"></a><span class="lineno">  137</span>     modnodata_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00138"></a><span class="lineno">  138</span>     obsnodata_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00139"></a><span class="lineno">  139</span>     obsmin_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00140"></a><span class="lineno">  140</span>     obsmax_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00141"></a><span class="lineno">  141</span>     modoffset_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00142"></a><span class="lineno">  142</span>     modscale_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00143"></a><span class="lineno">  143</span>     obsoffset_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00144"></a><span class="lineno">  144</span>     obsscale_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00145"></a><span class="lineno">  145</span>     eps_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00146"></a><span class="lineno">  146</span>     uncertModel_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00147"></a><span class="lineno">  147</span>     uncertObs_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00148"></a><span class="lineno">  148</span>     weight_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00149"></a><span class="lineno">  149</span>     deltaObs_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00150"></a><span class="lineno">  150</span>     uncertNodata_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00151"></a><span class="lineno">  151</span>     regTime_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00152"></a><span class="lineno">  152</span>     regSensor_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00153"></a><span class="lineno">  153</span>     down_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00154"></a><span class="lineno">  154</span>     threshold_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00155"></a><span class="lineno">  155</span>     minreg_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00156"></a><span class="lineno">  156</span>     c0modGlobalMin_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00157"></a><span class="lineno">  157</span>     c0modGlobalMax_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00158"></a><span class="lineno">  158</span>     c1modGlobalMin_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00159"></a><span class="lineno">  159</span>     c1modGlobalMax_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00160"></a><span class="lineno">  160</span>     <span class="comment">// regObs_opt.retrieveOption(argc,argv);</span></div>
+<div class="line"><a name="l00161"></a><span class="lineno">  161</span>     <span class="comment">// checkDiff_opt.retrieveOption(argc,argv);</span></div>
+<div class="line"><a name="l00162"></a><span class="lineno">  162</span>     window_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00163"></a><span class="lineno">  163</span>     <span class="comment">// mask_opt.retrieveOption(argc,argv);</span></div>
+<div class="line"><a name="l00164"></a><span class="lineno">  164</span>     <span class="comment">// msknodata_opt.retrieveOption(argc,argv);</span></div>
+<div class="line"><a name="l00165"></a><span class="lineno">  165</span>     oformat_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00166"></a><span class="lineno">  166</span>     option_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00167"></a><span class="lineno">  167</span>     verbose_opt.retrieveOption(argc,argv);</div>
 <div class="line"><a name="l00168"></a><span class="lineno">  168</span>   }</div>
-<div class="line"><a name="l00169"></a><span class="lineno">  169</span>   <span class="keywordflow">if</span>(weight_opt.size()==1){</div>
-<div class="line"><a name="l00170"></a><span class="lineno">  170</span>     weight_opt.push_back(weight_opt[0]);</div>
-<div class="line"><a name="l00171"></a><span class="lineno">  171</span>   }</div>
-<div class="line"><a name="l00172"></a><span class="lineno">  172</span> </div>
-<div class="line"><a name="l00173"></a><span class="lineno">  173</span>   <span class="keywordflow">if</span>(down_opt.empty()){</div>
+<div class="line"><a name="l00169"></a><span class="lineno">  169</span>   <span class="keywordflow">catch</span>(<span class="keywordtype">string</span> predefinedString){</div>
+<div class="line"><a name="l00170"></a><span class="lineno">  170</span>     std::cout << predefinedString << std::endl;</div>
+<div class="line"><a name="l00171"></a><span class="lineno">  171</span>     exit(0);</div>
+<div class="line"><a name="l00172"></a><span class="lineno">  172</span>   }</div>
+<div class="line"><a name="l00173"></a><span class="lineno">  173</span>   <span class="keywordflow">if</span>(!doProcess){</div>
 <div class="line"><a name="l00174"></a><span class="lineno">  174</span>     std::cerr << <span class="stringliteral">"short option -h shows basic options only, use long option --help to show all options"</span> << std::endl;</div>
 <div class="line"><a name="l00175"></a><span class="lineno">  175</span>     exit(0);<span class="comment">//help was invoked, stop processing</span></div>
 <div class="line"><a name="l00176"></a><span class="lineno">  176</span>   }</div>
-<div class="line"><a name="l00177"></a><span class="lineno">  177</span>   <span class="keywordflow">try</span>{</div>
-<div class="line"><a name="l00178"></a><span class="lineno">  178</span>     ostringstream errorStream;</div>
-<div class="line"><a name="l00179"></a><span class="lineno">  179</span>     <span class="keywordflow">if</span>(model_opt.size()<2){</div>
-<div class="line"><a name="l00180"></a><span class="lineno">  180</span>       errorStream << <span class="stringliteral">"Error: no model dataset selected, use option -mod"</span> << endl;</div>
-<div class="line"><a name="l00181"></a><span class="lineno">  181</span>       <span class="keywordflow">throw</span>(errorStream.str());</div>
-<div class="line"><a name="l00182"></a><span class="lineno">  182</span>     }</div>
-<div class="line"><a name="l00183"></a><span class="lineno">  183</span>     <span class="keywordflow">if</span>(observation_opt.size()<1){</div>
-<div class="line"><a name="l00184"></a><span class="lineno">  184</span>       errorStream << <span class="stringliteral">"Error: no observation dataset selected, use option -obs"</span> << endl;</div>
-<div class="line"><a name="l00185"></a><span class="lineno">  185</span>       <span class="keywordflow">throw</span>(errorStream.str());</div>
-<div class="line"><a name="l00186"></a><span class="lineno">  186</span>     }</div>
-<div class="line"><a name="l00187"></a><span class="lineno">  187</span>     <span class="keywordflow">if</span>(direction_opt[0]==<span class="stringliteral">"smooth"</span>){</div>
-<div class="line"><a name="l00188"></a><span class="lineno">  188</span>       <span class="keywordflow">if</span>(outputfw_opt.empty()){</div>
-<div class="line"><a name="l00189"></a><span class="lineno">  189</span>     errorStream << <span class="stringliteral">"Error: output forward datasets is not provided, use option -ofw"</span> << endl;</div>
-<div class="line"><a name="l00190"></a><span class="lineno">  190</span>     <span class="keywordflow">throw</span>(errorStream.str());</div>
-<div class="line"><a name="l00191"></a><span class="lineno">  191</span>       }</div>
-<div class="line"><a name="l00192"></a><span class="lineno">  192</span>       <span class="keywordflow">if</span>(outputbw_opt.empty()){</div>
-<div class="line"><a name="l00193"></a><span class="lineno">  193</span>     errorStream << <span class="stringliteral">"Error: output backward datasets is not provided, use option -obw"</span> << endl;</div>
-<div class="line"><a name="l00194"></a><span class="lineno">  194</span>     <span class="keywordflow">throw</span>(errorStream.str());</div>
-<div class="line"><a name="l00195"></a><span class="lineno">  195</span>       }</div>
-<div class="line"><a name="l00196"></a><span class="lineno">  196</span>       <span class="keywordflow">if</span>(outputfb_opt.empty()){</div>
-<div class="line"><a name="l00197"></a><span class="lineno">  197</span>     errorStream << <span class="stringliteral">"Error: output smooth datasets is not provided, use option -ofb"</span> << endl;</div>
-<div class="line"><a name="l00198"></a><span class="lineno">  198</span>     <span class="keywordflow">throw</span>(errorStream.str());</div>
-<div class="line"><a name="l00199"></a><span class="lineno">  199</span>       }</div>
-<div class="line"><a name="l00200"></a><span class="lineno">  200</span>     }</div>
-<div class="line"><a name="l00201"></a><span class="lineno">  201</span>     <span class="keywordflow">else</span>{</div>
-<div class="line"><a name="l00202"></a><span class="lineno">  202</span>       <span class="keywordflow">if</span>(direction_opt[0]==<span class="stringliteral">"forward"</span>&&outputfw_opt.empty()){</div>
-<div class="line"><a name="l00203"></a><span class="lineno">  203</span>     errorStream << <span class="stringliteral">"Error: output forward datasets is not provided, use option -ofw"</span> << endl;</div>
-<div class="line"><a name="l00204"></a><span class="lineno">  204</span>     <span class="keywordflow">throw</span>(errorStream.str());</div>
-<div class="line"><a name="l00205"></a><span class="lineno">  205</span>       }</div>
-<div class="line"><a name="l00206"></a><span class="lineno">  206</span>       <span class="keywordflow">else</span> <span class="keywordflow">if</span>(direction_opt[0]==<span class="stringliteral">"backward"</span>&&outputbw_opt.empty()){</div>
-<div class="line"><a name="l00207"></a><span class="lineno">  207</span>     errorStream << <span class="stringliteral">"Error: output backward datasets is not provided, use option -obw"</span> << endl;</div>
-<div class="line"><a name="l00208"></a><span class="lineno">  208</span>     <span class="keywordflow">throw</span>(errorStream.str());</div>
-<div class="line"><a name="l00209"></a><span class="lineno">  209</span>       }</div>
-<div class="line"><a name="l00210"></a><span class="lineno">  210</span> </div>
-<div class="line"><a name="l00211"></a><span class="lineno">  211</span>       <span class="keywordflow">if</span>(model_opt.size()<observation_opt.size()){</div>
-<div class="line"><a name="l00212"></a><span class="lineno">  212</span>     errorStream << <span class="stringliteral">"Error: sequence of models should be larger than observations"</span> << endl;</div>
+<div class="line"><a name="l00177"></a><span class="lineno">  177</span> </div>
+<div class="line"><a name="l00178"></a><span class="lineno">  178</span>   <span class="keywordflow">if</span>(deltaObs_opt.size()==1){</div>
+<div class="line"><a name="l00179"></a><span class="lineno">  179</span>     <span class="keywordflow">if</span>(deltaObs_opt[0]<=0)</div>
+<div class="line"><a name="l00180"></a><span class="lineno">  180</span>       deltaObs_opt.push_back(-deltaObs_opt[0]);</div>
+<div class="line"><a name="l00181"></a><span class="lineno">  181</span>     <span class="keywordflow">else</span></div>
+<div class="line"><a name="l00182"></a><span class="lineno">  182</span>       deltaObs_opt.insert(deltaObs_opt.begin(),-deltaObs_opt[0]);</div>
+<div class="line"><a name="l00183"></a><span class="lineno">  183</span>   }</div>
+<div class="line"><a name="l00184"></a><span class="lineno">  184</span>   <span class="keywordflow">if</span>(weight_opt.size()==1){</div>
+<div class="line"><a name="l00185"></a><span class="lineno">  185</span>     weight_opt.push_back(weight_opt[0]);</div>
+<div class="line"><a name="l00186"></a><span class="lineno">  186</span>   }</div>
+<div class="line"><a name="l00187"></a><span class="lineno">  187</span> </div>
+<div class="line"><a name="l00188"></a><span class="lineno">  188</span>   <span class="keywordflow">if</span>(down_opt.empty()){</div>
+<div class="line"><a name="l00189"></a><span class="lineno">  189</span>     std::cerr << <span class="stringliteral">"short option -h shows basic options only, use long option --help to show all options"</span> << std::endl;</div>
+<div class="line"><a name="l00190"></a><span class="lineno">  190</span>     exit(0);<span class="comment">//help was invoked, stop processing</span></div>
+<div class="line"><a name="l00191"></a><span class="lineno">  191</span>   }</div>
+<div class="line"><a name="l00192"></a><span class="lineno">  192</span>   <span class="keywordflow">try</span>{</div>
+<div class="line"><a name="l00193"></a><span class="lineno">  193</span>     ostringstream errorStream;</div>
+<div class="line"><a name="l00194"></a><span class="lineno">  194</span>     <span class="keywordflow">if</span>(model_opt.size()<2){</div>
+<div class="line"><a name="l00195"></a><span class="lineno">  195</span>       errorStream << <span class="stringliteral">"Error: no model dataset selected, use option -mod"</span> << endl;</div>
+<div class="line"><a name="l00196"></a><span class="lineno">  196</span>       <span class="keywordflow">throw</span>(errorStream.str());</div>
+<div class="line"><a name="l00197"></a><span class="lineno">  197</span>     }</div>
+<div class="line"><a name="l00198"></a><span class="lineno">  198</span>     <span class="keywordflow">if</span>(observation_opt.size()<1){</div>
+<div class="line"><a name="l00199"></a><span class="lineno">  199</span>       errorStream << <span class="stringliteral">"Error: no observation dataset selected, use option -obs"</span> << endl;</div>
+<div class="line"><a name="l00200"></a><span class="lineno">  200</span>       <span class="keywordflow">throw</span>(errorStream.str());</div>
+<div class="line"><a name="l00201"></a><span class="lineno">  201</span>     }</div>
+<div class="line"><a name="l00202"></a><span class="lineno">  202</span>     <span class="keywordflow">if</span>(direction_opt[0]==<span class="stringliteral">"smooth"</span>){</div>
+<div class="line"><a name="l00203"></a><span class="lineno">  203</span>       <span class="keywordflow">if</span>(outputfw_opt.empty()){</div>
+<div class="line"><a name="l00204"></a><span class="lineno">  204</span>     errorStream << <span class="stringliteral">"Error: output forward datasets is not provided, use option -ofw"</span> << endl;</div>
+<div class="line"><a name="l00205"></a><span class="lineno">  205</span>     <span class="keywordflow">throw</span>(errorStream.str());</div>
+<div class="line"><a name="l00206"></a><span class="lineno">  206</span>       }</div>
+<div class="line"><a name="l00207"></a><span class="lineno">  207</span>       <span class="keywordflow">if</span>(outputbw_opt.empty()){</div>
+<div class="line"><a name="l00208"></a><span class="lineno">  208</span>     errorStream << <span class="stringliteral">"Error: output backward datasets is not provided, use option -obw"</span> << endl;</div>
+<div class="line"><a name="l00209"></a><span class="lineno">  209</span>     <span class="keywordflow">throw</span>(errorStream.str());</div>
+<div class="line"><a name="l00210"></a><span class="lineno">  210</span>       }</div>
+<div class="line"><a name="l00211"></a><span class="lineno">  211</span>       <span class="keywordflow">if</span>(outputfb_opt.empty()){</div>
+<div class="line"><a name="l00212"></a><span class="lineno">  212</span>     errorStream << <span class="stringliteral">"Error: output smooth datasets is not provided, use option -ofb"</span> << endl;</div>
 <div class="line"><a name="l00213"></a><span class="lineno">  213</span>     <span class="keywordflow">throw</span>(errorStream.str());</div>
 <div class="line"><a name="l00214"></a><span class="lineno">  214</span>       }</div>
-<div class="line"><a name="l00215"></a><span class="lineno">  215</span>       <span class="keywordflow">if</span>(tmodel_opt.size()!=model_opt.size()){</div>
-<div class="line"><a name="l00216"></a><span class="lineno">  216</span>     <span class="keywordflow">if</span>(tmodel_opt.empty())</div>
-<div class="line"><a name="l00217"></a><span class="lineno">  217</span>       cout << <span class="stringliteral">"Warning: time sequence is not provided, self generating time sequence from 0 to "</span> << model_opt.size() << endl;</div>
-<div class="line"><a name="l00218"></a><span class="lineno">  218</span>     <span class="keywordflow">else</span></div>
-<div class="line"><a name="l00219"></a><span class="lineno">  219</span>       cout << <span class="stringliteral">"Warning: time sequence provided ("</span> << tmodel_opt.size() << <span class="stringliteral">") does not match number of model raster datasets ("</span> << model_opt.size() << <span class="stringliteral">")"</span> << endl;</div>
-<div class="line"><a name="l00220"></a><span class="lineno">  220</span>     tmodel_opt.clear();</div>
-<div class="line"><a name="l00221"></a><span class="lineno">  221</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> tindex=0;tindex<model_opt.size();++tindex)</div>
-<div class="line"><a name="l00222"></a><span class="lineno">  222</span>       tmodel_opt.push_back(tindex);</div>
-<div class="line"><a name="l00223"></a><span class="lineno">  223</span>       }</div>
-<div class="line"><a name="l00224"></a><span class="lineno">  224</span>       <span class="keywordflow">if</span>(tobservation_opt.size()!=observation_opt.size()){</div>
-<div class="line"><a name="l00225"></a><span class="lineno">  225</span>     errorStream << <span class="stringliteral">"Error: time sequence for observation must match size of observation dataset"</span> << endl;</div>
-<div class="line"><a name="l00226"></a><span class="lineno">  226</span>     <span class="keywordflow">throw</span>(errorStream.str());</div>
-<div class="line"><a name="l00227"></a><span class="lineno">  227</span>       }</div>
-<div class="line"><a name="l00228"></a><span class="lineno">  228</span>     }</div>
-<div class="line"><a name="l00229"></a><span class="lineno">  229</span>   }</div>
-<div class="line"><a name="l00230"></a><span class="lineno">  230</span>   <span class="keywordflow">catch</span>(<span class="keywordtype">string</span> errorString){</div>
-<div class="line"><a name="l00231"></a><span class="lineno">  231</span>     std::cout << errorString << std::endl;</div>
-<div class="line"><a name="l00232"></a><span class="lineno">  232</span>     exit(1);</div>
-<div class="line"><a name="l00233"></a><span class="lineno">  233</span>   }</div>
-<div class="line"><a name="l00234"></a><span class="lineno">  234</span> </div>
-<div class="line"><a name="l00235"></a><span class="lineno">  235</span>   <a class="code" href="classstatfactory_1_1StatFactory.html">statfactory::StatFactory</a> stat;</div>
-<div class="line"><a name="l00236"></a><span class="lineno">  236</span>   stat.setNoDataValues(modnodata_opt);</div>
-<div class="line"><a name="l00237"></a><span class="lineno">  237</span>   <a class="code" href="classimgregression_1_1ImgRegression.html">imgregression::ImgRegression</a> imgreg;</div>
-<div class="line"><a name="l00238"></a><span class="lineno">  238</span>   <span class="comment">// vector<ImgReaderGdal> imgReaderModel(model_opt.size());</span></div>
-<div class="line"><a name="l00239"></a><span class="lineno">  239</span>   <span class="comment">// vector<ImgReaderGdal> imgReaderObs(observation_opt.size());</span></div>
-<div class="line"><a name="l00240"></a><span class="lineno">  240</span>   <a class="code" href="classImgReaderGdal.html">ImgReaderGdal</a> imgReaderModel1;</div>
-<div class="line"><a name="l00241"></a><span class="lineno">  241</span>   <a class="code" href="classImgReaderGdal.html">ImgReaderGdal</a> imgReaderModel2;</div>
-<div class="line"><a name="l00242"></a><span class="lineno">  242</span>   <a class="code" href="classImgReaderGdal.html">ImgReaderGdal</a> imgReaderObs;</div>
-<div class="line"><a name="l00243"></a><span class="lineno">  243</span>   <a class="code" href="classImgWriterGdal.html">ImgWriterGdal</a> imgWriterEst;</div>
-<div class="line"><a name="l00244"></a><span class="lineno">  244</span> </div>
-<div class="line"><a name="l00245"></a><span class="lineno">  245</span>   imgReaderObs.open(observation_opt[0]);</div>
-<div class="line"><a name="l00246"></a><span class="lineno">  246</span> </div>
-<div class="line"><a name="l00247"></a><span class="lineno">  247</span>   <span class="keywordtype">int</span> ncol=imgReaderObs.nrOfCol();</div>
-<div class="line"><a name="l00248"></a><span class="lineno">  248</span>   <span class="keywordtype">int</span> nrow=imgReaderObs.nrOfRow();</div>
-<div class="line"><a name="l00249"></a><span class="lineno">  249</span>   <span class="keywordflow">if</span>(projection_opt.empty())</div>
-<div class="line"><a name="l00250"></a><span class="lineno">  250</span>     projection_opt.push_back(imgReaderObs.getProjection());</div>
-<div class="line"><a name="l00251"></a><span class="lineno">  251</span>   <span class="keywordtype">double</span> geotransform[6];</div>
-<div class="line"><a name="l00252"></a><span class="lineno">  252</span>   imgReaderObs.getGeoTransform(geotransform);</div>
-<div class="line"><a name="l00253"></a><span class="lineno">  253</span> </div>
-<div class="line"><a name="l00254"></a><span class="lineno">  254</span>   <span class="keywordtype">string</span> imageType=imgReaderObs.getImageType();</div>
-<div class="line"><a name="l00255"></a><span class="lineno">  255</span>   <span class="keywordflow">if</span>(oformat_opt.size())<span class="comment">//default</span></div>
-<div class="line"><a name="l00256"></a><span class="lineno">  256</span>     imageType=oformat_opt[0];</div>
-<div class="line"><a name="l00257"></a><span class="lineno">  257</span>   <span class="keywordflow">if</span>(option_opt.findSubstring(<span class="stringliteral">"INTERLEAVE="</span>)==option_opt.end()){</div>
-<div class="line"><a name="l00258"></a><span class="lineno">  258</span>     <span class="keywordtype">string</span> theInterleave=<span class="stringliteral">"INTERLEAVE="</span>;</div>
-<div class="line"><a name="l00259"></a><span class="lineno">  259</span>     theInterleave+=imgReaderObs.getInterleave();</div>
-<div class="line"><a name="l00260"></a><span class="lineno">  260</span>     option_opt.push_back(theInterleave);</div>
-<div class="line"><a name="l00261"></a><span class="lineno">  261</span>   }</div>
-<div class="line"><a name="l00262"></a><span class="lineno">  262</span> </div>
-<div class="line"><a name="l00263"></a><span class="lineno">  263</span>   <span class="keywordflow">if</span>(down_opt.empty()){</div>
-<div class="line"><a name="l00264"></a><span class="lineno">  264</span>     imgReaderModel1.open(model_opt[0]);</div>
-<div class="line"><a name="l00265"></a><span class="lineno">  265</span>     <span class="keywordtype">double</span> resModel=imgReaderModel1.getDeltaX();</div>
-<div class="line"><a name="l00266"></a><span class="lineno">  266</span>     <span class="keywordtype">double</span> resObs=imgReaderObs.getDeltaX();</div>
-<div class="line"><a name="l00267"></a><span class="lineno">  267</span>     <span class="keywordtype">int</span> down=<span class="keyword">static_cast<</span><span class="keywordtype">int</span><span class="keyword">></span>(ceil(resModel/resObs));</div>
-<div class="line"><a name="l00268"></a><span class="lineno">  268</span>     <span class="keywordflow">if</span>(!(down%2))</div>
-<div class="line"><a name="l00269"></a><span class="lineno">  269</span>       down+=1;</div>
-<div class="line"><a name="l00270"></a><span class="lineno">  270</span>     down_opt.push_back(down);</div>
-<div class="line"><a name="l00271"></a><span class="lineno">  271</span>     imgReaderModel1.close();</div>
-<div class="line"><a name="l00272"></a><span class="lineno">  272</span>   }</div>
-<div class="line"><a name="l00273"></a><span class="lineno">  273</span>   imgReaderObs.close();</div>
-<div class="line"><a name="l00274"></a><span class="lineno">  274</span> </div>
-<div class="line"><a name="l00275"></a><span class="lineno">  275</span>   <span class="keywordflow">if</span>(regSensor_opt.empty())</div>
-<div class="line"><a name="l00276"></a><span class="lineno">  276</span>     regSensor_opt.push_back(1.0/down_opt[0]);</div>
-<div class="line"><a name="l00277"></a><span class="lineno">  277</span>   <span class="comment">//hiero</span></div>
-<div class="line"><a name="l00278"></a><span class="lineno">  278</span>   <span class="comment">// ImgReaderGdal maskReader;</span></div>
-<div class="line"><a name="l00279"></a><span class="lineno">  279</span>   <span class="comment">// double colMask=0;</span></div>
-<div class="line"><a name="l00280"></a><span class="lineno">  280</span>   <span class="comment">// double rowMask=0;</span></div>
-<div class="line"><a name="l00281"></a><span class="lineno">  281</span> </div>
-<div class="line"><a name="l00282"></a><span class="lineno">  282</span>   <span class="comment">// if(mask_opt.size()){</span></div>
-<div class="line"><a name="l00283"></a><span class="lineno">  283</span>   <span class="comment">//   try{</span></div>
-<div class="line"><a name="l00284"></a><span class="lineno">  284</span>   <span class="comment">//     if(verbose_opt[0]>=1)</span></div>
-<div class="line"><a name="l00285"></a><span class="lineno">  285</span>   <span class="comment">//    std::cout << "opening mask image file " << mask_opt[0] << std::endl;</span></div>
-<div class="line"><a name="l00286"></a><span class="lineno">  286</span>   <span class="comment">//     maskReader.open(mask_opt[0]);</span></div>
-<div class="line"><a name="l00287"></a><span class="lineno">  287</span>   <span class="comment">//     maskReader.setNoData(msknodata_opt);</span></div>
-<div class="line"><a name="l00288"></a><span class="lineno">  288</span>   <span class="comment">//   }</span></div>
-<div class="line"><a name="l00289"></a><span class="lineno">  289</span>   <span class="comment">//   catch(string error){</span></div>
-<div class="line"><a name="l00290"></a><span class="lineno">  290</span>   <span class="comment">//     cerr << error << std::endl;</span></div>
-<div class="line"><a name="l00291"></a><span class="lineno">  291</span>   <span class="comment">//     exit(2);</span></div>
-<div class="line"><a name="l00292"></a><span class="lineno">  292</span>   <span class="comment">//   }</span></div>
-<div class="line"><a name="l00293"></a><span class="lineno">  293</span>   <span class="comment">//   catch(...){</span></div>
-<div class="line"><a name="l00294"></a><span class="lineno">  294</span>   <span class="comment">//     cerr << "error catched" << std::endl;</span></div>
-<div class="line"><a name="l00295"></a><span class="lineno">  295</span>   <span class="comment">//     exit(1);</span></div>
-<div class="line"><a name="l00296"></a><span class="lineno">  296</span>   <span class="comment">//   }</span></div>
-<div class="line"><a name="l00297"></a><span class="lineno">  297</span>   <span class="comment">// }</span></div>
+<div class="line"><a name="l00215"></a><span class="lineno">  215</span>     }</div>
+<div class="line"><a name="l00216"></a><span class="lineno">  216</span>     <span class="keywordflow">else</span>{</div>
+<div class="line"><a name="l00217"></a><span class="lineno">  217</span>       <span class="keywordflow">if</span>(direction_opt[0]==<span class="stringliteral">"forward"</span>&&outputfw_opt.empty()){</div>
+<div class="line"><a name="l00218"></a><span class="lineno">  218</span>     errorStream << <span class="stringliteral">"Error: output forward datasets is not provided, use option -ofw"</span> << endl;</div>
+<div class="line"><a name="l00219"></a><span class="lineno">  219</span>     <span class="keywordflow">throw</span>(errorStream.str());</div>
+<div class="line"><a name="l00220"></a><span class="lineno">  220</span>       }</div>
+<div class="line"><a name="l00221"></a><span class="lineno">  221</span>       <span class="keywordflow">else</span> <span class="keywordflow">if</span>(direction_opt[0]==<span class="stringliteral">"backward"</span>&&outputbw_opt.empty()){</div>
+<div class="line"><a name="l00222"></a><span class="lineno">  222</span>     errorStream << <span class="stringliteral">"Error: output backward datasets is not provided, use option -obw"</span> << endl;</div>
+<div class="line"><a name="l00223"></a><span class="lineno">  223</span>     <span class="keywordflow">throw</span>(errorStream.str());</div>
+<div class="line"><a name="l00224"></a><span class="lineno">  224</span>       }</div>
+<div class="line"><a name="l00225"></a><span class="lineno">  225</span> </div>
+<div class="line"><a name="l00226"></a><span class="lineno">  226</span>       <span class="keywordflow">if</span>(model_opt.size()<observation_opt.size()){</div>
+<div class="line"><a name="l00227"></a><span class="lineno">  227</span>     errorStream << <span class="stringliteral">"Error: sequence of models should be larger than observations"</span> << endl;</div>
+<div class="line"><a name="l00228"></a><span class="lineno">  228</span>     <span class="keywordflow">throw</span>(errorStream.str());</div>
+<div class="line"><a name="l00229"></a><span class="lineno">  229</span>       }</div>
+<div class="line"><a name="l00230"></a><span class="lineno">  230</span>       <span class="keywordflow">if</span>(tmodel_opt.size()!=model_opt.size()){</div>
+<div class="line"><a name="l00231"></a><span class="lineno">  231</span>     <span class="keywordflow">if</span>(tmodel_opt.empty())</div>
+<div class="line"><a name="l00232"></a><span class="lineno">  232</span>       cout << <span class="stringliteral">"Warning: time sequence is not provided, self generating time sequence from 0 to "</span> << model_opt.size() << endl;</div>
+<div class="line"><a name="l00233"></a><span class="lineno">  233</span>     <span class="keywordflow">else</span></div>
+<div class="line"><a name="l00234"></a><span class="lineno">  234</span>       cout << <span class="stringliteral">"Warning: time sequence provided ("</span> << tmodel_opt.size() << <span class="stringliteral">") does not match number of model raster datasets ("</span> << model_opt.size() << <span class="stringliteral">")"</span> << endl;</div>
+<div class="line"><a name="l00235"></a><span class="lineno">  235</span>     tmodel_opt.clear();</div>
+<div class="line"><a name="l00236"></a><span class="lineno">  236</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> tindex=0;tindex<model_opt.size();++tindex)</div>
+<div class="line"><a name="l00237"></a><span class="lineno">  237</span>       tmodel_opt.push_back(tindex);</div>
+<div class="line"><a name="l00238"></a><span class="lineno">  238</span>       }</div>
+<div class="line"><a name="l00239"></a><span class="lineno">  239</span>       <span class="keywordflow">if</span>(tobservation_opt.size()!=observation_opt.size()){</div>
+<div class="line"><a name="l00240"></a><span class="lineno">  240</span>     errorStream << <span class="stringliteral">"Error: time sequence for observation must match size of observation dataset"</span> << endl;</div>
+<div class="line"><a name="l00241"></a><span class="lineno">  241</span>     <span class="keywordflow">throw</span>(errorStream.str());</div>
+<div class="line"><a name="l00242"></a><span class="lineno">  242</span>       }</div>
+<div class="line"><a name="l00243"></a><span class="lineno">  243</span>     }</div>
+<div class="line"><a name="l00244"></a><span class="lineno">  244</span>   }</div>
+<div class="line"><a name="l00245"></a><span class="lineno">  245</span>   <span class="keywordflow">catch</span>(<span class="keywordtype">string</span> errorString){</div>
+<div class="line"><a name="l00246"></a><span class="lineno">  246</span>     std::cout << errorString << std::endl;</div>
+<div class="line"><a name="l00247"></a><span class="lineno">  247</span>     exit(1);</div>
+<div class="line"><a name="l00248"></a><span class="lineno">  248</span>   }</div>
+<div class="line"><a name="l00249"></a><span class="lineno">  249</span> </div>
+<div class="line"><a name="l00250"></a><span class="lineno">  250</span>   <a class="code" href="classstatfactory_1_1StatFactory.html">statfactory::StatFactory</a> stat;</div>
+<div class="line"><a name="l00251"></a><span class="lineno">  251</span>   stat.setNoDataValues(modnodata_opt);</div>
+<div class="line"><a name="l00252"></a><span class="lineno">  252</span>   <a class="code" href="classimgregression_1_1ImgRegression.html">imgregression::ImgRegression</a> imgreg;</div>
+<div class="line"><a name="l00253"></a><span class="lineno">  253</span>   <span class="comment">// vector<ImgReaderGdal> imgReaderModel(model_opt.size());</span></div>
+<div class="line"><a name="l00254"></a><span class="lineno">  254</span>   <span class="comment">// vector<ImgReaderGdal> imgReaderObs(observation_opt.size());</span></div>
+<div class="line"><a name="l00255"></a><span class="lineno">  255</span>   <a class="code" href="classImgReaderGdal.html">ImgReaderGdal</a> imgReaderModel1;</div>
+<div class="line"><a name="l00256"></a><span class="lineno">  256</span>   <a class="code" href="classImgReaderGdal.html">ImgReaderGdal</a> imgReaderModel2;</div>
+<div class="line"><a name="l00257"></a><span class="lineno">  257</span>   <a class="code" href="classImgReaderGdal.html">ImgReaderGdal</a> imgReaderObs;</div>
+<div class="line"><a name="l00258"></a><span class="lineno">  258</span>   <a class="code" href="classImgWriterGdal.html">ImgWriterGdal</a> imgWriterEst;</div>
+<div class="line"><a name="l00259"></a><span class="lineno">  259</span>   <span class="comment">//test</span></div>
+<div class="line"><a name="l00260"></a><span class="lineno">  260</span>   <a class="code" href="classImgWriterGdal.html">ImgWriterGdal</a> imgWriterGain;</div>
+<div class="line"><a name="l00261"></a><span class="lineno">  261</span> </div>
+<div class="line"><a name="l00262"></a><span class="lineno">  262</span>   imgReaderObs.open(observation_opt[0]);</div>
+<div class="line"><a name="l00263"></a><span class="lineno">  263</span> </div>
+<div class="line"><a name="l00264"></a><span class="lineno">  264</span>   <span class="keywordtype">int</span> ncol=imgReaderObs.nrOfCol();</div>
+<div class="line"><a name="l00265"></a><span class="lineno">  265</span>   <span class="keywordtype">int</span> nrow=imgReaderObs.nrOfRow();</div>
+<div class="line"><a name="l00266"></a><span class="lineno">  266</span>   <span class="keywordflow">if</span>(projection_opt.empty())</div>
+<div class="line"><a name="l00267"></a><span class="lineno">  267</span>     projection_opt.push_back(imgReaderObs.getProjection());</div>
+<div class="line"><a name="l00268"></a><span class="lineno">  268</span>   <span class="keywordtype">double</span> geotransform[6];</div>
+<div class="line"><a name="l00269"></a><span class="lineno">  269</span>   imgReaderObs.getGeoTransform(geotransform);</div>
+<div class="line"><a name="l00270"></a><span class="lineno">  270</span> </div>
+<div class="line"><a name="l00271"></a><span class="lineno">  271</span>   <span class="keywordtype">string</span> imageType=imgReaderObs.getImageType();</div>
+<div class="line"><a name="l00272"></a><span class="lineno">  272</span>   <span class="keywordflow">if</span>(oformat_opt.size())<span class="comment">//default</span></div>
+<div class="line"><a name="l00273"></a><span class="lineno">  273</span>     imageType=oformat_opt[0];</div>
+<div class="line"><a name="l00274"></a><span class="lineno">  274</span>   <span class="keywordflow">if</span>(option_opt.findSubstring(<span class="stringliteral">"INTERLEAVE="</span>)==option_opt.end()){</div>
+<div class="line"><a name="l00275"></a><span class="lineno">  275</span>     <span class="keywordtype">string</span> theInterleave=<span class="stringliteral">"INTERLEAVE="</span>;</div>
+<div class="line"><a name="l00276"></a><span class="lineno">  276</span>     theInterleave+=imgReaderObs.getInterleave();</div>
+<div class="line"><a name="l00277"></a><span class="lineno">  277</span>     option_opt.push_back(theInterleave);</div>
+<div class="line"><a name="l00278"></a><span class="lineno">  278</span>   }</div>
+<div class="line"><a name="l00279"></a><span class="lineno">  279</span> </div>
+<div class="line"><a name="l00280"></a><span class="lineno">  280</span>   <span class="keywordflow">if</span>(down_opt.empty()){</div>
+<div class="line"><a name="l00281"></a><span class="lineno">  281</span>     imgReaderModel1.open(model_opt[0]);</div>
+<div class="line"><a name="l00282"></a><span class="lineno">  282</span>     <span class="keywordtype">double</span> resModel=imgReaderModel1.getDeltaX();</div>
+<div class="line"><a name="l00283"></a><span class="lineno">  283</span>     <span class="keywordtype">double</span> resObs=imgReaderObs.getDeltaX();</div>
+<div class="line"><a name="l00284"></a><span class="lineno">  284</span>     <span class="keywordtype">int</span> down=<span class="keyword">static_cast<</span><span class="keywordtype">int</span><span class="keyword">></span>(ceil(resModel/resObs));</div>
+<div class="line"><a name="l00285"></a><span class="lineno">  285</span>     <span class="keywordflow">if</span>(!(down%2))</div>
+<div class="line"><a name="l00286"></a><span class="lineno">  286</span>       down+=1;</div>
+<div class="line"><a name="l00287"></a><span class="lineno">  287</span>     down_opt.push_back(down);</div>
+<div class="line"><a name="l00288"></a><span class="lineno">  288</span>     imgReaderModel1.close();</div>
+<div class="line"><a name="l00289"></a><span class="lineno">  289</span>   }</div>
+<div class="line"><a name="l00290"></a><span class="lineno">  290</span>   imgReaderObs.close();</div>
+<div class="line"><a name="l00291"></a><span class="lineno">  291</span> </div>
+<div class="line"><a name="l00292"></a><span class="lineno">  292</span>   <span class="keywordflow">if</span>(regSensor_opt.empty())</div>
+<div class="line"><a name="l00293"></a><span class="lineno">  293</span>     regSensor_opt.push_back(1.0/down_opt[0]);</div>
+<div class="line"><a name="l00294"></a><span class="lineno">  294</span>   <span class="comment">//hiero</span></div>
+<div class="line"><a name="l00295"></a><span class="lineno">  295</span>   <span class="comment">// ImgReaderGdal maskReader;</span></div>
+<div class="line"><a name="l00296"></a><span class="lineno">  296</span>   <span class="comment">// double colMask=0;</span></div>
+<div class="line"><a name="l00297"></a><span class="lineno">  297</span>   <span class="comment">// double rowMask=0;</span></div>
 <div class="line"><a name="l00298"></a><span class="lineno">  298</span> </div>
-<div class="line"><a name="l00299"></a><span class="lineno">  299</span>   <span class="keywordtype">int</span> obsindex=0;</div>
-<div class="line"><a name="l00300"></a><span class="lineno">  300</span> </div>
-<div class="line"><a name="l00301"></a><span class="lineno">  301</span>   <span class="keyword">const</span> <span class="keywordtype">char</span>* pszMessage;</div>
-<div class="line"><a name="l00302"></a><span class="lineno">  302</span>   <span class="keywordtype">void</span>* pProgressArg=NULL;</div>
-<div class="line"><a name="l00303"></a><span class="lineno">  303</span>   GDALProgressFunc pfnProgress=GDALTermProgress;</div>
-<div class="line"><a name="l00304"></a><span class="lineno">  304</span>   <span class="keywordtype">double</span> progress=0;</div>
-<div class="line"><a name="l00305"></a><span class="lineno">  305</span> </div>
-<div class="line"><a name="l00306"></a><span class="lineno">  306</span>   imgreg.setDown(down_opt[0]);</div>
-<div class="line"><a name="l00307"></a><span class="lineno">  307</span>   imgreg.setThreshold(threshold_opt[0]);</div>
-<div class="line"><a name="l00308"></a><span class="lineno">  308</span> </div>
-<div class="line"><a name="l00309"></a><span class="lineno">  309</span>   <span class="keywordtype">double</span> c0modGlobal=0;<span class="comment">//time regression coefficient c0 (offset) calculated on entire image </span></div>
-<div class="line"><a name="l00310"></a><span class="lineno">  310</span>   <span class="keywordtype">double</span> c1modGlobal=1;<span class="comment">//time regression coefficient c1 (scale) calculated on entire image </span></div>
-<div class="line"><a name="l00311"></a><span class="lineno">  311</span>   <span class="keywordtype">double</span> c0mod=0;<span class="comment">//time regression coefficient c0 (offset) calculated on local window</span></div>
-<div class="line"><a name="l00312"></a><span class="lineno">  312</span>   <span class="keywordtype">double</span> c1mod=1;<span class="comment">//time regression coefficient c1 (scale) calculated on local window</span></div>
-<div class="line"><a name="l00313"></a><span class="lineno">  313</span> </div>
-<div class="line"><a name="l00314"></a><span class="lineno">  314</span>   <span class="keywordtype">double</span> c0obs=0;<span class="comment">//offset</span></div>
-<div class="line"><a name="l00315"></a><span class="lineno">  315</span>   <span class="keywordtype">double</span> c1obs=1;<span class="comment">//scale</span></div>
-<div class="line"><a name="l00316"></a><span class="lineno">  316</span>   <span class="keywordtype">double</span> errObs=uncertNodata_opt[0];<span class="comment">//start with high initial value in case we do not have first observation at time 0</span></div>
+<div class="line"><a name="l00299"></a><span class="lineno">  299</span>   <span class="comment">// if(mask_opt.size()){</span></div>
+<div class="line"><a name="l00300"></a><span class="lineno">  300</span>   <span class="comment">//   try{</span></div>
+<div class="line"><a name="l00301"></a><span class="lineno">  301</span>   <span class="comment">//     if(verbose_opt[0]>=1)</span></div>
+<div class="line"><a name="l00302"></a><span class="lineno">  302</span>   <span class="comment">//    std::cout << "opening mask image file " << mask_opt[0] << std::endl;</span></div>
+<div class="line"><a name="l00303"></a><span class="lineno">  303</span>   <span class="comment">//     maskReader.open(mask_opt[0]);</span></div>
+<div class="line"><a name="l00304"></a><span class="lineno">  304</span>   <span class="comment">//     maskReader.setNoData(msknodata_opt);</span></div>
+<div class="line"><a name="l00305"></a><span class="lineno">  305</span>   <span class="comment">//   }</span></div>
+<div class="line"><a name="l00306"></a><span class="lineno">  306</span>   <span class="comment">//   catch(string error){</span></div>
+<div class="line"><a name="l00307"></a><span class="lineno">  307</span>   <span class="comment">//     cerr << error << std::endl;</span></div>
+<div class="line"><a name="l00308"></a><span class="lineno">  308</span>   <span class="comment">//     exit(2);</span></div>
+<div class="line"><a name="l00309"></a><span class="lineno">  309</span>   <span class="comment">//   }</span></div>
+<div class="line"><a name="l00310"></a><span class="lineno">  310</span>   <span class="comment">//   catch(...){</span></div>
+<div class="line"><a name="l00311"></a><span class="lineno">  311</span>   <span class="comment">//     cerr << "error catched" << std::endl;</span></div>
+<div class="line"><a name="l00312"></a><span class="lineno">  312</span>   <span class="comment">//     exit(1);</span></div>
+<div class="line"><a name="l00313"></a><span class="lineno">  313</span>   <span class="comment">//   }</span></div>
+<div class="line"><a name="l00314"></a><span class="lineno">  314</span>   <span class="comment">// }</span></div>
+<div class="line"><a name="l00315"></a><span class="lineno">  315</span> </div>
+<div class="line"><a name="l00316"></a><span class="lineno">  316</span>   <span class="keywordtype">int</span> obsindex=0;</div>
 <div class="line"><a name="l00317"></a><span class="lineno">  317</span> </div>
-<div class="line"><a name="l00318"></a><span class="lineno">  318</span>   vector<int> relobsindex;</div>
-<div class="line"><a name="l00319"></a><span class="lineno">  319</span>   <span class="comment">// cout << tmodel_opt << endl;</span></div>
-<div class="line"><a name="l00320"></a><span class="lineno">  320</span>   <span class="comment">// cout << tobservation_opt << endl;</span></div>
-<div class="line"><a name="l00321"></a><span class="lineno">  321</span> </div>
-<div class="line"><a name="l00322"></a><span class="lineno">  322</span>   <span class="keywordflow">for</span>(<span class="keywordtype">int</span> tindex=0;tindex<tobservation_opt.size();++tindex){</div>
-<div class="line"><a name="l00323"></a><span class="lineno">  323</span>     vector<int>::iterator modit;</div>
-<div class="line"><a name="l00324"></a><span class="lineno">  324</span>     modit=upper_bound(tmodel_opt.begin(),tmodel_opt.end(),tobservation_opt[tindex]);</div>
-<div class="line"><a name="l00325"></a><span class="lineno">  325</span>     <span class="keywordtype">int</span> relpos=modit-tmodel_opt.begin()-1;</div>
-<div class="line"><a name="l00326"></a><span class="lineno">  326</span>     assert(relpos>=0);<span class="comment">//todo: for now, we assume model is available at time before first measurement</span></div>
-<div class="line"><a name="l00327"></a><span class="lineno">  327</span>     relobsindex.push_back(relpos);</div>
-<div class="line"><a name="l00328"></a><span class="lineno">  328</span>     <span class="keywordflow">if</span>(verbose_opt[0])</div>
-<div class="line"><a name="l00329"></a><span class="lineno">  329</span>       cout << <span class="stringliteral">"observation "</span> << tindex << <span class="stringliteral">": "</span> << <span class="stringliteral">"relative position in model time series is "</span> << relpos << <span class="stringliteral">", date of observation is (tobservation_opt[tindex]): "</span> << tobservation_opt[tindex]  [...]
-<div class="line"><a name="l00330"></a><span class="lineno">  330</span>     <span class="comment">// if(verbose_opt[0])</span></div>
-<div class="line"><a name="l00331"></a><span class="lineno">  331</span>     <span class="comment">//   cout << "tobservation_opt[tindex] " << tobservation_opt[tindex] << " " << relobsindex.back() << endl;</span></div>
-<div class="line"><a name="l00332"></a><span class="lineno">  332</span>   }</div>
-<div class="line"><a name="l00333"></a><span class="lineno">  333</span> </div>
-<div class="line"><a name="l00334"></a><span class="lineno">  334</span>   <span class="keywordtype">int</span> ndigit=log(1.0*tmodel_opt.back())/log(10.0)+1;</div>
-<div class="line"><a name="l00335"></a><span class="lineno">  335</span> </div>
-<div class="line"><a name="l00336"></a><span class="lineno">  336</span>   <span class="keywordtype">double</span> geox=0;</div>
-<div class="line"><a name="l00337"></a><span class="lineno">  337</span>   <span class="keywordtype">double</span> geoy=0;</div>
+<div class="line"><a name="l00318"></a><span class="lineno">  318</span>   <span class="keyword">const</span> <span class="keywordtype">char</span>* pszMessage;</div>
+<div class="line"><a name="l00319"></a><span class="lineno">  319</span>   <span class="keywordtype">void</span>* pProgressArg=NULL;</div>
+<div class="line"><a name="l00320"></a><span class="lineno">  320</span>   GDALProgressFunc pfnProgress=GDALTermProgress;</div>
+<div class="line"><a name="l00321"></a><span class="lineno">  321</span>   <span class="keywordtype">double</span> progress=0;</div>
+<div class="line"><a name="l00322"></a><span class="lineno">  322</span> </div>
+<div class="line"><a name="l00323"></a><span class="lineno">  323</span>   imgreg.setDown(down_opt[0]);</div>
+<div class="line"><a name="l00324"></a><span class="lineno">  324</span>   imgreg.setThreshold(threshold_opt[0]);</div>
+<div class="line"><a name="l00325"></a><span class="lineno">  325</span> </div>
+<div class="line"><a name="l00326"></a><span class="lineno">  326</span>   <span class="keywordtype">double</span> c0modGlobal=0;<span class="comment">//time regression coefficient c0 (offset) calculated on entire image </span></div>
+<div class="line"><a name="l00327"></a><span class="lineno">  327</span>   <span class="keywordtype">double</span> c1modGlobal=1;<span class="comment">//time regression coefficient c1 (scale) calculated on entire image </span></div>
+<div class="line"><a name="l00328"></a><span class="lineno">  328</span>   <span class="keywordtype">double</span> c0modGlobal_prev=0;<span class="comment">//previous time regression coefficient c0 (offset) calculated on entire image to fall back</span></div>
+<div class="line"><a name="l00329"></a><span class="lineno">  329</span>   <span class="keywordtype">double</span> c1modGlobal_prev=1;<span class="comment">//previous time regression coefficient c1 (scale) calculated on entire image to fall back</span></div>
+<div class="line"><a name="l00330"></a><span class="lineno">  330</span>   <span class="keywordtype">double</span> c0mod=0;<span class="comment">//time regression coefficient c0 (offset) calculated on local window</span></div>
+<div class="line"><a name="l00331"></a><span class="lineno">  331</span>   <span class="keywordtype">double</span> c1mod=1;<span class="comment">//time regression coefficient c1 (scale) calculated on local window</span></div>
+<div class="line"><a name="l00332"></a><span class="lineno">  332</span> </div>
+<div class="line"><a name="l00333"></a><span class="lineno">  333</span>   <span class="keywordtype">double</span> c0obs=0;<span class="comment">//offset</span></div>
+<div class="line"><a name="l00334"></a><span class="lineno">  334</span>   <span class="keywordtype">double</span> c1obs=1;<span class="comment">//scale</span></div>
+<div class="line"><a name="l00335"></a><span class="lineno">  335</span>   <span class="keywordtype">double</span> c0obs_prev=0;<span class="comment">//previous offset to fall back</span></div>
+<div class="line"><a name="l00336"></a><span class="lineno">  336</span>   <span class="keywordtype">double</span> c1obs_prev=1;<span class="comment">//previous scale to fall back</span></div>
+<div class="line"><a name="l00337"></a><span class="lineno">  337</span>   <span class="keywordtype">double</span> errObs=uncertNodata_opt[0];<span class="comment">//start with high initial value in case we do not have first observation at time 0</span></div>
 <div class="line"><a name="l00338"></a><span class="lineno">  338</span> </div>
-<div class="line"><a name="l00339"></a><span class="lineno">  339</span>   <span class="keywordflow">if</span>(find(direction_opt.begin(),direction_opt.end(),<span class="stringliteral">"forward"</span>)!=direction_opt.end()){</div>
-<div class="line"><a name="l00341"></a><span class="lineno">  341</span>     cout << <span class="stringliteral">"Running forward model"</span> << endl;</div>
-<div class="line"><a name="l00342"></a><span class="lineno">  342</span>     obsindex=0;</div>
-<div class="line"><a name="l00343"></a><span class="lineno">  343</span>     <span class="comment">//initialization</span></div>
-<div class="line"><a name="l00344"></a><span class="lineno">  344</span>     <span class="keywordtype">string</span> output;</div>
-<div class="line"><a name="l00345"></a><span class="lineno">  345</span>     <span class="keywordflow">if</span>(outputfw_opt.size()==model_opt.size()){</div>
-<div class="line"><a name="l00346"></a><span class="lineno">  346</span>       output=outputfw_opt[0];</div>
-<div class="line"><a name="l00347"></a><span class="lineno">  347</span>     }</div>
-<div class="line"><a name="l00348"></a><span class="lineno">  348</span>     <span class="keywordflow">else</span>{</div>
-<div class="line"><a name="l00349"></a><span class="lineno">  349</span>       ostringstream outputstream;</div>
-<div class="line"><a name="l00350"></a><span class="lineno">  350</span>       outputstream << outputfw_opt[0] << <span class="stringliteral">"_"</span>;</div>
-<div class="line"><a name="l00351"></a><span class="lineno">  351</span>       outputstream << setfill(<span class="charliteral">'0'</span>) << setw(ndigit) << tmodel_opt[0];</div>
-<div class="line"><a name="l00352"></a><span class="lineno">  352</span>       outputstream << <span class="stringliteral">".tif"</span>;</div>
-<div class="line"><a name="l00353"></a><span class="lineno">  353</span>       <span class="comment">//test</span></div>
-<div class="line"><a name="l00354"></a><span class="lineno">  354</span>       <span class="comment">// outputstream << outputfw_opt[0] << "_" << tmodel_opt[0] << ".tif";</span></div>
-<div class="line"><a name="l00355"></a><span class="lineno">  355</span>       output=outputstream.str();</div>
-<div class="line"><a name="l00356"></a><span class="lineno">  356</span>     }</div>
-<div class="line"><a name="l00357"></a><span class="lineno">  357</span>     <span class="keywordflow">if</span>(verbose_opt[0])</div>
-<div class="line"><a name="l00358"></a><span class="lineno">  358</span>       cout << <span class="stringliteral">"Opening image "</span> << output << <span class="stringliteral">" for writing "</span> << endl;</div>
+<div class="line"><a name="l00339"></a><span class="lineno">  339</span>   vector<int> relobsindex;</div>
+<div class="line"><a name="l00340"></a><span class="lineno">  340</span>   <span class="comment">// cout << tmodel_opt << endl;</span></div>
+<div class="line"><a name="l00341"></a><span class="lineno">  341</span>   <span class="comment">// cout << tobservation_opt << endl;</span></div>
+<div class="line"><a name="l00342"></a><span class="lineno">  342</span> </div>
+<div class="line"><a name="l00343"></a><span class="lineno">  343</span>   <span class="keywordflow">for</span>(<span class="keywordtype">int</span> tindex=0;tindex<tobservation_opt.size();++tindex){</div>
+<div class="line"><a name="l00344"></a><span class="lineno">  344</span>     vector<int>::iterator modit;</div>
+<div class="line"><a name="l00345"></a><span class="lineno">  345</span>     modit=upper_bound(tmodel_opt.begin(),tmodel_opt.end(),tobservation_opt[tindex]);</div>
+<div class="line"><a name="l00346"></a><span class="lineno">  346</span>     <span class="keywordtype">int</span> relpos=modit-tmodel_opt.begin()-1;</div>
+<div class="line"><a name="l00347"></a><span class="lineno">  347</span>     assert(relpos>=0);<span class="comment">//todo: for now, we assume model is available at time before first measurement</span></div>
+<div class="line"><a name="l00348"></a><span class="lineno">  348</span>     relobsindex.push_back(relpos);</div>
+<div class="line"><a name="l00349"></a><span class="lineno">  349</span>     <span class="keywordflow">if</span>(verbose_opt[0])</div>
+<div class="line"><a name="l00350"></a><span class="lineno">  350</span>       cout << <span class="stringliteral">"observation "</span> << tindex << <span class="stringliteral">": "</span> << <span class="stringliteral">"relative position in model time series is "</span> << relpos << <span class="stringliteral">", date of observation is (tobservation_opt[tindex]): "</span> << tobservation_opt[tindex]  [...]
+<div class="line"><a name="l00351"></a><span class="lineno">  351</span>     <span class="comment">// if(verbose_opt[0])</span></div>
+<div class="line"><a name="l00352"></a><span class="lineno">  352</span>     <span class="comment">//   cout << "tobservation_opt[tindex] " << tobservation_opt[tindex] << " " << relobsindex.back() << endl;</span></div>
+<div class="line"><a name="l00353"></a><span class="lineno">  353</span>   }</div>
+<div class="line"><a name="l00354"></a><span class="lineno">  354</span> </div>
+<div class="line"><a name="l00355"></a><span class="lineno">  355</span>   <span class="keywordtype">int</span> ndigit=log(1.0*tmodel_opt.back())/log(10.0)+1;</div>
+<div class="line"><a name="l00356"></a><span class="lineno">  356</span> </div>
+<div class="line"><a name="l00357"></a><span class="lineno">  357</span>   <span class="keywordtype">double</span> geox=0;</div>
+<div class="line"><a name="l00358"></a><span class="lineno">  358</span>   <span class="keywordtype">double</span> geoy=0;</div>
 <div class="line"><a name="l00359"></a><span class="lineno">  359</span> </div>
-<div class="line"><a name="l00360"></a><span class="lineno">  360</span>     imgWriterEst.open(output,ncol,nrow,2,GDT_Float32,imageType,option_opt);</div>
-<div class="line"><a name="l00361"></a><span class="lineno">  361</span>     imgWriterEst.setProjectionProj4(projection_opt[0]);</div>
-<div class="line"><a name="l00362"></a><span class="lineno">  362</span>     imgWriterEst.setGeoTransform(geotransform);</div>
-<div class="line"><a name="l00363"></a><span class="lineno">  363</span>     imgWriterEst.GDALSetNoDataValue(obsnodata_opt[0]);</div>
-<div class="line"><a name="l00364"></a><span class="lineno">  364</span> </div>
-<div class="line"><a name="l00365"></a><span class="lineno">  365</span>     <span class="keywordflow">if</span>(verbose_opt[0]){</div>
-<div class="line"><a name="l00366"></a><span class="lineno">  366</span>       cout << <span class="stringliteral">"processing time "</span> << tmodel_opt[0] << endl;</div>
-<div class="line"><a name="l00367"></a><span class="lineno">  367</span>       <span class="keywordflow">if</span>(obsindex<relobsindex.size())</div>
-<div class="line"><a name="l00368"></a><span class="lineno">  368</span>     cout << <span class="stringliteral">"next observation "</span> << tmodel_opt[relobsindex[obsindex]] << endl;</div>
-<div class="line"><a name="l00369"></a><span class="lineno">  369</span>       <span class="keywordflow">else</span></div>
-<div class="line"><a name="l00370"></a><span class="lineno">  370</span>     cout << <span class="stringliteral">"There is no next observation"</span> << endl;</div>
-<div class="line"><a name="l00371"></a><span class="lineno">  371</span>     }</div>
-<div class="line"><a name="l00372"></a><span class="lineno">  372</span> </div>
-<div class="line"><a name="l00373"></a><span class="lineno">  373</span>     <span class="keywordflow">try</span>{</div>
-<div class="line"><a name="l00374"></a><span class="lineno">  374</span>       imgReaderModel1.open(model_opt[0]);</div>
-<div class="line"><a name="l00375"></a><span class="lineno">  375</span>       imgReaderModel1.setNoData(modnodata_opt);</div>
-<div class="line"><a name="l00376"></a><span class="lineno">  376</span>       <span class="keywordflow">if</span>(modoffset_opt.size())</div>
-<div class="line"><a name="l00377"></a><span class="lineno">  377</span>     imgReaderModel1.setOffset(modoffset_opt[0]);</div>
-<div class="line"><a name="l00378"></a><span class="lineno">  378</span>       <span class="keywordflow">if</span>(modscale_opt.size())</div>
-<div class="line"><a name="l00379"></a><span class="lineno">  379</span>     imgReaderModel1.setScale(modscale_opt[0]);</div>
-<div class="line"><a name="l00380"></a><span class="lineno">  380</span>     }</div>
-<div class="line"><a name="l00381"></a><span class="lineno">  381</span>     <span class="keywordflow">catch</span>(<span class="keywordtype">string</span> errorString){</div>
-<div class="line"><a name="l00382"></a><span class="lineno">  382</span>       cerr << errorString << endl;</div>
-<div class="line"><a name="l00383"></a><span class="lineno">  383</span>     }</div>
-<div class="line"><a name="l00384"></a><span class="lineno">  384</span>     <span class="keywordflow">catch</span>(...){</div>
-<div class="line"><a name="l00385"></a><span class="lineno">  385</span>       cerr << <span class="stringliteral">"Error opening file "</span> << model_opt[0] << endl;</div>
-<div class="line"><a name="l00386"></a><span class="lineno">  386</span>     }</div>
-<div class="line"><a name="l00387"></a><span class="lineno">  387</span>       </div>
-<div class="line"><a name="l00388"></a><span class="lineno">  388</span>     <span class="comment">//calculate standard deviation of image to serve as model uncertainty</span></div>
-<div class="line"><a name="l00389"></a><span class="lineno">  389</span>     GDALRasterBand* rasterBand;</div>
-<div class="line"><a name="l00390"></a><span class="lineno">  390</span>     rasterBand=imgReaderModel1.getRasterBand(0);</div>
-<div class="line"><a name="l00391"></a><span class="lineno">  391</span>     <span class="keywordtype">double</span> minValue, maxValue, meanValue, stdDev;</div>
-<div class="line"><a name="l00392"></a><span class="lineno">  392</span>     <span class="keywordtype">void</span>* pProgressData;</div>
-<div class="line"><a name="l00393"></a><span class="lineno">  393</span>     rasterBand->ComputeStatistics(0,&minValue,&maxValue,&meanValue,&stdDev,pfnProgress,pProgressData);</div>
-<div class="line"><a name="l00394"></a><span class="lineno">  394</span>     <span class="keywordtype">double</span> modRow=0;</div>
-<div class="line"><a name="l00395"></a><span class="lineno">  395</span>     <span class="keywordtype">double</span> modCol=0;</div>
-<div class="line"><a name="l00396"></a><span class="lineno">  396</span>     <span class="keywordflow">if</span>(relobsindex[0]>0){<span class="comment">//initialize output_opt[0] as model[0]</span></div>
-<div class="line"><a name="l00397"></a><span class="lineno">  397</span>       <span class="comment">//write first model as output</span></div>
-<div class="line"><a name="l00398"></a><span class="lineno">  398</span>       <span class="keywordflow">if</span>(verbose_opt[0])</div>
-<div class="line"><a name="l00399"></a><span class="lineno">  399</span>     cout << <span class="stringliteral">"write first model as output"</span> << endl;</div>
-<div class="line"><a name="l00400"></a><span class="lineno">  400</span>       <span class="keywordflow">for</span>(<span class="keywordtype">int</span> irow=0;irow<nrow;++irow){</div>
-<div class="line"><a name="l00401"></a><span class="lineno">  401</span>     vector<double> estReadBuffer;</div>
-<div class="line"><a name="l00402"></a><span class="lineno">  402</span>     vector<double> estWriteBuffer(ncol);</div>
-<div class="line"><a name="l00403"></a><span class="lineno">  403</span>     vector<double> uncertWriteBuffer(ncol);</div>
-<div class="line"><a name="l00404"></a><span class="lineno">  404</span>     <span class="comment">// vector<double> lineMask;</span></div>
-<div class="line"><a name="l00405"></a><span class="lineno">  405</span>     imgWriterEst.image2geo(0,irow,geox,geoy);</div>
-<div class="line"><a name="l00406"></a><span class="lineno">  406</span>     imgReaderModel1.geo2image(geox,geoy,modCol,modRow);</div>
-<div class="line"><a name="l00407"></a><span class="lineno">  407</span>     <span class="keywordflow">if</span>(modRow<0||modRow>=imgReaderModel1.nrOfRow()){</div>
-<div class="line"><a name="l00408"></a><span class="lineno">  408</span>       cerr << <span class="stringliteral">"Error: geo coordinates ("</span> << geox << <span class="stringliteral">","</span> << geoy << <span class="stringliteral">") not covered in model image "</span> << imgReaderModel1.getFileName() << endl;</div>
-<div class="line"><a name="l00409"></a><span class="lineno">  409</span>       assert(modRow>=0&&modRow<imgReaderModel1.nrOfRow());</div>
-<div class="line"><a name="l00410"></a><span class="lineno">  410</span>     }</div>
-<div class="line"><a name="l00411"></a><span class="lineno">  411</span>     <span class="keywordflow">try</span>{</div>
-<div class="line"><a name="l00412"></a><span class="lineno">  412</span>       imgReaderModel1.readData(estReadBuffer,GDT_Float64,modRow);</div>
-<div class="line"><a name="l00413"></a><span class="lineno">  413</span>       <span class="comment">//simple nearest neighbor</span></div>
-<div class="line"><a name="l00414"></a><span class="lineno">  414</span>       <span class="comment">//stat.nearUp(estReadBuffer,estWriteBuffer);</span></div>
-<div class="line"><a name="l00415"></a><span class="lineno">  415</span> </div>
-<div class="line"><a name="l00416"></a><span class="lineno">  416</span>       <span class="comment">// double oldRowMask=-1;//keep track of row mask to optimize number of line readings</span></div>
-<div class="line"><a name="l00417"></a><span class="lineno">  417</span>       <span class="keywordflow">for</span>(<span class="keywordtype">int</span> icol=0;icol<ncol;++icol){</div>
-<div class="line"><a name="l00418"></a><span class="lineno">  418</span>         imgWriterEst.image2geo(icol,irow,geox,geoy);</div>
-<div class="line"><a name="l00419"></a><span class="lineno">  419</span>         imgReaderModel1.geo2image(geox,geoy,modCol,modRow);</div>
-<div class="line"><a name="l00420"></a><span class="lineno">  420</span>         <span class="keywordtype">double</span> modValue=estReadBuffer[modCol];</div>
-<div class="line"><a name="l00421"></a><span class="lineno">  421</span>         <span class="keywordflow">if</span>(imgReaderModel1.isNoData(modValue)){</div>
-<div class="line"><a name="l00422"></a><span class="lineno">  422</span>           estWriteBuffer[icol]=obsnodata_opt[0];</div>
-<div class="line"><a name="l00423"></a><span class="lineno">  423</span>           uncertWriteBuffer[icol]=uncertNodata_opt[0];</div>
-<div class="line"><a name="l00424"></a><span class="lineno">  424</span>         }</div>
-<div class="line"><a name="l00425"></a><span class="lineno">  425</span>         <span class="keywordflow">else</span>{</div>
-<div class="line"><a name="l00426"></a><span class="lineno">  426</span>           <span class="comment">//todo: should take into account regression model-obs...</span></div>
-<div class="line"><a name="l00427"></a><span class="lineno">  427</span>           estWriteBuffer[icol]=modValue;</div>
-<div class="line"><a name="l00428"></a><span class="lineno">  428</span>           uncertWriteBuffer[icol]=uncertModel_opt[0]*stdDev;</div>
-<div class="line"><a name="l00429"></a><span class="lineno">  429</span>         }</div>
-<div class="line"><a name="l00430"></a><span class="lineno">  430</span>       }</div>
-<div class="line"><a name="l00431"></a><span class="lineno">  431</span>       imgWriterEst.writeData(estWriteBuffer,GDT_Float64,irow,0);</div>
-<div class="line"><a name="l00432"></a><span class="lineno">  432</span>       imgWriterEst.writeData(uncertWriteBuffer,GDT_Float64,irow,1);</div>
-<div class="line"><a name="l00433"></a><span class="lineno">  433</span>     }</div>
-<div class="line"><a name="l00434"></a><span class="lineno">  434</span>     <span class="keywordflow">catch</span>(<span class="keywordtype">string</span> errorString){</div>
-<div class="line"><a name="l00435"></a><span class="lineno">  435</span>       cerr << errorString << endl;</div>
-<div class="line"><a name="l00436"></a><span class="lineno">  436</span>     }</div>
-<div class="line"><a name="l00437"></a><span class="lineno">  437</span>     <span class="keywordflow">catch</span>(...){</div>
-<div class="line"><a name="l00438"></a><span class="lineno">  438</span>       cerr << <span class="stringliteral">"Error writing file "</span> << imgWriterEst.getFileName() << endl;</div>
-<div class="line"><a name="l00439"></a><span class="lineno">  439</span>     }</div>
-<div class="line"><a name="l00440"></a><span class="lineno">  440</span>       }</div>
-<div class="line"><a name="l00441"></a><span class="lineno">  441</span>     }</div>
-<div class="line"><a name="l00442"></a><span class="lineno">  442</span>     <span class="keywordflow">else</span>{<span class="comment">//we have a measurement</span></div>
-<div class="line"><a name="l00443"></a><span class="lineno">  443</span>       <span class="keywordflow">if</span>(verbose_opt[0])</div>
-<div class="line"><a name="l00444"></a><span class="lineno">  444</span>     cout << <span class="stringliteral">"we have a measurement at initial time"</span> << endl;</div>
-<div class="line"><a name="l00445"></a><span class="lineno">  445</span>       imgReaderObs.open(observation_opt[0]);</div>
-<div class="line"><a name="l00446"></a><span class="lineno">  446</span>       imgReaderObs.getGeoTransform(geotransform);</div>
-<div class="line"><a name="l00447"></a><span class="lineno">  447</span>       imgReaderObs.setNoData(obsnodata_opt);</div>
-<div class="line"><a name="l00448"></a><span class="lineno">  448</span>       <span class="keywordflow">if</span>(obsoffset_opt.size())</div>
-<div class="line"><a name="l00449"></a><span class="lineno">  449</span>     imgReaderObs.setOffset(obsoffset_opt[0]);</div>
-<div class="line"><a name="l00450"></a><span class="lineno">  450</span>       <span class="keywordflow">if</span>(obsscale_opt.size())</div>
-<div class="line"><a name="l00451"></a><span class="lineno">  451</span>     imgReaderObs.setScale(obsscale_opt[0]);</div>
-<div class="line"><a name="l00452"></a><span class="lineno">  452</span> </div>
-<div class="line"><a name="l00453"></a><span class="lineno">  453</span>       <span class="keywordflow">if</span>(regSensor_opt[0]>0)</div>
-<div class="line"><a name="l00454"></a><span class="lineno">  454</span>     errObs=regSensor_opt[0]*imgreg.getRMSE(imgReaderModel1,imgReaderObs,c0obs,c1obs,0,0,verbose_opt[0]);</div>
-<div class="line"><a name="l00455"></a><span class="lineno">  455</span>       <span class="keywordflow">else</span>{</div>
-<div class="line"><a name="l00456"></a><span class="lineno">  456</span>     c0obs=0;</div>
-<div class="line"><a name="l00457"></a><span class="lineno">  457</span>     c1obs=1;</div>
-<div class="line"><a name="l00458"></a><span class="lineno">  458</span>     errObs=0;</div>
-<div class="line"><a name="l00459"></a><span class="lineno">  459</span>       }</div>
-<div class="line"><a name="l00460"></a><span class="lineno">  460</span>       <span class="keywordflow">if</span>(verbose_opt[0])</div>
-<div class="line"><a name="l00461"></a><span class="lineno">  461</span>     cout << <span class="stringliteral">"c0obs, c1obs: "</span> << c0obs << <span class="stringliteral">", "</span> << c1obs << endl;</div>
-<div class="line"><a name="l00462"></a><span class="lineno">  462</span> </div>
-<div class="line"><a name="l00463"></a><span class="lineno">  463</span>       <span class="keywordflow">for</span>(<span class="keywordtype">int</span> irow=0;irow<nrow;++irow){</div>
-<div class="line"><a name="l00464"></a><span class="lineno">  464</span>     vector<double> estReadBuffer;</div>
-<div class="line"><a name="l00465"></a><span class="lineno">  465</span>     imgWriterEst.image2geo(0,irow,geox,geoy);</div>
-<div class="line"><a name="l00466"></a><span class="lineno">  466</span>     imgReaderModel1.geo2image(geox,geoy,modCol,modRow);</div>
-<div class="line"><a name="l00467"></a><span class="lineno">  467</span>     assert(modRow>=0&&modRow<imgReaderModel1.nrOfRow());</div>
-<div class="line"><a name="l00468"></a><span class="lineno">  468</span>     imgReaderModel1.readData(estReadBuffer,GDT_Float64,modRow);</div>
-<div class="line"><a name="l00469"></a><span class="lineno">  469</span>     vector<double> obsLineBuffer;</div>
-<div class="line"><a name="l00470"></a><span class="lineno">  470</span>     vector<double> estWriteBuffer(ncol);</div>
-<div class="line"><a name="l00471"></a><span class="lineno">  471</span>     vector<double> uncertWriteBuffer(ncol);</div>
-<div class="line"><a name="l00472"></a><span class="lineno">  472</span>     vector<double> uncertObsLineBuffer;</div>
-<div class="line"><a name="l00473"></a><span class="lineno">  473</span>     <span class="comment">// vector<double> lineMask;</span></div>
-<div class="line"><a name="l00474"></a><span class="lineno">  474</span>     <span class="comment">// imgReaderObs.readData(estWriteBuffer,GDT_Float64,irow,0);</span></div>
-<div class="line"><a name="l00475"></a><span class="lineno">  475</span>     imgReaderObs.readData(obsLineBuffer,GDT_Float64,irow,0);</div>
-<div class="line"><a name="l00476"></a><span class="lineno">  476</span>     </div>
-<div class="line"><a name="l00477"></a><span class="lineno">  477</span>     <span class="keywordflow">if</span>(imgReaderObs.nrOfBand()>1)</div>
-<div class="line"><a name="l00478"></a><span class="lineno">  478</span>       imgReaderObs.readData(uncertObsLineBuffer,GDT_Float64,irow,1);</div>
-<div class="line"><a name="l00479"></a><span class="lineno">  479</span>     <span class="comment">// double oldRowMask=-1;//keep track of row mask to optimize number of line readings</span></div>
-<div class="line"><a name="l00480"></a><span class="lineno">  480</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> icol=0;icol<ncol;++icol){</div>
-<div class="line"><a name="l00481"></a><span class="lineno">  481</span>       imgWriterEst.image2geo(icol,irow,geox,geoy);</div>
-<div class="line"><a name="l00482"></a><span class="lineno">  482</span>       imgReaderModel1.geo2image(geox,geoy,modCol,modRow);</div>
-<div class="line"><a name="l00483"></a><span class="lineno">  483</span>       assert(modRow>=0&&modRow<imgReaderModel1.nrOfRow());</div>
-<div class="line"><a name="l00484"></a><span class="lineno">  484</span>       <span class="keywordtype">double</span> modValue=estReadBuffer[modCol];</div>
-<div class="line"><a name="l00485"></a><span class="lineno">  485</span>       <span class="keywordflow">if</span>(imgReaderModel1.isNoData(modValue)){<span class="comment">//model is nodata: retain observation </span></div>
-<div class="line"><a name="l00486"></a><span class="lineno">  486</span>         estWriteBuffer[icol]=obsLineBuffer[icol];</div>
-<div class="line"><a name="l00487"></a><span class="lineno">  487</span>         <span class="keywordflow">if</span>(imgReaderObs.isNoData(obsLineBuffer[icol])){</div>
-<div class="line"><a name="l00488"></a><span class="lineno">  488</span>           estWriteBuffer[icol]=obsnodata_opt[0];</div>
-<div class="line"><a name="l00489"></a><span class="lineno">  489</span>           uncertWriteBuffer[icol]=uncertNodata_opt[0];</div>
-<div class="line"><a name="l00490"></a><span class="lineno">  490</span>         }</div>
-<div class="line"><a name="l00491"></a><span class="lineno">  491</span>         <span class="keywordflow">else</span> <span class="keywordflow">if</span>(uncertObsLineBuffer.size()>icol)</div>
-<div class="line"><a name="l00492"></a><span class="lineno">  492</span>           uncertWriteBuffer[icol]=uncertObsLineBuffer[icol];</div>
-<div class="line"><a name="l00493"></a><span class="lineno">  493</span>         <span class="keywordflow">else</span></div>
-<div class="line"><a name="l00494"></a><span class="lineno">  494</span>           uncertWriteBuffer[icol]=uncertObs_opt[0];</div>
-<div class="line"><a name="l00495"></a><span class="lineno">  495</span>       }</div>
-<div class="line"><a name="l00496"></a><span class="lineno">  496</span>       <span class="keywordflow">else</span>{<span class="comment">//model is valid: calculate estimate from model</span></div>
-<div class="line"><a name="l00497"></a><span class="lineno">  497</span>         <span class="keywordtype">double</span> errMod=uncertModel_opt[0]*stdDev;</div>
-<div class="line"><a name="l00498"></a><span class="lineno">  498</span>         errMod*=regTime_opt[0];</div>
-<div class="line"><a name="l00499"></a><span class="lineno">  499</span>         <span class="comment">// double certNorm=(errMod*errMod+errObs*errObs);</span></div>
-<div class="line"><a name="l00500"></a><span class="lineno">  500</span>         <span class="comment">// double certMod=errObs*errObs/certNorm;</span></div>
-<div class="line"><a name="l00501"></a><span class="lineno">  501</span>         <span class="comment">// double certObs=errMod*errMod/certNorm;</span></div>
-<div class="line"><a name="l00502"></a><span class="lineno">  502</span>         <span class="comment">// double regTime=0;</span></div>
-<div class="line"><a name="l00503"></a><span class="lineno">  503</span>         <span class="comment">// double regSensor=(c0obs+c1obs*modValue)*certMod;</span></div>
-<div class="line"><a name="l00504"></a><span class="lineno">  504</span>         <span class="comment">// estWriteBuffer[icol]=regTime+regSensor;</span></div>
-<div class="line"><a name="l00505"></a><span class="lineno">  505</span>         estWriteBuffer[icol]=modValue;</div>
-<div class="line"><a name="l00506"></a><span class="lineno">  506</span>         <span class="keywordtype">double</span> totalUncertainty=errMod;</div>
-<div class="line"><a name="l00507"></a><span class="lineno">  507</span>         <span class="comment">// if(errMod<eps_opt[0])</span></div>
-<div class="line"><a name="l00508"></a><span class="lineno">  508</span>         <span class="comment">//   totalUncertainty=errObs;</span></div>
-<div class="line"><a name="l00509"></a><span class="lineno">  509</span>         <span class="comment">// else if(errObs<eps_opt[0])</span></div>
-<div class="line"><a name="l00510"></a><span class="lineno">  510</span>         <span class="comment">//   totalUncertainty=errMod;</span></div>
-<div class="line"><a name="l00511"></a><span class="lineno">  511</span>         <span class="comment">// else{</span></div>
-<div class="line"><a name="l00512"></a><span class="lineno">  512</span>         <span class="comment">//   totalUncertainty=1.0/errMod/errMod+1/errObs/errObs;</span></div>
-<div class="line"><a name="l00513"></a><span class="lineno">  513</span>         <span class="comment">//   totalUncertainty=sqrt(1.0/totalUncertainty);</span></div>
-<div class="line"><a name="l00514"></a><span class="lineno">  514</span>         <span class="comment">// }</span></div>
-<div class="line"><a name="l00515"></a><span class="lineno">  515</span>         uncertWriteBuffer[icol]=totalUncertainty;<span class="comment">//in case observation is not valid</span></div>
-<div class="line"><a name="l00516"></a><span class="lineno">  516</span>       }</div>
-<div class="line"><a name="l00517"></a><span class="lineno">  517</span>       <span class="comment">// uncertWriteBuffer[icol]+=uncertReadBuffer[icol];</span></div>
-<div class="line"><a name="l00518"></a><span class="lineno">  518</span>       <span class="comment">//measurement update</span></div>
-<div class="line"><a name="l00519"></a><span class="lineno">  519</span>       <span class="keywordflow">if</span>(!imgReaderObs.isNoData(obsLineBuffer[icol])){</div>
-<div class="line"><a name="l00520"></a><span class="lineno">  520</span>         <span class="keywordtype">double</span> kalmanGain=1;</div>
-<div class="line"><a name="l00521"></a><span class="lineno">  521</span>         <span class="keywordtype">double</span> uncertObs=uncertObs_opt[0];</div>
-<div class="line"><a name="l00522"></a><span class="lineno">  522</span>         <span class="keywordflow">if</span>(uncertObsLineBuffer.size()>icol)</div>
-<div class="line"><a name="l00523"></a><span class="lineno">  523</span>           uncertObs=uncertObsLineBuffer[icol];</div>
-<div class="line"><a name="l00524"></a><span class="lineno">  524</span>         <span class="keywordflow">else</span> <span class="keywordflow">if</span>(weight_opt.size()||deltaObs_opt.size()){</div>
-<div class="line"><a name="l00525"></a><span class="lineno">  525</span>           vector<double> obsWindowBuffer;<span class="comment">//buffer for observation to calculate average corresponding to model pixel</span></div>
-<div class="line"><a name="l00526"></a><span class="lineno">  526</span>           <span class="keywordtype">int</span> minCol=(icol>down_opt[0]/2) ? icol-down_opt[0]/2 : 0;</div>
-<div class="line"><a name="l00527"></a><span class="lineno">  527</span>           <span class="keywordtype">int</span> maxCol=(icol+down_opt[0]/2<imgReaderObs.nrOfCol()) ? icol+down_opt[0]/2 : imgReaderObs.nrOfCol()-1;</div>
-<div class="line"><a name="l00528"></a><span class="lineno">  528</span>           <span class="keywordtype">int</span> minRow=(irow>down_opt[0]/2) ? irow-down_opt[0]/2 : 0;</div>
-<div class="line"><a name="l00529"></a><span class="lineno">  529</span>           <span class="keywordtype">int</span> maxRow=(irow+down_opt[0]/2<imgReaderObs.nrOfRow()) ? irow+down_opt[0]/2 : imgReaderObs.nrOfRow()-1;</div>
-<div class="line"><a name="l00530"></a><span class="lineno">  530</span>         </div>
-<div class="line"><a name="l00531"></a><span class="lineno">  531</span>           imgReaderObs.readDataBlock(obsWindowBuffer,GDT_Float64,minCol,maxCol,minRow,maxRow,0);</div>
-<div class="line"><a name="l00532"></a><span class="lineno">  532</span>           <a class="code" href="classstatfactory_1_1StatFactory.html">statfactory::StatFactory</a> statobs;</div>
-<div class="line"><a name="l00533"></a><span class="lineno">  533</span>           statobs.setNoDataValues(obsnodata_opt);</div>
-<div class="line"><a name="l00534"></a><span class="lineno">  534</span>           <span class="keywordtype">double</span> obsMeanValue=(statobs.mean(obsWindowBuffer)-c0obs)/c1obs;</div>
-<div class="line"><a name="l00535"></a><span class="lineno">  535</span>           <span class="keywordtype">double</span> difference=obsMeanValue-modValue;</div>
-<div class="line"><a name="l00536"></a><span class="lineno">  536</span>           <span class="keywordflow">if</span>(modValue){</div>
-<div class="line"><a name="l00537"></a><span class="lineno">  537</span>         <span class="keywordtype">double</span> relativeDifference=difference/modValue;</div>
-<div class="line"><a name="l00538"></a><span class="lineno">  538</span>         <span class="keywordflow">if</span>(deltaObs_opt.size()){</div>
-<div class="line"><a name="l00539"></a><span class="lineno">  539</span>           assert(deltaObs_opt.size()>1);</div>
-<div class="line"><a name="l00540"></a><span class="lineno">  540</span>           <span class="keywordflow">if</span>(100*relativeDifference<deltaObs_opt[0])<span class="comment">//lower bound</span></div>
-<div class="line"><a name="l00541"></a><span class="lineno">  541</span>             kalmanGain=0;</div>
-<div class="line"><a name="l00542"></a><span class="lineno">  542</span>           <span class="keywordflow">else</span> <span class="keywordflow">if</span>(100*relativeDifference>deltaObs_opt[1])<span class="comment">//upper bound</span></div>
-<div class="line"><a name="l00543"></a><span class="lineno">  543</span>             kalmanGain=0;</div>
-<div class="line"><a name="l00544"></a><span class="lineno">  544</span>         }</div>
-<div class="line"><a name="l00545"></a><span class="lineno">  545</span>         <span class="keywordflow">else</span> <span class="keywordflow">if</span>(weight_opt.size()){</div>
-<div class="line"><a name="l00546"></a><span class="lineno">  546</span>           assert(weight_opt.size()>1);</div>
-<div class="line"><a name="l00547"></a><span class="lineno">  547</span>           <span class="keywordflow">if</span>(obsMeanValue<modValue)</div>
-<div class="line"><a name="l00548"></a><span class="lineno">  548</span>             uncertObs=weight_opt[0]*relativeDifference;</div>
-<div class="line"><a name="l00549"></a><span class="lineno">  549</span>           <span class="keywordflow">else</span> <span class="keywordflow">if</span>(obsMeanValue>modValue)</div>
-<div class="line"><a name="l00550"></a><span class="lineno">  550</span>             uncertObs=weight_opt[1]*relativeDifference;</div>
-<div class="line"><a name="l00551"></a><span class="lineno">  551</span>         }</div>
-<div class="line"><a name="l00552"></a><span class="lineno">  552</span>           }</div>
-<div class="line"><a name="l00553"></a><span class="lineno">  553</span>           <span class="keywordflow">if</span>(uncertObs<=0)</div>
-<div class="line"><a name="l00554"></a><span class="lineno">  554</span>         uncertObs=0;</div>
-<div class="line"><a name="l00555"></a><span class="lineno">  555</span>           <span class="keywordflow">if</span>(verbose_opt[0]>1)</div>
-<div class="line"><a name="l00556"></a><span class="lineno">  556</span>         cout << <span class="stringliteral">"obsMeanValue:"</span> << obsMeanValue << <span class="stringliteral">", modValue: "</span> << modValue << endl;</div>
-<div class="line"><a name="l00557"></a><span class="lineno">  557</span>         }</div>
-<div class="line"><a name="l00558"></a><span class="lineno">  558</span>         <span class="keywordflow">if</span>(kalmanGain>0){</div>
-<div class="line"><a name="l00559"></a><span class="lineno">  559</span>           <span class="keywordflow">if</span>((uncertWriteBuffer[icol]+uncertObs)>eps_opt[0])</div>
-<div class="line"><a name="l00560"></a><span class="lineno">  560</span>         kalmanGain=uncertWriteBuffer[icol]/(uncertWriteBuffer[icol]+uncertObs);</div>
-<div class="line"><a name="l00561"></a><span class="lineno">  561</span>         }</div>
-<div class="line"><a name="l00562"></a><span class="lineno">  562</span>         assert(kalmanGain<=1);</div>
-<div class="line"><a name="l00563"></a><span class="lineno">  563</span>         estWriteBuffer[icol]+=kalmanGain*(obsLineBuffer[icol]-estWriteBuffer[icol]);</div>
-<div class="line"><a name="l00564"></a><span class="lineno">  564</span>         uncertWriteBuffer[icol]*=(1-kalmanGain);</div>
-<div class="line"><a name="l00565"></a><span class="lineno">  565</span>       }</div>
-<div class="line"><a name="l00566"></a><span class="lineno">  566</span>     }</div>
-<div class="line"><a name="l00567"></a><span class="lineno">  567</span>     imgWriterEst.writeData(estWriteBuffer,GDT_Float64,irow,0);</div>
-<div class="line"><a name="l00568"></a><span class="lineno">  568</span>     imgWriterEst.writeData(uncertWriteBuffer,GDT_Float64,irow,1);</div>
-<div class="line"><a name="l00569"></a><span class="lineno">  569</span>       }</div>
-<div class="line"><a name="l00570"></a><span class="lineno">  570</span>       imgReaderObs.close();</div>
-<div class="line"><a name="l00571"></a><span class="lineno">  571</span>       ++obsindex;</div>
-<div class="line"><a name="l00572"></a><span class="lineno">  572</span>     }</div>
-<div class="line"><a name="l00573"></a><span class="lineno">  573</span>     imgReaderModel1.close();</div>
-<div class="line"><a name="l00574"></a><span class="lineno">  574</span>     imgWriterEst.close();</div>
-<div class="line"><a name="l00575"></a><span class="lineno">  575</span> </div>
-<div class="line"><a name="l00576"></a><span class="lineno">  576</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> modindex=1;modindex<model_opt.size();++modindex){</div>
-<div class="line"><a name="l00577"></a><span class="lineno">  577</span>       <span class="keywordflow">if</span>(verbose_opt[0]){</div>
-<div class="line"><a name="l00578"></a><span class="lineno">  578</span>     cout << <span class="stringliteral">"processing time "</span> << tmodel_opt[modindex] << endl;</div>
-<div class="line"><a name="l00579"></a><span class="lineno">  579</span>     <span class="keywordflow">if</span>(obsindex<relobsindex.size())</div>
-<div class="line"><a name="l00580"></a><span class="lineno">  580</span>       cout << <span class="stringliteral">"next observation "</span> << tmodel_opt[relobsindex[obsindex]] << endl;</div>
-<div class="line"><a name="l00581"></a><span class="lineno">  581</span>     <span class="keywordflow">else</span></div>
-<div class="line"><a name="l00582"></a><span class="lineno">  582</span>       cout << <span class="stringliteral">"There is no next observation"</span> << endl;</div>
-<div class="line"><a name="l00583"></a><span class="lineno">  583</span>       }</div>
-<div class="line"><a name="l00584"></a><span class="lineno">  584</span>       <span class="keywordtype">string</span> output;</div>
-<div class="line"><a name="l00585"></a><span class="lineno">  585</span>       <span class="keywordflow">if</span>(outputfw_opt.size()==model_opt.size())</div>
-<div class="line"><a name="l00586"></a><span class="lineno">  586</span>     output=outputfw_opt[modindex];</div>
-<div class="line"><a name="l00587"></a><span class="lineno">  587</span>       <span class="keywordflow">else</span>{</div>
-<div class="line"><a name="l00588"></a><span class="lineno">  588</span>     ostringstream outputstream;</div>
-<div class="line"><a name="l00589"></a><span class="lineno">  589</span>     outputstream << outputfw_opt[0] << <span class="stringliteral">"_"</span>;</div>
-<div class="line"><a name="l00590"></a><span class="lineno">  590</span>     outputstream << setfill(<span class="charliteral">'0'</span>) << setw(ndigit) << tmodel_opt[modindex];</div>
-<div class="line"><a name="l00591"></a><span class="lineno">  591</span>     outputstream << <span class="stringliteral">".tif"</span>;</div>
-<div class="line"><a name="l00592"></a><span class="lineno">  592</span>     <span class="comment">// outputstream << outputfw_opt[0] << "_" << tmodel_opt[modindex] << ".tif";</span></div>
-<div class="line"><a name="l00593"></a><span class="lineno">  593</span>     output=outputstream.str();</div>
-<div class="line"><a name="l00594"></a><span class="lineno">  594</span>       }</div>
-<div class="line"><a name="l00595"></a><span class="lineno">  595</span>     </div>
-<div class="line"><a name="l00596"></a><span class="lineno">  596</span>       <span class="comment">//two band output band0=estimation, band1=uncertainty</span></div>
-<div class="line"><a name="l00597"></a><span class="lineno">  597</span>       imgWriterEst.open(output,ncol,nrow,2,GDT_Float32,imageType,option_opt);</div>
-<div class="line"><a name="l00598"></a><span class="lineno">  598</span>       imgWriterEst.setProjectionProj4(projection_opt[0]);</div>
-<div class="line"><a name="l00599"></a><span class="lineno">  599</span>       imgWriterEst.setGeoTransform(geotransform);</div>
-<div class="line"><a name="l00600"></a><span class="lineno">  600</span>       imgWriterEst.GDALSetNoDataValue(obsnodata_opt[0]);</div>
-<div class="line"><a name="l00601"></a><span class="lineno">  601</span> </div>
-<div class="line"><a name="l00602"></a><span class="lineno">  602</span>       <span class="comment">//calculate regression between two subsequence model inputs</span></div>
-<div class="line"><a name="l00603"></a><span class="lineno">  603</span>       imgReaderModel1.open(model_opt[modindex-1]);</div>
-<div class="line"><a name="l00604"></a><span class="lineno">  604</span>       imgReaderModel1.setNoData(modnodata_opt);</div>
-<div class="line"><a name="l00605"></a><span class="lineno">  605</span>       <span class="keywordflow">if</span>(modoffset_opt.size())</div>
-<div class="line"><a name="l00606"></a><span class="lineno">  606</span>     imgReaderModel1.setOffset(modoffset_opt[0]);</div>
-<div class="line"><a name="l00607"></a><span class="lineno">  607</span>       <span class="keywordflow">if</span>(modscale_opt.size())</div>
-<div class="line"><a name="l00608"></a><span class="lineno">  608</span>     imgReaderModel1.setScale(modscale_opt[0]);</div>
-<div class="line"><a name="l00609"></a><span class="lineno">  609</span>       imgReaderModel2.open(model_opt[modindex]);</div>
-<div class="line"><a name="l00610"></a><span class="lineno">  610</span>       imgReaderModel2.setNoData(modnodata_opt);</div>
-<div class="line"><a name="l00611"></a><span class="lineno">  611</span>       <span class="keywordflow">if</span>(modoffset_opt.size())</div>
-<div class="line"><a name="l00612"></a><span class="lineno">  612</span>     imgReaderModel2.setOffset(modoffset_opt[0]);</div>
-<div class="line"><a name="l00613"></a><span class="lineno">  613</span>       <span class="keywordflow">if</span>(modscale_opt.size())</div>
-<div class="line"><a name="l00614"></a><span class="lineno">  614</span>     imgReaderModel2.setScale(modscale_opt[0]);</div>
-<div class="line"><a name="l00615"></a><span class="lineno">  615</span>       <span class="comment">//calculate regression</span></div>
-<div class="line"><a name="l00616"></a><span class="lineno">  616</span>       <span class="comment">//we could re-use the points from second image from last run, but</span></div>
-<div class="line"><a name="l00617"></a><span class="lineno">  617</span>       <span class="comment">//to keep it general, we must redo it (overlap might have changed)</span></div>
-<div class="line"><a name="l00618"></a><span class="lineno">  618</span>     </div>
-<div class="line"><a name="l00619"></a><span class="lineno">  619</span>       pfnProgress(progress,pszMessage,pProgressArg);</div>
-<div class="line"><a name="l00620"></a><span class="lineno">  620</span> </div>
-<div class="line"><a name="l00621"></a><span class="lineno">  621</span>       <span class="keywordflow">if</span>(verbose_opt[0])</div>
-<div class="line"><a name="l00622"></a><span class="lineno">  622</span>     cout << <span class="stringliteral">"Calculating regression for "</span> << imgReaderModel1.getFileName() << <span class="stringliteral">" "</span> << imgReaderModel2.getFileName() << endl;</div>
-<div class="line"><a name="l00623"></a><span class="lineno">  623</span>       </div>
-<div class="line"><a name="l00624"></a><span class="lineno">  624</span>       <span class="keywordtype">double</span> errMod=imgreg.getRMSE(imgReaderModel1,imgReaderModel2,c0modGlobal,c1modGlobal,0,0);</div>
-<div class="line"><a name="l00625"></a><span class="lineno">  625</span>       errMod*=regTime_opt[0];</div>
-<div class="line"><a name="l00626"></a><span class="lineno">  626</span> </div>
-<div class="line"><a name="l00627"></a><span class="lineno">  627</span>       <span class="comment">// double errMod=imgreg.getRMSE(imgReaderModel1,imgReaderModel2,c0modGlobal,c1modGlobal,verbose_opt[0]);</span></div>
-<div class="line"><a name="l00628"></a><span class="lineno">  628</span>       <span class="keywordflow">if</span>(verbose_opt[0])</div>
-<div class="line"><a name="l00629"></a><span class="lineno">  629</span>     cout << <span class="stringliteral">"c0modGlobal, c1modGlobal: "</span> << c0modGlobal << <span class="stringliteral">", "</span> << c1modGlobal << endl;</div>
-<div class="line"><a name="l00630"></a><span class="lineno">  630</span> </div>
-<div class="line"><a name="l00631"></a><span class="lineno">  631</span>       <span class="keywordtype">bool</span> update=<span class="keyword">false</span>;</div>
-<div class="line"><a name="l00632"></a><span class="lineno">  632</span>       <span class="keywordflow">if</span>(obsindex<relobsindex.size()){</div>
-<div class="line"><a name="l00633"></a><span class="lineno">  633</span>     update=(relobsindex[obsindex]==modindex);</div>
-<div class="line"><a name="l00634"></a><span class="lineno">  634</span>       }</div>
-<div class="line"><a name="l00635"></a><span class="lineno">  635</span>       <span class="keywordflow">if</span>(update){</div>
-<div class="line"><a name="l00636"></a><span class="lineno">  636</span>     <span class="keywordflow">if</span>(verbose_opt[0])</div>
-<div class="line"><a name="l00637"></a><span class="lineno">  637</span>       cout << <span class="stringliteral">"***update "</span> << relobsindex[obsindex] << <span class="stringliteral">" = "</span> << modindex << <span class="stringliteral">" "</span> << observation_opt[obsindex] << <span class="stringliteral">" ***"</span> << endl;</div>
-<div class="line"><a name="l00638"></a><span class="lineno">  638</span> </div>
-<div class="line"><a name="l00639"></a><span class="lineno">  639</span>     imgReaderObs.open(observation_opt[obsindex]);</div>
-<div class="line"><a name="l00640"></a><span class="lineno">  640</span>     imgReaderObs.getGeoTransform(geotransform);</div>
-<div class="line"><a name="l00641"></a><span class="lineno">  641</span>     imgReaderObs.setNoData(obsnodata_opt);</div>
-<div class="line"><a name="l00642"></a><span class="lineno">  642</span>     <span class="keywordflow">if</span>(obsoffset_opt.size())</div>
-<div class="line"><a name="l00643"></a><span class="lineno">  643</span>       imgReaderObs.setOffset(obsoffset_opt[0]);</div>
-<div class="line"><a name="l00644"></a><span class="lineno">  644</span>     <span class="keywordflow">if</span>(obsscale_opt.size())</div>
-<div class="line"><a name="l00645"></a><span class="lineno">  645</span>       imgReaderObs.setScale(obsscale_opt[0]);</div>
-<div class="line"><a name="l00646"></a><span class="lineno">  646</span>     <span class="comment">//calculate regression between model and observation</span></div>
-<div class="line"><a name="l00647"></a><span class="lineno">  647</span>     <span class="keywordflow">if</span>(verbose_opt[0])</div>
-<div class="line"><a name="l00648"></a><span class="lineno">  648</span>       cout << <span class="stringliteral">"Calculating regression for "</span> << imgReaderModel2.getFileName() << <span class="stringliteral">" "</span> << imgReaderObs.getFileName() << endl;</div>
-<div class="line"><a name="l00649"></a><span class="lineno">  649</span>     <span class="keywordflow">if</span>(regSensor_opt[0]>0)</div>
-<div class="line"><a name="l00650"></a><span class="lineno">  650</span>       errObs=regSensor_opt[0]*imgreg.getRMSE(imgReaderModel2,imgReaderObs,c0obs,c1obs,0,0,verbose_opt[0]);</div>
-<div class="line"><a name="l00651"></a><span class="lineno">  651</span>     <span class="keywordflow">else</span>{</div>
-<div class="line"><a name="l00652"></a><span class="lineno">  652</span>       c0obs=0;</div>
-<div class="line"><a name="l00653"></a><span class="lineno">  653</span>       c1obs=1;</div>
-<div class="line"><a name="l00654"></a><span class="lineno">  654</span>       errObs=0;</div>
-<div class="line"><a name="l00655"></a><span class="lineno">  655</span>     }</div>
-<div class="line"><a name="l00656"></a><span class="lineno">  656</span>     <span class="keywordflow">if</span>(verbose_opt[0])</div>
-<div class="line"><a name="l00657"></a><span class="lineno">  657</span>       cout << <span class="stringliteral">"c0obs, c1obs: "</span> << c0obs << <span class="stringliteral">", "</span> << c1obs << endl;</div>
-<div class="line"><a name="l00658"></a><span class="lineno">  658</span>       }</div>
-<div class="line"><a name="l00659"></a><span class="lineno">  659</span>       <span class="comment">//prediction (also to fill cloudy pixels in update mode)</span></div>
-<div class="line"><a name="l00660"></a><span class="lineno">  660</span>       <span class="keywordtype">string</span> input;</div>
-<div class="line"><a name="l00661"></a><span class="lineno">  661</span>       <span class="keywordflow">if</span>(outputfw_opt.size()==model_opt.size())</div>
-<div class="line"><a name="l00662"></a><span class="lineno">  662</span>     input=outputfw_opt[modindex-1];</div>
-<div class="line"><a name="l00663"></a><span class="lineno">  663</span>       <span class="keywordflow">else</span>{</div>
-<div class="line"><a name="l00664"></a><span class="lineno">  664</span>     ostringstream outputstream;</div>
-<div class="line"><a name="l00665"></a><span class="lineno">  665</span>     outputstream << outputfw_opt[0] << <span class="stringliteral">"_"</span>;</div>
-<div class="line"><a name="l00666"></a><span class="lineno">  666</span>     outputstream << setfill(<span class="charliteral">'0'</span>) << setw(ndigit) << tmodel_opt[modindex-1];</div>
-<div class="line"><a name="l00667"></a><span class="lineno">  667</span>     outputstream << <span class="stringliteral">".tif"</span>;</div>
-<div class="line"><a name="l00668"></a><span class="lineno">  668</span>     <span class="comment">// outputstream << outputfw_opt[0] << "_" << tmodel_opt[modindex-1] << ".tif";</span></div>
-<div class="line"><a name="l00669"></a><span class="lineno">  669</span>     input=outputstream.str();</div>
-<div class="line"><a name="l00670"></a><span class="lineno">  670</span>       }</div>
-<div class="line"><a name="l00671"></a><span class="lineno">  671</span>       <span class="keywordflow">if</span>(verbose_opt[0])</div>
-<div class="line"><a name="l00672"></a><span class="lineno">  672</span>     cout << <span class="stringliteral">"opening "</span> << input << endl;</div>
-<div class="line"><a name="l00673"></a><span class="lineno">  673</span>       <a class="code" href="classImgReaderGdal.html">ImgReaderGdal</a> imgReaderEst(input);</div>
-<div class="line"><a name="l00674"></a><span class="lineno">  674</span>       imgReaderEst.setNoData(obsnodata_opt);</div>
-<div class="line"><a name="l00675"></a><span class="lineno">  675</span>       <span class="keywordflow">if</span>(obsoffset_opt.size())</div>
-<div class="line"><a name="l00676"></a><span class="lineno">  676</span>     imgReaderEst.setOffset(obsoffset_opt[0]);</div>
-<div class="line"><a name="l00677"></a><span class="lineno">  677</span>       <span class="keywordflow">if</span>(obsscale_opt.size())</div>
-<div class="line"><a name="l00678"></a><span class="lineno">  678</span>     imgReaderEst.setScale(obsscale_opt[0]);</div>
-<div class="line"><a name="l00679"></a><span class="lineno">  679</span>       </div>
-<div class="line"><a name="l00680"></a><span class="lineno">  680</span>       vector< vector<double> > obsLineVector(down_opt[0]);</div>
-<div class="line"><a name="l00681"></a><span class="lineno">  681</span>       vector<double> obsLineBuffer;</div>
-<div class="line"><a name="l00682"></a><span class="lineno">  682</span>       vector<double> obsWindowBuffer;<span class="comment">//buffer for observation to calculate average corresponding to model pixel</span></div>
-<div class="line"><a name="l00683"></a><span class="lineno">  683</span>       vector<double> model1LineBuffer;</div>
-<div class="line"><a name="l00684"></a><span class="lineno">  684</span>       vector<double> model2LineBuffer;</div>
-<div class="line"><a name="l00685"></a><span class="lineno">  685</span>       vector<double> model1buffer;<span class="comment">//buffer for model 1 to calculate time regression based on window</span></div>
-<div class="line"><a name="l00686"></a><span class="lineno">  686</span>       vector<double> model2buffer;<span class="comment">//buffer for model 2 to calculate time regression based on window</span></div>
-<div class="line"><a name="l00687"></a><span class="lineno">  687</span>       vector<double> uncertObsLineBuffer;</div>
-<div class="line"><a name="l00688"></a><span class="lineno">  688</span>       vector<double> estReadBuffer;</div>
-<div class="line"><a name="l00689"></a><span class="lineno">  689</span>       <span class="comment">// vector<double> estWindowBuffer;//buffer for estimate to calculate average corresponding to model pixel</span></div>
-<div class="line"><a name="l00690"></a><span class="lineno">  690</span>       vector<double> uncertReadBuffer;</div>
-<div class="line"><a name="l00691"></a><span class="lineno">  691</span>       vector<double> estWriteBuffer(ncol);</div>
-<div class="line"><a name="l00692"></a><span class="lineno">  692</span>       vector<double> uncertWriteBuffer(ncol);</div>
-<div class="line"><a name="l00693"></a><span class="lineno">  693</span>       <span class="comment">// vector<double> lineMask;</span></div>
-<div class="line"><a name="l00694"></a><span class="lineno">  694</span> </div>
-<div class="line"><a name="l00695"></a><span class="lineno">  695</span>       <span class="comment">//initialize obsLineVector if update</span></div>
-<div class="line"><a name="l00696"></a><span class="lineno">  696</span>       <span class="keywordflow">if</span>(update){</div>
-<div class="line"><a name="l00697"></a><span class="lineno">  697</span>     <span class="keywordflow">if</span>(verbose_opt[0])</div>
-<div class="line"><a name="l00698"></a><span class="lineno">  698</span>       cout << <span class="stringliteral">"initialize obsLineVector"</span> << endl;</div>
-<div class="line"><a name="l00699"></a><span class="lineno">  699</span>     assert(down_opt[0]%2);<span class="comment">//window size must be odd </span></div>
-<div class="line"><a name="l00700"></a><span class="lineno">  700</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iline=-down_opt[0]/2;iline<down_opt[0]/2+1;++iline){</div>
-<div class="line"><a name="l00701"></a><span class="lineno">  701</span>       <span class="keywordflow">if</span>(iline<0)<span class="comment">//replicate line 0</span></div>
-<div class="line"><a name="l00702"></a><span class="lineno">  702</span>         imgReaderObs.readData(obsLineVector[iline+down_opt[0]/2],GDT_Float64,0,0);</div>
-<div class="line"><a name="l00703"></a><span class="lineno">  703</span>       <span class="keywordflow">else</span></div>
-<div class="line"><a name="l00704"></a><span class="lineno">  704</span>         imgReaderObs.readData(obsLineVector[iline+down_opt[0]/2],GDT_Float64,iline,0);</div>
-<div class="line"><a name="l00705"></a><span class="lineno">  705</span>     }</div>
-<div class="line"><a name="l00706"></a><span class="lineno">  706</span>       }</div>
-<div class="line"><a name="l00707"></a><span class="lineno">  707</span>       <span class="keywordflow">for</span>(<span class="keywordtype">int</span> irow=0;irow<imgWriterEst.nrOfRow();++irow){</div>
-<div class="line"><a name="l00708"></a><span class="lineno">  708</span>     <span class="comment">//do not read from imgReaderObs, because we read entire window for each pixel...</span></div>
-<div class="line"><a name="l00709"></a><span class="lineno">  709</span>     imgReaderEst.readData(estReadBuffer,GDT_Float64,irow,0);</div>
-<div class="line"><a name="l00710"></a><span class="lineno">  710</span>     imgReaderEst.readData(uncertReadBuffer,GDT_Float64,irow,1);</div>
-<div class="line"><a name="l00711"></a><span class="lineno">  711</span>     <span class="comment">//read model2 in case current estimate is nodata</span></div>
-<div class="line"><a name="l00712"></a><span class="lineno">  712</span>     imgReaderEst.image2geo(0,irow,geox,geoy);</div>
-<div class="line"><a name="l00713"></a><span class="lineno">  713</span>     imgReaderModel2.geo2image(geox,geoy,modCol,modRow);</div>
-<div class="line"><a name="l00714"></a><span class="lineno">  714</span>     assert(modRow>=0&&modRow<imgReaderModel2.nrOfRow());</div>
-<div class="line"><a name="l00715"></a><span class="lineno">  715</span>     imgReaderModel2.readData(model2LineBuffer,GDT_Float64,modRow,0);</div>
-<div class="line"><a name="l00716"></a><span class="lineno">  716</span> </div>
-<div class="line"><a name="l00717"></a><span class="lineno">  717</span>     imgReaderModel1.geo2image(geox,geoy,modCol,modRow);</div>
-<div class="line"><a name="l00718"></a><span class="lineno">  718</span>     assert(modRow>=0&&modRow<imgReaderModel1.nrOfRow());</div>
-<div class="line"><a name="l00719"></a><span class="lineno">  719</span>     imgReaderModel1.readData(model1LineBuffer,GDT_Float64,modRow,0);</div>
-<div class="line"><a name="l00720"></a><span class="lineno">  720</span> </div>
-<div class="line"><a name="l00721"></a><span class="lineno">  721</span>     <span class="keywordflow">if</span>(update){</div>
-<div class="line"><a name="l00722"></a><span class="lineno">  722</span>       <span class="keywordtype">int</span> maxRow=(irow+down_opt[0]/2<imgReaderEst.nrOfRow()) ? irow+down_opt[0]/2 : imgReaderEst.nrOfRow()-1;</div>
-<div class="line"><a name="l00723"></a><span class="lineno">  723</span>       obsLineVector.erase(obsLineVector.begin());</div>
-<div class="line"><a name="l00724"></a><span class="lineno">  724</span>       imgReaderObs.readData(obsLineBuffer,GDT_Float64,maxRow,0);</div>
-<div class="line"><a name="l00725"></a><span class="lineno">  725</span>       obsLineVector.push_back(obsLineBuffer);</div>
-<div class="line"><a name="l00726"></a><span class="lineno">  726</span>       obsLineBuffer=obsLineVector[down_opt[0]/2];</div>
-<div class="line"><a name="l00727"></a><span class="lineno">  727</span>       <span class="comment">// imgReaderObs.readData(obsLineBuffer,GDT_Float64,irow,0);</span></div>
-<div class="line"><a name="l00728"></a><span class="lineno">  728</span>       <span class="keywordflow">if</span>(imgReaderObs.nrOfBand()>1)</div>
-<div class="line"><a name="l00729"></a><span class="lineno">  729</span>         imgReaderObs.readData(uncertObsLineBuffer,GDT_Float64,irow,1);</div>
-<div class="line"><a name="l00730"></a><span class="lineno">  730</span>     }</div>
-<div class="line"><a name="l00731"></a><span class="lineno">  731</span>     <span class="comment">// double oldRowMask=-1;//keep track of row mask to optimize number of line readings</span></div>
-<div class="line"><a name="l00732"></a><span class="lineno">  732</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> icol=0;icol<imgWriterEst.nrOfCol();++icol){</div>
-<div class="line"><a name="l00733"></a><span class="lineno">  733</span>       imgReaderEst.image2geo(icol,irow,geox,geoy);</div>
-<div class="line"><a name="l00734"></a><span class="lineno">  734</span>       <span class="keywordtype">int</span> minCol=(icol>down_opt[0]/2) ? icol-down_opt[0]/2 : 0;</div>
-<div class="line"><a name="l00735"></a><span class="lineno">  735</span>       <span class="keywordtype">int</span> maxCol=(icol+down_opt[0]/2<imgReaderEst.nrOfCol()) ? icol+down_opt[0]/2 : imgReaderEst.nrOfCol()-1;</div>
-<div class="line"><a name="l00736"></a><span class="lineno">  736</span>       <span class="keywordtype">int</span> minRow=(irow>down_opt[0]/2) ? irow-down_opt[0]/2 : 0;</div>
-<div class="line"><a name="l00737"></a><span class="lineno">  737</span>       <span class="keywordtype">int</span> maxRow=(irow+down_opt[0]/2<imgReaderEst.nrOfRow()) ? irow+down_opt[0]/2 : imgReaderEst.nrOfRow()-1;</div>
-<div class="line"><a name="l00738"></a><span class="lineno">  738</span>       <span class="keywordflow">if</span>(update){</div>
-<div class="line"><a name="l00739"></a><span class="lineno">  739</span>         obsWindowBuffer.clear();</div>
-<div class="line"><a name="l00740"></a><span class="lineno">  740</span>         <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iline=0;iline<obsLineVector.size();++iline){</div>
-<div class="line"><a name="l00741"></a><span class="lineno">  741</span>           <span class="keywordflow">for</span>(<span class="keywordtype">int</span> isample=minCol;isample<=maxCol;++isample){</div>
-<div class="line"><a name="l00742"></a><span class="lineno">  742</span>         assert(isample<obsLineVector[iline].size());</div>
-<div class="line"><a name="l00743"></a><span class="lineno">  743</span>         obsWindowBuffer.push_back(obsLineVector[iline][isample]);</div>
-<div class="line"><a name="l00744"></a><span class="lineno">  744</span>           }</div>
-<div class="line"><a name="l00745"></a><span class="lineno">  745</span>         }</div>
-<div class="line"><a name="l00746"></a><span class="lineno">  746</span>         <span class="comment">// imgReaderObs.readDataBlock(obsWindowBuffer,GDT_Float64,minCol,maxCol,minRow,maxRow,0);</span></div>
-<div class="line"><a name="l00747"></a><span class="lineno">  747</span>       }</div>
-<div class="line"><a name="l00748"></a><span class="lineno">  748</span>       <span class="keywordtype">double</span> estValue=estReadBuffer[icol];</div>
-<div class="line"><a name="l00749"></a><span class="lineno">  749</span>       <span class="keywordtype">double</span> estMeanValue=0;<span class="comment">//stat.mean(estWindowBuffer);</span></div>
-<div class="line"><a name="l00750"></a><span class="lineno">  750</span>       <span class="keywordtype">double</span> nvalid=0;</div>
-<div class="line"><a name="l00751"></a><span class="lineno">  751</span>       <span class="comment">//time update</span></div>
-<div class="line"><a name="l00752"></a><span class="lineno">  752</span>       imgReaderModel2.geo2image(geox,geoy,modCol,modRow);</div>
-<div class="line"><a name="l00753"></a><span class="lineno">  753</span>       assert(modRow>=0&&modRow<imgReaderModel2.nrOfRow());</div>
-<div class="line"><a name="l00754"></a><span class="lineno">  754</span>       <span class="keywordtype">double</span> modValue=model2LineBuffer[modCol];</div>
-<div class="line"><a name="l00755"></a><span class="lineno">  755</span>       <span class="keywordtype">bool</span> estNodata=imgReaderEst.isNoData(estValue);<span class="comment">//validity of current estimate</span></div>
-<div class="line"><a name="l00756"></a><span class="lineno">  756</span>       <span class="keywordflow">if</span>(estNodata){</div>
-<div class="line"><a name="l00757"></a><span class="lineno">  757</span>         <span class="comment">//we have not found any valid data yet, better here to take the current model value if valid</span></div>
-<div class="line"><a name="l00758"></a><span class="lineno">  758</span>         <span class="keywordflow">if</span>(imgReaderModel2.isNoData(modValue)){<span class="comment">//if both estimate and model are no-data, set obs to nodata</span></div>
-<div class="line"><a name="l00759"></a><span class="lineno">  759</span>           estWriteBuffer[icol]=obsnodata_opt[0];</div>
-<div class="line"><a name="l00760"></a><span class="lineno">  760</span>           uncertWriteBuffer[icol]=uncertNodata_opt[0];</div>
-<div class="line"><a name="l00761"></a><span class="lineno">  761</span>         }</div>
-<div class="line"><a name="l00762"></a><span class="lineno">  762</span>         <span class="keywordflow">else</span>{</div>
-<div class="line"><a name="l00763"></a><span class="lineno">  763</span>           estWriteBuffer[icol]=modValue;</div>
-<div class="line"><a name="l00764"></a><span class="lineno">  764</span>           uncertWriteBuffer[icol]=uncertModel_opt[0]*stdDev;</div>
-<div class="line"><a name="l00765"></a><span class="lineno">  765</span>         }</div>
-<div class="line"><a name="l00766"></a><span class="lineno">  766</span>       }   </div>
-<div class="line"><a name="l00767"></a><span class="lineno">  767</span>       <span class="keywordflow">else</span>{</div>
-<div class="line"><a name="l00768"></a><span class="lineno">  768</span>         <span class="keywordflow">if</span>(window_opt[0]>0){</div>
-<div class="line"><a name="l00769"></a><span class="lineno">  769</span>           <span class="keywordflow">try</span>{</div>
-<div class="line"><a name="l00770"></a><span class="lineno">  770</span>         <span class="comment">// imgReaderModel2.geo2image(geox,geoy,modCol,modRow);//did that already</span></div>
-<div class="line"><a name="l00771"></a><span class="lineno">  771</span>         minCol=(modCol>window_opt[0]/2) ? modCol-window_opt[0]/2 : 0;</div>
-<div class="line"><a name="l00772"></a><span class="lineno">  772</span>         maxCol=(modCol+window_opt[0]/2<imgReaderModel2.nrOfCol()) ? modCol+window_opt[0]/2 : imgReaderModel2.nrOfCol()-1;</div>
-<div class="line"><a name="l00773"></a><span class="lineno">  773</span>         minRow=(modRow>window_opt[0]/2) ? modRow-window_opt[0]/2 : 0;</div>
-<div class="line"><a name="l00774"></a><span class="lineno">  774</span>         maxRow=(modRow+window_opt[0]/2<imgReaderModel2.nrOfRow()) ? modRow+window_opt[0]/2 : imgReaderModel2.nrOfRow()-1;</div>
-<div class="line"><a name="l00775"></a><span class="lineno">  775</span>         imgReaderModel2.readDataBlock(model2buffer,GDT_Float64,minCol,maxCol,minRow,maxRow,0);</div>
-<div class="line"><a name="l00776"></a><span class="lineno">  776</span> </div>
-<div class="line"><a name="l00777"></a><span class="lineno">  777</span>         imgReaderModel1.geo2image(geox,geoy,modCol,modRow);</div>
-<div class="line"><a name="l00778"></a><span class="lineno">  778</span>         assert(modRow>=0&&modRow<imgReaderModel1.nrOfRow());</div>
-<div class="line"><a name="l00779"></a><span class="lineno">  779</span>         minCol=(modCol>window_opt[0]/2) ? modCol-window_opt[0]/2 : 0;</div>
-<div class="line"><a name="l00780"></a><span class="lineno">  780</span>         maxCol=(modCol+window_opt[0]/2<imgReaderModel1.nrOfCol()) ? modCol+window_opt[0]/2 : imgReaderModel1.nrOfCol()-1;</div>
-<div class="line"><a name="l00781"></a><span class="lineno">  781</span>         minRow=(modRow>window_opt[0]/2) ? modRow-window_opt[0]/2 : 0;</div>
-<div class="line"><a name="l00782"></a><span class="lineno">  782</span>         maxRow=(modRow+window_opt[0]/2<imgReaderModel1.nrOfRow()) ? modRow+window_opt[0]/2 : imgReaderModel1.nrOfRow()-1;</div>
-<div class="line"><a name="l00783"></a><span class="lineno">  783</span>         imgReaderModel1.readDataBlock(model1buffer,GDT_Float64,minCol,maxCol,minRow,maxRow,0);</div>
-<div class="line"><a name="l00784"></a><span class="lineno">  784</span>         <span class="comment">// imgReaderEst.image2geo(icol,irow,geox,geoy);</span></div>
-<div class="line"><a name="l00785"></a><span class="lineno">  785</span>           }</div>
-<div class="line"><a name="l00786"></a><span class="lineno">  786</span>           <span class="keywordflow">catch</span>(<span class="keywordtype">string</span> errorString){</div>
-<div class="line"><a name="l00787"></a><span class="lineno">  787</span>         cerr << <span class="stringliteral">"Error reading data block for "</span> << minCol << <span class="stringliteral">"-"</span> << maxCol << <span class="stringliteral">", "</span> << minRow << <span class="stringliteral">"-"</span> << maxRow << endl;</div>
-<div class="line"><a name="l00788"></a><span class="lineno">  788</span>           }</div>
-<div class="line"><a name="l00789"></a><span class="lineno">  789</span>           <span class="comment">//erase no-data from buffer</span></div>
-<div class="line"><a name="l00790"></a><span class="lineno">  790</span>           vector<double>::iterator it1=model1buffer.begin();</div>
-<div class="line"><a name="l00791"></a><span class="lineno">  791</span>           vector<double>::iterator it2=model2buffer.begin();</div>
-<div class="line"><a name="l00792"></a><span class="lineno">  792</span>           <span class="keywordflow">while</span>(it1!=model1buffer.end()&&it2!=model2buffer.end()){</div>
-<div class="line"><a name="l00793"></a><span class="lineno">  793</span>         <span class="comment">//erase nodata</span></div>
-<div class="line"><a name="l00794"></a><span class="lineno">  794</span>         <span class="keywordtype">bool</span> modNodata=<span class="keyword">false</span>;</div>
-<div class="line"><a name="l00795"></a><span class="lineno">  795</span>         modNodata=modNodata||imgReaderModel1.isNoData(*it1);</div>
-<div class="line"><a name="l00796"></a><span class="lineno">  796</span>         modNodata=modNodata||imgReaderModel2.isNoData(*it2);</div>
-<div class="line"><a name="l00797"></a><span class="lineno">  797</span>         <span class="keywordflow">if</span>(modNodata){</div>
-<div class="line"><a name="l00798"></a><span class="lineno">  798</span>           model1buffer.erase(it1);</div>
-<div class="line"><a name="l00799"></a><span class="lineno">  799</span>           model2buffer.erase(it2);</div>
-<div class="line"><a name="l00800"></a><span class="lineno">  800</span>         }</div>
-<div class="line"><a name="l00801"></a><span class="lineno">  801</span>         <span class="keywordflow">else</span>{</div>
-<div class="line"><a name="l00802"></a><span class="lineno">  802</span>           ++it1;</div>
-<div class="line"><a name="l00803"></a><span class="lineno">  803</span>           ++it2;</div>
-<div class="line"><a name="l00804"></a><span class="lineno">  804</span>         }</div>
-<div class="line"><a name="l00805"></a><span class="lineno">  805</span>           }</div>
-<div class="line"><a name="l00806"></a><span class="lineno">  806</span>           <span class="keywordflow">if</span>(model1buffer.size()>minreg_opt[0]&&model2buffer.size()>minreg_opt[0]){</div>
-<div class="line"><a name="l00807"></a><span class="lineno">  807</span>         errMod=stat.linear_regression_err(model1buffer,model2buffer,c0mod,c1mod);</div>
-<div class="line"><a name="l00808"></a><span class="lineno">  808</span>         errMod*=regTime_opt[0];</div>
-<div class="line"><a name="l00809"></a><span class="lineno">  809</span>           }</div>
-<div class="line"><a name="l00810"></a><span class="lineno">  810</span>           <span class="keywordflow">else</span>{<span class="comment">//use global regression...</span></div>
-<div class="line"><a name="l00811"></a><span class="lineno">  811</span>         c0mod=c0modGlobal;</div>
-<div class="line"><a name="l00812"></a><span class="lineno">  812</span>         c1mod=c1modGlobal;</div>
-<div class="line"><a name="l00813"></a><span class="lineno">  813</span>           }</div>
-<div class="line"><a name="l00814"></a><span class="lineno">  814</span>         }</div>
-<div class="line"><a name="l00815"></a><span class="lineno">  815</span>         <span class="keywordflow">else</span>{</div>
-<div class="line"><a name="l00816"></a><span class="lineno">  816</span>           c0mod=c0modGlobal;</div>
-<div class="line"><a name="l00817"></a><span class="lineno">  817</span>           c1mod=c1modGlobal;</div>
-<div class="line"><a name="l00818"></a><span class="lineno">  818</span>         }</div>
-<div class="line"><a name="l00819"></a><span class="lineno">  819</span>         <span class="keywordtype">double</span> certNorm=(errMod*errMod+errObs*errObs);</div>
-<div class="line"><a name="l00820"></a><span class="lineno">  820</span>         <span class="keywordtype">double</span> certMod=errObs*errObs/certNorm;</div>
-<div class="line"><a name="l00821"></a><span class="lineno">  821</span>         <span class="keywordtype">double</span> certObs=errMod*errMod/certNorm;</div>
-<div class="line"><a name="l00822"></a><span class="lineno">  822</span>         <span class="keywordtype">double</span> regTime=(c0mod+c1mod*estValue)*certObs;</div>
-<div class="line"><a name="l00823"></a><span class="lineno">  823</span>         <span class="keywordtype">double</span> regSensor=(c0obs+c1obs*modValue)*certMod;</div>
-<div class="line"><a name="l00824"></a><span class="lineno">  824</span>         <span class="comment">// double regSensor=(c0obs+c1obs*estValue)*certObs;</span></div>
-<div class="line"><a name="l00825"></a><span class="lineno">  825</span>         estWriteBuffer[icol]=regTime+regSensor;</div>
-<div class="line"><a name="l00826"></a><span class="lineno">  826</span>         <span class="comment">//test</span></div>
-<div class="line"><a name="l00827"></a><span class="lineno">  827</span>         <span class="comment">// if(regTime<regSensor){</span></div>
-<div class="line"><a name="l00828"></a><span class="lineno">  828</span>         <span class="comment">//   cout << "regTime = (" << c0mod << "+" << c1mod << "*" << estValue << ")*" << certObs << " = " << regTime << endl;</span></div>
-<div class="line"><a name="l00829"></a><span class="lineno">  829</span>         <span class="comment">//   cout << "regSensor = (" << c0obs << "+" << c1obs << "*" << modValue << ")*" << certMod << " = " << regSensor << endl;</span></div>
-<div class="line"><a name="l00830"></a><span class="lineno">  830</span>         <span class="comment">//   assert(regTime+regSensor>0);</span></div>
-<div class="line"><a name="l00831"></a><span class="lineno">  831</span>         <span class="comment">//   assert(regTime+regSensor<=1);</span></div>
-<div class="line"><a name="l00832"></a><span class="lineno">  832</span>         <span class="comment">// }</span></div>
-<div class="line"><a name="l00833"></a><span class="lineno">  833</span> </div>
-<div class="line"><a name="l00834"></a><span class="lineno">  834</span>         <span class="keywordtype">double</span> totalUncertainty=0;</div>
-<div class="line"><a name="l00835"></a><span class="lineno">  835</span>         <span class="keywordflow">if</span>(errMod<eps_opt[0])</div>
-<div class="line"><a name="l00836"></a><span class="lineno">  836</span>           totalUncertainty=errObs;</div>
-<div class="line"><a name="l00837"></a><span class="lineno">  837</span>         <span class="keywordflow">else</span> <span class="keywordflow">if</span>(errObs<eps_opt[0])</div>
-<div class="line"><a name="l00838"></a><span class="lineno">  838</span>           totalUncertainty=errMod;</div>
-<div class="line"><a name="l00839"></a><span class="lineno">  839</span>         <span class="keywordflow">else</span>{</div>
-<div class="line"><a name="l00840"></a><span class="lineno">  840</span>           totalUncertainty=1.0/errMod/errMod+1/errObs/errObs;</div>
-<div class="line"><a name="l00841"></a><span class="lineno">  841</span>           totalUncertainty=sqrt(1.0/totalUncertainty);</div>
-<div class="line"><a name="l00842"></a><span class="lineno">  842</span>         }</div>
-<div class="line"><a name="l00843"></a><span class="lineno">  843</span>         uncertWriteBuffer[icol]=totalUncertainty+uncertReadBuffer[icol];</div>
-<div class="line"><a name="l00844"></a><span class="lineno">  844</span>       }</div>
-<div class="line"><a name="l00845"></a><span class="lineno">  845</span>       <span class="comment">//measurement update</span></div>
-<div class="line"><a name="l00846"></a><span class="lineno">  846</span>       <span class="keywordflow">if</span>(update&&!imgReaderObs.isNoData(obsLineBuffer[icol])){</div>
-<div class="line"><a name="l00847"></a><span class="lineno">  847</span>         <span class="keywordtype">double</span> kalmanGain=1;</div>
-<div class="line"><a name="l00848"></a><span class="lineno">  848</span>         <span class="keywordtype">double</span> uncertObs=uncertObs_opt[0];</div>
-<div class="line"><a name="l00849"></a><span class="lineno">  849</span>         <span class="keywordflow">if</span>(uncertObsLineBuffer.size()>icol)</div>
-<div class="line"><a name="l00850"></a><span class="lineno">  850</span>           uncertObs=uncertObsLineBuffer[icol];</div>
-<div class="line"><a name="l00851"></a><span class="lineno">  851</span>         <span class="keywordflow">else</span> <span class="keywordflow">if</span>(weight_opt.size()>1||deltaObs_opt.size()){</div>
-<div class="line"><a name="l00852"></a><span class="lineno">  852</span>           <a class="code" href="classstatfactory_1_1StatFactory.html">statfactory::StatFactory</a> statobs;</div>
-<div class="line"><a name="l00853"></a><span class="lineno">  853</span>           statobs.setNoDataValues(obsnodata_opt);</div>
-<div class="line"><a name="l00854"></a><span class="lineno">  854</span>           <span class="keywordtype">double</span> obsMeanValue=(statobs.mean(obsWindowBuffer)-c0obs)/c1obs;</div>
-<div class="line"><a name="l00855"></a><span class="lineno">  855</span>           <span class="keywordtype">double</span> difference=obsMeanValue-modValue;</div>
-<div class="line"><a name="l00856"></a><span class="lineno">  856</span>           <span class="keywordflow">if</span>(modValue){</div>
-<div class="line"><a name="l00857"></a><span class="lineno">  857</span>         <span class="keywordtype">double</span> relativeDifference=difference/modValue;</div>
-<div class="line"><a name="l00858"></a><span class="lineno">  858</span>         <span class="keywordflow">if</span>(deltaObs_opt.size()){</div>
-<div class="line"><a name="l00859"></a><span class="lineno">  859</span>           assert(deltaObs_opt.size()>1);</div>
-<div class="line"><a name="l00860"></a><span class="lineno">  860</span>           <span class="keywordflow">if</span>(100*relativeDifference<deltaObs_opt[0])<span class="comment">//lower bound</span></div>
-<div class="line"><a name="l00861"></a><span class="lineno">  861</span>             kalmanGain=0;</div>
-<div class="line"><a name="l00862"></a><span class="lineno">  862</span>           <span class="keywordflow">else</span> <span class="keywordflow">if</span>(100*relativeDifference>deltaObs_opt[1])<span class="comment">//upper bound</span></div>
-<div class="line"><a name="l00863"></a><span class="lineno">  863</span>             kalmanGain=0;</div>
-<div class="line"><a name="l00864"></a><span class="lineno">  864</span>         }</div>
-<div class="line"><a name="l00865"></a><span class="lineno">  865</span>         <span class="keywordflow">else</span> <span class="keywordflow">if</span>(weight_opt.size()){</div>
-<div class="line"><a name="l00866"></a><span class="lineno">  866</span>           assert(weight_opt.size()>1);</div>
-<div class="line"><a name="l00867"></a><span class="lineno">  867</span>           <span class="keywordflow">if</span>(obsMeanValue<modValue)</div>
-<div class="line"><a name="l00868"></a><span class="lineno">  868</span>             uncertObs=weight_opt[0]*relativeDifference;</div>
-<div class="line"><a name="l00869"></a><span class="lineno">  869</span>           <span class="keywordflow">else</span> <span class="keywordflow">if</span>(obsMeanValue>modValue)</div>
-<div class="line"><a name="l00870"></a><span class="lineno">  870</span>             uncertObs=weight_opt[1]*relativeDifference;</div>
-<div class="line"><a name="l00871"></a><span class="lineno">  871</span>         }</div>
-<div class="line"><a name="l00872"></a><span class="lineno">  872</span>           }</div>
-<div class="line"><a name="l00873"></a><span class="lineno">  873</span>           <span class="keywordflow">if</span>(uncertObs<=0)</div>
-<div class="line"><a name="l00874"></a><span class="lineno">  874</span>         uncertObs=0;</div>
-<div class="line"><a name="l00875"></a><span class="lineno">  875</span>           <span class="keywordflow">if</span>(verbose_opt[0]>1)</div>
-<div class="line"><a name="l00876"></a><span class="lineno">  876</span>         cout << <span class="stringliteral">"obsMeanValue:"</span> << obsMeanValue << <span class="stringliteral">", modValue: "</span> << modValue << endl;</div>
-<div class="line"><a name="l00877"></a><span class="lineno">  877</span>         }</div>
-<div class="line"><a name="l00878"></a><span class="lineno">  878</span>         <span class="keywordflow">if</span>(kalmanGain>0){</div>
-<div class="line"><a name="l00879"></a><span class="lineno">  879</span>           <span class="keywordflow">if</span>((uncertWriteBuffer[icol]+uncertObs)>eps_opt[0])</div>
-<div class="line"><a name="l00880"></a><span class="lineno">  880</span>           kalmanGain=uncertWriteBuffer[icol]/(uncertWriteBuffer[icol]+uncertObs);</div>
-<div class="line"><a name="l00881"></a><span class="lineno">  881</span>         }</div>
-<div class="line"><a name="l00882"></a><span class="lineno">  882</span>         assert(kalmanGain<=1);</div>
-<div class="line"><a name="l00883"></a><span class="lineno">  883</span>         estWriteBuffer[icol]+=kalmanGain*(obsLineBuffer[icol]-estWriteBuffer[icol]);</div>
-<div class="line"><a name="l00884"></a><span class="lineno">  884</span>         uncertWriteBuffer[icol]*=(1-kalmanGain);</div>
-<div class="line"><a name="l00885"></a><span class="lineno">  885</span>       }</div>
-<div class="line"><a name="l00886"></a><span class="lineno">  886</span>     }</div>
-<div class="line"><a name="l00887"></a><span class="lineno">  887</span>     imgWriterEst.writeData(estWriteBuffer,GDT_Float64,irow,0);</div>
-<div class="line"><a name="l00888"></a><span class="lineno">  888</span>     imgWriterEst.writeData(uncertWriteBuffer,GDT_Float64,irow,1);</div>
-<div class="line"><a name="l00889"></a><span class="lineno">  889</span>     progress=<span class="keyword">static_cast<</span><span class="keywordtype">float</span><span class="keyword">></span>((irow+1.0)/imgWriterEst.nrOfRow());</div>
-<div class="line"><a name="l00890"></a><span class="lineno">  890</span>     pfnProgress(progress,pszMessage,pProgressArg);</div>
-<div class="line"><a name="l00891"></a><span class="lineno">  891</span>       }</div>
-<div class="line"><a name="l00892"></a><span class="lineno">  892</span> </div>
-<div class="line"><a name="l00893"></a><span class="lineno">  893</span>       imgWriterEst.close();</div>
-<div class="line"><a name="l00894"></a><span class="lineno">  894</span>       imgReaderEst.close();</div>
-<div class="line"><a name="l00895"></a><span class="lineno">  895</span> </div>
-<div class="line"><a name="l00896"></a><span class="lineno">  896</span>       <span class="keywordflow">if</span>(update){</div>
-<div class="line"><a name="l00897"></a><span class="lineno">  897</span>     imgReaderObs.close();</div>
-<div class="line"><a name="l00898"></a><span class="lineno">  898</span>     ++obsindex;</div>
-<div class="line"><a name="l00899"></a><span class="lineno">  899</span>       }</div>
-<div class="line"><a name="l00900"></a><span class="lineno">  900</span>       imgReaderModel1.close();</div>
-<div class="line"><a name="l00901"></a><span class="lineno">  901</span>       imgReaderModel2.close();</div>
-<div class="line"><a name="l00902"></a><span class="lineno">  902</span>     }</div>
-<div class="line"><a name="l00903"></a><span class="lineno">  903</span>   }</div>
-<div class="line"><a name="l00904"></a><span class="lineno">  904</span>   <span class="keywordflow">if</span>(find(direction_opt.begin(),direction_opt.end(),<span class="stringliteral">"backward"</span>)!=direction_opt.end()){</div>
-<div class="line"><a name="l00906"></a><span class="lineno">  906</span>     cout << <span class="stringliteral">"Running backward model"</span> << endl;</div>
-<div class="line"><a name="l00907"></a><span class="lineno">  907</span>     obsindex=relobsindex.size()-1;</div>
-<div class="line"><a name="l00908"></a><span class="lineno">  908</span>     <span class="comment">//initialization</span></div>
-<div class="line"><a name="l00909"></a><span class="lineno">  909</span>     <span class="keywordtype">string</span> output;</div>
-<div class="line"><a name="l00910"></a><span class="lineno">  910</span>     <span class="keywordflow">if</span>(outputbw_opt.size()==model_opt.size())</div>
-<div class="line"><a name="l00911"></a><span class="lineno">  911</span>       output=outputbw_opt.back();</div>
-<div class="line"><a name="l00912"></a><span class="lineno">  912</span>     <span class="keywordflow">else</span>{</div>
-<div class="line"><a name="l00913"></a><span class="lineno">  913</span>       ostringstream outputstream;</div>
-<div class="line"><a name="l00914"></a><span class="lineno">  914</span>       outputstream << outputbw_opt[0] << <span class="stringliteral">"_"</span>;</div>
-<div class="line"><a name="l00915"></a><span class="lineno">  915</span>       outputstream << setfill(<span class="charliteral">'0'</span>) << setw(ndigit) << tmodel_opt.back();</div>
-<div class="line"><a name="l00916"></a><span class="lineno">  916</span>       outputstream << <span class="stringliteral">".tif"</span>;</div>
-<div class="line"><a name="l00917"></a><span class="lineno">  917</span>       <span class="comment">// outputstream << outputbw_opt[0] << "_" << tmodel_opt.back() << ".tif";</span></div>
-<div class="line"><a name="l00918"></a><span class="lineno">  918</span>       output=outputstream.str();</div>
-<div class="line"><a name="l00919"></a><span class="lineno">  919</span>     }</div>
-<div class="line"><a name="l00920"></a><span class="lineno">  920</span>     <span class="keywordflow">if</span>(verbose_opt[0])</div>
-<div class="line"><a name="l00921"></a><span class="lineno">  921</span>       cout << <span class="stringliteral">"Opening image "</span> << output << <span class="stringliteral">" for writing "</span> << endl;</div>
-<div class="line"><a name="l00922"></a><span class="lineno">  922</span>     imgWriterEst.open(output,ncol,nrow,2,GDT_Float32,imageType,option_opt);</div>
-<div class="line"><a name="l00923"></a><span class="lineno">  923</span>     imgWriterEst.setProjectionProj4(projection_opt[0]);</div>
-<div class="line"><a name="l00924"></a><span class="lineno">  924</span>     imgWriterEst.setGeoTransform(geotransform);</div>
-<div class="line"><a name="l00925"></a><span class="lineno">  925</span>     imgWriterEst.GDALSetNoDataValue(obsnodata_opt[0]);</div>
-<div class="line"><a name="l00926"></a><span class="lineno">  926</span> </div>
-<div class="line"><a name="l00927"></a><span class="lineno">  927</span>     <span class="keywordflow">if</span>(verbose_opt[0]){</div>
-<div class="line"><a name="l00928"></a><span class="lineno">  928</span>       cout << <span class="stringliteral">"processing time "</span> << tmodel_opt.back() << endl;</div>
-<div class="line"><a name="l00929"></a><span class="lineno">  929</span>       <span class="keywordflow">if</span>(obsindex<relobsindex.size())</div>
-<div class="line"><a name="l00930"></a><span class="lineno">  930</span>     cout << <span class="stringliteral">"next observation "</span> << tmodel_opt[relobsindex[obsindex]] << endl;</div>
-<div class="line"><a name="l00931"></a><span class="lineno">  931</span>       <span class="keywordflow">else</span></div>
-<div class="line"><a name="l00932"></a><span class="lineno">  932</span>     cout << <span class="stringliteral">"There is no next observation"</span> << endl;</div>
-<div class="line"><a name="l00933"></a><span class="lineno">  933</span>     }</div>
-<div class="line"><a name="l00934"></a><span class="lineno">  934</span> </div>
-<div class="line"><a name="l00935"></a><span class="lineno">  935</span>     <span class="keywordflow">try</span>{</div>
-<div class="line"><a name="l00936"></a><span class="lineno">  936</span>       imgReaderModel1.open(model_opt.back());</div>
-<div class="line"><a name="l00937"></a><span class="lineno">  937</span>       imgReaderModel1.setNoData(modnodata_opt);</div>
-<div class="line"><a name="l00938"></a><span class="lineno">  938</span>       <span class="keywordflow">if</span>(modoffset_opt.size())</div>
-<div class="line"><a name="l00939"></a><span class="lineno">  939</span>     imgReaderModel1.setOffset(modoffset_opt[0]);</div>
-<div class="line"><a name="l00940"></a><span class="lineno">  940</span>       <span class="keywordflow">if</span>(modscale_opt.size())</div>
-<div class="line"><a name="l00941"></a><span class="lineno">  941</span>     imgReaderModel1.setScale(modscale_opt[0]);</div>
-<div class="line"><a name="l00942"></a><span class="lineno">  942</span>     }</div>
-<div class="line"><a name="l00943"></a><span class="lineno">  943</span>     <span class="keywordflow">catch</span>(<span class="keywordtype">string</span> errorString){</div>
-<div class="line"><a name="l00944"></a><span class="lineno">  944</span>       cerr << errorString << endl;</div>
-<div class="line"><a name="l00945"></a><span class="lineno">  945</span>     }</div>
-<div class="line"><a name="l00946"></a><span class="lineno">  946</span>     <span class="keywordflow">catch</span>(...){</div>
-<div class="line"><a name="l00947"></a><span class="lineno">  947</span>       cerr << <span class="stringliteral">"Error opening file "</span> << model_opt[0] << endl;</div>
-<div class="line"><a name="l00948"></a><span class="lineno">  948</span>     }</div>
-<div class="line"><a name="l00949"></a><span class="lineno">  949</span> </div>
-<div class="line"><a name="l00950"></a><span class="lineno">  950</span>     <span class="comment">//calculate standard deviation of image to serve as model uncertainty</span></div>
-<div class="line"><a name="l00951"></a><span class="lineno">  951</span>     GDALRasterBand* rasterBand;</div>
-<div class="line"><a name="l00952"></a><span class="lineno">  952</span>     rasterBand=imgReaderModel1.getRasterBand(0);</div>
-<div class="line"><a name="l00953"></a><span class="lineno">  953</span>     <span class="keywordtype">double</span> minValue, maxValue, meanValue, stdDev;</div>
-<div class="line"><a name="l00954"></a><span class="lineno">  954</span>     <span class="keywordtype">void</span>* pProgressData;</div>
-<div class="line"><a name="l00955"></a><span class="lineno">  955</span>     rasterBand->ComputeStatistics(0,&minValue,&maxValue,&meanValue,&stdDev,pfnProgress,pProgressData);</div>
-<div class="line"><a name="l00956"></a><span class="lineno">  956</span>     <span class="keywordtype">double</span> modRow=0;</div>
-<div class="line"><a name="l00957"></a><span class="lineno">  957</span>     <span class="keywordtype">double</span> modCol=0;</div>
-<div class="line"><a name="l00958"></a><span class="lineno">  958</span>     <span class="keywordflow">if</span>(relobsindex.back()<model_opt.size()-1){<span class="comment">//initialize output_opt.back() as model[0]</span></div>
-<div class="line"><a name="l00959"></a><span class="lineno">  959</span>       <span class="comment">//write last model as output</span></div>
-<div class="line"><a name="l00960"></a><span class="lineno">  960</span>       <span class="keywordflow">if</span>(verbose_opt[0])</div>
-<div class="line"><a name="l00961"></a><span class="lineno">  961</span>     cout << <span class="stringliteral">"write last model as output"</span> << endl;</div>
-<div class="line"><a name="l00962"></a><span class="lineno">  962</span>       <span class="keywordflow">for</span>(<span class="keywordtype">int</span> irow=0;irow<nrow;++irow){</div>
-<div class="line"><a name="l00963"></a><span class="lineno">  963</span>     vector<double> estReadBuffer;</div>
-<div class="line"><a name="l00964"></a><span class="lineno">  964</span>     vector<double> estWriteBuffer(ncol);</div>
-<div class="line"><a name="l00965"></a><span class="lineno">  965</span>     vector<double> uncertWriteBuffer(ncol);</div>
-<div class="line"><a name="l00966"></a><span class="lineno">  966</span>     <span class="comment">// vector<double> lineMask;</span></div>
-<div class="line"><a name="l00967"></a><span class="lineno">  967</span>     imgWriterEst.image2geo(0,irow,geox,geoy);</div>
-<div class="line"><a name="l00968"></a><span class="lineno">  968</span>     imgReaderModel1.geo2image(geox,geoy,modCol,modRow);</div>
-<div class="line"><a name="l00969"></a><span class="lineno">  969</span>     assert(modRow>=0&&modRow<imgReaderModel1.nrOfRow());</div>
-<div class="line"><a name="l00970"></a><span class="lineno">  970</span>     <span class="keywordflow">try</span>{</div>
-<div class="line"><a name="l00971"></a><span class="lineno">  971</span>       imgReaderModel1.readData(estReadBuffer,GDT_Float64,modRow);</div>
-<div class="line"><a name="l00972"></a><span class="lineno">  972</span>       <span class="comment">//simple nearest neighbor</span></div>
-<div class="line"><a name="l00973"></a><span class="lineno">  973</span>       <span class="comment">//stat.nearUp(estReadBuffer,estWriteBuffer);</span></div>
-<div class="line"><a name="l00974"></a><span class="lineno">  974</span> </div>
-<div class="line"><a name="l00975"></a><span class="lineno">  975</span>       <span class="comment">// double oldRowMask=-1;//keep track of row mask to optimize number of line readings</span></div>
-<div class="line"><a name="l00976"></a><span class="lineno">  976</span>       <span class="keywordflow">for</span>(<span class="keywordtype">int</span> icol=0;icol<imgWriterEst.nrOfCol();++icol){</div>
-<div class="line"><a name="l00977"></a><span class="lineno">  977</span>         imgWriterEst.image2geo(icol,irow,geox,geoy);        </div>
-<div class="line"><a name="l00978"></a><span class="lineno">  978</span>         imgReaderModel1.geo2image(geox,geoy,modCol,modRow);</div>
-<div class="line"><a name="l00979"></a><span class="lineno">  979</span>         <span class="keywordtype">double</span> modValue=estReadBuffer[modCol];</div>
-<div class="line"><a name="l00980"></a><span class="lineno">  980</span>         <span class="keywordflow">if</span>(imgReaderModel1.isNoData(modValue)){</div>
-<div class="line"><a name="l00981"></a><span class="lineno">  981</span>           estWriteBuffer[icol]=obsnodata_opt[0];</div>
-<div class="line"><a name="l00982"></a><span class="lineno">  982</span>           uncertWriteBuffer[icol]=uncertNodata_opt[0];</div>
-<div class="line"><a name="l00983"></a><span class="lineno">  983</span>         }</div>
-<div class="line"><a name="l00984"></a><span class="lineno">  984</span>         <span class="keywordflow">else</span>{</div>
-<div class="line"><a name="l00985"></a><span class="lineno">  985</span>           estWriteBuffer[icol]=modValue;</div>
-<div class="line"><a name="l00986"></a><span class="lineno">  986</span>           uncertWriteBuffer[icol]=uncertModel_opt[0]*stdDev;</div>
-<div class="line"><a name="l00987"></a><span class="lineno">  987</span>         }</div>
-<div class="line"><a name="l00988"></a><span class="lineno">  988</span>       }</div>
-<div class="line"><a name="l00989"></a><span class="lineno">  989</span>       imgWriterEst.writeData(estWriteBuffer,GDT_Float64,irow,0);</div>
-<div class="line"><a name="l00990"></a><span class="lineno">  990</span>       imgWriterEst.writeData(uncertWriteBuffer,GDT_Float64,irow,1);</div>
-<div class="line"><a name="l00991"></a><span class="lineno">  991</span>     }</div>
-<div class="line"><a name="l00992"></a><span class="lineno">  992</span>     <span class="keywordflow">catch</span>(<span class="keywordtype">string</span> errorString){</div>
-<div class="line"><a name="l00993"></a><span class="lineno">  993</span>       cerr << errorString << endl;</div>
-<div class="line"><a name="l00994"></a><span class="lineno">  994</span>     }</div>
-<div class="line"><a name="l00995"></a><span class="lineno">  995</span>     <span class="keywordflow">catch</span>(...){</div>
-<div class="line"><a name="l00996"></a><span class="lineno">  996</span>       cerr << <span class="stringliteral">"Error writing file "</span> << imgWriterEst.getFileName() << endl;</div>
-<div class="line"><a name="l00997"></a><span class="lineno">  997</span>     }</div>
-<div class="line"><a name="l00998"></a><span class="lineno">  998</span>       }</div>
-<div class="line"><a name="l00999"></a><span class="lineno">  999</span>     }</div>
-<div class="line"><a name="l01000"></a><span class="lineno"> 1000</span>     <span class="keywordflow">else</span>{<span class="comment">//we have an measurement at end time</span></div>
-<div class="line"><a name="l01001"></a><span class="lineno"> 1001</span>       <span class="keywordflow">if</span>(verbose_opt[0])</div>
-<div class="line"><a name="l01002"></a><span class="lineno"> 1002</span>     cout << <span class="stringliteral">"we have an measurement at end time"</span> << endl;</div>
-<div class="line"><a name="l01003"></a><span class="lineno"> 1003</span>       imgReaderObs.open(observation_opt.back());</div>
-<div class="line"><a name="l01004"></a><span class="lineno"> 1004</span>       imgReaderObs.getGeoTransform(geotransform);</div>
-<div class="line"><a name="l01005"></a><span class="lineno"> 1005</span>       imgReaderObs.setNoData(obsnodata_opt);</div>
-<div class="line"><a name="l01006"></a><span class="lineno"> 1006</span>       <span class="keywordflow">if</span>(obsoffset_opt.size())</div>
-<div class="line"><a name="l01007"></a><span class="lineno"> 1007</span>     imgReaderObs.setOffset(obsoffset_opt[0]);</div>
-<div class="line"><a name="l01008"></a><span class="lineno"> 1008</span>       <span class="keywordflow">if</span>(obsscale_opt.size())</div>
-<div class="line"><a name="l01009"></a><span class="lineno"> 1009</span>     imgReaderObs.setScale(obsscale_opt[0]);</div>
-<div class="line"><a name="l01010"></a><span class="lineno"> 1010</span>       </div>
-<div class="line"><a name="l01011"></a><span class="lineno"> 1011</span>       <span class="keywordflow">if</span>(regSensor_opt[0]>0)</div>
-<div class="line"><a name="l01012"></a><span class="lineno"> 1012</span>     errObs=regSensor_opt[0]*imgreg.getRMSE(imgReaderModel1,imgReaderObs,c0obs,c1obs,0,0,verbose_opt[0]);</div>
-<div class="line"><a name="l01013"></a><span class="lineno"> 1013</span>       <span class="keywordflow">else</span>{</div>
-<div class="line"><a name="l01014"></a><span class="lineno"> 1014</span>     c0obs=0;</div>
-<div class="line"><a name="l01015"></a><span class="lineno"> 1015</span>     c1obs=1;</div>
-<div class="line"><a name="l01016"></a><span class="lineno"> 1016</span>     errObs=0;</div>
-<div class="line"><a name="l01017"></a><span class="lineno"> 1017</span>       }</div>
-<div class="line"><a name="l01018"></a><span class="lineno"> 1018</span>       <span class="keywordflow">if</span>(verbose_opt[0])</div>
-<div class="line"><a name="l01019"></a><span class="lineno"> 1019</span>     cout << <span class="stringliteral">"c0obs, c1obs: "</span> << c0obs << <span class="stringliteral">", "</span> << c1obs << endl;</div>
-<div class="line"><a name="l01020"></a><span class="lineno"> 1020</span> </div>
-<div class="line"><a name="l01021"></a><span class="lineno"> 1021</span>       <span class="keywordflow">for</span>(<span class="keywordtype">int</span> irow=0;irow<nrow;++irow){</div>
-<div class="line"><a name="l01022"></a><span class="lineno"> 1022</span>     vector<double> estReadBuffer;</div>
-<div class="line"><a name="l01023"></a><span class="lineno"> 1023</span>     imgWriterEst.image2geo(0,irow,geox,geoy);</div>
-<div class="line"><a name="l01024"></a><span class="lineno"> 1024</span>     imgReaderModel1.geo2image(geox,geoy,modCol,modRow);</div>
-<div class="line"><a name="l01025"></a><span class="lineno"> 1025</span>     assert(modRow>=0&&modRow<imgReaderModel1.nrOfRow());</div>
-<div class="line"><a name="l01026"></a><span class="lineno"> 1026</span>     imgReaderModel1.readData(estReadBuffer,GDT_Float64,modRow);</div>
-<div class="line"><a name="l01027"></a><span class="lineno"> 1027</span>     vector<double> obsLineBuffer;</div>
-<div class="line"><a name="l01028"></a><span class="lineno"> 1028</span>     vector<double> estWriteBuffer(ncol);</div>
-<div class="line"><a name="l01029"></a><span class="lineno"> 1029</span>     vector<double> uncertWriteBuffer(ncol);</div>
-<div class="line"><a name="l01030"></a><span class="lineno"> 1030</span>     vector<double> uncertObsLineBuffer;</div>
-<div class="line"><a name="l01031"></a><span class="lineno"> 1031</span>     <span class="comment">// vector<double> lineMask;</span></div>
-<div class="line"><a name="l01032"></a><span class="lineno"> 1032</span>     <span class="comment">// imgReaderObs.readData(estWriteBuffer,GDT_Float64,irow,0);</span></div>
-<div class="line"><a name="l01033"></a><span class="lineno"> 1033</span>     imgReaderObs.readData(obsLineBuffer,GDT_Float64,irow,0);</div>
-<div class="line"><a name="l01034"></a><span class="lineno"> 1034</span> </div>
-<div class="line"><a name="l01035"></a><span class="lineno"> 1035</span>     <span class="keywordflow">if</span>(imgReaderObs.nrOfBand()>1)</div>
-<div class="line"><a name="l01036"></a><span class="lineno"> 1036</span>       imgReaderObs.readData(uncertObsLineBuffer,GDT_Float64,irow,1);</div>
-<div class="line"><a name="l01037"></a><span class="lineno"> 1037</span>     <span class="comment">// double oldRowMask=-1;//keep track of row mask to optimize number of line readings</span></div>
-<div class="line"><a name="l01038"></a><span class="lineno"> 1038</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> icol=0;icol<imgWriterEst.nrOfCol();++icol){</div>
-<div class="line"><a name="l01039"></a><span class="lineno"> 1039</span>       imgWriterEst.image2geo(icol,irow,geox,geoy);</div>
-<div class="line"><a name="l01040"></a><span class="lineno"> 1040</span>       imgReaderModel1.geo2image(geox,geoy,modCol,modRow);</div>
-<div class="line"><a name="l01041"></a><span class="lineno"> 1041</span>       assert(modRow>=0&&modRow<imgReaderModel1.nrOfRow());</div>
-<div class="line"><a name="l01042"></a><span class="lineno"> 1042</span>       <span class="keywordtype">double</span> modValue=estReadBuffer[modCol];</div>
-<div class="line"><a name="l01043"></a><span class="lineno"> 1043</span>       <span class="keywordflow">if</span>(imgReaderModel1.isNoData(modValue)){<span class="comment">//model is nodata: retain observation </span></div>
-<div class="line"><a name="l01044"></a><span class="lineno"> 1044</span>         estWriteBuffer[icol]=obsLineBuffer[icol];</div>
-<div class="line"><a name="l01045"></a><span class="lineno"> 1045</span>         <span class="keywordflow">if</span>(imgReaderObs.isNoData(obsLineBuffer[icol])){</div>
-<div class="line"><a name="l01046"></a><span class="lineno"> 1046</span>           estWriteBuffer[icol]=obsnodata_opt[0];</div>
-<div class="line"><a name="l01047"></a><span class="lineno"> 1047</span>           uncertWriteBuffer[icol]=uncertNodata_opt[0];</div>
+<div class="line"><a name="l00360"></a><span class="lineno">  360</span>   <span class="keywordflow">if</span>(find(direction_opt.begin(),direction_opt.end(),<span class="stringliteral">"forward"</span>)!=direction_opt.end()){</div>
+<div class="line"><a name="l00362"></a><span class="lineno">  362</span>     cout << <span class="stringliteral">"Running forward model"</span> << endl;</div>
+<div class="line"><a name="l00363"></a><span class="lineno">  363</span>     obsindex=0;</div>
+<div class="line"><a name="l00364"></a><span class="lineno">  364</span>     <span class="comment">//initialization</span></div>
+<div class="line"><a name="l00365"></a><span class="lineno">  365</span>     <span class="keywordtype">string</span> output;</div>
+<div class="line"><a name="l00366"></a><span class="lineno">  366</span>     <span class="keywordflow">if</span>(outputfw_opt.size()==model_opt.size()){</div>
+<div class="line"><a name="l00367"></a><span class="lineno">  367</span>       output=outputfw_opt[0];</div>
+<div class="line"><a name="l00368"></a><span class="lineno">  368</span>     }</div>
+<div class="line"><a name="l00369"></a><span class="lineno">  369</span>     <span class="keywordflow">else</span>{</div>
+<div class="line"><a name="l00370"></a><span class="lineno">  370</span>       ostringstream outputstream;</div>
+<div class="line"><a name="l00371"></a><span class="lineno">  371</span>       outputstream << outputfw_opt[0] << <span class="stringliteral">"_"</span>;</div>
+<div class="line"><a name="l00372"></a><span class="lineno">  372</span>       outputstream << setfill(<span class="charliteral">'0'</span>) << setw(ndigit) << tmodel_opt[0];</div>
+<div class="line"><a name="l00373"></a><span class="lineno">  373</span>       outputstream << <span class="stringliteral">".tif"</span>;</div>
+<div class="line"><a name="l00374"></a><span class="lineno">  374</span>       <span class="comment">//test</span></div>
+<div class="line"><a name="l00375"></a><span class="lineno">  375</span>       <span class="comment">// outputstream << outputfw_opt[0] << "_" << tmodel_opt[0] << ".tif";</span></div>
+<div class="line"><a name="l00376"></a><span class="lineno">  376</span>       output=outputstream.str();</div>
+<div class="line"><a name="l00377"></a><span class="lineno">  377</span>     }</div>
+<div class="line"><a name="l00378"></a><span class="lineno">  378</span>     <span class="keywordflow">if</span>(verbose_opt[0])</div>
+<div class="line"><a name="l00379"></a><span class="lineno">  379</span>       cout << <span class="stringliteral">"Opening image "</span> << output << <span class="stringliteral">" for writing "</span> << endl;</div>
+<div class="line"><a name="l00380"></a><span class="lineno">  380</span> </div>
+<div class="line"><a name="l00381"></a><span class="lineno">  381</span>     imgWriterEst.open(output,ncol,nrow,2,GDT_Float64,imageType,option_opt);</div>
+<div class="line"><a name="l00382"></a><span class="lineno">  382</span>     imgWriterEst.setProjectionProj4(projection_opt[0]);</div>
+<div class="line"><a name="l00383"></a><span class="lineno">  383</span>     imgWriterEst.setGeoTransform(geotransform);</div>
+<div class="line"><a name="l00384"></a><span class="lineno">  384</span>     imgWriterEst.GDALSetNoDataValue(obsnodata_opt[0]);</div>
+<div class="line"><a name="l00385"></a><span class="lineno">  385</span> </div>
+<div class="line"><a name="l00386"></a><span class="lineno">  386</span>     <span class="comment">//test</span></div>
+<div class="line"><a name="l00387"></a><span class="lineno">  387</span>     <span class="keywordflow">if</span>(gain_opt.size()){</div>
+<div class="line"><a name="l00388"></a><span class="lineno">  388</span>       imgWriterGain.open(gain_opt[0],ncol,nrow,model_opt.size(),GDT_Float64,imageType,option_opt);</div>
+<div class="line"><a name="l00389"></a><span class="lineno">  389</span>       imgWriterGain.setProjectionProj4(projection_opt[0]);</div>
+<div class="line"><a name="l00390"></a><span class="lineno">  390</span>       imgWriterGain.setGeoTransform(geotransform);</div>
+<div class="line"><a name="l00391"></a><span class="lineno">  391</span>       imgWriterGain.GDALSetNoDataValue(obsnodata_opt[0]);</div>
+<div class="line"><a name="l00392"></a><span class="lineno">  392</span>     }</div>
+<div class="line"><a name="l00393"></a><span class="lineno">  393</span> </div>
+<div class="line"><a name="l00394"></a><span class="lineno">  394</span>     <span class="keywordflow">if</span>(verbose_opt[0]){</div>
+<div class="line"><a name="l00395"></a><span class="lineno">  395</span>       cout << <span class="stringliteral">"processing time "</span> << tmodel_opt[0] << endl;</div>
+<div class="line"><a name="l00396"></a><span class="lineno">  396</span>       <span class="keywordflow">if</span>(obsindex<relobsindex.size())</div>
+<div class="line"><a name="l00397"></a><span class="lineno">  397</span>     cout << <span class="stringliteral">"next observation "</span> << tmodel_opt[relobsindex[obsindex]] << endl;</div>
+<div class="line"><a name="l00398"></a><span class="lineno">  398</span>       <span class="keywordflow">else</span></div>
+<div class="line"><a name="l00399"></a><span class="lineno">  399</span>     cout << <span class="stringliteral">"There is no next observation"</span> << endl;</div>
+<div class="line"><a name="l00400"></a><span class="lineno">  400</span>     }</div>
+<div class="line"><a name="l00401"></a><span class="lineno">  401</span> </div>
+<div class="line"><a name="l00402"></a><span class="lineno">  402</span>     <span class="keywordflow">try</span>{</div>
+<div class="line"><a name="l00403"></a><span class="lineno">  403</span>       imgReaderModel1.open(model_opt[0]);</div>
+<div class="line"><a name="l00404"></a><span class="lineno">  404</span>       <span class="keywordflow">for</span>(<span class="keywordtype">int</span> inodata=0;inodata<modnodata_opt.size();++inodata)</div>
+<div class="line"><a name="l00405"></a><span class="lineno">  405</span>     imgReaderModel1.pushNoDataValue(modnodata_opt[inodata]);</div>
+<div class="line"><a name="l00406"></a><span class="lineno">  406</span>       <span class="comment">// imgReaderModel1.setNoData(modnodata_opt);</span></div>
+<div class="line"><a name="l00407"></a><span class="lineno">  407</span>       <span class="keywordflow">if</span>(modoffset_opt.size())</div>
+<div class="line"><a name="l00408"></a><span class="lineno">  408</span>     imgReaderModel1.setOffset(modoffset_opt[0]);</div>
+<div class="line"><a name="l00409"></a><span class="lineno">  409</span>       <span class="keywordflow">if</span>(modscale_opt.size())</div>
+<div class="line"><a name="l00410"></a><span class="lineno">  410</span>     imgReaderModel1.setScale(modscale_opt[0]);</div>
+<div class="line"><a name="l00411"></a><span class="lineno">  411</span>     }</div>
+<div class="line"><a name="l00412"></a><span class="lineno">  412</span>     <span class="keywordflow">catch</span>(<span class="keywordtype">string</span> errorString){</div>
+<div class="line"><a name="l00413"></a><span class="lineno">  413</span>       cerr << errorString << endl;</div>
+<div class="line"><a name="l00414"></a><span class="lineno">  414</span>     }</div>
+<div class="line"><a name="l00415"></a><span class="lineno">  415</span>     <span class="keywordflow">catch</span>(...){</div>
+<div class="line"><a name="l00416"></a><span class="lineno">  416</span>       cerr << <span class="stringliteral">"Error opening file "</span> << model_opt[0] << endl;</div>
+<div class="line"><a name="l00417"></a><span class="lineno">  417</span>     }</div>
+<div class="line"><a name="l00418"></a><span class="lineno">  418</span>       </div>
+<div class="line"><a name="l00419"></a><span class="lineno">  419</span>     <span class="comment">//calculate standard deviation of image to serve as model uncertainty</span></div>
+<div class="line"><a name="l00420"></a><span class="lineno">  420</span>     GDALRasterBand* rasterBand;</div>
+<div class="line"><a name="l00421"></a><span class="lineno">  421</span>     rasterBand=imgReaderModel1.getRasterBand(0);</div>
+<div class="line"><a name="l00422"></a><span class="lineno">  422</span>     <span class="keywordtype">double</span> minValue, maxValue, meanValue, stdDev;</div>
+<div class="line"><a name="l00423"></a><span class="lineno">  423</span>     <span class="keywordtype">void</span>* pProgressData;</div>
+<div class="line"><a name="l00424"></a><span class="lineno">  424</span>     rasterBand->ComputeStatistics(0,&minValue,&maxValue,&meanValue,&stdDev,pfnProgress,pProgressData);</div>
+<div class="line"><a name="l00425"></a><span class="lineno">  425</span>     <span class="keywordtype">double</span> modRow=0;</div>
+<div class="line"><a name="l00426"></a><span class="lineno">  426</span>     <span class="keywordtype">double</span> modCol=0;</div>
+<div class="line"><a name="l00427"></a><span class="lineno">  427</span>     <span class="keywordflow">if</span>(relobsindex[0]>0){<span class="comment">//initialize output_opt[0] as model[0]</span></div>
+<div class="line"><a name="l00428"></a><span class="lineno">  428</span>       <span class="comment">//write first model as output</span></div>
+<div class="line"><a name="l00429"></a><span class="lineno">  429</span>       <span class="keywordflow">if</span>(verbose_opt[0])</div>
+<div class="line"><a name="l00430"></a><span class="lineno">  430</span>     cout << <span class="stringliteral">"write first model as output"</span> << endl;</div>
+<div class="line"><a name="l00431"></a><span class="lineno">  431</span>       <span class="keywordflow">for</span>(<span class="keywordtype">int</span> irow=0;irow<nrow;++irow){</div>
+<div class="line"><a name="l00432"></a><span class="lineno">  432</span>     vector<double> estReadBuffer;</div>
+<div class="line"><a name="l00433"></a><span class="lineno">  433</span>     vector<double> estWriteBuffer(ncol);</div>
+<div class="line"><a name="l00434"></a><span class="lineno">  434</span>     vector<double> uncertWriteBuffer(ncol);</div>
+<div class="line"><a name="l00435"></a><span class="lineno">  435</span>     <span class="comment">//test</span></div>
+<div class="line"><a name="l00436"></a><span class="lineno">  436</span>     vector<double> gainWriteBuffer(ncol);</div>
+<div class="line"><a name="l00437"></a><span class="lineno">  437</span>     <span class="comment">// vector<double> lineMask;</span></div>
+<div class="line"><a name="l00438"></a><span class="lineno">  438</span>     imgWriterEst.image2geo(0,irow,geox,geoy);</div>
+<div class="line"><a name="l00439"></a><span class="lineno">  439</span>     imgReaderModel1.geo2image(geox,geoy,modCol,modRow);</div>
+<div class="line"><a name="l00440"></a><span class="lineno">  440</span>     <span class="keywordflow">if</span>(modRow<0||modRow>=imgReaderModel1.nrOfRow()){</div>
+<div class="line"><a name="l00441"></a><span class="lineno">  441</span>       cerr << <span class="stringliteral">"Error: geo coordinates ("</span> << geox << <span class="stringliteral">","</span> << geoy << <span class="stringliteral">") not covered in model image "</span> << imgReaderModel1.getFileName() << endl;</div>
+<div class="line"><a name="l00442"></a><span class="lineno">  442</span>       assert(modRow>=0&&modRow<imgReaderModel1.nrOfRow());</div>
+<div class="line"><a name="l00443"></a><span class="lineno">  443</span>     }</div>
+<div class="line"><a name="l00444"></a><span class="lineno">  444</span>     <span class="keywordflow">try</span>{</div>
+<div class="line"><a name="l00445"></a><span class="lineno">  445</span>       imgReaderModel1.readData(estReadBuffer,GDT_Float64,modRow);</div>
+<div class="line"><a name="l00446"></a><span class="lineno">  446</span>       <span class="comment">//simple nearest neighbor</span></div>
+<div class="line"><a name="l00447"></a><span class="lineno">  447</span>       <span class="comment">//stat.nearUp(estReadBuffer,estWriteBuffer);</span></div>
+<div class="line"><a name="l00448"></a><span class="lineno">  448</span> </div>
+<div class="line"><a name="l00449"></a><span class="lineno">  449</span>       <span class="comment">// double oldRowMask=-1;//keep track of row mask to optimize number of line readings</span></div>
+<div class="line"><a name="l00450"></a><span class="lineno">  450</span>       <span class="keywordflow">for</span>(<span class="keywordtype">int</span> icol=0;icol<ncol;++icol){</div>
+<div class="line"><a name="l00451"></a><span class="lineno">  451</span>         imgWriterEst.image2geo(icol,irow,geox,geoy);</div>
+<div class="line"><a name="l00452"></a><span class="lineno">  452</span>         imgReaderModel1.geo2image(geox,geoy,modCol,modRow);</div>
+<div class="line"><a name="l00453"></a><span class="lineno">  453</span>         <span class="keywordtype">double</span> modValue=estReadBuffer[modCol];</div>
+<div class="line"><a name="l00454"></a><span class="lineno">  454</span>         <span class="keywordflow">if</span>(imgReaderModel1.isNoData(modValue)){</div>
+<div class="line"><a name="l00455"></a><span class="lineno">  455</span>           estWriteBuffer[icol]=obsnodata_opt[0];</div>
+<div class="line"><a name="l00456"></a><span class="lineno">  456</span>           uncertWriteBuffer[icol]=uncertNodata_opt[0];</div>
+<div class="line"><a name="l00457"></a><span class="lineno">  457</span>           gainWriteBuffer[icol]=obsnodata_opt[0];</div>
+<div class="line"><a name="l00458"></a><span class="lineno">  458</span>         }</div>
+<div class="line"><a name="l00459"></a><span class="lineno">  459</span>         <span class="keywordflow">else</span>{</div>
+<div class="line"><a name="l00460"></a><span class="lineno">  460</span>           <span class="comment">//todo: should take into account regression model-obs...</span></div>
+<div class="line"><a name="l00461"></a><span class="lineno">  461</span>           estWriteBuffer[icol]=modValue;</div>
+<div class="line"><a name="l00462"></a><span class="lineno">  462</span>           uncertWriteBuffer[icol]=uncertModel_opt[0]*stdDev;</div>
+<div class="line"><a name="l00463"></a><span class="lineno">  463</span>           gainWriteBuffer[icol]=0;</div>
+<div class="line"><a name="l00464"></a><span class="lineno">  464</span>         }</div>
+<div class="line"><a name="l00465"></a><span class="lineno">  465</span>       }</div>
+<div class="line"><a name="l00466"></a><span class="lineno">  466</span>       imgWriterEst.writeData(estWriteBuffer,GDT_Float64,irow,0);</div>
+<div class="line"><a name="l00467"></a><span class="lineno">  467</span>       imgWriterEst.writeData(uncertWriteBuffer,GDT_Float64,irow,1);</div>
+<div class="line"><a name="l00468"></a><span class="lineno">  468</span>       <span class="keywordflow">if</span>(gain_opt.size())</div>
+<div class="line"><a name="l00469"></a><span class="lineno">  469</span>          imgWriterGain.writeData(gainWriteBuffer,GDT_Float64,irow,0);</div>
+<div class="line"><a name="l00470"></a><span class="lineno">  470</span>     }</div>
+<div class="line"><a name="l00471"></a><span class="lineno">  471</span>     <span class="keywordflow">catch</span>(<span class="keywordtype">string</span> errorString){</div>
+<div class="line"><a name="l00472"></a><span class="lineno">  472</span>       cerr << errorString << endl;</div>
+<div class="line"><a name="l00473"></a><span class="lineno">  473</span>     }</div>
+<div class="line"><a name="l00474"></a><span class="lineno">  474</span>     <span class="keywordflow">catch</span>(...){</div>
+<div class="line"><a name="l00475"></a><span class="lineno">  475</span>       cerr << <span class="stringliteral">"Error writing file "</span> << imgWriterEst.getFileName() << endl;</div>
+<div class="line"><a name="l00476"></a><span class="lineno">  476</span>     }</div>
+<div class="line"><a name="l00477"></a><span class="lineno">  477</span>       }</div>
+<div class="line"><a name="l00478"></a><span class="lineno">  478</span>     }</div>
+<div class="line"><a name="l00479"></a><span class="lineno">  479</span>     <span class="keywordflow">else</span>{<span class="comment">//we have a measurement</span></div>
+<div class="line"><a name="l00480"></a><span class="lineno">  480</span>       <span class="keywordflow">if</span>(verbose_opt[0])</div>
+<div class="line"><a name="l00481"></a><span class="lineno">  481</span>     cout << <span class="stringliteral">"we have a measurement at initial time"</span> << endl;</div>
+<div class="line"><a name="l00482"></a><span class="lineno">  482</span>       imgReaderObs.open(observation_opt[0]);</div>
+<div class="line"><a name="l00483"></a><span class="lineno">  483</span>       imgReaderObs.getGeoTransform(geotransform);</div>
+<div class="line"><a name="l00484"></a><span class="lineno">  484</span>       imgReaderObs.setNoData(obsnodata_opt);</div>
+<div class="line"><a name="l00485"></a><span class="lineno">  485</span>       <span class="keywordflow">if</span>(obsoffset_opt.size())</div>
+<div class="line"><a name="l00486"></a><span class="lineno">  486</span>     imgReaderObs.setOffset(obsoffset_opt[0]);</div>
+<div class="line"><a name="l00487"></a><span class="lineno">  487</span>       <span class="keywordflow">if</span>(obsscale_opt.size())</div>
+<div class="line"><a name="l00488"></a><span class="lineno">  488</span>     imgReaderObs.setScale(obsscale_opt[0]);</div>
+<div class="line"><a name="l00489"></a><span class="lineno">  489</span> </div>
+<div class="line"><a name="l00490"></a><span class="lineno">  490</span>       <span class="keywordflow">if</span>(regSensor_opt[0]>0){</div>
+<div class="line"><a name="l00491"></a><span class="lineno">  491</span>     errObs=regSensor_opt[0]*imgreg.getRMSE(imgReaderModel1,imgReaderObs,c0obs,c1obs,0,0,verbose_opt[0]);</div>
+<div class="line"><a name="l00492"></a><span class="lineno">  492</span>     <span class="keywordflow">if</span>(errObs<0){</div>
+<div class="line"><a name="l00493"></a><span class="lineno">  493</span>       <span class="comment">// c0obs=0;</span></div>
+<div class="line"><a name="l00494"></a><span class="lineno">  494</span>       <span class="comment">// c1obs=1;</span></div>
+<div class="line"><a name="l00495"></a><span class="lineno">  495</span>       c0obs=c0obs_prev;</div>
+<div class="line"><a name="l00496"></a><span class="lineno">  496</span>       c1obs=c1obs_prev;</div>
+<div class="line"><a name="l00497"></a><span class="lineno">  497</span>     }</div>
+<div class="line"><a name="l00498"></a><span class="lineno">  498</span>     <span class="keywordflow">else</span>{</div>
+<div class="line"><a name="l00499"></a><span class="lineno">  499</span>       c0obs_prev=c0obs;</div>
+<div class="line"><a name="l00500"></a><span class="lineno">  500</span>       c1obs_prev=c1obs;</div>
+<div class="line"><a name="l00501"></a><span class="lineno">  501</span>     }</div>
+<div class="line"><a name="l00502"></a><span class="lineno">  502</span>       }</div>
+<div class="line"><a name="l00503"></a><span class="lineno">  503</span>       <span class="keywordflow">else</span>{</div>
+<div class="line"><a name="l00504"></a><span class="lineno">  504</span>     c0obs=0;</div>
+<div class="line"><a name="l00505"></a><span class="lineno">  505</span>     c1obs=1;</div>
+<div class="line"><a name="l00506"></a><span class="lineno">  506</span>     errObs=0;</div>
+<div class="line"><a name="l00507"></a><span class="lineno">  507</span>       }</div>
+<div class="line"><a name="l00508"></a><span class="lineno">  508</span>       <span class="keywordflow">if</span>(verbose_opt[0])</div>
+<div class="line"><a name="l00509"></a><span class="lineno">  509</span>     cout << <span class="stringliteral">"c0obs, c1obs: "</span> << c0obs << <span class="stringliteral">", "</span> << c1obs << endl;</div>
+<div class="line"><a name="l00510"></a><span class="lineno">  510</span> </div>
+<div class="line"><a name="l00511"></a><span class="lineno">  511</span>       <span class="keywordflow">for</span>(<span class="keywordtype">int</span> irow=0;irow<nrow;++irow){</div>
+<div class="line"><a name="l00512"></a><span class="lineno">  512</span>     vector<double> estReadBuffer;</div>
+<div class="line"><a name="l00513"></a><span class="lineno">  513</span>     imgWriterEst.image2geo(0,irow,geox,geoy);</div>
+<div class="line"><a name="l00514"></a><span class="lineno">  514</span>     imgReaderModel1.geo2image(geox,geoy,modCol,modRow);</div>
+<div class="line"><a name="l00515"></a><span class="lineno">  515</span>     assert(modRow>=0&&modRow<imgReaderModel1.nrOfRow());</div>
+<div class="line"><a name="l00516"></a><span class="lineno">  516</span>     imgReaderModel1.readData(estReadBuffer,GDT_Float64,modRow);</div>
+<div class="line"><a name="l00517"></a><span class="lineno">  517</span>     vector<double> obsLineBuffer;</div>
+<div class="line"><a name="l00518"></a><span class="lineno">  518</span>     vector<double> estWriteBuffer(ncol);</div>
+<div class="line"><a name="l00519"></a><span class="lineno">  519</span>     vector<double> uncertWriteBuffer(ncol);</div>
+<div class="line"><a name="l00520"></a><span class="lineno">  520</span>     vector<double> uncertObsLineBuffer;</div>
+<div class="line"><a name="l00521"></a><span class="lineno">  521</span>     <span class="comment">//test</span></div>
+<div class="line"><a name="l00522"></a><span class="lineno">  522</span>     vector<double> gainWriteBuffer(ncol);</div>
+<div class="line"><a name="l00523"></a><span class="lineno">  523</span>     <span class="comment">// vector<double> lineMask;</span></div>
+<div class="line"><a name="l00524"></a><span class="lineno">  524</span>     <span class="comment">// imgReaderObs.readData(estWriteBuffer,GDT_Float64,irow,0);</span></div>
+<div class="line"><a name="l00525"></a><span class="lineno">  525</span>     imgReaderObs.readData(obsLineBuffer,GDT_Float64,irow,0);</div>
+<div class="line"><a name="l00526"></a><span class="lineno">  526</span>     </div>
+<div class="line"><a name="l00527"></a><span class="lineno">  527</span>     <span class="keywordflow">if</span>(imgReaderObs.nrOfBand()>1)</div>
+<div class="line"><a name="l00528"></a><span class="lineno">  528</span>       imgReaderObs.readData(uncertObsLineBuffer,GDT_Float64,irow,1);</div>
+<div class="line"><a name="l00529"></a><span class="lineno">  529</span>     <span class="comment">// double oldRowMask=-1;//keep track of row mask to optimize number of line readings</span></div>
+<div class="line"><a name="l00530"></a><span class="lineno">  530</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> icol=0;icol<ncol;++icol){</div>
+<div class="line"><a name="l00531"></a><span class="lineno">  531</span>       imgWriterEst.image2geo(icol,irow,geox,geoy);</div>
+<div class="line"><a name="l00532"></a><span class="lineno">  532</span>       imgReaderModel1.geo2image(geox,geoy,modCol,modRow);</div>
+<div class="line"><a name="l00533"></a><span class="lineno">  533</span>       assert(modRow>=0&&modRow<imgReaderModel1.nrOfRow());</div>
+<div class="line"><a name="l00534"></a><span class="lineno">  534</span>       <span class="keywordtype">double</span> modValue=estReadBuffer[modCol];</div>
+<div class="line"><a name="l00535"></a><span class="lineno">  535</span>       <span class="keywordflow">if</span>(imgReaderModel1.isNoData(modValue)){<span class="comment">//model is nodata: retain observation </span></div>
+<div class="line"><a name="l00536"></a><span class="lineno">  536</span>         estWriteBuffer[icol]=obsLineBuffer[icol];</div>
+<div class="line"><a name="l00537"></a><span class="lineno">  537</span>         <span class="keywordflow">if</span>(imgReaderObs.isNoData(obsLineBuffer[icol])){</div>
+<div class="line"><a name="l00538"></a><span class="lineno">  538</span>           estWriteBuffer[icol]=obsnodata_opt[0];</div>
+<div class="line"><a name="l00539"></a><span class="lineno">  539</span>           uncertWriteBuffer[icol]=uncertNodata_opt[0];</div>
+<div class="line"><a name="l00540"></a><span class="lineno">  540</span>           gainWriteBuffer[icol]=obsnodata_opt[0];</div>
+<div class="line"><a name="l00541"></a><span class="lineno">  541</span>         }</div>
+<div class="line"><a name="l00542"></a><span class="lineno">  542</span>         <span class="keywordflow">else</span> <span class="keywordflow">if</span>(uncertObsLineBuffer.size()>icol)</div>
+<div class="line"><a name="l00543"></a><span class="lineno">  543</span>           uncertWriteBuffer[icol]=uncertObsLineBuffer[icol];</div>
+<div class="line"><a name="l00544"></a><span class="lineno">  544</span>         <span class="keywordflow">else</span></div>
+<div class="line"><a name="l00545"></a><span class="lineno">  545</span>           uncertWriteBuffer[icol]=uncertObs_opt[0];</div>
+<div class="line"><a name="l00546"></a><span class="lineno">  546</span>         <span class="comment">//test</span></div>
+<div class="line"><a name="l00547"></a><span class="lineno">  547</span>         <span class="keywordflow">if</span>(!imgReaderObs.isNoData(estWriteBuffer[icol])){</div>
+<div class="line"><a name="l00548"></a><span class="lineno">  548</span>           <span class="keywordflow">if</span>(obsmin_opt.size())</div>
+<div class="line"><a name="l00549"></a><span class="lineno">  549</span>         assert(estWriteBuffer[icol]>=obsmin_opt[0]);</div>
+<div class="line"><a name="l00550"></a><span class="lineno">  550</span>           <span class="keywordflow">if</span>(obsmax_opt.size()){</div>
+<div class="line"><a name="l00551"></a><span class="lineno">  551</span>         <span class="keywordflow">if</span>(estWriteBuffer[icol]>obsmax_opt[0]){</div>
+<div class="line"><a name="l00552"></a><span class="lineno">  552</span>           cout << <span class="stringliteral">"estWriteBuffer[icol], obsLineBuffer[icol], irow, icol: "</span> << estWriteBuffer[icol] << <span class="stringliteral">", "</span> << obsLineBuffer[icol] << <span class="stringliteral">", "</span> << irow << <span class="stringliteral">", "</span> << icol << endl;</div>
+<div class="line"><a name="l00553"></a><span class="lineno">  553</span>           assert(estWriteBuffer[icol]<=obsmax_opt[0]);</div>
+<div class="line"><a name="l00554"></a><span class="lineno">  554</span>         }</div>
+<div class="line"><a name="l00555"></a><span class="lineno">  555</span>           }</div>
+<div class="line"><a name="l00556"></a><span class="lineno">  556</span>         }</div>
+<div class="line"><a name="l00557"></a><span class="lineno">  557</span>       }</div>
+<div class="line"><a name="l00558"></a><span class="lineno">  558</span>       <span class="keywordflow">else</span>{<span class="comment">//model is valid: calculate estimate from model</span></div>
+<div class="line"><a name="l00559"></a><span class="lineno">  559</span>         <span class="keywordtype">double</span> errMod=uncertModel_opt[0]*stdDev;</div>
+<div class="line"><a name="l00560"></a><span class="lineno">  560</span>         errMod*=regTime_opt[0];</div>
+<div class="line"><a name="l00561"></a><span class="lineno">  561</span>         <span class="comment">// double certNorm=(errMod*errMod+errObs*errObs);</span></div>
+<div class="line"><a name="l00562"></a><span class="lineno">  562</span>         <span class="comment">// double certMod=errObs*errObs/certNorm;</span></div>
+<div class="line"><a name="l00563"></a><span class="lineno">  563</span>         <span class="comment">// double certObs=errMod*errMod/certNorm;</span></div>
+<div class="line"><a name="l00564"></a><span class="lineno">  564</span>         <span class="comment">// double regTime=0;</span></div>
+<div class="line"><a name="l00565"></a><span class="lineno">  565</span>         <span class="comment">// double regSensor=(c0obs+c1obs*modValue)*certMod;</span></div>
+<div class="line"><a name="l00566"></a><span class="lineno">  566</span>         <span class="comment">// estWriteBuffer[icol]=regTime+regSensor;</span></div>
+<div class="line"><a name="l00567"></a><span class="lineno">  567</span>         estWriteBuffer[icol]=modValue;</div>
+<div class="line"><a name="l00568"></a><span class="lineno">  568</span>         <span class="keywordtype">double</span> totalUncertainty=errMod;</div>
+<div class="line"><a name="l00569"></a><span class="lineno">  569</span>         <span class="comment">// if(errMod<eps_opt[0])</span></div>
+<div class="line"><a name="l00570"></a><span class="lineno">  570</span>         <span class="comment">//   totalUncertainty=errObs;</span></div>
+<div class="line"><a name="l00571"></a><span class="lineno">  571</span>         <span class="comment">// else if(errObs<eps_opt[0])</span></div>
+<div class="line"><a name="l00572"></a><span class="lineno">  572</span>         <span class="comment">//   totalUncertainty=errMod;</span></div>
+<div class="line"><a name="l00573"></a><span class="lineno">  573</span>         <span class="comment">// else{</span></div>
+<div class="line"><a name="l00574"></a><span class="lineno">  574</span>         <span class="comment">//   totalUncertainty=1.0/errMod/errMod+1/errObs/errObs;</span></div>
+<div class="line"><a name="l00575"></a><span class="lineno">  575</span>         <span class="comment">//   totalUncertainty=sqrt(1.0/totalUncertainty);</span></div>
+<div class="line"><a name="l00576"></a><span class="lineno">  576</span>         <span class="comment">// }</span></div>
+<div class="line"><a name="l00577"></a><span class="lineno">  577</span>         uncertWriteBuffer[icol]=totalUncertainty;<span class="comment">//in case observation is not valid</span></div>
+<div class="line"><a name="l00578"></a><span class="lineno">  578</span>         gainWriteBuffer[icol]=0;</div>
+<div class="line"><a name="l00579"></a><span class="lineno">  579</span>         <span class="comment">//test</span></div>
+<div class="line"><a name="l00580"></a><span class="lineno">  580</span>         <span class="keywordflow">if</span>(!imgReaderObs.isNoData(estWriteBuffer[icol])){</div>
+<div class="line"><a name="l00581"></a><span class="lineno">  581</span>           <span class="keywordflow">if</span>(obsmin_opt.size())</div>
+<div class="line"><a name="l00582"></a><span class="lineno">  582</span>         assert(estWriteBuffer[icol]>=obsmin_opt[0]);</div>
+<div class="line"><a name="l00583"></a><span class="lineno">  583</span>           <span class="keywordflow">if</span>(obsmax_opt.size()){</div>
+<div class="line"><a name="l00584"></a><span class="lineno">  584</span>         <span class="keywordflow">if</span>(estWriteBuffer[icol]>obsmax_opt[0]){</div>
+<div class="line"><a name="l00585"></a><span class="lineno">  585</span>           cout << <span class="stringliteral">"estWriteBuffer[icol], irow, icol: "</span> << estWriteBuffer[icol] << <span class="stringliteral">", "</span> << irow << <span class="stringliteral">", "</span> << icol << endl;</div>
+<div class="line"><a name="l00586"></a><span class="lineno">  586</span>           assert(estWriteBuffer[icol]<=obsmax_opt[0]);</div>
+<div class="line"><a name="l00587"></a><span class="lineno">  587</span>         }</div>
+<div class="line"><a name="l00588"></a><span class="lineno">  588</span>           }</div>
+<div class="line"><a name="l00589"></a><span class="lineno">  589</span>         }</div>
+<div class="line"><a name="l00590"></a><span class="lineno">  590</span>       }</div>
+<div class="line"><a name="l00591"></a><span class="lineno">  591</span>       <span class="comment">// uncertWriteBuffer[icol]+=uncertReadBuffer[icol];</span></div>
+<div class="line"><a name="l00592"></a><span class="lineno">  592</span>       <span class="comment">//measurement update</span></div>
+<div class="line"><a name="l00593"></a><span class="lineno">  593</span>       <span class="keywordflow">if</span>(!imgReaderObs.isNoData(obsLineBuffer[icol])){</div>
+<div class="line"><a name="l00594"></a><span class="lineno">  594</span>         <span class="keywordtype">double</span> kalmanGain=1;</div>
+<div class="line"><a name="l00595"></a><span class="lineno">  595</span>         <span class="keywordtype">double</span> uncertObs=uncertObs_opt[0];</div>
+<div class="line"><a name="l00596"></a><span class="lineno">  596</span>         <span class="keywordflow">if</span>(uncertObsLineBuffer.size()>icol)</div>
+<div class="line"><a name="l00597"></a><span class="lineno">  597</span>           uncertObs=uncertObsLineBuffer[icol];</div>
+<div class="line"><a name="l00598"></a><span class="lineno">  598</span>         <span class="keywordflow">else</span> <span class="keywordflow">if</span>(weight_opt.size()||deltaObs_opt.size()){</div>
+<div class="line"><a name="l00599"></a><span class="lineno">  599</span>           vector<double> obsWindowBuffer;<span class="comment">//buffer for observation to calculate average corresponding to model pixel</span></div>
+<div class="line"><a name="l00600"></a><span class="lineno">  600</span>           <span class="keywordtype">int</span> minCol=(icol>down_opt[0]/2) ? icol-down_opt[0]/2 : 0;</div>
+<div class="line"><a name="l00601"></a><span class="lineno">  601</span>           <span class="keywordtype">int</span> maxCol=(icol+down_opt[0]/2<imgReaderObs.nrOfCol()) ? icol+down_opt[0]/2 : imgReaderObs.nrOfCol()-1;</div>
+<div class="line"><a name="l00602"></a><span class="lineno">  602</span>           <span class="keywordtype">int</span> minRow=(irow>down_opt[0]/2) ? irow-down_opt[0]/2 : 0;</div>
+<div class="line"><a name="l00603"></a><span class="lineno">  603</span>           <span class="keywordtype">int</span> maxRow=(irow+down_opt[0]/2<imgReaderObs.nrOfRow()) ? irow+down_opt[0]/2 : imgReaderObs.nrOfRow()-1;</div>
+<div class="line"><a name="l00604"></a><span class="lineno">  604</span>         </div>
+<div class="line"><a name="l00605"></a><span class="lineno">  605</span>           imgReaderObs.readDataBlock(obsWindowBuffer,GDT_Float64,minCol,maxCol,minRow,maxRow,0);</div>
+<div class="line"><a name="l00606"></a><span class="lineno">  606</span>           <a class="code" href="classstatfactory_1_1StatFactory.html">statfactory::StatFactory</a> statobs;</div>
+<div class="line"><a name="l00607"></a><span class="lineno">  607</span>           statobs.setNoDataValues(obsnodata_opt);</div>
+<div class="line"><a name="l00608"></a><span class="lineno">  608</span>           <span class="keywordtype">double</span> obsMeanValue=(statobs.mean(obsWindowBuffer)-c0obs)/c1obs;</div>
+<div class="line"><a name="l00609"></a><span class="lineno">  609</span>           <span class="keywordtype">double</span> difference=obsMeanValue-modValue;</div>
+<div class="line"><a name="l00610"></a><span class="lineno">  610</span>           <span class="keywordflow">if</span>(modValue){</div>
+<div class="line"><a name="l00611"></a><span class="lineno">  611</span>         <span class="keywordtype">double</span> relativeDifference=difference/modValue;</div>
+<div class="line"><a name="l00612"></a><span class="lineno">  612</span>         <span class="keywordflow">if</span>(deltaObs_opt.size()){</div>
+<div class="line"><a name="l00613"></a><span class="lineno">  613</span>           assert(deltaObs_opt.size()>1);</div>
+<div class="line"><a name="l00614"></a><span class="lineno">  614</span>           <span class="keywordflow">if</span>(100*relativeDifference<deltaObs_opt[0])<span class="comment">//lower bound</span></div>
+<div class="line"><a name="l00615"></a><span class="lineno">  615</span>             kalmanGain=0;</div>
+<div class="line"><a name="l00616"></a><span class="lineno">  616</span>           <span class="keywordflow">else</span> <span class="keywordflow">if</span>(100*relativeDifference>deltaObs_opt[1])<span class="comment">//upper bound</span></div>
+<div class="line"><a name="l00617"></a><span class="lineno">  617</span>             kalmanGain=0;</div>
+<div class="line"><a name="l00618"></a><span class="lineno">  618</span>         }</div>
+<div class="line"><a name="l00619"></a><span class="lineno">  619</span>         <span class="keywordflow">else</span> <span class="keywordflow">if</span>(weight_opt.size()){</div>
+<div class="line"><a name="l00620"></a><span class="lineno">  620</span>           assert(weight_opt.size()>1);</div>
+<div class="line"><a name="l00621"></a><span class="lineno">  621</span>           <span class="keywordflow">if</span>(obsMeanValue<modValue)</div>
+<div class="line"><a name="l00622"></a><span class="lineno">  622</span>             uncertObs=-weight_opt[0]*relativeDifference;</div>
+<div class="line"><a name="l00623"></a><span class="lineno">  623</span>           <span class="keywordflow">else</span> <span class="keywordflow">if</span>(obsMeanValue>modValue)</div>
+<div class="line"><a name="l00624"></a><span class="lineno">  624</span>             uncertObs=weight_opt[1]*relativeDifference;</div>
+<div class="line"><a name="l00625"></a><span class="lineno">  625</span>         }</div>
+<div class="line"><a name="l00626"></a><span class="lineno">  626</span>           }</div>
+<div class="line"><a name="l00627"></a><span class="lineno">  627</span>           <span class="keywordflow">if</span>(uncertObs<=0)</div>
+<div class="line"><a name="l00628"></a><span class="lineno">  628</span>         uncertObs=0;</div>
+<div class="line"><a name="l00629"></a><span class="lineno">  629</span>           <span class="keywordflow">if</span>(verbose_opt[0]>1)</div>
+<div class="line"><a name="l00630"></a><span class="lineno">  630</span>         cout << <span class="stringliteral">"obsMeanValue:"</span> << obsMeanValue << <span class="stringliteral">", modValue: "</span> << modValue << endl;</div>
+<div class="line"><a name="l00631"></a><span class="lineno">  631</span>         }</div>
+<div class="line"><a name="l00632"></a><span class="lineno">  632</span>         <span class="keywordflow">if</span>(kalmanGain>0){</div>
+<div class="line"><a name="l00633"></a><span class="lineno">  633</span>           <span class="keywordflow">if</span>((uncertWriteBuffer[icol]+uncertObs)>eps_opt[0])</div>
+<div class="line"><a name="l00634"></a><span class="lineno">  634</span>         kalmanGain=uncertWriteBuffer[icol]/(uncertWriteBuffer[icol]+uncertObs);</div>
+<div class="line"><a name="l00635"></a><span class="lineno">  635</span>         }</div>
+<div class="line"><a name="l00636"></a><span class="lineno">  636</span>         assert(kalmanGain<=1);</div>
+<div class="line"><a name="l00637"></a><span class="lineno">  637</span>         estWriteBuffer[icol]+=kalmanGain*(obsLineBuffer[icol]-estWriteBuffer[icol]);</div>
+<div class="line"><a name="l00638"></a><span class="lineno">  638</span>         <span class="keywordflow">if</span>(obsmin_opt.size()){</div>
+<div class="line"><a name="l00639"></a><span class="lineno">  639</span>           <span class="keywordflow">if</span>(estWriteBuffer[icol]<obsmin_opt[0])</div>
+<div class="line"><a name="l00640"></a><span class="lineno">  640</span>         estWriteBuffer[icol]=obsnodata_opt[0];</div>
+<div class="line"><a name="l00641"></a><span class="lineno">  641</span>         }</div>
+<div class="line"><a name="l00642"></a><span class="lineno">  642</span>         <span class="keywordflow">if</span>(obsmax_opt.size()){</div>
+<div class="line"><a name="l00643"></a><span class="lineno">  643</span>           <span class="keywordflow">if</span>(estWriteBuffer[icol]>obsmax_opt[0])</div>
+<div class="line"><a name="l00644"></a><span class="lineno">  644</span>         estWriteBuffer[icol]=obsnodata_opt[0];</div>
+<div class="line"><a name="l00645"></a><span class="lineno">  645</span>         }</div>
+<div class="line"><a name="l00646"></a><span class="lineno">  646</span>         uncertWriteBuffer[icol]*=(1-kalmanGain);</div>
+<div class="line"><a name="l00647"></a><span class="lineno">  647</span>         <span class="comment">//test</span></div>
+<div class="line"><a name="l00648"></a><span class="lineno">  648</span>         gainWriteBuffer[icol]=kalmanGain;</div>
+<div class="line"><a name="l00649"></a><span class="lineno">  649</span>         <span class="comment">//test</span></div>
+<div class="line"><a name="l00650"></a><span class="lineno">  650</span>         <span class="keywordflow">if</span>(!imgReaderObs.isNoData(estWriteBuffer[icol])){</div>
+<div class="line"><a name="l00651"></a><span class="lineno">  651</span>           <span class="keywordflow">if</span>(obsmin_opt.size())</div>
+<div class="line"><a name="l00652"></a><span class="lineno">  652</span>         assert(estWriteBuffer[icol]>=obsmin_opt[0]);</div>
+<div class="line"><a name="l00653"></a><span class="lineno">  653</span>           <span class="keywordflow">if</span>(obsmax_opt.size()){</div>
+<div class="line"><a name="l00654"></a><span class="lineno">  654</span>         <span class="keywordflow">if</span>(estWriteBuffer[icol]>obsmax_opt[0]){</div>
+<div class="line"><a name="l00655"></a><span class="lineno">  655</span>           cout << <span class="stringliteral">"estWriteBuffer[icol], irow, icol: "</span> << estWriteBuffer[icol] << <span class="stringliteral">", "</span> << irow << <span class="stringliteral">", "</span> << icol << endl;</div>
+<div class="line"><a name="l00656"></a><span class="lineno">  656</span>           assert(estWriteBuffer[icol]<=obsmax_opt[0]);</div>
+<div class="line"><a name="l00657"></a><span class="lineno">  657</span>         }</div>
+<div class="line"><a name="l00658"></a><span class="lineno">  658</span>           }</div>
+<div class="line"><a name="l00659"></a><span class="lineno">  659</span>         }</div>
+<div class="line"><a name="l00660"></a><span class="lineno">  660</span>       }</div>
+<div class="line"><a name="l00661"></a><span class="lineno">  661</span>       <span class="comment">//test</span></div>
+<div class="line"><a name="l00662"></a><span class="lineno">  662</span>       <span class="keywordflow">if</span>(!imgReaderObs.isNoData(estWriteBuffer[icol])){</div>
+<div class="line"><a name="l00663"></a><span class="lineno">  663</span>         <span class="keywordflow">if</span>(obsmin_opt.size())</div>
+<div class="line"><a name="l00664"></a><span class="lineno">  664</span>           assert(estWriteBuffer[icol]>=obsmin_opt[0]);</div>
+<div class="line"><a name="l00665"></a><span class="lineno">  665</span>         <span class="keywordflow">if</span>(obsmax_opt.size()){</div>
+<div class="line"><a name="l00666"></a><span class="lineno">  666</span>           <span class="keywordflow">if</span>(estWriteBuffer[icol]>obsmax_opt[0]){</div>
+<div class="line"><a name="l00667"></a><span class="lineno">  667</span>         cout << <span class="stringliteral">"estWriteBuffer[icol], irow, icol: "</span> << estWriteBuffer[icol] << <span class="stringliteral">", "</span> << irow << <span class="stringliteral">", "</span> << icol << endl;</div>
+<div class="line"><a name="l00668"></a><span class="lineno">  668</span>           assert(estWriteBuffer[icol]<=obsmax_opt[0]);</div>
+<div class="line"><a name="l00669"></a><span class="lineno">  669</span>           }</div>
+<div class="line"><a name="l00670"></a><span class="lineno">  670</span>         }</div>
+<div class="line"><a name="l00671"></a><span class="lineno">  671</span>       }</div>
+<div class="line"><a name="l00672"></a><span class="lineno">  672</span>     }</div>
+<div class="line"><a name="l00673"></a><span class="lineno">  673</span>     imgWriterEst.writeData(estWriteBuffer,GDT_Float64,irow,0);</div>
+<div class="line"><a name="l00674"></a><span class="lineno">  674</span>     imgWriterEst.writeData(uncertWriteBuffer,GDT_Float64,irow,1);</div>
+<div class="line"><a name="l00675"></a><span class="lineno">  675</span>     <span class="keywordflow">if</span>(gain_opt.size())</div>
+<div class="line"><a name="l00676"></a><span class="lineno">  676</span>       imgWriterGain.writeData(gainWriteBuffer,GDT_Float64,irow,0);</div>
+<div class="line"><a name="l00677"></a><span class="lineno">  677</span>       }</div>
+<div class="line"><a name="l00678"></a><span class="lineno">  678</span>       imgReaderObs.close();</div>
+<div class="line"><a name="l00679"></a><span class="lineno">  679</span>       ++obsindex;</div>
+<div class="line"><a name="l00680"></a><span class="lineno">  680</span>     }</div>
+<div class="line"><a name="l00681"></a><span class="lineno">  681</span>     imgReaderModel1.close();</div>
+<div class="line"><a name="l00682"></a><span class="lineno">  682</span>     imgWriterEst.close();</div>
+<div class="line"><a name="l00683"></a><span class="lineno">  683</span> </div>
+<div class="line"><a name="l00684"></a><span class="lineno">  684</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> modindex=1;modindex<model_opt.size();++modindex){</div>
+<div class="line"><a name="l00685"></a><span class="lineno">  685</span>       <span class="keywordflow">if</span>(verbose_opt[0]){</div>
+<div class="line"><a name="l00686"></a><span class="lineno">  686</span>     cout << <span class="stringliteral">"processing time "</span> << tmodel_opt[modindex] << endl;</div>
+<div class="line"><a name="l00687"></a><span class="lineno">  687</span>     <span class="keywordflow">if</span>(obsindex<relobsindex.size())</div>
+<div class="line"><a name="l00688"></a><span class="lineno">  688</span>       cout << <span class="stringliteral">"next observation "</span> << tmodel_opt[relobsindex[obsindex]] << endl;</div>
+<div class="line"><a name="l00689"></a><span class="lineno">  689</span>     <span class="keywordflow">else</span></div>
+<div class="line"><a name="l00690"></a><span class="lineno">  690</span>       cout << <span class="stringliteral">"There is no next observation"</span> << endl;</div>
+<div class="line"><a name="l00691"></a><span class="lineno">  691</span>       }</div>
+<div class="line"><a name="l00692"></a><span class="lineno">  692</span>       <span class="keywordtype">string</span> output;</div>
+<div class="line"><a name="l00693"></a><span class="lineno">  693</span>       <span class="keywordflow">if</span>(outputfw_opt.size()==model_opt.size())</div>
+<div class="line"><a name="l00694"></a><span class="lineno">  694</span>     output=outputfw_opt[modindex];</div>
+<div class="line"><a name="l00695"></a><span class="lineno">  695</span>       <span class="keywordflow">else</span>{</div>
+<div class="line"><a name="l00696"></a><span class="lineno">  696</span>     ostringstream outputstream;</div>
+<div class="line"><a name="l00697"></a><span class="lineno">  697</span>     outputstream << outputfw_opt[0] << <span class="stringliteral">"_"</span>;</div>
+<div class="line"><a name="l00698"></a><span class="lineno">  698</span>     outputstream << setfill(<span class="charliteral">'0'</span>) << setw(ndigit) << tmodel_opt[modindex];</div>
+<div class="line"><a name="l00699"></a><span class="lineno">  699</span>     outputstream << <span class="stringliteral">".tif"</span>;</div>
+<div class="line"><a name="l00700"></a><span class="lineno">  700</span>     <span class="comment">// outputstream << outputfw_opt[0] << "_" << tmodel_opt[modindex] << ".tif";</span></div>
+<div class="line"><a name="l00701"></a><span class="lineno">  701</span>     output=outputstream.str();</div>
+<div class="line"><a name="l00702"></a><span class="lineno">  702</span>       }</div>
+<div class="line"><a name="l00703"></a><span class="lineno">  703</span>     </div>
+<div class="line"><a name="l00704"></a><span class="lineno">  704</span>       <span class="comment">//two band output band0=estimation, band1=uncertainty</span></div>
+<div class="line"><a name="l00705"></a><span class="lineno">  705</span>       imgWriterEst.open(output,ncol,nrow,2,GDT_Float64,imageType,option_opt);</div>
+<div class="line"><a name="l00706"></a><span class="lineno">  706</span>       imgWriterEst.setProjectionProj4(projection_opt[0]);</div>
+<div class="line"><a name="l00707"></a><span class="lineno">  707</span>       imgWriterEst.setGeoTransform(geotransform);</div>
+<div class="line"><a name="l00708"></a><span class="lineno">  708</span>       imgWriterEst.GDALSetNoDataValue(obsnodata_opt[0]);</div>
+<div class="line"><a name="l00709"></a><span class="lineno">  709</span> </div>
+<div class="line"><a name="l00710"></a><span class="lineno">  710</span>       <span class="comment">//calculate regression between two subsequence model inputs</span></div>
+<div class="line"><a name="l00711"></a><span class="lineno">  711</span>       imgReaderModel1.open(model_opt[modindex-1]);</div>
+<div class="line"><a name="l00712"></a><span class="lineno">  712</span>       imgReaderModel1.setNoData(modnodata_opt);</div>
+<div class="line"><a name="l00713"></a><span class="lineno">  713</span>       <span class="keywordflow">if</span>(modoffset_opt.size())</div>
+<div class="line"><a name="l00714"></a><span class="lineno">  714</span>     imgReaderModel1.setOffset(modoffset_opt[0]);</div>
+<div class="line"><a name="l00715"></a><span class="lineno">  715</span>       <span class="keywordflow">if</span>(modscale_opt.size())</div>
+<div class="line"><a name="l00716"></a><span class="lineno">  716</span>     imgReaderModel1.setScale(modscale_opt[0]);</div>
+<div class="line"><a name="l00717"></a><span class="lineno">  717</span>       imgReaderModel2.open(model_opt[modindex]);</div>
+<div class="line"><a name="l00718"></a><span class="lineno">  718</span>       <span class="keywordflow">for</span>(<span class="keywordtype">int</span> inodata=0;inodata<modnodata_opt.size();++inodata)</div>
+<div class="line"><a name="l00719"></a><span class="lineno">  719</span>     imgReaderModel2.pushNoDataValue(modnodata_opt[inodata]);</div>
+<div class="line"><a name="l00720"></a><span class="lineno">  720</span>       <span class="comment">// imgReaderModel2.setNoData(modnodata_opt);</span></div>
+<div class="line"><a name="l00721"></a><span class="lineno">  721</span>       <span class="keywordflow">if</span>(modoffset_opt.size())</div>
+<div class="line"><a name="l00722"></a><span class="lineno">  722</span>     imgReaderModel2.setOffset(modoffset_opt[0]);</div>
+<div class="line"><a name="l00723"></a><span class="lineno">  723</span>       <span class="keywordflow">if</span>(modscale_opt.size())</div>
+<div class="line"><a name="l00724"></a><span class="lineno">  724</span>     imgReaderModel2.setScale(modscale_opt[0]);</div>
+<div class="line"><a name="l00725"></a><span class="lineno">  725</span>       <span class="comment">//calculate regression</span></div>
+<div class="line"><a name="l00726"></a><span class="lineno">  726</span>       <span class="comment">//we could re-use the points from second image from last run, but</span></div>
+<div class="line"><a name="l00727"></a><span class="lineno">  727</span>       <span class="comment">//to keep it general, we must redo it (overlap might have changed)</span></div>
+<div class="line"><a name="l00728"></a><span class="lineno">  728</span>     </div>
+<div class="line"><a name="l00729"></a><span class="lineno">  729</span>       pfnProgress(progress,pszMessage,pProgressArg);</div>
+<div class="line"><a name="l00730"></a><span class="lineno">  730</span> </div>
+<div class="line"><a name="l00731"></a><span class="lineno">  731</span>       <span class="keywordflow">if</span>(verbose_opt[0])</div>
+<div class="line"><a name="l00732"></a><span class="lineno">  732</span>     cout << <span class="stringliteral">"Calculating regression for "</span> << imgReaderModel1.getFileName() << <span class="stringliteral">" "</span> << imgReaderModel2.getFileName() << endl;</div>
+<div class="line"><a name="l00733"></a><span class="lineno">  733</span>       </div>
+<div class="line"><a name="l00734"></a><span class="lineno">  734</span>       <span class="keywordtype">double</span> errMod=imgreg.getRMSE(imgReaderModel1,imgReaderModel2,c0modGlobal,c1modGlobal,0,0);</div>
+<div class="line"><a name="l00735"></a><span class="lineno">  735</span>       <span class="keywordflow">if</span>(verbose_opt[0])</div>
+<div class="line"><a name="l00736"></a><span class="lineno">  736</span>     cout << <span class="stringliteral">"c0modGlobal, c1modGlobal, errMod: "</span> << c0modGlobal << <span class="stringliteral">", "</span> << c1modGlobal << <span class="stringliteral">", "</span> << errMod << endl;</div>
+<div class="line"><a name="l00737"></a><span class="lineno">  737</span>       <span class="keywordflow">if</span>(c0modGlobal>c0modGlobalMax_opt[0]||c0modGlobal<c0modGlobalMin_opt[0]||c1modGlobal>c1modGlobalMax_opt[0]||c1modGlobal<c1modGlobalMin_opt[0]||errMod!=errMod){</div>
+<div class="line"><a name="l00738"></a><span class="lineno">  738</span>     c0modGlobal=c0modGlobal_prev;</div>
+<div class="line"><a name="l00739"></a><span class="lineno">  739</span>     c1modGlobal=c1modGlobal_prev;</div>
+<div class="line"><a name="l00740"></a><span class="lineno">  740</span>     errMod=uncertModel_opt[0]*stdDev;</div>
+<div class="line"><a name="l00741"></a><span class="lineno">  741</span>       }</div>
+<div class="line"><a name="l00742"></a><span class="lineno">  742</span>       <span class="keywordflow">else</span>{</div>
+<div class="line"><a name="l00743"></a><span class="lineno">  743</span>     c0modGlobal_prev=c0modGlobal;</div>
+<div class="line"><a name="l00744"></a><span class="lineno">  744</span>     c1modGlobal_prev=c1modGlobal;</div>
+<div class="line"><a name="l00745"></a><span class="lineno">  745</span>     errMod*=regTime_opt[0];</div>
+<div class="line"><a name="l00746"></a><span class="lineno">  746</span>       }</div>
+<div class="line"><a name="l00747"></a><span class="lineno">  747</span> </div>
+<div class="line"><a name="l00748"></a><span class="lineno">  748</span>       <span class="comment">// double errMod=imgreg.getRMSE(imgReaderModel1,imgReaderModel2,c0modGlobal,c1modGlobal,verbose_opt[0]);</span></div>
+<div class="line"><a name="l00749"></a><span class="lineno">  749</span>       <span class="keywordflow">if</span>(verbose_opt[0])</div>
+<div class="line"><a name="l00750"></a><span class="lineno">  750</span>     cout << <span class="stringliteral">"c0modGlobal, c1modGlobal, errMod: "</span> << c0modGlobal << <span class="stringliteral">", "</span> << c1modGlobal << <span class="stringliteral">", "</span> << errMod << endl;</div>
+<div class="line"><a name="l00751"></a><span class="lineno">  751</span> </div>
+<div class="line"><a name="l00752"></a><span class="lineno">  752</span>       <span class="keywordtype">bool</span> update=<span class="keyword">false</span>;</div>
+<div class="line"><a name="l00753"></a><span class="lineno">  753</span>       <span class="keywordflow">if</span>(obsindex<relobsindex.size()){</div>
+<div class="line"><a name="l00754"></a><span class="lineno">  754</span>     update=(relobsindex[obsindex]==modindex);</div>
+<div class="line"><a name="l00755"></a><span class="lineno">  755</span>       }</div>
+<div class="line"><a name="l00756"></a><span class="lineno">  756</span>       <span class="keywordflow">if</span>(update){</div>
+<div class="line"><a name="l00757"></a><span class="lineno">  757</span>     <span class="keywordflow">if</span>(verbose_opt[0])</div>
+<div class="line"><a name="l00758"></a><span class="lineno">  758</span>       cout << <span class="stringliteral">"***update "</span> << relobsindex[obsindex] << <span class="stringliteral">" = "</span> << modindex << <span class="stringliteral">" "</span> << observation_opt[obsindex] << <span class="stringliteral">" ***"</span> << endl;</div>
+<div class="line"><a name="l00759"></a><span class="lineno">  759</span> </div>
+<div class="line"><a name="l00760"></a><span class="lineno">  760</span>     imgReaderObs.open(observation_opt[obsindex]);</div>
+<div class="line"><a name="l00761"></a><span class="lineno">  761</span>     imgReaderObs.getGeoTransform(geotransform);</div>
+<div class="line"><a name="l00762"></a><span class="lineno">  762</span>     imgReaderObs.setNoData(obsnodata_opt);</div>
+<div class="line"><a name="l00763"></a><span class="lineno">  763</span>     <span class="keywordflow">if</span>(obsoffset_opt.size())</div>
+<div class="line"><a name="l00764"></a><span class="lineno">  764</span>       imgReaderObs.setOffset(obsoffset_opt[0]);</div>
+<div class="line"><a name="l00765"></a><span class="lineno">  765</span>     <span class="keywordflow">if</span>(obsscale_opt.size())</div>
+<div class="line"><a name="l00766"></a><span class="lineno">  766</span>       imgReaderObs.setScale(obsscale_opt[0]);</div>
+<div class="line"><a name="l00767"></a><span class="lineno">  767</span>     <span class="comment">//calculate regression between model and observation</span></div>
+<div class="line"><a name="l00768"></a><span class="lineno">  768</span>     <span class="keywordflow">if</span>(verbose_opt[0])</div>
+<div class="line"><a name="l00769"></a><span class="lineno">  769</span>       cout << <span class="stringliteral">"Calculating regression for "</span> << imgReaderModel2.getFileName() << <span class="stringliteral">" "</span> << imgReaderObs.getFileName() << endl;</div>
+<div class="line"><a name="l00770"></a><span class="lineno">  770</span>     <span class="keywordflow">if</span>(regSensor_opt[0]>0){</div>
+<div class="line"><a name="l00771"></a><span class="lineno">  771</span>       errObs=regSensor_opt[0]*imgreg.getRMSE(imgReaderModel2,imgReaderObs,c0obs,c1obs,0,0,verbose_opt[0]);</div>
+<div class="line"><a name="l00772"></a><span class="lineno">  772</span>       <span class="keywordflow">if</span>(errObs<0||errObs!=errObs){</div>
+<div class="line"><a name="l00773"></a><span class="lineno">  773</span>         <span class="comment">// c0obs=0;</span></div>
+<div class="line"><a name="l00774"></a><span class="lineno">  774</span>         <span class="comment">// c1obs=1;</span></div>
+<div class="line"><a name="l00775"></a><span class="lineno">  775</span>         c0obs=c0obs_prev;</div>
+<div class="line"><a name="l00776"></a><span class="lineno">  776</span>         c1obs=c1obs_prev;</div>
+<div class="line"><a name="l00777"></a><span class="lineno">  777</span>       }</div>
+<div class="line"><a name="l00778"></a><span class="lineno">  778</span>       <span class="keywordflow">else</span>{</div>
+<div class="line"><a name="l00779"></a><span class="lineno">  779</span>         c0obs_prev=c0obs;</div>
+<div class="line"><a name="l00780"></a><span class="lineno">  780</span>         c1obs_prev=c1obs;</div>
+<div class="line"><a name="l00781"></a><span class="lineno">  781</span>       }</div>
+<div class="line"><a name="l00782"></a><span class="lineno">  782</span>     }</div>
+<div class="line"><a name="l00783"></a><span class="lineno">  783</span>     <span class="keywordflow">else</span>{</div>
+<div class="line"><a name="l00784"></a><span class="lineno">  784</span>       c0obs=0;</div>
+<div class="line"><a name="l00785"></a><span class="lineno">  785</span>       c1obs=1;</div>
+<div class="line"><a name="l00786"></a><span class="lineno">  786</span>       errObs=0;</div>
+<div class="line"><a name="l00787"></a><span class="lineno">  787</span>     }</div>
+<div class="line"><a name="l00788"></a><span class="lineno">  788</span>     <span class="keywordflow">if</span>(verbose_opt[0])</div>
+<div class="line"><a name="l00789"></a><span class="lineno">  789</span>       cout << <span class="stringliteral">"c0obs, c1obs, errObs: "</span> << c0obs << <span class="stringliteral">", "</span> << c1obs << <span class="stringliteral">", "</span> << errObs << endl;</div>
+<div class="line"><a name="l00790"></a><span class="lineno">  790</span>       }</div>
+<div class="line"><a name="l00791"></a><span class="lineno">  791</span>       <span class="comment">//prediction (also to fill cloudy pixels in update mode)</span></div>
+<div class="line"><a name="l00792"></a><span class="lineno">  792</span>       <span class="keywordtype">string</span> input;</div>
+<div class="line"><a name="l00793"></a><span class="lineno">  793</span>       <span class="keywordflow">if</span>(outputfw_opt.size()==model_opt.size())</div>
+<div class="line"><a name="l00794"></a><span class="lineno">  794</span>     input=outputfw_opt[modindex-1];</div>
+<div class="line"><a name="l00795"></a><span class="lineno">  795</span>       <span class="keywordflow">else</span>{</div>
+<div class="line"><a name="l00796"></a><span class="lineno">  796</span>     ostringstream outputstream;</div>
+<div class="line"><a name="l00797"></a><span class="lineno">  797</span>     outputstream << outputfw_opt[0] << <span class="stringliteral">"_"</span>;</div>
+<div class="line"><a name="l00798"></a><span class="lineno">  798</span>     outputstream << setfill(<span class="charliteral">'0'</span>) << setw(ndigit) << tmodel_opt[modindex-1];</div>
+<div class="line"><a name="l00799"></a><span class="lineno">  799</span>     outputstream << <span class="stringliteral">".tif"</span>;</div>
+<div class="line"><a name="l00800"></a><span class="lineno">  800</span>     <span class="comment">// outputstream << outputfw_opt[0] << "_" << tmodel_opt[modindex-1] << ".tif";</span></div>
+<div class="line"><a name="l00801"></a><span class="lineno">  801</span>     input=outputstream.str();</div>
+<div class="line"><a name="l00802"></a><span class="lineno">  802</span>       }</div>
+<div class="line"><a name="l00803"></a><span class="lineno">  803</span>       <span class="keywordflow">if</span>(verbose_opt[0])</div>
+<div class="line"><a name="l00804"></a><span class="lineno">  804</span>     cout << <span class="stringliteral">"opening "</span> << input << endl;</div>
+<div class="line"><a name="l00805"></a><span class="lineno">  805</span>       <a class="code" href="classImgReaderGdal.html">ImgReaderGdal</a> imgReaderEst(input);</div>
+<div class="line"><a name="l00806"></a><span class="lineno">  806</span>       imgReaderEst.setNoData(obsnodata_opt);</div>
+<div class="line"><a name="l00807"></a><span class="lineno">  807</span>       <span class="keywordflow">if</span>(obsoffset_opt.size())</div>
+<div class="line"><a name="l00808"></a><span class="lineno">  808</span>     imgReaderEst.setOffset(obsoffset_opt[0]);</div>
+<div class="line"><a name="l00809"></a><span class="lineno">  809</span>       <span class="keywordflow">if</span>(obsscale_opt.size())</div>
+<div class="line"><a name="l00810"></a><span class="lineno">  810</span>     imgReaderEst.setScale(obsscale_opt[0]);</div>
+<div class="line"><a name="l00811"></a><span class="lineno">  811</span>       </div>
+<div class="line"><a name="l00812"></a><span class="lineno">  812</span>       vector< vector<double> > obsLineVector(down_opt[0]);</div>
+<div class="line"><a name="l00813"></a><span class="lineno">  813</span>       vector<double> obsLineBuffer;</div>
+<div class="line"><a name="l00814"></a><span class="lineno">  814</span>       vector<double> obsWindowBuffer;<span class="comment">//buffer for observation to calculate average corresponding to model pixel</span></div>
+<div class="line"><a name="l00815"></a><span class="lineno">  815</span>       vector<double> model1LineBuffer;</div>
+<div class="line"><a name="l00816"></a><span class="lineno">  816</span>       vector<double> model2LineBuffer;</div>
+<div class="line"><a name="l00817"></a><span class="lineno">  817</span>       vector<double> model1buffer;<span class="comment">//buffer for model 1 to calculate time regression based on window</span></div>
+<div class="line"><a name="l00818"></a><span class="lineno">  818</span>       vector<double> model2buffer;<span class="comment">//buffer for model 2 to calculate time regression based on window</span></div>
+<div class="line"><a name="l00819"></a><span class="lineno">  819</span>       vector<double> uncertObsLineBuffer;</div>
+<div class="line"><a name="l00820"></a><span class="lineno">  820</span>       vector<double> estReadBuffer;</div>
+<div class="line"><a name="l00821"></a><span class="lineno">  821</span>       <span class="comment">// vector<double> estWindowBuffer;//buffer for estimate to calculate average corresponding to model pixel</span></div>
+<div class="line"><a name="l00822"></a><span class="lineno">  822</span>       vector<double> uncertReadBuffer;</div>
+<div class="line"><a name="l00823"></a><span class="lineno">  823</span>       vector<double> estWriteBuffer(ncol);</div>
+<div class="line"><a name="l00824"></a><span class="lineno">  824</span>       vector<double> uncertWriteBuffer(ncol);</div>
+<div class="line"><a name="l00825"></a><span class="lineno">  825</span>       vector<double> gainWriteBuffer(ncol);</div>
+<div class="line"><a name="l00826"></a><span class="lineno">  826</span>       <span class="comment">// vector<double> lineMask;</span></div>
+<div class="line"><a name="l00827"></a><span class="lineno">  827</span> </div>
+<div class="line"><a name="l00828"></a><span class="lineno">  828</span>       <span class="comment">//initialize obsLineVector if update</span></div>
+<div class="line"><a name="l00829"></a><span class="lineno">  829</span>       <span class="keywordflow">if</span>(update){</div>
+<div class="line"><a name="l00830"></a><span class="lineno">  830</span>     <span class="keywordflow">if</span>(verbose_opt[0])</div>
+<div class="line"><a name="l00831"></a><span class="lineno">  831</span>       cout << <span class="stringliteral">"initialize obsLineVector"</span> << endl;</div>
+<div class="line"><a name="l00832"></a><span class="lineno">  832</span>     assert(down_opt[0]%2);<span class="comment">//window size must be odd </span></div>
+<div class="line"><a name="l00833"></a><span class="lineno">  833</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iline=-down_opt[0]/2;iline<down_opt[0]/2+1;++iline){</div>
+<div class="line"><a name="l00834"></a><span class="lineno">  834</span>       <span class="keywordflow">if</span>(iline<0)<span class="comment">//replicate line 0</span></div>
+<div class="line"><a name="l00835"></a><span class="lineno">  835</span>         imgReaderObs.readData(obsLineVector[iline+down_opt[0]/2],GDT_Float64,0,0);</div>
+<div class="line"><a name="l00836"></a><span class="lineno">  836</span>       <span class="keywordflow">else</span></div>
+<div class="line"><a name="l00837"></a><span class="lineno">  837</span>         imgReaderObs.readData(obsLineVector[iline+down_opt[0]/2],GDT_Float64,iline,0);</div>
+<div class="line"><a name="l00838"></a><span class="lineno">  838</span>     }</div>
+<div class="line"><a name="l00839"></a><span class="lineno">  839</span>       }</div>
+<div class="line"><a name="l00840"></a><span class="lineno">  840</span>       <span class="keywordflow">for</span>(<span class="keywordtype">int</span> irow=0;irow<imgWriterEst.nrOfRow();++irow){</div>
+<div class="line"><a name="l00841"></a><span class="lineno">  841</span>     <span class="comment">//do not read from imgReaderObs, because we read entire window for each pixel...</span></div>
+<div class="line"><a name="l00842"></a><span class="lineno">  842</span>     imgReaderEst.readData(estReadBuffer,GDT_Float64,irow,0);</div>
+<div class="line"><a name="l00843"></a><span class="lineno">  843</span>     imgReaderEst.readData(uncertReadBuffer,GDT_Float64,irow,1);</div>
+<div class="line"><a name="l00844"></a><span class="lineno">  844</span>     <span class="comment">//read model2 in case current estimate is nodata</span></div>
+<div class="line"><a name="l00845"></a><span class="lineno">  845</span>     imgReaderEst.image2geo(0,irow,geox,geoy);</div>
+<div class="line"><a name="l00846"></a><span class="lineno">  846</span>     imgReaderModel2.geo2image(geox,geoy,modCol,modRow);</div>
+<div class="line"><a name="l00847"></a><span class="lineno">  847</span>     assert(modRow>=0&&modRow<imgReaderModel2.nrOfRow());</div>
+<div class="line"><a name="l00848"></a><span class="lineno">  848</span>     imgReaderModel2.readData(model2LineBuffer,GDT_Float64,modRow,0);</div>
+<div class="line"><a name="l00849"></a><span class="lineno">  849</span> </div>
+<div class="line"><a name="l00850"></a><span class="lineno">  850</span>     imgReaderModel1.geo2image(geox,geoy,modCol,modRow);</div>
+<div class="line"><a name="l00851"></a><span class="lineno">  851</span>     assert(modRow>=0&&modRow<imgReaderModel1.nrOfRow());</div>
+<div class="line"><a name="l00852"></a><span class="lineno">  852</span>     imgReaderModel1.readData(model1LineBuffer,GDT_Float64,modRow,0);</div>
+<div class="line"><a name="l00853"></a><span class="lineno">  853</span> </div>
+<div class="line"><a name="l00854"></a><span class="lineno">  854</span>     <span class="keywordflow">if</span>(update){</div>
+<div class="line"><a name="l00855"></a><span class="lineno">  855</span>       <span class="keywordtype">int</span> maxRow=(irow+down_opt[0]/2<imgReaderEst.nrOfRow()) ? irow+down_opt[0]/2 : imgReaderEst.nrOfRow()-1;</div>
+<div class="line"><a name="l00856"></a><span class="lineno">  856</span>       obsLineVector.erase(obsLineVector.begin());</div>
+<div class="line"><a name="l00857"></a><span class="lineno">  857</span>       imgReaderObs.readData(obsLineBuffer,GDT_Float64,maxRow,0);</div>
+<div class="line"><a name="l00858"></a><span class="lineno">  858</span>       obsLineVector.push_back(obsLineBuffer);</div>
+<div class="line"><a name="l00859"></a><span class="lineno">  859</span>       obsLineBuffer=obsLineVector[down_opt[0]/2];</div>
+<div class="line"><a name="l00860"></a><span class="lineno">  860</span>       <span class="comment">// imgReaderObs.readData(obsLineBuffer,GDT_Float64,irow,0);</span></div>
+<div class="line"><a name="l00861"></a><span class="lineno">  861</span>       <span class="keywordflow">if</span>(imgReaderObs.nrOfBand()>1)</div>
+<div class="line"><a name="l00862"></a><span class="lineno">  862</span>         imgReaderObs.readData(uncertObsLineBuffer,GDT_Float64,irow,1);</div>
+<div class="line"><a name="l00863"></a><span class="lineno">  863</span>     }</div>
+<div class="line"><a name="l00864"></a><span class="lineno">  864</span>     <span class="comment">// double oldRowMask=-1;//keep track of row mask to optimize number of line readings</span></div>
+<div class="line"><a name="l00865"></a><span class="lineno">  865</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> icol=0;icol<imgWriterEst.nrOfCol();++icol){</div>
+<div class="line"><a name="l00866"></a><span class="lineno">  866</span>       imgReaderEst.image2geo(icol,irow,geox,geoy);</div>
+<div class="line"><a name="l00867"></a><span class="lineno">  867</span>       <span class="keywordtype">int</span> minCol=(icol>down_opt[0]/2) ? icol-down_opt[0]/2 : 0;</div>
+<div class="line"><a name="l00868"></a><span class="lineno">  868</span>       <span class="keywordtype">int</span> maxCol=(icol+down_opt[0]/2<imgReaderEst.nrOfCol()) ? icol+down_opt[0]/2 : imgReaderEst.nrOfCol()-1;</div>
+<div class="line"><a name="l00869"></a><span class="lineno">  869</span>       <span class="keywordtype">int</span> minRow=(irow>down_opt[0]/2) ? irow-down_opt[0]/2 : 0;</div>
+<div class="line"><a name="l00870"></a><span class="lineno">  870</span>       <span class="keywordtype">int</span> maxRow=(irow+down_opt[0]/2<imgReaderEst.nrOfRow()) ? irow+down_opt[0]/2 : imgReaderEst.nrOfRow()-1;</div>
+<div class="line"><a name="l00871"></a><span class="lineno">  871</span>       <span class="keywordflow">if</span>(update){</div>
+<div class="line"><a name="l00872"></a><span class="lineno">  872</span>         obsWindowBuffer.clear();</div>
+<div class="line"><a name="l00873"></a><span class="lineno">  873</span>         <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iline=0;iline<obsLineVector.size();++iline){</div>
+<div class="line"><a name="l00874"></a><span class="lineno">  874</span>           <span class="keywordflow">for</span>(<span class="keywordtype">int</span> isample=minCol;isample<=maxCol;++isample){</div>
+<div class="line"><a name="l00875"></a><span class="lineno">  875</span>         assert(isample<obsLineVector[iline].size());</div>
+<div class="line"><a name="l00876"></a><span class="lineno">  876</span>         obsWindowBuffer.push_back(obsLineVector[iline][isample]);</div>
+<div class="line"><a name="l00877"></a><span class="lineno">  877</span>           }</div>
+<div class="line"><a name="l00878"></a><span class="lineno">  878</span>         }</div>
+<div class="line"><a name="l00879"></a><span class="lineno">  879</span>         <span class="comment">// imgReaderObs.readDataBlock(obsWindowBuffer,GDT_Float64,minCol,maxCol,minRow,maxRow,0);</span></div>
+<div class="line"><a name="l00880"></a><span class="lineno">  880</span>       }</div>
+<div class="line"><a name="l00881"></a><span class="lineno">  881</span>       <span class="keywordtype">double</span> estValue=estReadBuffer[icol];</div>
+<div class="line"><a name="l00882"></a><span class="lineno">  882</span>       <span class="keywordtype">double</span> estMeanValue=0;<span class="comment">//stat.mean(estWindowBuffer);</span></div>
+<div class="line"><a name="l00883"></a><span class="lineno">  883</span>       <span class="keywordtype">double</span> nvalid=0;</div>
+<div class="line"><a name="l00884"></a><span class="lineno">  884</span>       <span class="comment">//time update</span></div>
+<div class="line"><a name="l00885"></a><span class="lineno">  885</span>       imgReaderModel2.geo2image(geox,geoy,modCol,modRow);</div>
+<div class="line"><a name="l00886"></a><span class="lineno">  886</span>       assert(modRow>=0&&modRow<imgReaderModel2.nrOfRow());</div>
+<div class="line"><a name="l00887"></a><span class="lineno">  887</span>       <span class="keywordtype">double</span> modValue=model2LineBuffer[modCol];</div>
+<div class="line"><a name="l00888"></a><span class="lineno">  888</span>       <span class="keywordtype">bool</span> estNodata=imgReaderEst.isNoData(estValue);<span class="comment">//validity of current estimate</span></div>
+<div class="line"><a name="l00889"></a><span class="lineno">  889</span>       <span class="keywordflow">if</span>(estNodata){</div>
+<div class="line"><a name="l00890"></a><span class="lineno">  890</span>         <span class="comment">//we have not found any valid data yet, better here to take the current model value if valid</span></div>
+<div class="line"><a name="l00891"></a><span class="lineno">  891</span>         <span class="keywordflow">if</span>(imgReaderModel2.isNoData(modValue)){<span class="comment">//if both estimate and model are no-data, set obs to nodata</span></div>
+<div class="line"><a name="l00892"></a><span class="lineno">  892</span>           estWriteBuffer[icol]=obsnodata_opt[0];</div>
+<div class="line"><a name="l00893"></a><span class="lineno">  893</span>           uncertWriteBuffer[icol]=uncertNodata_opt[0];</div>
+<div class="line"><a name="l00894"></a><span class="lineno">  894</span>           gainWriteBuffer[icol]=0;</div>
+<div class="line"><a name="l00895"></a><span class="lineno">  895</span>         }</div>
+<div class="line"><a name="l00896"></a><span class="lineno">  896</span>         <span class="keywordflow">else</span>{</div>
+<div class="line"><a name="l00897"></a><span class="lineno">  897</span>           estWriteBuffer[icol]=modValue;</div>
+<div class="line"><a name="l00898"></a><span class="lineno">  898</span>           uncertWriteBuffer[icol]=uncertModel_opt[0]*stdDev;</div>
+<div class="line"><a name="l00899"></a><span class="lineno">  899</span>           gainWriteBuffer[icol]=0;</div>
+<div class="line"><a name="l00900"></a><span class="lineno">  900</span>         }</div>
+<div class="line"><a name="l00901"></a><span class="lineno">  901</span>         <span class="comment">//test</span></div>
+<div class="line"><a name="l00902"></a><span class="lineno">  902</span>         <span class="keywordflow">if</span>(!imgReaderObs.isNoData(estWriteBuffer[icol])){</div>
+<div class="line"><a name="l00903"></a><span class="lineno">  903</span>           <span class="keywordflow">if</span>(obsmin_opt.size()){</div>
+<div class="line"><a name="l00904"></a><span class="lineno">  904</span>         <span class="keywordflow">if</span>(estWriteBuffer[icol]<obsmin_opt[0])</div>
+<div class="line"><a name="l00905"></a><span class="lineno">  905</span>           cout << <span class="stringliteral">"estWriteBuffer[icol], icol, irow"</span> << estWriteBuffer[icol] << <span class="stringliteral">", "</span> << icol << <span class="stringliteral">", "</span> << irow << endl;</div>
+<div class="line"><a name="l00906"></a><span class="lineno">  906</span>         assert(estWriteBuffer[icol]>=obsmin_opt[0]);</div>
+<div class="line"><a name="l00907"></a><span class="lineno">  907</span>           }</div>
+<div class="line"><a name="l00908"></a><span class="lineno">  908</span>           <span class="keywordflow">if</span>(obsmax_opt.size()){</div>
+<div class="line"><a name="l00909"></a><span class="lineno">  909</span>         assert(estWriteBuffer[icol]<=obsmax_opt[0]);</div>
+<div class="line"><a name="l00910"></a><span class="lineno">  910</span>         <span class="keywordflow">if</span>(estWriteBuffer[icol]<obsmin_opt[0])</div>
+<div class="line"><a name="l00911"></a><span class="lineno">  911</span>           cout << <span class="stringliteral">"estWriteBuffer[icol], modValue, icol, irow"</span> << estWriteBuffer[icol] << <span class="stringliteral">", "</span> << modValue << <span class="stringliteral">", "</span> << icol << <span class="stringliteral">", "</span> << irow << endl;</div>
+<div class="line"><a name="l00912"></a><span class="lineno">  912</span>           }</div>
+<div class="line"><a name="l00913"></a><span class="lineno">  913</span>         }</div>
+<div class="line"><a name="l00914"></a><span class="lineno">  914</span>       }</div>
+<div class="line"><a name="l00915"></a><span class="lineno">  915</span>       <span class="keywordflow">else</span>{</div>
+<div class="line"><a name="l00916"></a><span class="lineno">  916</span>         <span class="keywordflow">if</span>(window_opt[0]>0){</div>
+<div class="line"><a name="l00917"></a><span class="lineno">  917</span>           <span class="keywordflow">try</span>{</div>
+<div class="line"><a name="l00918"></a><span class="lineno">  918</span>         <span class="comment">// imgReaderModel2.geo2image(geox,geoy,modCol,modRow);//did that already</span></div>
+<div class="line"><a name="l00919"></a><span class="lineno">  919</span>         minCol=(modCol>window_opt[0]/2) ? modCol-window_opt[0]/2 : 0;</div>
+<div class="line"><a name="l00920"></a><span class="lineno">  920</span>         maxCol=(modCol+window_opt[0]/2<imgReaderModel2.nrOfCol()) ? modCol+window_opt[0]/2 : imgReaderModel2.nrOfCol()-1;</div>
+<div class="line"><a name="l00921"></a><span class="lineno">  921</span>         minRow=(modRow>window_opt[0]/2) ? modRow-window_opt[0]/2 : 0;</div>
+<div class="line"><a name="l00922"></a><span class="lineno">  922</span>         maxRow=(modRow+window_opt[0]/2<imgReaderModel2.nrOfRow()) ? modRow+window_opt[0]/2 : imgReaderModel2.nrOfRow()-1;</div>
+<div class="line"><a name="l00923"></a><span class="lineno">  923</span>         imgReaderModel2.readDataBlock(model2buffer,GDT_Float64,minCol,maxCol,minRow,maxRow,0);</div>
+<div class="line"><a name="l00924"></a><span class="lineno">  924</span> </div>
+<div class="line"><a name="l00925"></a><span class="lineno">  925</span>         imgReaderModel1.geo2image(geox,geoy,modCol,modRow);</div>
+<div class="line"><a name="l00926"></a><span class="lineno">  926</span>         assert(modRow>=0&&modRow<imgReaderModel1.nrOfRow());</div>
+<div class="line"><a name="l00927"></a><span class="lineno">  927</span>         minCol=(modCol>window_opt[0]/2) ? modCol-window_opt[0]/2 : 0;</div>
+<div class="line"><a name="l00928"></a><span class="lineno">  928</span>         maxCol=(modCol+window_opt[0]/2<imgReaderModel1.nrOfCol()) ? modCol+window_opt[0]/2 : imgReaderModel1.nrOfCol()-1;</div>
+<div class="line"><a name="l00929"></a><span class="lineno">  929</span>         minRow=(modRow>window_opt[0]/2) ? modRow-window_opt[0]/2 : 0;</div>
+<div class="line"><a name="l00930"></a><span class="lineno">  930</span>         maxRow=(modRow+window_opt[0]/2<imgReaderModel1.nrOfRow()) ? modRow+window_opt[0]/2 : imgReaderModel1.nrOfRow()-1;</div>
+<div class="line"><a name="l00931"></a><span class="lineno">  931</span>         imgReaderModel1.readDataBlock(model1buffer,GDT_Float64,minCol,maxCol,minRow,maxRow,0);</div>
+<div class="line"><a name="l00932"></a><span class="lineno">  932</span>         <span class="comment">// imgReaderEst.image2geo(icol,irow,geox,geoy);</span></div>
+<div class="line"><a name="l00933"></a><span class="lineno">  933</span>           }</div>
+<div class="line"><a name="l00934"></a><span class="lineno">  934</span>           <span class="keywordflow">catch</span>(<span class="keywordtype">string</span> errorString){</div>
+<div class="line"><a name="l00935"></a><span class="lineno">  935</span>         cerr << <span class="stringliteral">"Error reading data block for "</span> << minCol << <span class="stringliteral">"-"</span> << maxCol << <span class="stringliteral">", "</span> << minRow << <span class="stringliteral">"-"</span> << maxRow << endl;</div>
+<div class="line"><a name="l00936"></a><span class="lineno">  936</span>           }</div>
+<div class="line"><a name="l00937"></a><span class="lineno">  937</span>           <span class="comment">//erase no-data from buffer</span></div>
+<div class="line"><a name="l00938"></a><span class="lineno">  938</span>           vector<double>::iterator it1=model1buffer.begin();</div>
+<div class="line"><a name="l00939"></a><span class="lineno">  939</span>           vector<double>::iterator it2=model2buffer.begin();</div>
+<div class="line"><a name="l00940"></a><span class="lineno">  940</span>           <span class="keywordflow">while</span>(it1!=model1buffer.end()&&it2!=model2buffer.end()){</div>
+<div class="line"><a name="l00941"></a><span class="lineno">  941</span>         <span class="comment">//erase nodata</span></div>
+<div class="line"><a name="l00942"></a><span class="lineno">  942</span>         <span class="keywordtype">bool</span> modNodata=<span class="keyword">false</span>;</div>
+<div class="line"><a name="l00943"></a><span class="lineno">  943</span>         modNodata=modNodata||imgReaderModel1.isNoData(*it1);</div>
+<div class="line"><a name="l00944"></a><span class="lineno">  944</span>         modNodata=modNodata||imgReaderModel2.isNoData(*it2);</div>
+<div class="line"><a name="l00945"></a><span class="lineno">  945</span>         <span class="keywordflow">if</span>(modNodata){</div>
+<div class="line"><a name="l00946"></a><span class="lineno">  946</span>           model1buffer.erase(it1);</div>
+<div class="line"><a name="l00947"></a><span class="lineno">  947</span>           model2buffer.erase(it2);</div>
+<div class="line"><a name="l00948"></a><span class="lineno">  948</span>         }</div>
+<div class="line"><a name="l00949"></a><span class="lineno">  949</span>         <span class="keywordflow">else</span>{</div>
+<div class="line"><a name="l00950"></a><span class="lineno">  950</span>           ++it1;</div>
+<div class="line"><a name="l00951"></a><span class="lineno">  951</span>           ++it2;</div>
+<div class="line"><a name="l00952"></a><span class="lineno">  952</span>         }</div>
+<div class="line"><a name="l00953"></a><span class="lineno">  953</span>           }</div>
+<div class="line"><a name="l00954"></a><span class="lineno">  954</span>           <span class="keywordflow">if</span>(model1buffer.size()>minreg_opt[0]&&model2buffer.size()>minreg_opt[0]){</div>
+<div class="line"><a name="l00955"></a><span class="lineno">  955</span>         errMod=stat.linear_regression_err(model1buffer,model2buffer,c0mod,c1mod);</div>
+<div class="line"><a name="l00956"></a><span class="lineno">  956</span>         errMod*=regTime_opt[0];</div>
+<div class="line"><a name="l00957"></a><span class="lineno">  957</span>           }</div>
+<div class="line"><a name="l00958"></a><span class="lineno">  958</span>           <span class="keywordflow">else</span>{<span class="comment">//use global regression...</span></div>
+<div class="line"><a name="l00959"></a><span class="lineno">  959</span>         c0mod=c0modGlobal;</div>
+<div class="line"><a name="l00960"></a><span class="lineno">  960</span>         c1mod=c1modGlobal;</div>
+<div class="line"><a name="l00961"></a><span class="lineno">  961</span>           }</div>
+<div class="line"><a name="l00962"></a><span class="lineno">  962</span>         }</div>
+<div class="line"><a name="l00963"></a><span class="lineno">  963</span>         <span class="keywordflow">else</span>{</div>
+<div class="line"><a name="l00964"></a><span class="lineno">  964</span>           c0mod=c0modGlobal;</div>
+<div class="line"><a name="l00965"></a><span class="lineno">  965</span>           c1mod=c1modGlobal;</div>
+<div class="line"><a name="l00966"></a><span class="lineno">  966</span>         }</div>
+<div class="line"><a name="l00967"></a><span class="lineno">  967</span>         <span class="keywordtype">double</span> regTime=c0mod+c1mod*estValue;</div>
+<div class="line"><a name="l00968"></a><span class="lineno">  968</span>         <span class="keywordtype">double</span> regSensor=c0obs+c1obs*modValue;</div>
+<div class="line"><a name="l00969"></a><span class="lineno">  969</span> </div>
+<div class="line"><a name="l00970"></a><span class="lineno">  970</span>         <span class="keywordflow">if</span>(regSensor_opt[0]<=0)</div>
+<div class="line"><a name="l00971"></a><span class="lineno">  971</span>           estWriteBuffer[icol]=regTime;</div>
+<div class="line"><a name="l00972"></a><span class="lineno">  972</span>         <span class="keywordflow">else</span>{</div>
+<div class="line"><a name="l00973"></a><span class="lineno">  973</span>           <span class="keywordtype">double</span> certMod=1;</div>
+<div class="line"><a name="l00974"></a><span class="lineno">  974</span>           <span class="keywordtype">double</span> certObs=1;</div>
+<div class="line"><a name="l00975"></a><span class="lineno">  975</span>           <span class="keywordtype">double</span> certNorm=(errMod*errMod+errObs*errObs);</div>
+<div class="line"><a name="l00976"></a><span class="lineno">  976</span>           <span class="keywordflow">if</span>(certNorm>eps_opt[0]){</div>
+<div class="line"><a name="l00977"></a><span class="lineno">  977</span>         certMod=errObs*errObs/certNorm;</div>
+<div class="line"><a name="l00978"></a><span class="lineno">  978</span>         certObs=errMod*errMod/certNorm;</div>
+<div class="line"><a name="l00979"></a><span class="lineno">  979</span>           }</div>
+<div class="line"><a name="l00980"></a><span class="lineno">  980</span>           <span class="keywordflow">else</span>{</div>
+<div class="line"><a name="l00981"></a><span class="lineno">  981</span>         certMod=0.5;</div>
+<div class="line"><a name="l00982"></a><span class="lineno">  982</span>         certObs=0.5;</div>
+<div class="line"><a name="l00983"></a><span class="lineno">  983</span>           }</div>
+<div class="line"><a name="l00984"></a><span class="lineno">  984</span>           estWriteBuffer[icol]=regTime*certObs+regSensor*certMod;</div>
+<div class="line"><a name="l00985"></a><span class="lineno">  985</span>         }         </div>
+<div class="line"><a name="l00986"></a><span class="lineno">  986</span>         <span class="comment">//test</span></div>
+<div class="line"><a name="l00987"></a><span class="lineno">  987</span>         <span class="comment">// if(regTime<regSensor){</span></div>
+<div class="line"><a name="l00988"></a><span class="lineno">  988</span>         <span class="comment">//   cout << "regTime = (" << c0mod << "+" << c1mod << "*" << estValue << ")*" << certObs << " = " << regTime << endl;</span></div>
+<div class="line"><a name="l00989"></a><span class="lineno">  989</span>         <span class="comment">//   cout << "regSensor = (" << c0obs << "+" << c1obs << "*" << modValue << ")*" << certMod << " = " << regSensor << endl;</span></div>
+<div class="line"><a name="l00990"></a><span class="lineno">  990</span>         <span class="comment">//   assert(regTime+regSensor>0);</span></div>
+<div class="line"><a name="l00991"></a><span class="lineno">  991</span>         <span class="comment">//   assert(regTime+regSensor<=1);</span></div>
+<div class="line"><a name="l00992"></a><span class="lineno">  992</span>         <span class="comment">// }</span></div>
+<div class="line"><a name="l00993"></a><span class="lineno">  993</span> </div>
+<div class="line"><a name="l00994"></a><span class="lineno">  994</span>         <span class="keywordflow">if</span>(obsmin_opt.size()){</div>
+<div class="line"><a name="l00995"></a><span class="lineno">  995</span>           <span class="keywordflow">if</span>(estWriteBuffer[icol]<obsmin_opt[0])</div>
+<div class="line"><a name="l00996"></a><span class="lineno">  996</span>         estWriteBuffer[icol]=obsnodata_opt[0];</div>
+<div class="line"><a name="l00997"></a><span class="lineno">  997</span>         }</div>
+<div class="line"><a name="l00998"></a><span class="lineno">  998</span>         <span class="keywordflow">if</span>(obsmax_opt.size()){</div>
+<div class="line"><a name="l00999"></a><span class="lineno">  999</span>           <span class="keywordflow">if</span>(estWriteBuffer[icol]>obsmax_opt[0])</div>
+<div class="line"><a name="l01000"></a><span class="lineno"> 1000</span>         estWriteBuffer[icol]=obsnodata_opt[0];</div>
+<div class="line"><a name="l01001"></a><span class="lineno"> 1001</span>         }</div>
+<div class="line"><a name="l01002"></a><span class="lineno"> 1002</span>         </div>
+<div class="line"><a name="l01003"></a><span class="lineno"> 1003</span>         <span class="keywordtype">double</span> totalUncertainty=0;</div>
+<div class="line"><a name="l01004"></a><span class="lineno"> 1004</span>         <span class="keywordflow">if</span>(errMod<eps_opt[0])</div>
+<div class="line"><a name="l01005"></a><span class="lineno"> 1005</span>           totalUncertainty=errObs;</div>
+<div class="line"><a name="l01006"></a><span class="lineno"> 1006</span>         <span class="keywordflow">else</span> <span class="keywordflow">if</span>(errObs<eps_opt[0])</div>
+<div class="line"><a name="l01007"></a><span class="lineno"> 1007</span>           totalUncertainty=errMod;</div>
+<div class="line"><a name="l01008"></a><span class="lineno"> 1008</span>         <span class="keywordflow">else</span>{</div>
+<div class="line"><a name="l01009"></a><span class="lineno"> 1009</span>           totalUncertainty=1.0/errMod/errMod+1/errObs/errObs;</div>
+<div class="line"><a name="l01010"></a><span class="lineno"> 1010</span>           totalUncertainty=sqrt(1.0/totalUncertainty);</div>
+<div class="line"><a name="l01011"></a><span class="lineno"> 1011</span>         }</div>
+<div class="line"><a name="l01012"></a><span class="lineno"> 1012</span>         uncertWriteBuffer[icol]=totalUncertainty+uncertReadBuffer[icol];</div>
+<div class="line"><a name="l01013"></a><span class="lineno"> 1013</span>         <span class="comment">//test</span></div>
+<div class="line"><a name="l01014"></a><span class="lineno"> 1014</span>         gainWriteBuffer[icol]=0;</div>
+<div class="line"><a name="l01015"></a><span class="lineno"> 1015</span>       }</div>
+<div class="line"><a name="l01016"></a><span class="lineno"> 1016</span>       <span class="comment">//measurement update</span></div>
+<div class="line"><a name="l01017"></a><span class="lineno"> 1017</span>       <span class="keywordflow">if</span>(update&&!imgReaderObs.isNoData(obsLineBuffer[icol])){</div>
+<div class="line"><a name="l01018"></a><span class="lineno"> 1018</span>         <span class="keywordtype">double</span> kalmanGain=1;</div>
+<div class="line"><a name="l01019"></a><span class="lineno"> 1019</span>         <span class="keywordtype">double</span> uncertObs=uncertObs_opt[0];</div>
+<div class="line"><a name="l01020"></a><span class="lineno"> 1020</span>         <span class="keywordflow">if</span>(uncertObsLineBuffer.size()>icol)</div>
+<div class="line"><a name="l01021"></a><span class="lineno"> 1021</span>           uncertObs=uncertObsLineBuffer[icol];</div>
+<div class="line"><a name="l01022"></a><span class="lineno"> 1022</span>         <span class="keywordflow">else</span> <span class="keywordflow">if</span>(weight_opt.size()>1||deltaObs_opt.size()){</div>
+<div class="line"><a name="l01023"></a><span class="lineno"> 1023</span>           <a class="code" href="classstatfactory_1_1StatFactory.html">statfactory::StatFactory</a> statobs;</div>
+<div class="line"><a name="l01024"></a><span class="lineno"> 1024</span>           statobs.setNoDataValues(obsnodata_opt);</div>
+<div class="line"><a name="l01025"></a><span class="lineno"> 1025</span>           <span class="keywordtype">double</span> obsMeanValue=(statobs.mean(obsWindowBuffer)-c0obs)/c1obs;</div>
+<div class="line"><a name="l01026"></a><span class="lineno"> 1026</span>           <span class="keywordtype">double</span> difference=obsMeanValue-modValue;</div>
+<div class="line"><a name="l01027"></a><span class="lineno"> 1027</span>           <span class="keywordflow">if</span>(modValue){</div>
+<div class="line"><a name="l01028"></a><span class="lineno"> 1028</span>         <span class="keywordtype">double</span> relativeDifference=difference/modValue;</div>
+<div class="line"><a name="l01029"></a><span class="lineno"> 1029</span>         <span class="keywordflow">if</span>(deltaObs_opt.size()){</div>
+<div class="line"><a name="l01030"></a><span class="lineno"> 1030</span>           assert(deltaObs_opt.size()>1);</div>
+<div class="line"><a name="l01031"></a><span class="lineno"> 1031</span>           <span class="keywordflow">if</span>(100*relativeDifference<deltaObs_opt[0])<span class="comment">//lower bound</span></div>
+<div class="line"><a name="l01032"></a><span class="lineno"> 1032</span>             kalmanGain=0;</div>
+<div class="line"><a name="l01033"></a><span class="lineno"> 1033</span>           <span class="keywordflow">else</span> <span class="keywordflow">if</span>(100*relativeDifference>deltaObs_opt[1])<span class="comment">//upper bound</span></div>
+<div class="line"><a name="l01034"></a><span class="lineno"> 1034</span>             kalmanGain=0;</div>
+<div class="line"><a name="l01035"></a><span class="lineno"> 1035</span>         }</div>
+<div class="line"><a name="l01036"></a><span class="lineno"> 1036</span>         <span class="keywordflow">else</span> <span class="keywordflow">if</span>(weight_opt.size()){</div>
+<div class="line"><a name="l01037"></a><span class="lineno"> 1037</span>           assert(weight_opt.size()>1);</div>
+<div class="line"><a name="l01038"></a><span class="lineno"> 1038</span>           <span class="keywordflow">if</span>(obsMeanValue<modValue)</div>
+<div class="line"><a name="l01039"></a><span class="lineno"> 1039</span>             uncertObs=-weight_opt[0]*relativeDifference;</div>
+<div class="line"><a name="l01040"></a><span class="lineno"> 1040</span>           <span class="keywordflow">else</span> <span class="keywordflow">if</span>(obsMeanValue>modValue)</div>
+<div class="line"><a name="l01041"></a><span class="lineno"> 1041</span>             uncertObs=weight_opt[1]*relativeDifference;</div>
+<div class="line"><a name="l01042"></a><span class="lineno"> 1042</span>         }</div>
+<div class="line"><a name="l01043"></a><span class="lineno"> 1043</span>           }</div>
+<div class="line"><a name="l01044"></a><span class="lineno"> 1044</span>           <span class="keywordflow">if</span>(uncertObs<=0)</div>
+<div class="line"><a name="l01045"></a><span class="lineno"> 1045</span>         uncertObs=0;</div>
+<div class="line"><a name="l01046"></a><span class="lineno"> 1046</span>           <span class="keywordflow">if</span>(verbose_opt[0]>1)</div>
+<div class="line"><a name="l01047"></a><span class="lineno"> 1047</span>         cout << <span class="stringliteral">"obsMeanValue:"</span> << obsMeanValue << <span class="stringliteral">", modValue: "</span> << modValue << endl;</div>
 <div class="line"><a name="l01048"></a><span class="lineno"> 1048</span>         }</div>
-<div class="line"><a name="l01049"></a><span class="lineno"> 1049</span>         <span class="keywordflow">else</span> <span class="keywordflow">if</span>(uncertObsLineBuffer.size()>icol)</div>
-<div class="line"><a name="l01050"></a><span class="lineno"> 1050</span>           uncertWriteBuffer[icol]=uncertObsLineBuffer[icol];</div>
-<div class="line"><a name="l01051"></a><span class="lineno"> 1051</span>         <span class="keywordflow">else</span></div>
-<div class="line"><a name="l01052"></a><span class="lineno"> 1052</span>           uncertWriteBuffer[icol]=uncertObs_opt[0];</div>
-<div class="line"><a name="l01053"></a><span class="lineno"> 1053</span>       }</div>
-<div class="line"><a name="l01054"></a><span class="lineno"> 1054</span>       <span class="keywordflow">else</span>{<span class="comment">//model is valid: calculate estimate from model</span></div>
-<div class="line"><a name="l01055"></a><span class="lineno"> 1055</span>         <span class="keywordtype">double</span> errMod=uncertModel_opt[0]*stdDev;</div>
-<div class="line"><a name="l01056"></a><span class="lineno"> 1056</span>         errMod*=regTime_opt[0];</div>
-<div class="line"><a name="l01057"></a><span class="lineno"> 1057</span>         <span class="comment">// double certNorm=(errMod*errMod+errObs*errObs);</span></div>
-<div class="line"><a name="l01058"></a><span class="lineno"> 1058</span>         <span class="comment">// double certMod=errObs*errObs/certNorm;</span></div>
-<div class="line"><a name="l01059"></a><span class="lineno"> 1059</span>         <span class="comment">// double certObs=errMod*errMod/certNorm;</span></div>
-<div class="line"><a name="l01060"></a><span class="lineno"> 1060</span>         <span class="comment">// double regTime=0;</span></div>
-<div class="line"><a name="l01061"></a><span class="lineno"> 1061</span>         <span class="comment">// double regSensor=(c0obs+c1obs*modValue)*certMod;</span></div>
-<div class="line"><a name="l01062"></a><span class="lineno"> 1062</span>         <span class="comment">// estWriteBuffer[icol]=regTime+regSensor;</span></div>
-<div class="line"><a name="l01063"></a><span class="lineno"> 1063</span>         estWriteBuffer[icol]=modValue;</div>
-<div class="line"><a name="l01064"></a><span class="lineno"> 1064</span>         <span class="keywordtype">double</span> totalUncertainty=errMod;</div>
-<div class="line"><a name="l01065"></a><span class="lineno"> 1065</span>         <span class="comment">// if(errMod<eps_opt[0])</span></div>
-<div class="line"><a name="l01066"></a><span class="lineno"> 1066</span>         <span class="comment">//   totalUncertainty=errObs;</span></div>
-<div class="line"><a name="l01067"></a><span class="lineno"> 1067</span>         <span class="comment">// else if(errObs<eps_opt[0])</span></div>
-<div class="line"><a name="l01068"></a><span class="lineno"> 1068</span>         <span class="comment">//   totalUncertainty=errMod;</span></div>
-<div class="line"><a name="l01069"></a><span class="lineno"> 1069</span>         <span class="comment">// else{</span></div>
-<div class="line"><a name="l01070"></a><span class="lineno"> 1070</span>         <span class="comment">//   totalUncertainty=1.0/errMod/errMod+1/errObs/errObs;</span></div>
-<div class="line"><a name="l01071"></a><span class="lineno"> 1071</span>         <span class="comment">//   totalUncertainty=sqrt(1.0/totalUncertainty);</span></div>
-<div class="line"><a name="l01072"></a><span class="lineno"> 1072</span>         <span class="comment">// }</span></div>
-<div class="line"><a name="l01073"></a><span class="lineno"> 1073</span>         uncertWriteBuffer[icol]=totalUncertainty;<span class="comment">//in case observation is not valid</span></div>
-<div class="line"><a name="l01074"></a><span class="lineno"> 1074</span>       }</div>
-<div class="line"><a name="l01075"></a><span class="lineno"> 1075</span>       <span class="comment">//measurement update</span></div>
-<div class="line"><a name="l01076"></a><span class="lineno"> 1076</span>       <span class="keywordflow">if</span>(!imgReaderObs.isNoData(obsLineBuffer[icol])){</div>
-<div class="line"><a name="l01077"></a><span class="lineno"> 1077</span>         <span class="keywordtype">double</span> kalmanGain=1;</div>
-<div class="line"><a name="l01078"></a><span class="lineno"> 1078</span>         <span class="keywordtype">double</span> uncertObs=uncertObs_opt[0];</div>
-<div class="line"><a name="l01079"></a><span class="lineno"> 1079</span>         <span class="keywordflow">if</span>(uncertObsLineBuffer.size()>icol)</div>
-<div class="line"><a name="l01080"></a><span class="lineno"> 1080</span>           uncertObs=uncertObsLineBuffer[icol];</div>
-<div class="line"><a name="l01081"></a><span class="lineno"> 1081</span>         <span class="keywordflow">else</span> <span class="keywordflow">if</span>(weight_opt.size()>1||deltaObs_opt.size()){</div>
-<div class="line"><a name="l01082"></a><span class="lineno"> 1082</span>           vector<double> obsWindowBuffer;<span class="comment">//buffer for observation to calculate average corresponding to model pixel</span></div>
-<div class="line"><a name="l01083"></a><span class="lineno"> 1083</span>           <span class="keywordtype">int</span> minCol=(icol>down_opt[0]/2) ? icol-down_opt[0]/2 : 0;</div>
-<div class="line"><a name="l01084"></a><span class="lineno"> 1084</span>           <span class="keywordtype">int</span> maxCol=(icol+down_opt[0]/2<imgReaderObs.nrOfCol()) ? icol+down_opt[0]/2 : imgReaderObs.nrOfCol()-1;</div>
-<div class="line"><a name="l01085"></a><span class="lineno"> 1085</span>           <span class="keywordtype">int</span> minRow=(irow>down_opt[0]/2) ? irow-down_opt[0]/2 : 0;</div>
-<div class="line"><a name="l01086"></a><span class="lineno"> 1086</span>           <span class="keywordtype">int</span> maxRow=(irow+down_opt[0]/2<imgReaderObs.nrOfRow()) ? irow+down_opt[0]/2 : imgReaderObs.nrOfRow()-1;</div>
-<div class="line"><a name="l01087"></a><span class="lineno"> 1087</span>         </div>
-<div class="line"><a name="l01088"></a><span class="lineno"> 1088</span>           imgReaderObs.readDataBlock(obsWindowBuffer,GDT_Float64,minCol,maxCol,minRow,maxRow,0);</div>
-<div class="line"><a name="l01089"></a><span class="lineno"> 1089</span>           <a class="code" href="classstatfactory_1_1StatFactory.html">statfactory::StatFactory</a> statobs;</div>
-<div class="line"><a name="l01090"></a><span class="lineno"> 1090</span>           statobs.setNoDataValues(obsnodata_opt);</div>
-<div class="line"><a name="l01091"></a><span class="lineno"> 1091</span>           <span class="keywordtype">double</span> obsMeanValue=(statobs.mean(obsWindowBuffer)-c0obs)/c1obs;</div>
-<div class="line"><a name="l01092"></a><span class="lineno"> 1092</span>           <span class="keywordtype">double</span> difference=obsMeanValue-modValue;</div>
-<div class="line"><a name="l01093"></a><span class="lineno"> 1093</span>           <span class="keywordflow">if</span>(modValue){</div>
-<div class="line"><a name="l01094"></a><span class="lineno"> 1094</span>         <span class="keywordtype">double</span> relativeDifference=difference/modValue;</div>
-<div class="line"><a name="l01095"></a><span class="lineno"> 1095</span>         <span class="keywordflow">if</span>(deltaObs_opt.size()){</div>
-<div class="line"><a name="l01096"></a><span class="lineno"> 1096</span>           assert(deltaObs_opt.size()>1);</div>
-<div class="line"><a name="l01097"></a><span class="lineno"> 1097</span>           <span class="keywordflow">if</span>(100*relativeDifference<deltaObs_opt[0])<span class="comment">//lower bound</span></div>
-<div class="line"><a name="l01098"></a><span class="lineno"> 1098</span>             kalmanGain=0;</div>
-<div class="line"><a name="l01099"></a><span class="lineno"> 1099</span>           <span class="keywordflow">else</span> <span class="keywordflow">if</span>(100*relativeDifference>deltaObs_opt[1])<span class="comment">//upper bound</span></div>
-<div class="line"><a name="l01100"></a><span class="lineno"> 1100</span>             kalmanGain=0;</div>
-<div class="line"><a name="l01101"></a><span class="lineno"> 1101</span>         }</div>
-<div class="line"><a name="l01102"></a><span class="lineno"> 1102</span>         <span class="keywordflow">else</span> <span class="keywordflow">if</span>(weight_opt.size()){</div>
-<div class="line"><a name="l01103"></a><span class="lineno"> 1103</span>           assert(weight_opt.size()>1);</div>
-<div class="line"><a name="l01104"></a><span class="lineno"> 1104</span>           <span class="keywordflow">if</span>(obsMeanValue<modValue)</div>
-<div class="line"><a name="l01105"></a><span class="lineno"> 1105</span>             uncertObs=weight_opt[0]*relativeDifference;</div>
-<div class="line"><a name="l01106"></a><span class="lineno"> 1106</span>           <span class="keywordflow">else</span> <span class="keywordflow">if</span>(obsMeanValue>modValue)</div>
-<div class="line"><a name="l01107"></a><span class="lineno"> 1107</span>             uncertObs=weight_opt[1]*relativeDifference;</div>
-<div class="line"><a name="l01108"></a><span class="lineno"> 1108</span>         }</div>
-<div class="line"><a name="l01109"></a><span class="lineno"> 1109</span>           }</div>
-<div class="line"><a name="l01110"></a><span class="lineno"> 1110</span>           <span class="keywordflow">if</span>(uncertObs<=0)</div>
-<div class="line"><a name="l01111"></a><span class="lineno"> 1111</span>         uncertObs=0;</div>
-<div class="line"><a name="l01112"></a><span class="lineno"> 1112</span>           <span class="keywordflow">if</span>(verbose_opt[0]>1)</div>
-<div class="line"><a name="l01113"></a><span class="lineno"> 1113</span>         cout << <span class="stringliteral">"obsMeanValue:"</span> << obsMeanValue << <span class="stringliteral">", modValue: "</span> << modValue << endl;</div>
-<div class="line"><a name="l01114"></a><span class="lineno"> 1114</span>         }</div>
-<div class="line"><a name="l01115"></a><span class="lineno"> 1115</span>         <span class="keywordflow">if</span>(kalmanGain>0){</div>
-<div class="line"><a name="l01116"></a><span class="lineno"> 1116</span>           <span class="keywordflow">if</span>((uncertWriteBuffer[icol]+uncertObs)>eps_opt[0])</div>
-<div class="line"><a name="l01117"></a><span class="lineno"> 1117</span>         kalmanGain=uncertWriteBuffer[icol]/(uncertWriteBuffer[icol]+uncertObs);</div>
-<div class="line"><a name="l01118"></a><span class="lineno"> 1118</span>         }</div>
-<div class="line"><a name="l01119"></a><span class="lineno"> 1119</span>         assert(kalmanGain<=1);</div>
-<div class="line"><a name="l01120"></a><span class="lineno"> 1120</span>         estWriteBuffer[icol]+=kalmanGain*(obsLineBuffer[icol]-estWriteBuffer[icol]);</div>
-<div class="line"><a name="l01121"></a><span class="lineno"> 1121</span>         uncertWriteBuffer[icol]*=(1-kalmanGain);</div>
-<div class="line"><a name="l01122"></a><span class="lineno"> 1122</span>       }</div>
-<div class="line"><a name="l01123"></a><span class="lineno"> 1123</span>     }</div>
-<div class="line"><a name="l01124"></a><span class="lineno"> 1124</span>     imgWriterEst.writeData(estWriteBuffer,GDT_Float64,irow,0);</div>
-<div class="line"><a name="l01125"></a><span class="lineno"> 1125</span>     imgWriterEst.writeData(uncertWriteBuffer,GDT_Float64,irow,1);</div>
-<div class="line"><a name="l01126"></a><span class="lineno"> 1126</span>       }</div>
-<div class="line"><a name="l01127"></a><span class="lineno"> 1127</span>       imgReaderObs.close();</div>
-<div class="line"><a name="l01128"></a><span class="lineno"> 1128</span>       --obsindex;</div>
-<div class="line"><a name="l01129"></a><span class="lineno"> 1129</span>     }</div>
-<div class="line"><a name="l01130"></a><span class="lineno"> 1130</span>     imgReaderModel1.close();</div>
-<div class="line"><a name="l01131"></a><span class="lineno"> 1131</span>     imgWriterEst.close();</div>
-<div class="line"><a name="l01132"></a><span class="lineno"> 1132</span> </div>
-<div class="line"><a name="l01133"></a><span class="lineno"> 1133</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> modindex=model_opt.size()-2;modindex>=0;--modindex){</div>
-<div class="line"><a name="l01134"></a><span class="lineno"> 1134</span>       <span class="keywordflow">if</span>(verbose_opt[0]){</div>
-<div class="line"><a name="l01135"></a><span class="lineno"> 1135</span>     cout << <span class="stringliteral">"processing time "</span> << tmodel_opt[modindex] << endl;</div>
-<div class="line"><a name="l01136"></a><span class="lineno"> 1136</span>     <span class="keywordflow">if</span>(obsindex<relobsindex.size())</div>
-<div class="line"><a name="l01137"></a><span class="lineno"> 1137</span>       cout << <span class="stringliteral">"next observation "</span> << tmodel_opt[relobsindex[obsindex]] << endl;</div>
-<div class="line"><a name="l01138"></a><span class="lineno"> 1138</span>     <span class="keywordflow">else</span></div>
-<div class="line"><a name="l01139"></a><span class="lineno"> 1139</span>       cout << <span class="stringliteral">"There is no next observation"</span> << endl;</div>
-<div class="line"><a name="l01140"></a><span class="lineno"> 1140</span>       }</div>
-<div class="line"><a name="l01141"></a><span class="lineno"> 1141</span>       <span class="keywordtype">string</span> output;</div>
-<div class="line"><a name="l01142"></a><span class="lineno"> 1142</span>       <span class="keywordflow">if</span>(outputbw_opt.size()==model_opt.size())</div>
-<div class="line"><a name="l01143"></a><span class="lineno"> 1143</span>     output=outputbw_opt[modindex];</div>
-<div class="line"><a name="l01144"></a><span class="lineno"> 1144</span>       <span class="keywordflow">else</span>{</div>
-<div class="line"><a name="l01145"></a><span class="lineno"> 1145</span>     ostringstream outputstream;</div>
-<div class="line"><a name="l01146"></a><span class="lineno"> 1146</span>     outputstream << outputbw_opt[0] << <span class="stringliteral">"_"</span>;</div>
-<div class="line"><a name="l01147"></a><span class="lineno"> 1147</span>     outputstream << setfill(<span class="charliteral">'0'</span>) << setw(ndigit) << tmodel_opt[modindex];</div>
-<div class="line"><a name="l01148"></a><span class="lineno"> 1148</span>     outputstream << <span class="stringliteral">".tif"</span>;</div>
-<div class="line"><a name="l01149"></a><span class="lineno"> 1149</span>     <span class="comment">// outputstream << outputbw_opt[0] << "_" << tmodel_opt[modindex] << ".tif";</span></div>
-<div class="line"><a name="l01150"></a><span class="lineno"> 1150</span>     output=outputstream.str();</div>
-<div class="line"><a name="l01151"></a><span class="lineno"> 1151</span>       }</div>
-<div class="line"><a name="l01152"></a><span class="lineno"> 1152</span> </div>
-<div class="line"><a name="l01153"></a><span class="lineno"> 1153</span>       <span class="comment">//two band output band0=estimation, band1=uncertainty</span></div>
-<div class="line"><a name="l01154"></a><span class="lineno"> 1154</span>       imgWriterEst.open(output,ncol,nrow,2,GDT_Float32,imageType,option_opt);</div>
-<div class="line"><a name="l01155"></a><span class="lineno"> 1155</span>       imgWriterEst.setProjectionProj4(projection_opt[0]);</div>
-<div class="line"><a name="l01156"></a><span class="lineno"> 1156</span>       imgWriterEst.setGeoTransform(geotransform);</div>
-<div class="line"><a name="l01157"></a><span class="lineno"> 1157</span>       imgWriterEst.GDALSetNoDataValue(obsnodata_opt[0]);</div>
-<div class="line"><a name="l01158"></a><span class="lineno"> 1158</span> </div>
-<div class="line"><a name="l01159"></a><span class="lineno"> 1159</span>       <span class="comment">//calculate regression between two subsequence model inputs</span></div>
-<div class="line"><a name="l01160"></a><span class="lineno"> 1160</span>       imgReaderModel1.open(model_opt[modindex+1]);</div>
-<div class="line"><a name="l01161"></a><span class="lineno"> 1161</span>       imgReaderModel1.setNoData(modnodata_opt);</div>
-<div class="line"><a name="l01162"></a><span class="lineno"> 1162</span>       <span class="keywordflow">if</span>(modoffset_opt.size())</div>
-<div class="line"><a name="l01163"></a><span class="lineno"> 1163</span>     imgReaderModel1.setOffset(modoffset_opt[0]);</div>
-<div class="line"><a name="l01164"></a><span class="lineno"> 1164</span>       <span class="keywordflow">if</span>(modscale_opt.size())</div>
-<div class="line"><a name="l01165"></a><span class="lineno"> 1165</span>     imgReaderModel1.setScale(modscale_opt[0]);</div>
-<div class="line"><a name="l01166"></a><span class="lineno"> 1166</span>       imgReaderModel2.open(model_opt[modindex]);</div>
-<div class="line"><a name="l01167"></a><span class="lineno"> 1167</span>       imgReaderModel2.setNoData(modnodata_opt);</div>
-<div class="line"><a name="l01168"></a><span class="lineno"> 1168</span>       <span class="keywordflow">if</span>(modoffset_opt.size())</div>
-<div class="line"><a name="l01169"></a><span class="lineno"> 1169</span>     imgReaderModel2.setOffset(modoffset_opt[0]);</div>
-<div class="line"><a name="l01170"></a><span class="lineno"> 1170</span>       <span class="keywordflow">if</span>(modscale_opt.size())</div>
-<div class="line"><a name="l01171"></a><span class="lineno"> 1171</span>     imgReaderModel2.setScale(modscale_opt[0]);</div>
-<div class="line"><a name="l01172"></a><span class="lineno"> 1172</span>       <span class="comment">//calculate regression</span></div>
-<div class="line"><a name="l01173"></a><span class="lineno"> 1173</span>       <span class="comment">//we could re-use the points from second image from last run, but</span></div>
-<div class="line"><a name="l01174"></a><span class="lineno"> 1174</span>       <span class="comment">//to keep it general, we must redo it (overlap might have changed)</span></div>
-<div class="line"><a name="l01175"></a><span class="lineno"> 1175</span>     </div>
-<div class="line"><a name="l01176"></a><span class="lineno"> 1176</span>       pfnProgress(progress,pszMessage,pProgressArg);</div>
-<div class="line"><a name="l01177"></a><span class="lineno"> 1177</span> </div>
-<div class="line"><a name="l01178"></a><span class="lineno"> 1178</span>       <span class="keywordflow">if</span>(verbose_opt[0])</div>
-<div class="line"><a name="l01179"></a><span class="lineno"> 1179</span>     cout << <span class="stringliteral">"Calculating regression for "</span> << imgReaderModel1.getFileName() << <span class="stringliteral">" "</span> << imgReaderModel2.getFileName() << endl;</div>
-<div class="line"><a name="l01180"></a><span class="lineno"> 1180</span> </div>
-<div class="line"><a name="l01181"></a><span class="lineno"> 1181</span>       <span class="keywordtype">double</span> errMod=imgreg.getRMSE(imgReaderModel1,imgReaderModel2,c0modGlobal,c1modGlobal,0,0);</div>
-<div class="line"><a name="l01182"></a><span class="lineno"> 1182</span>       errMod*=regTime_opt[0];</div>
-<div class="line"><a name="l01183"></a><span class="lineno"> 1183</span> </div>
-<div class="line"><a name="l01184"></a><span class="lineno"> 1184</span>       <span class="comment">// double errMod=imgreg.getRMSE(imgReaderModel1,imgReaderModel2,c0modGlobal,c1modGlobal,verbose_opt[0]);</span></div>
-<div class="line"><a name="l01185"></a><span class="lineno"> 1185</span>       <span class="keywordflow">if</span>(verbose_opt[0])</div>
-<div class="line"><a name="l01186"></a><span class="lineno"> 1186</span>     cout << <span class="stringliteral">"c0modGlobal, c1modGlobal: "</span> << c0modGlobal << <span class="stringliteral">", "</span> << c1modGlobal << endl;</div>
-<div class="line"><a name="l01187"></a><span class="lineno"> 1187</span> </div>
-<div class="line"><a name="l01188"></a><span class="lineno"> 1188</span>       <span class="keywordtype">bool</span> update=<span class="keyword">false</span>;</div>
-<div class="line"><a name="l01189"></a><span class="lineno"> 1189</span>       <span class="keywordflow">if</span>(obsindex<relobsindex.size()){</div>
-<div class="line"><a name="l01190"></a><span class="lineno"> 1190</span>     update=(relobsindex[obsindex]==modindex);</div>
-<div class="line"><a name="l01191"></a><span class="lineno"> 1191</span>       }</div>
-<div class="line"><a name="l01192"></a><span class="lineno"> 1192</span>       <span class="keywordflow">if</span>(update){</div>
-<div class="line"><a name="l01193"></a><span class="lineno"> 1193</span>     <span class="keywordflow">if</span>(verbose_opt[0])</div>
-<div class="line"><a name="l01194"></a><span class="lineno"> 1194</span>       cout << <span class="stringliteral">"***update "</span> << relobsindex[obsindex] << <span class="stringliteral">" = "</span> << modindex << <span class="stringliteral">" "</span> << observation_opt[obsindex] << <span class="stringliteral">" ***"</span> << endl;</div>
-<div class="line"><a name="l01195"></a><span class="lineno"> 1195</span> </div>
-<div class="line"><a name="l01196"></a><span class="lineno"> 1196</span>     imgReaderObs.open(observation_opt[obsindex]);</div>
-<div class="line"><a name="l01197"></a><span class="lineno"> 1197</span>     imgReaderObs.getGeoTransform(geotransform);</div>
-<div class="line"><a name="l01198"></a><span class="lineno"> 1198</span>     imgReaderObs.setNoData(obsnodata_opt);</div>
-<div class="line"><a name="l01199"></a><span class="lineno"> 1199</span>     <span class="keywordflow">if</span>(obsoffset_opt.size())</div>
-<div class="line"><a name="l01200"></a><span class="lineno"> 1200</span>       imgReaderObs.setOffset(obsoffset_opt[0]);</div>
-<div class="line"><a name="l01201"></a><span class="lineno"> 1201</span>     <span class="keywordflow">if</span>(obsscale_opt.size())</div>
-<div class="line"><a name="l01202"></a><span class="lineno"> 1202</span>       imgReaderObs.setScale(obsscale_opt[0]);</div>
-<div class="line"><a name="l01203"></a><span class="lineno"> 1203</span>     <span class="comment">//calculate regression between model and observation</span></div>
-<div class="line"><a name="l01204"></a><span class="lineno"> 1204</span>     <span class="keywordflow">if</span>(verbose_opt[0])</div>
-<div class="line"><a name="l01205"></a><span class="lineno"> 1205</span>       cout << <span class="stringliteral">"Calculating regression for "</span> << imgReaderModel2.getFileName() << <span class="stringliteral">" "</span> << imgReaderObs.getFileName() << endl;</div>
-<div class="line"><a name="l01206"></a><span class="lineno"> 1206</span>     <span class="keywordflow">if</span>(regSensor_opt[0]>0)</div>
-<div class="line"><a name="l01207"></a><span class="lineno"> 1207</span>       errObs=regSensor_opt[0]*imgreg.getRMSE(imgReaderModel2,imgReaderObs,c0obs,c1obs,0,0,verbose_opt[0]);</div>
-<div class="line"><a name="l01208"></a><span class="lineno"> 1208</span>     <span class="keywordflow">else</span>{</div>
-<div class="line"><a name="l01209"></a><span class="lineno"> 1209</span>       c0obs=0;</div>
-<div class="line"><a name="l01210"></a><span class="lineno"> 1210</span>       c1obs=1;</div>
-<div class="line"><a name="l01211"></a><span class="lineno"> 1211</span>       errObs=0;</div>
-<div class="line"><a name="l01212"></a><span class="lineno"> 1212</span>     }</div>
-<div class="line"><a name="l01213"></a><span class="lineno"> 1213</span>     <span class="keywordflow">if</span>(verbose_opt[0])</div>
-<div class="line"><a name="l01214"></a><span class="lineno"> 1214</span>       cout << <span class="stringliteral">"c0obs, c1obs: "</span> << c0obs << <span class="stringliteral">", "</span> << c1obs << endl;</div>
-<div class="line"><a name="l01215"></a><span class="lineno"> 1215</span>       }</div>
-<div class="line"><a name="l01216"></a><span class="lineno"> 1216</span>       <span class="comment">//prediction (also to fill cloudy pixels in update mode)</span></div>
-<div class="line"><a name="l01217"></a><span class="lineno"> 1217</span>       <span class="keywordtype">string</span> input;</div>
-<div class="line"><a name="l01218"></a><span class="lineno"> 1218</span>       <span class="keywordflow">if</span>(outputbw_opt.size()==model_opt.size())</div>
-<div class="line"><a name="l01219"></a><span class="lineno"> 1219</span>     input=outputbw_opt[modindex+1];</div>
-<div class="line"><a name="l01220"></a><span class="lineno"> 1220</span>       <span class="keywordflow">else</span>{</div>
-<div class="line"><a name="l01221"></a><span class="lineno"> 1221</span>     ostringstream outputstream;</div>
-<div class="line"><a name="l01222"></a><span class="lineno"> 1222</span>     outputstream << outputbw_opt[0] << <span class="stringliteral">"_"</span>;</div>
-<div class="line"><a name="l01223"></a><span class="lineno"> 1223</span>     outputstream << setfill(<span class="charliteral">'0'</span>) << setw(ndigit) << tmodel_opt[modindex+1];</div>
-<div class="line"><a name="l01224"></a><span class="lineno"> 1224</span>     outputstream << <span class="stringliteral">".tif"</span>;</div>
-<div class="line"><a name="l01225"></a><span class="lineno"> 1225</span>     <span class="comment">// outputstream << outputbw_opt[0] << "_" << tmodel_opt[modindex+1] << ".tif";</span></div>
-<div class="line"><a name="l01226"></a><span class="lineno"> 1226</span>     input=outputstream.str();</div>
-<div class="line"><a name="l01227"></a><span class="lineno"> 1227</span>       }</div>
-<div class="line"><a name="l01228"></a><span class="lineno"> 1228</span>       <a class="code" href="classImgReaderGdal.html">ImgReaderGdal</a> imgReaderEst(input);</div>
-<div class="line"><a name="l01229"></a><span class="lineno"> 1229</span>       imgReaderEst.setNoData(obsnodata_opt);</div>
-<div class="line"><a name="l01230"></a><span class="lineno"> 1230</span>       <span class="keywordflow">if</span>(obsoffset_opt.size())</div>
-<div class="line"><a name="l01231"></a><span class="lineno"> 1231</span>     imgReaderEst.setOffset(obsoffset_opt[0]);</div>
-<div class="line"><a name="l01232"></a><span class="lineno"> 1232</span>       <span class="keywordflow">if</span>(obsscale_opt.size())</div>
-<div class="line"><a name="l01233"></a><span class="lineno"> 1233</span>     imgReaderEst.setScale(obsscale_opt[0]);</div>
-<div class="line"><a name="l01234"></a><span class="lineno"> 1234</span>       </div>
-<div class="line"><a name="l01235"></a><span class="lineno"> 1235</span>       vector< vector<double> > obsLineVector(down_opt[0]);</div>
-<div class="line"><a name="l01236"></a><span class="lineno"> 1236</span>       vector<double> obsLineBuffer;</div>
-<div class="line"><a name="l01237"></a><span class="lineno"> 1237</span>       vector<double> obsWindowBuffer;<span class="comment">//buffer for observation to calculate average corresponding to model pixel</span></div>
-<div class="line"><a name="l01238"></a><span class="lineno"> 1238</span>       vector<double> model1LineBuffer;</div>
-<div class="line"><a name="l01239"></a><span class="lineno"> 1239</span>       vector<double> model2LineBuffer;</div>
-<div class="line"><a name="l01240"></a><span class="lineno"> 1240</span>       vector<double> model1buffer;<span class="comment">//buffer for model 1 to calculate time regression based on window</span></div>
-<div class="line"><a name="l01241"></a><span class="lineno"> 1241</span>       vector<double> model2buffer;<span class="comment">//buffer for model 2 to calculate time regression based on window</span></div>
-<div class="line"><a name="l01242"></a><span class="lineno"> 1242</span>       vector<double> uncertObsLineBuffer;</div>
-<div class="line"><a name="l01243"></a><span class="lineno"> 1243</span>       vector<double> estReadBuffer;</div>
-<div class="line"><a name="l01244"></a><span class="lineno"> 1244</span>       <span class="comment">// vector<double> estWindowBuffer;//buffer for estimate to calculate average corresponding to model pixel</span></div>
-<div class="line"><a name="l01245"></a><span class="lineno"> 1245</span>       vector<double> uncertReadBuffer;</div>
-<div class="line"><a name="l01246"></a><span class="lineno"> 1246</span>       vector<double> estWriteBuffer(ncol);</div>
-<div class="line"><a name="l01247"></a><span class="lineno"> 1247</span>       vector<double> uncertWriteBuffer(ncol);</div>
-<div class="line"><a name="l01248"></a><span class="lineno"> 1248</span>       <span class="comment">// vector<double> lineMask;</span></div>
-<div class="line"><a name="l01249"></a><span class="lineno"> 1249</span> </div>
-<div class="line"><a name="l01250"></a><span class="lineno"> 1250</span>       <span class="comment">//initialize obsLineVector</span></div>
-<div class="line"><a name="l01251"></a><span class="lineno"> 1251</span>       <span class="keywordflow">if</span>(update){</div>
-<div class="line"><a name="l01252"></a><span class="lineno"> 1252</span>     assert(down_opt[0]%2);<span class="comment">//window size must be odd </span></div>
-<div class="line"><a name="l01253"></a><span class="lineno"> 1253</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iline=-down_opt[0]/2;iline<down_opt[0]/2+1;++iline){</div>
-<div class="line"><a name="l01254"></a><span class="lineno"> 1254</span>       <span class="keywordflow">if</span>(iline<0)<span class="comment">//replicate line 0</span></div>
-<div class="line"><a name="l01255"></a><span class="lineno"> 1255</span>         imgReaderObs.readData(obsLineVector[iline+down_opt[0]/2],GDT_Float64,0,0);</div>
-<div class="line"><a name="l01256"></a><span class="lineno"> 1256</span>       <span class="keywordflow">else</span></div>
-<div class="line"><a name="l01257"></a><span class="lineno"> 1257</span>         imgReaderObs.readData(obsLineVector[iline+down_opt[0]/2],GDT_Float64,iline,0);</div>
-<div class="line"><a name="l01258"></a><span class="lineno"> 1258</span>     }</div>
-<div class="line"><a name="l01259"></a><span class="lineno"> 1259</span>       }</div>
-<div class="line"><a name="l01260"></a><span class="lineno"> 1260</span>       <span class="keywordflow">for</span>(<span class="keywordtype">int</span> irow=0;irow<imgWriterEst.nrOfRow();++irow){</div>
-<div class="line"><a name="l01261"></a><span class="lineno"> 1261</span>     assert(irow<imgReaderEst.nrOfRow());</div>
-<div class="line"><a name="l01262"></a><span class="lineno"> 1262</span>     <span class="comment">//do not read from imgReaderObs, because we read entire window for each pixel...</span></div>
-<div class="line"><a name="l01263"></a><span class="lineno"> 1263</span>     imgReaderEst.readData(estReadBuffer,GDT_Float64,irow,0);</div>
-<div class="line"><a name="l01264"></a><span class="lineno"> 1264</span>     imgReaderEst.readData(uncertReadBuffer,GDT_Float64,irow,1);</div>
-<div class="line"><a name="l01265"></a><span class="lineno"> 1265</span>     <span class="comment">//read model2 in case current estimate is nodata</span></div>
-<div class="line"><a name="l01266"></a><span class="lineno"> 1266</span>     imgReaderEst.image2geo(0,irow,geox,geoy);</div>
-<div class="line"><a name="l01267"></a><span class="lineno"> 1267</span>     imgReaderModel2.geo2image(geox,geoy,modCol,modRow);</div>
-<div class="line"><a name="l01268"></a><span class="lineno"> 1268</span>     assert(modRow>=0&&modRow<imgReaderModel2.nrOfRow());</div>
-<div class="line"><a name="l01269"></a><span class="lineno"> 1269</span>     imgReaderModel2.readData(model2LineBuffer,GDT_Float64,modRow,0);</div>
-<div class="line"><a name="l01270"></a><span class="lineno"> 1270</span> </div>
-<div class="line"><a name="l01271"></a><span class="lineno"> 1271</span>     imgReaderModel1.geo2image(geox,geoy,modCol,modRow);</div>
-<div class="line"><a name="l01272"></a><span class="lineno"> 1272</span>     assert(modRow>=0&&modRow<imgReaderModel1.nrOfRow());</div>
-<div class="line"><a name="l01273"></a><span class="lineno"> 1273</span>     imgReaderModel1.readData(model1LineBuffer,GDT_Float64,modRow,0);</div>
-<div class="line"><a name="l01274"></a><span class="lineno"> 1274</span> </div>
-<div class="line"><a name="l01275"></a><span class="lineno"> 1275</span>     <span class="keywordflow">if</span>(update){</div>
-<div class="line"><a name="l01276"></a><span class="lineno"> 1276</span>       <span class="keywordtype">int</span> maxRow=(irow+down_opt[0]/2<imgReaderEst.nrOfRow()) ? irow+down_opt[0]/2 : imgReaderEst.nrOfRow()-1;</div>
-<div class="line"><a name="l01277"></a><span class="lineno"> 1277</span>       obsLineVector.erase(obsLineVector.begin());</div>
-<div class="line"><a name="l01278"></a><span class="lineno"> 1278</span>       imgReaderObs.readData(obsLineBuffer,GDT_Float64,maxRow,0);</div>
-<div class="line"><a name="l01279"></a><span class="lineno"> 1279</span>       obsLineVector.push_back(obsLineBuffer);</div>
-<div class="line"><a name="l01280"></a><span class="lineno"> 1280</span>       obsLineBuffer=obsLineVector[down_opt[0]/2];</div>
-<div class="line"><a name="l01281"></a><span class="lineno"> 1281</span>       <span class="comment">// imgReaderObs.readData(obsLineBuffer,GDT_Float64,irow,0);</span></div>
-<div class="line"><a name="l01282"></a><span class="lineno"> 1282</span>       <span class="keywordflow">if</span>(imgReaderObs.nrOfBand()>1)</div>
-<div class="line"><a name="l01283"></a><span class="lineno"> 1283</span>         imgReaderObs.readData(uncertObsLineBuffer,GDT_Float64,irow,1);</div>
-<div class="line"><a name="l01284"></a><span class="lineno"> 1284</span>     }</div>
-<div class="line"><a name="l01285"></a><span class="lineno"> 1285</span>     <span class="comment">// double oldRowMask=-1;//keep track of row mask to optimize number of line readings</span></div>
-<div class="line"><a name="l01286"></a><span class="lineno"> 1286</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> icol=0;icol<imgWriterEst.nrOfCol();++icol){</div>
-<div class="line"><a name="l01287"></a><span class="lineno"> 1287</span>       imgReaderEst.image2geo(icol,irow,geox,geoy);</div>
-<div class="line"><a name="l01288"></a><span class="lineno"> 1288</span>       <span class="keywordtype">int</span> minCol=(icol>down_opt[0]/2) ? icol-down_opt[0]/2 : 0;</div>
-<div class="line"><a name="l01289"></a><span class="lineno"> 1289</span>       <span class="keywordtype">int</span> maxCol=(icol+down_opt[0]/2<imgReaderEst.nrOfCol()) ? icol+down_opt[0]/2 : imgReaderEst.nrOfCol()-1;</div>
-<div class="line"><a name="l01290"></a><span class="lineno"> 1290</span>       <span class="keywordtype">int</span> minRow=(irow>down_opt[0]/2) ? irow-down_opt[0]/2 : 0;</div>
-<div class="line"><a name="l01291"></a><span class="lineno"> 1291</span>       <span class="keywordtype">int</span> maxRow=(irow+down_opt[0]/2<imgReaderEst.nrOfRow()) ? irow+down_opt[0]/2 : imgReaderEst.nrOfRow()-1;</div>
-<div class="line"><a name="l01292"></a><span class="lineno"> 1292</span>       <span class="keywordflow">if</span>(update){</div>
-<div class="line"><a name="l01293"></a><span class="lineno"> 1293</span>         obsWindowBuffer.clear();</div>
-<div class="line"><a name="l01294"></a><span class="lineno"> 1294</span>         <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iline=0;iline<obsLineVector.size();++iline){</div>
-<div class="line"><a name="l01295"></a><span class="lineno"> 1295</span>           <span class="keywordflow">for</span>(<span class="keywordtype">int</span> isample=minCol;isample<=maxCol;++isample){</div>
-<div class="line"><a name="l01296"></a><span class="lineno"> 1296</span>         assert(isample<obsLineVector[iline].size());</div>
-<div class="line"><a name="l01297"></a><span class="lineno"> 1297</span>         obsWindowBuffer.push_back(obsLineVector[iline][isample]);</div>
-<div class="line"><a name="l01298"></a><span class="lineno"> 1298</span>           }</div>
-<div class="line"><a name="l01299"></a><span class="lineno"> 1299</span>         }</div>
-<div class="line"><a name="l01300"></a><span class="lineno"> 1300</span>         <span class="comment">// imgReaderObs.readDataBlock(obsWindowBuffer,GDT_Float64,minCol,maxCol,minRow,maxRow,0);</span></div>
-<div class="line"><a name="l01301"></a><span class="lineno"> 1301</span>       }</div>
-<div class="line"><a name="l01302"></a><span class="lineno"> 1302</span>       <span class="keywordtype">double</span> estValue=estReadBuffer[icol];</div>
-<div class="line"><a name="l01303"></a><span class="lineno"> 1303</span>       <span class="keywordtype">double</span> estMeanValue=0;<span class="comment">//stat.mean(estWindowBuffer);</span></div>
-<div class="line"><a name="l01304"></a><span class="lineno"> 1304</span>       <span class="keywordtype">double</span> nvalid=0;</div>
-<div class="line"><a name="l01305"></a><span class="lineno"> 1305</span>       <span class="comment">//time update</span></div>
-<div class="line"><a name="l01306"></a><span class="lineno"> 1306</span>       imgReaderModel2.geo2image(geox,geoy,modCol,modRow);</div>
-<div class="line"><a name="l01307"></a><span class="lineno"> 1307</span>       assert(modRow>=0&&modRow<imgReaderModel2.nrOfRow());</div>
-<div class="line"><a name="l01308"></a><span class="lineno"> 1308</span>       <span class="keywordtype">double</span> modValue=model2LineBuffer[modCol];</div>
-<div class="line"><a name="l01309"></a><span class="lineno"> 1309</span>       <span class="keywordtype">bool</span> estNodata=imgReaderEst.isNoData(estValue);</div>
-<div class="line"><a name="l01310"></a><span class="lineno"> 1310</span>       <span class="keywordflow">if</span>(estNodata){</div>
-<div class="line"><a name="l01311"></a><span class="lineno"> 1311</span>         <span class="comment">//we have not found any valid data yet, better here to take the current model value if valid</span></div>
-<div class="line"><a name="l01312"></a><span class="lineno"> 1312</span>         <span class="keywordflow">if</span>(imgReaderModel2.isNoData(modValue)){<span class="comment">//if both estimate and model are no-data, set obs to nodata</span></div>
-<div class="line"><a name="l01313"></a><span class="lineno"> 1313</span>           estWriteBuffer[icol]=obsnodata_opt[0];</div>
-<div class="line"><a name="l01314"></a><span class="lineno"> 1314</span>           uncertWriteBuffer[icol]=uncertNodata_opt[0];</div>
-<div class="line"><a name="l01315"></a><span class="lineno"> 1315</span>         }</div>
-<div class="line"><a name="l01316"></a><span class="lineno"> 1316</span>         <span class="keywordflow">else</span>{</div>
-<div class="line"><a name="l01317"></a><span class="lineno"> 1317</span>           estWriteBuffer[icol]=modValue;</div>
-<div class="line"><a name="l01318"></a><span class="lineno"> 1318</span>           uncertWriteBuffer[icol]=uncertModel_opt[0]*stdDev;</div>
-<div class="line"><a name="l01319"></a><span class="lineno"> 1319</span>         }</div>
-<div class="line"><a name="l01320"></a><span class="lineno"> 1320</span>       }   </div>
-<div class="line"><a name="l01321"></a><span class="lineno"> 1321</span>       <span class="keywordflow">else</span>{</div>
-<div class="line"><a name="l01322"></a><span class="lineno"> 1322</span>         <span class="keywordflow">if</span>(window_opt[0]>0){</div>
-<div class="line"><a name="l01323"></a><span class="lineno"> 1323</span>           <span class="keywordflow">try</span>{</div>
-<div class="line"><a name="l01324"></a><span class="lineno"> 1324</span>         <span class="comment">// imgReaderModel2.geo2image(geox,geoy,modCol,modRow);//did that already</span></div>
-<div class="line"><a name="l01325"></a><span class="lineno"> 1325</span>         minCol=(modCol>window_opt[0]/2) ? modCol-window_opt[0]/2 : 0;</div>
-<div class="line"><a name="l01326"></a><span class="lineno"> 1326</span>         maxCol=(modCol+window_opt[0]/2<imgReaderModel2.nrOfCol()) ? modCol+window_opt[0]/2 : imgReaderModel2.nrOfCol()-1;</div>
-<div class="line"><a name="l01327"></a><span class="lineno"> 1327</span>         minRow=(modRow>window_opt[0]/2) ? modRow-window_opt[0]/2 : 0;</div>
-<div class="line"><a name="l01328"></a><span class="lineno"> 1328</span>         maxRow=(modRow+window_opt[0]/2<imgReaderModel2.nrOfRow()) ? modRow+window_opt[0]/2 : imgReaderModel2.nrOfRow()-1;</div>
-<div class="line"><a name="l01329"></a><span class="lineno"> 1329</span>         imgReaderModel2.readDataBlock(model2buffer,GDT_Float64,minCol,maxCol,minRow,maxRow,0);</div>
-<div class="line"><a name="l01330"></a><span class="lineno"> 1330</span> </div>
-<div class="line"><a name="l01331"></a><span class="lineno"> 1331</span>         imgReaderModel1.geo2image(geox,geoy,modCol,modRow);</div>
-<div class="line"><a name="l01332"></a><span class="lineno"> 1332</span>         assert(modRow>=0&&modRow<imgReaderModel1.nrOfRow());</div>
-<div class="line"><a name="l01333"></a><span class="lineno"> 1333</span>         minCol=(modCol>window_opt[0]/2) ? modCol-window_opt[0]/2 : 0;</div>
-<div class="line"><a name="l01334"></a><span class="lineno"> 1334</span>         maxCol=(modCol+window_opt[0]/2<imgReaderModel1.nrOfCol()) ? modCol+window_opt[0]/2 : imgReaderModel1.nrOfCol()-1;</div>
-<div class="line"><a name="l01335"></a><span class="lineno"> 1335</span>         minRow=(modRow>window_opt[0]/2) ? modRow-window_opt[0]/2 : 0;</div>
-<div class="line"><a name="l01336"></a><span class="lineno"> 1336</span>         maxRow=(modRow+window_opt[0]/2<imgReaderModel1.nrOfRow()) ? modRow+window_opt[0]/2 : imgReaderModel1.nrOfRow()-1;</div>
-<div class="line"><a name="l01337"></a><span class="lineno"> 1337</span>         imgReaderModel1.readDataBlock(model1buffer,GDT_Float64,minCol,maxCol,minRow,maxRow,0);</div>
-<div class="line"><a name="l01338"></a><span class="lineno"> 1338</span>         <span class="comment">// imgReaderEst.image2geo(icol,irow,geox,geoy);</span></div>
-<div class="line"><a name="l01339"></a><span class="lineno"> 1339</span>           }</div>
-<div class="line"><a name="l01340"></a><span class="lineno"> 1340</span>           <span class="keywordflow">catch</span>(<span class="keywordtype">string</span> errorString){</div>
-<div class="line"><a name="l01341"></a><span class="lineno"> 1341</span>         cerr << <span class="stringliteral">"Error reading data block for "</span> << minCol << <span class="stringliteral">"-"</span> << maxCol << <span class="stringliteral">", "</span> << minRow << <span class="stringliteral">"-"</span> << maxRow << endl;</div>
-<div class="line"><a name="l01342"></a><span class="lineno"> 1342</span>           }</div>
-<div class="line"><a name="l01343"></a><span class="lineno"> 1343</span>           <span class="comment">//erase no-data from buffer</span></div>
-<div class="line"><a name="l01344"></a><span class="lineno"> 1344</span>           vector<double>::iterator it1=model1buffer.begin();</div>
-<div class="line"><a name="l01345"></a><span class="lineno"> 1345</span>           vector<double>::iterator it2=model2buffer.begin();</div>
-<div class="line"><a name="l01346"></a><span class="lineno"> 1346</span>           <span class="keywordflow">while</span>(it1!=model1buffer.end()&&it2!=model2buffer.end()){</div>
-<div class="line"><a name="l01347"></a><span class="lineno"> 1347</span>         <span class="comment">//erase nodata</span></div>
-<div class="line"><a name="l01348"></a><span class="lineno"> 1348</span>         <span class="keywordtype">bool</span> modNodata=<span class="keyword">false</span>;</div>
-<div class="line"><a name="l01349"></a><span class="lineno"> 1349</span>         modNodata=modNodata||imgReaderModel1.isNoData(*it1);</div>
-<div class="line"><a name="l01350"></a><span class="lineno"> 1350</span>         modNodata=modNodata||imgReaderModel2.isNoData(*it2);</div>
-<div class="line"><a name="l01351"></a><span class="lineno"> 1351</span>         <span class="keywordflow">if</span>(modNodata){</div>
-<div class="line"><a name="l01352"></a><span class="lineno"> 1352</span>           model1buffer.erase(it1);</div>
-<div class="line"><a name="l01353"></a><span class="lineno"> 1353</span>           model2buffer.erase(it2);</div>
-<div class="line"><a name="l01354"></a><span class="lineno"> 1354</span>         }</div>
-<div class="line"><a name="l01355"></a><span class="lineno"> 1355</span>         <span class="keywordflow">else</span>{</div>
-<div class="line"><a name="l01356"></a><span class="lineno"> 1356</span>           ++it1;</div>
-<div class="line"><a name="l01357"></a><span class="lineno"> 1357</span>           ++it2;</div>
-<div class="line"><a name="l01358"></a><span class="lineno"> 1358</span>         }</div>
-<div class="line"><a name="l01359"></a><span class="lineno"> 1359</span>           }</div>
-<div class="line"><a name="l01360"></a><span class="lineno"> 1360</span>           <span class="keywordflow">if</span>(model1buffer.size()>minreg_opt[0]&&model2buffer.size()>minreg_opt[0]){</div>
-<div class="line"><a name="l01361"></a><span class="lineno"> 1361</span>         errMod=stat.linear_regression_err(model1buffer,model2buffer,c0mod,c1mod);</div>
-<div class="line"><a name="l01362"></a><span class="lineno"> 1362</span>         errMod*=regTime_opt[0];</div>
-<div class="line"><a name="l01363"></a><span class="lineno"> 1363</span>           }</div>
-<div class="line"><a name="l01364"></a><span class="lineno"> 1364</span>           <span class="keywordflow">else</span>{<span class="comment">//use global regression...</span></div>
-<div class="line"><a name="l01365"></a><span class="lineno"> 1365</span>         c0mod=c0modGlobal;</div>
-<div class="line"><a name="l01366"></a><span class="lineno"> 1366</span>         c1mod=c1modGlobal;</div>
-<div class="line"><a name="l01367"></a><span class="lineno"> 1367</span>           }</div>
-<div class="line"><a name="l01368"></a><span class="lineno"> 1368</span>         }</div>
-<div class="line"><a name="l01369"></a><span class="lineno"> 1369</span>         <span class="keywordflow">else</span>{</div>
-<div class="line"><a name="l01370"></a><span class="lineno"> 1370</span>           c0mod=c0modGlobal;</div>
-<div class="line"><a name="l01371"></a><span class="lineno"> 1371</span>           c1mod=c1modGlobal;</div>
-<div class="line"><a name="l01372"></a><span class="lineno"> 1372</span>         }</div>
-<div class="line"><a name="l01373"></a><span class="lineno"> 1373</span>         <span class="keywordtype">double</span> certNorm=(errMod*errMod+errObs*errObs);</div>
-<div class="line"><a name="l01374"></a><span class="lineno"> 1374</span>         <span class="keywordtype">double</span> certMod=errObs*errObs/certNorm;</div>
-<div class="line"><a name="l01375"></a><span class="lineno"> 1375</span>         <span class="keywordtype">double</span> certObs=errMod*errMod/certNorm;</div>
-<div class="line"><a name="l01376"></a><span class="lineno"> 1376</span>         <span class="keywordtype">double</span> regTime=(c0mod+c1mod*estValue)*certObs;</div>
-<div class="line"><a name="l01377"></a><span class="lineno"> 1377</span> </div>
-<div class="line"><a name="l01378"></a><span class="lineno"> 1378</span>         <span class="comment">// double regSensor=(c0obs+c1obs*estValue)*certObs;</span></div>
-<div class="line"><a name="l01379"></a><span class="lineno"> 1379</span>         <span class="keywordtype">double</span> regSensor=(c0obs+c1obs*modValue)*certMod;</div>
-<div class="line"><a name="l01380"></a><span class="lineno"> 1380</span>         estWriteBuffer[icol]=regTime+regSensor;</div>
-<div class="line"><a name="l01381"></a><span class="lineno"> 1381</span>         <span class="keywordtype">double</span> totalUncertainty=0;</div>
-<div class="line"><a name="l01382"></a><span class="lineno"> 1382</span>         <span class="keywordflow">if</span>(errMod<eps_opt[0])</div>
-<div class="line"><a name="l01383"></a><span class="lineno"> 1383</span>           totalUncertainty=errObs;</div>
-<div class="line"><a name="l01384"></a><span class="lineno"> 1384</span>         <span class="keywordflow">else</span> <span class="keywordflow">if</span>(errObs<eps_opt[0])</div>
-<div class="line"><a name="l01385"></a><span class="lineno"> 1385</span>           totalUncertainty=errMod;</div>
-<div class="line"><a name="l01386"></a><span class="lineno"> 1386</span>         <span class="keywordflow">else</span>{</div>
-<div class="line"><a name="l01387"></a><span class="lineno"> 1387</span>           totalUncertainty=1.0/errMod/errMod+1/errObs/errObs;</div>
-<div class="line"><a name="l01388"></a><span class="lineno"> 1388</span>           totalUncertainty=sqrt(1.0/totalUncertainty);</div>
-<div class="line"><a name="l01389"></a><span class="lineno"> 1389</span>         }</div>
-<div class="line"><a name="l01390"></a><span class="lineno"> 1390</span>         uncertWriteBuffer[icol]=totalUncertainty+uncertReadBuffer[icol];</div>
-<div class="line"><a name="l01391"></a><span class="lineno"> 1391</span>       }</div>
-<div class="line"><a name="l01392"></a><span class="lineno"> 1392</span>       <span class="comment">//measurement update</span></div>
-<div class="line"><a name="l01393"></a><span class="lineno"> 1393</span>       <span class="keywordflow">if</span>(update&&!imgReaderObs.isNoData(obsLineBuffer[icol])){</div>
-<div class="line"><a name="l01394"></a><span class="lineno"> 1394</span>         <span class="keywordtype">double</span> kalmanGain=1;</div>
-<div class="line"><a name="l01395"></a><span class="lineno"> 1395</span>         <span class="keywordtype">double</span> uncertObs=uncertObs_opt[0];</div>
-<div class="line"><a name="l01396"></a><span class="lineno"> 1396</span>         <span class="keywordflow">if</span>(uncertObsLineBuffer.size()>icol)</div>
-<div class="line"><a name="l01397"></a><span class="lineno"> 1397</span>           uncertObs=uncertObsLineBuffer[icol];</div>
-<div class="line"><a name="l01398"></a><span class="lineno"> 1398</span>         <span class="keywordflow">else</span> <span class="keywordflow">if</span>(weight_opt.size()>1||deltaObs_opt.size()){</div>
-<div class="line"><a name="l01399"></a><span class="lineno"> 1399</span>           <a class="code" href="classstatfactory_1_1StatFactory.html">statfactory::StatFactory</a> statobs;</div>
-<div class="line"><a name="l01400"></a><span class="lineno"> 1400</span>           statobs.setNoDataValues(obsnodata_opt);</div>
-<div class="line"><a name="l01401"></a><span class="lineno"> 1401</span>           <span class="keywordtype">double</span> obsMeanValue=(statobs.mean(obsWindowBuffer)-c0obs)/c1obs;</div>
-<div class="line"><a name="l01402"></a><span class="lineno"> 1402</span>           <span class="keywordtype">double</span> difference=obsMeanValue-modValue;</div>
-<div class="line"><a name="l01403"></a><span class="lineno"> 1403</span>           <span class="keywordflow">if</span>(modValue){</div>
-<div class="line"><a name="l01404"></a><span class="lineno"> 1404</span>         <span class="keywordtype">double</span> relativeDifference=difference/modValue;</div>
-<div class="line"><a name="l01405"></a><span class="lineno"> 1405</span>         <span class="keywordflow">if</span>(deltaObs_opt.size()){</div>
-<div class="line"><a name="l01406"></a><span class="lineno"> 1406</span>           assert(deltaObs_opt.size()>1);</div>
-<div class="line"><a name="l01407"></a><span class="lineno"> 1407</span>           <span class="keywordflow">if</span>(100*relativeDifference<deltaObs_opt[0])<span class="comment">//lower bound</span></div>
-<div class="line"><a name="l01408"></a><span class="lineno"> 1408</span>             kalmanGain=0;</div>
-<div class="line"><a name="l01409"></a><span class="lineno"> 1409</span>           <span class="keywordflow">else</span> <span class="keywordflow">if</span>(100*relativeDifference>deltaObs_opt[1])<span class="comment">//upper bound</span></div>
-<div class="line"><a name="l01410"></a><span class="lineno"> 1410</span>             kalmanGain=0;</div>
-<div class="line"><a name="l01411"></a><span class="lineno"> 1411</span>         }</div>
-<div class="line"><a name="l01412"></a><span class="lineno"> 1412</span>         <span class="keywordflow">else</span> <span class="keywordflow">if</span>(weight_opt.size()){</div>
-<div class="line"><a name="l01413"></a><span class="lineno"> 1413</span>           assert(weight_opt.size()>1);</div>
-<div class="line"><a name="l01414"></a><span class="lineno"> 1414</span>           <span class="keywordflow">if</span>(obsMeanValue<modValue)</div>
-<div class="line"><a name="l01415"></a><span class="lineno"> 1415</span>             uncertObs=weight_opt[0]*relativeDifference;</div>
-<div class="line"><a name="l01416"></a><span class="lineno"> 1416</span>           <span class="keywordflow">else</span> <span class="keywordflow">if</span>(obsMeanValue>modValue)</div>
-<div class="line"><a name="l01417"></a><span class="lineno"> 1417</span>             uncertObs=weight_opt[1]*relativeDifference;</div>
-<div class="line"><a name="l01418"></a><span class="lineno"> 1418</span>         }</div>
-<div class="line"><a name="l01419"></a><span class="lineno"> 1419</span>           }</div>
-<div class="line"><a name="l01420"></a><span class="lineno"> 1420</span>           <span class="keywordflow">if</span>(uncertObs<=0)</div>
-<div class="line"><a name="l01421"></a><span class="lineno"> 1421</span>         uncertObs=0;</div>
-<div class="line"><a name="l01422"></a><span class="lineno"> 1422</span>           <span class="keywordflow">if</span>(verbose_opt[0]>1)</div>
-<div class="line"><a name="l01423"></a><span class="lineno"> 1423</span>         cout << <span class="stringliteral">"obsMeanValue:"</span> << obsMeanValue << <span class="stringliteral">", modValue: "</span> << modValue << endl;</div>
-<div class="line"><a name="l01424"></a><span class="lineno"> 1424</span>         }</div>
-<div class="line"><a name="l01425"></a><span class="lineno"> 1425</span>         <span class="keywordflow">if</span>(kalmanGain>0){</div>
-<div class="line"><a name="l01426"></a><span class="lineno"> 1426</span>           <span class="keywordflow">if</span>((uncertWriteBuffer[icol]+uncertObs)>eps_opt[0])</div>
-<div class="line"><a name="l01427"></a><span class="lineno"> 1427</span>         kalmanGain=uncertWriteBuffer[icol]/(uncertWriteBuffer[icol]+uncertObs);</div>
-<div class="line"><a name="l01428"></a><span class="lineno"> 1428</span>         }</div>
-<div class="line"><a name="l01429"></a><span class="lineno"> 1429</span>         assert(kalmanGain<=1);</div>
-<div class="line"><a name="l01430"></a><span class="lineno"> 1430</span>         estWriteBuffer[icol]+=kalmanGain*(obsLineBuffer[icol]-estWriteBuffer[icol]);</div>
-<div class="line"><a name="l01431"></a><span class="lineno"> 1431</span>         uncertWriteBuffer[icol]*=(1-kalmanGain);</div>
-<div class="line"><a name="l01432"></a><span class="lineno"> 1432</span>       }</div>
-<div class="line"><a name="l01433"></a><span class="lineno"> 1433</span>     }</div>
-<div class="line"><a name="l01434"></a><span class="lineno"> 1434</span>     imgWriterEst.writeData(estWriteBuffer,GDT_Float64,irow,0);</div>
-<div class="line"><a name="l01435"></a><span class="lineno"> 1435</span>     imgWriterEst.writeData(uncertWriteBuffer,GDT_Float64,irow,1);</div>
-<div class="line"><a name="l01436"></a><span class="lineno"> 1436</span>     progress=<span class="keyword">static_cast<</span><span class="keywordtype">float</span><span class="keyword">></span>((irow+1.0)/imgWriterEst.nrOfRow());</div>
-<div class="line"><a name="l01437"></a><span class="lineno"> 1437</span>     pfnProgress(progress,pszMessage,pProgressArg);</div>
-<div class="line"><a name="l01438"></a><span class="lineno"> 1438</span>       }</div>
-<div class="line"><a name="l01439"></a><span class="lineno"> 1439</span> </div>
-<div class="line"><a name="l01440"></a><span class="lineno"> 1440</span>       imgWriterEst.close();</div>
-<div class="line"><a name="l01441"></a><span class="lineno"> 1441</span>       imgReaderEst.close();</div>
-<div class="line"><a name="l01442"></a><span class="lineno"> 1442</span> </div>
-<div class="line"><a name="l01443"></a><span class="lineno"> 1443</span>       <span class="keywordflow">if</span>(update){</div>
-<div class="line"><a name="l01444"></a><span class="lineno"> 1444</span>     imgReaderObs.close();</div>
-<div class="line"><a name="l01445"></a><span class="lineno"> 1445</span>     --obsindex;</div>
-<div class="line"><a name="l01446"></a><span class="lineno"> 1446</span>       }</div>
-<div class="line"><a name="l01447"></a><span class="lineno"> 1447</span>       imgReaderModel1.close();</div>
-<div class="line"><a name="l01448"></a><span class="lineno"> 1448</span>       imgReaderModel2.close();</div>
-<div class="line"><a name="l01449"></a><span class="lineno"> 1449</span>     }</div>
-<div class="line"><a name="l01450"></a><span class="lineno"> 1450</span>   }</div>
-<div class="line"><a name="l01451"></a><span class="lineno"> 1451</span>   <span class="keywordflow">if</span>(find(direction_opt.begin(),direction_opt.end(),<span class="stringliteral">"smooth"</span>)!=direction_opt.end()){</div>
-<div class="line"><a name="l01453"></a><span class="lineno"> 1453</span>     cout << <span class="stringliteral">"Running smooth model"</span> << endl;</div>
-<div class="line"><a name="l01454"></a><span class="lineno"> 1454</span>     obsindex=0;</div>
-<div class="line"><a name="l01455"></a><span class="lineno"> 1455</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> modindex=0;modindex<model_opt.size();++modindex){</div>
-<div class="line"><a name="l01456"></a><span class="lineno"> 1456</span>       <span class="keywordflow">if</span>(verbose_opt[0]){</div>
-<div class="line"><a name="l01457"></a><span class="lineno"> 1457</span>     cout << <span class="stringliteral">"processing time "</span> << tmodel_opt[modindex] << endl;</div>
-<div class="line"><a name="l01458"></a><span class="lineno"> 1458</span>     <span class="keywordflow">if</span>(obsindex<relobsindex.size())</div>
-<div class="line"><a name="l01459"></a><span class="lineno"> 1459</span>       cout << <span class="stringliteral">"next observation "</span> << tmodel_opt[relobsindex[obsindex]] << endl;</div>
-<div class="line"><a name="l01460"></a><span class="lineno"> 1460</span>     <span class="keywordflow">else</span></div>
-<div class="line"><a name="l01461"></a><span class="lineno"> 1461</span>       cout << <span class="stringliteral">"There is no next observation"</span> << endl;</div>
-<div class="line"><a name="l01462"></a><span class="lineno"> 1462</span>       }</div>
-<div class="line"><a name="l01463"></a><span class="lineno"> 1463</span>       <span class="keywordtype">string</span> output;</div>
-<div class="line"><a name="l01464"></a><span class="lineno"> 1464</span>       <span class="keywordflow">if</span>(outputfb_opt.size()==model_opt.size())</div>
-<div class="line"><a name="l01465"></a><span class="lineno"> 1465</span>     output=outputfb_opt[modindex];</div>
+<div class="line"><a name="l01049"></a><span class="lineno"> 1049</span>         <span class="keywordflow">if</span>(kalmanGain>0){</div>
+<div class="line"><a name="l01050"></a><span class="lineno"> 1050</span>           <span class="keywordflow">if</span>((uncertWriteBuffer[icol]+uncertObs)>eps_opt[0])</div>
+<div class="line"><a name="l01051"></a><span class="lineno"> 1051</span>           kalmanGain=uncertWriteBuffer[icol]/(uncertWriteBuffer[icol]+uncertObs);</div>
+<div class="line"><a name="l01052"></a><span class="lineno"> 1052</span>         }</div>
+<div class="line"><a name="l01053"></a><span class="lineno"> 1053</span>         assert(kalmanGain<=1);</div>
+<div class="line"><a name="l01054"></a><span class="lineno"> 1054</span>         estWriteBuffer[icol]+=kalmanGain*(obsLineBuffer[icol]-estWriteBuffer[icol]);</div>
+<div class="line"><a name="l01055"></a><span class="lineno"> 1055</span>         <span class="keywordflow">if</span>(obsmin_opt.size()){</div>
+<div class="line"><a name="l01056"></a><span class="lineno"> 1056</span>           <span class="keywordflow">if</span>(estWriteBuffer[icol]<obsmin_opt[0])</div>
+<div class="line"><a name="l01057"></a><span class="lineno"> 1057</span>         estWriteBuffer[icol]=obsnodata_opt[0];</div>
+<div class="line"><a name="l01058"></a><span class="lineno"> 1058</span>         }</div>
+<div class="line"><a name="l01059"></a><span class="lineno"> 1059</span>         <span class="keywordflow">if</span>(obsmax_opt.size()){</div>
+<div class="line"><a name="l01060"></a><span class="lineno"> 1060</span>           <span class="keywordflow">if</span>(estWriteBuffer[icol]>obsmax_opt[0])</div>
+<div class="line"><a name="l01061"></a><span class="lineno"> 1061</span>         estWriteBuffer[icol]=obsnodata_opt[0];</div>
+<div class="line"><a name="l01062"></a><span class="lineno"> 1062</span>         }</div>
+<div class="line"><a name="l01063"></a><span class="lineno"> 1063</span>         uncertWriteBuffer[icol]*=(1-kalmanGain);</div>
+<div class="line"><a name="l01064"></a><span class="lineno"> 1064</span>         <span class="comment">//test</span></div>
+<div class="line"><a name="l01065"></a><span class="lineno"> 1065</span>         gainWriteBuffer[icol]=kalmanGain;</div>
+<div class="line"><a name="l01066"></a><span class="lineno"> 1066</span>       }</div>
+<div class="line"><a name="l01067"></a><span class="lineno"> 1067</span>       <span class="comment">//test</span></div>
+<div class="line"><a name="l01068"></a><span class="lineno"> 1068</span>       <span class="keywordflow">if</span>(!imgReaderObs.isNoData(estWriteBuffer[icol])){</div>
+<div class="line"><a name="l01069"></a><span class="lineno"> 1069</span>         <span class="keywordflow">if</span>(obsmin_opt.size())</div>
+<div class="line"><a name="l01070"></a><span class="lineno"> 1070</span>           assert(estWriteBuffer[icol]>=obsmin_opt[0]);</div>
+<div class="line"><a name="l01071"></a><span class="lineno"> 1071</span>         <span class="keywordflow">if</span>(obsmax_opt.size())</div>
+<div class="line"><a name="l01072"></a><span class="lineno"> 1072</span>           assert(estWriteBuffer[icol]<=obsmax_opt[0]);</div>
+<div class="line"><a name="l01073"></a><span class="lineno"> 1073</span>       }</div>
+<div class="line"><a name="l01074"></a><span class="lineno"> 1074</span>     }</div>
+<div class="line"><a name="l01075"></a><span class="lineno"> 1075</span>     <span class="comment">//test</span></div>
+<div class="line"><a name="l01076"></a><span class="lineno"> 1076</span>     <span class="keywordflow">if</span>(gain_opt.size()){</div>
+<div class="line"><a name="l01077"></a><span class="lineno"> 1077</span>       imgWriterGain.writeData(gainWriteBuffer,GDT_Float64,irow,modindex);</div>
+<div class="line"><a name="l01078"></a><span class="lineno"> 1078</span>     }</div>
+<div class="line"><a name="l01079"></a><span class="lineno"> 1079</span>     imgWriterEst.writeData(estWriteBuffer,GDT_Float64,irow,0);</div>
+<div class="line"><a name="l01080"></a><span class="lineno"> 1080</span>     imgWriterEst.writeData(uncertWriteBuffer,GDT_Float64,irow,1);</div>
+<div class="line"><a name="l01081"></a><span class="lineno"> 1081</span>     progress=<span class="keyword">static_cast<</span><span class="keywordtype">float</span><span class="keyword">></span>((irow+1.0)/imgWriterEst.nrOfRow());</div>
+<div class="line"><a name="l01082"></a><span class="lineno"> 1082</span>     pfnProgress(progress,pszMessage,pProgressArg);</div>
+<div class="line"><a name="l01083"></a><span class="lineno"> 1083</span>       }</div>
+<div class="line"><a name="l01084"></a><span class="lineno"> 1084</span> </div>
+<div class="line"><a name="l01085"></a><span class="lineno"> 1085</span>       imgWriterEst.close();</div>
+<div class="line"><a name="l01086"></a><span class="lineno"> 1086</span>       imgReaderEst.close();</div>
+<div class="line"><a name="l01087"></a><span class="lineno"> 1087</span> </div>
+<div class="line"><a name="l01088"></a><span class="lineno"> 1088</span>       <span class="keywordflow">if</span>(update){</div>
+<div class="line"><a name="l01089"></a><span class="lineno"> 1089</span>     imgReaderObs.close();</div>
+<div class="line"><a name="l01090"></a><span class="lineno"> 1090</span>     ++obsindex;</div>
+<div class="line"><a name="l01091"></a><span class="lineno"> 1091</span>       }</div>
+<div class="line"><a name="l01092"></a><span class="lineno"> 1092</span>       imgReaderModel1.close();</div>
+<div class="line"><a name="l01093"></a><span class="lineno"> 1093</span>       imgReaderModel2.close();</div>
+<div class="line"><a name="l01094"></a><span class="lineno"> 1094</span>     }</div>
+<div class="line"><a name="l01095"></a><span class="lineno"> 1095</span>     <span class="keywordflow">if</span>(gain_opt.size())</div>
+<div class="line"><a name="l01096"></a><span class="lineno"> 1096</span>       imgWriterGain.close();</div>
+<div class="line"><a name="l01097"></a><span class="lineno"> 1097</span>   }</div>
+<div class="line"><a name="l01098"></a><span class="lineno"> 1098</span>   <span class="keywordflow">if</span>(find(direction_opt.begin(),direction_opt.end(),<span class="stringliteral">"backward"</span>)!=direction_opt.end()){</div>
+<div class="line"><a name="l01100"></a><span class="lineno"> 1100</span>     cout << <span class="stringliteral">"Running backward model"</span> << endl;</div>
+<div class="line"><a name="l01101"></a><span class="lineno"> 1101</span>     obsindex=relobsindex.size()-1;</div>
+<div class="line"><a name="l01102"></a><span class="lineno"> 1102</span>     <span class="comment">//initialization</span></div>
+<div class="line"><a name="l01103"></a><span class="lineno"> 1103</span>     <span class="keywordtype">string</span> output;</div>
+<div class="line"><a name="l01104"></a><span class="lineno"> 1104</span>     <span class="keywordflow">if</span>(outputbw_opt.size()==model_opt.size())</div>
+<div class="line"><a name="l01105"></a><span class="lineno"> 1105</span>       output=outputbw_opt.back();</div>
+<div class="line"><a name="l01106"></a><span class="lineno"> 1106</span>     <span class="keywordflow">else</span>{</div>
+<div class="line"><a name="l01107"></a><span class="lineno"> 1107</span>       ostringstream outputstream;</div>
+<div class="line"><a name="l01108"></a><span class="lineno"> 1108</span>       outputstream << outputbw_opt[0] << <span class="stringliteral">"_"</span>;</div>
+<div class="line"><a name="l01109"></a><span class="lineno"> 1109</span>       outputstream << setfill(<span class="charliteral">'0'</span>) << setw(ndigit) << tmodel_opt.back();</div>
+<div class="line"><a name="l01110"></a><span class="lineno"> 1110</span>       outputstream << <span class="stringliteral">".tif"</span>;</div>
+<div class="line"><a name="l01111"></a><span class="lineno"> 1111</span>       <span class="comment">// outputstream << outputbw_opt[0] << "_" << tmodel_opt.back() << ".tif";</span></div>
+<div class="line"><a name="l01112"></a><span class="lineno"> 1112</span>       output=outputstream.str();</div>
+<div class="line"><a name="l01113"></a><span class="lineno"> 1113</span>     }</div>
+<div class="line"><a name="l01114"></a><span class="lineno"> 1114</span>     <span class="keywordflow">if</span>(verbose_opt[0])</div>
+<div class="line"><a name="l01115"></a><span class="lineno"> 1115</span>       cout << <span class="stringliteral">"Opening image "</span> << output << <span class="stringliteral">" for writing "</span> << endl;</div>
+<div class="line"><a name="l01116"></a><span class="lineno"> 1116</span>     imgWriterEst.open(output,ncol,nrow,2,GDT_Float64,imageType,option_opt);</div>
+<div class="line"><a name="l01117"></a><span class="lineno"> 1117</span>     imgWriterEst.setProjectionProj4(projection_opt[0]);</div>
+<div class="line"><a name="l01118"></a><span class="lineno"> 1118</span>     imgWriterEst.setGeoTransform(geotransform);</div>
+<div class="line"><a name="l01119"></a><span class="lineno"> 1119</span>     imgWriterEst.GDALSetNoDataValue(obsnodata_opt[0]);</div>
+<div class="line"><a name="l01120"></a><span class="lineno"> 1120</span> </div>
+<div class="line"><a name="l01121"></a><span class="lineno"> 1121</span>     <span class="keywordflow">if</span>(verbose_opt[0]){</div>
+<div class="line"><a name="l01122"></a><span class="lineno"> 1122</span>       cout << <span class="stringliteral">"processing time "</span> << tmodel_opt.back() << endl;</div>
+<div class="line"><a name="l01123"></a><span class="lineno"> 1123</span>       <span class="keywordflow">if</span>(obsindex<relobsindex.size())</div>
+<div class="line"><a name="l01124"></a><span class="lineno"> 1124</span>     cout << <span class="stringliteral">"next observation "</span> << tmodel_opt[relobsindex[obsindex]] << endl;</div>
+<div class="line"><a name="l01125"></a><span class="lineno"> 1125</span>       <span class="keywordflow">else</span></div>
+<div class="line"><a name="l01126"></a><span class="lineno"> 1126</span>     cout << <span class="stringliteral">"There is no next observation"</span> << endl;</div>
+<div class="line"><a name="l01127"></a><span class="lineno"> 1127</span>     }</div>
+<div class="line"><a name="l01128"></a><span class="lineno"> 1128</span> </div>
+<div class="line"><a name="l01129"></a><span class="lineno"> 1129</span>     <span class="keywordflow">try</span>{</div>
+<div class="line"><a name="l01130"></a><span class="lineno"> 1130</span>       imgReaderModel1.open(model_opt.back());</div>
+<div class="line"><a name="l01131"></a><span class="lineno"> 1131</span>       imgReaderModel1.setNoData(modnodata_opt);</div>
+<div class="line"><a name="l01132"></a><span class="lineno"> 1132</span>       <span class="keywordflow">if</span>(modoffset_opt.size())</div>
+<div class="line"><a name="l01133"></a><span class="lineno"> 1133</span>     imgReaderModel1.setOffset(modoffset_opt[0]);</div>
+<div class="line"><a name="l01134"></a><span class="lineno"> 1134</span>       <span class="keywordflow">if</span>(modscale_opt.size())</div>
+<div class="line"><a name="l01135"></a><span class="lineno"> 1135</span>     imgReaderModel1.setScale(modscale_opt[0]);</div>
+<div class="line"><a name="l01136"></a><span class="lineno"> 1136</span>     }</div>
+<div class="line"><a name="l01137"></a><span class="lineno"> 1137</span>     <span class="keywordflow">catch</span>(<span class="keywordtype">string</span> errorString){</div>
+<div class="line"><a name="l01138"></a><span class="lineno"> 1138</span>       cerr << errorString << endl;</div>
+<div class="line"><a name="l01139"></a><span class="lineno"> 1139</span>     }</div>
+<div class="line"><a name="l01140"></a><span class="lineno"> 1140</span>     <span class="keywordflow">catch</span>(...){</div>
+<div class="line"><a name="l01141"></a><span class="lineno"> 1141</span>       cerr << <span class="stringliteral">"Error opening file "</span> << model_opt[0] << endl;</div>
+<div class="line"><a name="l01142"></a><span class="lineno"> 1142</span>     }</div>
+<div class="line"><a name="l01143"></a><span class="lineno"> 1143</span> </div>
+<div class="line"><a name="l01144"></a><span class="lineno"> 1144</span>     <span class="comment">//calculate standard deviation of image to serve as model uncertainty</span></div>
+<div class="line"><a name="l01145"></a><span class="lineno"> 1145</span>     GDALRasterBand* rasterBand;</div>
+<div class="line"><a name="l01146"></a><span class="lineno"> 1146</span>     rasterBand=imgReaderModel1.getRasterBand(0);</div>
+<div class="line"><a name="l01147"></a><span class="lineno"> 1147</span>     <span class="keywordtype">double</span> minValue, maxValue, meanValue, stdDev;</div>
+<div class="line"><a name="l01148"></a><span class="lineno"> 1148</span>     <span class="keywordtype">void</span>* pProgressData;</div>
+<div class="line"><a name="l01149"></a><span class="lineno"> 1149</span>     rasterBand->ComputeStatistics(0,&minValue,&maxValue,&meanValue,&stdDev,pfnProgress,pProgressData);</div>
+<div class="line"><a name="l01150"></a><span class="lineno"> 1150</span>     <span class="keywordtype">double</span> modRow=0;</div>
+<div class="line"><a name="l01151"></a><span class="lineno"> 1151</span>     <span class="keywordtype">double</span> modCol=0;</div>
+<div class="line"><a name="l01152"></a><span class="lineno"> 1152</span>     <span class="keywordflow">if</span>(relobsindex.back()<model_opt.size()-1){<span class="comment">//initialize output_opt.back() as model[0]</span></div>
+<div class="line"><a name="l01153"></a><span class="lineno"> 1153</span>       <span class="comment">//write last model as output</span></div>
+<div class="line"><a name="l01154"></a><span class="lineno"> 1154</span>       <span class="keywordflow">if</span>(verbose_opt[0])</div>
+<div class="line"><a name="l01155"></a><span class="lineno"> 1155</span>     cout << <span class="stringliteral">"write last model as output"</span> << endl;</div>
+<div class="line"><a name="l01156"></a><span class="lineno"> 1156</span>       <span class="keywordflow">for</span>(<span class="keywordtype">int</span> irow=0;irow<nrow;++irow){</div>
+<div class="line"><a name="l01157"></a><span class="lineno"> 1157</span>     vector<double> estReadBuffer;</div>
+<div class="line"><a name="l01158"></a><span class="lineno"> 1158</span>     vector<double> estWriteBuffer(ncol);</div>
+<div class="line"><a name="l01159"></a><span class="lineno"> 1159</span>     vector<double> uncertWriteBuffer(ncol);</div>
+<div class="line"><a name="l01160"></a><span class="lineno"> 1160</span>     <span class="comment">// vector<double> lineMask;</span></div>
+<div class="line"><a name="l01161"></a><span class="lineno"> 1161</span>     imgWriterEst.image2geo(0,irow,geox,geoy);</div>
+<div class="line"><a name="l01162"></a><span class="lineno"> 1162</span>     imgReaderModel1.geo2image(geox,geoy,modCol,modRow);</div>
+<div class="line"><a name="l01163"></a><span class="lineno"> 1163</span>     assert(modRow>=0&&modRow<imgReaderModel1.nrOfRow());</div>
+<div class="line"><a name="l01164"></a><span class="lineno"> 1164</span>     <span class="keywordflow">try</span>{</div>
+<div class="line"><a name="l01165"></a><span class="lineno"> 1165</span>       imgReaderModel1.readData(estReadBuffer,GDT_Float64,modRow);</div>
+<div class="line"><a name="l01166"></a><span class="lineno"> 1166</span>       <span class="comment">//simple nearest neighbor</span></div>
+<div class="line"><a name="l01167"></a><span class="lineno"> 1167</span>       <span class="comment">//stat.nearUp(estReadBuffer,estWriteBuffer);</span></div>
+<div class="line"><a name="l01168"></a><span class="lineno"> 1168</span> </div>
+<div class="line"><a name="l01169"></a><span class="lineno"> 1169</span>       <span class="comment">// double oldRowMask=-1;//keep track of row mask to optimize number of line readings</span></div>
+<div class="line"><a name="l01170"></a><span class="lineno"> 1170</span>       <span class="keywordflow">for</span>(<span class="keywordtype">int</span> icol=0;icol<imgWriterEst.nrOfCol();++icol){</div>
+<div class="line"><a name="l01171"></a><span class="lineno"> 1171</span>         imgWriterEst.image2geo(icol,irow,geox,geoy);        </div>
+<div class="line"><a name="l01172"></a><span class="lineno"> 1172</span>         imgReaderModel1.geo2image(geox,geoy,modCol,modRow);</div>
+<div class="line"><a name="l01173"></a><span class="lineno"> 1173</span>         <span class="keywordtype">double</span> modValue=estReadBuffer[modCol];</div>
+<div class="line"><a name="l01174"></a><span class="lineno"> 1174</span>         <span class="keywordflow">if</span>(imgReaderModel1.isNoData(modValue)){</div>
+<div class="line"><a name="l01175"></a><span class="lineno"> 1175</span>           estWriteBuffer[icol]=obsnodata_opt[0];</div>
+<div class="line"><a name="l01176"></a><span class="lineno"> 1176</span>           uncertWriteBuffer[icol]=uncertNodata_opt[0];</div>
+<div class="line"><a name="l01177"></a><span class="lineno"> 1177</span>         }</div>
+<div class="line"><a name="l01178"></a><span class="lineno"> 1178</span>         <span class="keywordflow">else</span>{</div>
+<div class="line"><a name="l01179"></a><span class="lineno"> 1179</span>           estWriteBuffer[icol]=modValue;</div>
+<div class="line"><a name="l01180"></a><span class="lineno"> 1180</span>           uncertWriteBuffer[icol]=uncertModel_opt[0]*stdDev;</div>
+<div class="line"><a name="l01181"></a><span class="lineno"> 1181</span>         }</div>
+<div class="line"><a name="l01182"></a><span class="lineno"> 1182</span>         <span class="comment">//test</span></div>
+<div class="line"><a name="l01183"></a><span class="lineno"> 1183</span>         <span class="keywordflow">if</span>(!imgReaderObs.isNoData(estWriteBuffer[icol])){</div>
+<div class="line"><a name="l01184"></a><span class="lineno"> 1184</span>           <span class="keywordflow">if</span>(obsmin_opt.size())</div>
+<div class="line"><a name="l01185"></a><span class="lineno"> 1185</span>         assert(estWriteBuffer[icol]>=obsmin_opt[0]);</div>
+<div class="line"><a name="l01186"></a><span class="lineno"> 1186</span>           <span class="keywordflow">if</span>(obsmax_opt.size())</div>
+<div class="line"><a name="l01187"></a><span class="lineno"> 1187</span>         assert(estWriteBuffer[icol]<=obsmax_opt[0]);</div>
+<div class="line"><a name="l01188"></a><span class="lineno"> 1188</span>         }</div>
+<div class="line"><a name="l01189"></a><span class="lineno"> 1189</span>       }</div>
+<div class="line"><a name="l01190"></a><span class="lineno"> 1190</span>       imgWriterEst.writeData(estWriteBuffer,GDT_Float64,irow,0);</div>
+<div class="line"><a name="l01191"></a><span class="lineno"> 1191</span>       imgWriterEst.writeData(uncertWriteBuffer,GDT_Float64,irow,1);</div>
+<div class="line"><a name="l01192"></a><span class="lineno"> 1192</span>     }</div>
+<div class="line"><a name="l01193"></a><span class="lineno"> 1193</span>     <span class="keywordflow">catch</span>(<span class="keywordtype">string</span> errorString){</div>
+<div class="line"><a name="l01194"></a><span class="lineno"> 1194</span>       cerr << errorString << endl;</div>
+<div class="line"><a name="l01195"></a><span class="lineno"> 1195</span>     }</div>
+<div class="line"><a name="l01196"></a><span class="lineno"> 1196</span>     <span class="keywordflow">catch</span>(...){</div>
+<div class="line"><a name="l01197"></a><span class="lineno"> 1197</span>       cerr << <span class="stringliteral">"Error writing file "</span> << imgWriterEst.getFileName() << endl;</div>
+<div class="line"><a name="l01198"></a><span class="lineno"> 1198</span>     }</div>
+<div class="line"><a name="l01199"></a><span class="lineno"> 1199</span>       }</div>
+<div class="line"><a name="l01200"></a><span class="lineno"> 1200</span>     }</div>
+<div class="line"><a name="l01201"></a><span class="lineno"> 1201</span>     <span class="keywordflow">else</span>{<span class="comment">//we have an measurement at end time</span></div>
+<div class="line"><a name="l01202"></a><span class="lineno"> 1202</span>       <span class="keywordflow">if</span>(verbose_opt[0])</div>
+<div class="line"><a name="l01203"></a><span class="lineno"> 1203</span>     cout << <span class="stringliteral">"we have an measurement at end time"</span> << endl;</div>
+<div class="line"><a name="l01204"></a><span class="lineno"> 1204</span>       imgReaderObs.open(observation_opt.back());</div>
+<div class="line"><a name="l01205"></a><span class="lineno"> 1205</span>       imgReaderObs.getGeoTransform(geotransform);</div>
+<div class="line"><a name="l01206"></a><span class="lineno"> 1206</span>       imgReaderObs.setNoData(obsnodata_opt);</div>
+<div class="line"><a name="l01207"></a><span class="lineno"> 1207</span>       <span class="keywordflow">if</span>(obsoffset_opt.size())</div>
+<div class="line"><a name="l01208"></a><span class="lineno"> 1208</span>     imgReaderObs.setOffset(obsoffset_opt[0]);</div>
+<div class="line"><a name="l01209"></a><span class="lineno"> 1209</span>       <span class="keywordflow">if</span>(obsscale_opt.size())</div>
+<div class="line"><a name="l01210"></a><span class="lineno"> 1210</span>     imgReaderObs.setScale(obsscale_opt[0]);</div>
+<div class="line"><a name="l01211"></a><span class="lineno"> 1211</span>       </div>
+<div class="line"><a name="l01212"></a><span class="lineno"> 1212</span>       <span class="keywordflow">if</span>(regSensor_opt[0]>0){</div>
+<div class="line"><a name="l01213"></a><span class="lineno"> 1213</span>     errObs=regSensor_opt[0]*imgreg.getRMSE(imgReaderModel1,imgReaderObs,c0obs,c1obs,0,0,verbose_opt[0]);</div>
+<div class="line"><a name="l01214"></a><span class="lineno"> 1214</span>     <span class="keywordflow">if</span>(errObs<0||errObs!=errObs){</div>
+<div class="line"><a name="l01215"></a><span class="lineno"> 1215</span>       <span class="comment">// c0obs=0;</span></div>
+<div class="line"><a name="l01216"></a><span class="lineno"> 1216</span>       <span class="comment">// c1obs=1;</span></div>
+<div class="line"><a name="l01217"></a><span class="lineno"> 1217</span>       c0obs=c0obs_prev;</div>
+<div class="line"><a name="l01218"></a><span class="lineno"> 1218</span>       c1obs=c1obs_prev;</div>
+<div class="line"><a name="l01219"></a><span class="lineno"> 1219</span>     }</div>
+<div class="line"><a name="l01220"></a><span class="lineno"> 1220</span>     <span class="keywordflow">else</span>{</div>
+<div class="line"><a name="l01221"></a><span class="lineno"> 1221</span>       c0obs_prev=c0obs;</div>
+<div class="line"><a name="l01222"></a><span class="lineno"> 1222</span>       c1obs_prev=c1obs;</div>
+<div class="line"><a name="l01223"></a><span class="lineno"> 1223</span>     }</div>
+<div class="line"><a name="l01224"></a><span class="lineno"> 1224</span>       }</div>
+<div class="line"><a name="l01225"></a><span class="lineno"> 1225</span>       <span class="keywordflow">else</span>{</div>
+<div class="line"><a name="l01226"></a><span class="lineno"> 1226</span>     c0obs=0;</div>
+<div class="line"><a name="l01227"></a><span class="lineno"> 1227</span>     c1obs=1;</div>
+<div class="line"><a name="l01228"></a><span class="lineno"> 1228</span>     errObs=0;</div>
+<div class="line"><a name="l01229"></a><span class="lineno"> 1229</span>       }</div>
+<div class="line"><a name="l01230"></a><span class="lineno"> 1230</span>       <span class="keywordflow">if</span>(verbose_opt[0])</div>
+<div class="line"><a name="l01231"></a><span class="lineno"> 1231</span>     cout << <span class="stringliteral">"c0obs, c1obs: "</span> << c0obs << <span class="stringliteral">", "</span> << c1obs << endl;</div>
+<div class="line"><a name="l01232"></a><span class="lineno"> 1232</span> </div>
+<div class="line"><a name="l01233"></a><span class="lineno"> 1233</span>       <span class="keywordflow">for</span>(<span class="keywordtype">int</span> irow=0;irow<nrow;++irow){</div>
+<div class="line"><a name="l01234"></a><span class="lineno"> 1234</span>     vector<double> estReadBuffer;</div>
+<div class="line"><a name="l01235"></a><span class="lineno"> 1235</span>     imgWriterEst.image2geo(0,irow,geox,geoy);</div>
+<div class="line"><a name="l01236"></a><span class="lineno"> 1236</span>     imgReaderModel1.geo2image(geox,geoy,modCol,modRow);</div>
+<div class="line"><a name="l01237"></a><span class="lineno"> 1237</span>     assert(modRow>=0&&modRow<imgReaderModel1.nrOfRow());</div>
+<div class="line"><a name="l01238"></a><span class="lineno"> 1238</span>     imgReaderModel1.readData(estReadBuffer,GDT_Float64,modRow);</div>
+<div class="line"><a name="l01239"></a><span class="lineno"> 1239</span>     vector<double> obsLineBuffer;</div>
+<div class="line"><a name="l01240"></a><span class="lineno"> 1240</span>     vector<double> estWriteBuffer(ncol);</div>
+<div class="line"><a name="l01241"></a><span class="lineno"> 1241</span>     vector<double> uncertWriteBuffer(ncol);</div>
+<div class="line"><a name="l01242"></a><span class="lineno"> 1242</span>     vector<double> uncertObsLineBuffer;</div>
+<div class="line"><a name="l01243"></a><span class="lineno"> 1243</span>     <span class="comment">// vector<double> lineMask;</span></div>
+<div class="line"><a name="l01244"></a><span class="lineno"> 1244</span>     <span class="comment">// imgReaderObs.readData(estWriteBuffer,GDT_Float64,irow,0);</span></div>
+<div class="line"><a name="l01245"></a><span class="lineno"> 1245</span>     imgReaderObs.readData(obsLineBuffer,GDT_Float64,irow,0);</div>
+<div class="line"><a name="l01246"></a><span class="lineno"> 1246</span> </div>
+<div class="line"><a name="l01247"></a><span class="lineno"> 1247</span>     <span class="keywordflow">if</span>(imgReaderObs.nrOfBand()>1)</div>
+<div class="line"><a name="l01248"></a><span class="lineno"> 1248</span>       imgReaderObs.readData(uncertObsLineBuffer,GDT_Float64,irow,1);</div>
+<div class="line"><a name="l01249"></a><span class="lineno"> 1249</span>     <span class="comment">// double oldRowMask=-1;//keep track of row mask to optimize number of line readings</span></div>
+<div class="line"><a name="l01250"></a><span class="lineno"> 1250</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> icol=0;icol<imgWriterEst.nrOfCol();++icol){</div>
+<div class="line"><a name="l01251"></a><span class="lineno"> 1251</span>       imgWriterEst.image2geo(icol,irow,geox,geoy);</div>
+<div class="line"><a name="l01252"></a><span class="lineno"> 1252</span>       imgReaderModel1.geo2image(geox,geoy,modCol,modRow);</div>
+<div class="line"><a name="l01253"></a><span class="lineno"> 1253</span>       assert(modRow>=0&&modRow<imgReaderModel1.nrOfRow());</div>
+<div class="line"><a name="l01254"></a><span class="lineno"> 1254</span>       <span class="keywordtype">double</span> modValue=estReadBuffer[modCol];</div>
+<div class="line"><a name="l01255"></a><span class="lineno"> 1255</span>       <span class="keywordflow">if</span>(imgReaderModel1.isNoData(modValue)){<span class="comment">//model is nodata: retain observation </span></div>
+<div class="line"><a name="l01256"></a><span class="lineno"> 1256</span>         estWriteBuffer[icol]=obsLineBuffer[icol];</div>
+<div class="line"><a name="l01257"></a><span class="lineno"> 1257</span>         <span class="keywordflow">if</span>(imgReaderObs.isNoData(obsLineBuffer[icol])){</div>
+<div class="line"><a name="l01258"></a><span class="lineno"> 1258</span>           estWriteBuffer[icol]=obsnodata_opt[0];</div>
+<div class="line"><a name="l01259"></a><span class="lineno"> 1259</span>           uncertWriteBuffer[icol]=uncertNodata_opt[0];</div>
+<div class="line"><a name="l01260"></a><span class="lineno"> 1260</span>         }</div>
+<div class="line"><a name="l01261"></a><span class="lineno"> 1261</span>         <span class="keywordflow">else</span> <span class="keywordflow">if</span>(uncertObsLineBuffer.size()>icol)</div>
+<div class="line"><a name="l01262"></a><span class="lineno"> 1262</span>           uncertWriteBuffer[icol]=uncertObsLineBuffer[icol];</div>
+<div class="line"><a name="l01263"></a><span class="lineno"> 1263</span>         <span class="keywordflow">else</span></div>
+<div class="line"><a name="l01264"></a><span class="lineno"> 1264</span>           uncertWriteBuffer[icol]=uncertObs_opt[0];</div>
+<div class="line"><a name="l01265"></a><span class="lineno"> 1265</span>       }</div>
+<div class="line"><a name="l01266"></a><span class="lineno"> 1266</span>       <span class="keywordflow">else</span>{<span class="comment">//model is valid: calculate estimate from model</span></div>
+<div class="line"><a name="l01267"></a><span class="lineno"> 1267</span>         <span class="keywordtype">double</span> errMod=uncertModel_opt[0]*stdDev;</div>
+<div class="line"><a name="l01268"></a><span class="lineno"> 1268</span>         errMod*=regTime_opt[0];</div>
+<div class="line"><a name="l01269"></a><span class="lineno"> 1269</span>         <span class="comment">// double certNorm=(errMod*errMod+errObs*errObs);</span></div>
+<div class="line"><a name="l01270"></a><span class="lineno"> 1270</span>         <span class="comment">// double certMod=errObs*errObs/certNorm;</span></div>
+<div class="line"><a name="l01271"></a><span class="lineno"> 1271</span>         <span class="comment">// double certObs=errMod*errMod/certNorm;</span></div>
+<div class="line"><a name="l01272"></a><span class="lineno"> 1272</span>         <span class="comment">// double regTime=0;</span></div>
+<div class="line"><a name="l01273"></a><span class="lineno"> 1273</span>         <span class="comment">// double regSensor=(c0obs+c1obs*modValue)*certMod;</span></div>
+<div class="line"><a name="l01274"></a><span class="lineno"> 1274</span>         <span class="comment">// estWriteBuffer[icol]=regTime+regSensor;</span></div>
+<div class="line"><a name="l01275"></a><span class="lineno"> 1275</span>         estWriteBuffer[icol]=modValue;</div>
+<div class="line"><a name="l01276"></a><span class="lineno"> 1276</span>         <span class="keywordtype">double</span> totalUncertainty=errMod;</div>
+<div class="line"><a name="l01277"></a><span class="lineno"> 1277</span>         <span class="comment">// if(errMod<eps_opt[0])</span></div>
+<div class="line"><a name="l01278"></a><span class="lineno"> 1278</span>         <span class="comment">//   totalUncertainty=errObs;</span></div>
+<div class="line"><a name="l01279"></a><span class="lineno"> 1279</span>         <span class="comment">// else if(errObs<eps_opt[0])</span></div>
+<div class="line"><a name="l01280"></a><span class="lineno"> 1280</span>         <span class="comment">//   totalUncertainty=errMod;</span></div>
+<div class="line"><a name="l01281"></a><span class="lineno"> 1281</span>         <span class="comment">// else{</span></div>
+<div class="line"><a name="l01282"></a><span class="lineno"> 1282</span>         <span class="comment">//   totalUncertainty=1.0/errMod/errMod+1/errObs/errObs;</span></div>
+<div class="line"><a name="l01283"></a><span class="lineno"> 1283</span>         <span class="comment">//   totalUncertainty=sqrt(1.0/totalUncertainty);</span></div>
+<div class="line"><a name="l01284"></a><span class="lineno"> 1284</span>         <span class="comment">// }</span></div>
+<div class="line"><a name="l01285"></a><span class="lineno"> 1285</span>         uncertWriteBuffer[icol]=totalUncertainty;<span class="comment">//in case observation is not valid</span></div>
+<div class="line"><a name="l01286"></a><span class="lineno"> 1286</span>       }</div>
+<div class="line"><a name="l01287"></a><span class="lineno"> 1287</span>       <span class="comment">//measurement update</span></div>
+<div class="line"><a name="l01288"></a><span class="lineno"> 1288</span>       <span class="keywordflow">if</span>(!imgReaderObs.isNoData(obsLineBuffer[icol])){</div>
+<div class="line"><a name="l01289"></a><span class="lineno"> 1289</span>         <span class="keywordtype">double</span> kalmanGain=1;</div>
+<div class="line"><a name="l01290"></a><span class="lineno"> 1290</span>         <span class="keywordtype">double</span> uncertObs=uncertObs_opt[0];</div>
+<div class="line"><a name="l01291"></a><span class="lineno"> 1291</span>         <span class="keywordflow">if</span>(uncertObsLineBuffer.size()>icol)</div>
+<div class="line"><a name="l01292"></a><span class="lineno"> 1292</span>           uncertObs=uncertObsLineBuffer[icol];</div>
+<div class="line"><a name="l01293"></a><span class="lineno"> 1293</span>         <span class="keywordflow">else</span> <span class="keywordflow">if</span>(weight_opt.size()>1||deltaObs_opt.size()){</div>
+<div class="line"><a name="l01294"></a><span class="lineno"> 1294</span>           vector<double> obsWindowBuffer;<span class="comment">//buffer for observation to calculate average corresponding to model pixel</span></div>
+<div class="line"><a name="l01295"></a><span class="lineno"> 1295</span>           <span class="keywordtype">int</span> minCol=(icol>down_opt[0]/2) ? icol-down_opt[0]/2 : 0;</div>
+<div class="line"><a name="l01296"></a><span class="lineno"> 1296</span>           <span class="keywordtype">int</span> maxCol=(icol+down_opt[0]/2<imgReaderObs.nrOfCol()) ? icol+down_opt[0]/2 : imgReaderObs.nrOfCol()-1;</div>
+<div class="line"><a name="l01297"></a><span class="lineno"> 1297</span>           <span class="keywordtype">int</span> minRow=(irow>down_opt[0]/2) ? irow-down_opt[0]/2 : 0;</div>
+<div class="line"><a name="l01298"></a><span class="lineno"> 1298</span>           <span class="keywordtype">int</span> maxRow=(irow+down_opt[0]/2<imgReaderObs.nrOfRow()) ? irow+down_opt[0]/2 : imgReaderObs.nrOfRow()-1;</div>
+<div class="line"><a name="l01299"></a><span class="lineno"> 1299</span>         </div>
+<div class="line"><a name="l01300"></a><span class="lineno"> 1300</span>           imgReaderObs.readDataBlock(obsWindowBuffer,GDT_Float64,minCol,maxCol,minRow,maxRow,0);</div>
+<div class="line"><a name="l01301"></a><span class="lineno"> 1301</span>           <a class="code" href="classstatfactory_1_1StatFactory.html">statfactory::StatFactory</a> statobs;</div>
+<div class="line"><a name="l01302"></a><span class="lineno"> 1302</span>           statobs.setNoDataValues(obsnodata_opt);</div>
+<div class="line"><a name="l01303"></a><span class="lineno"> 1303</span>           <span class="keywordtype">double</span> obsMeanValue=(statobs.mean(obsWindowBuffer)-c0obs)/c1obs;</div>
+<div class="line"><a name="l01304"></a><span class="lineno"> 1304</span>           <span class="keywordtype">double</span> difference=obsMeanValue-modValue;</div>
+<div class="line"><a name="l01305"></a><span class="lineno"> 1305</span>           <span class="keywordflow">if</span>(modValue){</div>
+<div class="line"><a name="l01306"></a><span class="lineno"> 1306</span>         <span class="keywordtype">double</span> relativeDifference=difference/modValue;</div>
+<div class="line"><a name="l01307"></a><span class="lineno"> 1307</span>         <span class="keywordflow">if</span>(deltaObs_opt.size()){</div>
+<div class="line"><a name="l01308"></a><span class="lineno"> 1308</span>           assert(deltaObs_opt.size()>1);</div>
+<div class="line"><a name="l01309"></a><span class="lineno"> 1309</span>           <span class="keywordflow">if</span>(100*relativeDifference<deltaObs_opt[0])<span class="comment">//lower bound</span></div>
+<div class="line"><a name="l01310"></a><span class="lineno"> 1310</span>             kalmanGain=0;</div>
+<div class="line"><a name="l01311"></a><span class="lineno"> 1311</span>           <span class="keywordflow">else</span> <span class="keywordflow">if</span>(100*relativeDifference>deltaObs_opt[1])<span class="comment">//upper bound</span></div>
+<div class="line"><a name="l01312"></a><span class="lineno"> 1312</span>             kalmanGain=0;</div>
+<div class="line"><a name="l01313"></a><span class="lineno"> 1313</span>         }</div>
+<div class="line"><a name="l01314"></a><span class="lineno"> 1314</span>         <span class="keywordflow">else</span> <span class="keywordflow">if</span>(weight_opt.size()){</div>
+<div class="line"><a name="l01315"></a><span class="lineno"> 1315</span>           assert(weight_opt.size()>1);</div>
+<div class="line"><a name="l01316"></a><span class="lineno"> 1316</span>           <span class="keywordflow">if</span>(obsMeanValue<modValue)</div>
+<div class="line"><a name="l01317"></a><span class="lineno"> 1317</span>             uncertObs=-weight_opt[0]*relativeDifference;</div>
+<div class="line"><a name="l01318"></a><span class="lineno"> 1318</span>           <span class="keywordflow">else</span> <span class="keywordflow">if</span>(obsMeanValue>modValue)</div>
+<div class="line"><a name="l01319"></a><span class="lineno"> 1319</span>             uncertObs=weight_opt[1]*relativeDifference;</div>
+<div class="line"><a name="l01320"></a><span class="lineno"> 1320</span>         }</div>
+<div class="line"><a name="l01321"></a><span class="lineno"> 1321</span>           }</div>
+<div class="line"><a name="l01322"></a><span class="lineno"> 1322</span>           <span class="keywordflow">if</span>(uncertObs<=0)</div>
+<div class="line"><a name="l01323"></a><span class="lineno"> 1323</span>         uncertObs=0;</div>
+<div class="line"><a name="l01324"></a><span class="lineno"> 1324</span>           <span class="keywordflow">if</span>(verbose_opt[0]>1)</div>
+<div class="line"><a name="l01325"></a><span class="lineno"> 1325</span>         cout << <span class="stringliteral">"obsMeanValue:"</span> << obsMeanValue << <span class="stringliteral">", modValue: "</span> << modValue << endl;</div>
+<div class="line"><a name="l01326"></a><span class="lineno"> 1326</span>         }</div>
+<div class="line"><a name="l01327"></a><span class="lineno"> 1327</span>         <span class="keywordflow">if</span>(kalmanGain>0){</div>
+<div class="line"><a name="l01328"></a><span class="lineno"> 1328</span>           <span class="keywordflow">if</span>((uncertWriteBuffer[icol]+uncertObs)>eps_opt[0])</div>
+<div class="line"><a name="l01329"></a><span class="lineno"> 1329</span>         kalmanGain=uncertWriteBuffer[icol]/(uncertWriteBuffer[icol]+uncertObs);</div>
+<div class="line"><a name="l01330"></a><span class="lineno"> 1330</span>         }</div>
+<div class="line"><a name="l01331"></a><span class="lineno"> 1331</span>         assert(kalmanGain<=1);</div>
+<div class="line"><a name="l01332"></a><span class="lineno"> 1332</span>         estWriteBuffer[icol]+=kalmanGain*(obsLineBuffer[icol]-estWriteBuffer[icol]);</div>
+<div class="line"><a name="l01333"></a><span class="lineno"> 1333</span>         <span class="keywordflow">if</span>(obsmin_opt.size()){</div>
+<div class="line"><a name="l01334"></a><span class="lineno"> 1334</span>           <span class="keywordflow">if</span>(estWriteBuffer[icol]<obsmin_opt[0])</div>
+<div class="line"><a name="l01335"></a><span class="lineno"> 1335</span>         estWriteBuffer[icol]=obsnodata_opt[0];</div>
+<div class="line"><a name="l01336"></a><span class="lineno"> 1336</span>         }</div>
+<div class="line"><a name="l01337"></a><span class="lineno"> 1337</span>         <span class="keywordflow">if</span>(obsmax_opt.size()){</div>
+<div class="line"><a name="l01338"></a><span class="lineno"> 1338</span>           <span class="keywordflow">if</span>(estWriteBuffer[icol]>obsmax_opt[0])</div>
+<div class="line"><a name="l01339"></a><span class="lineno"> 1339</span>         estWriteBuffer[icol]=obsnodata_opt[0];</div>
+<div class="line"><a name="l01340"></a><span class="lineno"> 1340</span>         }</div>
+<div class="line"><a name="l01341"></a><span class="lineno"> 1341</span>         uncertWriteBuffer[icol]*=(1-kalmanGain);</div>
+<div class="line"><a name="l01342"></a><span class="lineno"> 1342</span>       }</div>
+<div class="line"><a name="l01343"></a><span class="lineno"> 1343</span>       <span class="comment">//test</span></div>
+<div class="line"><a name="l01344"></a><span class="lineno"> 1344</span>       <span class="keywordflow">if</span>(!imgReaderObs.isNoData(estWriteBuffer[icol])){</div>
+<div class="line"><a name="l01345"></a><span class="lineno"> 1345</span>         <span class="keywordflow">if</span>(obsmin_opt.size())</div>
+<div class="line"><a name="l01346"></a><span class="lineno"> 1346</span>           assert(estWriteBuffer[icol]>=obsmin_opt[0]);</div>
+<div class="line"><a name="l01347"></a><span class="lineno"> 1347</span>         <span class="keywordflow">if</span>(obsmax_opt.size())</div>
+<div class="line"><a name="l01348"></a><span class="lineno"> 1348</span>           assert(estWriteBuffer[icol]<=obsmax_opt[0]);</div>
+<div class="line"><a name="l01349"></a><span class="lineno"> 1349</span>       }</div>
+<div class="line"><a name="l01350"></a><span class="lineno"> 1350</span>     }</div>
+<div class="line"><a name="l01351"></a><span class="lineno"> 1351</span>     imgWriterEst.writeData(estWriteBuffer,GDT_Float64,irow,0);</div>
+<div class="line"><a name="l01352"></a><span class="lineno"> 1352</span>     imgWriterEst.writeData(uncertWriteBuffer,GDT_Float64,irow,1);</div>
+<div class="line"><a name="l01353"></a><span class="lineno"> 1353</span>       }</div>
+<div class="line"><a name="l01354"></a><span class="lineno"> 1354</span>       imgReaderObs.close();</div>
+<div class="line"><a name="l01355"></a><span class="lineno"> 1355</span>       --obsindex;</div>
+<div class="line"><a name="l01356"></a><span class="lineno"> 1356</span>     }</div>
+<div class="line"><a name="l01357"></a><span class="lineno"> 1357</span>     imgReaderModel1.close();</div>
+<div class="line"><a name="l01358"></a><span class="lineno"> 1358</span>     imgWriterEst.close();</div>
+<div class="line"><a name="l01359"></a><span class="lineno"> 1359</span> </div>
+<div class="line"><a name="l01360"></a><span class="lineno"> 1360</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> modindex=model_opt.size()-2;modindex>=0;--modindex){</div>
+<div class="line"><a name="l01361"></a><span class="lineno"> 1361</span>       <span class="keywordflow">if</span>(verbose_opt[0]){</div>
+<div class="line"><a name="l01362"></a><span class="lineno"> 1362</span>     cout << <span class="stringliteral">"processing time "</span> << tmodel_opt[modindex] << endl;</div>
+<div class="line"><a name="l01363"></a><span class="lineno"> 1363</span>     <span class="keywordflow">if</span>(obsindex<relobsindex.size())</div>
+<div class="line"><a name="l01364"></a><span class="lineno"> 1364</span>       cout << <span class="stringliteral">"next observation "</span> << tmodel_opt[relobsindex[obsindex]] << endl;</div>
+<div class="line"><a name="l01365"></a><span class="lineno"> 1365</span>     <span class="keywordflow">else</span></div>
+<div class="line"><a name="l01366"></a><span class="lineno"> 1366</span>       cout << <span class="stringliteral">"There is no next observation"</span> << endl;</div>
+<div class="line"><a name="l01367"></a><span class="lineno"> 1367</span>       }</div>
+<div class="line"><a name="l01368"></a><span class="lineno"> 1368</span>       <span class="keywordtype">string</span> output;</div>
+<div class="line"><a name="l01369"></a><span class="lineno"> 1369</span>       <span class="keywordflow">if</span>(outputbw_opt.size()==model_opt.size())</div>
+<div class="line"><a name="l01370"></a><span class="lineno"> 1370</span>     output=outputbw_opt[modindex];</div>
+<div class="line"><a name="l01371"></a><span class="lineno"> 1371</span>       <span class="keywordflow">else</span>{</div>
+<div class="line"><a name="l01372"></a><span class="lineno"> 1372</span>     ostringstream outputstream;</div>
+<div class="line"><a name="l01373"></a><span class="lineno"> 1373</span>     outputstream << outputbw_opt[0] << <span class="stringliteral">"_"</span>;</div>
+<div class="line"><a name="l01374"></a><span class="lineno"> 1374</span>     outputstream << setfill(<span class="charliteral">'0'</span>) << setw(ndigit) << tmodel_opt[modindex];</div>
+<div class="line"><a name="l01375"></a><span class="lineno"> 1375</span>     outputstream << <span class="stringliteral">".tif"</span>;</div>
+<div class="line"><a name="l01376"></a><span class="lineno"> 1376</span>     <span class="comment">// outputstream << outputbw_opt[0] << "_" << tmodel_opt[modindex] << ".tif";</span></div>
+<div class="line"><a name="l01377"></a><span class="lineno"> 1377</span>     output=outputstream.str();</div>
+<div class="line"><a name="l01378"></a><span class="lineno"> 1378</span>       }</div>
+<div class="line"><a name="l01379"></a><span class="lineno"> 1379</span> </div>
+<div class="line"><a name="l01380"></a><span class="lineno"> 1380</span>       <span class="comment">//two band output band0=estimation, band1=uncertainty</span></div>
+<div class="line"><a name="l01381"></a><span class="lineno"> 1381</span>       imgWriterEst.open(output,ncol,nrow,2,GDT_Float64,imageType,option_opt);</div>
+<div class="line"><a name="l01382"></a><span class="lineno"> 1382</span>       imgWriterEst.setProjectionProj4(projection_opt[0]);</div>
+<div class="line"><a name="l01383"></a><span class="lineno"> 1383</span>       imgWriterEst.setGeoTransform(geotransform);</div>
+<div class="line"><a name="l01384"></a><span class="lineno"> 1384</span>       imgWriterEst.GDALSetNoDataValue(obsnodata_opt[0]);</div>
+<div class="line"><a name="l01385"></a><span class="lineno"> 1385</span> </div>
+<div class="line"><a name="l01386"></a><span class="lineno"> 1386</span>       <span class="comment">//calculate regression between two subsequence model inputs</span></div>
+<div class="line"><a name="l01387"></a><span class="lineno"> 1387</span>       imgReaderModel1.open(model_opt[modindex+1]);</div>
+<div class="line"><a name="l01388"></a><span class="lineno"> 1388</span>       imgReaderModel1.setNoData(modnodata_opt);</div>
+<div class="line"><a name="l01389"></a><span class="lineno"> 1389</span>       <span class="keywordflow">if</span>(modoffset_opt.size())</div>
+<div class="line"><a name="l01390"></a><span class="lineno"> 1390</span>     imgReaderModel1.setOffset(modoffset_opt[0]);</div>
+<div class="line"><a name="l01391"></a><span class="lineno"> 1391</span>       <span class="keywordflow">if</span>(modscale_opt.size())</div>
+<div class="line"><a name="l01392"></a><span class="lineno"> 1392</span>     imgReaderModel1.setScale(modscale_opt[0]);</div>
+<div class="line"><a name="l01393"></a><span class="lineno"> 1393</span>       imgReaderModel2.open(model_opt[modindex]);</div>
+<div class="line"><a name="l01394"></a><span class="lineno"> 1394</span>       imgReaderModel2.setNoData(modnodata_opt);</div>
+<div class="line"><a name="l01395"></a><span class="lineno"> 1395</span>       <span class="keywordflow">if</span>(modoffset_opt.size())</div>
+<div class="line"><a name="l01396"></a><span class="lineno"> 1396</span>     imgReaderModel2.setOffset(modoffset_opt[0]);</div>
+<div class="line"><a name="l01397"></a><span class="lineno"> 1397</span>       <span class="keywordflow">if</span>(modscale_opt.size())</div>
+<div class="line"><a name="l01398"></a><span class="lineno"> 1398</span>     imgReaderModel2.setScale(modscale_opt[0]);</div>
+<div class="line"><a name="l01399"></a><span class="lineno"> 1399</span>       <span class="comment">//calculate regression</span></div>
+<div class="line"><a name="l01400"></a><span class="lineno"> 1400</span>       <span class="comment">//we could re-use the points from second image from last run, but</span></div>
+<div class="line"><a name="l01401"></a><span class="lineno"> 1401</span>       <span class="comment">//to keep it general, we must redo it (overlap might have changed)</span></div>
+<div class="line"><a name="l01402"></a><span class="lineno"> 1402</span>     </div>
+<div class="line"><a name="l01403"></a><span class="lineno"> 1403</span>       pfnProgress(progress,pszMessage,pProgressArg);</div>
+<div class="line"><a name="l01404"></a><span class="lineno"> 1404</span> </div>
+<div class="line"><a name="l01405"></a><span class="lineno"> 1405</span>       <span class="keywordflow">if</span>(verbose_opt[0])</div>
+<div class="line"><a name="l01406"></a><span class="lineno"> 1406</span>     cout << <span class="stringliteral">"Calculating regression for "</span> << imgReaderModel1.getFileName() << <span class="stringliteral">" "</span> << imgReaderModel2.getFileName() << endl;</div>
+<div class="line"><a name="l01407"></a><span class="lineno"> 1407</span> </div>
+<div class="line"><a name="l01408"></a><span class="lineno"> 1408</span>       <span class="keywordtype">double</span> errMod=imgreg.getRMSE(imgReaderModel1,imgReaderModel2,c0modGlobal,c1modGlobal,0,0);</div>
+<div class="line"><a name="l01409"></a><span class="lineno"> 1409</span>       <span class="keywordflow">if</span>(c0modGlobal>c0modGlobalMax_opt[0]||c0modGlobal<c0modGlobalMin_opt[0]||c1modGlobal>c1modGlobalMax_opt[0]||c1modGlobal<c1modGlobalMin_opt[0]||errMod!=errMod){</div>
+<div class="line"><a name="l01410"></a><span class="lineno"> 1410</span>     c0modGlobal=c0modGlobal_prev;</div>
+<div class="line"><a name="l01411"></a><span class="lineno"> 1411</span>     c1modGlobal=c1modGlobal_prev;</div>
+<div class="line"><a name="l01412"></a><span class="lineno"> 1412</span>     errMod=uncertModel_opt[0]*stdDev;</div>
+<div class="line"><a name="l01413"></a><span class="lineno"> 1413</span>       }</div>
+<div class="line"><a name="l01414"></a><span class="lineno"> 1414</span>       <span class="keywordflow">else</span>{</div>
+<div class="line"><a name="l01415"></a><span class="lineno"> 1415</span>     c0modGlobal_prev=c0modGlobal;</div>
+<div class="line"><a name="l01416"></a><span class="lineno"> 1416</span>     c1modGlobal_prev=c1modGlobal;</div>
+<div class="line"><a name="l01417"></a><span class="lineno"> 1417</span>     errMod*=regTime_opt[0];</div>
+<div class="line"><a name="l01418"></a><span class="lineno"> 1418</span>       }</div>
+<div class="line"><a name="l01419"></a><span class="lineno"> 1419</span>       <span class="comment">// double errMod=imgreg.getRMSE(imgReaderModel1,imgReaderModel2,c0modGlobal,c1modGlobal,verbose_opt[0]);</span></div>
+<div class="line"><a name="l01420"></a><span class="lineno"> 1420</span>       <span class="keywordflow">if</span>(verbose_opt[0])</div>
+<div class="line"><a name="l01421"></a><span class="lineno"> 1421</span>     cout << <span class="stringliteral">"c0modGlobal, c1modGlobal: "</span> << c0modGlobal << <span class="stringliteral">", "</span> << c1modGlobal << endl;</div>
+<div class="line"><a name="l01422"></a><span class="lineno"> 1422</span> </div>
+<div class="line"><a name="l01423"></a><span class="lineno"> 1423</span>       <span class="keywordtype">bool</span> update=<span class="keyword">false</span>;</div>
+<div class="line"><a name="l01424"></a><span class="lineno"> 1424</span>       <span class="keywordflow">if</span>(obsindex<relobsindex.size()){</div>
+<div class="line"><a name="l01425"></a><span class="lineno"> 1425</span>     update=(relobsindex[obsindex]==modindex);</div>
+<div class="line"><a name="l01426"></a><span class="lineno"> 1426</span>       }</div>
+<div class="line"><a name="l01427"></a><span class="lineno"> 1427</span>       <span class="keywordflow">if</span>(update){</div>
+<div class="line"><a name="l01428"></a><span class="lineno"> 1428</span>     <span class="keywordflow">if</span>(verbose_opt[0])</div>
+<div class="line"><a name="l01429"></a><span class="lineno"> 1429</span>       cout << <span class="stringliteral">"***update "</span> << relobsindex[obsindex] << <span class="stringliteral">" = "</span> << modindex << <span class="stringliteral">" "</span> << observation_opt[obsindex] << <span class="stringliteral">" ***"</span> << endl;</div>
+<div class="line"><a name="l01430"></a><span class="lineno"> 1430</span> </div>
+<div class="line"><a name="l01431"></a><span class="lineno"> 1431</span>     imgReaderObs.open(observation_opt[obsindex]);</div>
+<div class="line"><a name="l01432"></a><span class="lineno"> 1432</span>     imgReaderObs.getGeoTransform(geotransform);</div>
+<div class="line"><a name="l01433"></a><span class="lineno"> 1433</span>     imgReaderObs.setNoData(obsnodata_opt);</div>
+<div class="line"><a name="l01434"></a><span class="lineno"> 1434</span>     <span class="keywordflow">if</span>(obsoffset_opt.size())</div>
+<div class="line"><a name="l01435"></a><span class="lineno"> 1435</span>       imgReaderObs.setOffset(obsoffset_opt[0]);</div>
+<div class="line"><a name="l01436"></a><span class="lineno"> 1436</span>     <span class="keywordflow">if</span>(obsscale_opt.size())</div>
+<div class="line"><a name="l01437"></a><span class="lineno"> 1437</span>       imgReaderObs.setScale(obsscale_opt[0]);</div>
+<div class="line"><a name="l01438"></a><span class="lineno"> 1438</span>     <span class="comment">//calculate regression between model and observation</span></div>
+<div class="line"><a name="l01439"></a><span class="lineno"> 1439</span>     <span class="keywordflow">if</span>(verbose_opt[0])</div>
+<div class="line"><a name="l01440"></a><span class="lineno"> 1440</span>       cout << <span class="stringliteral">"Calculating regression for "</span> << imgReaderModel2.getFileName() << <span class="stringliteral">" "</span> << imgReaderObs.getFileName() << endl;</div>
+<div class="line"><a name="l01441"></a><span class="lineno"> 1441</span>     <span class="keywordflow">if</span>(regSensor_opt[0]>0){</div>
+<div class="line"><a name="l01442"></a><span class="lineno"> 1442</span>       errObs=regSensor_opt[0]*imgreg.getRMSE(imgReaderModel2,imgReaderObs,c0obs,c1obs,0,0,verbose_opt[0]);</div>
+<div class="line"><a name="l01443"></a><span class="lineno"> 1443</span>       <span class="keywordflow">if</span>(errObs<0||errObs!=errObs){</div>
+<div class="line"><a name="l01444"></a><span class="lineno"> 1444</span>         <span class="comment">// c0obs=0;</span></div>
+<div class="line"><a name="l01445"></a><span class="lineno"> 1445</span>         <span class="comment">// c1obs=1;</span></div>
+<div class="line"><a name="l01446"></a><span class="lineno"> 1446</span>         c0obs=c0obs_prev;</div>
+<div class="line"><a name="l01447"></a><span class="lineno"> 1447</span>         c1obs=c1obs_prev;</div>
+<div class="line"><a name="l01448"></a><span class="lineno"> 1448</span>       }</div>
+<div class="line"><a name="l01449"></a><span class="lineno"> 1449</span>       <span class="keywordflow">else</span>{</div>
+<div class="line"><a name="l01450"></a><span class="lineno"> 1450</span>         c0obs_prev=c0obs;</div>
+<div class="line"><a name="l01451"></a><span class="lineno"> 1451</span>         c1obs_prev=c1obs;</div>
+<div class="line"><a name="l01452"></a><span class="lineno"> 1452</span>       }</div>
+<div class="line"><a name="l01453"></a><span class="lineno"> 1453</span>     }</div>
+<div class="line"><a name="l01454"></a><span class="lineno"> 1454</span>     <span class="keywordflow">else</span>{</div>
+<div class="line"><a name="l01455"></a><span class="lineno"> 1455</span>       c0obs=0;</div>
+<div class="line"><a name="l01456"></a><span class="lineno"> 1456</span>       c1obs=1;</div>
+<div class="line"><a name="l01457"></a><span class="lineno"> 1457</span>       errObs=0;</div>
+<div class="line"><a name="l01458"></a><span class="lineno"> 1458</span>     }</div>
+<div class="line"><a name="l01459"></a><span class="lineno"> 1459</span>     <span class="keywordflow">if</span>(verbose_opt[0])</div>
+<div class="line"><a name="l01460"></a><span class="lineno"> 1460</span>       cout << <span class="stringliteral">"c0obs, c1obs: "</span> << c0obs << <span class="stringliteral">", "</span> << c1obs << endl;</div>
+<div class="line"><a name="l01461"></a><span class="lineno"> 1461</span>       }</div>
+<div class="line"><a name="l01462"></a><span class="lineno"> 1462</span>       <span class="comment">//prediction (also to fill cloudy pixels in update mode)</span></div>
+<div class="line"><a name="l01463"></a><span class="lineno"> 1463</span>       <span class="keywordtype">string</span> input;</div>
+<div class="line"><a name="l01464"></a><span class="lineno"> 1464</span>       <span class="keywordflow">if</span>(outputbw_opt.size()==model_opt.size())</div>
+<div class="line"><a name="l01465"></a><span class="lineno"> 1465</span>     input=outputbw_opt[modindex+1];</div>
 <div class="line"><a name="l01466"></a><span class="lineno"> 1466</span>       <span class="keywordflow">else</span>{</div>
 <div class="line"><a name="l01467"></a><span class="lineno"> 1467</span>     ostringstream outputstream;</div>
-<div class="line"><a name="l01468"></a><span class="lineno"> 1468</span>     outputstream << outputfb_opt[0] << <span class="stringliteral">"_"</span>;</div>
-<div class="line"><a name="l01469"></a><span class="lineno"> 1469</span>     outputstream << setfill(<span class="charliteral">'0'</span>) << setw(ndigit) << tmodel_opt[modindex];</div>
+<div class="line"><a name="l01468"></a><span class="lineno"> 1468</span>     outputstream << outputbw_opt[0] << <span class="stringliteral">"_"</span>;</div>
+<div class="line"><a name="l01469"></a><span class="lineno"> 1469</span>     outputstream << setfill(<span class="charliteral">'0'</span>) << setw(ndigit) << tmodel_opt[modindex+1];</div>
 <div class="line"><a name="l01470"></a><span class="lineno"> 1470</span>     outputstream << <span class="stringliteral">".tif"</span>;</div>
-<div class="line"><a name="l01471"></a><span class="lineno"> 1471</span>     <span class="comment">// outputstream << outputfb_opt[0] << "_" << tmodel_opt[modindex] << ".tif";</span></div>
-<div class="line"><a name="l01472"></a><span class="lineno"> 1472</span>     output=outputstream.str();</div>
+<div class="line"><a name="l01471"></a><span class="lineno"> 1471</span>     <span class="comment">// outputstream << outputbw_opt[0] << "_" << tmodel_opt[modindex+1] << ".tif";</span></div>
+<div class="line"><a name="l01472"></a><span class="lineno"> 1472</span>     input=outputstream.str();</div>
 <div class="line"><a name="l01473"></a><span class="lineno"> 1473</span>       }</div>
-<div class="line"><a name="l01474"></a><span class="lineno"> 1474</span>     </div>
-<div class="line"><a name="l01475"></a><span class="lineno"> 1475</span>       <span class="comment">//two band output band0=estimation, band1=uncertainty</span></div>
-<div class="line"><a name="l01476"></a><span class="lineno"> 1476</span>       imgWriterEst.open(output,ncol,nrow,2,GDT_Float32,imageType,option_opt);</div>
-<div class="line"><a name="l01477"></a><span class="lineno"> 1477</span>       imgWriterEst.setProjectionProj4(projection_opt[0]);</div>
-<div class="line"><a name="l01478"></a><span class="lineno"> 1478</span>       imgWriterEst.setGeoTransform(geotransform);</div>
-<div class="line"><a name="l01479"></a><span class="lineno"> 1479</span>       imgWriterEst.GDALSetNoDataValue(obsnodata_opt[0]);</div>
-<div class="line"><a name="l01480"></a><span class="lineno"> 1480</span> </div>
-<div class="line"><a name="l01481"></a><span class="lineno"> 1481</span>       <span class="comment">//open forward and backward estimates</span></div>
-<div class="line"><a name="l01482"></a><span class="lineno"> 1482</span>       <span class="comment">//we assume forward in model and backward in observation...</span></div>
-<div class="line"><a name="l01483"></a><span class="lineno"> 1483</span> </div>
-<div class="line"><a name="l01484"></a><span class="lineno"> 1484</span>       <span class="keywordtype">string</span> inputfw;</div>
-<div class="line"><a name="l01485"></a><span class="lineno"> 1485</span>       <span class="keywordtype">string</span> inputbw;</div>
-<div class="line"><a name="l01486"></a><span class="lineno"> 1486</span>       <span class="keywordflow">if</span>(outputfw_opt.size()==model_opt.size())</div>
-<div class="line"><a name="l01487"></a><span class="lineno"> 1487</span>     inputfw=outputfw_opt[modindex];</div>
-<div class="line"><a name="l01488"></a><span class="lineno"> 1488</span>       <span class="keywordflow">else</span>{</div>
-<div class="line"><a name="l01489"></a><span class="lineno"> 1489</span>     ostringstream outputstream;</div>
-<div class="line"><a name="l01490"></a><span class="lineno"> 1490</span>     outputstream << outputfw_opt[0] << <span class="stringliteral">"_"</span>;</div>
-<div class="line"><a name="l01491"></a><span class="lineno"> 1491</span>     outputstream << setfill(<span class="charliteral">'0'</span>) << setw(ndigit) << tmodel_opt[modindex];</div>
-<div class="line"><a name="l01492"></a><span class="lineno"> 1492</span>     outputstream << <span class="stringliteral">".tif"</span>;</div>
-<div class="line"><a name="l01493"></a><span class="lineno"> 1493</span>     <span class="comment">// outputstream << outputfw_opt[0] << "_" << tmodel_opt[modindex] << ".tif";</span></div>
-<div class="line"><a name="l01494"></a><span class="lineno"> 1494</span>     inputfw=outputstream.str();</div>
-<div class="line"><a name="l01495"></a><span class="lineno"> 1495</span>       }</div>
-<div class="line"><a name="l01496"></a><span class="lineno"> 1496</span>       <span class="keywordflow">if</span>(outputbw_opt.size()==model_opt.size())</div>
-<div class="line"><a name="l01497"></a><span class="lineno"> 1497</span>     inputbw=outputbw_opt[modindex];</div>
-<div class="line"><a name="l01498"></a><span class="lineno"> 1498</span>       <span class="keywordflow">else</span>{</div>
-<div class="line"><a name="l01499"></a><span class="lineno"> 1499</span>     ostringstream outputstream;</div>
-<div class="line"><a name="l01500"></a><span class="lineno"> 1500</span>     outputstream << outputbw_opt[0] << <span class="stringliteral">"_"</span>;</div>
-<div class="line"><a name="l01501"></a><span class="lineno"> 1501</span>     outputstream << setfill(<span class="charliteral">'0'</span>) << setw(ndigit) << tmodel_opt[modindex];</div>
-<div class="line"><a name="l01502"></a><span class="lineno"> 1502</span>     outputstream << <span class="stringliteral">".tif"</span>;</div>
-<div class="line"><a name="l01503"></a><span class="lineno"> 1503</span>     <span class="comment">// outputstream << outputbw_opt[0] << "_" << tmodel_opt[modindex] << ".tif";</span></div>
-<div class="line"><a name="l01504"></a><span class="lineno"> 1504</span>     inputbw=outputstream.str();</div>
+<div class="line"><a name="l01474"></a><span class="lineno"> 1474</span>       <a class="code" href="classImgReaderGdal.html">ImgReaderGdal</a> imgReaderEst(input);</div>
+<div class="line"><a name="l01475"></a><span class="lineno"> 1475</span>       imgReaderEst.setNoData(obsnodata_opt);</div>
+<div class="line"><a name="l01476"></a><span class="lineno"> 1476</span>       <span class="keywordflow">if</span>(obsoffset_opt.size())</div>
+<div class="line"><a name="l01477"></a><span class="lineno"> 1477</span>     imgReaderEst.setOffset(obsoffset_opt[0]);</div>
+<div class="line"><a name="l01478"></a><span class="lineno"> 1478</span>       <span class="keywordflow">if</span>(obsscale_opt.size())</div>
+<div class="line"><a name="l01479"></a><span class="lineno"> 1479</span>     imgReaderEst.setScale(obsscale_opt[0]);</div>
+<div class="line"><a name="l01480"></a><span class="lineno"> 1480</span>       </div>
+<div class="line"><a name="l01481"></a><span class="lineno"> 1481</span>       vector< vector<double> > obsLineVector(down_opt[0]);</div>
+<div class="line"><a name="l01482"></a><span class="lineno"> 1482</span>       vector<double> obsLineBuffer;</div>
+<div class="line"><a name="l01483"></a><span class="lineno"> 1483</span>       vector<double> obsWindowBuffer;<span class="comment">//buffer for observation to calculate average corresponding to model pixel</span></div>
+<div class="line"><a name="l01484"></a><span class="lineno"> 1484</span>       vector<double> model1LineBuffer;</div>
+<div class="line"><a name="l01485"></a><span class="lineno"> 1485</span>       vector<double> model2LineBuffer;</div>
+<div class="line"><a name="l01486"></a><span class="lineno"> 1486</span>       vector<double> model1buffer;<span class="comment">//buffer for model 1 to calculate time regression based on window</span></div>
+<div class="line"><a name="l01487"></a><span class="lineno"> 1487</span>       vector<double> model2buffer;<span class="comment">//buffer for model 2 to calculate time regression based on window</span></div>
+<div class="line"><a name="l01488"></a><span class="lineno"> 1488</span>       vector<double> uncertObsLineBuffer;</div>
+<div class="line"><a name="l01489"></a><span class="lineno"> 1489</span>       vector<double> estReadBuffer;</div>
+<div class="line"><a name="l01490"></a><span class="lineno"> 1490</span>       <span class="comment">// vector<double> estWindowBuffer;//buffer for estimate to calculate average corresponding to model pixel</span></div>
+<div class="line"><a name="l01491"></a><span class="lineno"> 1491</span>       vector<double> uncertReadBuffer;</div>
+<div class="line"><a name="l01492"></a><span class="lineno"> 1492</span>       vector<double> estWriteBuffer(ncol);</div>
+<div class="line"><a name="l01493"></a><span class="lineno"> 1493</span>       vector<double> uncertWriteBuffer(ncol);</div>
+<div class="line"><a name="l01494"></a><span class="lineno"> 1494</span>       <span class="comment">// vector<double> lineMask;</span></div>
+<div class="line"><a name="l01495"></a><span class="lineno"> 1495</span> </div>
+<div class="line"><a name="l01496"></a><span class="lineno"> 1496</span>       <span class="comment">//initialize obsLineVector</span></div>
+<div class="line"><a name="l01497"></a><span class="lineno"> 1497</span>       <span class="keywordflow">if</span>(update){</div>
+<div class="line"><a name="l01498"></a><span class="lineno"> 1498</span>     assert(down_opt[0]%2);<span class="comment">//window size must be odd </span></div>
+<div class="line"><a name="l01499"></a><span class="lineno"> 1499</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iline=-down_opt[0]/2;iline<down_opt[0]/2+1;++iline){</div>
+<div class="line"><a name="l01500"></a><span class="lineno"> 1500</span>       <span class="keywordflow">if</span>(iline<0)<span class="comment">//replicate line 0</span></div>
+<div class="line"><a name="l01501"></a><span class="lineno"> 1501</span>         imgReaderObs.readData(obsLineVector[iline+down_opt[0]/2],GDT_Float64,0,0);</div>
+<div class="line"><a name="l01502"></a><span class="lineno"> 1502</span>       <span class="keywordflow">else</span></div>
+<div class="line"><a name="l01503"></a><span class="lineno"> 1503</span>         imgReaderObs.readData(obsLineVector[iline+down_opt[0]/2],GDT_Float64,iline,0);</div>
+<div class="line"><a name="l01504"></a><span class="lineno"> 1504</span>     }</div>
 <div class="line"><a name="l01505"></a><span class="lineno"> 1505</span>       }</div>
-<div class="line"><a name="l01506"></a><span class="lineno"> 1506</span>       <a class="code" href="classImgReaderGdal.html">ImgReaderGdal</a> imgReaderForward(inputfw);</div>
-<div class="line"><a name="l01507"></a><span class="lineno"> 1507</span>       <a class="code" href="classImgReaderGdal.html">ImgReaderGdal</a> imgReaderBackward(inputbw);</div>
-<div class="line"><a name="l01508"></a><span class="lineno"> 1508</span>       imgReaderForward.setNoData(obsnodata_opt);</div>
-<div class="line"><a name="l01509"></a><span class="lineno"> 1509</span>       <span class="keywordflow">if</span>(obsoffset_opt.size())</div>
-<div class="line"><a name="l01510"></a><span class="lineno"> 1510</span>     imgReaderForward.setOffset(obsoffset_opt[0]);</div>
-<div class="line"><a name="l01511"></a><span class="lineno"> 1511</span>       <span class="keywordflow">if</span>(obsscale_opt.size())</div>
-<div class="line"><a name="l01512"></a><span class="lineno"> 1512</span>     imgReaderForward.setScale(obsscale_opt[0]);</div>
-<div class="line"><a name="l01513"></a><span class="lineno"> 1513</span>       imgReaderBackward.setNoData(obsnodata_opt);</div>
-<div class="line"><a name="l01514"></a><span class="lineno"> 1514</span>       <span class="keywordflow">if</span>(obsoffset_opt.size())</div>
-<div class="line"><a name="l01515"></a><span class="lineno"> 1515</span>     imgReaderBackward.setOffset(obsoffset_opt[0]);</div>
-<div class="line"><a name="l01516"></a><span class="lineno"> 1516</span>       <span class="keywordflow">if</span>(obsscale_opt.size())</div>
-<div class="line"><a name="l01517"></a><span class="lineno"> 1517</span>     imgReaderBackward.setScale(obsscale_opt[0]);</div>
-<div class="line"><a name="l01518"></a><span class="lineno"> 1518</span>       </div>
-<div class="line"><a name="l01519"></a><span class="lineno"> 1519</span>       vector<double> estForwardBuffer;</div>
-<div class="line"><a name="l01520"></a><span class="lineno"> 1520</span>       vector<double> estBackwardBuffer;</div>
-<div class="line"><a name="l01521"></a><span class="lineno"> 1521</span>       vector<double> uncertObsLineBuffer;</div>
-<div class="line"><a name="l01522"></a><span class="lineno"> 1522</span>       vector<double> uncertForwardBuffer;</div>
-<div class="line"><a name="l01523"></a><span class="lineno"> 1523</span>       vector<double> uncertBackwardBuffer;</div>
-<div class="line"><a name="l01524"></a><span class="lineno"> 1524</span>       vector<double> uncertReadBuffer;</div>
-<div class="line"><a name="l01525"></a><span class="lineno"> 1525</span>       vector<double> estWriteBuffer(ncol);</div>
-<div class="line"><a name="l01526"></a><span class="lineno"> 1526</span>       vector<double> uncertWriteBuffer(ncol);</div>
-<div class="line"><a name="l01527"></a><span class="lineno"> 1527</span>       <span class="comment">// vector<double> lineMask;</span></div>
-<div class="line"><a name="l01528"></a><span class="lineno"> 1528</span> </div>
-<div class="line"><a name="l01529"></a><span class="lineno"> 1529</span>       <span class="keywordtype">bool</span> update=<span class="keyword">false</span>;</div>
-<div class="line"><a name="l01530"></a><span class="lineno"> 1530</span>       <span class="keywordflow">if</span>(obsindex<relobsindex.size()){</div>
-<div class="line"><a name="l01531"></a><span class="lineno"> 1531</span>     update=(relobsindex[obsindex]==modindex);</div>
-<div class="line"><a name="l01532"></a><span class="lineno"> 1532</span>       }</div>
-<div class="line"><a name="l01533"></a><span class="lineno"> 1533</span> </div>
-<div class="line"><a name="l01534"></a><span class="lineno"> 1534</span>       <span class="keywordflow">if</span>(update){</div>
-<div class="line"><a name="l01535"></a><span class="lineno"> 1535</span>     <span class="keywordflow">if</span>(verbose_opt[0])</div>
-<div class="line"><a name="l01536"></a><span class="lineno"> 1536</span>       cout << <span class="stringliteral">"***update "</span> << relobsindex[obsindex] << <span class="stringliteral">" = "</span> << modindex << <span class="stringliteral">" "</span> << observation_opt[obsindex] << <span class="stringliteral">" ***"</span> << endl;</div>
-<div class="line"><a name="l01537"></a><span class="lineno"> 1537</span>     imgReaderObs.open(observation_opt[obsindex]);</div>
-<div class="line"><a name="l01538"></a><span class="lineno"> 1538</span>     imgReaderObs.getGeoTransform(geotransform);</div>
-<div class="line"><a name="l01539"></a><span class="lineno"> 1539</span>     imgReaderObs.setNoData(obsnodata_opt);</div>
-<div class="line"><a name="l01540"></a><span class="lineno"> 1540</span>     <span class="keywordflow">if</span>(obsoffset_opt.size())</div>
-<div class="line"><a name="l01541"></a><span class="lineno"> 1541</span>       imgReaderObs.setOffset(obsoffset_opt[0]);</div>
-<div class="line"><a name="l01542"></a><span class="lineno"> 1542</span>     <span class="keywordflow">if</span>(obsscale_opt.size())</div>
-<div class="line"><a name="l01543"></a><span class="lineno"> 1543</span>       imgReaderObs.setScale(obsscale_opt[0]);</div>
-<div class="line"><a name="l01544"></a><span class="lineno"> 1544</span>     <span class="comment">//calculate regression between model and observation</span></div>
-<div class="line"><a name="l01545"></a><span class="lineno"> 1545</span>       }</div>
-<div class="line"><a name="l01546"></a><span class="lineno"> 1546</span> </div>
-<div class="line"><a name="l01547"></a><span class="lineno"> 1547</span>       pfnProgress(progress,pszMessage,pProgressArg);</div>
-<div class="line"><a name="l01548"></a><span class="lineno"> 1548</span> </div>
-<div class="line"><a name="l01549"></a><span class="lineno"> 1549</span>       <span class="keywordflow">for</span>(<span class="keywordtype">int</span> irow=0;irow<imgWriterEst.nrOfRow();++irow){</div>
-<div class="line"><a name="l01550"></a><span class="lineno"> 1550</span>     assert(irow<imgReaderForward.nrOfRow());</div>
-<div class="line"><a name="l01551"></a><span class="lineno"> 1551</span>     assert(irow<imgReaderBackward.nrOfRow());</div>
-<div class="line"><a name="l01552"></a><span class="lineno"> 1552</span>     imgReaderForward.readData(estForwardBuffer,GDT_Float64,irow,0);</div>
-<div class="line"><a name="l01553"></a><span class="lineno"> 1553</span>     imgReaderBackward.readData(estBackwardBuffer,GDT_Float64,irow,0);</div>
-<div class="line"><a name="l01554"></a><span class="lineno"> 1554</span>     imgReaderForward.readData(uncertForwardBuffer,GDT_Float64,irow,1);</div>
-<div class="line"><a name="l01555"></a><span class="lineno"> 1555</span>     imgReaderBackward.readData(uncertBackwardBuffer,GDT_Float64,irow,1);</div>
-<div class="line"><a name="l01556"></a><span class="lineno"> 1556</span> </div>
-<div class="line"><a name="l01557"></a><span class="lineno"> 1557</span>     <span class="keywordflow">if</span>(update){</div>
-<div class="line"><a name="l01558"></a><span class="lineno"> 1558</span>       imgReaderObs.readData(estWriteBuffer,GDT_Float64,irow,0);</div>
-<div class="line"><a name="l01559"></a><span class="lineno"> 1559</span>       <span class="keywordflow">if</span>(imgReaderObs.nrOfBand()>1)</div>
-<div class="line"><a name="l01560"></a><span class="lineno"> 1560</span>         imgReaderObs.readData(uncertObsLineBuffer,GDT_Float64,irow,1);</div>
-<div class="line"><a name="l01561"></a><span class="lineno"> 1561</span>     }</div>
-<div class="line"><a name="l01562"></a><span class="lineno"> 1562</span> </div>
-<div class="line"><a name="l01563"></a><span class="lineno"> 1563</span>     <span class="comment">// double oldRowMask=-1;//keep track of row mask to optimize number of line readings</span></div>
-<div class="line"><a name="l01564"></a><span class="lineno"> 1564</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> icol=0;icol<imgWriterEst.nrOfCol();++icol){</div>
-<div class="line"><a name="l01565"></a><span class="lineno"> 1565</span>       imgWriterEst.image2geo(icol,irow,geox,geoy);</div>
-<div class="line"><a name="l01566"></a><span class="lineno"> 1566</span>       <span class="keywordtype">double</span> A=estForwardBuffer[icol];</div>
-<div class="line"><a name="l01567"></a><span class="lineno"> 1567</span>       <span class="keywordtype">double</span> B=estBackwardBuffer[icol];</div>
-<div class="line"><a name="l01568"></a><span class="lineno"> 1568</span>       <span class="keywordtype">double</span> C=uncertForwardBuffer[icol]*uncertForwardBuffer[icol];</div>
-<div class="line"><a name="l01569"></a><span class="lineno"> 1569</span>       <span class="keywordtype">double</span> D=uncertBackwardBuffer[icol]*uncertBackwardBuffer[icol];</div>
-<div class="line"><a name="l01570"></a><span class="lineno"> 1570</span>       <span class="keywordtype">double</span> uncertObs=uncertObs_opt[0];</div>
-<div class="line"><a name="l01571"></a><span class="lineno"> 1571</span> </div>
-<div class="line"><a name="l01572"></a><span class="lineno"> 1572</span>       <span class="comment">// if(update){//check for nodata in observation</span></div>
-<div class="line"><a name="l01573"></a><span class="lineno"> 1573</span>       <span class="comment">//   if(imgReaderObs.isNoData(estWriteBuffer[icol]))</span></div>
-<div class="line"><a name="l01574"></a><span class="lineno"> 1574</span>       <span class="comment">//     uncertObs=uncertNodata_opt[0];</span></div>
-<div class="line"><a name="l01575"></a><span class="lineno"> 1575</span>       <span class="comment">//   else if(uncertObsLineBuffer.size()>icol)</span></div>
-<div class="line"><a name="l01576"></a><span class="lineno"> 1576</span>       <span class="comment">//     uncertObs=uncertObsLineBuffer[icol];</span></div>
-<div class="line"><a name="l01577"></a><span class="lineno"> 1577</span>       <span class="comment">// }</span></div>
-<div class="line"><a name="l01578"></a><span class="lineno"> 1578</span> </div>
-<div class="line"><a name="l01579"></a><span class="lineno"> 1579</span>       <span class="keywordtype">double</span> noemer=(C+D);</div>
-<div class="line"><a name="l01580"></a><span class="lineno"> 1580</span>       <span class="comment">//todo: consistently check for division by zero...</span></div>
-<div class="line"><a name="l01581"></a><span class="lineno"> 1581</span>       <span class="keywordflow">if</span>(imgReaderForward.isNoData(A)&&imgReaderBackward.isNoData(B)){</div>
-<div class="line"><a name="l01582"></a><span class="lineno"> 1582</span>         estWriteBuffer[icol]=obsnodata_opt[0];</div>
-<div class="line"><a name="l01583"></a><span class="lineno"> 1583</span>         uncertWriteBuffer[icol]=uncertNodata_opt[0];</div>
-<div class="line"><a name="l01584"></a><span class="lineno"> 1584</span>       }</div>
-<div class="line"><a name="l01585"></a><span class="lineno"> 1585</span>       <span class="keywordflow">else</span> <span class="keywordflow">if</span>(imgReaderForward.isNoData(A)){</div>
-<div class="line"><a name="l01586"></a><span class="lineno"> 1586</span>         estWriteBuffer[icol]=B;</div>
-<div class="line"><a name="l01587"></a><span class="lineno"> 1587</span>         uncertWriteBuffer[icol]=uncertBackwardBuffer[icol];</div>
-<div class="line"><a name="l01588"></a><span class="lineno"> 1588</span>       }</div>
-<div class="line"><a name="l01589"></a><span class="lineno"> 1589</span>       <span class="keywordflow">else</span> <span class="keywordflow">if</span>(imgReaderForward.isNoData(B)){</div>
-<div class="line"><a name="l01590"></a><span class="lineno"> 1590</span>         estWriteBuffer[icol]=A;</div>
-<div class="line"><a name="l01591"></a><span class="lineno"> 1591</span>         uncertWriteBuffer[icol]=uncertForwardBuffer[icol];</div>
-<div class="line"><a name="l01592"></a><span class="lineno"> 1592</span>       }</div>
-<div class="line"><a name="l01593"></a><span class="lineno"> 1593</span>       <span class="keywordflow">else</span>{</div>
-<div class="line"><a name="l01594"></a><span class="lineno"> 1594</span>         <span class="keywordflow">if</span>(noemer<eps_opt[0]){<span class="comment">//simple average if both uncertainties are ~>0</span></div>
-<div class="line"><a name="l01595"></a><span class="lineno"> 1595</span>           estWriteBuffer[icol]=0.5*(A+B);</div>
-<div class="line"><a name="l01596"></a><span class="lineno"> 1596</span>           uncertWriteBuffer[icol]=uncertObs;</div>
-<div class="line"><a name="l01597"></a><span class="lineno"> 1597</span>         }</div>
-<div class="line"><a name="l01598"></a><span class="lineno"> 1598</span>         <span class="keywordflow">else</span>{</div>
-<div class="line"><a name="l01599"></a><span class="lineno"> 1599</span>           estWriteBuffer[icol]=(A*D+B*C)/noemer;</div>
-<div class="line"><a name="l01600"></a><span class="lineno"> 1600</span>           <span class="keywordtype">double</span> P=0;</div>
-<div class="line"><a name="l01601"></a><span class="lineno"> 1601</span>           <span class="keywordflow">if</span>(C>eps_opt[0])</div>
-<div class="line"><a name="l01602"></a><span class="lineno"> 1602</span>         P+=1.0/C;</div>
-<div class="line"><a name="l01603"></a><span class="lineno"> 1603</span>           <span class="keywordflow">if</span>(D>eps_opt[0])</div>
-<div class="line"><a name="l01604"></a><span class="lineno"> 1604</span>         P+=1.0/D;</div>
-<div class="line"><a name="l01605"></a><span class="lineno"> 1605</span>           <span class="keywordflow">if</span>(uncertObs*uncertObs>eps_opt[0])</div>
-<div class="line"><a name="l01606"></a><span class="lineno"> 1606</span>         P-=1.0/uncertObs/uncertObs;</div>
-<div class="line"><a name="l01607"></a><span class="lineno"> 1607</span>           <span class="keywordflow">if</span>(P>eps_opt[0])</div>
-<div class="line"><a name="l01608"></a><span class="lineno"> 1608</span>         P=sqrt(1.0/P);</div>
-<div class="line"><a name="l01609"></a><span class="lineno"> 1609</span>           <span class="keywordflow">else</span></div>
-<div class="line"><a name="l01610"></a><span class="lineno"> 1610</span>         P=0;</div>
-<div class="line"><a name="l01611"></a><span class="lineno"> 1611</span>           uncertWriteBuffer[icol]=P;</div>
-<div class="line"><a name="l01612"></a><span class="lineno"> 1612</span>         }</div>
-<div class="line"><a name="l01613"></a><span class="lineno"> 1613</span>       }</div>
-<div class="line"><a name="l01614"></a><span class="lineno"> 1614</span>     }</div>
-<div class="line"><a name="l01615"></a><span class="lineno"> 1615</span>     imgWriterEst.writeData(estWriteBuffer,GDT_Float64,irow,0);</div>
-<div class="line"><a name="l01616"></a><span class="lineno"> 1616</span>     imgWriterEst.writeData(uncertWriteBuffer,GDT_Float64,irow,1);</div>
-<div class="line"><a name="l01617"></a><span class="lineno"> 1617</span>     progress=<span class="keyword">static_cast<</span><span class="keywordtype">float</span><span class="keyword">></span>((irow+1.0)/imgWriterEst.nrOfRow());</div>
-<div class="line"><a name="l01618"></a><span class="lineno"> 1618</span>     pfnProgress(progress,pszMessage,pProgressArg);</div>
-<div class="line"><a name="l01619"></a><span class="lineno"> 1619</span>       }</div>
-<div class="line"><a name="l01620"></a><span class="lineno"> 1620</span> </div>
-<div class="line"><a name="l01621"></a><span class="lineno"> 1621</span>       imgWriterEst.close();</div>
-<div class="line"><a name="l01622"></a><span class="lineno"> 1622</span>       imgReaderForward.close();</div>
-<div class="line"><a name="l01623"></a><span class="lineno"> 1623</span>       imgReaderBackward.close();</div>
-<div class="line"><a name="l01624"></a><span class="lineno"> 1624</span>       <span class="keywordflow">if</span>(update){</div>
-<div class="line"><a name="l01625"></a><span class="lineno"> 1625</span>     imgReaderObs.close();</div>
-<div class="line"><a name="l01626"></a><span class="lineno"> 1626</span>     ++obsindex;</div>
-<div class="line"><a name="l01627"></a><span class="lineno"> 1627</span>       }</div>
-<div class="line"><a name="l01628"></a><span class="lineno"> 1628</span>     }</div>
-<div class="line"><a name="l01629"></a><span class="lineno"> 1629</span>   }</div>
-<div class="line"><a name="l01630"></a><span class="lineno"> 1630</span>   <span class="comment">// if(mask_opt.size())</span></div>
-<div class="line"><a name="l01631"></a><span class="lineno"> 1631</span>   <span class="comment">//   maskReader.close();</span></div>
-<div class="line"><a name="l01632"></a><span class="lineno"> 1632</span> }</div>
-<div class="line"><a name="l01633"></a><span class="lineno"> 1633</span> </div>
+<div class="line"><a name="l01506"></a><span class="lineno"> 1506</span>       <span class="keywordflow">for</span>(<span class="keywordtype">int</span> irow=0;irow<imgWriterEst.nrOfRow();++irow){</div>
+<div class="line"><a name="l01507"></a><span class="lineno"> 1507</span>     assert(irow<imgReaderEst.nrOfRow());</div>
+<div class="line"><a name="l01508"></a><span class="lineno"> 1508</span>     <span class="comment">//do not read from imgReaderObs, because we read entire window for each pixel...</span></div>
+<div class="line"><a name="l01509"></a><span class="lineno"> 1509</span>     imgReaderEst.readData(estReadBuffer,GDT_Float64,irow,0);</div>
+<div class="line"><a name="l01510"></a><span class="lineno"> 1510</span>     imgReaderEst.readData(uncertReadBuffer,GDT_Float64,irow,1);</div>
+<div class="line"><a name="l01511"></a><span class="lineno"> 1511</span>     <span class="comment">//read model2 in case current estimate is nodata</span></div>
+<div class="line"><a name="l01512"></a><span class="lineno"> 1512</span>     imgReaderEst.image2geo(0,irow,geox,geoy);</div>
+<div class="line"><a name="l01513"></a><span class="lineno"> 1513</span>     imgReaderModel2.geo2image(geox,geoy,modCol,modRow);</div>
+<div class="line"><a name="l01514"></a><span class="lineno"> 1514</span>     assert(modRow>=0&&modRow<imgReaderModel2.nrOfRow());</div>
+<div class="line"><a name="l01515"></a><span class="lineno"> 1515</span>     imgReaderModel2.readData(model2LineBuffer,GDT_Float64,modRow,0);</div>
+<div class="line"><a name="l01516"></a><span class="lineno"> 1516</span> </div>
+<div class="line"><a name="l01517"></a><span class="lineno"> 1517</span>     imgReaderModel1.geo2image(geox,geoy,modCol,modRow);</div>
+<div class="line"><a name="l01518"></a><span class="lineno"> 1518</span>     assert(modRow>=0&&modRow<imgReaderModel1.nrOfRow());</div>
+<div class="line"><a name="l01519"></a><span class="lineno"> 1519</span>     imgReaderModel1.readData(model1LineBuffer,GDT_Float64,modRow,0);</div>
+<div class="line"><a name="l01520"></a><span class="lineno"> 1520</span> </div>
+<div class="line"><a name="l01521"></a><span class="lineno"> 1521</span>     <span class="keywordflow">if</span>(update){</div>
+<div class="line"><a name="l01522"></a><span class="lineno"> 1522</span>       <span class="keywordtype">int</span> maxRow=(irow+down_opt[0]/2<imgReaderEst.nrOfRow()) ? irow+down_opt[0]/2 : imgReaderEst.nrOfRow()-1;</div>
+<div class="line"><a name="l01523"></a><span class="lineno"> 1523</span>       obsLineVector.erase(obsLineVector.begin());</div>
+<div class="line"><a name="l01524"></a><span class="lineno"> 1524</span>       imgReaderObs.readData(obsLineBuffer,GDT_Float64,maxRow,0);</div>
+<div class="line"><a name="l01525"></a><span class="lineno"> 1525</span>       obsLineVector.push_back(obsLineBuffer);</div>
+<div class="line"><a name="l01526"></a><span class="lineno"> 1526</span>       obsLineBuffer=obsLineVector[down_opt[0]/2];</div>
+<div class="line"><a name="l01527"></a><span class="lineno"> 1527</span>       <span class="comment">// imgReaderObs.readData(obsLineBuffer,GDT_Float64,irow,0);</span></div>
+<div class="line"><a name="l01528"></a><span class="lineno"> 1528</span>       <span class="keywordflow">if</span>(imgReaderObs.nrOfBand()>1)</div>
+<div class="line"><a name="l01529"></a><span class="lineno"> 1529</span>         imgReaderObs.readData(uncertObsLineBuffer,GDT_Float64,irow,1);</div>
+<div class="line"><a name="l01530"></a><span class="lineno"> 1530</span>     }</div>
+<div class="line"><a name="l01531"></a><span class="lineno"> 1531</span>     <span class="comment">// double oldRowMask=-1;//keep track of row mask to optimize number of line readings</span></div>
+<div class="line"><a name="l01532"></a><span class="lineno"> 1532</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> icol=0;icol<imgWriterEst.nrOfCol();++icol){</div>
+<div class="line"><a name="l01533"></a><span class="lineno"> 1533</span>       imgReaderEst.image2geo(icol,irow,geox,geoy);</div>
+<div class="line"><a name="l01534"></a><span class="lineno"> 1534</span>       <span class="keywordtype">int</span> minCol=(icol>down_opt[0]/2) ? icol-down_opt[0]/2 : 0;</div>
+<div class="line"><a name="l01535"></a><span class="lineno"> 1535</span>       <span class="keywordtype">int</span> maxCol=(icol+down_opt[0]/2<imgReaderEst.nrOfCol()) ? icol+down_opt[0]/2 : imgReaderEst.nrOfCol()-1;</div>
+<div class="line"><a name="l01536"></a><span class="lineno"> 1536</span>       <span class="keywordtype">int</span> minRow=(irow>down_opt[0]/2) ? irow-down_opt[0]/2 : 0;</div>
+<div class="line"><a name="l01537"></a><span class="lineno"> 1537</span>       <span class="keywordtype">int</span> maxRow=(irow+down_opt[0]/2<imgReaderEst.nrOfRow()) ? irow+down_opt[0]/2 : imgReaderEst.nrOfRow()-1;</div>
+<div class="line"><a name="l01538"></a><span class="lineno"> 1538</span>       <span class="keywordflow">if</span>(update){</div>
+<div class="line"><a name="l01539"></a><span class="lineno"> 1539</span>         obsWindowBuffer.clear();</div>
+<div class="line"><a name="l01540"></a><span class="lineno"> 1540</span>         <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iline=0;iline<obsLineVector.size();++iline){</div>
+<div class="line"><a name="l01541"></a><span class="lineno"> 1541</span>           <span class="keywordflow">for</span>(<span class="keywordtype">int</span> isample=minCol;isample<=maxCol;++isample){</div>
+<div class="line"><a name="l01542"></a><span class="lineno"> 1542</span>         assert(isample<obsLineVector[iline].size());</div>
+<div class="line"><a name="l01543"></a><span class="lineno"> 1543</span>         obsWindowBuffer.push_back(obsLineVector[iline][isample]);</div>
+<div class="line"><a name="l01544"></a><span class="lineno"> 1544</span>           }</div>
+<div class="line"><a name="l01545"></a><span class="lineno"> 1545</span>         }</div>
+<div class="line"><a name="l01546"></a><span class="lineno"> 1546</span>         <span class="comment">// imgReaderObs.readDataBlock(obsWindowBuffer,GDT_Float64,minCol,maxCol,minRow,maxRow,0);</span></div>
+<div class="line"><a name="l01547"></a><span class="lineno"> 1547</span>       }</div>
+<div class="line"><a name="l01548"></a><span class="lineno"> 1548</span>       <span class="keywordtype">double</span> estValue=estReadBuffer[icol];</div>
+<div class="line"><a name="l01549"></a><span class="lineno"> 1549</span>       <span class="keywordtype">double</span> estMeanValue=0;<span class="comment">//stat.mean(estWindowBuffer);</span></div>
+<div class="line"><a name="l01550"></a><span class="lineno"> 1550</span>       <span class="keywordtype">double</span> nvalid=0;</div>
+<div class="line"><a name="l01551"></a><span class="lineno"> 1551</span>       <span class="comment">//time update</span></div>
+<div class="line"><a name="l01552"></a><span class="lineno"> 1552</span>       imgReaderModel2.geo2image(geox,geoy,modCol,modRow);</div>
+<div class="line"><a name="l01553"></a><span class="lineno"> 1553</span>       assert(modRow>=0&&modRow<imgReaderModel2.nrOfRow());</div>
+<div class="line"><a name="l01554"></a><span class="lineno"> 1554</span>       <span class="keywordtype">double</span> modValue=model2LineBuffer[modCol];</div>
+<div class="line"><a name="l01555"></a><span class="lineno"> 1555</span>       <span class="keywordtype">bool</span> estNodata=imgReaderEst.isNoData(estValue);</div>
+<div class="line"><a name="l01556"></a><span class="lineno"> 1556</span>       <span class="keywordflow">if</span>(estNodata){</div>
+<div class="line"><a name="l01557"></a><span class="lineno"> 1557</span>         <span class="comment">//we have not found any valid data yet, better here to take the current model value if valid</span></div>
+<div class="line"><a name="l01558"></a><span class="lineno"> 1558</span>         <span class="keywordflow">if</span>(imgReaderModel2.isNoData(modValue)){<span class="comment">//if both estimate and model are no-data, set obs to nodata</span></div>
+<div class="line"><a name="l01559"></a><span class="lineno"> 1559</span>           estWriteBuffer[icol]=obsnodata_opt[0];</div>
+<div class="line"><a name="l01560"></a><span class="lineno"> 1560</span>           uncertWriteBuffer[icol]=uncertNodata_opt[0];</div>
+<div class="line"><a name="l01561"></a><span class="lineno"> 1561</span>         }</div>
+<div class="line"><a name="l01562"></a><span class="lineno"> 1562</span>         <span class="keywordflow">else</span>{</div>
+<div class="line"><a name="l01563"></a><span class="lineno"> 1563</span>           estWriteBuffer[icol]=modValue;</div>
+<div class="line"><a name="l01564"></a><span class="lineno"> 1564</span>           uncertWriteBuffer[icol]=uncertModel_opt[0]*stdDev;</div>
+<div class="line"><a name="l01565"></a><span class="lineno"> 1565</span>         }</div>
+<div class="line"><a name="l01566"></a><span class="lineno"> 1566</span>       }   </div>
+<div class="line"><a name="l01567"></a><span class="lineno"> 1567</span>       <span class="keywordflow">else</span>{</div>
+<div class="line"><a name="l01568"></a><span class="lineno"> 1568</span>         <span class="keywordflow">if</span>(window_opt[0]>0){</div>
+<div class="line"><a name="l01569"></a><span class="lineno"> 1569</span>           <span class="keywordflow">try</span>{</div>
+<div class="line"><a name="l01570"></a><span class="lineno"> 1570</span>         <span class="comment">// imgReaderModel2.geo2image(geox,geoy,modCol,modRow);//did that already</span></div>
+<div class="line"><a name="l01571"></a><span class="lineno"> 1571</span>         minCol=(modCol>window_opt[0]/2) ? modCol-window_opt[0]/2 : 0;</div>
+<div class="line"><a name="l01572"></a><span class="lineno"> 1572</span>         maxCol=(modCol+window_opt[0]/2<imgReaderModel2.nrOfCol()) ? modCol+window_opt[0]/2 : imgReaderModel2.nrOfCol()-1;</div>
+<div class="line"><a name="l01573"></a><span class="lineno"> 1573</span>         minRow=(modRow>window_opt[0]/2) ? modRow-window_opt[0]/2 : 0;</div>
+<div class="line"><a name="l01574"></a><span class="lineno"> 1574</span>         maxRow=(modRow+window_opt[0]/2<imgReaderModel2.nrOfRow()) ? modRow+window_opt[0]/2 : imgReaderModel2.nrOfRow()-1;</div>
+<div class="line"><a name="l01575"></a><span class="lineno"> 1575</span>         imgReaderModel2.readDataBlock(model2buffer,GDT_Float64,minCol,maxCol,minRow,maxRow,0);</div>
+<div class="line"><a name="l01576"></a><span class="lineno"> 1576</span> </div>
+<div class="line"><a name="l01577"></a><span class="lineno"> 1577</span>         imgReaderModel1.geo2image(geox,geoy,modCol,modRow);</div>
+<div class="line"><a name="l01578"></a><span class="lineno"> 1578</span>         assert(modRow>=0&&modRow<imgReaderModel1.nrOfRow());</div>
+<div class="line"><a name="l01579"></a><span class="lineno"> 1579</span>         minCol=(modCol>window_opt[0]/2) ? modCol-window_opt[0]/2 : 0;</div>
+<div class="line"><a name="l01580"></a><span class="lineno"> 1580</span>         maxCol=(modCol+window_opt[0]/2<imgReaderModel1.nrOfCol()) ? modCol+window_opt[0]/2 : imgReaderModel1.nrOfCol()-1;</div>
+<div class="line"><a name="l01581"></a><span class="lineno"> 1581</span>         minRow=(modRow>window_opt[0]/2) ? modRow-window_opt[0]/2 : 0;</div>
+<div class="line"><a name="l01582"></a><span class="lineno"> 1582</span>         maxRow=(modRow+window_opt[0]/2<imgReaderModel1.nrOfRow()) ? modRow+window_opt[0]/2 : imgReaderModel1.nrOfRow()-1;</div>
+<div class="line"><a name="l01583"></a><span class="lineno"> 1583</span>         imgReaderModel1.readDataBlock(model1buffer,GDT_Float64,minCol,maxCol,minRow,maxRow,0);</div>
+<div class="line"><a name="l01584"></a><span class="lineno"> 1584</span>         <span class="comment">// imgReaderEst.image2geo(icol,irow,geox,geoy);</span></div>
+<div class="line"><a name="l01585"></a><span class="lineno"> 1585</span>           }</div>
+<div class="line"><a name="l01586"></a><span class="lineno"> 1586</span>           <span class="keywordflow">catch</span>(<span class="keywordtype">string</span> errorString){</div>
+<div class="line"><a name="l01587"></a><span class="lineno"> 1587</span>         cerr << <span class="stringliteral">"Error reading data block for "</span> << minCol << <span class="stringliteral">"-"</span> << maxCol << <span class="stringliteral">", "</span> << minRow << <span class="stringliteral">"-"</span> << maxRow << endl;</div>
+<div class="line"><a name="l01588"></a><span class="lineno"> 1588</span>           }</div>
+<div class="line"><a name="l01589"></a><span class="lineno"> 1589</span>           <span class="comment">//erase no-data from buffer</span></div>
+<div class="line"><a name="l01590"></a><span class="lineno"> 1590</span>           vector<double>::iterator it1=model1buffer.begin();</div>
+<div class="line"><a name="l01591"></a><span class="lineno"> 1591</span>           vector<double>::iterator it2=model2buffer.begin();</div>
+<div class="line"><a name="l01592"></a><span class="lineno"> 1592</span>           <span class="keywordflow">while</span>(it1!=model1buffer.end()&&it2!=model2buffer.end()){</div>
+<div class="line"><a name="l01593"></a><span class="lineno"> 1593</span>         <span class="comment">//erase nodata</span></div>
+<div class="line"><a name="l01594"></a><span class="lineno"> 1594</span>         <span class="keywordtype">bool</span> modNodata=<span class="keyword">false</span>;</div>
+<div class="line"><a name="l01595"></a><span class="lineno"> 1595</span>         modNodata=modNodata||imgReaderModel1.isNoData(*it1);</div>
+<div class="line"><a name="l01596"></a><span class="lineno"> 1596</span>         modNodata=modNodata||imgReaderModel2.isNoData(*it2);</div>
+<div class="line"><a name="l01597"></a><span class="lineno"> 1597</span>         <span class="keywordflow">if</span>(modNodata){</div>
+<div class="line"><a name="l01598"></a><span class="lineno"> 1598</span>           model1buffer.erase(it1);</div>
+<div class="line"><a name="l01599"></a><span class="lineno"> 1599</span>           model2buffer.erase(it2);</div>
+<div class="line"><a name="l01600"></a><span class="lineno"> 1600</span>         }</div>
+<div class="line"><a name="l01601"></a><span class="lineno"> 1601</span>         <span class="keywordflow">else</span>{</div>
+<div class="line"><a name="l01602"></a><span class="lineno"> 1602</span>           ++it1;</div>
+<div class="line"><a name="l01603"></a><span class="lineno"> 1603</span>           ++it2;</div>
+<div class="line"><a name="l01604"></a><span class="lineno"> 1604</span>         }</div>
+<div class="line"><a name="l01605"></a><span class="lineno"> 1605</span>           }</div>
+<div class="line"><a name="l01606"></a><span class="lineno"> 1606</span>           <span class="keywordflow">if</span>(model1buffer.size()>minreg_opt[0]&&model2buffer.size()>minreg_opt[0]){</div>
+<div class="line"><a name="l01607"></a><span class="lineno"> 1607</span>         errMod=stat.linear_regression_err(model1buffer,model2buffer,c0mod,c1mod);</div>
+<div class="line"><a name="l01608"></a><span class="lineno"> 1608</span>         errMod*=regTime_opt[0];</div>
+<div class="line"><a name="l01609"></a><span class="lineno"> 1609</span>           }</div>
+<div class="line"><a name="l01610"></a><span class="lineno"> 1610</span>           <span class="keywordflow">else</span>{<span class="comment">//use global regression...</span></div>
+<div class="line"><a name="l01611"></a><span class="lineno"> 1611</span>         c0mod=c0modGlobal;</div>
+<div class="line"><a name="l01612"></a><span class="lineno"> 1612</span>         c1mod=c1modGlobal;</div>
+<div class="line"><a name="l01613"></a><span class="lineno"> 1613</span>           }</div>
+<div class="line"><a name="l01614"></a><span class="lineno"> 1614</span>         }</div>
+<div class="line"><a name="l01615"></a><span class="lineno"> 1615</span>         <span class="keywordflow">else</span>{</div>
+<div class="line"><a name="l01616"></a><span class="lineno"> 1616</span>           c0mod=c0modGlobal;</div>
+<div class="line"><a name="l01617"></a><span class="lineno"> 1617</span>           c1mod=c1modGlobal;</div>
+<div class="line"><a name="l01618"></a><span class="lineno"> 1618</span>         }</div>
+<div class="line"><a name="l01619"></a><span class="lineno"> 1619</span>         <span class="keywordtype">double</span> regTime=c0mod+c1mod*estValue;</div>
+<div class="line"><a name="l01620"></a><span class="lineno"> 1620</span>         <span class="keywordtype">double</span> regSensor=c0obs+c1obs*modValue;</div>
+<div class="line"><a name="l01621"></a><span class="lineno"> 1621</span> </div>
+<div class="line"><a name="l01622"></a><span class="lineno"> 1622</span>         <span class="keywordflow">if</span>(regSensor_opt[0]<=0)</div>
+<div class="line"><a name="l01623"></a><span class="lineno"> 1623</span>           estWriteBuffer[icol]=regTime;</div>
+<div class="line"><a name="l01624"></a><span class="lineno"> 1624</span>         <span class="keywordflow">else</span>{</div>
+<div class="line"><a name="l01625"></a><span class="lineno"> 1625</span>           <span class="keywordtype">double</span> certMod=1;</div>
+<div class="line"><a name="l01626"></a><span class="lineno"> 1626</span>           <span class="keywordtype">double</span> certObs=1;</div>
+<div class="line"><a name="l01627"></a><span class="lineno"> 1627</span>           <span class="keywordtype">double</span> certNorm=(errMod*errMod+errObs*errObs);</div>
+<div class="line"><a name="l01628"></a><span class="lineno"> 1628</span>           <span class="keywordflow">if</span>(certNorm>eps_opt[0]){</div>
+<div class="line"><a name="l01629"></a><span class="lineno"> 1629</span>         certMod=errObs*errObs/certNorm;</div>
+<div class="line"><a name="l01630"></a><span class="lineno"> 1630</span>         certObs=errMod*errMod/certNorm;</div>
+<div class="line"><a name="l01631"></a><span class="lineno"> 1631</span>           }</div>
+<div class="line"><a name="l01632"></a><span class="lineno"> 1632</span>           <span class="keywordflow">else</span>{</div>
+<div class="line"><a name="l01633"></a><span class="lineno"> 1633</span>         certMod=0.5;</div>
+<div class="line"><a name="l01634"></a><span class="lineno"> 1634</span>         certObs=0.5;</div>
+<div class="line"><a name="l01635"></a><span class="lineno"> 1635</span>           }</div>
+<div class="line"><a name="l01636"></a><span class="lineno"> 1636</span>           estWriteBuffer[icol]=regTime*certObs+regSensor*certMod;</div>
+<div class="line"><a name="l01637"></a><span class="lineno"> 1637</span>         }         </div>
+<div class="line"><a name="l01638"></a><span class="lineno"> 1638</span> </div>
+<div class="line"><a name="l01639"></a><span class="lineno"> 1639</span>         <span class="keywordflow">if</span>(obsmin_opt.size()){</div>
+<div class="line"><a name="l01640"></a><span class="lineno"> 1640</span>           <span class="keywordflow">if</span>(estWriteBuffer[icol]<obsmin_opt[0])</div>
+<div class="line"><a name="l01641"></a><span class="lineno"> 1641</span>         estWriteBuffer[icol]=obsnodata_opt[0];</div>
+<div class="line"><a name="l01642"></a><span class="lineno"> 1642</span>         }</div>
+<div class="line"><a name="l01643"></a><span class="lineno"> 1643</span>         <span class="keywordflow">if</span>(obsmax_opt.size()){</div>
+<div class="line"><a name="l01644"></a><span class="lineno"> 1644</span>           <span class="keywordflow">if</span>(estWriteBuffer[icol]>obsmax_opt[0])</div>
+<div class="line"><a name="l01645"></a><span class="lineno"> 1645</span>         estWriteBuffer[icol]=obsnodata_opt[0];</div>
+<div class="line"><a name="l01646"></a><span class="lineno"> 1646</span>         }</div>
+<div class="line"><a name="l01647"></a><span class="lineno"> 1647</span> </div>
+<div class="line"><a name="l01648"></a><span class="lineno"> 1648</span>         <span class="keywordtype">double</span> totalUncertainty=0;</div>
+<div class="line"><a name="l01649"></a><span class="lineno"> 1649</span>         <span class="keywordflow">if</span>(errMod<eps_opt[0])</div>
+<div class="line"><a name="l01650"></a><span class="lineno"> 1650</span>           totalUncertainty=errObs;</div>
+<div class="line"><a name="l01651"></a><span class="lineno"> 1651</span>         <span class="keywordflow">else</span> <span class="keywordflow">if</span>(errObs<eps_opt[0])</div>
+<div class="line"><a name="l01652"></a><span class="lineno"> 1652</span>           totalUncertainty=errMod;</div>
+<div class="line"><a name="l01653"></a><span class="lineno"> 1653</span>         <span class="keywordflow">else</span>{</div>
+<div class="line"><a name="l01654"></a><span class="lineno"> 1654</span>           totalUncertainty=1.0/errMod/errMod+1/errObs/errObs;</div>
+<div class="line"><a name="l01655"></a><span class="lineno"> 1655</span>           totalUncertainty=sqrt(1.0/totalUncertainty);</div>
+<div class="line"><a name="l01656"></a><span class="lineno"> 1656</span>         }</div>
+<div class="line"><a name="l01657"></a><span class="lineno"> 1657</span>         uncertWriteBuffer[icol]=totalUncertainty+uncertReadBuffer[icol];</div>
+<div class="line"><a name="l01658"></a><span class="lineno"> 1658</span>       }</div>
+<div class="line"><a name="l01659"></a><span class="lineno"> 1659</span>       <span class="comment">//measurement update</span></div>
+<div class="line"><a name="l01660"></a><span class="lineno"> 1660</span>       <span class="keywordflow">if</span>(update&&!imgReaderObs.isNoData(obsLineBuffer[icol])){</div>
+<div class="line"><a name="l01661"></a><span class="lineno"> 1661</span>         <span class="keywordtype">double</span> kalmanGain=1;</div>
+<div class="line"><a name="l01662"></a><span class="lineno"> 1662</span>         <span class="keywordtype">double</span> uncertObs=uncertObs_opt[0];</div>
+<div class="line"><a name="l01663"></a><span class="lineno"> 1663</span>         <span class="keywordflow">if</span>(uncertObsLineBuffer.size()>icol)</div>
+<div class="line"><a name="l01664"></a><span class="lineno"> 1664</span>           uncertObs=uncertObsLineBuffer[icol];</div>
+<div class="line"><a name="l01665"></a><span class="lineno"> 1665</span>         <span class="keywordflow">else</span> <span class="keywordflow">if</span>(weight_opt.size()>1||deltaObs_opt.size()){</div>
+<div class="line"><a name="l01666"></a><span class="lineno"> 1666</span>           <a class="code" href="classstatfactory_1_1StatFactory.html">statfactory::StatFactory</a> statobs;</div>
+<div class="line"><a name="l01667"></a><span class="lineno"> 1667</span>           statobs.setNoDataValues(obsnodata_opt);</div>
+<div class="line"><a name="l01668"></a><span class="lineno"> 1668</span>           <span class="keywordtype">double</span> obsMeanValue=(statobs.mean(obsWindowBuffer)-c0obs)/c1obs;</div>
+<div class="line"><a name="l01669"></a><span class="lineno"> 1669</span>           <span class="keywordtype">double</span> difference=obsMeanValue-modValue;</div>
+<div class="line"><a name="l01670"></a><span class="lineno"> 1670</span>           <span class="keywordflow">if</span>(modValue){</div>
+<div class="line"><a name="l01671"></a><span class="lineno"> 1671</span>         <span class="keywordtype">double</span> relativeDifference=difference/modValue;</div>
+<div class="line"><a name="l01672"></a><span class="lineno"> 1672</span>         <span class="keywordflow">if</span>(deltaObs_opt.size()){</div>
+<div class="line"><a name="l01673"></a><span class="lineno"> 1673</span>           assert(deltaObs_opt.size()>1);</div>
+<div class="line"><a name="l01674"></a><span class="lineno"> 1674</span>           <span class="keywordflow">if</span>(100*relativeDifference<deltaObs_opt[0])<span class="comment">//lower bound</span></div>
+<div class="line"><a name="l01675"></a><span class="lineno"> 1675</span>             kalmanGain=0;</div>
+<div class="line"><a name="l01676"></a><span class="lineno"> 1676</span>           <span class="keywordflow">else</span> <span class="keywordflow">if</span>(100*relativeDifference>deltaObs_opt[1])<span class="comment">//upper bound</span></div>
+<div class="line"><a name="l01677"></a><span class="lineno"> 1677</span>             kalmanGain=0;</div>
+<div class="line"><a name="l01678"></a><span class="lineno"> 1678</span>         }</div>
+<div class="line"><a name="l01679"></a><span class="lineno"> 1679</span>         <span class="keywordflow">else</span> <span class="keywordflow">if</span>(weight_opt.size()){</div>
+<div class="line"><a name="l01680"></a><span class="lineno"> 1680</span>           assert(weight_opt.size()>1);</div>
+<div class="line"><a name="l01681"></a><span class="lineno"> 1681</span>           <span class="keywordflow">if</span>(obsMeanValue<modValue)</div>
+<div class="line"><a name="l01682"></a><span class="lineno"> 1682</span>             uncertObs=-weight_opt[0]*relativeDifference;</div>
+<div class="line"><a name="l01683"></a><span class="lineno"> 1683</span>           <span class="keywordflow">else</span> <span class="keywordflow">if</span>(obsMeanValue>modValue)</div>
+<div class="line"><a name="l01684"></a><span class="lineno"> 1684</span>             uncertObs=weight_opt[1]*relativeDifference;</div>
+<div class="line"><a name="l01685"></a><span class="lineno"> 1685</span>         }</div>
+<div class="line"><a name="l01686"></a><span class="lineno"> 1686</span>           }</div>
+<div class="line"><a name="l01687"></a><span class="lineno"> 1687</span>           <span class="keywordflow">if</span>(uncertObs<=0)</div>
+<div class="line"><a name="l01688"></a><span class="lineno"> 1688</span>         uncertObs=0;</div>
+<div class="line"><a name="l01689"></a><span class="lineno"> 1689</span>           <span class="keywordflow">if</span>(verbose_opt[0]>1)</div>
+<div class="line"><a name="l01690"></a><span class="lineno"> 1690</span>         cout << <span class="stringliteral">"obsMeanValue:"</span> << obsMeanValue << <span class="stringliteral">", modValue: "</span> << modValue << endl;</div>
+<div class="line"><a name="l01691"></a><span class="lineno"> 1691</span>         }</div>
+<div class="line"><a name="l01692"></a><span class="lineno"> 1692</span>         <span class="keywordflow">if</span>(kalmanGain>0){</div>
+<div class="line"><a name="l01693"></a><span class="lineno"> 1693</span>           <span class="keywordflow">if</span>((uncertWriteBuffer[icol]+uncertObs)>eps_opt[0])</div>
+<div class="line"><a name="l01694"></a><span class="lineno"> 1694</span>         kalmanGain=uncertWriteBuffer[icol]/(uncertWriteBuffer[icol]+uncertObs);</div>
+<div class="line"><a name="l01695"></a><span class="lineno"> 1695</span>         }</div>
+<div class="line"><a name="l01696"></a><span class="lineno"> 1696</span>         assert(kalmanGain<=1);</div>
+<div class="line"><a name="l01697"></a><span class="lineno"> 1697</span>         estWriteBuffer[icol]+=kalmanGain*(obsLineBuffer[icol]-estWriteBuffer[icol]);</div>
+<div class="line"><a name="l01698"></a><span class="lineno"> 1698</span>         <span class="keywordflow">if</span>(obsmin_opt.size()){</div>
+<div class="line"><a name="l01699"></a><span class="lineno"> 1699</span>           <span class="keywordflow">if</span>(estWriteBuffer[icol]<obsmin_opt[0])</div>
+<div class="line"><a name="l01700"></a><span class="lineno"> 1700</span>         estWriteBuffer[icol]=obsnodata_opt[0];</div>
+<div class="line"><a name="l01701"></a><span class="lineno"> 1701</span>         }</div>
+<div class="line"><a name="l01702"></a><span class="lineno"> 1702</span>         <span class="keywordflow">if</span>(obsmax_opt.size()){</div>
+<div class="line"><a name="l01703"></a><span class="lineno"> 1703</span>           <span class="keywordflow">if</span>(estWriteBuffer[icol]>obsmax_opt[0])</div>
+<div class="line"><a name="l01704"></a><span class="lineno"> 1704</span>         estWriteBuffer[icol]=obsnodata_opt[0];</div>
+<div class="line"><a name="l01705"></a><span class="lineno"> 1705</span>         }</div>
+<div class="line"><a name="l01706"></a><span class="lineno"> 1706</span>         uncertWriteBuffer[icol]*=(1-kalmanGain);</div>
+<div class="line"><a name="l01707"></a><span class="lineno"> 1707</span>       }</div>
+<div class="line"><a name="l01708"></a><span class="lineno"> 1708</span>       <span class="comment">//test</span></div>
+<div class="line"><a name="l01709"></a><span class="lineno"> 1709</span>       <span class="keywordflow">if</span>(!imgReaderObs.isNoData(estWriteBuffer[icol])){</div>
+<div class="line"><a name="l01710"></a><span class="lineno"> 1710</span>         <span class="keywordflow">if</span>(obsmin_opt.size())</div>
+<div class="line"><a name="l01711"></a><span class="lineno"> 1711</span>           assert(estWriteBuffer[icol]>=obsmin_opt[0]);</div>
+<div class="line"><a name="l01712"></a><span class="lineno"> 1712</span>         <span class="keywordflow">if</span>(obsmax_opt.size())</div>
+<div class="line"><a name="l01713"></a><span class="lineno"> 1713</span>           assert(estWriteBuffer[icol]<=obsmax_opt[0]);</div>
+<div class="line"><a name="l01714"></a><span class="lineno"> 1714</span>       }</div>
+<div class="line"><a name="l01715"></a><span class="lineno"> 1715</span>     }</div>
+<div class="line"><a name="l01716"></a><span class="lineno"> 1716</span>     imgWriterEst.writeData(estWriteBuffer,GDT_Float64,irow,0);</div>
+<div class="line"><a name="l01717"></a><span class="lineno"> 1717</span>     imgWriterEst.writeData(uncertWriteBuffer,GDT_Float64,irow,1);</div>
+<div class="line"><a name="l01718"></a><span class="lineno"> 1718</span>     progress=<span class="keyword">static_cast<</span><span class="keywordtype">float</span><span class="keyword">></span>((irow+1.0)/imgWriterEst.nrOfRow());</div>
+<div class="line"><a name="l01719"></a><span class="lineno"> 1719</span>     pfnProgress(progress,pszMessage,pProgressArg);</div>
+<div class="line"><a name="l01720"></a><span class="lineno"> 1720</span>       }</div>
+<div class="line"><a name="l01721"></a><span class="lineno"> 1721</span> </div>
+<div class="line"><a name="l01722"></a><span class="lineno"> 1722</span>       imgWriterEst.close();</div>
+<div class="line"><a name="l01723"></a><span class="lineno"> 1723</span>       imgReaderEst.close();</div>
+<div class="line"><a name="l01724"></a><span class="lineno"> 1724</span> </div>
+<div class="line"><a name="l01725"></a><span class="lineno"> 1725</span>       <span class="keywordflow">if</span>(update){</div>
+<div class="line"><a name="l01726"></a><span class="lineno"> 1726</span>     imgReaderObs.close();</div>
+<div class="line"><a name="l01727"></a><span class="lineno"> 1727</span>     --obsindex;</div>
+<div class="line"><a name="l01728"></a><span class="lineno"> 1728</span>       }</div>
+<div class="line"><a name="l01729"></a><span class="lineno"> 1729</span>       imgReaderModel1.close();</div>
+<div class="line"><a name="l01730"></a><span class="lineno"> 1730</span>       imgReaderModel2.close();</div>
+<div class="line"><a name="l01731"></a><span class="lineno"> 1731</span>     }</div>
+<div class="line"><a name="l01732"></a><span class="lineno"> 1732</span>   }</div>
+<div class="line"><a name="l01733"></a><span class="lineno"> 1733</span>   <span class="keywordflow">if</span>(find(direction_opt.begin(),direction_opt.end(),<span class="stringliteral">"smooth"</span>)!=direction_opt.end()){</div>
+<div class="line"><a name="l01735"></a><span class="lineno"> 1735</span>     cout << <span class="stringliteral">"Running smooth model"</span> << endl;</div>
+<div class="line"><a name="l01736"></a><span class="lineno"> 1736</span>     obsindex=0;</div>
+<div class="line"><a name="l01737"></a><span class="lineno"> 1737</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> modindex=0;modindex<model_opt.size();++modindex){</div>
+<div class="line"><a name="l01738"></a><span class="lineno"> 1738</span>       <span class="keywordflow">if</span>(verbose_opt[0]){</div>
+<div class="line"><a name="l01739"></a><span class="lineno"> 1739</span>     cout << <span class="stringliteral">"processing time "</span> << tmodel_opt[modindex] << endl;</div>
+<div class="line"><a name="l01740"></a><span class="lineno"> 1740</span>     <span class="keywordflow">if</span>(obsindex<relobsindex.size())</div>
+<div class="line"><a name="l01741"></a><span class="lineno"> 1741</span>       cout << <span class="stringliteral">"next observation "</span> << tmodel_opt[relobsindex[obsindex]] << endl;</div>
+<div class="line"><a name="l01742"></a><span class="lineno"> 1742</span>     <span class="keywordflow">else</span></div>
+<div class="line"><a name="l01743"></a><span class="lineno"> 1743</span>       cout << <span class="stringliteral">"There is no next observation"</span> << endl;</div>
+<div class="line"><a name="l01744"></a><span class="lineno"> 1744</span>       }</div>
+<div class="line"><a name="l01745"></a><span class="lineno"> 1745</span>       <span class="keywordtype">string</span> output;</div>
+<div class="line"><a name="l01746"></a><span class="lineno"> 1746</span>       <span class="keywordflow">if</span>(outputfb_opt.size()==model_opt.size())</div>
+<div class="line"><a name="l01747"></a><span class="lineno"> 1747</span>     output=outputfb_opt[modindex];</div>
+<div class="line"><a name="l01748"></a><span class="lineno"> 1748</span>       <span class="keywordflow">else</span>{</div>
+<div class="line"><a name="l01749"></a><span class="lineno"> 1749</span>     ostringstream outputstream;</div>
+<div class="line"><a name="l01750"></a><span class="lineno"> 1750</span>     outputstream << outputfb_opt[0] << <span class="stringliteral">"_"</span>;</div>
+<div class="line"><a name="l01751"></a><span class="lineno"> 1751</span>     outputstream << setfill(<span class="charliteral">'0'</span>) << setw(ndigit) << tmodel_opt[modindex];</div>
+<div class="line"><a name="l01752"></a><span class="lineno"> 1752</span>     outputstream << <span class="stringliteral">".tif"</span>;</div>
+<div class="line"><a name="l01753"></a><span class="lineno"> 1753</span>     <span class="comment">// outputstream << outputfb_opt[0] << "_" << tmodel_opt[modindex] << ".tif";</span></div>
+<div class="line"><a name="l01754"></a><span class="lineno"> 1754</span>     output=outputstream.str();</div>
+<div class="line"><a name="l01755"></a><span class="lineno"> 1755</span>       }</div>
+<div class="line"><a name="l01756"></a><span class="lineno"> 1756</span>     </div>
+<div class="line"><a name="l01757"></a><span class="lineno"> 1757</span>       <span class="comment">//two band output band0=estimation, band1=uncertainty</span></div>
+<div class="line"><a name="l01758"></a><span class="lineno"> 1758</span>       imgWriterEst.open(output,ncol,nrow,2,GDT_Float64,imageType,option_opt);</div>
+<div class="line"><a name="l01759"></a><span class="lineno"> 1759</span>       imgWriterEst.setProjectionProj4(projection_opt[0]);</div>
+<div class="line"><a name="l01760"></a><span class="lineno"> 1760</span>       imgWriterEst.setGeoTransform(geotransform);</div>
+<div class="line"><a name="l01761"></a><span class="lineno"> 1761</span>       imgWriterEst.GDALSetNoDataValue(obsnodata_opt[0]);</div>
+<div class="line"><a name="l01762"></a><span class="lineno"> 1762</span> </div>
+<div class="line"><a name="l01763"></a><span class="lineno"> 1763</span>       <span class="comment">//open forward and backward estimates</span></div>
+<div class="line"><a name="l01764"></a><span class="lineno"> 1764</span>       <span class="comment">//we assume forward in model and backward in observation...</span></div>
+<div class="line"><a name="l01765"></a><span class="lineno"> 1765</span> </div>
+<div class="line"><a name="l01766"></a><span class="lineno"> 1766</span>       <span class="keywordtype">string</span> inputfw;</div>
+<div class="line"><a name="l01767"></a><span class="lineno"> 1767</span>       <span class="keywordtype">string</span> inputbw;</div>
+<div class="line"><a name="l01768"></a><span class="lineno"> 1768</span>       <span class="keywordflow">if</span>(outputfw_opt.size()==model_opt.size())</div>
+<div class="line"><a name="l01769"></a><span class="lineno"> 1769</span>     inputfw=outputfw_opt[modindex];</div>
+<div class="line"><a name="l01770"></a><span class="lineno"> 1770</span>       <span class="keywordflow">else</span>{</div>
+<div class="line"><a name="l01771"></a><span class="lineno"> 1771</span>     ostringstream outputstream;</div>
+<div class="line"><a name="l01772"></a><span class="lineno"> 1772</span>     outputstream << outputfw_opt[0] << <span class="stringliteral">"_"</span>;</div>
+<div class="line"><a name="l01773"></a><span class="lineno"> 1773</span>     outputstream << setfill(<span class="charliteral">'0'</span>) << setw(ndigit) << tmodel_opt[modindex];</div>
+<div class="line"><a name="l01774"></a><span class="lineno"> 1774</span>     outputstream << <span class="stringliteral">".tif"</span>;</div>
+<div class="line"><a name="l01775"></a><span class="lineno"> 1775</span>     <span class="comment">// outputstream << outputfw_opt[0] << "_" << tmodel_opt[modindex] << ".tif";</span></div>
+<div class="line"><a name="l01776"></a><span class="lineno"> 1776</span>     inputfw=outputstream.str();</div>
+<div class="line"><a name="l01777"></a><span class="lineno"> 1777</span>       }</div>
+<div class="line"><a name="l01778"></a><span class="lineno"> 1778</span>       <span class="keywordflow">if</span>(outputbw_opt.size()==model_opt.size())</div>
+<div class="line"><a name="l01779"></a><span class="lineno"> 1779</span>     inputbw=outputbw_opt[modindex];</div>
+<div class="line"><a name="l01780"></a><span class="lineno"> 1780</span>       <span class="keywordflow">else</span>{</div>
+<div class="line"><a name="l01781"></a><span class="lineno"> 1781</span>     ostringstream outputstream;</div>
+<div class="line"><a name="l01782"></a><span class="lineno"> 1782</span>     outputstream << outputbw_opt[0] << <span class="stringliteral">"_"</span>;</div>
+<div class="line"><a name="l01783"></a><span class="lineno"> 1783</span>     outputstream << setfill(<span class="charliteral">'0'</span>) << setw(ndigit) << tmodel_opt[modindex];</div>
+<div class="line"><a name="l01784"></a><span class="lineno"> 1784</span>     outputstream << <span class="stringliteral">".tif"</span>;</div>
+<div class="line"><a name="l01785"></a><span class="lineno"> 1785</span>     <span class="comment">// outputstream << outputbw_opt[0] << "_" << tmodel_opt[modindex] << ".tif";</span></div>
+<div class="line"><a name="l01786"></a><span class="lineno"> 1786</span>     inputbw=outputstream.str();</div>
+<div class="line"><a name="l01787"></a><span class="lineno"> 1787</span>       }</div>
+<div class="line"><a name="l01788"></a><span class="lineno"> 1788</span>       <a class="code" href="classImgReaderGdal.html">ImgReaderGdal</a> imgReaderForward(inputfw);</div>
+<div class="line"><a name="l01789"></a><span class="lineno"> 1789</span>       <a class="code" href="classImgReaderGdal.html">ImgReaderGdal</a> imgReaderBackward(inputbw);</div>
+<div class="line"><a name="l01790"></a><span class="lineno"> 1790</span>       imgReaderForward.setNoData(obsnodata_opt);</div>
+<div class="line"><a name="l01791"></a><span class="lineno"> 1791</span>       <span class="keywordflow">if</span>(obsoffset_opt.size())</div>
+<div class="line"><a name="l01792"></a><span class="lineno"> 1792</span>     imgReaderForward.setOffset(obsoffset_opt[0]);</div>
+<div class="line"><a name="l01793"></a><span class="lineno"> 1793</span>       <span class="keywordflow">if</span>(obsscale_opt.size())</div>
+<div class="line"><a name="l01794"></a><span class="lineno"> 1794</span>     imgReaderForward.setScale(obsscale_opt[0]);</div>
+<div class="line"><a name="l01795"></a><span class="lineno"> 1795</span>       imgReaderBackward.setNoData(obsnodata_opt);</div>
+<div class="line"><a name="l01796"></a><span class="lineno"> 1796</span>       <span class="keywordflow">if</span>(obsoffset_opt.size())</div>
+<div class="line"><a name="l01797"></a><span class="lineno"> 1797</span>     imgReaderBackward.setOffset(obsoffset_opt[0]);</div>
+<div class="line"><a name="l01798"></a><span class="lineno"> 1798</span>       <span class="keywordflow">if</span>(obsscale_opt.size())</div>
+<div class="line"><a name="l01799"></a><span class="lineno"> 1799</span>     imgReaderBackward.setScale(obsscale_opt[0]);</div>
+<div class="line"><a name="l01800"></a><span class="lineno"> 1800</span>       </div>
+<div class="line"><a name="l01801"></a><span class="lineno"> 1801</span>       vector<double> estForwardBuffer;</div>
+<div class="line"><a name="l01802"></a><span class="lineno"> 1802</span>       vector<double> estBackwardBuffer;</div>
+<div class="line"><a name="l01803"></a><span class="lineno"> 1803</span>       vector<double> uncertObsLineBuffer;</div>
+<div class="line"><a name="l01804"></a><span class="lineno"> 1804</span>       vector<double> uncertForwardBuffer;</div>
+<div class="line"><a name="l01805"></a><span class="lineno"> 1805</span>       vector<double> uncertBackwardBuffer;</div>
+<div class="line"><a name="l01806"></a><span class="lineno"> 1806</span>       vector<double> uncertReadBuffer;</div>
+<div class="line"><a name="l01807"></a><span class="lineno"> 1807</span>       vector<double> estWriteBuffer(ncol);</div>
+<div class="line"><a name="l01808"></a><span class="lineno"> 1808</span>       vector<double> uncertWriteBuffer(ncol);</div>
+<div class="line"><a name="l01809"></a><span class="lineno"> 1809</span>       <span class="comment">// vector<double> lineMask;</span></div>
+<div class="line"><a name="l01810"></a><span class="lineno"> 1810</span> </div>
+<div class="line"><a name="l01811"></a><span class="lineno"> 1811</span>       <span class="keywordtype">bool</span> update=<span class="keyword">false</span>;</div>
+<div class="line"><a name="l01812"></a><span class="lineno"> 1812</span>       <span class="keywordflow">if</span>(obsindex<relobsindex.size()){</div>
+<div class="line"><a name="l01813"></a><span class="lineno"> 1813</span>     update=(relobsindex[obsindex]==modindex);</div>
+<div class="line"><a name="l01814"></a><span class="lineno"> 1814</span>       }</div>
+<div class="line"><a name="l01815"></a><span class="lineno"> 1815</span> </div>
+<div class="line"><a name="l01816"></a><span class="lineno"> 1816</span>       <span class="keywordflow">if</span>(update){</div>
+<div class="line"><a name="l01817"></a><span class="lineno"> 1817</span>     <span class="keywordflow">if</span>(verbose_opt[0])</div>
+<div class="line"><a name="l01818"></a><span class="lineno"> 1818</span>       cout << <span class="stringliteral">"***update "</span> << relobsindex[obsindex] << <span class="stringliteral">" = "</span> << modindex << <span class="stringliteral">" "</span> << observation_opt[obsindex] << <span class="stringliteral">" ***"</span> << endl;</div>
+<div class="line"><a name="l01819"></a><span class="lineno"> 1819</span>     imgReaderObs.open(observation_opt[obsindex]);</div>
+<div class="line"><a name="l01820"></a><span class="lineno"> 1820</span>     imgReaderObs.getGeoTransform(geotransform);</div>
+<div class="line"><a name="l01821"></a><span class="lineno"> 1821</span>     imgReaderObs.setNoData(obsnodata_opt);</div>
+<div class="line"><a name="l01822"></a><span class="lineno"> 1822</span>     <span class="keywordflow">if</span>(obsoffset_opt.size())</div>
+<div class="line"><a name="l01823"></a><span class="lineno"> 1823</span>       imgReaderObs.setOffset(obsoffset_opt[0]);</div>
+<div class="line"><a name="l01824"></a><span class="lineno"> 1824</span>     <span class="keywordflow">if</span>(obsscale_opt.size())</div>
+<div class="line"><a name="l01825"></a><span class="lineno"> 1825</span>       imgReaderObs.setScale(obsscale_opt[0]);</div>
+<div class="line"><a name="l01826"></a><span class="lineno"> 1826</span>     <span class="comment">//calculate regression between model and observation</span></div>
+<div class="line"><a name="l01827"></a><span class="lineno"> 1827</span>       }</div>
+<div class="line"><a name="l01828"></a><span class="lineno"> 1828</span> </div>
+<div class="line"><a name="l01829"></a><span class="lineno"> 1829</span>       pfnProgress(progress,pszMessage,pProgressArg);</div>
+<div class="line"><a name="l01830"></a><span class="lineno"> 1830</span> </div>
+<div class="line"><a name="l01831"></a><span class="lineno"> 1831</span>       <span class="keywordflow">for</span>(<span class="keywordtype">int</span> irow=0;irow<imgWriterEst.nrOfRow();++irow){</div>
+<div class="line"><a name="l01832"></a><span class="lineno"> 1832</span>     assert(irow<imgReaderForward.nrOfRow());</div>
+<div class="line"><a name="l01833"></a><span class="lineno"> 1833</span>     assert(irow<imgReaderBackward.nrOfRow());</div>
+<div class="line"><a name="l01834"></a><span class="lineno"> 1834</span>     imgReaderForward.readData(estForwardBuffer,GDT_Float64,irow,0);</div>
+<div class="line"><a name="l01835"></a><span class="lineno"> 1835</span>     imgReaderBackward.readData(estBackwardBuffer,GDT_Float64,irow,0);</div>
+<div class="line"><a name="l01836"></a><span class="lineno"> 1836</span>     imgReaderForward.readData(uncertForwardBuffer,GDT_Float64,irow,1);</div>
+<div class="line"><a name="l01837"></a><span class="lineno"> 1837</span>     imgReaderBackward.readData(uncertBackwardBuffer,GDT_Float64,irow,1);</div>
+<div class="line"><a name="l01838"></a><span class="lineno"> 1838</span> </div>
+<div class="line"><a name="l01839"></a><span class="lineno"> 1839</span>     <span class="keywordflow">if</span>(update){</div>
+<div class="line"><a name="l01840"></a><span class="lineno"> 1840</span>       imgReaderObs.readData(estWriteBuffer,GDT_Float64,irow,0);</div>
+<div class="line"><a name="l01841"></a><span class="lineno"> 1841</span>       <span class="keywordflow">if</span>(imgReaderObs.nrOfBand()>1)</div>
+<div class="line"><a name="l01842"></a><span class="lineno"> 1842</span>         imgReaderObs.readData(uncertObsLineBuffer,GDT_Float64,irow,1);</div>
+<div class="line"><a name="l01843"></a><span class="lineno"> 1843</span>     }</div>
+<div class="line"><a name="l01844"></a><span class="lineno"> 1844</span> </div>
+<div class="line"><a name="l01845"></a><span class="lineno"> 1845</span>     <span class="comment">// double oldRowMask=-1;//keep track of row mask to optimize number of line readings</span></div>
+<div class="line"><a name="l01846"></a><span class="lineno"> 1846</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> icol=0;icol<imgWriterEst.nrOfCol();++icol){</div>
+<div class="line"><a name="l01847"></a><span class="lineno"> 1847</span>       imgWriterEst.image2geo(icol,irow,geox,geoy);</div>
+<div class="line"><a name="l01848"></a><span class="lineno"> 1848</span>       <span class="keywordtype">double</span> A=estForwardBuffer[icol];</div>
+<div class="line"><a name="l01849"></a><span class="lineno"> 1849</span>       <span class="keywordtype">double</span> B=estBackwardBuffer[icol];</div>
+<div class="line"><a name="l01850"></a><span class="lineno"> 1850</span>       <span class="keywordtype">double</span> C=uncertForwardBuffer[icol]*uncertForwardBuffer[icol];</div>
+<div class="line"><a name="l01851"></a><span class="lineno"> 1851</span>       <span class="keywordtype">double</span> D=uncertBackwardBuffer[icol]*uncertBackwardBuffer[icol];</div>
+<div class="line"><a name="l01852"></a><span class="lineno"> 1852</span>       <span class="keywordtype">double</span> uncertObs=uncertObs_opt[0];</div>
+<div class="line"><a name="l01853"></a><span class="lineno"> 1853</span> </div>
+<div class="line"><a name="l01854"></a><span class="lineno"> 1854</span>       <span class="comment">// if(update){//check for nodata in observation</span></div>
+<div class="line"><a name="l01855"></a><span class="lineno"> 1855</span>       <span class="comment">//   if(imgReaderObs.isNoData(estWriteBuffer[icol]))</span></div>
+<div class="line"><a name="l01856"></a><span class="lineno"> 1856</span>       <span class="comment">//     uncertObs=uncertNodata_opt[0];</span></div>
+<div class="line"><a name="l01857"></a><span class="lineno"> 1857</span>       <span class="comment">//   else if(uncertObsLineBuffer.size()>icol)</span></div>
+<div class="line"><a name="l01858"></a><span class="lineno"> 1858</span>       <span class="comment">//     uncertObs=uncertObsLineBuffer[icol];</span></div>
+<div class="line"><a name="l01859"></a><span class="lineno"> 1859</span>       <span class="comment">// }</span></div>
+<div class="line"><a name="l01860"></a><span class="lineno"> 1860</span> </div>
+<div class="line"><a name="l01861"></a><span class="lineno"> 1861</span>       <span class="keywordtype">double</span> noemer=(C+D);</div>
+<div class="line"><a name="l01862"></a><span class="lineno"> 1862</span>       <span class="comment">//todo: consistently check for division by zero...</span></div>
+<div class="line"><a name="l01863"></a><span class="lineno"> 1863</span>       <span class="keywordflow">if</span>(imgReaderForward.isNoData(A)&&imgReaderBackward.isNoData(B)){</div>
+<div class="line"><a name="l01864"></a><span class="lineno"> 1864</span>         estWriteBuffer[icol]=obsnodata_opt[0];</div>
+<div class="line"><a name="l01865"></a><span class="lineno"> 1865</span>         uncertWriteBuffer[icol]=uncertNodata_opt[0];</div>
+<div class="line"><a name="l01866"></a><span class="lineno"> 1866</span>       }</div>
+<div class="line"><a name="l01867"></a><span class="lineno"> 1867</span>       <span class="keywordflow">else</span> <span class="keywordflow">if</span>(imgReaderForward.isNoData(A)){</div>
+<div class="line"><a name="l01868"></a><span class="lineno"> 1868</span>         estWriteBuffer[icol]=B;</div>
+<div class="line"><a name="l01869"></a><span class="lineno"> 1869</span>         uncertWriteBuffer[icol]=uncertBackwardBuffer[icol];</div>
+<div class="line"><a name="l01870"></a><span class="lineno"> 1870</span>       }</div>
+<div class="line"><a name="l01871"></a><span class="lineno"> 1871</span>       <span class="keywordflow">else</span> <span class="keywordflow">if</span>(imgReaderForward.isNoData(B)){</div>
+<div class="line"><a name="l01872"></a><span class="lineno"> 1872</span>         estWriteBuffer[icol]=A;</div>
+<div class="line"><a name="l01873"></a><span class="lineno"> 1873</span>         uncertWriteBuffer[icol]=uncertForwardBuffer[icol];</div>
+<div class="line"><a name="l01874"></a><span class="lineno"> 1874</span>       }</div>
+<div class="line"><a name="l01875"></a><span class="lineno"> 1875</span>       <span class="keywordflow">else</span>{</div>
+<div class="line"><a name="l01876"></a><span class="lineno"> 1876</span>         <span class="keywordflow">if</span>(noemer<eps_opt[0]){<span class="comment">//simple average if both uncertainties are ~>0</span></div>
+<div class="line"><a name="l01877"></a><span class="lineno"> 1877</span>           estWriteBuffer[icol]=0.5*(A+B);</div>
+<div class="line"><a name="l01878"></a><span class="lineno"> 1878</span>           uncertWriteBuffer[icol]=uncertObs;</div>
+<div class="line"><a name="l01879"></a><span class="lineno"> 1879</span>         }</div>
+<div class="line"><a name="l01880"></a><span class="lineno"> 1880</span>         <span class="keywordflow">else</span>{</div>
+<div class="line"><a name="l01881"></a><span class="lineno"> 1881</span>           estWriteBuffer[icol]=(A*D+B*C)/noemer;</div>
+<div class="line"><a name="l01882"></a><span class="lineno"> 1882</span>           <span class="keywordflow">if</span>(obsmin_opt.size()){</div>
+<div class="line"><a name="l01883"></a><span class="lineno"> 1883</span>         <span class="keywordflow">if</span>(estWriteBuffer[icol]<obsmin_opt[0])</div>
+<div class="line"><a name="l01884"></a><span class="lineno"> 1884</span>         estWriteBuffer[icol]=obsnodata_opt[0];</div>
+<div class="line"><a name="l01885"></a><span class="lineno"> 1885</span>           }</div>
+<div class="line"><a name="l01886"></a><span class="lineno"> 1886</span>           <span class="keywordflow">if</span>(obsmax_opt.size()){</div>
+<div class="line"><a name="l01887"></a><span class="lineno"> 1887</span>         <span class="keywordflow">if</span>(estWriteBuffer[icol]>obsmax_opt[0])</div>
+<div class="line"><a name="l01888"></a><span class="lineno"> 1888</span>         estWriteBuffer[icol]=obsnodata_opt[0];</div>
+<div class="line"><a name="l01889"></a><span class="lineno"> 1889</span>           }</div>
+<div class="line"><a name="l01890"></a><span class="lineno"> 1890</span>           <span class="keywordtype">double</span> P=0;</div>
+<div class="line"><a name="l01891"></a><span class="lineno"> 1891</span>           <span class="keywordflow">if</span>(C>eps_opt[0])</div>
+<div class="line"><a name="l01892"></a><span class="lineno"> 1892</span>         P+=1.0/C;</div>
+<div class="line"><a name="l01893"></a><span class="lineno"> 1893</span>           <span class="keywordflow">if</span>(D>eps_opt[0])</div>
+<div class="line"><a name="l01894"></a><span class="lineno"> 1894</span>         P+=1.0/D;</div>
+<div class="line"><a name="l01895"></a><span class="lineno"> 1895</span>           <span class="keywordflow">if</span>(uncertObs*uncertObs>eps_opt[0])</div>
+<div class="line"><a name="l01896"></a><span class="lineno"> 1896</span>         P-=1.0/uncertObs/uncertObs;</div>
+<div class="line"><a name="l01897"></a><span class="lineno"> 1897</span>           <span class="keywordflow">if</span>(P>eps_opt[0])</div>
+<div class="line"><a name="l01898"></a><span class="lineno"> 1898</span>         P=sqrt(1.0/P);</div>
+<div class="line"><a name="l01899"></a><span class="lineno"> 1899</span>           <span class="keywordflow">else</span></div>
+<div class="line"><a name="l01900"></a><span class="lineno"> 1900</span>         P=0;</div>
+<div class="line"><a name="l01901"></a><span class="lineno"> 1901</span>           uncertWriteBuffer[icol]=P;</div>
+<div class="line"><a name="l01902"></a><span class="lineno"> 1902</span>         }</div>
+<div class="line"><a name="l01903"></a><span class="lineno"> 1903</span>       }</div>
+<div class="line"><a name="l01904"></a><span class="lineno"> 1904</span>       <span class="comment">//test</span></div>
+<div class="line"><a name="l01905"></a><span class="lineno"> 1905</span>       <span class="keywordflow">if</span>(!imgReaderObs.isNoData(estWriteBuffer[icol])){</div>
+<div class="line"><a name="l01906"></a><span class="lineno"> 1906</span>         <span class="keywordflow">if</span>(obsmin_opt.size())</div>
+<div class="line"><a name="l01907"></a><span class="lineno"> 1907</span>           assert(estWriteBuffer[icol]>=obsmin_opt[0]);</div>
+<div class="line"><a name="l01908"></a><span class="lineno"> 1908</span>         <span class="keywordflow">if</span>(obsmax_opt.size())</div>
+<div class="line"><a name="l01909"></a><span class="lineno"> 1909</span>           assert(estWriteBuffer[icol]<=obsmax_opt[0]);</div>
+<div class="line"><a name="l01910"></a><span class="lineno"> 1910</span>       }</div>
+<div class="line"><a name="l01911"></a><span class="lineno"> 1911</span>     }</div>
+<div class="line"><a name="l01912"></a><span class="lineno"> 1912</span>     imgWriterEst.writeData(estWriteBuffer,GDT_Float64,irow,0);</div>
+<div class="line"><a name="l01913"></a><span class="lineno"> 1913</span>     imgWriterEst.writeData(uncertWriteBuffer,GDT_Float64,irow,1);</div>
+<div class="line"><a name="l01914"></a><span class="lineno"> 1914</span>     progress=<span class="keyword">static_cast<</span><span class="keywordtype">float</span><span class="keyword">></span>((irow+1.0)/imgWriterEst.nrOfRow());</div>
+<div class="line"><a name="l01915"></a><span class="lineno"> 1915</span>     pfnProgress(progress,pszMessage,pProgressArg);</div>
+<div class="line"><a name="l01916"></a><span class="lineno"> 1916</span>       }</div>
+<div class="line"><a name="l01917"></a><span class="lineno"> 1917</span> </div>
+<div class="line"><a name="l01918"></a><span class="lineno"> 1918</span>       imgWriterEst.close();</div>
+<div class="line"><a name="l01919"></a><span class="lineno"> 1919</span>       imgReaderForward.close();</div>
+<div class="line"><a name="l01920"></a><span class="lineno"> 1920</span>       imgReaderBackward.close();</div>
+<div class="line"><a name="l01921"></a><span class="lineno"> 1921</span>       <span class="keywordflow">if</span>(update){</div>
+<div class="line"><a name="l01922"></a><span class="lineno"> 1922</span>     imgReaderObs.close();</div>
+<div class="line"><a name="l01923"></a><span class="lineno"> 1923</span>     ++obsindex;</div>
+<div class="line"><a name="l01924"></a><span class="lineno"> 1924</span>       }</div>
+<div class="line"><a name="l01925"></a><span class="lineno"> 1925</span>     }</div>
+<div class="line"><a name="l01926"></a><span class="lineno"> 1926</span>   }</div>
+<div class="line"><a name="l01927"></a><span class="lineno"> 1927</span>   <span class="comment">// if(mask_opt.size())</span></div>
+<div class="line"><a name="l01928"></a><span class="lineno"> 1928</span>   <span class="comment">//   maskReader.close();</span></div>
+<div class="line"><a name="l01929"></a><span class="lineno"> 1929</span> }</div>
+<div class="line"><a name="l01930"></a><span class="lineno"> 1930</span> </div>
 <div class="ttc" id="classimgregression_1_1ImgRegression_html"><div class="ttname"><a href="classimgregression_1_1ImgRegression.html">imgregression::ImgRegression</a></div><div class="ttdef"><b>Definition:</b> <a href="ImgRegression_8h_source.html#l00030">ImgRegression.h:30</a></div></div>
 <div class="ttc" id="classImgReaderGdal_html"><div class="ttname"><a href="classImgReaderGdal.html">ImgReaderGdal</a></div><div class="ttdef"><b>Definition:</b> <a href="ImgReaderGdal_8h_source.html#l00033">ImgReaderGdal.h:33</a></div></div>
 <div class="ttc" id="classImgWriterGdal_html"><div class="ttname"><a href="classImgWriterGdal.html">ImgWriterGdal</a></div><div class="ttdef"><b>Definition:</b> <a href="ImgWriterGdal_8h_source.html#l00032">ImgWriterGdal.h:32</a></div></div>
@@ -1646,7 +1943,7 @@
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Jun 23 2015 17:09:36 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/pkkalman_8cc_source.html b/doc/html/pkkalman_8cc_source.html
index 878419b..afa7ffb 100644
--- a/doc/html/pkkalman_8cc_source.html
+++ b/doc/html/pkkalman_8cc_source.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.3</span>
+    <span id="projectnumber">2.6.4</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -79,1565 +79,1463 @@
 <div class="line"><a name="l00025"></a><span class="lineno">   25</span> <span class="preprocessor">#include "imageclasses/ImgReaderGdal.h"</span></div>
 <div class="line"><a name="l00026"></a><span class="lineno">   26</span> <span class="preprocessor">#include "imageclasses/ImgWriterGdal.h"</span></div>
 <div class="line"><a name="l00027"></a><span class="lineno">   27</span> <span class="preprocessor">#include "algorithms/StatFactory.h"</span></div>
-<div class="line"><a name="l00028"></a><span class="lineno">   28</span> <span class="preprocessor">#include "algorithms/ImgRegression.h"</span></div>
-<div class="line"><a name="l00029"></a><span class="lineno">   29</span> </div>
-<div class="line"><a name="l00030"></a><span class="lineno">   30</span> <span class="comment">/******************************************************************************/</span></div>
-<div class="line"><a name="l00076"></a><span class="lineno">   76</span> <span class="keyword">using namespace </span>std;</div>
-<div class="line"><a name="l00077"></a><span class="lineno">   77</span> <span class="comment">/*------------------</span></div>
-<div class="line"><a name="l00078"></a><span class="lineno">   78</span> <span class="comment">  Main procedure</span></div>
-<div class="line"><a name="l00079"></a><span class="lineno">   79</span> <span class="comment">  ----------------*/</span></div>
-<div class="line"><a name="l00080"></a><span class="lineno">   80</span> <span class="keywordtype">int</span> main(<span class="keywordtype">int</span> argc,<span class="keywordtype">char</span> **argv) {</div>
-<div class="line"><a name="l00081"></a><span class="lineno">   81</span>   <a class="code" href="classOptionpk.html">Optionpk<string></a> direction_opt(<span class="stringliteral">"dir"</span>,<span class="stringliteral">"direction"</span>,<span class="stringliteral">"direction to run model (forward|backward|smooth)"</span>,<span class="stringliteral">"forward"</span>);</div>
-<div class="line"><a name="l00082"></a><span class="lineno">   82</span>   <a class="code" href="classOptionpk.html">Optionpk<string></a> model_opt(<span class="stringliteral">"mod"</span>,<span class="stringliteral">"model"</span>,<span class="stringliteral">"model input datasets, e.g., MODIS (use: -mod model1 -mod model2 etc.)"</span>);</div>
-<div class="line"><a name="l00083"></a><span class="lineno">   83</span>   <a class="code" href="classOptionpk.html">Optionpk<string></a> observation_opt(<span class="stringliteral">"obs"</span>,<span class="stringliteral">"observation"</span>,<span class="stringliteral">"observation input datasets, e.g., landsat (use: -obs obs1 -obs obs2 etc.)"</span>);</div>
-<div class="line"><a name="l00084"></a><span class="lineno">   84</span>   <a class="code" href="classOptionpk.html">Optionpk<int></a> tmodel_opt(<span class="stringliteral">"tmod"</span>,<span class="stringliteral">"tmodel"</span>,<span class="stringliteral">"time sequence of model input. Sequence must have exact same length as model input. Leave empty to have default sequence 0,1,2,etc."</span>); </div>
-<div class="line"><a name="l00085"></a><span class="lineno">   85</span>   <a class="code" href="classOptionpk.html">Optionpk<int></a> tobservation_opt(<span class="stringliteral">"tobs"</span>,<span class="stringliteral">"tobservation"</span>,<span class="stringliteral">"time sequence of observation input. Sequence must have exact same length as observation input)"</span>); </div>
-<div class="line"><a name="l00086"></a><span class="lineno">   86</span>   <a class="code" href="classOptionpk.html">Optionpk<string></a>  projection_opt(<span class="stringliteral">"a_srs"</span>, <span class="stringliteral">"a_srs"</span>, <span class="stringliteral">"Override the projection for the output file (leave blank to copy from input file, use epsg:3035 to use European projection and force to European grid"</span>);</div>
-<div class="line"><a name="l00087"></a><span class="lineno">   87</span>   <a class="code" href="classOptionpk.html">Optionpk<string></a> outputfw_opt(<span class="stringliteral">"ofw"</span>, <span class="stringliteral">"outputfw"</span>, <span class="stringliteral">"Output raster dataset for forward model"</span>);</div>
-<div class="line"><a name="l00088"></a><span class="lineno">   88</span>   <a class="code" href="classOptionpk.html">Optionpk<string></a> outputbw_opt(<span class="stringliteral">"obw"</span>, <span class="stringliteral">"outputbw"</span>, <span class="stringliteral">"Output raster dataset for backward model"</span>);</div>
-<div class="line"><a name="l00089"></a><span class="lineno">   89</span>   <a class="code" href="classOptionpk.html">Optionpk<string></a> outputfb_opt(<span class="stringliteral">"ofb"</span>, <span class="stringliteral">"outputfb"</span>, <span class="stringliteral">"Output raster dataset for smooth model"</span>);</div>
-<div class="line"><a name="l00090"></a><span class="lineno">   90</span>   <a class="code" href="classOptionpk.html">Optionpk<double></a> modnodata_opt(<span class="stringliteral">"modnodata"</span>, <span class="stringliteral">"modnodata"</span>, <span class="stringliteral">"invalid value for model input"</span>, 0);</div>
-<div class="line"><a name="l00091"></a><span class="lineno">   91</span>   <a class="code" href="classOptionpk.html">Optionpk<double></a> obsnodata_opt(<span class="stringliteral">"obsnodata"</span>, <span class="stringliteral">"obsnodata"</span>, <span class="stringliteral">"invalid value for observation input"</span>, 0);</div>
-<div class="line"><a name="l00092"></a><span class="lineno">   92</span>   <a class="code" href="classOptionpk.html">Optionpk<double></a> modoffset_opt(<span class="stringliteral">"modoffset"</span>, <span class="stringliteral">"modoffset"</span>, <span class="stringliteral">"offset used to read model input dataset (value=offset+scale*readValue)"</span>);</div>
-<div class="line"><a name="l00093"></a><span class="lineno">   93</span>   <a class="code" href="classOptionpk.html">Optionpk<double></a> obsoffset_opt(<span class="stringliteral">"obsoffset"</span>, <span class="stringliteral">"obsoffset"</span>, <span class="stringliteral">"offset used to read observation input dataset (value=offset+scale*readValue)"</span>);</div>
-<div class="line"><a name="l00094"></a><span class="lineno">   94</span>   <a class="code" href="classOptionpk.html">Optionpk<double></a> modscale_opt(<span class="stringliteral">"modscale"</span>, <span class="stringliteral">"modscale"</span>, <span class="stringliteral">"scale used to read model input dataset (value=offset+scale*readValue)"</span>);</div>
-<div class="line"><a name="l00095"></a><span class="lineno">   95</span>   <a class="code" href="classOptionpk.html">Optionpk<double></a> obsscale_opt(<span class="stringliteral">"obsscale"</span>, <span class="stringliteral">"obsscale"</span>, <span class="stringliteral">"scale used to read observation input dataset (value=offset+scale*readValue)"</span>);</div>
-<div class="line"><a name="l00096"></a><span class="lineno">   96</span>   <a class="code" href="classOptionpk.html">Optionpk<double></a> eps_opt(<span class="stringliteral">"eps"</span>, <span class="stringliteral">"eps"</span>, <span class="stringliteral">"epsilon for non zero division"</span>, 0.00001);</div>
-<div class="line"><a name="l00097"></a><span class="lineno">   97</span>   <a class="code" href="classOptionpk.html">Optionpk<double></a> uncertModel_opt(<span class="stringliteral">"um"</span>, <span class="stringliteral">"uncertmodel"</span>, <span class="stringliteral">"Multiply this value with std dev of first model image to obtain uncertainty of model"</span>,2);</div>
-<div class="line"><a name="l00098"></a><span class="lineno">   98</span>   <a class="code" href="classOptionpk.html">Optionpk<double></a> uncertObs_opt(<span class="stringliteral">"uo"</span>, <span class="stringliteral">"uncertobs"</span>, <span class="stringliteral">"Uncertainty of valid observations"</span>,0);</div>
-<div class="line"><a name="l00099"></a><span class="lineno">   99</span>   <a class="code" href="classOptionpk.html">Optionpk<double></a> weight_opt(<span class="stringliteral">"w"</span>, <span class="stringliteral">"weight"</span>, <span class="stringliteral">"Penalize outliers in measurement via weights. Use first weight to penalize small measurements wrt model and second weight to penalize large measurements wrt model"</span>);</div>
-<div class="line"><a name="l00100"></a><span class="lineno">  100</span>   <a class="code" href="classOptionpk.html">Optionpk<double></a> deltaObs_opt(<span class="stringliteral">"dobs"</span>, <span class="stringliteral">"deltaobs"</span>, <span class="stringliteral">"Lower and upper thresholds for relative pixel differences (in percentage): (observation-model)/model. For instance to force the observation within a +/- 10 % interval, use: -dobs -10 -do [...]
-<div class="line"><a name="l00101"></a><span class="lineno">  101</span>   <a class="code" href="classOptionpk.html">Optionpk<double></a> uncertNodata_opt(<span class="stringliteral">"unodata"</span>, <span class="stringliteral">"uncertnodata"</span>, <span class="stringliteral">"Uncertainty in case of no-data values in observation"</span>, 10000);</div>
-<div class="line"><a name="l00102"></a><span class="lineno">  102</span>   <a class="code" href="classOptionpk.html">Optionpk<double></a> regTime_opt(<span class="stringliteral">"rt"</span>, <span class="stringliteral">"regtime"</span>, <span class="stringliteral">"Weight for regression in time series"</span>, 1.0);</div>
-<div class="line"><a name="l00103"></a><span class="lineno">  103</span>   <a class="code" href="classOptionpk.html">Optionpk<double></a> regSensor_opt(<span class="stringliteral">"rs"</span>, <span class="stringliteral">"regsensor"</span>, <span class="stringliteral">"Weight for regression model - measurement (model - observation)."</span>);</div>
-<div class="line"><a name="l00104"></a><span class="lineno">  104</span>   <a class="code" href="classOptionpk.html">Optionpk<int></a> down_opt(<span class="stringliteral">"down"</span>, <span class="stringliteral">"down"</span>, <span class="stringliteral">"Downsampling factor for reading model data to calculate regression"</span>);</div>
-<div class="line"><a name="l00105"></a><span class="lineno">  105</span>   <a class="code" href="classOptionpk.html">Optionpk<float></a> threshold_opt(<span class="stringliteral">"th"</span>, <span class="stringliteral">"threshold"</span>, <span class="stringliteral">"threshold for selecting samples (randomly). Provide probability in percentage (>0) or absolute (<0)."</span>, 0);</div>
-<div class="line"><a name="l00106"></a><span class="lineno">  106</span>   <a class="code" href="classOptionpk.html">Optionpk<int></a> minreg_opt(<span class="stringliteral">"minreg"</span>, <span class="stringliteral">"minreg"</span>, <span class="stringliteral">"Minimum number of pixels to take into account for regression"</span>, 5, 2);</div>
-<div class="line"><a name="l00107"></a><span class="lineno">  107</span>   <span class="comment">// Optionpk<bool> regObs_opt("regobs", "regobs", "Perform regression between modeled and observed value",false);</span></div>
-<div class="line"><a name="l00108"></a><span class="lineno">  108</span>   <span class="comment">// Optionpk<double> checkDiff_opt("diff", "diff", "Flag observation as invalid if difference with model is above uncertainty",false);</span></div>
-<div class="line"><a name="l00109"></a><span class="lineno">  109</span>   <a class="code" href="classOptionpk.html">Optionpk<unsigned short></a> window_opt(<span class="stringliteral">"win"</span>, <span class="stringliteral">"window"</span>, <span class="stringliteral">"window size for calculating regression (use 0 for global)"</span>, 0);</div>
-<div class="line"><a name="l00110"></a><span class="lineno">  110</span>   <span class="comment">// Optionpk<string> mask_opt("m", "mask", "Use the first band of the specified file as a validity mask. Nodata values can be set with the option msknodata.");</span></div>
-<div class="line"><a name="l00111"></a><span class="lineno">  111</span>   <span class="comment">// Optionpk<double> msknodata_opt("msknodata", "msknodata", "Mask value(s) not to consider for filtering. First value will be set in output image.", 0);</span></div>
-<div class="line"><a name="l00112"></a><span class="lineno">  112</span> </div>
-<div class="line"><a name="l00113"></a><span class="lineno">  113</span>   <a class="code" href="classOptionpk.html">Optionpk<string></a>  oformat_opt(<span class="stringliteral">"of"</span>, <span class="stringliteral">"oformat"</span>, <span class="stringliteral">"Output image format (see also gdal_translate). Empty string: inherit from input image"</span>,<span class="stringliteral">"GTiff"</span>,2);</div>
-<div class="line"><a name="l00114"></a><span class="lineno">  114</span>   <a class="code" href="classOptionpk.html">Optionpk<string></a> option_opt(<span class="stringliteral">"co"</span>, <span class="stringliteral">"co"</span>, <span class="stringliteral">"Creation option for output file. Multiple options can be specified."</span>);</div>
-<div class="line"><a name="l00115"></a><span class="lineno">  115</span>   <a class="code" href="classOptionpk.html">Optionpk<short></a> verbose_opt(<span class="stringliteral">"v"</span>, <span class="stringliteral">"verbose"</span>, <span class="stringliteral">"verbose mode when positive"</span>, 0);</div>
-<div class="line"><a name="l00116"></a><span class="lineno">  116</span> </div>
-<div class="line"><a name="l00117"></a><span class="lineno">  117</span>   <span class="keywordtype">bool</span> doProcess;<span class="comment">//stop process when program was invoked with help option (-h --help)</span></div>
-<div class="line"><a name="l00118"></a><span class="lineno">  118</span>   <span class="keywordflow">try</span>{</div>
-<div class="line"><a name="l00119"></a><span class="lineno">  119</span>     doProcess=direction_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00120"></a><span class="lineno">  120</span>     model_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00121"></a><span class="lineno">  121</span>     observation_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00122"></a><span class="lineno">  122</span>     tmodel_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00123"></a><span class="lineno">  123</span>     tobservation_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00124"></a><span class="lineno">  124</span>     projection_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00125"></a><span class="lineno">  125</span>     outputfw_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00126"></a><span class="lineno">  126</span>     outputbw_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00127"></a><span class="lineno">  127</span>     outputfb_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00128"></a><span class="lineno">  128</span>     modnodata_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00129"></a><span class="lineno">  129</span>     obsnodata_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00130"></a><span class="lineno">  130</span>     modoffset_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00131"></a><span class="lineno">  131</span>     modscale_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00132"></a><span class="lineno">  132</span>     obsoffset_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00133"></a><span class="lineno">  133</span>     obsscale_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00134"></a><span class="lineno">  134</span>     eps_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00135"></a><span class="lineno">  135</span>     uncertModel_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00136"></a><span class="lineno">  136</span>     uncertObs_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00137"></a><span class="lineno">  137</span>     weight_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00138"></a><span class="lineno">  138</span>     deltaObs_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00139"></a><span class="lineno">  139</span>     uncertNodata_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00140"></a><span class="lineno">  140</span>     regTime_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00141"></a><span class="lineno">  141</span>     regSensor_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00142"></a><span class="lineno">  142</span>     down_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00143"></a><span class="lineno">  143</span>     threshold_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00144"></a><span class="lineno">  144</span>     minreg_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00145"></a><span class="lineno">  145</span>     <span class="comment">// regObs_opt.retrieveOption(argc,argv);</span></div>
-<div class="line"><a name="l00146"></a><span class="lineno">  146</span>     <span class="comment">// checkDiff_opt.retrieveOption(argc,argv);</span></div>
-<div class="line"><a name="l00147"></a><span class="lineno">  147</span>     window_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00148"></a><span class="lineno">  148</span>     <span class="comment">// mask_opt.retrieveOption(argc,argv);</span></div>
-<div class="line"><a name="l00149"></a><span class="lineno">  149</span>     <span class="comment">// msknodata_opt.retrieveOption(argc,argv);</span></div>
-<div class="line"><a name="l00150"></a><span class="lineno">  150</span>     oformat_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00151"></a><span class="lineno">  151</span>     option_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00152"></a><span class="lineno">  152</span>     verbose_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00153"></a><span class="lineno">  153</span>   }</div>
-<div class="line"><a name="l00154"></a><span class="lineno">  154</span>   <span class="keywordflow">catch</span>(<span class="keywordtype">string</span> predefinedString){</div>
-<div class="line"><a name="l00155"></a><span class="lineno">  155</span>     std::cout << predefinedString << std::endl;</div>
-<div class="line"><a name="l00156"></a><span class="lineno">  156</span>     exit(0);</div>
-<div class="line"><a name="l00157"></a><span class="lineno">  157</span>   }</div>
-<div class="line"><a name="l00158"></a><span class="lineno">  158</span>   <span class="keywordflow">if</span>(!doProcess){</div>
-<div class="line"><a name="l00159"></a><span class="lineno">  159</span>     std::cerr << <span class="stringliteral">"short option -h shows basic options only, use long option --help to show all options"</span> << std::endl;</div>
-<div class="line"><a name="l00160"></a><span class="lineno">  160</span>     exit(0);<span class="comment">//help was invoked, stop processing</span></div>
-<div class="line"><a name="l00161"></a><span class="lineno">  161</span>   }</div>
-<div class="line"><a name="l00162"></a><span class="lineno">  162</span> </div>
-<div class="line"><a name="l00163"></a><span class="lineno">  163</span>   <span class="keywordflow">if</span>(deltaObs_opt.size()==1){</div>
-<div class="line"><a name="l00164"></a><span class="lineno">  164</span>     <span class="keywordflow">if</span>(deltaObs_opt[0]<=0)</div>
-<div class="line"><a name="l00165"></a><span class="lineno">  165</span>       deltaObs_opt.push_back(-deltaObs_opt[0]);</div>
-<div class="line"><a name="l00166"></a><span class="lineno">  166</span>     <span class="keywordflow">else</span></div>
-<div class="line"><a name="l00167"></a><span class="lineno">  167</span>       deltaObs_opt.insert(deltaObs_opt.begin(),-deltaObs_opt[0]);</div>
-<div class="line"><a name="l00168"></a><span class="lineno">  168</span>   }</div>
-<div class="line"><a name="l00169"></a><span class="lineno">  169</span>   <span class="keywordflow">if</span>(weight_opt.size()==1){</div>
-<div class="line"><a name="l00170"></a><span class="lineno">  170</span>     weight_opt.push_back(weight_opt[0]);</div>
-<div class="line"><a name="l00171"></a><span class="lineno">  171</span>   }</div>
-<div class="line"><a name="l00172"></a><span class="lineno">  172</span> </div>
-<div class="line"><a name="l00173"></a><span class="lineno">  173</span>   <span class="keywordflow">if</span>(down_opt.empty()){</div>
-<div class="line"><a name="l00174"></a><span class="lineno">  174</span>     std::cerr << <span class="stringliteral">"short option -h shows basic options only, use long option --help to show all options"</span> << std::endl;</div>
-<div class="line"><a name="l00175"></a><span class="lineno">  175</span>     exit(0);<span class="comment">//help was invoked, stop processing</span></div>
-<div class="line"><a name="l00176"></a><span class="lineno">  176</span>   }</div>
-<div class="line"><a name="l00177"></a><span class="lineno">  177</span>   <span class="keywordflow">try</span>{</div>
-<div class="line"><a name="l00178"></a><span class="lineno">  178</span>     ostringstream errorStream;</div>
-<div class="line"><a name="l00179"></a><span class="lineno">  179</span>     <span class="keywordflow">if</span>(model_opt.size()<2){</div>
-<div class="line"><a name="l00180"></a><span class="lineno">  180</span>       errorStream << <span class="stringliteral">"Error: no model dataset selected, use option -mod"</span> << endl;</div>
-<div class="line"><a name="l00181"></a><span class="lineno">  181</span>       <span class="keywordflow">throw</span>(errorStream.str());</div>
-<div class="line"><a name="l00182"></a><span class="lineno">  182</span>     }</div>
-<div class="line"><a name="l00183"></a><span class="lineno">  183</span>     <span class="keywordflow">if</span>(observation_opt.size()<1){</div>
-<div class="line"><a name="l00184"></a><span class="lineno">  184</span>       errorStream << <span class="stringliteral">"Error: no observation dataset selected, use option -obs"</span> << endl;</div>
-<div class="line"><a name="l00185"></a><span class="lineno">  185</span>       <span class="keywordflow">throw</span>(errorStream.str());</div>
-<div class="line"><a name="l00186"></a><span class="lineno">  186</span>     }</div>
-<div class="line"><a name="l00187"></a><span class="lineno">  187</span>     <span class="keywordflow">if</span>(direction_opt[0]==<span class="stringliteral">"smooth"</span>){</div>
-<div class="line"><a name="l00188"></a><span class="lineno">  188</span>       <span class="keywordflow">if</span>(outputfw_opt.empty()){</div>
-<div class="line"><a name="l00189"></a><span class="lineno">  189</span>     errorStream << <span class="stringliteral">"Error: output forward datasets is not provided, use option -ofw"</span> << endl;</div>
-<div class="line"><a name="l00190"></a><span class="lineno">  190</span>     <span class="keywordflow">throw</span>(errorStream.str());</div>
-<div class="line"><a name="l00191"></a><span class="lineno">  191</span>       }</div>
-<div class="line"><a name="l00192"></a><span class="lineno">  192</span>       <span class="keywordflow">if</span>(outputbw_opt.empty()){</div>
-<div class="line"><a name="l00193"></a><span class="lineno">  193</span>     errorStream << <span class="stringliteral">"Error: output backward datasets is not provided, use option -obw"</span> << endl;</div>
-<div class="line"><a name="l00194"></a><span class="lineno">  194</span>     <span class="keywordflow">throw</span>(errorStream.str());</div>
-<div class="line"><a name="l00195"></a><span class="lineno">  195</span>       }</div>
-<div class="line"><a name="l00196"></a><span class="lineno">  196</span>       <span class="keywordflow">if</span>(outputfb_opt.empty()){</div>
-<div class="line"><a name="l00197"></a><span class="lineno">  197</span>     errorStream << <span class="stringliteral">"Error: output smooth datasets is not provided, use option -ofb"</span> << endl;</div>
-<div class="line"><a name="l00198"></a><span class="lineno">  198</span>     <span class="keywordflow">throw</span>(errorStream.str());</div>
-<div class="line"><a name="l00199"></a><span class="lineno">  199</span>       }</div>
-<div class="line"><a name="l00200"></a><span class="lineno">  200</span>     }</div>
-<div class="line"><a name="l00201"></a><span class="lineno">  201</span>     <span class="keywordflow">else</span>{</div>
-<div class="line"><a name="l00202"></a><span class="lineno">  202</span>       <span class="keywordflow">if</span>(direction_opt[0]==<span class="stringliteral">"forward"</span>&&outputfw_opt.empty()){</div>
-<div class="line"><a name="l00203"></a><span class="lineno">  203</span>     errorStream << <span class="stringliteral">"Error: output forward datasets is not provided, use option -ofw"</span> << endl;</div>
-<div class="line"><a name="l00204"></a><span class="lineno">  204</span>     <span class="keywordflow">throw</span>(errorStream.str());</div>
-<div class="line"><a name="l00205"></a><span class="lineno">  205</span>       }</div>
-<div class="line"><a name="l00206"></a><span class="lineno">  206</span>       <span class="keywordflow">else</span> <span class="keywordflow">if</span>(direction_opt[0]==<span class="stringliteral">"backward"</span>&&outputbw_opt.empty()){</div>
-<div class="line"><a name="l00207"></a><span class="lineno">  207</span>     errorStream << <span class="stringliteral">"Error: output backward datasets is not provided, use option -obw"</span> << endl;</div>
-<div class="line"><a name="l00208"></a><span class="lineno">  208</span>     <span class="keywordflow">throw</span>(errorStream.str());</div>
-<div class="line"><a name="l00209"></a><span class="lineno">  209</span>       }</div>
-<div class="line"><a name="l00210"></a><span class="lineno">  210</span> </div>
-<div class="line"><a name="l00211"></a><span class="lineno">  211</span>       <span class="keywordflow">if</span>(model_opt.size()<observation_opt.size()){</div>
-<div class="line"><a name="l00212"></a><span class="lineno">  212</span>     errorStream << <span class="stringliteral">"Error: sequence of models should be larger than observations"</span> << endl;</div>
-<div class="line"><a name="l00213"></a><span class="lineno">  213</span>     <span class="keywordflow">throw</span>(errorStream.str());</div>
-<div class="line"><a name="l00214"></a><span class="lineno">  214</span>       }</div>
-<div class="line"><a name="l00215"></a><span class="lineno">  215</span>       <span class="keywordflow">if</span>(tmodel_opt.size()!=model_opt.size()){</div>
-<div class="line"><a name="l00216"></a><span class="lineno">  216</span>     <span class="keywordflow">if</span>(tmodel_opt.empty())</div>
-<div class="line"><a name="l00217"></a><span class="lineno">  217</span>       cout << <span class="stringliteral">"Warning: time sequence is not provided, self generating time sequence from 0 to "</span> << model_opt.size() << endl;</div>
-<div class="line"><a name="l00218"></a><span class="lineno">  218</span>     <span class="keywordflow">else</span></div>
-<div class="line"><a name="l00219"></a><span class="lineno">  219</span>       cout << <span class="stringliteral">"Warning: time sequence provided ("</span> << tmodel_opt.size() << <span class="stringliteral">") does not match number of model raster datasets ("</span> << model_opt.size() << <span class="stringliteral">")"</span> << endl;</div>
-<div class="line"><a name="l00220"></a><span class="lineno">  220</span>     tmodel_opt.clear();</div>
-<div class="line"><a name="l00221"></a><span class="lineno">  221</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> tindex=0;tindex<model_opt.size();++tindex)</div>
-<div class="line"><a name="l00222"></a><span class="lineno">  222</span>       tmodel_opt.push_back(tindex);</div>
-<div class="line"><a name="l00223"></a><span class="lineno">  223</span>       }</div>
-<div class="line"><a name="l00224"></a><span class="lineno">  224</span>       <span class="keywordflow">if</span>(tobservation_opt.size()!=observation_opt.size()){</div>
-<div class="line"><a name="l00225"></a><span class="lineno">  225</span>     errorStream << <span class="stringliteral">"Error: time sequence for observation must match size of observation dataset"</span> << endl;</div>
-<div class="line"><a name="l00226"></a><span class="lineno">  226</span>     <span class="keywordflow">throw</span>(errorStream.str());</div>
-<div class="line"><a name="l00227"></a><span class="lineno">  227</span>       }</div>
-<div class="line"><a name="l00228"></a><span class="lineno">  228</span>     }</div>
-<div class="line"><a name="l00229"></a><span class="lineno">  229</span>   }</div>
-<div class="line"><a name="l00230"></a><span class="lineno">  230</span>   <span class="keywordflow">catch</span>(<span class="keywordtype">string</span> errorString){</div>
-<div class="line"><a name="l00231"></a><span class="lineno">  231</span>     std::cout << errorString << std::endl;</div>
-<div class="line"><a name="l00232"></a><span class="lineno">  232</span>     exit(1);</div>
-<div class="line"><a name="l00233"></a><span class="lineno">  233</span>   }</div>
-<div class="line"><a name="l00234"></a><span class="lineno">  234</span> </div>
-<div class="line"><a name="l00235"></a><span class="lineno">  235</span>   <a class="code" href="classstatfactory_1_1StatFactory.html">statfactory::StatFactory</a> stat;</div>
-<div class="line"><a name="l00236"></a><span class="lineno">  236</span>   stat.setNoDataValues(modnodata_opt);</div>
-<div class="line"><a name="l00237"></a><span class="lineno">  237</span>   <a class="code" href="classimgregression_1_1ImgRegression.html">imgregression::ImgRegression</a> imgreg;</div>
-<div class="line"><a name="l00238"></a><span class="lineno">  238</span>   <span class="comment">// vector<ImgReaderGdal> imgReaderModel(model_opt.size());</span></div>
-<div class="line"><a name="l00239"></a><span class="lineno">  239</span>   <span class="comment">// vector<ImgReaderGdal> imgReaderObs(observation_opt.size());</span></div>
-<div class="line"><a name="l00240"></a><span class="lineno">  240</span>   <a class="code" href="classImgReaderGdal.html">ImgReaderGdal</a> imgReaderModel1;</div>
-<div class="line"><a name="l00241"></a><span class="lineno">  241</span>   <a class="code" href="classImgReaderGdal.html">ImgReaderGdal</a> imgReaderModel2;</div>
-<div class="line"><a name="l00242"></a><span class="lineno">  242</span>   <a class="code" href="classImgReaderGdal.html">ImgReaderGdal</a> imgReaderObs;</div>
-<div class="line"><a name="l00243"></a><span class="lineno">  243</span>   <a class="code" href="classImgWriterGdal.html">ImgWriterGdal</a> imgWriterEst;</div>
+<div class="line"><a name="l00028"></a><span class="lineno">   28</span> </div>
+<div class="line"><a name="l00029"></a><span class="lineno">   29</span> <span class="comment">/******************************************************************************/</span></div>
+<div class="line"><a name="l00068"></a><span class="lineno">   68</span> <span class="keyword">using namespace </span>std;</div>
+<div class="line"><a name="l00069"></a><span class="lineno">   69</span> <span class="comment">/*------------------</span></div>
+<div class="line"><a name="l00070"></a><span class="lineno">   70</span> <span class="comment">  Main procedure</span></div>
+<div class="line"><a name="l00071"></a><span class="lineno">   71</span> <span class="comment">  ----------------*/</span></div>
+<div class="line"><a name="l00072"></a><span class="lineno">   72</span> <span class="keywordtype">int</span> main(<span class="keywordtype">int</span> argc,<span class="keywordtype">char</span> **argv) {</div>
+<div class="line"><a name="l00073"></a><span class="lineno">   73</span>   <a class="code" href="classOptionpk.html">Optionpk<string></a> direction_opt(<span class="stringliteral">"dir"</span>,<span class="stringliteral">"direction"</span>,<span class="stringliteral">"direction to run model (forward|backward|smooth)"</span>,<span class="stringliteral">"forward"</span>);</div>
+<div class="line"><a name="l00074"></a><span class="lineno">   74</span>   <a class="code" href="classOptionpk.html">Optionpk<string></a> model_opt(<span class="stringliteral">"mod"</span>,<span class="stringliteral">"model"</span>,<span class="stringliteral">"model input datasets, e.g., MODIS (use: -mod model1 -mod model2 etc.)"</span>);</div>
+<div class="line"><a name="l00075"></a><span class="lineno">   75</span>   <a class="code" href="classOptionpk.html">Optionpk<string></a> observation_opt(<span class="stringliteral">"obs"</span>,<span class="stringliteral">"observation"</span>,<span class="stringliteral">"observation input datasets, e.g., landsat (use: -obs obs1 -obs obs2 etc.)"</span>);</div>
+<div class="line"><a name="l00076"></a><span class="lineno">   76</span>   <a class="code" href="classOptionpk.html">Optionpk<int></a> tmodel_opt(<span class="stringliteral">"tmod"</span>,<span class="stringliteral">"tmodel"</span>,<span class="stringliteral">"time sequence of model input. Sequence must have exact same length as model input. Leave empty to have default sequence 0,1,2,etc."</span>); </div>
+<div class="line"><a name="l00077"></a><span class="lineno">   77</span>   <a class="code" href="classOptionpk.html">Optionpk<int></a> tobservation_opt(<span class="stringliteral">"tobs"</span>,<span class="stringliteral">"tobservation"</span>,<span class="stringliteral">"time sequence of observation input. Sequence must have exact same length as observation input)"</span>); </div>
+<div class="line"><a name="l00078"></a><span class="lineno">   78</span>   <a class="code" href="classOptionpk.html">Optionpk<string></a>  projection_opt(<span class="stringliteral">"a_srs"</span>, <span class="stringliteral">"a_srs"</span>, <span class="stringliteral">"Override the projection for the output file (leave blank to copy from input file, use epsg:3035 to use European projection and force to European grid"</span>);</div>
+<div class="line"><a name="l00079"></a><span class="lineno">   79</span>   <a class="code" href="classOptionpk.html">Optionpk<string></a> outputfw_opt(<span class="stringliteral">"ofw"</span>, <span class="stringliteral">"outputfw"</span>, <span class="stringliteral">"Output raster dataset for forward model"</span>);</div>
+<div class="line"><a name="l00080"></a><span class="lineno">   80</span>   <a class="code" href="classOptionpk.html">Optionpk<string></a> outputbw_opt(<span class="stringliteral">"obw"</span>, <span class="stringliteral">"outputbw"</span>, <span class="stringliteral">"Output raster dataset for backward model"</span>);</div>
+<div class="line"><a name="l00081"></a><span class="lineno">   81</span>   <a class="code" href="classOptionpk.html">Optionpk<string></a> outputfb_opt(<span class="stringliteral">"ofb"</span>, <span class="stringliteral">"outputfb"</span>, <span class="stringliteral">"Output raster dataset for smooth model"</span>);</div>
+<div class="line"><a name="l00082"></a><span class="lineno">   82</span>   <a class="code" href="classOptionpk.html">Optionpk<string></a> gain_opt(<span class="stringliteral">"gain"</span>, <span class="stringliteral">"gain"</span>, <span class="stringliteral">"Output raster dataset for gain"</span>);</div>
+<div class="line"><a name="l00083"></a><span class="lineno">   83</span>   </div>
+<div class="line"><a name="l00084"></a><span class="lineno">   84</span>   <a class="code" href="classOptionpk.html">Optionpk<double></a> modnodata_opt(<span class="stringliteral">"modnodata"</span>, <span class="stringliteral">"modnodata"</span>, <span class="stringliteral">"invalid value for model input"</span>, 0);</div>
+<div class="line"><a name="l00085"></a><span class="lineno">   85</span>   <a class="code" href="classOptionpk.html">Optionpk<double></a> obsnodata_opt(<span class="stringliteral">"obsnodata"</span>, <span class="stringliteral">"obsnodata"</span>, <span class="stringliteral">"invalid value for observation input"</span>, 0);</div>
+<div class="line"><a name="l00086"></a><span class="lineno">   86</span>   <a class="code" href="classOptionpk.html">Optionpk<double></a> obsmin_opt(<span class="stringliteral">"obsmin"</span>, <span class="stringliteral">"obsmin"</span>, <span class="stringliteral">"Minimum value for observation data"</span>);</div>
+<div class="line"><a name="l00087"></a><span class="lineno">   87</span>   <a class="code" href="classOptionpk.html">Optionpk<double></a> obsmax_opt(<span class="stringliteral">"obsmax"</span>, <span class="stringliteral">"obsmax"</span>, <span class="stringliteral">"Maximum value for observation data"</span>);</div>
+<div class="line"><a name="l00088"></a><span class="lineno">   88</span>   <a class="code" href="classOptionpk.html">Optionpk<double></a> eps_opt(<span class="stringliteral">"eps"</span>, <span class="stringliteral">"eps"</span>, <span class="stringliteral">"epsilon for non zero division"</span>, 0.00001);</div>
+<div class="line"><a name="l00089"></a><span class="lineno">   89</span>   <a class="code" href="classOptionpk.html">Optionpk<double></a> uncertModel_opt(<span class="stringliteral">"um"</span>, <span class="stringliteral">"uncertmodel"</span>, <span class="stringliteral">"Multiplication factor for uncertainty of model"</span>,1,1);</div>
+<div class="line"><a name="l00090"></a><span class="lineno">   90</span>   <a class="code" href="classOptionpk.html">Optionpk<double></a> uncertObs_opt(<span class="stringliteral">"uo"</span>, <span class="stringliteral">"uncertobs"</span>, <span class="stringliteral">"Uncertainty of valid observations"</span>,1,1);</div>
+<div class="line"><a name="l00091"></a><span class="lineno">   91</span>   <a class="code" href="classOptionpk.html">Optionpk<double></a> processNoise_opt(<span class="stringliteral">"q"</span>, <span class="stringliteral">"q"</span>, <span class="stringliteral">"Process noise: expresses instability (variance) of proportions of fine res pixels within a moderate resolution pixel"</span>,1);</div>
+<div class="line"><a name="l00092"></a><span class="lineno">   92</span>   <a class="code" href="classOptionpk.html">Optionpk<double></a> uncertNodata_opt(<span class="stringliteral">"unodata"</span>, <span class="stringliteral">"uncertnodata"</span>, <span class="stringliteral">"Uncertainty in case of no-data values in observation"</span>, 10000);</div>
+<div class="line"><a name="l00093"></a><span class="lineno">   93</span>   <a class="code" href="classOptionpk.html">Optionpk<int></a> down_opt(<span class="stringliteral">"down"</span>, <span class="stringliteral">"down"</span>, <span class="stringliteral">"Downsampling factor for reading model data to calculate regression"</span>);</div>
+<div class="line"><a name="l00094"></a><span class="lineno">   94</span>   <a class="code" href="classOptionpk.html">Optionpk<string></a>  oformat_opt(<span class="stringliteral">"of"</span>, <span class="stringliteral">"oformat"</span>, <span class="stringliteral">"Output image format (see also gdal_translate). Empty string: inherit from input image"</span>,<span class="stringliteral">"GTiff"</span>,2);</div>
+<div class="line"><a name="l00095"></a><span class="lineno">   95</span>   <a class="code" href="classOptionpk.html">Optionpk<string></a> option_opt(<span class="stringliteral">"co"</span>, <span class="stringliteral">"co"</span>, <span class="stringliteral">"Creation option for output file. Multiple options can be specified."</span>);</div>
+<div class="line"><a name="l00096"></a><span class="lineno">   96</span>   <a class="code" href="classOptionpk.html">Optionpk<short></a> verbose_opt(<span class="stringliteral">"v"</span>, <span class="stringliteral">"verbose"</span>, <span class="stringliteral">"verbose mode when positive"</span>, 0);</div>
+<div class="line"><a name="l00097"></a><span class="lineno">   97</span> </div>
+<div class="line"><a name="l00098"></a><span class="lineno">   98</span>   <span class="keywordtype">bool</span> doProcess;<span class="comment">//stop process when program was invoked with help option (-h --help)</span></div>
+<div class="line"><a name="l00099"></a><span class="lineno">   99</span>   <span class="keywordflow">try</span>{</div>
+<div class="line"><a name="l00100"></a><span class="lineno">  100</span>     doProcess=direction_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00101"></a><span class="lineno">  101</span>     model_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00102"></a><span class="lineno">  102</span>     observation_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00103"></a><span class="lineno">  103</span>     tmodel_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00104"></a><span class="lineno">  104</span>     tobservation_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00105"></a><span class="lineno">  105</span>     projection_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00106"></a><span class="lineno">  106</span>     outputfw_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00107"></a><span class="lineno">  107</span>     outputbw_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00108"></a><span class="lineno">  108</span>     outputfb_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00109"></a><span class="lineno">  109</span>     gain_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00110"></a><span class="lineno">  110</span>     modnodata_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00111"></a><span class="lineno">  111</span>     obsnodata_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00112"></a><span class="lineno">  112</span>     obsmin_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00113"></a><span class="lineno">  113</span>     obsmax_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00114"></a><span class="lineno">  114</span>     eps_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00115"></a><span class="lineno">  115</span>     uncertModel_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00116"></a><span class="lineno">  116</span>     uncertObs_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00117"></a><span class="lineno">  117</span>     processNoise_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00118"></a><span class="lineno">  118</span>     uncertNodata_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00119"></a><span class="lineno">  119</span>     down_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00120"></a><span class="lineno">  120</span>     oformat_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00121"></a><span class="lineno">  121</span>     option_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00122"></a><span class="lineno">  122</span>     verbose_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00123"></a><span class="lineno">  123</span>   }</div>
+<div class="line"><a name="l00124"></a><span class="lineno">  124</span>   <span class="keywordflow">catch</span>(<span class="keywordtype">string</span> predefinedString){</div>
+<div class="line"><a name="l00125"></a><span class="lineno">  125</span>     std::cout << predefinedString << std::endl;</div>
+<div class="line"><a name="l00126"></a><span class="lineno">  126</span>     exit(0);</div>
+<div class="line"><a name="l00127"></a><span class="lineno">  127</span>   }</div>
+<div class="line"><a name="l00128"></a><span class="lineno">  128</span>   <span class="keywordflow">if</span>(!doProcess){</div>
+<div class="line"><a name="l00129"></a><span class="lineno">  129</span>     std::cerr << <span class="stringliteral">"short option -h shows basic options only, use long option --help to show all options"</span> << std::endl;</div>
+<div class="line"><a name="l00130"></a><span class="lineno">  130</span>     exit(0);<span class="comment">//help was invoked, stop processing</span></div>
+<div class="line"><a name="l00131"></a><span class="lineno">  131</span>   }</div>
+<div class="line"><a name="l00132"></a><span class="lineno">  132</span> </div>
+<div class="line"><a name="l00133"></a><span class="lineno">  133</span>   <span class="keywordflow">if</span>(down_opt.empty()){</div>
+<div class="line"><a name="l00134"></a><span class="lineno">  134</span>     std::cerr << <span class="stringliteral">"short option -h shows basic options only, use long option --help to show all options"</span> << std::endl;</div>
+<div class="line"><a name="l00135"></a><span class="lineno">  135</span>     exit(0);<span class="comment">//help was invoked, stop processing</span></div>
+<div class="line"><a name="l00136"></a><span class="lineno">  136</span>   }</div>
+<div class="line"><a name="l00137"></a><span class="lineno">  137</span>   <span class="keywordflow">try</span>{</div>
+<div class="line"><a name="l00138"></a><span class="lineno">  138</span>     ostringstream errorStream;</div>
+<div class="line"><a name="l00139"></a><span class="lineno">  139</span>     <span class="keywordflow">if</span>(model_opt.size()<2){</div>
+<div class="line"><a name="l00140"></a><span class="lineno">  140</span>       errorStream << <span class="stringliteral">"Error: no model dataset selected, use option -mod"</span> << endl;</div>
+<div class="line"><a name="l00141"></a><span class="lineno">  141</span>       <span class="keywordflow">throw</span>(errorStream.str());</div>
+<div class="line"><a name="l00142"></a><span class="lineno">  142</span>     }</div>
+<div class="line"><a name="l00143"></a><span class="lineno">  143</span>     <span class="keywordflow">if</span>(observation_opt.size()<1){</div>
+<div class="line"><a name="l00144"></a><span class="lineno">  144</span>       errorStream << <span class="stringliteral">"Error: no observation dataset selected, use option -obs"</span> << endl;</div>
+<div class="line"><a name="l00145"></a><span class="lineno">  145</span>       <span class="keywordflow">throw</span>(errorStream.str());</div>
+<div class="line"><a name="l00146"></a><span class="lineno">  146</span>     }</div>
+<div class="line"><a name="l00147"></a><span class="lineno">  147</span>     <span class="keywordflow">if</span>(direction_opt[0]==<span class="stringliteral">"smooth"</span>){</div>
+<div class="line"><a name="l00148"></a><span class="lineno">  148</span>       <span class="keywordflow">if</span>(outputfw_opt.empty()){</div>
+<div class="line"><a name="l00149"></a><span class="lineno">  149</span>     errorStream << <span class="stringliteral">"Error: output forward datasets is not provided, use option -ofw"</span> << endl;</div>
+<div class="line"><a name="l00150"></a><span class="lineno">  150</span>     <span class="keywordflow">throw</span>(errorStream.str());</div>
+<div class="line"><a name="l00151"></a><span class="lineno">  151</span>       }</div>
+<div class="line"><a name="l00152"></a><span class="lineno">  152</span>       <span class="keywordflow">if</span>(outputbw_opt.empty()){</div>
+<div class="line"><a name="l00153"></a><span class="lineno">  153</span>     errorStream << <span class="stringliteral">"Error: output backward datasets is not provided, use option -obw"</span> << endl;</div>
+<div class="line"><a name="l00154"></a><span class="lineno">  154</span>     <span class="keywordflow">throw</span>(errorStream.str());</div>
+<div class="line"><a name="l00155"></a><span class="lineno">  155</span>       }</div>
+<div class="line"><a name="l00156"></a><span class="lineno">  156</span>       <span class="keywordflow">if</span>(outputfb_opt.empty()){</div>
+<div class="line"><a name="l00157"></a><span class="lineno">  157</span>     errorStream << <span class="stringliteral">"Error: output smooth datasets is not provided, use option -ofb"</span> << endl;</div>
+<div class="line"><a name="l00158"></a><span class="lineno">  158</span>     <span class="keywordflow">throw</span>(errorStream.str());</div>
+<div class="line"><a name="l00159"></a><span class="lineno">  159</span>       }</div>
+<div class="line"><a name="l00160"></a><span class="lineno">  160</span>     }</div>
+<div class="line"><a name="l00161"></a><span class="lineno">  161</span>     <span class="keywordflow">else</span>{</div>
+<div class="line"><a name="l00162"></a><span class="lineno">  162</span>       <span class="keywordflow">if</span>(direction_opt[0]==<span class="stringliteral">"forward"</span>&&outputfw_opt.empty()){</div>
+<div class="line"><a name="l00163"></a><span class="lineno">  163</span>     errorStream << <span class="stringliteral">"Error: output forward datasets is not provided, use option -ofw"</span> << endl;</div>
+<div class="line"><a name="l00164"></a><span class="lineno">  164</span>     <span class="keywordflow">throw</span>(errorStream.str());</div>
+<div class="line"><a name="l00165"></a><span class="lineno">  165</span>       }</div>
+<div class="line"><a name="l00166"></a><span class="lineno">  166</span>       <span class="keywordflow">else</span> <span class="keywordflow">if</span>(direction_opt[0]==<span class="stringliteral">"backward"</span>&&outputbw_opt.empty()){</div>
+<div class="line"><a name="l00167"></a><span class="lineno">  167</span>     errorStream << <span class="stringliteral">"Error: output backward datasets is not provided, use option -obw"</span> << endl;</div>
+<div class="line"><a name="l00168"></a><span class="lineno">  168</span>     <span class="keywordflow">throw</span>(errorStream.str());</div>
+<div class="line"><a name="l00169"></a><span class="lineno">  169</span>       }</div>
+<div class="line"><a name="l00170"></a><span class="lineno">  170</span> </div>
+<div class="line"><a name="l00171"></a><span class="lineno">  171</span>       <span class="keywordflow">if</span>(model_opt.size()<observation_opt.size()){</div>
+<div class="line"><a name="l00172"></a><span class="lineno">  172</span>     errorStream << <span class="stringliteral">"Error: sequence of models should be larger than observations"</span> << endl;</div>
+<div class="line"><a name="l00173"></a><span class="lineno">  173</span>     <span class="keywordflow">throw</span>(errorStream.str());</div>
+<div class="line"><a name="l00174"></a><span class="lineno">  174</span>       }</div>
+<div class="line"><a name="l00175"></a><span class="lineno">  175</span>       <span class="keywordflow">if</span>(tmodel_opt.size()!=model_opt.size()){</div>
+<div class="line"><a name="l00176"></a><span class="lineno">  176</span>     <span class="keywordflow">if</span>(tmodel_opt.empty())</div>
+<div class="line"><a name="l00177"></a><span class="lineno">  177</span>       cout << <span class="stringliteral">"Warning: time sequence is not provided, self generating time sequence from 0 to "</span> << model_opt.size() << endl;</div>
+<div class="line"><a name="l00178"></a><span class="lineno">  178</span>     <span class="keywordflow">else</span></div>
+<div class="line"><a name="l00179"></a><span class="lineno">  179</span>       cout << <span class="stringliteral">"Warning: time sequence provided ("</span> << tmodel_opt.size() << <span class="stringliteral">") does not match number of model raster datasets ("</span> << model_opt.size() << <span class="stringliteral">")"</span> << endl;</div>
+<div class="line"><a name="l00180"></a><span class="lineno">  180</span>     tmodel_opt.clear();</div>
+<div class="line"><a name="l00181"></a><span class="lineno">  181</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> tindex=0;tindex<model_opt.size();++tindex)</div>
+<div class="line"><a name="l00182"></a><span class="lineno">  182</span>       tmodel_opt.push_back(tindex);</div>
+<div class="line"><a name="l00183"></a><span class="lineno">  183</span>       }</div>
+<div class="line"><a name="l00184"></a><span class="lineno">  184</span>       <span class="keywordflow">if</span>(tobservation_opt.size()!=observation_opt.size()){</div>
+<div class="line"><a name="l00185"></a><span class="lineno">  185</span>     errorStream << <span class="stringliteral">"Error: time sequence for observation must match size of observation dataset"</span> << endl;</div>
+<div class="line"><a name="l00186"></a><span class="lineno">  186</span>     <span class="keywordflow">throw</span>(errorStream.str());</div>
+<div class="line"><a name="l00187"></a><span class="lineno">  187</span>       }</div>
+<div class="line"><a name="l00188"></a><span class="lineno">  188</span>     }</div>
+<div class="line"><a name="l00189"></a><span class="lineno">  189</span>   }</div>
+<div class="line"><a name="l00190"></a><span class="lineno">  190</span>   <span class="keywordflow">catch</span>(<span class="keywordtype">string</span> errorString){</div>
+<div class="line"><a name="l00191"></a><span class="lineno">  191</span>     std::cout << errorString << std::endl;</div>
+<div class="line"><a name="l00192"></a><span class="lineno">  192</span>     exit(1);</div>
+<div class="line"><a name="l00193"></a><span class="lineno">  193</span>   }</div>
+<div class="line"><a name="l00194"></a><span class="lineno">  194</span> </div>
+<div class="line"><a name="l00195"></a><span class="lineno">  195</span>   <a class="code" href="classstatfactory_1_1StatFactory.html">statfactory::StatFactory</a> stat;</div>
+<div class="line"><a name="l00196"></a><span class="lineno">  196</span>   stat.setNoDataValues(modnodata_opt);</div>
+<div class="line"><a name="l00197"></a><span class="lineno">  197</span>   <a class="code" href="classImgReaderGdal.html">ImgReaderGdal</a> imgReaderModel1;</div>
+<div class="line"><a name="l00198"></a><span class="lineno">  198</span>   <a class="code" href="classImgReaderGdal.html">ImgReaderGdal</a> imgReaderModel2;</div>
+<div class="line"><a name="l00199"></a><span class="lineno">  199</span>   <a class="code" href="classImgReaderGdal.html">ImgReaderGdal</a> imgReaderObs;</div>
+<div class="line"><a name="l00200"></a><span class="lineno">  200</span>   <a class="code" href="classImgWriterGdal.html">ImgWriterGdal</a> imgWriterEst;</div>
+<div class="line"><a name="l00201"></a><span class="lineno">  201</span>   <span class="comment">//test</span></div>
+<div class="line"><a name="l00202"></a><span class="lineno">  202</span>   <a class="code" href="classImgWriterGdal.html">ImgWriterGdal</a> imgWriterGain;</div>
+<div class="line"><a name="l00203"></a><span class="lineno">  203</span> </div>
+<div class="line"><a name="l00204"></a><span class="lineno">  204</span>   imgReaderObs.open(observation_opt[0]);</div>
+<div class="line"><a name="l00205"></a><span class="lineno">  205</span> </div>
+<div class="line"><a name="l00206"></a><span class="lineno">  206</span>   <span class="keywordtype">int</span> ncol=imgReaderObs.nrOfCol();</div>
+<div class="line"><a name="l00207"></a><span class="lineno">  207</span>   <span class="keywordtype">int</span> nrow=imgReaderObs.nrOfRow();</div>
+<div class="line"><a name="l00208"></a><span class="lineno">  208</span>   <span class="keywordflow">if</span>(projection_opt.empty())</div>
+<div class="line"><a name="l00209"></a><span class="lineno">  209</span>     projection_opt.push_back(imgReaderObs.getProjection());</div>
+<div class="line"><a name="l00210"></a><span class="lineno">  210</span>   <span class="keywordtype">double</span> geotransform[6];</div>
+<div class="line"><a name="l00211"></a><span class="lineno">  211</span>   imgReaderObs.getGeoTransform(geotransform);</div>
+<div class="line"><a name="l00212"></a><span class="lineno">  212</span> </div>
+<div class="line"><a name="l00213"></a><span class="lineno">  213</span>   <span class="keywordtype">string</span> imageType=imgReaderObs.getImageType();</div>
+<div class="line"><a name="l00214"></a><span class="lineno">  214</span>   <span class="keywordflow">if</span>(oformat_opt.size())<span class="comment">//default</span></div>
+<div class="line"><a name="l00215"></a><span class="lineno">  215</span>     imageType=oformat_opt[0];</div>
+<div class="line"><a name="l00216"></a><span class="lineno">  216</span>   <span class="keywordflow">if</span>(option_opt.findSubstring(<span class="stringliteral">"INTERLEAVE="</span>)==option_opt.end()){</div>
+<div class="line"><a name="l00217"></a><span class="lineno">  217</span>     <span class="keywordtype">string</span> theInterleave=<span class="stringliteral">"INTERLEAVE="</span>;</div>
+<div class="line"><a name="l00218"></a><span class="lineno">  218</span>     theInterleave+=imgReaderObs.getInterleave();</div>
+<div class="line"><a name="l00219"></a><span class="lineno">  219</span>     option_opt.push_back(theInterleave);</div>
+<div class="line"><a name="l00220"></a><span class="lineno">  220</span>   }</div>
+<div class="line"><a name="l00221"></a><span class="lineno">  221</span> </div>
+<div class="line"><a name="l00222"></a><span class="lineno">  222</span>   <span class="keywordflow">if</span>(down_opt.empty()){</div>
+<div class="line"><a name="l00223"></a><span class="lineno">  223</span>     imgReaderModel1.open(model_opt[0]);</div>
+<div class="line"><a name="l00224"></a><span class="lineno">  224</span>     <span class="keywordtype">double</span> resModel=imgReaderModel1.getDeltaX();</div>
+<div class="line"><a name="l00225"></a><span class="lineno">  225</span>     <span class="keywordtype">double</span> resObs=imgReaderObs.getDeltaX();</div>
+<div class="line"><a name="l00226"></a><span class="lineno">  226</span>     <span class="keywordtype">int</span> down=<span class="keyword">static_cast<</span><span class="keywordtype">int</span><span class="keyword">></span>(ceil(resModel/resObs));</div>
+<div class="line"><a name="l00227"></a><span class="lineno">  227</span>     <span class="keywordflow">if</span>(!(down%2))</div>
+<div class="line"><a name="l00228"></a><span class="lineno">  228</span>       down+=1;</div>
+<div class="line"><a name="l00229"></a><span class="lineno">  229</span>     down_opt.push_back(down);</div>
+<div class="line"><a name="l00230"></a><span class="lineno">  230</span>     imgReaderModel1.close();</div>
+<div class="line"><a name="l00231"></a><span class="lineno">  231</span>   }</div>
+<div class="line"><a name="l00232"></a><span class="lineno">  232</span>   imgReaderObs.close();</div>
+<div class="line"><a name="l00233"></a><span class="lineno">  233</span> </div>
+<div class="line"><a name="l00234"></a><span class="lineno">  234</span>   <span class="keywordtype">int</span> obsindex=0;</div>
+<div class="line"><a name="l00235"></a><span class="lineno">  235</span> </div>
+<div class="line"><a name="l00236"></a><span class="lineno">  236</span>   <span class="keyword">const</span> <span class="keywordtype">char</span>* pszMessage;</div>
+<div class="line"><a name="l00237"></a><span class="lineno">  237</span>   <span class="keywordtype">void</span>* pProgressArg=NULL;</div>
+<div class="line"><a name="l00238"></a><span class="lineno">  238</span>   GDALProgressFunc pfnProgress=GDALTermProgress;</div>
+<div class="line"><a name="l00239"></a><span class="lineno">  239</span>   <span class="keywordtype">double</span> progress=0;</div>
+<div class="line"><a name="l00240"></a><span class="lineno">  240</span> </div>
+<div class="line"><a name="l00241"></a><span class="lineno">  241</span>   <span class="keywordtype">double</span> errObs=uncertNodata_opt[0];<span class="comment">//start with high initial value in case we do not have first observation at time 0</span></div>
+<div class="line"><a name="l00242"></a><span class="lineno">  242</span> </div>
+<div class="line"><a name="l00243"></a><span class="lineno">  243</span>   vector<int> relobsindex;</div>
 <div class="line"><a name="l00244"></a><span class="lineno">  244</span> </div>
-<div class="line"><a name="l00245"></a><span class="lineno">  245</span>   imgReaderObs.open(observation_opt[0]);</div>
-<div class="line"><a name="l00246"></a><span class="lineno">  246</span> </div>
-<div class="line"><a name="l00247"></a><span class="lineno">  247</span>   <span class="keywordtype">int</span> ncol=imgReaderObs.nrOfCol();</div>
-<div class="line"><a name="l00248"></a><span class="lineno">  248</span>   <span class="keywordtype">int</span> nrow=imgReaderObs.nrOfRow();</div>
-<div class="line"><a name="l00249"></a><span class="lineno">  249</span>   <span class="keywordflow">if</span>(projection_opt.empty())</div>
-<div class="line"><a name="l00250"></a><span class="lineno">  250</span>     projection_opt.push_back(imgReaderObs.getProjection());</div>
-<div class="line"><a name="l00251"></a><span class="lineno">  251</span>   <span class="keywordtype">double</span> geotransform[6];</div>
-<div class="line"><a name="l00252"></a><span class="lineno">  252</span>   imgReaderObs.getGeoTransform(geotransform);</div>
-<div class="line"><a name="l00253"></a><span class="lineno">  253</span> </div>
-<div class="line"><a name="l00254"></a><span class="lineno">  254</span>   <span class="keywordtype">string</span> imageType=imgReaderObs.getImageType();</div>
-<div class="line"><a name="l00255"></a><span class="lineno">  255</span>   <span class="keywordflow">if</span>(oformat_opt.size())<span class="comment">//default</span></div>
-<div class="line"><a name="l00256"></a><span class="lineno">  256</span>     imageType=oformat_opt[0];</div>
-<div class="line"><a name="l00257"></a><span class="lineno">  257</span>   <span class="keywordflow">if</span>(option_opt.findSubstring(<span class="stringliteral">"INTERLEAVE="</span>)==option_opt.end()){</div>
-<div class="line"><a name="l00258"></a><span class="lineno">  258</span>     <span class="keywordtype">string</span> theInterleave=<span class="stringliteral">"INTERLEAVE="</span>;</div>
-<div class="line"><a name="l00259"></a><span class="lineno">  259</span>     theInterleave+=imgReaderObs.getInterleave();</div>
-<div class="line"><a name="l00260"></a><span class="lineno">  260</span>     option_opt.push_back(theInterleave);</div>
-<div class="line"><a name="l00261"></a><span class="lineno">  261</span>   }</div>
-<div class="line"><a name="l00262"></a><span class="lineno">  262</span> </div>
-<div class="line"><a name="l00263"></a><span class="lineno">  263</span>   <span class="keywordflow">if</span>(down_opt.empty()){</div>
-<div class="line"><a name="l00264"></a><span class="lineno">  264</span>     imgReaderModel1.open(model_opt[0]);</div>
-<div class="line"><a name="l00265"></a><span class="lineno">  265</span>     <span class="keywordtype">double</span> resModel=imgReaderModel1.getDeltaX();</div>
-<div class="line"><a name="l00266"></a><span class="lineno">  266</span>     <span class="keywordtype">double</span> resObs=imgReaderObs.getDeltaX();</div>
-<div class="line"><a name="l00267"></a><span class="lineno">  267</span>     <span class="keywordtype">int</span> down=<span class="keyword">static_cast<</span><span class="keywordtype">int</span><span class="keyword">></span>(ceil(resModel/resObs));</div>
-<div class="line"><a name="l00268"></a><span class="lineno">  268</span>     <span class="keywordflow">if</span>(!(down%2))</div>
-<div class="line"><a name="l00269"></a><span class="lineno">  269</span>       down+=1;</div>
-<div class="line"><a name="l00270"></a><span class="lineno">  270</span>     down_opt.push_back(down);</div>
-<div class="line"><a name="l00271"></a><span class="lineno">  271</span>     imgReaderModel1.close();</div>
-<div class="line"><a name="l00272"></a><span class="lineno">  272</span>   }</div>
-<div class="line"><a name="l00273"></a><span class="lineno">  273</span>   imgReaderObs.close();</div>
-<div class="line"><a name="l00274"></a><span class="lineno">  274</span> </div>
-<div class="line"><a name="l00275"></a><span class="lineno">  275</span>   <span class="keywordflow">if</span>(regSensor_opt.empty())</div>
-<div class="line"><a name="l00276"></a><span class="lineno">  276</span>     regSensor_opt.push_back(1.0/down_opt[0]);</div>
-<div class="line"><a name="l00277"></a><span class="lineno">  277</span>   <span class="comment">//hiero</span></div>
-<div class="line"><a name="l00278"></a><span class="lineno">  278</span>   <span class="comment">// ImgReaderGdal maskReader;</span></div>
-<div class="line"><a name="l00279"></a><span class="lineno">  279</span>   <span class="comment">// double colMask=0;</span></div>
-<div class="line"><a name="l00280"></a><span class="lineno">  280</span>   <span class="comment">// double rowMask=0;</span></div>
-<div class="line"><a name="l00281"></a><span class="lineno">  281</span> </div>
-<div class="line"><a name="l00282"></a><span class="lineno">  282</span>   <span class="comment">// if(mask_opt.size()){</span></div>
-<div class="line"><a name="l00283"></a><span class="lineno">  283</span>   <span class="comment">//   try{</span></div>
-<div class="line"><a name="l00284"></a><span class="lineno">  284</span>   <span class="comment">//     if(verbose_opt[0]>=1)</span></div>
-<div class="line"><a name="l00285"></a><span class="lineno">  285</span>   <span class="comment">//    std::cout << "opening mask image file " << mask_opt[0] << std::endl;</span></div>
-<div class="line"><a name="l00286"></a><span class="lineno">  286</span>   <span class="comment">//     maskReader.open(mask_opt[0]);</span></div>
-<div class="line"><a name="l00287"></a><span class="lineno">  287</span>   <span class="comment">//     maskReader.setNoData(msknodata_opt);</span></div>
-<div class="line"><a name="l00288"></a><span class="lineno">  288</span>   <span class="comment">//   }</span></div>
-<div class="line"><a name="l00289"></a><span class="lineno">  289</span>   <span class="comment">//   catch(string error){</span></div>
-<div class="line"><a name="l00290"></a><span class="lineno">  290</span>   <span class="comment">//     cerr << error << std::endl;</span></div>
-<div class="line"><a name="l00291"></a><span class="lineno">  291</span>   <span class="comment">//     exit(2);</span></div>
-<div class="line"><a name="l00292"></a><span class="lineno">  292</span>   <span class="comment">//   }</span></div>
-<div class="line"><a name="l00293"></a><span class="lineno">  293</span>   <span class="comment">//   catch(...){</span></div>
-<div class="line"><a name="l00294"></a><span class="lineno">  294</span>   <span class="comment">//     cerr << "error catched" << std::endl;</span></div>
-<div class="line"><a name="l00295"></a><span class="lineno">  295</span>   <span class="comment">//     exit(1);</span></div>
-<div class="line"><a name="l00296"></a><span class="lineno">  296</span>   <span class="comment">//   }</span></div>
-<div class="line"><a name="l00297"></a><span class="lineno">  297</span>   <span class="comment">// }</span></div>
-<div class="line"><a name="l00298"></a><span class="lineno">  298</span> </div>
-<div class="line"><a name="l00299"></a><span class="lineno">  299</span>   <span class="keywordtype">int</span> obsindex=0;</div>
-<div class="line"><a name="l00300"></a><span class="lineno">  300</span> </div>
-<div class="line"><a name="l00301"></a><span class="lineno">  301</span>   <span class="keyword">const</span> <span class="keywordtype">char</span>* pszMessage;</div>
-<div class="line"><a name="l00302"></a><span class="lineno">  302</span>   <span class="keywordtype">void</span>* pProgressArg=NULL;</div>
-<div class="line"><a name="l00303"></a><span class="lineno">  303</span>   GDALProgressFunc pfnProgress=GDALTermProgress;</div>
-<div class="line"><a name="l00304"></a><span class="lineno">  304</span>   <span class="keywordtype">double</span> progress=0;</div>
-<div class="line"><a name="l00305"></a><span class="lineno">  305</span> </div>
-<div class="line"><a name="l00306"></a><span class="lineno">  306</span>   imgreg.setDown(down_opt[0]);</div>
-<div class="line"><a name="l00307"></a><span class="lineno">  307</span>   imgreg.setThreshold(threshold_opt[0]);</div>
-<div class="line"><a name="l00308"></a><span class="lineno">  308</span> </div>
-<div class="line"><a name="l00309"></a><span class="lineno">  309</span>   <span class="keywordtype">double</span> c0modGlobal=0;<span class="comment">//time regression coefficient c0 (offset) calculated on entire image </span></div>
-<div class="line"><a name="l00310"></a><span class="lineno">  310</span>   <span class="keywordtype">double</span> c1modGlobal=1;<span class="comment">//time regression coefficient c1 (scale) calculated on entire image </span></div>
-<div class="line"><a name="l00311"></a><span class="lineno">  311</span>   <span class="keywordtype">double</span> c0mod=0;<span class="comment">//time regression coefficient c0 (offset) calculated on local window</span></div>
-<div class="line"><a name="l00312"></a><span class="lineno">  312</span>   <span class="keywordtype">double</span> c1mod=1;<span class="comment">//time regression coefficient c1 (scale) calculated on local window</span></div>
-<div class="line"><a name="l00313"></a><span class="lineno">  313</span> </div>
-<div class="line"><a name="l00314"></a><span class="lineno">  314</span>   <span class="keywordtype">double</span> c0obs=0;<span class="comment">//offset</span></div>
-<div class="line"><a name="l00315"></a><span class="lineno">  315</span>   <span class="keywordtype">double</span> c1obs=1;<span class="comment">//scale</span></div>
-<div class="line"><a name="l00316"></a><span class="lineno">  316</span>   <span class="keywordtype">double</span> errObs=uncertNodata_opt[0];<span class="comment">//start with high initial value in case we do not have first observation at time 0</span></div>
-<div class="line"><a name="l00317"></a><span class="lineno">  317</span> </div>
-<div class="line"><a name="l00318"></a><span class="lineno">  318</span>   vector<int> relobsindex;</div>
-<div class="line"><a name="l00319"></a><span class="lineno">  319</span>   <span class="comment">// cout << tmodel_opt << endl;</span></div>
-<div class="line"><a name="l00320"></a><span class="lineno">  320</span>   <span class="comment">// cout << tobservation_opt << endl;</span></div>
-<div class="line"><a name="l00321"></a><span class="lineno">  321</span> </div>
-<div class="line"><a name="l00322"></a><span class="lineno">  322</span>   <span class="keywordflow">for</span>(<span class="keywordtype">int</span> tindex=0;tindex<tobservation_opt.size();++tindex){</div>
-<div class="line"><a name="l00323"></a><span class="lineno">  323</span>     vector<int>::iterator modit;</div>
-<div class="line"><a name="l00324"></a><span class="lineno">  324</span>     modit=upper_bound(tmodel_opt.begin(),tmodel_opt.end(),tobservation_opt[tindex]);</div>
-<div class="line"><a name="l00325"></a><span class="lineno">  325</span>     <span class="keywordtype">int</span> relpos=modit-tmodel_opt.begin()-1;</div>
-<div class="line"><a name="l00326"></a><span class="lineno">  326</span>     assert(relpos>=0);<span class="comment">//todo: for now, we assume model is available at time before first measurement</span></div>
-<div class="line"><a name="l00327"></a><span class="lineno">  327</span>     relobsindex.push_back(relpos);</div>
-<div class="line"><a name="l00328"></a><span class="lineno">  328</span>     <span class="keywordflow">if</span>(verbose_opt[0])</div>
-<div class="line"><a name="l00329"></a><span class="lineno">  329</span>       cout << <span class="stringliteral">"observation "</span> << tindex << <span class="stringliteral">": "</span> << <span class="stringliteral">"relative position in model time series is "</span> << relpos << <span class="stringliteral">", date of observation is (tobservation_opt[tindex]): "</span> << tobservation_opt[tindex]  [...]
-<div class="line"><a name="l00330"></a><span class="lineno">  330</span>     <span class="comment">// if(verbose_opt[0])</span></div>
-<div class="line"><a name="l00331"></a><span class="lineno">  331</span>     <span class="comment">//   cout << "tobservation_opt[tindex] " << tobservation_opt[tindex] << " " << relobsindex.back() << endl;</span></div>
-<div class="line"><a name="l00332"></a><span class="lineno">  332</span>   }</div>
-<div class="line"><a name="l00333"></a><span class="lineno">  333</span> </div>
-<div class="line"><a name="l00334"></a><span class="lineno">  334</span>   <span class="keywordtype">int</span> ndigit=log(1.0*tmodel_opt.back())/log(10.0)+1;</div>
-<div class="line"><a name="l00335"></a><span class="lineno">  335</span> </div>
-<div class="line"><a name="l00336"></a><span class="lineno">  336</span>   <span class="keywordtype">double</span> geox=0;</div>
-<div class="line"><a name="l00337"></a><span class="lineno">  337</span>   <span class="keywordtype">double</span> geoy=0;</div>
-<div class="line"><a name="l00338"></a><span class="lineno">  338</span> </div>
-<div class="line"><a name="l00339"></a><span class="lineno">  339</span>   <span class="keywordflow">if</span>(find(direction_opt.begin(),direction_opt.end(),<span class="stringliteral">"forward"</span>)!=direction_opt.end()){</div>
-<div class="line"><a name="l00341"></a><span class="lineno">  341</span>     cout << <span class="stringliteral">"Running forward model"</span> << endl;</div>
-<div class="line"><a name="l00342"></a><span class="lineno">  342</span>     obsindex=0;</div>
-<div class="line"><a name="l00343"></a><span class="lineno">  343</span>     <span class="comment">//initialization</span></div>
-<div class="line"><a name="l00344"></a><span class="lineno">  344</span>     <span class="keywordtype">string</span> output;</div>
-<div class="line"><a name="l00345"></a><span class="lineno">  345</span>     <span class="keywordflow">if</span>(outputfw_opt.size()==model_opt.size()){</div>
-<div class="line"><a name="l00346"></a><span class="lineno">  346</span>       output=outputfw_opt[0];</div>
-<div class="line"><a name="l00347"></a><span class="lineno">  347</span>     }</div>
-<div class="line"><a name="l00348"></a><span class="lineno">  348</span>     <span class="keywordflow">else</span>{</div>
-<div class="line"><a name="l00349"></a><span class="lineno">  349</span>       ostringstream outputstream;</div>
-<div class="line"><a name="l00350"></a><span class="lineno">  350</span>       outputstream << outputfw_opt[0] << <span class="stringliteral">"_"</span>;</div>
-<div class="line"><a name="l00351"></a><span class="lineno">  351</span>       outputstream << setfill(<span class="charliteral">'0'</span>) << setw(ndigit) << tmodel_opt[0];</div>
-<div class="line"><a name="l00352"></a><span class="lineno">  352</span>       outputstream << <span class="stringliteral">".tif"</span>;</div>
-<div class="line"><a name="l00353"></a><span class="lineno">  353</span>       <span class="comment">//test</span></div>
-<div class="line"><a name="l00354"></a><span class="lineno">  354</span>       <span class="comment">// outputstream << outputfw_opt[0] << "_" << tmodel_opt[0] << ".tif";</span></div>
-<div class="line"><a name="l00355"></a><span class="lineno">  355</span>       output=outputstream.str();</div>
-<div class="line"><a name="l00356"></a><span class="lineno">  356</span>     }</div>
-<div class="line"><a name="l00357"></a><span class="lineno">  357</span>     <span class="keywordflow">if</span>(verbose_opt[0])</div>
-<div class="line"><a name="l00358"></a><span class="lineno">  358</span>       cout << <span class="stringliteral">"Opening image "</span> << output << <span class="stringliteral">" for writing "</span> << endl;</div>
-<div class="line"><a name="l00359"></a><span class="lineno">  359</span> </div>
-<div class="line"><a name="l00360"></a><span class="lineno">  360</span>     imgWriterEst.open(output,ncol,nrow,2,GDT_Float32,imageType,option_opt);</div>
-<div class="line"><a name="l00361"></a><span class="lineno">  361</span>     imgWriterEst.setProjectionProj4(projection_opt[0]);</div>
-<div class="line"><a name="l00362"></a><span class="lineno">  362</span>     imgWriterEst.setGeoTransform(geotransform);</div>
-<div class="line"><a name="l00363"></a><span class="lineno">  363</span>     imgWriterEst.GDALSetNoDataValue(obsnodata_opt[0]);</div>
-<div class="line"><a name="l00364"></a><span class="lineno">  364</span> </div>
-<div class="line"><a name="l00365"></a><span class="lineno">  365</span>     <span class="keywordflow">if</span>(verbose_opt[0]){</div>
-<div class="line"><a name="l00366"></a><span class="lineno">  366</span>       cout << <span class="stringliteral">"processing time "</span> << tmodel_opt[0] << endl;</div>
-<div class="line"><a name="l00367"></a><span class="lineno">  367</span>       <span class="keywordflow">if</span>(obsindex<relobsindex.size())</div>
-<div class="line"><a name="l00368"></a><span class="lineno">  368</span>     cout << <span class="stringliteral">"next observation "</span> << tmodel_opt[relobsindex[obsindex]] << endl;</div>
-<div class="line"><a name="l00369"></a><span class="lineno">  369</span>       <span class="keywordflow">else</span></div>
-<div class="line"><a name="l00370"></a><span class="lineno">  370</span>     cout << <span class="stringliteral">"There is no next observation"</span> << endl;</div>
-<div class="line"><a name="l00371"></a><span class="lineno">  371</span>     }</div>
-<div class="line"><a name="l00372"></a><span class="lineno">  372</span> </div>
-<div class="line"><a name="l00373"></a><span class="lineno">  373</span>     <span class="keywordflow">try</span>{</div>
-<div class="line"><a name="l00374"></a><span class="lineno">  374</span>       imgReaderModel1.open(model_opt[0]);</div>
-<div class="line"><a name="l00375"></a><span class="lineno">  375</span>       imgReaderModel1.setNoData(modnodata_opt);</div>
-<div class="line"><a name="l00376"></a><span class="lineno">  376</span>       <span class="keywordflow">if</span>(modoffset_opt.size())</div>
-<div class="line"><a name="l00377"></a><span class="lineno">  377</span>     imgReaderModel1.setOffset(modoffset_opt[0]);</div>
-<div class="line"><a name="l00378"></a><span class="lineno">  378</span>       <span class="keywordflow">if</span>(modscale_opt.size())</div>
-<div class="line"><a name="l00379"></a><span class="lineno">  379</span>     imgReaderModel1.setScale(modscale_opt[0]);</div>
-<div class="line"><a name="l00380"></a><span class="lineno">  380</span>     }</div>
-<div class="line"><a name="l00381"></a><span class="lineno">  381</span>     <span class="keywordflow">catch</span>(<span class="keywordtype">string</span> errorString){</div>
-<div class="line"><a name="l00382"></a><span class="lineno">  382</span>       cerr << errorString << endl;</div>
-<div class="line"><a name="l00383"></a><span class="lineno">  383</span>     }</div>
-<div class="line"><a name="l00384"></a><span class="lineno">  384</span>     <span class="keywordflow">catch</span>(...){</div>
-<div class="line"><a name="l00385"></a><span class="lineno">  385</span>       cerr << <span class="stringliteral">"Error opening file "</span> << model_opt[0] << endl;</div>
-<div class="line"><a name="l00386"></a><span class="lineno">  386</span>     }</div>
-<div class="line"><a name="l00387"></a><span class="lineno">  387</span>       </div>
-<div class="line"><a name="l00388"></a><span class="lineno">  388</span>     <span class="comment">//calculate standard deviation of image to serve as model uncertainty</span></div>
-<div class="line"><a name="l00389"></a><span class="lineno">  389</span>     GDALRasterBand* rasterBand;</div>
-<div class="line"><a name="l00390"></a><span class="lineno">  390</span>     rasterBand=imgReaderModel1.getRasterBand(0);</div>
-<div class="line"><a name="l00391"></a><span class="lineno">  391</span>     <span class="keywordtype">double</span> minValue, maxValue, meanValue, stdDev;</div>
-<div class="line"><a name="l00392"></a><span class="lineno">  392</span>     <span class="keywordtype">void</span>* pProgressData;</div>
-<div class="line"><a name="l00393"></a><span class="lineno">  393</span>     rasterBand->ComputeStatistics(0,&minValue,&maxValue,&meanValue,&stdDev,pfnProgress,pProgressData);</div>
-<div class="line"><a name="l00394"></a><span class="lineno">  394</span>     <span class="keywordtype">double</span> modRow=0;</div>
-<div class="line"><a name="l00395"></a><span class="lineno">  395</span>     <span class="keywordtype">double</span> modCol=0;</div>
-<div class="line"><a name="l00396"></a><span class="lineno">  396</span>     <span class="keywordflow">if</span>(relobsindex[0]>0){<span class="comment">//initialize output_opt[0] as model[0]</span></div>
-<div class="line"><a name="l00397"></a><span class="lineno">  397</span>       <span class="comment">//write first model as output</span></div>
-<div class="line"><a name="l00398"></a><span class="lineno">  398</span>       <span class="keywordflow">if</span>(verbose_opt[0])</div>
-<div class="line"><a name="l00399"></a><span class="lineno">  399</span>     cout << <span class="stringliteral">"write first model as output"</span> << endl;</div>
-<div class="line"><a name="l00400"></a><span class="lineno">  400</span>       <span class="keywordflow">for</span>(<span class="keywordtype">int</span> irow=0;irow<nrow;++irow){</div>
-<div class="line"><a name="l00401"></a><span class="lineno">  401</span>     vector<double> estReadBuffer;</div>
-<div class="line"><a name="l00402"></a><span class="lineno">  402</span>     vector<double> estWriteBuffer(ncol);</div>
-<div class="line"><a name="l00403"></a><span class="lineno">  403</span>     vector<double> uncertWriteBuffer(ncol);</div>
-<div class="line"><a name="l00404"></a><span class="lineno">  404</span>     <span class="comment">// vector<double> lineMask;</span></div>
-<div class="line"><a name="l00405"></a><span class="lineno">  405</span>     imgWriterEst.image2geo(0,irow,geox,geoy);</div>
-<div class="line"><a name="l00406"></a><span class="lineno">  406</span>     imgReaderModel1.geo2image(geox,geoy,modCol,modRow);</div>
-<div class="line"><a name="l00407"></a><span class="lineno">  407</span>     <span class="keywordflow">if</span>(modRow<0||modRow>=imgReaderModel1.nrOfRow()){</div>
-<div class="line"><a name="l00408"></a><span class="lineno">  408</span>       cerr << <span class="stringliteral">"Error: geo coordinates ("</span> << geox << <span class="stringliteral">","</span> << geoy << <span class="stringliteral">") not covered in model image "</span> << imgReaderModel1.getFileName() << endl;</div>
-<div class="line"><a name="l00409"></a><span class="lineno">  409</span>       assert(modRow>=0&&modRow<imgReaderModel1.nrOfRow());</div>
-<div class="line"><a name="l00410"></a><span class="lineno">  410</span>     }</div>
-<div class="line"><a name="l00411"></a><span class="lineno">  411</span>     <span class="keywordflow">try</span>{</div>
-<div class="line"><a name="l00412"></a><span class="lineno">  412</span>       imgReaderModel1.readData(estReadBuffer,GDT_Float64,modRow);</div>
-<div class="line"><a name="l00413"></a><span class="lineno">  413</span>       <span class="comment">//simple nearest neighbor</span></div>
-<div class="line"><a name="l00414"></a><span class="lineno">  414</span>       <span class="comment">//stat.nearUp(estReadBuffer,estWriteBuffer);</span></div>
-<div class="line"><a name="l00415"></a><span class="lineno">  415</span> </div>
-<div class="line"><a name="l00416"></a><span class="lineno">  416</span>       <span class="comment">// double oldRowMask=-1;//keep track of row mask to optimize number of line readings</span></div>
-<div class="line"><a name="l00417"></a><span class="lineno">  417</span>       <span class="keywordflow">for</span>(<span class="keywordtype">int</span> icol=0;icol<ncol;++icol){</div>
-<div class="line"><a name="l00418"></a><span class="lineno">  418</span>         imgWriterEst.image2geo(icol,irow,geox,geoy);</div>
-<div class="line"><a name="l00419"></a><span class="lineno">  419</span>         imgReaderModel1.geo2image(geox,geoy,modCol,modRow);</div>
-<div class="line"><a name="l00420"></a><span class="lineno">  420</span>         <span class="keywordtype">double</span> modValue=estReadBuffer[modCol];</div>
-<div class="line"><a name="l00421"></a><span class="lineno">  421</span>         <span class="keywordflow">if</span>(imgReaderModel1.isNoData(modValue)){</div>
-<div class="line"><a name="l00422"></a><span class="lineno">  422</span>           estWriteBuffer[icol]=obsnodata_opt[0];</div>
-<div class="line"><a name="l00423"></a><span class="lineno">  423</span>           uncertWriteBuffer[icol]=uncertNodata_opt[0];</div>
-<div class="line"><a name="l00424"></a><span class="lineno">  424</span>         }</div>
-<div class="line"><a name="l00425"></a><span class="lineno">  425</span>         <span class="keywordflow">else</span>{</div>
-<div class="line"><a name="l00426"></a><span class="lineno">  426</span>           <span class="comment">//todo: should take into account regression model-obs...</span></div>
-<div class="line"><a name="l00427"></a><span class="lineno">  427</span>           estWriteBuffer[icol]=modValue;</div>
-<div class="line"><a name="l00428"></a><span class="lineno">  428</span>           uncertWriteBuffer[icol]=uncertModel_opt[0]*stdDev;</div>
-<div class="line"><a name="l00429"></a><span class="lineno">  429</span>         }</div>
-<div class="line"><a name="l00430"></a><span class="lineno">  430</span>       }</div>
-<div class="line"><a name="l00431"></a><span class="lineno">  431</span>       imgWriterEst.writeData(estWriteBuffer,GDT_Float64,irow,0);</div>
-<div class="line"><a name="l00432"></a><span class="lineno">  432</span>       imgWriterEst.writeData(uncertWriteBuffer,GDT_Float64,irow,1);</div>
-<div class="line"><a name="l00433"></a><span class="lineno">  433</span>     }</div>
-<div class="line"><a name="l00434"></a><span class="lineno">  434</span>     <span class="keywordflow">catch</span>(<span class="keywordtype">string</span> errorString){</div>
-<div class="line"><a name="l00435"></a><span class="lineno">  435</span>       cerr << errorString << endl;</div>
-<div class="line"><a name="l00436"></a><span class="lineno">  436</span>     }</div>
-<div class="line"><a name="l00437"></a><span class="lineno">  437</span>     <span class="keywordflow">catch</span>(...){</div>
-<div class="line"><a name="l00438"></a><span class="lineno">  438</span>       cerr << <span class="stringliteral">"Error writing file "</span> << imgWriterEst.getFileName() << endl;</div>
-<div class="line"><a name="l00439"></a><span class="lineno">  439</span>     }</div>
-<div class="line"><a name="l00440"></a><span class="lineno">  440</span>       }</div>
-<div class="line"><a name="l00441"></a><span class="lineno">  441</span>     }</div>
-<div class="line"><a name="l00442"></a><span class="lineno">  442</span>     <span class="keywordflow">else</span>{<span class="comment">//we have a measurement</span></div>
-<div class="line"><a name="l00443"></a><span class="lineno">  443</span>       <span class="keywordflow">if</span>(verbose_opt[0])</div>
-<div class="line"><a name="l00444"></a><span class="lineno">  444</span>     cout << <span class="stringliteral">"we have a measurement at initial time"</span> << endl;</div>
-<div class="line"><a name="l00445"></a><span class="lineno">  445</span>       imgReaderObs.open(observation_opt[0]);</div>
-<div class="line"><a name="l00446"></a><span class="lineno">  446</span>       imgReaderObs.getGeoTransform(geotransform);</div>
-<div class="line"><a name="l00447"></a><span class="lineno">  447</span>       imgReaderObs.setNoData(obsnodata_opt);</div>
-<div class="line"><a name="l00448"></a><span class="lineno">  448</span>       <span class="keywordflow">if</span>(obsoffset_opt.size())</div>
-<div class="line"><a name="l00449"></a><span class="lineno">  449</span>     imgReaderObs.setOffset(obsoffset_opt[0]);</div>
-<div class="line"><a name="l00450"></a><span class="lineno">  450</span>       <span class="keywordflow">if</span>(obsscale_opt.size())</div>
-<div class="line"><a name="l00451"></a><span class="lineno">  451</span>     imgReaderObs.setScale(obsscale_opt[0]);</div>
-<div class="line"><a name="l00452"></a><span class="lineno">  452</span> </div>
-<div class="line"><a name="l00453"></a><span class="lineno">  453</span>       <span class="keywordflow">if</span>(regSensor_opt[0]>0)</div>
-<div class="line"><a name="l00454"></a><span class="lineno">  454</span>     errObs=regSensor_opt[0]*imgreg.getRMSE(imgReaderModel1,imgReaderObs,c0obs,c1obs,0,0,verbose_opt[0]);</div>
-<div class="line"><a name="l00455"></a><span class="lineno">  455</span>       <span class="keywordflow">else</span>{</div>
-<div class="line"><a name="l00456"></a><span class="lineno">  456</span>     c0obs=0;</div>
-<div class="line"><a name="l00457"></a><span class="lineno">  457</span>     c1obs=1;</div>
-<div class="line"><a name="l00458"></a><span class="lineno">  458</span>     errObs=0;</div>
-<div class="line"><a name="l00459"></a><span class="lineno">  459</span>       }</div>
-<div class="line"><a name="l00460"></a><span class="lineno">  460</span>       <span class="keywordflow">if</span>(verbose_opt[0])</div>
-<div class="line"><a name="l00461"></a><span class="lineno">  461</span>     cout << <span class="stringliteral">"c0obs, c1obs: "</span> << c0obs << <span class="stringliteral">", "</span> << c1obs << endl;</div>
-<div class="line"><a name="l00462"></a><span class="lineno">  462</span> </div>
-<div class="line"><a name="l00463"></a><span class="lineno">  463</span>       <span class="keywordflow">for</span>(<span class="keywordtype">int</span> irow=0;irow<nrow;++irow){</div>
-<div class="line"><a name="l00464"></a><span class="lineno">  464</span>     vector<double> estReadBuffer;</div>
-<div class="line"><a name="l00465"></a><span class="lineno">  465</span>     imgWriterEst.image2geo(0,irow,geox,geoy);</div>
-<div class="line"><a name="l00466"></a><span class="lineno">  466</span>     imgReaderModel1.geo2image(geox,geoy,modCol,modRow);</div>
-<div class="line"><a name="l00467"></a><span class="lineno">  467</span>     assert(modRow>=0&&modRow<imgReaderModel1.nrOfRow());</div>
-<div class="line"><a name="l00468"></a><span class="lineno">  468</span>     imgReaderModel1.readData(estReadBuffer,GDT_Float64,modRow);</div>
-<div class="line"><a name="l00469"></a><span class="lineno">  469</span>     vector<double> obsLineBuffer;</div>
-<div class="line"><a name="l00470"></a><span class="lineno">  470</span>     vector<double> estWriteBuffer(ncol);</div>
-<div class="line"><a name="l00471"></a><span class="lineno">  471</span>     vector<double> uncertWriteBuffer(ncol);</div>
-<div class="line"><a name="l00472"></a><span class="lineno">  472</span>     vector<double> uncertObsLineBuffer;</div>
-<div class="line"><a name="l00473"></a><span class="lineno">  473</span>     <span class="comment">// vector<double> lineMask;</span></div>
-<div class="line"><a name="l00474"></a><span class="lineno">  474</span>     <span class="comment">// imgReaderObs.readData(estWriteBuffer,GDT_Float64,irow,0);</span></div>
-<div class="line"><a name="l00475"></a><span class="lineno">  475</span>     imgReaderObs.readData(obsLineBuffer,GDT_Float64,irow,0);</div>
-<div class="line"><a name="l00476"></a><span class="lineno">  476</span>     </div>
-<div class="line"><a name="l00477"></a><span class="lineno">  477</span>     <span class="keywordflow">if</span>(imgReaderObs.nrOfBand()>1)</div>
-<div class="line"><a name="l00478"></a><span class="lineno">  478</span>       imgReaderObs.readData(uncertObsLineBuffer,GDT_Float64,irow,1);</div>
-<div class="line"><a name="l00479"></a><span class="lineno">  479</span>     <span class="comment">// double oldRowMask=-1;//keep track of row mask to optimize number of line readings</span></div>
-<div class="line"><a name="l00480"></a><span class="lineno">  480</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> icol=0;icol<ncol;++icol){</div>
-<div class="line"><a name="l00481"></a><span class="lineno">  481</span>       imgWriterEst.image2geo(icol,irow,geox,geoy);</div>
-<div class="line"><a name="l00482"></a><span class="lineno">  482</span>       imgReaderModel1.geo2image(geox,geoy,modCol,modRow);</div>
-<div class="line"><a name="l00483"></a><span class="lineno">  483</span>       assert(modRow>=0&&modRow<imgReaderModel1.nrOfRow());</div>
-<div class="line"><a name="l00484"></a><span class="lineno">  484</span>       <span class="keywordtype">double</span> modValue=estReadBuffer[modCol];</div>
-<div class="line"><a name="l00485"></a><span class="lineno">  485</span>       <span class="keywordflow">if</span>(imgReaderModel1.isNoData(modValue)){<span class="comment">//model is nodata: retain observation </span></div>
-<div class="line"><a name="l00486"></a><span class="lineno">  486</span>         estWriteBuffer[icol]=obsLineBuffer[icol];</div>
-<div class="line"><a name="l00487"></a><span class="lineno">  487</span>         <span class="keywordflow">if</span>(imgReaderObs.isNoData(obsLineBuffer[icol])){</div>
-<div class="line"><a name="l00488"></a><span class="lineno">  488</span>           estWriteBuffer[icol]=obsnodata_opt[0];</div>
-<div class="line"><a name="l00489"></a><span class="lineno">  489</span>           uncertWriteBuffer[icol]=uncertNodata_opt[0];</div>
-<div class="line"><a name="l00490"></a><span class="lineno">  490</span>         }</div>
-<div class="line"><a name="l00491"></a><span class="lineno">  491</span>         <span class="keywordflow">else</span> <span class="keywordflow">if</span>(uncertObsLineBuffer.size()>icol)</div>
-<div class="line"><a name="l00492"></a><span class="lineno">  492</span>           uncertWriteBuffer[icol]=uncertObsLineBuffer[icol];</div>
-<div class="line"><a name="l00493"></a><span class="lineno">  493</span>         <span class="keywordflow">else</span></div>
-<div class="line"><a name="l00494"></a><span class="lineno">  494</span>           uncertWriteBuffer[icol]=uncertObs_opt[0];</div>
-<div class="line"><a name="l00495"></a><span class="lineno">  495</span>       }</div>
-<div class="line"><a name="l00496"></a><span class="lineno">  496</span>       <span class="keywordflow">else</span>{<span class="comment">//model is valid: calculate estimate from model</span></div>
-<div class="line"><a name="l00497"></a><span class="lineno">  497</span>         <span class="keywordtype">double</span> errMod=uncertModel_opt[0]*stdDev;</div>
-<div class="line"><a name="l00498"></a><span class="lineno">  498</span>         errMod*=regTime_opt[0];</div>
-<div class="line"><a name="l00499"></a><span class="lineno">  499</span>         <span class="comment">// double certNorm=(errMod*errMod+errObs*errObs);</span></div>
-<div class="line"><a name="l00500"></a><span class="lineno">  500</span>         <span class="comment">// double certMod=errObs*errObs/certNorm;</span></div>
-<div class="line"><a name="l00501"></a><span class="lineno">  501</span>         <span class="comment">// double certObs=errMod*errMod/certNorm;</span></div>
-<div class="line"><a name="l00502"></a><span class="lineno">  502</span>         <span class="comment">// double regTime=0;</span></div>
-<div class="line"><a name="l00503"></a><span class="lineno">  503</span>         <span class="comment">// double regSensor=(c0obs+c1obs*modValue)*certMod;</span></div>
-<div class="line"><a name="l00504"></a><span class="lineno">  504</span>         <span class="comment">// estWriteBuffer[icol]=regTime+regSensor;</span></div>
-<div class="line"><a name="l00505"></a><span class="lineno">  505</span>         estWriteBuffer[icol]=modValue;</div>
-<div class="line"><a name="l00506"></a><span class="lineno">  506</span>         <span class="keywordtype">double</span> totalUncertainty=errMod;</div>
-<div class="line"><a name="l00507"></a><span class="lineno">  507</span>         <span class="comment">// if(errMod<eps_opt[0])</span></div>
-<div class="line"><a name="l00508"></a><span class="lineno">  508</span>         <span class="comment">//   totalUncertainty=errObs;</span></div>
-<div class="line"><a name="l00509"></a><span class="lineno">  509</span>         <span class="comment">// else if(errObs<eps_opt[0])</span></div>
-<div class="line"><a name="l00510"></a><span class="lineno">  510</span>         <span class="comment">//   totalUncertainty=errMod;</span></div>
-<div class="line"><a name="l00511"></a><span class="lineno">  511</span>         <span class="comment">// else{</span></div>
-<div class="line"><a name="l00512"></a><span class="lineno">  512</span>         <span class="comment">//   totalUncertainty=1.0/errMod/errMod+1/errObs/errObs;</span></div>
-<div class="line"><a name="l00513"></a><span class="lineno">  513</span>         <span class="comment">//   totalUncertainty=sqrt(1.0/totalUncertainty);</span></div>
-<div class="line"><a name="l00514"></a><span class="lineno">  514</span>         <span class="comment">// }</span></div>
-<div class="line"><a name="l00515"></a><span class="lineno">  515</span>         uncertWriteBuffer[icol]=totalUncertainty;<span class="comment">//in case observation is not valid</span></div>
+<div class="line"><a name="l00245"></a><span class="lineno">  245</span>   <span class="keywordflow">for</span>(<span class="keywordtype">int</span> tindex=0;tindex<tobservation_opt.size();++tindex){</div>
+<div class="line"><a name="l00246"></a><span class="lineno">  246</span>     vector<int>::iterator modit;</div>
+<div class="line"><a name="l00247"></a><span class="lineno">  247</span>     modit=upper_bound(tmodel_opt.begin(),tmodel_opt.end(),tobservation_opt[tindex]);</div>
+<div class="line"><a name="l00248"></a><span class="lineno">  248</span>     <span class="keywordtype">int</span> relpos=modit-tmodel_opt.begin()-1;</div>
+<div class="line"><a name="l00249"></a><span class="lineno">  249</span>     assert(relpos>=0);<span class="comment">//todo: for now, we assume model is available at time before first measurement</span></div>
+<div class="line"><a name="l00250"></a><span class="lineno">  250</span>     relobsindex.push_back(relpos);</div>
+<div class="line"><a name="l00251"></a><span class="lineno">  251</span>     <span class="keywordflow">if</span>(verbose_opt[0])</div>
+<div class="line"><a name="l00252"></a><span class="lineno">  252</span>       cout << <span class="stringliteral">"observation "</span> << tindex << <span class="stringliteral">": "</span> << <span class="stringliteral">"relative position in model time series is "</span> << relpos << <span class="stringliteral">", date of observation is (tobservation_opt[tindex]): "</span> << tobservation_opt[tindex]  [...]
+<div class="line"><a name="l00253"></a><span class="lineno">  253</span>   }</div>
+<div class="line"><a name="l00254"></a><span class="lineno">  254</span> </div>
+<div class="line"><a name="l00255"></a><span class="lineno">  255</span>   <span class="keywordtype">int</span> ndigit=log(1.0*tmodel_opt.back())/log(10.0)+1;</div>
+<div class="line"><a name="l00256"></a><span class="lineno">  256</span> </div>
+<div class="line"><a name="l00257"></a><span class="lineno">  257</span>   <span class="keywordtype">double</span> geox=0;</div>
+<div class="line"><a name="l00258"></a><span class="lineno">  258</span>   <span class="keywordtype">double</span> geoy=0;</div>
+<div class="line"><a name="l00259"></a><span class="lineno">  259</span> </div>
+<div class="line"><a name="l00260"></a><span class="lineno">  260</span>   <span class="keywordflow">if</span>(find(direction_opt.begin(),direction_opt.end(),<span class="stringliteral">"forward"</span>)!=direction_opt.end()){</div>
+<div class="line"><a name="l00262"></a><span class="lineno">  262</span>     cout << <span class="stringliteral">"Running forward model"</span> << endl;</div>
+<div class="line"><a name="l00263"></a><span class="lineno">  263</span>     obsindex=0;</div>
+<div class="line"><a name="l00264"></a><span class="lineno">  264</span>     <span class="comment">//initialization</span></div>
+<div class="line"><a name="l00265"></a><span class="lineno">  265</span>     <span class="keywordtype">string</span> output;</div>
+<div class="line"><a name="l00266"></a><span class="lineno">  266</span>     <span class="keywordflow">if</span>(outputfw_opt.size()==model_opt.size()){</div>
+<div class="line"><a name="l00267"></a><span class="lineno">  267</span>       output=outputfw_opt[0];</div>
+<div class="line"><a name="l00268"></a><span class="lineno">  268</span>     }</div>
+<div class="line"><a name="l00269"></a><span class="lineno">  269</span>     <span class="keywordflow">else</span>{</div>
+<div class="line"><a name="l00270"></a><span class="lineno">  270</span>       ostringstream outputstream;</div>
+<div class="line"><a name="l00271"></a><span class="lineno">  271</span>       outputstream << outputfw_opt[0] << <span class="stringliteral">"_"</span>;</div>
+<div class="line"><a name="l00272"></a><span class="lineno">  272</span>       outputstream << setfill(<span class="charliteral">'0'</span>) << setw(ndigit) << tmodel_opt[0];</div>
+<div class="line"><a name="l00273"></a><span class="lineno">  273</span>       outputstream << <span class="stringliteral">".tif"</span>;</div>
+<div class="line"><a name="l00274"></a><span class="lineno">  274</span>       output=outputstream.str();</div>
+<div class="line"><a name="l00275"></a><span class="lineno">  275</span>     }</div>
+<div class="line"><a name="l00276"></a><span class="lineno">  276</span>     <span class="keywordflow">if</span>(verbose_opt[0])</div>
+<div class="line"><a name="l00277"></a><span class="lineno">  277</span>       cout << <span class="stringliteral">"Opening image "</span> << output << <span class="stringliteral">" for writing "</span> << endl;</div>
+<div class="line"><a name="l00278"></a><span class="lineno">  278</span> </div>
+<div class="line"><a name="l00279"></a><span class="lineno">  279</span>     imgWriterEst.open(output,ncol,nrow,2,GDT_Float64,imageType,option_opt);</div>
+<div class="line"><a name="l00280"></a><span class="lineno">  280</span>     imgWriterEst.setProjectionProj4(projection_opt[0]);</div>
+<div class="line"><a name="l00281"></a><span class="lineno">  281</span>     imgWriterEst.setGeoTransform(geotransform);</div>
+<div class="line"><a name="l00282"></a><span class="lineno">  282</span>     imgWriterEst.GDALSetNoDataValue(obsnodata_opt[0]);</div>
+<div class="line"><a name="l00283"></a><span class="lineno">  283</span> </div>
+<div class="line"><a name="l00284"></a><span class="lineno">  284</span>     <span class="comment">//test</span></div>
+<div class="line"><a name="l00285"></a><span class="lineno">  285</span>     <span class="keywordflow">if</span>(gain_opt.size()){</div>
+<div class="line"><a name="l00286"></a><span class="lineno">  286</span>       imgWriterGain.open(gain_opt[0],ncol,nrow,model_opt.size(),GDT_Float64,imageType,option_opt);</div>
+<div class="line"><a name="l00287"></a><span class="lineno">  287</span>       imgWriterGain.setProjectionProj4(projection_opt[0]);</div>
+<div class="line"><a name="l00288"></a><span class="lineno">  288</span>       imgWriterGain.setGeoTransform(geotransform);</div>
+<div class="line"><a name="l00289"></a><span class="lineno">  289</span>       imgWriterGain.GDALSetNoDataValue(obsnodata_opt[0]);</div>
+<div class="line"><a name="l00290"></a><span class="lineno">  290</span>     }</div>
+<div class="line"><a name="l00291"></a><span class="lineno">  291</span> </div>
+<div class="line"><a name="l00292"></a><span class="lineno">  292</span>     <span class="keywordflow">if</span>(verbose_opt[0]){</div>
+<div class="line"><a name="l00293"></a><span class="lineno">  293</span>       cout << <span class="stringliteral">"processing time "</span> << tmodel_opt[0] << endl;</div>
+<div class="line"><a name="l00294"></a><span class="lineno">  294</span>       <span class="keywordflow">if</span>(obsindex<relobsindex.size())</div>
+<div class="line"><a name="l00295"></a><span class="lineno">  295</span>     cout << <span class="stringliteral">"next observation "</span> << tmodel_opt[relobsindex[obsindex]] << endl;</div>
+<div class="line"><a name="l00296"></a><span class="lineno">  296</span>       <span class="keywordflow">else</span></div>
+<div class="line"><a name="l00297"></a><span class="lineno">  297</span>     cout << <span class="stringliteral">"There is no next observation"</span> << endl;</div>
+<div class="line"><a name="l00298"></a><span class="lineno">  298</span>     }</div>
+<div class="line"><a name="l00299"></a><span class="lineno">  299</span> </div>
+<div class="line"><a name="l00300"></a><span class="lineno">  300</span>     <span class="keywordflow">try</span>{</div>
+<div class="line"><a name="l00301"></a><span class="lineno">  301</span>       imgReaderModel1.open(model_opt[0]);</div>
+<div class="line"><a name="l00302"></a><span class="lineno">  302</span>       imgReaderModel1.setNoData(modnodata_opt);</div>
+<div class="line"><a name="l00303"></a><span class="lineno">  303</span>     }</div>
+<div class="line"><a name="l00304"></a><span class="lineno">  304</span>     <span class="keywordflow">catch</span>(<span class="keywordtype">string</span> errorString){</div>
+<div class="line"><a name="l00305"></a><span class="lineno">  305</span>       cerr << errorString << endl;</div>
+<div class="line"><a name="l00306"></a><span class="lineno">  306</span>     }</div>
+<div class="line"><a name="l00307"></a><span class="lineno">  307</span>     <span class="keywordflow">catch</span>(...){</div>
+<div class="line"><a name="l00308"></a><span class="lineno">  308</span>       cerr << <span class="stringliteral">"Error opening file "</span> << model_opt[0] << endl;</div>
+<div class="line"><a name="l00309"></a><span class="lineno">  309</span>     }</div>
+<div class="line"><a name="l00310"></a><span class="lineno">  310</span>       </div>
+<div class="line"><a name="l00311"></a><span class="lineno">  311</span>     <span class="comment">//calculate standard deviation of image to serve as model uncertainty</span></div>
+<div class="line"><a name="l00312"></a><span class="lineno">  312</span>     GDALRasterBand* rasterBand;</div>
+<div class="line"><a name="l00313"></a><span class="lineno">  313</span>     rasterBand=imgReaderModel1.getRasterBand(0);</div>
+<div class="line"><a name="l00314"></a><span class="lineno">  314</span>     <span class="keywordtype">double</span> minValue, maxValue, meanValue, stdDev;</div>
+<div class="line"><a name="l00315"></a><span class="lineno">  315</span>     <span class="keywordtype">void</span>* pProgressData;</div>
+<div class="line"><a name="l00316"></a><span class="lineno">  316</span>     rasterBand->ComputeStatistics(0,&minValue,&maxValue,&meanValue,&stdDev,pfnProgress,pProgressData);</div>
+<div class="line"><a name="l00317"></a><span class="lineno">  317</span>     <span class="keywordtype">double</span> modRow=0;</div>
+<div class="line"><a name="l00318"></a><span class="lineno">  318</span>     <span class="keywordtype">double</span> modCol=0;</div>
+<div class="line"><a name="l00319"></a><span class="lineno">  319</span>     <span class="keywordtype">double</span> lowerCol=0;</div>
+<div class="line"><a name="l00320"></a><span class="lineno">  320</span>     <span class="keywordtype">double</span> upperCol=0;</div>
+<div class="line"><a name="l00321"></a><span class="lineno">  321</span>     RESAMPLE theResample=BILINEAR;</div>
+<div class="line"><a name="l00322"></a><span class="lineno">  322</span> </div>
+<div class="line"><a name="l00323"></a><span class="lineno">  323</span>     <span class="keywordflow">if</span>(relobsindex[0]>0){<span class="comment">//initialize output_opt[0] as model[0]</span></div>
+<div class="line"><a name="l00324"></a><span class="lineno">  324</span>       <span class="comment">//write first model as output</span></div>
+<div class="line"><a name="l00325"></a><span class="lineno">  325</span>       <span class="keywordflow">if</span>(verbose_opt[0])</div>
+<div class="line"><a name="l00326"></a><span class="lineno">  326</span>     cout << <span class="stringliteral">"write first model as output"</span> << endl;</div>
+<div class="line"><a name="l00327"></a><span class="lineno">  327</span>       <span class="keywordflow">for</span>(<span class="keywordtype">int</span> jrow=0;jrow<nrow;jrow+=down_opt[0]){</div>
+<div class="line"><a name="l00328"></a><span class="lineno">  328</span>     vector<double> estReadBuffer;</div>
+<div class="line"><a name="l00329"></a><span class="lineno">  329</span>     vector<double> estWriteBuffer(ncol);</div>
+<div class="line"><a name="l00330"></a><span class="lineno">  330</span>     vector<double> uncertWriteBuffer(ncol);</div>
+<div class="line"><a name="l00331"></a><span class="lineno">  331</span>     <span class="comment">//test</span></div>
+<div class="line"><a name="l00332"></a><span class="lineno">  332</span>     vector<double> gainWriteBuffer(ncol);</div>
+<div class="line"><a name="l00333"></a><span class="lineno">  333</span>     <span class="keywordflow">try</span>{</div>
+<div class="line"><a name="l00334"></a><span class="lineno">  334</span>       <span class="keywordflow">for</span>(<span class="keywordtype">int</span> irow=jrow;irow<jrow+down_opt[0];++irow){</div>
+<div class="line"><a name="l00335"></a><span class="lineno">  335</span>         imgWriterEst.image2geo(0,irow,geox,geoy);</div>
+<div class="line"><a name="l00336"></a><span class="lineno">  336</span>         imgReaderModel1.geo2image(geox,geoy,modCol,modRow);</div>
+<div class="line"><a name="l00337"></a><span class="lineno">  337</span>         <span class="keywordflow">if</span>(modRow<0||modRow>=imgReaderModel1.nrOfRow()){</div>
+<div class="line"><a name="l00338"></a><span class="lineno">  338</span>           cerr << <span class="stringliteral">"Error: geo coordinates ("</span> << geox << <span class="stringliteral">","</span> << geoy << <span class="stringliteral">") not covered in model image "</span> << imgReaderModel1.getFileName() << endl;</div>
+<div class="line"><a name="l00339"></a><span class="lineno">  339</span>           assert(modRow>=0&&modRow<imgReaderModel1.nrOfRow());</div>
+<div class="line"><a name="l00340"></a><span class="lineno">  340</span>         }</div>
+<div class="line"><a name="l00341"></a><span class="lineno">  341</span>         imgReaderModel1.readData(estReadBuffer,GDT_Float64,modRow,0,theResample);</div>
+<div class="line"><a name="l00342"></a><span class="lineno">  342</span>         <span class="keywordflow">for</span>(<span class="keywordtype">int</span> jcol=0;jcol<ncol;jcol+=down_opt[0]){</div>
+<div class="line"><a name="l00343"></a><span class="lineno">  343</span>           <span class="keywordflow">for</span>(<span class="keywordtype">int</span> icol=icol;icol<icol+down_opt[0];++icol){</div>
+<div class="line"><a name="l00344"></a><span class="lineno">  344</span>         imgWriterEst.image2geo(icol,irow,geox,geoy);</div>
+<div class="line"><a name="l00345"></a><span class="lineno">  345</span>         imgReaderModel1.geo2image(geox,geoy,modCol,modRow);</div>
+<div class="line"><a name="l00346"></a><span class="lineno">  346</span>         lowerCol=modCol-0.5;</div>
+<div class="line"><a name="l00347"></a><span class="lineno">  347</span>         lowerCol=<span class="keyword">static_cast<</span><span class="keywordtype">int</span><span class="keyword">></span>(lowerCol);</div>
+<div class="line"><a name="l00348"></a><span class="lineno">  348</span>         upperCol=modCol+0.5;</div>
+<div class="line"><a name="l00349"></a><span class="lineno">  349</span>         upperCol=<span class="keyword">static_cast<</span><span class="keywordtype">int</span><span class="keyword">></span>(upperCol);</div>
+<div class="line"><a name="l00350"></a><span class="lineno">  350</span>         <span class="keywordflow">if</span>(lowerCol<0)</div>
+<div class="line"><a name="l00351"></a><span class="lineno">  351</span>           lowerCol=0;</div>
+<div class="line"><a name="l00352"></a><span class="lineno">  352</span>         <span class="keywordflow">if</span>(upperCol>=imgReaderModel1.nrOfCol())</div>
+<div class="line"><a name="l00353"></a><span class="lineno">  353</span>           upperCol=imgReaderModel1.nrOfCol()-1;</div>
+<div class="line"><a name="l00354"></a><span class="lineno">  354</span>         <span class="keywordtype">double</span> modValue=(modCol-0.5-lowerCol)*estReadBuffer[upperCol]+(1-modCol+0.5+lowerCol)*estReadBuffer[lowerCol];</div>
+<div class="line"><a name="l00355"></a><span class="lineno">  355</span>         <span class="comment">// double modValue=estReadBuffer[modCol];</span></div>
+<div class="line"><a name="l00356"></a><span class="lineno">  356</span>         <span class="keywordflow">if</span>(imgReaderModel1.isNoData(modValue)){</div>
+<div class="line"><a name="l00357"></a><span class="lineno">  357</span>           estWriteBuffer[icol]=obsnodata_opt[0];</div>
+<div class="line"><a name="l00358"></a><span class="lineno">  358</span>           uncertWriteBuffer[icol]=uncertNodata_opt[0];</div>
+<div class="line"><a name="l00359"></a><span class="lineno">  359</span>           gainWriteBuffer[icol]=obsnodata_opt[0];</div>
+<div class="line"><a name="l00360"></a><span class="lineno">  360</span>         }</div>
+<div class="line"><a name="l00361"></a><span class="lineno">  361</span>         <span class="keywordflow">else</span>{</div>
+<div class="line"><a name="l00362"></a><span class="lineno">  362</span>           estWriteBuffer[icol]=modValue;</div>
+<div class="line"><a name="l00363"></a><span class="lineno">  363</span>           <span class="keywordflow">if</span>(obsmin_opt.size()){</div>
+<div class="line"><a name="l00364"></a><span class="lineno">  364</span>             <span class="keywordflow">if</span>(estWriteBuffer[icol]<obsmin_opt[0])</div>
+<div class="line"><a name="l00365"></a><span class="lineno">  365</span>               estWriteBuffer[icol]=obsmin_opt[0];</div>
+<div class="line"><a name="l00366"></a><span class="lineno">  366</span>           }</div>
+<div class="line"><a name="l00367"></a><span class="lineno">  367</span>           <span class="keywordflow">if</span>(obsmax_opt.size()){</div>
+<div class="line"><a name="l00368"></a><span class="lineno">  368</span>             <span class="keywordflow">if</span>(estWriteBuffer[icol]>obsmax_opt[0])</div>
+<div class="line"><a name="l00369"></a><span class="lineno">  369</span>               estWriteBuffer[icol]=obsmax_opt[0];</div>
+<div class="line"><a name="l00370"></a><span class="lineno">  370</span>           }</div>
+<div class="line"><a name="l00371"></a><span class="lineno">  371</span>           uncertWriteBuffer[icol]=uncertModel_opt[0]*stdDev*stdDev;</div>
+<div class="line"><a name="l00372"></a><span class="lineno">  372</span>           gainWriteBuffer[icol]=0;</div>
+<div class="line"><a name="l00373"></a><span class="lineno">  373</span>         }</div>
+<div class="line"><a name="l00374"></a><span class="lineno">  374</span>           }</div>
+<div class="line"><a name="l00375"></a><span class="lineno">  375</span>         }</div>
+<div class="line"><a name="l00376"></a><span class="lineno">  376</span>         imgWriterEst.writeData(estWriteBuffer,GDT_Float64,irow,0);</div>
+<div class="line"><a name="l00377"></a><span class="lineno">  377</span>         imgWriterEst.writeData(uncertWriteBuffer,GDT_Float64,irow,1);</div>
+<div class="line"><a name="l00378"></a><span class="lineno">  378</span>         <span class="keywordflow">if</span>(gain_opt.size())</div>
+<div class="line"><a name="l00379"></a><span class="lineno">  379</span>           imgWriterGain.writeData(gainWriteBuffer,GDT_Float64,irow,0);</div>
+<div class="line"><a name="l00380"></a><span class="lineno">  380</span>       }</div>
+<div class="line"><a name="l00381"></a><span class="lineno">  381</span>     }</div>
+<div class="line"><a name="l00382"></a><span class="lineno">  382</span>     <span class="keywordflow">catch</span>(<span class="keywordtype">string</span> errorString){</div>
+<div class="line"><a name="l00383"></a><span class="lineno">  383</span>       cerr << errorString << endl;</div>
+<div class="line"><a name="l00384"></a><span class="lineno">  384</span>     }</div>
+<div class="line"><a name="l00385"></a><span class="lineno">  385</span>     <span class="keywordflow">catch</span>(...){</div>
+<div class="line"><a name="l00386"></a><span class="lineno">  386</span>       cerr << <span class="stringliteral">"Error writing file "</span> << imgWriterEst.getFileName() << endl;</div>
+<div class="line"><a name="l00387"></a><span class="lineno">  387</span>     }</div>
+<div class="line"><a name="l00388"></a><span class="lineno">  388</span>       }</div>
+<div class="line"><a name="l00389"></a><span class="lineno">  389</span>     }</div>
+<div class="line"><a name="l00390"></a><span class="lineno">  390</span>     <span class="keywordflow">else</span>{<span class="comment">//we have a measurement</span></div>
+<div class="line"><a name="l00391"></a><span class="lineno">  391</span>       <span class="keywordflow">if</span>(verbose_opt[0])</div>
+<div class="line"><a name="l00392"></a><span class="lineno">  392</span>     cout << <span class="stringliteral">"we have a measurement at initial time"</span> << endl;</div>
+<div class="line"><a name="l00393"></a><span class="lineno">  393</span>       imgReaderObs.open(observation_opt[0]);</div>
+<div class="line"><a name="l00394"></a><span class="lineno">  394</span>       imgReaderObs.getGeoTransform(geotransform);</div>
+<div class="line"><a name="l00395"></a><span class="lineno">  395</span>       imgReaderObs.setNoData(obsnodata_opt);</div>
+<div class="line"><a name="l00396"></a><span class="lineno">  396</span> </div>
+<div class="line"><a name="l00397"></a><span class="lineno">  397</span>       vector< vector<double> > obsLineVector(down_opt[0]);</div>
+<div class="line"><a name="l00398"></a><span class="lineno">  398</span>       vector<double> obsLineBuffer;</div>
+<div class="line"><a name="l00399"></a><span class="lineno">  399</span>       vector<double> obsWindowBuffer;<span class="comment">//buffer for observation to calculate average corresponding to model pixel</span></div>
+<div class="line"><a name="l00400"></a><span class="lineno">  400</span>       vector<double> estReadBuffer;</div>
+<div class="line"><a name="l00401"></a><span class="lineno">  401</span>       vector<double> estWriteBuffer(ncol);</div>
+<div class="line"><a name="l00402"></a><span class="lineno">  402</span>       vector<double> uncertWriteBuffer(ncol);</div>
+<div class="line"><a name="l00403"></a><span class="lineno">  403</span>       vector<double> uncertObsLineBuffer;</div>
+<div class="line"><a name="l00404"></a><span class="lineno">  404</span>       <span class="comment">//test</span></div>
+<div class="line"><a name="l00405"></a><span class="lineno">  405</span>       vector<double> gainWriteBuffer(ncol);</div>
+<div class="line"><a name="l00406"></a><span class="lineno">  406</span> </div>
+<div class="line"><a name="l00407"></a><span class="lineno">  407</span>       <span class="keywordflow">if</span>(verbose_opt[0])</div>
+<div class="line"><a name="l00408"></a><span class="lineno">  408</span>     cout << <span class="stringliteral">"initialize obsLineVector"</span> << endl;</div>
+<div class="line"><a name="l00409"></a><span class="lineno">  409</span>       assert(down_opt[0]%2);<span class="comment">//window size must be odd </span></div>
+<div class="line"><a name="l00410"></a><span class="lineno">  410</span>       <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iline=-down_opt[0]/2;iline<down_opt[0]/2+1;++iline){</div>
+<div class="line"><a name="l00411"></a><span class="lineno">  411</span>     <span class="keywordflow">if</span>(iline<0)<span class="comment">//replicate line 0</span></div>
+<div class="line"><a name="l00412"></a><span class="lineno">  412</span>       imgReaderObs.readData(obsLineVector[iline+down_opt[0]/2],GDT_Float64,0,0);</div>
+<div class="line"><a name="l00413"></a><span class="lineno">  413</span>     <span class="keywordflow">else</span></div>
+<div class="line"><a name="l00414"></a><span class="lineno">  414</span>       imgReaderObs.readData(obsLineVector[iline+down_opt[0]/2],GDT_Float64,iline,0);</div>
+<div class="line"><a name="l00415"></a><span class="lineno">  415</span>       }</div>
+<div class="line"><a name="l00416"></a><span class="lineno">  416</span>       <span class="keywordflow">for</span>(<span class="keywordtype">int</span> jrow=0;jrow<nrow;jrow+=down_opt[0]){</div>
+<div class="line"><a name="l00417"></a><span class="lineno">  417</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> irow=jrow;irow<jrow+down_opt[0];++irow){</div>
+<div class="line"><a name="l00418"></a><span class="lineno">  418</span>       imgWriterEst.image2geo(0,irow,geox,geoy);</div>
+<div class="line"><a name="l00419"></a><span class="lineno">  419</span>       imgReaderModel1.geo2image(geox,geoy,modCol,modRow);</div>
+<div class="line"><a name="l00420"></a><span class="lineno">  420</span>       assert(modRow>=0&&modRow<imgReaderModel1.nrOfRow());</div>
+<div class="line"><a name="l00421"></a><span class="lineno">  421</span>       imgReaderModel1.readData(estReadBuffer,GDT_Float64,modRow,0,theResample);</div>
+<div class="line"><a name="l00422"></a><span class="lineno">  422</span>       <span class="keywordtype">int</span> maxRow=(irow+down_opt[0]/2<imgReaderObs.nrOfRow()) ? irow+down_opt[0]/2 : imgReaderObs.nrOfRow()-1;</div>
+<div class="line"><a name="l00423"></a><span class="lineno">  423</span>       obsLineVector.erase(obsLineVector.begin());</div>
+<div class="line"><a name="l00424"></a><span class="lineno">  424</span>       imgReaderObs.readData(obsLineBuffer,GDT_Float64,maxRow,0);</div>
+<div class="line"><a name="l00425"></a><span class="lineno">  425</span>       obsLineVector.push_back(obsLineBuffer);</div>
+<div class="line"><a name="l00426"></a><span class="lineno">  426</span>       <span class="comment">// obsLineBuffer=obsLineVector[down_opt[0]/2];</span></div>
+<div class="line"><a name="l00427"></a><span class="lineno">  427</span>       <span class="keywordflow">if</span>(imgReaderObs.nrOfBand()>1)</div>
+<div class="line"><a name="l00428"></a><span class="lineno">  428</span>         imgReaderObs.readData(uncertObsLineBuffer,GDT_Float64,irow,1);</div>
+<div class="line"><a name="l00429"></a><span class="lineno">  429</span> </div>
+<div class="line"><a name="l00430"></a><span class="lineno">  430</span>       <span class="keywordflow">for</span>(<span class="keywordtype">int</span> jcol=0;jcol<ncol;jcol+=down_opt[0]){</div>
+<div class="line"><a name="l00431"></a><span class="lineno">  431</span>         <span class="keywordflow">for</span>(<span class="keywordtype">int</span> icol=jcol;icol<jcol+down_opt[0];++icol){</div>
+<div class="line"><a name="l00432"></a><span class="lineno">  432</span>           imgWriterEst.image2geo(icol,irow,geox,geoy);</div>
+<div class="line"><a name="l00433"></a><span class="lineno">  433</span>           imgReaderModel1.geo2image(geox,geoy,modCol,modRow);</div>
+<div class="line"><a name="l00434"></a><span class="lineno">  434</span>           assert(modRow>=0&&modRow<imgReaderModel1.nrOfRow());</div>
+<div class="line"><a name="l00435"></a><span class="lineno">  435</span>           lowerCol=modCol-0.5;</div>
+<div class="line"><a name="l00436"></a><span class="lineno">  436</span>           lowerCol=<span class="keyword">static_cast<</span><span class="keywordtype">int</span><span class="keyword">></span>(lowerCol);</div>
+<div class="line"><a name="l00437"></a><span class="lineno">  437</span>           upperCol=modCol+0.5;</div>
+<div class="line"><a name="l00438"></a><span class="lineno">  438</span>           upperCol=<span class="keyword">static_cast<</span><span class="keywordtype">int</span><span class="keyword">></span>(upperCol);</div>
+<div class="line"><a name="l00439"></a><span class="lineno">  439</span>           <span class="keywordflow">if</span>(lowerCol<0)</div>
+<div class="line"><a name="l00440"></a><span class="lineno">  440</span>         lowerCol=0;</div>
+<div class="line"><a name="l00441"></a><span class="lineno">  441</span>           <span class="keywordflow">if</span>(upperCol>=imgReaderModel1.nrOfCol())</div>
+<div class="line"><a name="l00442"></a><span class="lineno">  442</span>         upperCol=imgReaderModel1.nrOfCol()-1;</div>
+<div class="line"><a name="l00443"></a><span class="lineno">  443</span>           <span class="keywordtype">double</span> modValue=(modCol-0.5-lowerCol)*estReadBuffer[upperCol]+(1-modCol+0.5+lowerCol)*estReadBuffer[lowerCol];</div>
+<div class="line"><a name="l00444"></a><span class="lineno">  444</span>           <span class="comment">// double modValue=estReadBuffer[modCol];</span></div>
+<div class="line"><a name="l00445"></a><span class="lineno">  445</span>           <span class="keywordtype">double</span> errMod=uncertModel_opt[0]*stdDev*stdDev;</div>
+<div class="line"><a name="l00446"></a><span class="lineno">  446</span>           <span class="keywordflow">if</span>(imgReaderModel1.isNoData(modValue)){<span class="comment">//model is nodata: retain observation </span></div>
+<div class="line"><a name="l00447"></a><span class="lineno">  447</span>         <span class="keywordflow">if</span>(imgReaderObs.isNoData(obsLineBuffer[icol])){<span class="comment">//both model and observation nodata</span></div>
+<div class="line"><a name="l00448"></a><span class="lineno">  448</span>           estWriteBuffer[icol]=obsnodata_opt[0];</div>
+<div class="line"><a name="l00449"></a><span class="lineno">  449</span>           uncertWriteBuffer[icol]=uncertNodata_opt[0];</div>
+<div class="line"><a name="l00450"></a><span class="lineno">  450</span>           gainWriteBuffer[icol]=obsnodata_opt[0];</div>
+<div class="line"><a name="l00451"></a><span class="lineno">  451</span>         }</div>
+<div class="line"><a name="l00452"></a><span class="lineno">  452</span>         <span class="keywordflow">else</span>{</div>
+<div class="line"><a name="l00453"></a><span class="lineno">  453</span>           estWriteBuffer[icol]=obsLineBuffer[icol];</div>
+<div class="line"><a name="l00454"></a><span class="lineno">  454</span>           <span class="keywordflow">if</span>(obsmin_opt.size()){</div>
+<div class="line"><a name="l00455"></a><span class="lineno">  455</span>             <span class="keywordflow">if</span>(estWriteBuffer[icol]<obsmin_opt[0])</div>
+<div class="line"><a name="l00456"></a><span class="lineno">  456</span>               estWriteBuffer[icol]=obsmin_opt[0];</div>
+<div class="line"><a name="l00457"></a><span class="lineno">  457</span>           }</div>
+<div class="line"><a name="l00458"></a><span class="lineno">  458</span>           <span class="keywordflow">if</span>(obsmax_opt.size()){</div>
+<div class="line"><a name="l00459"></a><span class="lineno">  459</span>             <span class="keywordflow">if</span>(estWriteBuffer[icol]>obsmax_opt[0])</div>
+<div class="line"><a name="l00460"></a><span class="lineno">  460</span>               estWriteBuffer[icol]=obsmax_opt[0];</div>
+<div class="line"><a name="l00461"></a><span class="lineno">  461</span>           }</div>
+<div class="line"><a name="l00462"></a><span class="lineno">  462</span>           <span class="keywordflow">if</span>(uncertObsLineBuffer.size()>icol)</div>
+<div class="line"><a name="l00463"></a><span class="lineno">  463</span>             uncertWriteBuffer[icol]=uncertObsLineBuffer[icol];</div>
+<div class="line"><a name="l00464"></a><span class="lineno">  464</span>           <span class="keywordflow">else</span></div>
+<div class="line"><a name="l00465"></a><span class="lineno">  465</span>             uncertWriteBuffer[icol]=uncertObs_opt[0];</div>
+<div class="line"><a name="l00466"></a><span class="lineno">  466</span>         }</div>
+<div class="line"><a name="l00467"></a><span class="lineno">  467</span>           }</div>
+<div class="line"><a name="l00468"></a><span class="lineno">  468</span>           <span class="keywordflow">else</span>{<span class="comment">//model is valid: calculate estimate from model</span></div>
+<div class="line"><a name="l00469"></a><span class="lineno">  469</span>         estWriteBuffer[icol]=modValue;</div>
+<div class="line"><a name="l00470"></a><span class="lineno">  470</span>         uncertWriteBuffer[icol]=errMod;<span class="comment">//in case observation is not valid</span></div>
+<div class="line"><a name="l00471"></a><span class="lineno">  471</span>         gainWriteBuffer[icol]=0;</div>
+<div class="line"><a name="l00472"></a><span class="lineno">  472</span>           }</div>
+<div class="line"><a name="l00473"></a><span class="lineno">  473</span>           <span class="comment">//measurement update</span></div>
+<div class="line"><a name="l00474"></a><span class="lineno">  474</span>           <span class="keywordflow">if</span>(!imgReaderObs.isNoData(obsLineBuffer[icol])){</div>
+<div class="line"><a name="l00475"></a><span class="lineno">  475</span>         <span class="comment">// estWriteBuffer[icol]=estReadBuffer[icol]*modValue1/modValue2</span></div>
+<div class="line"><a name="l00476"></a><span class="lineno">  476</span>         <span class="keywordtype">double</span> kalmanGain=1;</div>
+<div class="line"><a name="l00477"></a><span class="lineno">  477</span>         <span class="keywordtype">int</span> minCol=(icol>down_opt[0]/2) ? icol-down_opt[0]/2 : 0;</div>
+<div class="line"><a name="l00478"></a><span class="lineno">  478</span>         <span class="keywordtype">int</span> maxCol=(icol+down_opt[0]/2<imgReaderObs.nrOfCol()) ? icol+down_opt[0]/2 : imgReaderObs.nrOfCol()-1;</div>
+<div class="line"><a name="l00479"></a><span class="lineno">  479</span>         <span class="keywordtype">int</span> minRow=(irow>down_opt[0]/2) ? irow-down_opt[0]/2 : 0;</div>
+<div class="line"><a name="l00480"></a><span class="lineno">  480</span>         <span class="keywordtype">int</span> maxRow=(irow+down_opt[0]/2<imgReaderObs.nrOfRow()) ? irow+down_opt[0]/2 : imgReaderObs.nrOfRow()-1;</div>
+<div class="line"><a name="l00481"></a><span class="lineno">  481</span>         obsWindowBuffer.clear();</div>
+<div class="line"><a name="l00482"></a><span class="lineno">  482</span>         <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iline=0;iline<obsLineVector.size();++iline){</div>
+<div class="line"><a name="l00483"></a><span class="lineno">  483</span>           <span class="keywordflow">for</span>(<span class="keywordtype">int</span> isample=minCol;isample<=maxCol;++isample){</div>
+<div class="line"><a name="l00484"></a><span class="lineno">  484</span>             assert(isample<obsLineVector[iline].size());</div>
+<div class="line"><a name="l00485"></a><span class="lineno">  485</span>             obsWindowBuffer.push_back(obsLineVector[iline][isample]);</div>
+<div class="line"><a name="l00486"></a><span class="lineno">  486</span>           }</div>
+<div class="line"><a name="l00487"></a><span class="lineno">  487</span>         }</div>
+<div class="line"><a name="l00488"></a><span class="lineno">  488</span>         <span class="keywordflow">if</span>(!imgReaderModel1.isNoData(modValue)){<span class="comment">//model is valid</span></div>
+<div class="line"><a name="l00489"></a><span class="lineno">  489</span>           <a class="code" href="classstatfactory_1_1StatFactory.html">statfactory::StatFactory</a> statobs;</div>
+<div class="line"><a name="l00490"></a><span class="lineno">  490</span>           statobs.setNoDataValues(obsnodata_opt);</div>
+<div class="line"><a name="l00491"></a><span class="lineno">  491</span>           <span class="keywordtype">double</span> obsMeanValue=statobs.mean(obsWindowBuffer);</div>
+<div class="line"><a name="l00492"></a><span class="lineno">  492</span>           <span class="keywordtype">double</span> difference=0;</div>
+<div class="line"><a name="l00493"></a><span class="lineno">  493</span>           difference=obsMeanValue-modValue;</div>
+<div class="line"><a name="l00494"></a><span class="lineno">  494</span>           errObs=uncertObs_opt[0]*sqrt(difference*difference);</div>
+<div class="line"><a name="l00495"></a><span class="lineno">  495</span>           <span class="comment">// errObs=(difference<0)? sqrt(difference*difference) : uncertObs_opt[0];</span></div>
+<div class="line"><a name="l00496"></a><span class="lineno">  496</span>           <span class="comment">//errObs=uncertObs_opt[0];//*difference*difference;//uncertainty of the observation (R in Kalman equations)</span></div>
+<div class="line"><a name="l00497"></a><span class="lineno">  497</span>           <span class="keywordtype">double</span> errorCovariance=errMod;<span class="comment">//assumed initial errorCovariance (P in Kalman equations)</span></div>
+<div class="line"><a name="l00498"></a><span class="lineno">  498</span>           <span class="keywordflow">if</span>(errorCovariance+errObs>eps_opt[0])</div>
+<div class="line"><a name="l00499"></a><span class="lineno">  499</span>             kalmanGain=errorCovariance/(errorCovariance+errObs);</div>
+<div class="line"><a name="l00500"></a><span class="lineno">  500</span>           <span class="keywordflow">else</span> </div>
+<div class="line"><a name="l00501"></a><span class="lineno">  501</span>             kalmanGain=1;</div>
+<div class="line"><a name="l00502"></a><span class="lineno">  502</span>           estWriteBuffer[icol]+=kalmanGain*(obsLineBuffer[icol]-estWriteBuffer[icol]);</div>
+<div class="line"><a name="l00503"></a><span class="lineno">  503</span>           <span class="keywordflow">if</span>(obsmin_opt.size()){</div>
+<div class="line"><a name="l00504"></a><span class="lineno">  504</span>             <span class="keywordflow">if</span>(estWriteBuffer[icol]<obsmin_opt[0])</div>
+<div class="line"><a name="l00505"></a><span class="lineno">  505</span>               estWriteBuffer[icol]=obsmin_opt[0];</div>
+<div class="line"><a name="l00506"></a><span class="lineno">  506</span>           }</div>
+<div class="line"><a name="l00507"></a><span class="lineno">  507</span>           <span class="keywordflow">if</span>(obsmax_opt.size()){</div>
+<div class="line"><a name="l00508"></a><span class="lineno">  508</span>             <span class="keywordflow">if</span>(estWriteBuffer[icol]>obsmax_opt[0])</div>
+<div class="line"><a name="l00509"></a><span class="lineno">  509</span>               estWriteBuffer[icol]=obsmax_opt[0];</div>
+<div class="line"><a name="l00510"></a><span class="lineno">  510</span>           }</div>
+<div class="line"><a name="l00511"></a><span class="lineno">  511</span>         }</div>
+<div class="line"><a name="l00512"></a><span class="lineno">  512</span>         assert(kalmanGain<=1);</div>
+<div class="line"><a name="l00513"></a><span class="lineno">  513</span>         gainWriteBuffer[icol]=kalmanGain;</div>
+<div class="line"><a name="l00514"></a><span class="lineno">  514</span>           }</div>
+<div class="line"><a name="l00515"></a><span class="lineno">  515</span>         }</div>
 <div class="line"><a name="l00516"></a><span class="lineno">  516</span>       }</div>
-<div class="line"><a name="l00517"></a><span class="lineno">  517</span>       <span class="comment">// uncertWriteBuffer[icol]+=uncertReadBuffer[icol];</span></div>
-<div class="line"><a name="l00518"></a><span class="lineno">  518</span>       <span class="comment">//measurement update</span></div>
-<div class="line"><a name="l00519"></a><span class="lineno">  519</span>       <span class="keywordflow">if</span>(!imgReaderObs.isNoData(obsLineBuffer[icol])){</div>
-<div class="line"><a name="l00520"></a><span class="lineno">  520</span>         <span class="keywordtype">double</span> kalmanGain=1;</div>
-<div class="line"><a name="l00521"></a><span class="lineno">  521</span>         <span class="keywordtype">double</span> uncertObs=uncertObs_opt[0];</div>
-<div class="line"><a name="l00522"></a><span class="lineno">  522</span>         <span class="keywordflow">if</span>(uncertObsLineBuffer.size()>icol)</div>
-<div class="line"><a name="l00523"></a><span class="lineno">  523</span>           uncertObs=uncertObsLineBuffer[icol];</div>
-<div class="line"><a name="l00524"></a><span class="lineno">  524</span>         <span class="keywordflow">else</span> <span class="keywordflow">if</span>(weight_opt.size()||deltaObs_opt.size()){</div>
-<div class="line"><a name="l00525"></a><span class="lineno">  525</span>           vector<double> obsWindowBuffer;<span class="comment">//buffer for observation to calculate average corresponding to model pixel</span></div>
-<div class="line"><a name="l00526"></a><span class="lineno">  526</span>           <span class="keywordtype">int</span> minCol=(icol>down_opt[0]/2) ? icol-down_opt[0]/2 : 0;</div>
-<div class="line"><a name="l00527"></a><span class="lineno">  527</span>           <span class="keywordtype">int</span> maxCol=(icol+down_opt[0]/2<imgReaderObs.nrOfCol()) ? icol+down_opt[0]/2 : imgReaderObs.nrOfCol()-1;</div>
-<div class="line"><a name="l00528"></a><span class="lineno">  528</span>           <span class="keywordtype">int</span> minRow=(irow>down_opt[0]/2) ? irow-down_opt[0]/2 : 0;</div>
-<div class="line"><a name="l00529"></a><span class="lineno">  529</span>           <span class="keywordtype">int</span> maxRow=(irow+down_opt[0]/2<imgReaderObs.nrOfRow()) ? irow+down_opt[0]/2 : imgReaderObs.nrOfRow()-1;</div>
-<div class="line"><a name="l00530"></a><span class="lineno">  530</span>         </div>
-<div class="line"><a name="l00531"></a><span class="lineno">  531</span>           imgReaderObs.readDataBlock(obsWindowBuffer,GDT_Float64,minCol,maxCol,minRow,maxRow,0);</div>
-<div class="line"><a name="l00532"></a><span class="lineno">  532</span>           <a class="code" href="classstatfactory_1_1StatFactory.html">statfactory::StatFactory</a> statobs;</div>
-<div class="line"><a name="l00533"></a><span class="lineno">  533</span>           statobs.setNoDataValues(obsnodata_opt);</div>
-<div class="line"><a name="l00534"></a><span class="lineno">  534</span>           <span class="keywordtype">double</span> obsMeanValue=(statobs.mean(obsWindowBuffer)-c0obs)/c1obs;</div>
-<div class="line"><a name="l00535"></a><span class="lineno">  535</span>           <span class="keywordtype">double</span> difference=obsMeanValue-modValue;</div>
-<div class="line"><a name="l00536"></a><span class="lineno">  536</span>           <span class="keywordflow">if</span>(modValue){</div>
-<div class="line"><a name="l00537"></a><span class="lineno">  537</span>         <span class="keywordtype">double</span> relativeDifference=difference/modValue;</div>
-<div class="line"><a name="l00538"></a><span class="lineno">  538</span>         <span class="keywordflow">if</span>(deltaObs_opt.size()){</div>
-<div class="line"><a name="l00539"></a><span class="lineno">  539</span>           assert(deltaObs_opt.size()>1);</div>
-<div class="line"><a name="l00540"></a><span class="lineno">  540</span>           <span class="keywordflow">if</span>(100*relativeDifference<deltaObs_opt[0])<span class="comment">//lower bound</span></div>
-<div class="line"><a name="l00541"></a><span class="lineno">  541</span>             kalmanGain=0;</div>
-<div class="line"><a name="l00542"></a><span class="lineno">  542</span>           <span class="keywordflow">else</span> <span class="keywordflow">if</span>(100*relativeDifference>deltaObs_opt[1])<span class="comment">//upper bound</span></div>
-<div class="line"><a name="l00543"></a><span class="lineno">  543</span>             kalmanGain=0;</div>
-<div class="line"><a name="l00544"></a><span class="lineno">  544</span>         }</div>
-<div class="line"><a name="l00545"></a><span class="lineno">  545</span>         <span class="keywordflow">else</span> <span class="keywordflow">if</span>(weight_opt.size()){</div>
-<div class="line"><a name="l00546"></a><span class="lineno">  546</span>           assert(weight_opt.size()>1);</div>
-<div class="line"><a name="l00547"></a><span class="lineno">  547</span>           <span class="keywordflow">if</span>(obsMeanValue<modValue)</div>
-<div class="line"><a name="l00548"></a><span class="lineno">  548</span>             uncertObs=weight_opt[0]*relativeDifference;</div>
-<div class="line"><a name="l00549"></a><span class="lineno">  549</span>           <span class="keywordflow">else</span> <span class="keywordflow">if</span>(obsMeanValue>modValue)</div>
-<div class="line"><a name="l00550"></a><span class="lineno">  550</span>             uncertObs=weight_opt[1]*relativeDifference;</div>
-<div class="line"><a name="l00551"></a><span class="lineno">  551</span>         }</div>
-<div class="line"><a name="l00552"></a><span class="lineno">  552</span>           }</div>
-<div class="line"><a name="l00553"></a><span class="lineno">  553</span>           <span class="keywordflow">if</span>(uncertObs<=0)</div>
-<div class="line"><a name="l00554"></a><span class="lineno">  554</span>         uncertObs=0;</div>
-<div class="line"><a name="l00555"></a><span class="lineno">  555</span>           <span class="keywordflow">if</span>(verbose_opt[0]>1)</div>
-<div class="line"><a name="l00556"></a><span class="lineno">  556</span>         cout << <span class="stringliteral">"obsMeanValue:"</span> << obsMeanValue << <span class="stringliteral">", modValue: "</span> << modValue << endl;</div>
-<div class="line"><a name="l00557"></a><span class="lineno">  557</span>         }</div>
-<div class="line"><a name="l00558"></a><span class="lineno">  558</span>         <span class="keywordflow">if</span>(kalmanGain>0){</div>
-<div class="line"><a name="l00559"></a><span class="lineno">  559</span>           <span class="keywordflow">if</span>((uncertWriteBuffer[icol]+uncertObs)>eps_opt[0])</div>
-<div class="line"><a name="l00560"></a><span class="lineno">  560</span>         kalmanGain=uncertWriteBuffer[icol]/(uncertWriteBuffer[icol]+uncertObs);</div>
-<div class="line"><a name="l00561"></a><span class="lineno">  561</span>         }</div>
-<div class="line"><a name="l00562"></a><span class="lineno">  562</span>         assert(kalmanGain<=1);</div>
-<div class="line"><a name="l00563"></a><span class="lineno">  563</span>         estWriteBuffer[icol]+=kalmanGain*(obsLineBuffer[icol]-estWriteBuffer[icol]);</div>
-<div class="line"><a name="l00564"></a><span class="lineno">  564</span>         uncertWriteBuffer[icol]*=(1-kalmanGain);</div>
-<div class="line"><a name="l00565"></a><span class="lineno">  565</span>       }</div>
-<div class="line"><a name="l00566"></a><span class="lineno">  566</span>     }</div>
-<div class="line"><a name="l00567"></a><span class="lineno">  567</span>     imgWriterEst.writeData(estWriteBuffer,GDT_Float64,irow,0);</div>
-<div class="line"><a name="l00568"></a><span class="lineno">  568</span>     imgWriterEst.writeData(uncertWriteBuffer,GDT_Float64,irow,1);</div>
+<div class="line"><a name="l00517"></a><span class="lineno">  517</span>       <span class="keywordflow">if</span>(gain_opt.size())</div>
+<div class="line"><a name="l00518"></a><span class="lineno">  518</span>         imgWriterGain.writeData(gainWriteBuffer,GDT_Float64,irow,0);</div>
+<div class="line"><a name="l00519"></a><span class="lineno">  519</span>       imgWriterEst.writeData(estWriteBuffer,GDT_Float64,irow,0);</div>
+<div class="line"><a name="l00520"></a><span class="lineno">  520</span>       imgWriterEst.writeData(uncertWriteBuffer,GDT_Float64,irow,1);</div>
+<div class="line"><a name="l00521"></a><span class="lineno">  521</span>     }</div>
+<div class="line"><a name="l00522"></a><span class="lineno">  522</span>       }</div>
+<div class="line"><a name="l00523"></a><span class="lineno">  523</span>       imgReaderObs.close();</div>
+<div class="line"><a name="l00524"></a><span class="lineno">  524</span>       ++obsindex;</div>
+<div class="line"><a name="l00525"></a><span class="lineno">  525</span>     }</div>
+<div class="line"><a name="l00526"></a><span class="lineno">  526</span>     imgReaderModel1.close();</div>
+<div class="line"><a name="l00527"></a><span class="lineno">  527</span>     imgWriterEst.close();</div>
+<div class="line"><a name="l00528"></a><span class="lineno">  528</span> </div>
+<div class="line"><a name="l00529"></a><span class="lineno">  529</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> modindex=1;modindex<model_opt.size();++modindex){</div>
+<div class="line"><a name="l00530"></a><span class="lineno">  530</span>       <span class="keywordflow">if</span>(verbose_opt[0]){</div>
+<div class="line"><a name="l00531"></a><span class="lineno">  531</span>     cout << <span class="stringliteral">"processing time "</span> << tmodel_opt[modindex] << endl;</div>
+<div class="line"><a name="l00532"></a><span class="lineno">  532</span>     <span class="keywordflow">if</span>(obsindex<relobsindex.size())</div>
+<div class="line"><a name="l00533"></a><span class="lineno">  533</span>       cout << <span class="stringliteral">"next observation "</span> << tmodel_opt[relobsindex[obsindex]] << endl;</div>
+<div class="line"><a name="l00534"></a><span class="lineno">  534</span>     <span class="keywordflow">else</span></div>
+<div class="line"><a name="l00535"></a><span class="lineno">  535</span>       cout << <span class="stringliteral">"There is no next observation"</span> << endl;</div>
+<div class="line"><a name="l00536"></a><span class="lineno">  536</span>       }</div>
+<div class="line"><a name="l00537"></a><span class="lineno">  537</span>       <span class="keywordtype">string</span> output;</div>
+<div class="line"><a name="l00538"></a><span class="lineno">  538</span>       <span class="keywordflow">if</span>(outputfw_opt.size()==model_opt.size())</div>
+<div class="line"><a name="l00539"></a><span class="lineno">  539</span>     output=outputfw_opt[modindex];</div>
+<div class="line"><a name="l00540"></a><span class="lineno">  540</span>       <span class="keywordflow">else</span>{</div>
+<div class="line"><a name="l00541"></a><span class="lineno">  541</span>     ostringstream outputstream;</div>
+<div class="line"><a name="l00542"></a><span class="lineno">  542</span>     outputstream << outputfw_opt[0] << <span class="stringliteral">"_"</span>;</div>
+<div class="line"><a name="l00543"></a><span class="lineno">  543</span>     outputstream << setfill(<span class="charliteral">'0'</span>) << setw(ndigit) << tmodel_opt[modindex];</div>
+<div class="line"><a name="l00544"></a><span class="lineno">  544</span>     outputstream << <span class="stringliteral">".tif"</span>;</div>
+<div class="line"><a name="l00545"></a><span class="lineno">  545</span>     <span class="comment">// outputstream << outputfw_opt[0] << "_" << tmodel_opt[modindex] << ".tif";</span></div>
+<div class="line"><a name="l00546"></a><span class="lineno">  546</span>     output=outputstream.str();</div>
+<div class="line"><a name="l00547"></a><span class="lineno">  547</span>       }</div>
+<div class="line"><a name="l00548"></a><span class="lineno">  548</span>     </div>
+<div class="line"><a name="l00549"></a><span class="lineno">  549</span>       <span class="comment">//two band output band0=estimation, band1=uncertainty</span></div>
+<div class="line"><a name="l00550"></a><span class="lineno">  550</span>       imgWriterEst.open(output,ncol,nrow,2,GDT_Float64,imageType,option_opt);</div>
+<div class="line"><a name="l00551"></a><span class="lineno">  551</span>       imgWriterEst.setProjectionProj4(projection_opt[0]);</div>
+<div class="line"><a name="l00552"></a><span class="lineno">  552</span>       imgWriterEst.setGeoTransform(geotransform);</div>
+<div class="line"><a name="l00553"></a><span class="lineno">  553</span>       imgWriterEst.GDALSetNoDataValue(obsnodata_opt[0]);</div>
+<div class="line"><a name="l00554"></a><span class="lineno">  554</span> </div>
+<div class="line"><a name="l00555"></a><span class="lineno">  555</span>       <span class="comment">//calculate regression between two subsequence model inputs</span></div>
+<div class="line"><a name="l00556"></a><span class="lineno">  556</span>       imgReaderModel1.open(model_opt[modindex-1]);</div>
+<div class="line"><a name="l00557"></a><span class="lineno">  557</span>       imgReaderModel1.setNoData(modnodata_opt);</div>
+<div class="line"><a name="l00558"></a><span class="lineno">  558</span>       imgReaderModel2.open(model_opt[modindex]);</div>
+<div class="line"><a name="l00559"></a><span class="lineno">  559</span>       imgReaderModel2.setNoData(modnodata_opt);</div>
+<div class="line"><a name="l00560"></a><span class="lineno">  560</span>       <span class="comment">//calculate regression</span></div>
+<div class="line"><a name="l00561"></a><span class="lineno">  561</span>       <span class="comment">//we could re-use the points from second image from last run, but</span></div>
+<div class="line"><a name="l00562"></a><span class="lineno">  562</span>       <span class="comment">//to keep it general, we must redo it (overlap might have changed)</span></div>
+<div class="line"><a name="l00563"></a><span class="lineno">  563</span>     </div>
+<div class="line"><a name="l00564"></a><span class="lineno">  564</span>       pfnProgress(progress,pszMessage,pProgressArg);</div>
+<div class="line"><a name="l00565"></a><span class="lineno">  565</span> </div>
+<div class="line"><a name="l00566"></a><span class="lineno">  566</span>       <span class="keywordtype">bool</span> update=<span class="keyword">false</span>;</div>
+<div class="line"><a name="l00567"></a><span class="lineno">  567</span>       <span class="keywordflow">if</span>(obsindex<relobsindex.size()){</div>
+<div class="line"><a name="l00568"></a><span class="lineno">  568</span>     update=(relobsindex[obsindex]==modindex);</div>
 <div class="line"><a name="l00569"></a><span class="lineno">  569</span>       }</div>
-<div class="line"><a name="l00570"></a><span class="lineno">  570</span>       imgReaderObs.close();</div>
-<div class="line"><a name="l00571"></a><span class="lineno">  571</span>       ++obsindex;</div>
-<div class="line"><a name="l00572"></a><span class="lineno">  572</span>     }</div>
-<div class="line"><a name="l00573"></a><span class="lineno">  573</span>     imgReaderModel1.close();</div>
-<div class="line"><a name="l00574"></a><span class="lineno">  574</span>     imgWriterEst.close();</div>
-<div class="line"><a name="l00575"></a><span class="lineno">  575</span> </div>
-<div class="line"><a name="l00576"></a><span class="lineno">  576</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> modindex=1;modindex<model_opt.size();++modindex){</div>
-<div class="line"><a name="l00577"></a><span class="lineno">  577</span>       <span class="keywordflow">if</span>(verbose_opt[0]){</div>
-<div class="line"><a name="l00578"></a><span class="lineno">  578</span>     cout << <span class="stringliteral">"processing time "</span> << tmodel_opt[modindex] << endl;</div>
-<div class="line"><a name="l00579"></a><span class="lineno">  579</span>     <span class="keywordflow">if</span>(obsindex<relobsindex.size())</div>
-<div class="line"><a name="l00580"></a><span class="lineno">  580</span>       cout << <span class="stringliteral">"next observation "</span> << tmodel_opt[relobsindex[obsindex]] << endl;</div>
-<div class="line"><a name="l00581"></a><span class="lineno">  581</span>     <span class="keywordflow">else</span></div>
-<div class="line"><a name="l00582"></a><span class="lineno">  582</span>       cout << <span class="stringliteral">"There is no next observation"</span> << endl;</div>
-<div class="line"><a name="l00583"></a><span class="lineno">  583</span>       }</div>
-<div class="line"><a name="l00584"></a><span class="lineno">  584</span>       <span class="keywordtype">string</span> output;</div>
-<div class="line"><a name="l00585"></a><span class="lineno">  585</span>       <span class="keywordflow">if</span>(outputfw_opt.size()==model_opt.size())</div>
-<div class="line"><a name="l00586"></a><span class="lineno">  586</span>     output=outputfw_opt[modindex];</div>
-<div class="line"><a name="l00587"></a><span class="lineno">  587</span>       <span class="keywordflow">else</span>{</div>
-<div class="line"><a name="l00588"></a><span class="lineno">  588</span>     ostringstream outputstream;</div>
-<div class="line"><a name="l00589"></a><span class="lineno">  589</span>     outputstream << outputfw_opt[0] << <span class="stringliteral">"_"</span>;</div>
-<div class="line"><a name="l00590"></a><span class="lineno">  590</span>     outputstream << setfill(<span class="charliteral">'0'</span>) << setw(ndigit) << tmodel_opt[modindex];</div>
-<div class="line"><a name="l00591"></a><span class="lineno">  591</span>     outputstream << <span class="stringliteral">".tif"</span>;</div>
-<div class="line"><a name="l00592"></a><span class="lineno">  592</span>     <span class="comment">// outputstream << outputfw_opt[0] << "_" << tmodel_opt[modindex] << ".tif";</span></div>
-<div class="line"><a name="l00593"></a><span class="lineno">  593</span>     output=outputstream.str();</div>
-<div class="line"><a name="l00594"></a><span class="lineno">  594</span>       }</div>
-<div class="line"><a name="l00595"></a><span class="lineno">  595</span>     </div>
-<div class="line"><a name="l00596"></a><span class="lineno">  596</span>       <span class="comment">//two band output band0=estimation, band1=uncertainty</span></div>
-<div class="line"><a name="l00597"></a><span class="lineno">  597</span>       imgWriterEst.open(output,ncol,nrow,2,GDT_Float32,imageType,option_opt);</div>
-<div class="line"><a name="l00598"></a><span class="lineno">  598</span>       imgWriterEst.setProjectionProj4(projection_opt[0]);</div>
-<div class="line"><a name="l00599"></a><span class="lineno">  599</span>       imgWriterEst.setGeoTransform(geotransform);</div>
-<div class="line"><a name="l00600"></a><span class="lineno">  600</span>       imgWriterEst.GDALSetNoDataValue(obsnodata_opt[0]);</div>
-<div class="line"><a name="l00601"></a><span class="lineno">  601</span> </div>
-<div class="line"><a name="l00602"></a><span class="lineno">  602</span>       <span class="comment">//calculate regression between two subsequence model inputs</span></div>
-<div class="line"><a name="l00603"></a><span class="lineno">  603</span>       imgReaderModel1.open(model_opt[modindex-1]);</div>
-<div class="line"><a name="l00604"></a><span class="lineno">  604</span>       imgReaderModel1.setNoData(modnodata_opt);</div>
-<div class="line"><a name="l00605"></a><span class="lineno">  605</span>       <span class="keywordflow">if</span>(modoffset_opt.size())</div>
-<div class="line"><a name="l00606"></a><span class="lineno">  606</span>     imgReaderModel1.setOffset(modoffset_opt[0]);</div>
-<div class="line"><a name="l00607"></a><span class="lineno">  607</span>       <span class="keywordflow">if</span>(modscale_opt.size())</div>
-<div class="line"><a name="l00608"></a><span class="lineno">  608</span>     imgReaderModel1.setScale(modscale_opt[0]);</div>
-<div class="line"><a name="l00609"></a><span class="lineno">  609</span>       imgReaderModel2.open(model_opt[modindex]);</div>
-<div class="line"><a name="l00610"></a><span class="lineno">  610</span>       imgReaderModel2.setNoData(modnodata_opt);</div>
-<div class="line"><a name="l00611"></a><span class="lineno">  611</span>       <span class="keywordflow">if</span>(modoffset_opt.size())</div>
-<div class="line"><a name="l00612"></a><span class="lineno">  612</span>     imgReaderModel2.setOffset(modoffset_opt[0]);</div>
-<div class="line"><a name="l00613"></a><span class="lineno">  613</span>       <span class="keywordflow">if</span>(modscale_opt.size())</div>
-<div class="line"><a name="l00614"></a><span class="lineno">  614</span>     imgReaderModel2.setScale(modscale_opt[0]);</div>
-<div class="line"><a name="l00615"></a><span class="lineno">  615</span>       <span class="comment">//calculate regression</span></div>
-<div class="line"><a name="l00616"></a><span class="lineno">  616</span>       <span class="comment">//we could re-use the points from second image from last run, but</span></div>
-<div class="line"><a name="l00617"></a><span class="lineno">  617</span>       <span class="comment">//to keep it general, we must redo it (overlap might have changed)</span></div>
-<div class="line"><a name="l00618"></a><span class="lineno">  618</span>     </div>
-<div class="line"><a name="l00619"></a><span class="lineno">  619</span>       pfnProgress(progress,pszMessage,pProgressArg);</div>
-<div class="line"><a name="l00620"></a><span class="lineno">  620</span> </div>
-<div class="line"><a name="l00621"></a><span class="lineno">  621</span>       <span class="keywordflow">if</span>(verbose_opt[0])</div>
-<div class="line"><a name="l00622"></a><span class="lineno">  622</span>     cout << <span class="stringliteral">"Calculating regression for "</span> << imgReaderModel1.getFileName() << <span class="stringliteral">" "</span> << imgReaderModel2.getFileName() << endl;</div>
-<div class="line"><a name="l00623"></a><span class="lineno">  623</span>       </div>
-<div class="line"><a name="l00624"></a><span class="lineno">  624</span>       <span class="keywordtype">double</span> errMod=imgreg.getRMSE(imgReaderModel1,imgReaderModel2,c0modGlobal,c1modGlobal,0,0);</div>
-<div class="line"><a name="l00625"></a><span class="lineno">  625</span>       errMod*=regTime_opt[0];</div>
-<div class="line"><a name="l00626"></a><span class="lineno">  626</span> </div>
-<div class="line"><a name="l00627"></a><span class="lineno">  627</span>       <span class="comment">// double errMod=imgreg.getRMSE(imgReaderModel1,imgReaderModel2,c0modGlobal,c1modGlobal,verbose_opt[0]);</span></div>
-<div class="line"><a name="l00628"></a><span class="lineno">  628</span>       <span class="keywordflow">if</span>(verbose_opt[0])</div>
-<div class="line"><a name="l00629"></a><span class="lineno">  629</span>     cout << <span class="stringliteral">"c0modGlobal, c1modGlobal: "</span> << c0modGlobal << <span class="stringliteral">", "</span> << c1modGlobal << endl;</div>
-<div class="line"><a name="l00630"></a><span class="lineno">  630</span> </div>
-<div class="line"><a name="l00631"></a><span class="lineno">  631</span>       <span class="keywordtype">bool</span> update=<span class="keyword">false</span>;</div>
-<div class="line"><a name="l00632"></a><span class="lineno">  632</span>       <span class="keywordflow">if</span>(obsindex<relobsindex.size()){</div>
-<div class="line"><a name="l00633"></a><span class="lineno">  633</span>     update=(relobsindex[obsindex]==modindex);</div>
-<div class="line"><a name="l00634"></a><span class="lineno">  634</span>       }</div>
-<div class="line"><a name="l00635"></a><span class="lineno">  635</span>       <span class="keywordflow">if</span>(update){</div>
-<div class="line"><a name="l00636"></a><span class="lineno">  636</span>     <span class="keywordflow">if</span>(verbose_opt[0])</div>
-<div class="line"><a name="l00637"></a><span class="lineno">  637</span>       cout << <span class="stringliteral">"***update "</span> << relobsindex[obsindex] << <span class="stringliteral">" = "</span> << modindex << <span class="stringliteral">" "</span> << observation_opt[obsindex] << <span class="stringliteral">" ***"</span> << endl;</div>
-<div class="line"><a name="l00638"></a><span class="lineno">  638</span> </div>
-<div class="line"><a name="l00639"></a><span class="lineno">  639</span>     imgReaderObs.open(observation_opt[obsindex]);</div>
-<div class="line"><a name="l00640"></a><span class="lineno">  640</span>     imgReaderObs.getGeoTransform(geotransform);</div>
-<div class="line"><a name="l00641"></a><span class="lineno">  641</span>     imgReaderObs.setNoData(obsnodata_opt);</div>
-<div class="line"><a name="l00642"></a><span class="lineno">  642</span>     <span class="keywordflow">if</span>(obsoffset_opt.size())</div>
-<div class="line"><a name="l00643"></a><span class="lineno">  643</span>       imgReaderObs.setOffset(obsoffset_opt[0]);</div>
-<div class="line"><a name="l00644"></a><span class="lineno">  644</span>     <span class="keywordflow">if</span>(obsscale_opt.size())</div>
-<div class="line"><a name="l00645"></a><span class="lineno">  645</span>       imgReaderObs.setScale(obsscale_opt[0]);</div>
-<div class="line"><a name="l00646"></a><span class="lineno">  646</span>     <span class="comment">//calculate regression between model and observation</span></div>
-<div class="line"><a name="l00647"></a><span class="lineno">  647</span>     <span class="keywordflow">if</span>(verbose_opt[0])</div>
-<div class="line"><a name="l00648"></a><span class="lineno">  648</span>       cout << <span class="stringliteral">"Calculating regression for "</span> << imgReaderModel2.getFileName() << <span class="stringliteral">" "</span> << imgReaderObs.getFileName() << endl;</div>
-<div class="line"><a name="l00649"></a><span class="lineno">  649</span>     <span class="keywordflow">if</span>(regSensor_opt[0]>0)</div>
-<div class="line"><a name="l00650"></a><span class="lineno">  650</span>       errObs=regSensor_opt[0]*imgreg.getRMSE(imgReaderModel2,imgReaderObs,c0obs,c1obs,0,0,verbose_opt[0]);</div>
-<div class="line"><a name="l00651"></a><span class="lineno">  651</span>     <span class="keywordflow">else</span>{</div>
-<div class="line"><a name="l00652"></a><span class="lineno">  652</span>       c0obs=0;</div>
-<div class="line"><a name="l00653"></a><span class="lineno">  653</span>       c1obs=1;</div>
-<div class="line"><a name="l00654"></a><span class="lineno">  654</span>       errObs=0;</div>
-<div class="line"><a name="l00655"></a><span class="lineno">  655</span>     }</div>
-<div class="line"><a name="l00656"></a><span class="lineno">  656</span>     <span class="keywordflow">if</span>(verbose_opt[0])</div>
-<div class="line"><a name="l00657"></a><span class="lineno">  657</span>       cout << <span class="stringliteral">"c0obs, c1obs: "</span> << c0obs << <span class="stringliteral">", "</span> << c1obs << endl;</div>
-<div class="line"><a name="l00658"></a><span class="lineno">  658</span>       }</div>
-<div class="line"><a name="l00659"></a><span class="lineno">  659</span>       <span class="comment">//prediction (also to fill cloudy pixels in update mode)</span></div>
-<div class="line"><a name="l00660"></a><span class="lineno">  660</span>       <span class="keywordtype">string</span> input;</div>
-<div class="line"><a name="l00661"></a><span class="lineno">  661</span>       <span class="keywordflow">if</span>(outputfw_opt.size()==model_opt.size())</div>
-<div class="line"><a name="l00662"></a><span class="lineno">  662</span>     input=outputfw_opt[modindex-1];</div>
-<div class="line"><a name="l00663"></a><span class="lineno">  663</span>       <span class="keywordflow">else</span>{</div>
-<div class="line"><a name="l00664"></a><span class="lineno">  664</span>     ostringstream outputstream;</div>
-<div class="line"><a name="l00665"></a><span class="lineno">  665</span>     outputstream << outputfw_opt[0] << <span class="stringliteral">"_"</span>;</div>
-<div class="line"><a name="l00666"></a><span class="lineno">  666</span>     outputstream << setfill(<span class="charliteral">'0'</span>) << setw(ndigit) << tmodel_opt[modindex-1];</div>
-<div class="line"><a name="l00667"></a><span class="lineno">  667</span>     outputstream << <span class="stringliteral">".tif"</span>;</div>
-<div class="line"><a name="l00668"></a><span class="lineno">  668</span>     <span class="comment">// outputstream << outputfw_opt[0] << "_" << tmodel_opt[modindex-1] << ".tif";</span></div>
-<div class="line"><a name="l00669"></a><span class="lineno">  669</span>     input=outputstream.str();</div>
-<div class="line"><a name="l00670"></a><span class="lineno">  670</span>       }</div>
-<div class="line"><a name="l00671"></a><span class="lineno">  671</span>       <span class="keywordflow">if</span>(verbose_opt[0])</div>
-<div class="line"><a name="l00672"></a><span class="lineno">  672</span>     cout << <span class="stringliteral">"opening "</span> << input << endl;</div>
-<div class="line"><a name="l00673"></a><span class="lineno">  673</span>       <a class="code" href="classImgReaderGdal.html">ImgReaderGdal</a> imgReaderEst(input);</div>
-<div class="line"><a name="l00674"></a><span class="lineno">  674</span>       imgReaderEst.setNoData(obsnodata_opt);</div>
-<div class="line"><a name="l00675"></a><span class="lineno">  675</span>       <span class="keywordflow">if</span>(obsoffset_opt.size())</div>
-<div class="line"><a name="l00676"></a><span class="lineno">  676</span>     imgReaderEst.setOffset(obsoffset_opt[0]);</div>
-<div class="line"><a name="l00677"></a><span class="lineno">  677</span>       <span class="keywordflow">if</span>(obsscale_opt.size())</div>
-<div class="line"><a name="l00678"></a><span class="lineno">  678</span>     imgReaderEst.setScale(obsscale_opt[0]);</div>
-<div class="line"><a name="l00679"></a><span class="lineno">  679</span>       </div>
-<div class="line"><a name="l00680"></a><span class="lineno">  680</span>       vector< vector<double> > obsLineVector(down_opt[0]);</div>
-<div class="line"><a name="l00681"></a><span class="lineno">  681</span>       vector<double> obsLineBuffer;</div>
-<div class="line"><a name="l00682"></a><span class="lineno">  682</span>       vector<double> obsWindowBuffer;<span class="comment">//buffer for observation to calculate average corresponding to model pixel</span></div>
-<div class="line"><a name="l00683"></a><span class="lineno">  683</span>       vector<double> model1LineBuffer;</div>
-<div class="line"><a name="l00684"></a><span class="lineno">  684</span>       vector<double> model2LineBuffer;</div>
-<div class="line"><a name="l00685"></a><span class="lineno">  685</span>       vector<double> model1buffer;<span class="comment">//buffer for model 1 to calculate time regression based on window</span></div>
-<div class="line"><a name="l00686"></a><span class="lineno">  686</span>       vector<double> model2buffer;<span class="comment">//buffer for model 2 to calculate time regression based on window</span></div>
-<div class="line"><a name="l00687"></a><span class="lineno">  687</span>       vector<double> uncertObsLineBuffer;</div>
-<div class="line"><a name="l00688"></a><span class="lineno">  688</span>       vector<double> estReadBuffer;</div>
-<div class="line"><a name="l00689"></a><span class="lineno">  689</span>       <span class="comment">// vector<double> estWindowBuffer;//buffer for estimate to calculate average corresponding to model pixel</span></div>
-<div class="line"><a name="l00690"></a><span class="lineno">  690</span>       vector<double> uncertReadBuffer;</div>
-<div class="line"><a name="l00691"></a><span class="lineno">  691</span>       vector<double> estWriteBuffer(ncol);</div>
-<div class="line"><a name="l00692"></a><span class="lineno">  692</span>       vector<double> uncertWriteBuffer(ncol);</div>
-<div class="line"><a name="l00693"></a><span class="lineno">  693</span>       <span class="comment">// vector<double> lineMask;</span></div>
-<div class="line"><a name="l00694"></a><span class="lineno">  694</span> </div>
-<div class="line"><a name="l00695"></a><span class="lineno">  695</span>       <span class="comment">//initialize obsLineVector if update</span></div>
-<div class="line"><a name="l00696"></a><span class="lineno">  696</span>       <span class="keywordflow">if</span>(update){</div>
-<div class="line"><a name="l00697"></a><span class="lineno">  697</span>     <span class="keywordflow">if</span>(verbose_opt[0])</div>
-<div class="line"><a name="l00698"></a><span class="lineno">  698</span>       cout << <span class="stringliteral">"initialize obsLineVector"</span> << endl;</div>
-<div class="line"><a name="l00699"></a><span class="lineno">  699</span>     assert(down_opt[0]%2);<span class="comment">//window size must be odd </span></div>
-<div class="line"><a name="l00700"></a><span class="lineno">  700</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iline=-down_opt[0]/2;iline<down_opt[0]/2+1;++iline){</div>
-<div class="line"><a name="l00701"></a><span class="lineno">  701</span>       <span class="keywordflow">if</span>(iline<0)<span class="comment">//replicate line 0</span></div>
-<div class="line"><a name="l00702"></a><span class="lineno">  702</span>         imgReaderObs.readData(obsLineVector[iline+down_opt[0]/2],GDT_Float64,0,0);</div>
-<div class="line"><a name="l00703"></a><span class="lineno">  703</span>       <span class="keywordflow">else</span></div>
-<div class="line"><a name="l00704"></a><span class="lineno">  704</span>         imgReaderObs.readData(obsLineVector[iline+down_opt[0]/2],GDT_Float64,iline,0);</div>
-<div class="line"><a name="l00705"></a><span class="lineno">  705</span>     }</div>
-<div class="line"><a name="l00706"></a><span class="lineno">  706</span>       }</div>
-<div class="line"><a name="l00707"></a><span class="lineno">  707</span>       <span class="keywordflow">for</span>(<span class="keywordtype">int</span> irow=0;irow<imgWriterEst.nrOfRow();++irow){</div>
-<div class="line"><a name="l00708"></a><span class="lineno">  708</span>     <span class="comment">//do not read from imgReaderObs, because we read entire window for each pixel...</span></div>
-<div class="line"><a name="l00709"></a><span class="lineno">  709</span>     imgReaderEst.readData(estReadBuffer,GDT_Float64,irow,0);</div>
-<div class="line"><a name="l00710"></a><span class="lineno">  710</span>     imgReaderEst.readData(uncertReadBuffer,GDT_Float64,irow,1);</div>
-<div class="line"><a name="l00711"></a><span class="lineno">  711</span>     <span class="comment">//read model2 in case current estimate is nodata</span></div>
-<div class="line"><a name="l00712"></a><span class="lineno">  712</span>     imgReaderEst.image2geo(0,irow,geox,geoy);</div>
-<div class="line"><a name="l00713"></a><span class="lineno">  713</span>     imgReaderModel2.geo2image(geox,geoy,modCol,modRow);</div>
-<div class="line"><a name="l00714"></a><span class="lineno">  714</span>     assert(modRow>=0&&modRow<imgReaderModel2.nrOfRow());</div>
-<div class="line"><a name="l00715"></a><span class="lineno">  715</span>     imgReaderModel2.readData(model2LineBuffer,GDT_Float64,modRow,0);</div>
-<div class="line"><a name="l00716"></a><span class="lineno">  716</span> </div>
-<div class="line"><a name="l00717"></a><span class="lineno">  717</span>     imgReaderModel1.geo2image(geox,geoy,modCol,modRow);</div>
-<div class="line"><a name="l00718"></a><span class="lineno">  718</span>     assert(modRow>=0&&modRow<imgReaderModel1.nrOfRow());</div>
-<div class="line"><a name="l00719"></a><span class="lineno">  719</span>     imgReaderModel1.readData(model1LineBuffer,GDT_Float64,modRow,0);</div>
-<div class="line"><a name="l00720"></a><span class="lineno">  720</span> </div>
-<div class="line"><a name="l00721"></a><span class="lineno">  721</span>     <span class="keywordflow">if</span>(update){</div>
-<div class="line"><a name="l00722"></a><span class="lineno">  722</span>       <span class="keywordtype">int</span> maxRow=(irow+down_opt[0]/2<imgReaderEst.nrOfRow()) ? irow+down_opt[0]/2 : imgReaderEst.nrOfRow()-1;</div>
-<div class="line"><a name="l00723"></a><span class="lineno">  723</span>       obsLineVector.erase(obsLineVector.begin());</div>
-<div class="line"><a name="l00724"></a><span class="lineno">  724</span>       imgReaderObs.readData(obsLineBuffer,GDT_Float64,maxRow,0);</div>
-<div class="line"><a name="l00725"></a><span class="lineno">  725</span>       obsLineVector.push_back(obsLineBuffer);</div>
-<div class="line"><a name="l00726"></a><span class="lineno">  726</span>       obsLineBuffer=obsLineVector[down_opt[0]/2];</div>
-<div class="line"><a name="l00727"></a><span class="lineno">  727</span>       <span class="comment">// imgReaderObs.readData(obsLineBuffer,GDT_Float64,irow,0);</span></div>
-<div class="line"><a name="l00728"></a><span class="lineno">  728</span>       <span class="keywordflow">if</span>(imgReaderObs.nrOfBand()>1)</div>
-<div class="line"><a name="l00729"></a><span class="lineno">  729</span>         imgReaderObs.readData(uncertObsLineBuffer,GDT_Float64,irow,1);</div>
-<div class="line"><a name="l00730"></a><span class="lineno">  730</span>     }</div>
-<div class="line"><a name="l00731"></a><span class="lineno">  731</span>     <span class="comment">// double oldRowMask=-1;//keep track of row mask to optimize number of line readings</span></div>
-<div class="line"><a name="l00732"></a><span class="lineno">  732</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> icol=0;icol<imgWriterEst.nrOfCol();++icol){</div>
-<div class="line"><a name="l00733"></a><span class="lineno">  733</span>       imgReaderEst.image2geo(icol,irow,geox,geoy);</div>
-<div class="line"><a name="l00734"></a><span class="lineno">  734</span>       <span class="keywordtype">int</span> minCol=(icol>down_opt[0]/2) ? icol-down_opt[0]/2 : 0;</div>
-<div class="line"><a name="l00735"></a><span class="lineno">  735</span>       <span class="keywordtype">int</span> maxCol=(icol+down_opt[0]/2<imgReaderEst.nrOfCol()) ? icol+down_opt[0]/2 : imgReaderEst.nrOfCol()-1;</div>
-<div class="line"><a name="l00736"></a><span class="lineno">  736</span>       <span class="keywordtype">int</span> minRow=(irow>down_opt[0]/2) ? irow-down_opt[0]/2 : 0;</div>
-<div class="line"><a name="l00737"></a><span class="lineno">  737</span>       <span class="keywordtype">int</span> maxRow=(irow+down_opt[0]/2<imgReaderEst.nrOfRow()) ? irow+down_opt[0]/2 : imgReaderEst.nrOfRow()-1;</div>
-<div class="line"><a name="l00738"></a><span class="lineno">  738</span>       <span class="keywordflow">if</span>(update){</div>
-<div class="line"><a name="l00739"></a><span class="lineno">  739</span>         obsWindowBuffer.clear();</div>
-<div class="line"><a name="l00740"></a><span class="lineno">  740</span>         <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iline=0;iline<obsLineVector.size();++iline){</div>
-<div class="line"><a name="l00741"></a><span class="lineno">  741</span>           <span class="keywordflow">for</span>(<span class="keywordtype">int</span> isample=minCol;isample<=maxCol;++isample){</div>
-<div class="line"><a name="l00742"></a><span class="lineno">  742</span>         assert(isample<obsLineVector[iline].size());</div>
-<div class="line"><a name="l00743"></a><span class="lineno">  743</span>         obsWindowBuffer.push_back(obsLineVector[iline][isample]);</div>
-<div class="line"><a name="l00744"></a><span class="lineno">  744</span>           }</div>
+<div class="line"><a name="l00570"></a><span class="lineno">  570</span>       <span class="keywordflow">if</span>(update){</div>
+<div class="line"><a name="l00571"></a><span class="lineno">  571</span>     <span class="keywordflow">if</span>(verbose_opt[0])</div>
+<div class="line"><a name="l00572"></a><span class="lineno">  572</span>       cout << <span class="stringliteral">"***update "</span> << relobsindex[obsindex] << <span class="stringliteral">" = "</span> << modindex << <span class="stringliteral">" "</span> << observation_opt[obsindex] << <span class="stringliteral">" ***"</span> << endl;</div>
+<div class="line"><a name="l00573"></a><span class="lineno">  573</span> </div>
+<div class="line"><a name="l00574"></a><span class="lineno">  574</span>     imgReaderObs.open(observation_opt[obsindex]);</div>
+<div class="line"><a name="l00575"></a><span class="lineno">  575</span>     imgReaderObs.getGeoTransform(geotransform);</div>
+<div class="line"><a name="l00576"></a><span class="lineno">  576</span>     imgReaderObs.setNoData(obsnodata_opt);</div>
+<div class="line"><a name="l00577"></a><span class="lineno">  577</span>       }</div>
+<div class="line"><a name="l00578"></a><span class="lineno">  578</span>       <span class="comment">//prediction (also to fill cloudy pixels in measurement update mode)</span></div>
+<div class="line"><a name="l00579"></a><span class="lineno">  579</span>       <span class="keywordtype">string</span> input;</div>
+<div class="line"><a name="l00580"></a><span class="lineno">  580</span>       <span class="keywordflow">if</span>(outputfw_opt.size()==model_opt.size())</div>
+<div class="line"><a name="l00581"></a><span class="lineno">  581</span>     input=outputfw_opt[modindex-1];</div>
+<div class="line"><a name="l00582"></a><span class="lineno">  582</span>       <span class="keywordflow">else</span>{</div>
+<div class="line"><a name="l00583"></a><span class="lineno">  583</span>     ostringstream outputstream;</div>
+<div class="line"><a name="l00584"></a><span class="lineno">  584</span>     outputstream << outputfw_opt[0] << <span class="stringliteral">"_"</span>;</div>
+<div class="line"><a name="l00585"></a><span class="lineno">  585</span>     outputstream << setfill(<span class="charliteral">'0'</span>) << setw(ndigit) << tmodel_opt[modindex-1];</div>
+<div class="line"><a name="l00586"></a><span class="lineno">  586</span>     outputstream << <span class="stringliteral">".tif"</span>;</div>
+<div class="line"><a name="l00587"></a><span class="lineno">  587</span>     <span class="comment">// outputstream << outputfw_opt[0] << "_" << tmodel_opt[modindex-1] << ".tif";</span></div>
+<div class="line"><a name="l00588"></a><span class="lineno">  588</span>     input=outputstream.str();</div>
+<div class="line"><a name="l00589"></a><span class="lineno">  589</span>       }</div>
+<div class="line"><a name="l00590"></a><span class="lineno">  590</span>       <span class="keywordflow">if</span>(verbose_opt[0])</div>
+<div class="line"><a name="l00591"></a><span class="lineno">  591</span>     cout << <span class="stringliteral">"opening "</span> << input << endl;</div>
+<div class="line"><a name="l00592"></a><span class="lineno">  592</span>       <a class="code" href="classImgReaderGdal.html">ImgReaderGdal</a> imgReaderEst(input);</div>
+<div class="line"><a name="l00593"></a><span class="lineno">  593</span>       imgReaderEst.setNoData(obsnodata_opt);</div>
+<div class="line"><a name="l00594"></a><span class="lineno">  594</span> </div>
+<div class="line"><a name="l00595"></a><span class="lineno">  595</span>       vector< vector<double> > obsLineVector(down_opt[0]);</div>
+<div class="line"><a name="l00596"></a><span class="lineno">  596</span>       vector<double> obsLineBuffer;</div>
+<div class="line"><a name="l00597"></a><span class="lineno">  597</span>       vector<double> obsWindowBuffer;<span class="comment">//buffer for observation to calculate average corresponding to model pixel</span></div>
+<div class="line"><a name="l00598"></a><span class="lineno">  598</span>       vector<double> model1LineBuffer;</div>
+<div class="line"><a name="l00599"></a><span class="lineno">  599</span>       vector<double> model2LineBuffer;</div>
+<div class="line"><a name="l00600"></a><span class="lineno">  600</span>       vector<double> model1buffer;<span class="comment">//buffer for model 1 to calculate time regression based on window</span></div>
+<div class="line"><a name="l00601"></a><span class="lineno">  601</span>       vector<double> model2buffer;<span class="comment">//buffer for model 2 to calculate time regression based on window</span></div>
+<div class="line"><a name="l00602"></a><span class="lineno">  602</span>       vector<double> uncertObsLineBuffer;</div>
+<div class="line"><a name="l00603"></a><span class="lineno">  603</span>       vector< vector<double> > estLineVector(down_opt[0]);</div>
+<div class="line"><a name="l00604"></a><span class="lineno">  604</span>       vector<double> estLineBuffer;</div>
+<div class="line"><a name="l00605"></a><span class="lineno">  605</span>       vector<double> estWindowBuffer;<span class="comment">//buffer for estimate to calculate average corresponding to model pixel</span></div>
+<div class="line"><a name="l00606"></a><span class="lineno">  606</span>       vector<double> uncertReadBuffer;</div>
+<div class="line"><a name="l00607"></a><span class="lineno">  607</span>       vector<double> estWriteBuffer(ncol);</div>
+<div class="line"><a name="l00608"></a><span class="lineno">  608</span>       vector<double> uncertWriteBuffer(ncol);</div>
+<div class="line"><a name="l00609"></a><span class="lineno">  609</span>       vector<double> gainWriteBuffer(ncol);</div>
+<div class="line"><a name="l00610"></a><span class="lineno">  610</span> </div>
+<div class="line"><a name="l00611"></a><span class="lineno">  611</span>       <span class="comment">//initialize obsLineVector if update</span></div>
+<div class="line"><a name="l00612"></a><span class="lineno">  612</span>       <span class="keywordflow">if</span>(update){</div>
+<div class="line"><a name="l00613"></a><span class="lineno">  613</span>     <span class="keywordflow">if</span>(verbose_opt[0])</div>
+<div class="line"><a name="l00614"></a><span class="lineno">  614</span>       cout << <span class="stringliteral">"initialize obsLineVector"</span> << endl;</div>
+<div class="line"><a name="l00615"></a><span class="lineno">  615</span>     assert(down_opt[0]%2);<span class="comment">//window size must be odd </span></div>
+<div class="line"><a name="l00616"></a><span class="lineno">  616</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iline=-down_opt[0]/2;iline<down_opt[0]/2+1;++iline){</div>
+<div class="line"><a name="l00617"></a><span class="lineno">  617</span>       <span class="keywordflow">if</span>(iline<0)<span class="comment">//replicate line 0</span></div>
+<div class="line"><a name="l00618"></a><span class="lineno">  618</span>         imgReaderObs.readData(obsLineVector[iline+down_opt[0]/2],GDT_Float64,0,0);</div>
+<div class="line"><a name="l00619"></a><span class="lineno">  619</span>       <span class="keywordflow">else</span></div>
+<div class="line"><a name="l00620"></a><span class="lineno">  620</span>         imgReaderObs.readData(obsLineVector[iline+down_opt[0]/2],GDT_Float64,iline,0);</div>
+<div class="line"><a name="l00621"></a><span class="lineno">  621</span>     }</div>
+<div class="line"><a name="l00622"></a><span class="lineno">  622</span>       }</div>
+<div class="line"><a name="l00623"></a><span class="lineno">  623</span>       <span class="comment">//initialize estLineVector</span></div>
+<div class="line"><a name="l00624"></a><span class="lineno">  624</span>       <span class="keywordflow">if</span>(verbose_opt[0])</div>
+<div class="line"><a name="l00625"></a><span class="lineno">  625</span>     cout << <span class="stringliteral">"initialize estLineVector"</span> << endl;</div>
+<div class="line"><a name="l00626"></a><span class="lineno">  626</span>       assert(down_opt[0]%2);<span class="comment">//window size must be odd </span></div>
+<div class="line"><a name="l00627"></a><span class="lineno">  627</span>       <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iline=-down_opt[0]/2;iline<down_opt[0]/2+1;++iline){</div>
+<div class="line"><a name="l00628"></a><span class="lineno">  628</span>     <span class="keywordflow">if</span>(iline<0)<span class="comment">//replicate line 0</span></div>
+<div class="line"><a name="l00629"></a><span class="lineno">  629</span>       imgReaderEst.readData(estLineVector[iline+down_opt[0]/2],GDT_Float64,0,0);</div>
+<div class="line"><a name="l00630"></a><span class="lineno">  630</span>     <span class="keywordflow">else</span></div>
+<div class="line"><a name="l00631"></a><span class="lineno">  631</span>       imgReaderEst.readData(estLineVector[iline+down_opt[0]/2],GDT_Float64,iline,0);</div>
+<div class="line"><a name="l00632"></a><span class="lineno">  632</span>       }</div>
+<div class="line"><a name="l00633"></a><span class="lineno">  633</span>       <a class="code" href="classstatfactory_1_1StatFactory.html">statfactory::StatFactory</a> statobs;</div>
+<div class="line"><a name="l00634"></a><span class="lineno">  634</span>       statobs.setNoDataValues(obsnodata_opt);</div>
+<div class="line"><a name="l00635"></a><span class="lineno">  635</span> </div>
+<div class="line"><a name="l00636"></a><span class="lineno">  636</span>       <span class="keywordflow">for</span>(<span class="keywordtype">int</span> jrow=0;jrow<nrow;jrow+=down_opt[0]){</div>
+<div class="line"><a name="l00637"></a><span class="lineno">  637</span>     <span class="comment">//todo: read entire window for uncertReadBuffer...</span></div>
+<div class="line"><a name="l00638"></a><span class="lineno">  638</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> irow=jrow;irow<jrow+down_opt[0];++irow){</div>
+<div class="line"><a name="l00639"></a><span class="lineno">  639</span>       imgReaderEst.readData(uncertReadBuffer,GDT_Float64,irow,1);</div>
+<div class="line"><a name="l00640"></a><span class="lineno">  640</span>       imgReaderEst.image2geo(0,irow,geox,geoy);</div>
+<div class="line"><a name="l00641"></a><span class="lineno">  641</span>       imgReaderModel2.geo2image(geox,geoy,modCol,modRow);</div>
+<div class="line"><a name="l00642"></a><span class="lineno">  642</span>       assert(modRow>=0&&modRow<imgReaderModel2.nrOfRow());</div>
+<div class="line"><a name="l00643"></a><span class="lineno">  643</span>       imgReaderModel2.readData(model2LineBuffer,GDT_Float64,modRow,0,theResample);</div>
+<div class="line"><a name="l00644"></a><span class="lineno">  644</span> </div>
+<div class="line"><a name="l00645"></a><span class="lineno">  645</span>       imgReaderModel1.geo2image(geox,geoy,modCol,modRow);</div>
+<div class="line"><a name="l00646"></a><span class="lineno">  646</span>       assert(modRow>=0&&modRow<imgReaderModel1.nrOfRow());</div>
+<div class="line"><a name="l00647"></a><span class="lineno">  647</span>       imgReaderModel1.readData(model1LineBuffer,GDT_Float64,modRow,0,theResample);</div>
+<div class="line"><a name="l00648"></a><span class="lineno">  648</span> </div>
+<div class="line"><a name="l00649"></a><span class="lineno">  649</span>       <span class="keywordtype">int</span> maxRow=(irow+down_opt[0]/2<imgReaderEst.nrOfRow()) ? irow+down_opt[0]/2 : imgReaderEst.nrOfRow()-1;</div>
+<div class="line"><a name="l00650"></a><span class="lineno">  650</span>       estLineVector.erase(estLineVector.begin());</div>
+<div class="line"><a name="l00651"></a><span class="lineno">  651</span>       imgReaderEst.readData(estLineBuffer,GDT_Float64,maxRow,0);</div>
+<div class="line"><a name="l00652"></a><span class="lineno">  652</span>       estLineVector.push_back(estLineBuffer);</div>
+<div class="line"><a name="l00653"></a><span class="lineno">  653</span>       estLineBuffer=estLineVector[down_opt[0]/2];</div>
+<div class="line"><a name="l00654"></a><span class="lineno">  654</span> </div>
+<div class="line"><a name="l00655"></a><span class="lineno">  655</span>       <span class="keywordflow">if</span>(update){</div>
+<div class="line"><a name="l00656"></a><span class="lineno">  656</span>         <span class="keywordtype">int</span> maxRow=(irow+down_opt[0]/2<imgReaderObs.nrOfRow()) ? irow+down_opt[0]/2 : imgReaderObs.nrOfRow()-1;</div>
+<div class="line"><a name="l00657"></a><span class="lineno">  657</span>         obsLineVector.erase(obsLineVector.begin());</div>
+<div class="line"><a name="l00658"></a><span class="lineno">  658</span>         imgReaderObs.readData(obsLineBuffer,GDT_Float64,maxRow,0);</div>
+<div class="line"><a name="l00659"></a><span class="lineno">  659</span>         obsLineVector.push_back(obsLineBuffer);</div>
+<div class="line"><a name="l00660"></a><span class="lineno">  660</span>         obsLineBuffer=obsLineVector[down_opt[0]/2];</div>
+<div class="line"><a name="l00661"></a><span class="lineno">  661</span>         <span class="comment">// imgReaderObs.readData(obsLineBuffer,GDT_Float64,irow,0);</span></div>
+<div class="line"><a name="l00662"></a><span class="lineno">  662</span>         <span class="keywordflow">if</span>(imgReaderObs.nrOfBand()>1)</div>
+<div class="line"><a name="l00663"></a><span class="lineno">  663</span>           imgReaderObs.readData(uncertObsLineBuffer,GDT_Float64,irow,1);</div>
+<div class="line"><a name="l00664"></a><span class="lineno">  664</span>       }</div>
+<div class="line"><a name="l00665"></a><span class="lineno">  665</span>       <span class="keywordflow">for</span>(<span class="keywordtype">int</span> jcol=0;jcol<ncol;jcol+=down_opt[0]){</div>
+<div class="line"><a name="l00666"></a><span class="lineno">  666</span>         <span class="keywordflow">for</span>(<span class="keywordtype">int</span> icol=jcol;icol<jcol+down_opt[0];++icol){</div>
+<div class="line"><a name="l00667"></a><span class="lineno">  667</span>           imgReaderEst.image2geo(icol,irow,geox,geoy);</div>
+<div class="line"><a name="l00668"></a><span class="lineno">  668</span>           <span class="keywordtype">int</span> minCol=(icol>down_opt[0]/2) ? icol-down_opt[0]/2 : 0;</div>
+<div class="line"><a name="l00669"></a><span class="lineno">  669</span>           <span class="keywordtype">int</span> maxCol=(icol+down_opt[0]/2<imgReaderEst.nrOfCol()) ? icol+down_opt[0]/2 : imgReaderEst.nrOfCol()-1;</div>
+<div class="line"><a name="l00670"></a><span class="lineno">  670</span>           <span class="keywordtype">int</span> minRow=(irow>down_opt[0]/2) ? irow-down_opt[0]/2 : 0;</div>
+<div class="line"><a name="l00671"></a><span class="lineno">  671</span>           <span class="keywordtype">int</span> maxRow=(irow+down_opt[0]/2<imgReaderEst.nrOfRow()) ? irow+down_opt[0]/2 : imgReaderEst.nrOfRow()-1;</div>
+<div class="line"><a name="l00672"></a><span class="lineno">  672</span>           estWindowBuffer.clear();</div>
+<div class="line"><a name="l00673"></a><span class="lineno">  673</span>           <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iline=0;iline<estLineVector.size();++iline){</div>
+<div class="line"><a name="l00674"></a><span class="lineno">  674</span>         <span class="keywordflow">for</span>(<span class="keywordtype">int</span> isample=minCol;isample<=maxCol;++isample){</div>
+<div class="line"><a name="l00675"></a><span class="lineno">  675</span>           assert(isample<estLineVector[iline].size());</div>
+<div class="line"><a name="l00676"></a><span class="lineno">  676</span>           estWindowBuffer.push_back(estLineVector[iline][isample]);</div>
+<div class="line"><a name="l00677"></a><span class="lineno">  677</span>         }</div>
+<div class="line"><a name="l00678"></a><span class="lineno">  678</span>           }</div>
+<div class="line"><a name="l00679"></a><span class="lineno">  679</span>           <span class="keywordflow">if</span>(update){</div>
+<div class="line"><a name="l00680"></a><span class="lineno">  680</span>         obsWindowBuffer.clear();</div>
+<div class="line"><a name="l00681"></a><span class="lineno">  681</span>         <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iline=0;iline<obsLineVector.size();++iline){</div>
+<div class="line"><a name="l00682"></a><span class="lineno">  682</span>           <span class="keywordflow">for</span>(<span class="keywordtype">int</span> isample=minCol;isample<=maxCol;++isample){</div>
+<div class="line"><a name="l00683"></a><span class="lineno">  683</span>             assert(isample<obsLineVector[iline].size());</div>
+<div class="line"><a name="l00684"></a><span class="lineno">  684</span>             obsWindowBuffer.push_back(obsLineVector[iline][isample]);</div>
+<div class="line"><a name="l00685"></a><span class="lineno">  685</span>           }</div>
+<div class="line"><a name="l00686"></a><span class="lineno">  686</span>         }</div>
+<div class="line"><a name="l00687"></a><span class="lineno">  687</span>           }</div>
+<div class="line"><a name="l00688"></a><span class="lineno">  688</span>           <span class="keywordtype">double</span> estValue=estLineBuffer[icol];</div>
+<div class="line"><a name="l00689"></a><span class="lineno">  689</span>           imgReaderModel1.geo2image(geox,geoy,modCol,modRow);</div>
+<div class="line"><a name="l00690"></a><span class="lineno">  690</span>           assert(modRow>=0&&modRow<imgReaderModel2.nrOfRow());</div>
+<div class="line"><a name="l00691"></a><span class="lineno">  691</span>           lowerCol=modCol-0.5;</div>
+<div class="line"><a name="l00692"></a><span class="lineno">  692</span>           lowerCol=<span class="keyword">static_cast<</span><span class="keywordtype">int</span><span class="keyword">></span>(lowerCol);</div>
+<div class="line"><a name="l00693"></a><span class="lineno">  693</span>           upperCol=modCol+0.5;</div>
+<div class="line"><a name="l00694"></a><span class="lineno">  694</span>           upperCol=<span class="keyword">static_cast<</span><span class="keywordtype">int</span><span class="keyword">></span>(upperCol);</div>
+<div class="line"><a name="l00695"></a><span class="lineno">  695</span>           <span class="keywordflow">if</span>(lowerCol<0)</div>
+<div class="line"><a name="l00696"></a><span class="lineno">  696</span>         lowerCol=0;</div>
+<div class="line"><a name="l00697"></a><span class="lineno">  697</span>           <span class="keywordflow">if</span>(upperCol>=imgReaderModel1.nrOfCol())</div>
+<div class="line"><a name="l00698"></a><span class="lineno">  698</span>         upperCol=imgReaderModel1.nrOfCol()-1;</div>
+<div class="line"><a name="l00699"></a><span class="lineno">  699</span>           <span class="keywordtype">double</span> modValue1=(modCol-0.5-lowerCol)*model1LineBuffer[upperCol]+(1-modCol+0.5+lowerCol)*model1LineBuffer[lowerCol];</div>
+<div class="line"><a name="l00700"></a><span class="lineno">  700</span>           <span class="comment">// double modValue1=model1LineBuffer[modCol];</span></div>
+<div class="line"><a name="l00701"></a><span class="lineno">  701</span>           imgReaderModel2.geo2image(geox,geoy,modCol,modRow);</div>
+<div class="line"><a name="l00702"></a><span class="lineno">  702</span>           assert(modRow>=0&&modRow<imgReaderModel2.nrOfRow());</div>
+<div class="line"><a name="l00703"></a><span class="lineno">  703</span>           lowerCol=modCol-0.5;</div>
+<div class="line"><a name="l00704"></a><span class="lineno">  704</span>           lowerCol=<span class="keyword">static_cast<</span><span class="keywordtype">int</span><span class="keyword">></span>(lowerCol);</div>
+<div class="line"><a name="l00705"></a><span class="lineno">  705</span>           upperCol=modCol+0.5;</div>
+<div class="line"><a name="l00706"></a><span class="lineno">  706</span>           upperCol=<span class="keyword">static_cast<</span><span class="keywordtype">int</span><span class="keyword">></span>(upperCol);</div>
+<div class="line"><a name="l00707"></a><span class="lineno">  707</span>           <span class="keywordflow">if</span>(lowerCol<0)</div>
+<div class="line"><a name="l00708"></a><span class="lineno">  708</span>         lowerCol=0;</div>
+<div class="line"><a name="l00709"></a><span class="lineno">  709</span>           <span class="keywordflow">if</span>(upperCol>=imgReaderModel1.nrOfCol())</div>
+<div class="line"><a name="l00710"></a><span class="lineno">  710</span>         upperCol=imgReaderModel1.nrOfCol()-1;</div>
+<div class="line"><a name="l00711"></a><span class="lineno">  711</span>           <span class="keywordtype">double</span> modValue2=(modCol-0.5-lowerCol)*model2LineBuffer[upperCol]+(1-modCol+0.5+lowerCol)*model2LineBuffer[lowerCol];</div>
+<div class="line"><a name="l00712"></a><span class="lineno">  712</span>           <span class="comment">// double modValue2=model2LineBuffer[modCol];</span></div>
+<div class="line"><a name="l00713"></a><span class="lineno">  713</span>           <span class="keywordflow">if</span>(imgReaderEst.isNoData(estValue)){</div>
+<div class="line"><a name="l00714"></a><span class="lineno">  714</span>         <span class="comment">//we have not found any valid data yet, better here to take the current model value if valid</span></div>
+<div class="line"><a name="l00715"></a><span class="lineno">  715</span>         <span class="keywordflow">if</span>(imgReaderModel2.isNoData(modValue2)){<span class="comment">//if both estimate and model are no-data, set obs to nodata</span></div>
+<div class="line"><a name="l00716"></a><span class="lineno">  716</span>           estWriteBuffer[icol]=obsnodata_opt[0];</div>
+<div class="line"><a name="l00717"></a><span class="lineno">  717</span>           uncertWriteBuffer[icol]=uncertNodata_opt[0];</div>
+<div class="line"><a name="l00718"></a><span class="lineno">  718</span>           gainWriteBuffer[icol]=0;</div>
+<div class="line"><a name="l00719"></a><span class="lineno">  719</span>         }</div>
+<div class="line"><a name="l00720"></a><span class="lineno">  720</span>         <span class="keywordflow">else</span>{</div>
+<div class="line"><a name="l00721"></a><span class="lineno">  721</span>           estWriteBuffer[icol]=modValue2;</div>
+<div class="line"><a name="l00722"></a><span class="lineno">  722</span>           <span class="keywordflow">if</span>(obsmin_opt.size()){</div>
+<div class="line"><a name="l00723"></a><span class="lineno">  723</span>             <span class="keywordflow">if</span>(estWriteBuffer[icol]<obsmin_opt[0])</div>
+<div class="line"><a name="l00724"></a><span class="lineno">  724</span>               estWriteBuffer[icol]=obsmin_opt[0];</div>
+<div class="line"><a name="l00725"></a><span class="lineno">  725</span>           }</div>
+<div class="line"><a name="l00726"></a><span class="lineno">  726</span>           <span class="keywordflow">if</span>(obsmax_opt.size()){</div>
+<div class="line"><a name="l00727"></a><span class="lineno">  727</span>             <span class="keywordflow">if</span>(estWriteBuffer[icol]>obsmax_opt[0])</div>
+<div class="line"><a name="l00728"></a><span class="lineno">  728</span>               estWriteBuffer[icol]=obsmax_opt[0];</div>
+<div class="line"><a name="l00729"></a><span class="lineno">  729</span>           }</div>
+<div class="line"><a name="l00730"></a><span class="lineno">  730</span>           uncertWriteBuffer[icol]=uncertModel_opt[0]*stdDev*stdDev;</div>
+<div class="line"><a name="l00731"></a><span class="lineno">  731</span>           gainWriteBuffer[icol]=0;</div>
+<div class="line"><a name="l00732"></a><span class="lineno">  732</span>         }</div>
+<div class="line"><a name="l00733"></a><span class="lineno">  733</span>           }</div>
+<div class="line"><a name="l00734"></a><span class="lineno">  734</span>           <span class="keywordflow">else</span>{<span class="comment">//previous estimate is valid</span></div>
+<div class="line"><a name="l00735"></a><span class="lineno">  735</span>         <span class="keywordtype">double</span> estMeanValue=statobs.mean(estWindowBuffer);</div>
+<div class="line"><a name="l00736"></a><span class="lineno">  736</span>         <span class="keywordtype">double</span> nvalid=0;</div>
+<div class="line"><a name="l00737"></a><span class="lineno">  737</span>         <span class="comment">//time update</span></div>
+<div class="line"><a name="l00738"></a><span class="lineno">  738</span>         <span class="keywordtype">double</span> processNoiseVariance=processNoise_opt[0];</div>
+<div class="line"><a name="l00739"></a><span class="lineno">  739</span>         <span class="comment">//todo: estimate process noise variance expressing instability of weights over time</span></div>
+<div class="line"><a name="l00740"></a><span class="lineno">  740</span>         <span class="comment">//estimate stability of weight distribution from model (low resolution) data in a window mod1 -> mod2 and assume distribution holds at fine spatial resolution. </span></div>
+<div class="line"><a name="l00741"></a><span class="lineno">  741</span> </div>
+<div class="line"><a name="l00742"></a><span class="lineno">  742</span>         <span class="keywordflow">if</span>(imgReaderModel1.isNoData(modValue1)||imgReaderModel2.isNoData(modValue2)){</div>
+<div class="line"><a name="l00743"></a><span class="lineno">  743</span>           estWriteBuffer[icol]=estValue;</div>
+<div class="line"><a name="l00744"></a><span class="lineno">  744</span>           uncertWriteBuffer[icol]=uncertReadBuffer[icol]+processNoiseVariance;</div>
 <div class="line"><a name="l00745"></a><span class="lineno">  745</span>         }</div>
-<div class="line"><a name="l00746"></a><span class="lineno">  746</span>         <span class="comment">// imgReaderObs.readDataBlock(obsWindowBuffer,GDT_Float64,minCol,maxCol,minRow,maxRow,0);</span></div>
-<div class="line"><a name="l00747"></a><span class="lineno">  747</span>       }</div>
-<div class="line"><a name="l00748"></a><span class="lineno">  748</span>       <span class="keywordtype">double</span> estValue=estReadBuffer[icol];</div>
-<div class="line"><a name="l00749"></a><span class="lineno">  749</span>       <span class="keywordtype">double</span> estMeanValue=0;<span class="comment">//stat.mean(estWindowBuffer);</span></div>
-<div class="line"><a name="l00750"></a><span class="lineno">  750</span>       <span class="keywordtype">double</span> nvalid=0;</div>
-<div class="line"><a name="l00751"></a><span class="lineno">  751</span>       <span class="comment">//time update</span></div>
-<div class="line"><a name="l00752"></a><span class="lineno">  752</span>       imgReaderModel2.geo2image(geox,geoy,modCol,modRow);</div>
-<div class="line"><a name="l00753"></a><span class="lineno">  753</span>       assert(modRow>=0&&modRow<imgReaderModel2.nrOfRow());</div>
-<div class="line"><a name="l00754"></a><span class="lineno">  754</span>       <span class="keywordtype">double</span> modValue=model2LineBuffer[modCol];</div>
-<div class="line"><a name="l00755"></a><span class="lineno">  755</span>       <span class="keywordtype">bool</span> estNodata=imgReaderEst.isNoData(estValue);<span class="comment">//validity of current estimate</span></div>
-<div class="line"><a name="l00756"></a><span class="lineno">  756</span>       <span class="keywordflow">if</span>(estNodata){</div>
-<div class="line"><a name="l00757"></a><span class="lineno">  757</span>         <span class="comment">//we have not found any valid data yet, better here to take the current model value if valid</span></div>
-<div class="line"><a name="l00758"></a><span class="lineno">  758</span>         <span class="keywordflow">if</span>(imgReaderModel2.isNoData(modValue)){<span class="comment">//if both estimate and model are no-data, set obs to nodata</span></div>
-<div class="line"><a name="l00759"></a><span class="lineno">  759</span>           estWriteBuffer[icol]=obsnodata_opt[0];</div>
-<div class="line"><a name="l00760"></a><span class="lineno">  760</span>           uncertWriteBuffer[icol]=uncertNodata_opt[0];</div>
-<div class="line"><a name="l00761"></a><span class="lineno">  761</span>         }</div>
-<div class="line"><a name="l00762"></a><span class="lineno">  762</span>         <span class="keywordflow">else</span>{</div>
-<div class="line"><a name="l00763"></a><span class="lineno">  763</span>           estWriteBuffer[icol]=modValue;</div>
-<div class="line"><a name="l00764"></a><span class="lineno">  764</span>           uncertWriteBuffer[icol]=uncertModel_opt[0]*stdDev;</div>
-<div class="line"><a name="l00765"></a><span class="lineno">  765</span>         }</div>
-<div class="line"><a name="l00766"></a><span class="lineno">  766</span>       }   </div>
-<div class="line"><a name="l00767"></a><span class="lineno">  767</span>       <span class="keywordflow">else</span>{</div>
-<div class="line"><a name="l00768"></a><span class="lineno">  768</span>         <span class="keywordflow">if</span>(window_opt[0]>0){</div>
-<div class="line"><a name="l00769"></a><span class="lineno">  769</span>           <span class="keywordflow">try</span>{</div>
-<div class="line"><a name="l00770"></a><span class="lineno">  770</span>         <span class="comment">// imgReaderModel2.geo2image(geox,geoy,modCol,modRow);//did that already</span></div>
-<div class="line"><a name="l00771"></a><span class="lineno">  771</span>         minCol=(modCol>window_opt[0]/2) ? modCol-window_opt[0]/2 : 0;</div>
-<div class="line"><a name="l00772"></a><span class="lineno">  772</span>         maxCol=(modCol+window_opt[0]/2<imgReaderModel2.nrOfCol()) ? modCol+window_opt[0]/2 : imgReaderModel2.nrOfCol()-1;</div>
-<div class="line"><a name="l00773"></a><span class="lineno">  773</span>         minRow=(modRow>window_opt[0]/2) ? modRow-window_opt[0]/2 : 0;</div>
-<div class="line"><a name="l00774"></a><span class="lineno">  774</span>         maxRow=(modRow+window_opt[0]/2<imgReaderModel2.nrOfRow()) ? modRow+window_opt[0]/2 : imgReaderModel2.nrOfRow()-1;</div>
-<div class="line"><a name="l00775"></a><span class="lineno">  775</span>         imgReaderModel2.readDataBlock(model2buffer,GDT_Float64,minCol,maxCol,minRow,maxRow,0);</div>
+<div class="line"><a name="l00746"></a><span class="lineno">  746</span>         <span class="keywordflow">else</span>{<span class="comment">//model is good</span></div>
+<div class="line"><a name="l00747"></a><span class="lineno">  747</span>           <span class="keywordtype">double</span> modRatio=modValue2/modValue1;<span class="comment">//transition matrix A in Kalman equations</span></div>
+<div class="line"><a name="l00748"></a><span class="lineno">  748</span>           estWriteBuffer[icol]=estValue*modRatio;</div>
+<div class="line"><a name="l00749"></a><span class="lineno">  749</span>           uncertWriteBuffer[icol]=uncertReadBuffer[icol]*modRatio*modRatio+processNoiseVariance;</div>
+<div class="line"><a name="l00750"></a><span class="lineno">  750</span>         }</div>
+<div class="line"><a name="l00751"></a><span class="lineno">  751</span>         <span class="keywordflow">if</span>(obsmin_opt.size()){</div>
+<div class="line"><a name="l00752"></a><span class="lineno">  752</span>           <span class="keywordflow">if</span>(estWriteBuffer[icol]<obsmin_opt[0])</div>
+<div class="line"><a name="l00753"></a><span class="lineno">  753</span>             estWriteBuffer[icol]=obsmin_opt[0];</div>
+<div class="line"><a name="l00754"></a><span class="lineno">  754</span>         }</div>
+<div class="line"><a name="l00755"></a><span class="lineno">  755</span>         <span class="keywordflow">if</span>(obsmax_opt.size()){</div>
+<div class="line"><a name="l00756"></a><span class="lineno">  756</span>           <span class="keywordflow">if</span>(estWriteBuffer[icol]>obsmax_opt[0])</div>
+<div class="line"><a name="l00757"></a><span class="lineno">  757</span>             estWriteBuffer[icol]=obsmax_opt[0];</div>
+<div class="line"><a name="l00758"></a><span class="lineno">  758</span>         }</div>
+<div class="line"><a name="l00759"></a><span class="lineno">  759</span>           }</div>
+<div class="line"><a name="l00760"></a><span class="lineno">  760</span>           <span class="comment">//measurement update</span></div>
+<div class="line"><a name="l00761"></a><span class="lineno">  761</span>           <span class="keywordflow">if</span>(update&&!imgReaderObs.isNoData(obsLineBuffer[icol])){</div>
+<div class="line"><a name="l00762"></a><span class="lineno">  762</span>         <span class="keywordtype">double</span> kalmanGain=1;</div>
+<div class="line"><a name="l00763"></a><span class="lineno">  763</span>         <span class="keywordflow">if</span>(!imgReaderModel2.isNoData(modValue2)){<span class="comment">//model is valid</span></div>
+<div class="line"><a name="l00764"></a><span class="lineno">  764</span>           <a class="code" href="classstatfactory_1_1StatFactory.html">statfactory::StatFactory</a> statobs;</div>
+<div class="line"><a name="l00765"></a><span class="lineno">  765</span>           statobs.setNoDataValues(obsnodata_opt);</div>
+<div class="line"><a name="l00766"></a><span class="lineno">  766</span>           <span class="keywordtype">double</span> obsMeanValue=statobs.mean(obsWindowBuffer);</div>
+<div class="line"><a name="l00767"></a><span class="lineno">  767</span>           <span class="keywordtype">double</span> difference=0;</div>
+<div class="line"><a name="l00768"></a><span class="lineno">  768</span>           difference=obsMeanValue-modValue2;</div>
+<div class="line"><a name="l00769"></a><span class="lineno">  769</span>           errObs=uncertObs_opt[0]*sqrt(difference*difference);</div>
+<div class="line"><a name="l00770"></a><span class="lineno">  770</span>           <span class="comment">// errObs=(difference<0)? sqrt(difference*difference) : uncertObs_opt[0];</span></div>
+<div class="line"><a name="l00771"></a><span class="lineno">  771</span>           <span class="comment">//errObs=uncertObs_opt[0];//*difference*difference;//uncertainty of the observation (R in Kalman equations)</span></div>
+<div class="line"><a name="l00772"></a><span class="lineno">  772</span> </div>
+<div class="line"><a name="l00773"></a><span class="lineno">  773</span>           <span class="keywordflow">if</span>(errObs<eps_opt[0])</div>
+<div class="line"><a name="l00774"></a><span class="lineno">  774</span>             errObs=eps_opt[0];</div>
+<div class="line"><a name="l00775"></a><span class="lineno">  775</span>           <span class="keywordtype">double</span> errorCovariance=uncertWriteBuffer[icol];<span class="comment">//P in Kalman equations</span></div>
 <div class="line"><a name="l00776"></a><span class="lineno">  776</span> </div>
-<div class="line"><a name="l00777"></a><span class="lineno">  777</span>         imgReaderModel1.geo2image(geox,geoy,modCol,modRow);</div>
-<div class="line"><a name="l00778"></a><span class="lineno">  778</span>         assert(modRow>=0&&modRow<imgReaderModel1.nrOfRow());</div>
-<div class="line"><a name="l00779"></a><span class="lineno">  779</span>         minCol=(modCol>window_opt[0]/2) ? modCol-window_opt[0]/2 : 0;</div>
-<div class="line"><a name="l00780"></a><span class="lineno">  780</span>         maxCol=(modCol+window_opt[0]/2<imgReaderModel1.nrOfCol()) ? modCol+window_opt[0]/2 : imgReaderModel1.nrOfCol()-1;</div>
-<div class="line"><a name="l00781"></a><span class="lineno">  781</span>         minRow=(modRow>window_opt[0]/2) ? modRow-window_opt[0]/2 : 0;</div>
-<div class="line"><a name="l00782"></a><span class="lineno">  782</span>         maxRow=(modRow+window_opt[0]/2<imgReaderModel1.nrOfRow()) ? modRow+window_opt[0]/2 : imgReaderModel1.nrOfRow()-1;</div>
-<div class="line"><a name="l00783"></a><span class="lineno">  783</span>         imgReaderModel1.readDataBlock(model1buffer,GDT_Float64,minCol,maxCol,minRow,maxRow,0);</div>
-<div class="line"><a name="l00784"></a><span class="lineno">  784</span>         <span class="comment">// imgReaderEst.image2geo(icol,irow,geox,geoy);</span></div>
+<div class="line"><a name="l00777"></a><span class="lineno">  777</span>           <span class="keywordflow">if</span>(errorCovariance+errObs>eps_opt[0])</div>
+<div class="line"><a name="l00778"></a><span class="lineno">  778</span>             kalmanGain=errorCovariance/(errorCovariance+errObs);</div>
+<div class="line"><a name="l00779"></a><span class="lineno">  779</span>           <span class="keywordflow">else</span> </div>
+<div class="line"><a name="l00780"></a><span class="lineno">  780</span>             kalmanGain=1;</div>
+<div class="line"><a name="l00781"></a><span class="lineno">  781</span>           estWriteBuffer[icol]+=kalmanGain*(obsLineBuffer[icol]-estWriteBuffer[icol]);</div>
+<div class="line"><a name="l00782"></a><span class="lineno">  782</span>           <span class="keywordflow">if</span>(obsmin_opt.size()){</div>
+<div class="line"><a name="l00783"></a><span class="lineno">  783</span>             <span class="keywordflow">if</span>(estWriteBuffer[icol]<obsmin_opt[0])</div>
+<div class="line"><a name="l00784"></a><span class="lineno">  784</span>               estWriteBuffer[icol]=obsmin_opt[0];</div>
 <div class="line"><a name="l00785"></a><span class="lineno">  785</span>           }</div>
-<div class="line"><a name="l00786"></a><span class="lineno">  786</span>           <span class="keywordflow">catch</span>(<span class="keywordtype">string</span> errorString){</div>
-<div class="line"><a name="l00787"></a><span class="lineno">  787</span>         cerr << <span class="stringliteral">"Error reading data block for "</span> << minCol << <span class="stringliteral">"-"</span> << maxCol << <span class="stringliteral">", "</span> << minRow << <span class="stringliteral">"-"</span> << maxRow << endl;</div>
-<div class="line"><a name="l00788"></a><span class="lineno">  788</span>           }</div>
-<div class="line"><a name="l00789"></a><span class="lineno">  789</span>           <span class="comment">//erase no-data from buffer</span></div>
-<div class="line"><a name="l00790"></a><span class="lineno">  790</span>           vector<double>::iterator it1=model1buffer.begin();</div>
-<div class="line"><a name="l00791"></a><span class="lineno">  791</span>           vector<double>::iterator it2=model2buffer.begin();</div>
-<div class="line"><a name="l00792"></a><span class="lineno">  792</span>           <span class="keywordflow">while</span>(it1!=model1buffer.end()&&it2!=model2buffer.end()){</div>
-<div class="line"><a name="l00793"></a><span class="lineno">  793</span>         <span class="comment">//erase nodata</span></div>
-<div class="line"><a name="l00794"></a><span class="lineno">  794</span>         <span class="keywordtype">bool</span> modNodata=<span class="keyword">false</span>;</div>
-<div class="line"><a name="l00795"></a><span class="lineno">  795</span>         modNodata=modNodata||imgReaderModel1.isNoData(*it1);</div>
-<div class="line"><a name="l00796"></a><span class="lineno">  796</span>         modNodata=modNodata||imgReaderModel2.isNoData(*it2);</div>
-<div class="line"><a name="l00797"></a><span class="lineno">  797</span>         <span class="keywordflow">if</span>(modNodata){</div>
-<div class="line"><a name="l00798"></a><span class="lineno">  798</span>           model1buffer.erase(it1);</div>
-<div class="line"><a name="l00799"></a><span class="lineno">  799</span>           model2buffer.erase(it2);</div>
-<div class="line"><a name="l00800"></a><span class="lineno">  800</span>         }</div>
-<div class="line"><a name="l00801"></a><span class="lineno">  801</span>         <span class="keywordflow">else</span>{</div>
-<div class="line"><a name="l00802"></a><span class="lineno">  802</span>           ++it1;</div>
-<div class="line"><a name="l00803"></a><span class="lineno">  803</span>           ++it2;</div>
-<div class="line"><a name="l00804"></a><span class="lineno">  804</span>         }</div>
-<div class="line"><a name="l00805"></a><span class="lineno">  805</span>           }</div>
-<div class="line"><a name="l00806"></a><span class="lineno">  806</span>           <span class="keywordflow">if</span>(model1buffer.size()>minreg_opt[0]&&model2buffer.size()>minreg_opt[0]){</div>
-<div class="line"><a name="l00807"></a><span class="lineno">  807</span>         errMod=stat.linear_regression_err(model1buffer,model2buffer,c0mod,c1mod);</div>
-<div class="line"><a name="l00808"></a><span class="lineno">  808</span>         errMod*=regTime_opt[0];</div>
-<div class="line"><a name="l00809"></a><span class="lineno">  809</span>           }</div>
-<div class="line"><a name="l00810"></a><span class="lineno">  810</span>           <span class="keywordflow">else</span>{<span class="comment">//use global regression...</span></div>
-<div class="line"><a name="l00811"></a><span class="lineno">  811</span>         c0mod=c0modGlobal;</div>
-<div class="line"><a name="l00812"></a><span class="lineno">  812</span>         c1mod=c1modGlobal;</div>
-<div class="line"><a name="l00813"></a><span class="lineno">  813</span>           }</div>
-<div class="line"><a name="l00814"></a><span class="lineno">  814</span>         }</div>
-<div class="line"><a name="l00815"></a><span class="lineno">  815</span>         <span class="keywordflow">else</span>{</div>
-<div class="line"><a name="l00816"></a><span class="lineno">  816</span>           c0mod=c0modGlobal;</div>
-<div class="line"><a name="l00817"></a><span class="lineno">  817</span>           c1mod=c1modGlobal;</div>
-<div class="line"><a name="l00818"></a><span class="lineno">  818</span>         }</div>
-<div class="line"><a name="l00819"></a><span class="lineno">  819</span>         <span class="keywordtype">double</span> certNorm=(errMod*errMod+errObs*errObs);</div>
-<div class="line"><a name="l00820"></a><span class="lineno">  820</span>         <span class="keywordtype">double</span> certMod=errObs*errObs/certNorm;</div>
-<div class="line"><a name="l00821"></a><span class="lineno">  821</span>         <span class="keywordtype">double</span> certObs=errMod*errMod/certNorm;</div>
-<div class="line"><a name="l00822"></a><span class="lineno">  822</span>         <span class="keywordtype">double</span> regTime=(c0mod+c1mod*estValue)*certObs;</div>
-<div class="line"><a name="l00823"></a><span class="lineno">  823</span>         <span class="keywordtype">double</span> regSensor=(c0obs+c1obs*modValue)*certMod;</div>
-<div class="line"><a name="l00824"></a><span class="lineno">  824</span>         <span class="comment">// double regSensor=(c0obs+c1obs*estValue)*certObs;</span></div>
-<div class="line"><a name="l00825"></a><span class="lineno">  825</span>         estWriteBuffer[icol]=regTime+regSensor;</div>
-<div class="line"><a name="l00826"></a><span class="lineno">  826</span>         <span class="comment">//test</span></div>
-<div class="line"><a name="l00827"></a><span class="lineno">  827</span>         <span class="comment">// if(regTime<regSensor){</span></div>
-<div class="line"><a name="l00828"></a><span class="lineno">  828</span>         <span class="comment">//   cout << "regTime = (" << c0mod << "+" << c1mod << "*" << estValue << ")*" << certObs << " = " << regTime << endl;</span></div>
-<div class="line"><a name="l00829"></a><span class="lineno">  829</span>         <span class="comment">//   cout << "regSensor = (" << c0obs << "+" << c1obs << "*" << modValue << ")*" << certMod << " = " << regSensor << endl;</span></div>
-<div class="line"><a name="l00830"></a><span class="lineno">  830</span>         <span class="comment">//   assert(regTime+regSensor>0);</span></div>
-<div class="line"><a name="l00831"></a><span class="lineno">  831</span>         <span class="comment">//   assert(regTime+regSensor<=1);</span></div>
-<div class="line"><a name="l00832"></a><span class="lineno">  832</span>         <span class="comment">// }</span></div>
-<div class="line"><a name="l00833"></a><span class="lineno">  833</span> </div>
-<div class="line"><a name="l00834"></a><span class="lineno">  834</span>         <span class="keywordtype">double</span> totalUncertainty=0;</div>
-<div class="line"><a name="l00835"></a><span class="lineno">  835</span>         <span class="keywordflow">if</span>(errMod<eps_opt[0])</div>
-<div class="line"><a name="l00836"></a><span class="lineno">  836</span>           totalUncertainty=errObs;</div>
-<div class="line"><a name="l00837"></a><span class="lineno">  837</span>         <span class="keywordflow">else</span> <span class="keywordflow">if</span>(errObs<eps_opt[0])</div>
-<div class="line"><a name="l00838"></a><span class="lineno">  838</span>           totalUncertainty=errMod;</div>
-<div class="line"><a name="l00839"></a><span class="lineno">  839</span>         <span class="keywordflow">else</span>{</div>
-<div class="line"><a name="l00840"></a><span class="lineno">  840</span>           totalUncertainty=1.0/errMod/errMod+1/errObs/errObs;</div>
-<div class="line"><a name="l00841"></a><span class="lineno">  841</span>           totalUncertainty=sqrt(1.0/totalUncertainty);</div>
-<div class="line"><a name="l00842"></a><span class="lineno">  842</span>         }</div>
-<div class="line"><a name="l00843"></a><span class="lineno">  843</span>         uncertWriteBuffer[icol]=totalUncertainty+uncertReadBuffer[icol];</div>
-<div class="line"><a name="l00844"></a><span class="lineno">  844</span>       }</div>
-<div class="line"><a name="l00845"></a><span class="lineno">  845</span>       <span class="comment">//measurement update</span></div>
-<div class="line"><a name="l00846"></a><span class="lineno">  846</span>       <span class="keywordflow">if</span>(update&&!imgReaderObs.isNoData(obsLineBuffer[icol])){</div>
-<div class="line"><a name="l00847"></a><span class="lineno">  847</span>         <span class="keywordtype">double</span> kalmanGain=1;</div>
-<div class="line"><a name="l00848"></a><span class="lineno">  848</span>         <span class="keywordtype">double</span> uncertObs=uncertObs_opt[0];</div>
-<div class="line"><a name="l00849"></a><span class="lineno">  849</span>         <span class="keywordflow">if</span>(uncertObsLineBuffer.size()>icol)</div>
-<div class="line"><a name="l00850"></a><span class="lineno">  850</span>           uncertObs=uncertObsLineBuffer[icol];</div>
-<div class="line"><a name="l00851"></a><span class="lineno">  851</span>         <span class="keywordflow">else</span> <span class="keywordflow">if</span>(weight_opt.size()>1||deltaObs_opt.size()){</div>
-<div class="line"><a name="l00852"></a><span class="lineno">  852</span>           <a class="code" href="classstatfactory_1_1StatFactory.html">statfactory::StatFactory</a> statobs;</div>
-<div class="line"><a name="l00853"></a><span class="lineno">  853</span>           statobs.setNoDataValues(obsnodata_opt);</div>
-<div class="line"><a name="l00854"></a><span class="lineno">  854</span>           <span class="keywordtype">double</span> obsMeanValue=(statobs.mean(obsWindowBuffer)-c0obs)/c1obs;</div>
-<div class="line"><a name="l00855"></a><span class="lineno">  855</span>           <span class="keywordtype">double</span> difference=obsMeanValue-modValue;</div>
-<div class="line"><a name="l00856"></a><span class="lineno">  856</span>           <span class="keywordflow">if</span>(modValue){</div>
-<div class="line"><a name="l00857"></a><span class="lineno">  857</span>         <span class="keywordtype">double</span> relativeDifference=difference/modValue;</div>
-<div class="line"><a name="l00858"></a><span class="lineno">  858</span>         <span class="keywordflow">if</span>(deltaObs_opt.size()){</div>
-<div class="line"><a name="l00859"></a><span class="lineno">  859</span>           assert(deltaObs_opt.size()>1);</div>
-<div class="line"><a name="l00860"></a><span class="lineno">  860</span>           <span class="keywordflow">if</span>(100*relativeDifference<deltaObs_opt[0])<span class="comment">//lower bound</span></div>
-<div class="line"><a name="l00861"></a><span class="lineno">  861</span>             kalmanGain=0;</div>
-<div class="line"><a name="l00862"></a><span class="lineno">  862</span>           <span class="keywordflow">else</span> <span class="keywordflow">if</span>(100*relativeDifference>deltaObs_opt[1])<span class="comment">//upper bound</span></div>
-<div class="line"><a name="l00863"></a><span class="lineno">  863</span>             kalmanGain=0;</div>
-<div class="line"><a name="l00864"></a><span class="lineno">  864</span>         }</div>
-<div class="line"><a name="l00865"></a><span class="lineno">  865</span>         <span class="keywordflow">else</span> <span class="keywordflow">if</span>(weight_opt.size()){</div>
-<div class="line"><a name="l00866"></a><span class="lineno">  866</span>           assert(weight_opt.size()>1);</div>
-<div class="line"><a name="l00867"></a><span class="lineno">  867</span>           <span class="keywordflow">if</span>(obsMeanValue<modValue)</div>
-<div class="line"><a name="l00868"></a><span class="lineno">  868</span>             uncertObs=weight_opt[0]*relativeDifference;</div>
-<div class="line"><a name="l00869"></a><span class="lineno">  869</span>           <span class="keywordflow">else</span> <span class="keywordflow">if</span>(obsMeanValue>modValue)</div>
-<div class="line"><a name="l00870"></a><span class="lineno">  870</span>             uncertObs=weight_opt[1]*relativeDifference;</div>
-<div class="line"><a name="l00871"></a><span class="lineno">  871</span>         }</div>
-<div class="line"><a name="l00872"></a><span class="lineno">  872</span>           }</div>
-<div class="line"><a name="l00873"></a><span class="lineno">  873</span>           <span class="keywordflow">if</span>(uncertObs<=0)</div>
-<div class="line"><a name="l00874"></a><span class="lineno">  874</span>         uncertObs=0;</div>
-<div class="line"><a name="l00875"></a><span class="lineno">  875</span>           <span class="keywordflow">if</span>(verbose_opt[0]>1)</div>
-<div class="line"><a name="l00876"></a><span class="lineno">  876</span>         cout << <span class="stringliteral">"obsMeanValue:"</span> << obsMeanValue << <span class="stringliteral">", modValue: "</span> << modValue << endl;</div>
-<div class="line"><a name="l00877"></a><span class="lineno">  877</span>         }</div>
-<div class="line"><a name="l00878"></a><span class="lineno">  878</span>         <span class="keywordflow">if</span>(kalmanGain>0){</div>
-<div class="line"><a name="l00879"></a><span class="lineno">  879</span>           <span class="keywordflow">if</span>((uncertWriteBuffer[icol]+uncertObs)>eps_opt[0])</div>
-<div class="line"><a name="l00880"></a><span class="lineno">  880</span>           kalmanGain=uncertWriteBuffer[icol]/(uncertWriteBuffer[icol]+uncertObs);</div>
-<div class="line"><a name="l00881"></a><span class="lineno">  881</span>         }</div>
-<div class="line"><a name="l00882"></a><span class="lineno">  882</span>         assert(kalmanGain<=1);</div>
-<div class="line"><a name="l00883"></a><span class="lineno">  883</span>         estWriteBuffer[icol]+=kalmanGain*(obsLineBuffer[icol]-estWriteBuffer[icol]);</div>
-<div class="line"><a name="l00884"></a><span class="lineno">  884</span>         uncertWriteBuffer[icol]*=(1-kalmanGain);</div>
-<div class="line"><a name="l00885"></a><span class="lineno">  885</span>       }</div>
-<div class="line"><a name="l00886"></a><span class="lineno">  886</span>     }</div>
-<div class="line"><a name="l00887"></a><span class="lineno">  887</span>     imgWriterEst.writeData(estWriteBuffer,GDT_Float64,irow,0);</div>
-<div class="line"><a name="l00888"></a><span class="lineno">  888</span>     imgWriterEst.writeData(uncertWriteBuffer,GDT_Float64,irow,1);</div>
-<div class="line"><a name="l00889"></a><span class="lineno">  889</span>     progress=<span class="keyword">static_cast<</span><span class="keywordtype">float</span><span class="keyword">></span>((irow+1.0)/imgWriterEst.nrOfRow());</div>
-<div class="line"><a name="l00890"></a><span class="lineno">  890</span>     pfnProgress(progress,pszMessage,pProgressArg);</div>
-<div class="line"><a name="l00891"></a><span class="lineno">  891</span>       }</div>
-<div class="line"><a name="l00892"></a><span class="lineno">  892</span> </div>
-<div class="line"><a name="l00893"></a><span class="lineno">  893</span>       imgWriterEst.close();</div>
-<div class="line"><a name="l00894"></a><span class="lineno">  894</span>       imgReaderEst.close();</div>
-<div class="line"><a name="l00895"></a><span class="lineno">  895</span> </div>
-<div class="line"><a name="l00896"></a><span class="lineno">  896</span>       <span class="keywordflow">if</span>(update){</div>
-<div class="line"><a name="l00897"></a><span class="lineno">  897</span>     imgReaderObs.close();</div>
-<div class="line"><a name="l00898"></a><span class="lineno">  898</span>     ++obsindex;</div>
-<div class="line"><a name="l00899"></a><span class="lineno">  899</span>       }</div>
-<div class="line"><a name="l00900"></a><span class="lineno">  900</span>       imgReaderModel1.close();</div>
-<div class="line"><a name="l00901"></a><span class="lineno">  901</span>       imgReaderModel2.close();</div>
-<div class="line"><a name="l00902"></a><span class="lineno">  902</span>     }</div>
-<div class="line"><a name="l00903"></a><span class="lineno">  903</span>   }</div>
-<div class="line"><a name="l00904"></a><span class="lineno">  904</span>   <span class="keywordflow">if</span>(find(direction_opt.begin(),direction_opt.end(),<span class="stringliteral">"backward"</span>)!=direction_opt.end()){</div>
-<div class="line"><a name="l00906"></a><span class="lineno">  906</span>     cout << <span class="stringliteral">"Running backward model"</span> << endl;</div>
-<div class="line"><a name="l00907"></a><span class="lineno">  907</span>     obsindex=relobsindex.size()-1;</div>
-<div class="line"><a name="l00908"></a><span class="lineno">  908</span>     <span class="comment">//initialization</span></div>
-<div class="line"><a name="l00909"></a><span class="lineno">  909</span>     <span class="keywordtype">string</span> output;</div>
-<div class="line"><a name="l00910"></a><span class="lineno">  910</span>     <span class="keywordflow">if</span>(outputbw_opt.size()==model_opt.size())</div>
-<div class="line"><a name="l00911"></a><span class="lineno">  911</span>       output=outputbw_opt.back();</div>
-<div class="line"><a name="l00912"></a><span class="lineno">  912</span>     <span class="keywordflow">else</span>{</div>
-<div class="line"><a name="l00913"></a><span class="lineno">  913</span>       ostringstream outputstream;</div>
-<div class="line"><a name="l00914"></a><span class="lineno">  914</span>       outputstream << outputbw_opt[0] << <span class="stringliteral">"_"</span>;</div>
-<div class="line"><a name="l00915"></a><span class="lineno">  915</span>       outputstream << setfill(<span class="charliteral">'0'</span>) << setw(ndigit) << tmodel_opt.back();</div>
-<div class="line"><a name="l00916"></a><span class="lineno">  916</span>       outputstream << <span class="stringliteral">".tif"</span>;</div>
-<div class="line"><a name="l00917"></a><span class="lineno">  917</span>       <span class="comment">// outputstream << outputbw_opt[0] << "_" << tmodel_opt.back() << ".tif";</span></div>
-<div class="line"><a name="l00918"></a><span class="lineno">  918</span>       output=outputstream.str();</div>
-<div class="line"><a name="l00919"></a><span class="lineno">  919</span>     }</div>
-<div class="line"><a name="l00920"></a><span class="lineno">  920</span>     <span class="keywordflow">if</span>(verbose_opt[0])</div>
-<div class="line"><a name="l00921"></a><span class="lineno">  921</span>       cout << <span class="stringliteral">"Opening image "</span> << output << <span class="stringliteral">" for writing "</span> << endl;</div>
-<div class="line"><a name="l00922"></a><span class="lineno">  922</span>     imgWriterEst.open(output,ncol,nrow,2,GDT_Float32,imageType,option_opt);</div>
-<div class="line"><a name="l00923"></a><span class="lineno">  923</span>     imgWriterEst.setProjectionProj4(projection_opt[0]);</div>
-<div class="line"><a name="l00924"></a><span class="lineno">  924</span>     imgWriterEst.setGeoTransform(geotransform);</div>
-<div class="line"><a name="l00925"></a><span class="lineno">  925</span>     imgWriterEst.GDALSetNoDataValue(obsnodata_opt[0]);</div>
-<div class="line"><a name="l00926"></a><span class="lineno">  926</span> </div>
-<div class="line"><a name="l00927"></a><span class="lineno">  927</span>     <span class="keywordflow">if</span>(verbose_opt[0]){</div>
-<div class="line"><a name="l00928"></a><span class="lineno">  928</span>       cout << <span class="stringliteral">"processing time "</span> << tmodel_opt.back() << endl;</div>
-<div class="line"><a name="l00929"></a><span class="lineno">  929</span>       <span class="keywordflow">if</span>(obsindex<relobsindex.size())</div>
-<div class="line"><a name="l00930"></a><span class="lineno">  930</span>     cout << <span class="stringliteral">"next observation "</span> << tmodel_opt[relobsindex[obsindex]] << endl;</div>
-<div class="line"><a name="l00931"></a><span class="lineno">  931</span>       <span class="keywordflow">else</span></div>
-<div class="line"><a name="l00932"></a><span class="lineno">  932</span>     cout << <span class="stringliteral">"There is no next observation"</span> << endl;</div>
+<div class="line"><a name="l00786"></a><span class="lineno">  786</span>           <span class="keywordflow">if</span>(obsmax_opt.size()){</div>
+<div class="line"><a name="l00787"></a><span class="lineno">  787</span>             <span class="keywordflow">if</span>(estWriteBuffer[icol]>obsmax_opt[0])</div>
+<div class="line"><a name="l00788"></a><span class="lineno">  788</span>               estWriteBuffer[icol]=obsmax_opt[0];</div>
+<div class="line"><a name="l00789"></a><span class="lineno">  789</span>           }</div>
+<div class="line"><a name="l00790"></a><span class="lineno">  790</span>           uncertWriteBuffer[icol]*=(1-kalmanGain);</div>
+<div class="line"><a name="l00791"></a><span class="lineno">  791</span>         }</div>
+<div class="line"><a name="l00792"></a><span class="lineno">  792</span>         assert(kalmanGain<=1);</div>
+<div class="line"><a name="l00793"></a><span class="lineno">  793</span>         gainWriteBuffer[icol]=kalmanGain;</div>
+<div class="line"><a name="l00794"></a><span class="lineno">  794</span>           }</div>
+<div class="line"><a name="l00795"></a><span class="lineno">  795</span>         }</div>
+<div class="line"><a name="l00796"></a><span class="lineno">  796</span>       }</div>
+<div class="line"><a name="l00797"></a><span class="lineno">  797</span>       <span class="comment">//test</span></div>
+<div class="line"><a name="l00798"></a><span class="lineno">  798</span>       <span class="keywordflow">if</span>(gain_opt.size()){</div>
+<div class="line"><a name="l00799"></a><span class="lineno">  799</span>         imgWriterGain.writeData(gainWriteBuffer,GDT_Float64,irow,modindex);</div>
+<div class="line"><a name="l00800"></a><span class="lineno">  800</span>       }</div>
+<div class="line"><a name="l00801"></a><span class="lineno">  801</span>       imgWriterEst.writeData(estWriteBuffer,GDT_Float64,irow,0);</div>
+<div class="line"><a name="l00802"></a><span class="lineno">  802</span>       imgWriterEst.writeData(uncertWriteBuffer,GDT_Float64,irow,1);</div>
+<div class="line"><a name="l00803"></a><span class="lineno">  803</span>       progress=<span class="keyword">static_cast<</span><span class="keywordtype">float</span><span class="keyword">></span>((irow+1.0)/imgWriterEst.nrOfRow());</div>
+<div class="line"><a name="l00804"></a><span class="lineno">  804</span>       pfnProgress(progress,pszMessage,pProgressArg);</div>
+<div class="line"><a name="l00805"></a><span class="lineno">  805</span>     }</div>
+<div class="line"><a name="l00806"></a><span class="lineno">  806</span>       }</div>
+<div class="line"><a name="l00807"></a><span class="lineno">  807</span>       imgWriterEst.close();</div>
+<div class="line"><a name="l00808"></a><span class="lineno">  808</span>       imgReaderEst.close();</div>
+<div class="line"><a name="l00809"></a><span class="lineno">  809</span> </div>
+<div class="line"><a name="l00810"></a><span class="lineno">  810</span>       <span class="keywordflow">if</span>(update){</div>
+<div class="line"><a name="l00811"></a><span class="lineno">  811</span>     imgReaderObs.close();</div>
+<div class="line"><a name="l00812"></a><span class="lineno">  812</span>     ++obsindex;</div>
+<div class="line"><a name="l00813"></a><span class="lineno">  813</span>       }</div>
+<div class="line"><a name="l00814"></a><span class="lineno">  814</span>       imgReaderModel1.close();</div>
+<div class="line"><a name="l00815"></a><span class="lineno">  815</span>       imgReaderModel2.close();</div>
+<div class="line"><a name="l00816"></a><span class="lineno">  816</span>     }</div>
+<div class="line"><a name="l00817"></a><span class="lineno">  817</span>     <span class="keywordflow">if</span>(gain_opt.size())</div>
+<div class="line"><a name="l00818"></a><span class="lineno">  818</span>       imgWriterGain.close();</div>
+<div class="line"><a name="l00819"></a><span class="lineno">  819</span>   }</div>
+<div class="line"><a name="l00820"></a><span class="lineno">  820</span>   <span class="keywordflow">if</span>(find(direction_opt.begin(),direction_opt.end(),<span class="stringliteral">"backward"</span>)!=direction_opt.end()){</div>
+<div class="line"><a name="l00822"></a><span class="lineno">  822</span>     cout << <span class="stringliteral">"Running backward model"</span> << endl;</div>
+<div class="line"><a name="l00823"></a><span class="lineno">  823</span>     obsindex=relobsindex.size()-1;</div>
+<div class="line"><a name="l00824"></a><span class="lineno">  824</span>     <span class="comment">//initialization</span></div>
+<div class="line"><a name="l00825"></a><span class="lineno">  825</span>     <span class="keywordtype">string</span> output;</div>
+<div class="line"><a name="l00826"></a><span class="lineno">  826</span>     <span class="keywordflow">if</span>(outputbw_opt.size()==model_opt.size())</div>
+<div class="line"><a name="l00827"></a><span class="lineno">  827</span>       output=outputbw_opt.back();</div>
+<div class="line"><a name="l00828"></a><span class="lineno">  828</span>     <span class="keywordflow">else</span>{</div>
+<div class="line"><a name="l00829"></a><span class="lineno">  829</span>       ostringstream outputstream;</div>
+<div class="line"><a name="l00830"></a><span class="lineno">  830</span>       outputstream << outputbw_opt[0] << <span class="stringliteral">"_"</span>;</div>
+<div class="line"><a name="l00831"></a><span class="lineno">  831</span>       outputstream << setfill(<span class="charliteral">'0'</span>) << setw(ndigit) << tmodel_opt.back();</div>
+<div class="line"><a name="l00832"></a><span class="lineno">  832</span>       outputstream << <span class="stringliteral">".tif"</span>;</div>
+<div class="line"><a name="l00833"></a><span class="lineno">  833</span>       <span class="comment">// outputstream << outputbw_opt[0] << "_" << tmodel_opt.back() << ".tif";</span></div>
+<div class="line"><a name="l00834"></a><span class="lineno">  834</span>       output=outputstream.str();</div>
+<div class="line"><a name="l00835"></a><span class="lineno">  835</span>     }</div>
+<div class="line"><a name="l00836"></a><span class="lineno">  836</span>     <span class="keywordflow">if</span>(verbose_opt[0])</div>
+<div class="line"><a name="l00837"></a><span class="lineno">  837</span>       cout << <span class="stringliteral">"Opening image "</span> << output << <span class="stringliteral">" for writing "</span> << endl;</div>
+<div class="line"><a name="l00838"></a><span class="lineno">  838</span> </div>
+<div class="line"><a name="l00839"></a><span class="lineno">  839</span>     imgWriterEst.open(output,ncol,nrow,2,GDT_Float64,imageType,option_opt);</div>
+<div class="line"><a name="l00840"></a><span class="lineno">  840</span>     imgWriterEst.setProjectionProj4(projection_opt[0]);</div>
+<div class="line"><a name="l00841"></a><span class="lineno">  841</span>     imgWriterEst.setGeoTransform(geotransform);</div>
+<div class="line"><a name="l00842"></a><span class="lineno">  842</span>     imgWriterEst.GDALSetNoDataValue(obsnodata_opt[0]);</div>
+<div class="line"><a name="l00843"></a><span class="lineno">  843</span> </div>
+<div class="line"><a name="l00844"></a><span class="lineno">  844</span>     <span class="keywordflow">if</span>(verbose_opt[0]){</div>
+<div class="line"><a name="l00845"></a><span class="lineno">  845</span>       cout << <span class="stringliteral">"processing time "</span> << tmodel_opt.back() << endl;</div>
+<div class="line"><a name="l00846"></a><span class="lineno">  846</span>       <span class="keywordflow">if</span>(obsindex<relobsindex.size())</div>
+<div class="line"><a name="l00847"></a><span class="lineno">  847</span>     cout << <span class="stringliteral">"next observation "</span> << tmodel_opt[relobsindex[obsindex]] << endl;</div>
+<div class="line"><a name="l00848"></a><span class="lineno">  848</span>       <span class="keywordflow">else</span></div>
+<div class="line"><a name="l00849"></a><span class="lineno">  849</span>     cout << <span class="stringliteral">"There is no next observation"</span> << endl;</div>
+<div class="line"><a name="l00850"></a><span class="lineno">  850</span>     }</div>
+<div class="line"><a name="l00851"></a><span class="lineno">  851</span> </div>
+<div class="line"><a name="l00852"></a><span class="lineno">  852</span>     <span class="keywordflow">try</span>{</div>
+<div class="line"><a name="l00853"></a><span class="lineno">  853</span>       imgReaderModel1.open(model_opt.back());</div>
+<div class="line"><a name="l00854"></a><span class="lineno">  854</span>       imgReaderModel1.setNoData(modnodata_opt);</div>
+<div class="line"><a name="l00855"></a><span class="lineno">  855</span>     }</div>
+<div class="line"><a name="l00856"></a><span class="lineno">  856</span>     <span class="keywordflow">catch</span>(<span class="keywordtype">string</span> errorString){</div>
+<div class="line"><a name="l00857"></a><span class="lineno">  857</span>       cerr << errorString << endl;</div>
+<div class="line"><a name="l00858"></a><span class="lineno">  858</span>     }</div>
+<div class="line"><a name="l00859"></a><span class="lineno">  859</span>     <span class="keywordflow">catch</span>(...){</div>
+<div class="line"><a name="l00860"></a><span class="lineno">  860</span>       cerr << <span class="stringliteral">"Error opening file "</span> << model_opt[0] << endl;</div>
+<div class="line"><a name="l00861"></a><span class="lineno">  861</span>     }</div>
+<div class="line"><a name="l00862"></a><span class="lineno">  862</span> </div>
+<div class="line"><a name="l00863"></a><span class="lineno">  863</span>     <span class="comment">//calculate standard deviation of image to serve as model uncertainty</span></div>
+<div class="line"><a name="l00864"></a><span class="lineno">  864</span>     GDALRasterBand* rasterBand;</div>
+<div class="line"><a name="l00865"></a><span class="lineno">  865</span>     rasterBand=imgReaderModel1.getRasterBand(0);</div>
+<div class="line"><a name="l00866"></a><span class="lineno">  866</span>     <span class="keywordtype">double</span> minValue, maxValue, meanValue, stdDev;</div>
+<div class="line"><a name="l00867"></a><span class="lineno">  867</span>     <span class="keywordtype">void</span>* pProgressData;</div>
+<div class="line"><a name="l00868"></a><span class="lineno">  868</span>     rasterBand->ComputeStatistics(0,&minValue,&maxValue,&meanValue,&stdDev,pfnProgress,pProgressData);</div>
+<div class="line"><a name="l00869"></a><span class="lineno">  869</span>     <span class="keywordtype">double</span> modRow=0;</div>
+<div class="line"><a name="l00870"></a><span class="lineno">  870</span>     <span class="keywordtype">double</span> modCol=0;</div>
+<div class="line"><a name="l00871"></a><span class="lineno">  871</span>     <span class="keywordtype">double</span> lowerCol=0;</div>
+<div class="line"><a name="l00872"></a><span class="lineno">  872</span>     <span class="keywordtype">double</span> upperCol=0;</div>
+<div class="line"><a name="l00873"></a><span class="lineno">  873</span>     RESAMPLE theResample=BILINEAR;</div>
+<div class="line"><a name="l00874"></a><span class="lineno">  874</span> </div>
+<div class="line"><a name="l00875"></a><span class="lineno">  875</span>     <span class="keywordflow">if</span>(relobsindex.back()<model_opt.size()-1){<span class="comment">//initialize output_opt.back() as model[0]</span></div>
+<div class="line"><a name="l00876"></a><span class="lineno">  876</span>       <span class="comment">//write last model as output</span></div>
+<div class="line"><a name="l00877"></a><span class="lineno">  877</span>       <span class="keywordflow">if</span>(verbose_opt[0])</div>
+<div class="line"><a name="l00878"></a><span class="lineno">  878</span>     cout << <span class="stringliteral">"write last model as output"</span> << endl;</div>
+<div class="line"><a name="l00879"></a><span class="lineno">  879</span>       <span class="keywordflow">for</span>(<span class="keywordtype">int</span> jrow=0;jrow<nrow;jrow+=down_opt[0]){</div>
+<div class="line"><a name="l00880"></a><span class="lineno">  880</span>     vector<double> estReadBuffer;</div>
+<div class="line"><a name="l00881"></a><span class="lineno">  881</span>     vector<double> estWriteBuffer(ncol);</div>
+<div class="line"><a name="l00882"></a><span class="lineno">  882</span>     vector<double> uncertWriteBuffer(ncol);</div>
+<div class="line"><a name="l00883"></a><span class="lineno">  883</span>     <span class="keywordflow">try</span>{</div>
+<div class="line"><a name="l00884"></a><span class="lineno">  884</span>       <span class="keywordflow">for</span>(<span class="keywordtype">int</span> irow=jrow;irow<jrow+down_opt[0];++irow){</div>
+<div class="line"><a name="l00885"></a><span class="lineno">  885</span>         imgWriterEst.image2geo(0,irow,geox,geoy);</div>
+<div class="line"><a name="l00886"></a><span class="lineno">  886</span>         imgReaderModel1.geo2image(geox,geoy,modCol,modRow);</div>
+<div class="line"><a name="l00887"></a><span class="lineno">  887</span>         assert(modRow>=0&&modRow<imgReaderModel1.nrOfRow());</div>
+<div class="line"><a name="l00888"></a><span class="lineno">  888</span>         imgReaderModel1.readData(estReadBuffer,GDT_Float64,modRow,0,theResample);</div>
+<div class="line"><a name="l00889"></a><span class="lineno">  889</span>         <span class="keywordflow">for</span>(<span class="keywordtype">int</span> jcol=0;jcol<ncol;jcol+=down_opt[0]){</div>
+<div class="line"><a name="l00890"></a><span class="lineno">  890</span>           <span class="keywordflow">for</span>(<span class="keywordtype">int</span> icol=icol;icol<icol+down_opt[0];++icol){</div>
+<div class="line"><a name="l00891"></a><span class="lineno">  891</span>         imgWriterEst.image2geo(icol,irow,geox,geoy);</div>
+<div class="line"><a name="l00892"></a><span class="lineno">  892</span>         imgReaderModel1.geo2image(geox,geoy,modCol,modRow);</div>
+<div class="line"><a name="l00893"></a><span class="lineno">  893</span>         lowerCol=modCol-0.5;</div>
+<div class="line"><a name="l00894"></a><span class="lineno">  894</span>         lowerCol=<span class="keyword">static_cast<</span><span class="keywordtype">int</span><span class="keyword">></span>(lowerCol);</div>
+<div class="line"><a name="l00895"></a><span class="lineno">  895</span>         upperCol=modCol+0.5;</div>
+<div class="line"><a name="l00896"></a><span class="lineno">  896</span>         upperCol=<span class="keyword">static_cast<</span><span class="keywordtype">int</span><span class="keyword">></span>(upperCol);</div>
+<div class="line"><a name="l00897"></a><span class="lineno">  897</span>         <span class="keywordflow">if</span>(lowerCol<0)</div>
+<div class="line"><a name="l00898"></a><span class="lineno">  898</span>           lowerCol=0;</div>
+<div class="line"><a name="l00899"></a><span class="lineno">  899</span>         <span class="keywordflow">if</span>(upperCol>=imgReaderModel1.nrOfCol())</div>
+<div class="line"><a name="l00900"></a><span class="lineno">  900</span>           upperCol=imgReaderModel1.nrOfCol()-1;</div>
+<div class="line"><a name="l00901"></a><span class="lineno">  901</span>         <span class="keywordtype">double</span> modValue=(modCol-0.5-lowerCol)*estReadBuffer[upperCol]+(1-modCol+0.5+lowerCol)*estReadBuffer[lowerCol];</div>
+<div class="line"><a name="l00902"></a><span class="lineno">  902</span> </div>
+<div class="line"><a name="l00903"></a><span class="lineno">  903</span>         <span class="comment">// double modValue=estReadBuffer[modCol];</span></div>
+<div class="line"><a name="l00904"></a><span class="lineno">  904</span>         <span class="keywordflow">if</span>(imgReaderModel1.isNoData(modValue)){</div>
+<div class="line"><a name="l00905"></a><span class="lineno">  905</span>           estWriteBuffer[icol]=obsnodata_opt[0];</div>
+<div class="line"><a name="l00906"></a><span class="lineno">  906</span>           uncertWriteBuffer[icol]=uncertNodata_opt[0];</div>
+<div class="line"><a name="l00907"></a><span class="lineno">  907</span>         }</div>
+<div class="line"><a name="l00908"></a><span class="lineno">  908</span>         <span class="keywordflow">else</span>{</div>
+<div class="line"><a name="l00909"></a><span class="lineno">  909</span>           estWriteBuffer[icol]=modValue;</div>
+<div class="line"><a name="l00910"></a><span class="lineno">  910</span>           <span class="keywordflow">if</span>(obsmin_opt.size()){</div>
+<div class="line"><a name="l00911"></a><span class="lineno">  911</span>             <span class="keywordflow">if</span>(estWriteBuffer[icol]<obsmin_opt[0])</div>
+<div class="line"><a name="l00912"></a><span class="lineno">  912</span>               estWriteBuffer[icol]=obsmin_opt[0];</div>
+<div class="line"><a name="l00913"></a><span class="lineno">  913</span>           }</div>
+<div class="line"><a name="l00914"></a><span class="lineno">  914</span>           <span class="keywordflow">if</span>(obsmax_opt.size()){</div>
+<div class="line"><a name="l00915"></a><span class="lineno">  915</span>             <span class="keywordflow">if</span>(estWriteBuffer[icol]>obsmax_opt[0])</div>
+<div class="line"><a name="l00916"></a><span class="lineno">  916</span>               estWriteBuffer[icol]=obsmax_opt[0];</div>
+<div class="line"><a name="l00917"></a><span class="lineno">  917</span>           }</div>
+<div class="line"><a name="l00918"></a><span class="lineno">  918</span>           uncertWriteBuffer[icol]=uncertModel_opt[0]*stdDev*stdDev;</div>
+<div class="line"><a name="l00919"></a><span class="lineno">  919</span>         }</div>
+<div class="line"><a name="l00920"></a><span class="lineno">  920</span>           }</div>
+<div class="line"><a name="l00921"></a><span class="lineno">  921</span>         }</div>
+<div class="line"><a name="l00922"></a><span class="lineno">  922</span>         imgWriterEst.writeData(estWriteBuffer,GDT_Float64,irow,0);</div>
+<div class="line"><a name="l00923"></a><span class="lineno">  923</span>         imgWriterEst.writeData(uncertWriteBuffer,GDT_Float64,irow,1);</div>
+<div class="line"><a name="l00924"></a><span class="lineno">  924</span>       }</div>
+<div class="line"><a name="l00925"></a><span class="lineno">  925</span>     }</div>
+<div class="line"><a name="l00926"></a><span class="lineno">  926</span>     <span class="keywordflow">catch</span>(<span class="keywordtype">string</span> errorString){</div>
+<div class="line"><a name="l00927"></a><span class="lineno">  927</span>       cerr << errorString << endl;</div>
+<div class="line"><a name="l00928"></a><span class="lineno">  928</span>     }</div>
+<div class="line"><a name="l00929"></a><span class="lineno">  929</span>     <span class="keywordflow">catch</span>(...){</div>
+<div class="line"><a name="l00930"></a><span class="lineno">  930</span>       cerr << <span class="stringliteral">"Error writing file "</span> << imgWriterEst.getFileName() << endl;</div>
+<div class="line"><a name="l00931"></a><span class="lineno">  931</span>     }</div>
+<div class="line"><a name="l00932"></a><span class="lineno">  932</span>       }</div>
 <div class="line"><a name="l00933"></a><span class="lineno">  933</span>     }</div>
-<div class="line"><a name="l00934"></a><span class="lineno">  934</span> </div>
-<div class="line"><a name="l00935"></a><span class="lineno">  935</span>     <span class="keywordflow">try</span>{</div>
-<div class="line"><a name="l00936"></a><span class="lineno">  936</span>       imgReaderModel1.open(model_opt.back());</div>
-<div class="line"><a name="l00937"></a><span class="lineno">  937</span>       imgReaderModel1.setNoData(modnodata_opt);</div>
-<div class="line"><a name="l00938"></a><span class="lineno">  938</span>       <span class="keywordflow">if</span>(modoffset_opt.size())</div>
-<div class="line"><a name="l00939"></a><span class="lineno">  939</span>     imgReaderModel1.setOffset(modoffset_opt[0]);</div>
-<div class="line"><a name="l00940"></a><span class="lineno">  940</span>       <span class="keywordflow">if</span>(modscale_opt.size())</div>
-<div class="line"><a name="l00941"></a><span class="lineno">  941</span>     imgReaderModel1.setScale(modscale_opt[0]);</div>
-<div class="line"><a name="l00942"></a><span class="lineno">  942</span>     }</div>
-<div class="line"><a name="l00943"></a><span class="lineno">  943</span>     <span class="keywordflow">catch</span>(<span class="keywordtype">string</span> errorString){</div>
-<div class="line"><a name="l00944"></a><span class="lineno">  944</span>       cerr << errorString << endl;</div>
-<div class="line"><a name="l00945"></a><span class="lineno">  945</span>     }</div>
-<div class="line"><a name="l00946"></a><span class="lineno">  946</span>     <span class="keywordflow">catch</span>(...){</div>
-<div class="line"><a name="l00947"></a><span class="lineno">  947</span>       cerr << <span class="stringliteral">"Error opening file "</span> << model_opt[0] << endl;</div>
-<div class="line"><a name="l00948"></a><span class="lineno">  948</span>     }</div>
-<div class="line"><a name="l00949"></a><span class="lineno">  949</span> </div>
-<div class="line"><a name="l00950"></a><span class="lineno">  950</span>     <span class="comment">//calculate standard deviation of image to serve as model uncertainty</span></div>
-<div class="line"><a name="l00951"></a><span class="lineno">  951</span>     GDALRasterBand* rasterBand;</div>
-<div class="line"><a name="l00952"></a><span class="lineno">  952</span>     rasterBand=imgReaderModel1.getRasterBand(0);</div>
-<div class="line"><a name="l00953"></a><span class="lineno">  953</span>     <span class="keywordtype">double</span> minValue, maxValue, meanValue, stdDev;</div>
-<div class="line"><a name="l00954"></a><span class="lineno">  954</span>     <span class="keywordtype">void</span>* pProgressData;</div>
-<div class="line"><a name="l00955"></a><span class="lineno">  955</span>     rasterBand->ComputeStatistics(0,&minValue,&maxValue,&meanValue,&stdDev,pfnProgress,pProgressData);</div>
-<div class="line"><a name="l00956"></a><span class="lineno">  956</span>     <span class="keywordtype">double</span> modRow=0;</div>
-<div class="line"><a name="l00957"></a><span class="lineno">  957</span>     <span class="keywordtype">double</span> modCol=0;</div>
-<div class="line"><a name="l00958"></a><span class="lineno">  958</span>     <span class="keywordflow">if</span>(relobsindex.back()<model_opt.size()-1){<span class="comment">//initialize output_opt.back() as model[0]</span></div>
-<div class="line"><a name="l00959"></a><span class="lineno">  959</span>       <span class="comment">//write last model as output</span></div>
-<div class="line"><a name="l00960"></a><span class="lineno">  960</span>       <span class="keywordflow">if</span>(verbose_opt[0])</div>
-<div class="line"><a name="l00961"></a><span class="lineno">  961</span>     cout << <span class="stringliteral">"write last model as output"</span> << endl;</div>
-<div class="line"><a name="l00962"></a><span class="lineno">  962</span>       <span class="keywordflow">for</span>(<span class="keywordtype">int</span> irow=0;irow<nrow;++irow){</div>
-<div class="line"><a name="l00963"></a><span class="lineno">  963</span>     vector<double> estReadBuffer;</div>
-<div class="line"><a name="l00964"></a><span class="lineno">  964</span>     vector<double> estWriteBuffer(ncol);</div>
-<div class="line"><a name="l00965"></a><span class="lineno">  965</span>     vector<double> uncertWriteBuffer(ncol);</div>
-<div class="line"><a name="l00966"></a><span class="lineno">  966</span>     <span class="comment">// vector<double> lineMask;</span></div>
-<div class="line"><a name="l00967"></a><span class="lineno">  967</span>     imgWriterEst.image2geo(0,irow,geox,geoy);</div>
-<div class="line"><a name="l00968"></a><span class="lineno">  968</span>     imgReaderModel1.geo2image(geox,geoy,modCol,modRow);</div>
-<div class="line"><a name="l00969"></a><span class="lineno">  969</span>     assert(modRow>=0&&modRow<imgReaderModel1.nrOfRow());</div>
-<div class="line"><a name="l00970"></a><span class="lineno">  970</span>     <span class="keywordflow">try</span>{</div>
-<div class="line"><a name="l00971"></a><span class="lineno">  971</span>       imgReaderModel1.readData(estReadBuffer,GDT_Float64,modRow);</div>
-<div class="line"><a name="l00972"></a><span class="lineno">  972</span>       <span class="comment">//simple nearest neighbor</span></div>
-<div class="line"><a name="l00973"></a><span class="lineno">  973</span>       <span class="comment">//stat.nearUp(estReadBuffer,estWriteBuffer);</span></div>
-<div class="line"><a name="l00974"></a><span class="lineno">  974</span> </div>
-<div class="line"><a name="l00975"></a><span class="lineno">  975</span>       <span class="comment">// double oldRowMask=-1;//keep track of row mask to optimize number of line readings</span></div>
-<div class="line"><a name="l00976"></a><span class="lineno">  976</span>       <span class="keywordflow">for</span>(<span class="keywordtype">int</span> icol=0;icol<imgWriterEst.nrOfCol();++icol){</div>
-<div class="line"><a name="l00977"></a><span class="lineno">  977</span>         imgWriterEst.image2geo(icol,irow,geox,geoy);        </div>
-<div class="line"><a name="l00978"></a><span class="lineno">  978</span>         imgReaderModel1.geo2image(geox,geoy,modCol,modRow);</div>
-<div class="line"><a name="l00979"></a><span class="lineno">  979</span>         <span class="keywordtype">double</span> modValue=estReadBuffer[modCol];</div>
-<div class="line"><a name="l00980"></a><span class="lineno">  980</span>         <span class="keywordflow">if</span>(imgReaderModel1.isNoData(modValue)){</div>
-<div class="line"><a name="l00981"></a><span class="lineno">  981</span>           estWriteBuffer[icol]=obsnodata_opt[0];</div>
-<div class="line"><a name="l00982"></a><span class="lineno">  982</span>           uncertWriteBuffer[icol]=uncertNodata_opt[0];</div>
-<div class="line"><a name="l00983"></a><span class="lineno">  983</span>         }</div>
-<div class="line"><a name="l00984"></a><span class="lineno">  984</span>         <span class="keywordflow">else</span>{</div>
-<div class="line"><a name="l00985"></a><span class="lineno">  985</span>           estWriteBuffer[icol]=modValue;</div>
-<div class="line"><a name="l00986"></a><span class="lineno">  986</span>           uncertWriteBuffer[icol]=uncertModel_opt[0]*stdDev;</div>
-<div class="line"><a name="l00987"></a><span class="lineno">  987</span>         }</div>
-<div class="line"><a name="l00988"></a><span class="lineno">  988</span>       }</div>
-<div class="line"><a name="l00989"></a><span class="lineno">  989</span>       imgWriterEst.writeData(estWriteBuffer,GDT_Float64,irow,0);</div>
-<div class="line"><a name="l00990"></a><span class="lineno">  990</span>       imgWriterEst.writeData(uncertWriteBuffer,GDT_Float64,irow,1);</div>
-<div class="line"><a name="l00991"></a><span class="lineno">  991</span>     }</div>
-<div class="line"><a name="l00992"></a><span class="lineno">  992</span>     <span class="keywordflow">catch</span>(<span class="keywordtype">string</span> errorString){</div>
-<div class="line"><a name="l00993"></a><span class="lineno">  993</span>       cerr << errorString << endl;</div>
-<div class="line"><a name="l00994"></a><span class="lineno">  994</span>     }</div>
-<div class="line"><a name="l00995"></a><span class="lineno">  995</span>     <span class="keywordflow">catch</span>(...){</div>
-<div class="line"><a name="l00996"></a><span class="lineno">  996</span>       cerr << <span class="stringliteral">"Error writing file "</span> << imgWriterEst.getFileName() << endl;</div>
-<div class="line"><a name="l00997"></a><span class="lineno">  997</span>     }</div>
-<div class="line"><a name="l00998"></a><span class="lineno">  998</span>       }</div>
-<div class="line"><a name="l00999"></a><span class="lineno">  999</span>     }</div>
-<div class="line"><a name="l01000"></a><span class="lineno"> 1000</span>     <span class="keywordflow">else</span>{<span class="comment">//we have an measurement at end time</span></div>
-<div class="line"><a name="l01001"></a><span class="lineno"> 1001</span>       <span class="keywordflow">if</span>(verbose_opt[0])</div>
-<div class="line"><a name="l01002"></a><span class="lineno"> 1002</span>     cout << <span class="stringliteral">"we have an measurement at end time"</span> << endl;</div>
-<div class="line"><a name="l01003"></a><span class="lineno"> 1003</span>       imgReaderObs.open(observation_opt.back());</div>
-<div class="line"><a name="l01004"></a><span class="lineno"> 1004</span>       imgReaderObs.getGeoTransform(geotransform);</div>
-<div class="line"><a name="l01005"></a><span class="lineno"> 1005</span>       imgReaderObs.setNoData(obsnodata_opt);</div>
-<div class="line"><a name="l01006"></a><span class="lineno"> 1006</span>       <span class="keywordflow">if</span>(obsoffset_opt.size())</div>
-<div class="line"><a name="l01007"></a><span class="lineno"> 1007</span>     imgReaderObs.setOffset(obsoffset_opt[0]);</div>
-<div class="line"><a name="l01008"></a><span class="lineno"> 1008</span>       <span class="keywordflow">if</span>(obsscale_opt.size())</div>
-<div class="line"><a name="l01009"></a><span class="lineno"> 1009</span>     imgReaderObs.setScale(obsscale_opt[0]);</div>
-<div class="line"><a name="l01010"></a><span class="lineno"> 1010</span>       </div>
-<div class="line"><a name="l01011"></a><span class="lineno"> 1011</span>       <span class="keywordflow">if</span>(regSensor_opt[0]>0)</div>
-<div class="line"><a name="l01012"></a><span class="lineno"> 1012</span>     errObs=regSensor_opt[0]*imgreg.getRMSE(imgReaderModel1,imgReaderObs,c0obs,c1obs,0,0,verbose_opt[0]);</div>
-<div class="line"><a name="l01013"></a><span class="lineno"> 1013</span>       <span class="keywordflow">else</span>{</div>
-<div class="line"><a name="l01014"></a><span class="lineno"> 1014</span>     c0obs=0;</div>
-<div class="line"><a name="l01015"></a><span class="lineno"> 1015</span>     c1obs=1;</div>
-<div class="line"><a name="l01016"></a><span class="lineno"> 1016</span>     errObs=0;</div>
-<div class="line"><a name="l01017"></a><span class="lineno"> 1017</span>       }</div>
-<div class="line"><a name="l01018"></a><span class="lineno"> 1018</span>       <span class="keywordflow">if</span>(verbose_opt[0])</div>
-<div class="line"><a name="l01019"></a><span class="lineno"> 1019</span>     cout << <span class="stringliteral">"c0obs, c1obs: "</span> << c0obs << <span class="stringliteral">", "</span> << c1obs << endl;</div>
-<div class="line"><a name="l01020"></a><span class="lineno"> 1020</span> </div>
-<div class="line"><a name="l01021"></a><span class="lineno"> 1021</span>       <span class="keywordflow">for</span>(<span class="keywordtype">int</span> irow=0;irow<nrow;++irow){</div>
-<div class="line"><a name="l01022"></a><span class="lineno"> 1022</span>     vector<double> estReadBuffer;</div>
-<div class="line"><a name="l01023"></a><span class="lineno"> 1023</span>     imgWriterEst.image2geo(0,irow,geox,geoy);</div>
-<div class="line"><a name="l01024"></a><span class="lineno"> 1024</span>     imgReaderModel1.geo2image(geox,geoy,modCol,modRow);</div>
-<div class="line"><a name="l01025"></a><span class="lineno"> 1025</span>     assert(modRow>=0&&modRow<imgReaderModel1.nrOfRow());</div>
-<div class="line"><a name="l01026"></a><span class="lineno"> 1026</span>     imgReaderModel1.readData(estReadBuffer,GDT_Float64,modRow);</div>
-<div class="line"><a name="l01027"></a><span class="lineno"> 1027</span>     vector<double> obsLineBuffer;</div>
-<div class="line"><a name="l01028"></a><span class="lineno"> 1028</span>     vector<double> estWriteBuffer(ncol);</div>
-<div class="line"><a name="l01029"></a><span class="lineno"> 1029</span>     vector<double> uncertWriteBuffer(ncol);</div>
-<div class="line"><a name="l01030"></a><span class="lineno"> 1030</span>     vector<double> uncertObsLineBuffer;</div>
-<div class="line"><a name="l01031"></a><span class="lineno"> 1031</span>     <span class="comment">// vector<double> lineMask;</span></div>
-<div class="line"><a name="l01032"></a><span class="lineno"> 1032</span>     <span class="comment">// imgReaderObs.readData(estWriteBuffer,GDT_Float64,irow,0);</span></div>
-<div class="line"><a name="l01033"></a><span class="lineno"> 1033</span>     imgReaderObs.readData(obsLineBuffer,GDT_Float64,irow,0);</div>
-<div class="line"><a name="l01034"></a><span class="lineno"> 1034</span> </div>
-<div class="line"><a name="l01035"></a><span class="lineno"> 1035</span>     <span class="keywordflow">if</span>(imgReaderObs.nrOfBand()>1)</div>
-<div class="line"><a name="l01036"></a><span class="lineno"> 1036</span>       imgReaderObs.readData(uncertObsLineBuffer,GDT_Float64,irow,1);</div>
-<div class="line"><a name="l01037"></a><span class="lineno"> 1037</span>     <span class="comment">// double oldRowMask=-1;//keep track of row mask to optimize number of line readings</span></div>
-<div class="line"><a name="l01038"></a><span class="lineno"> 1038</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> icol=0;icol<imgWriterEst.nrOfCol();++icol){</div>
-<div class="line"><a name="l01039"></a><span class="lineno"> 1039</span>       imgWriterEst.image2geo(icol,irow,geox,geoy);</div>
-<div class="line"><a name="l01040"></a><span class="lineno"> 1040</span>       imgReaderModel1.geo2image(geox,geoy,modCol,modRow);</div>
-<div class="line"><a name="l01041"></a><span class="lineno"> 1041</span>       assert(modRow>=0&&modRow<imgReaderModel1.nrOfRow());</div>
-<div class="line"><a name="l01042"></a><span class="lineno"> 1042</span>       <span class="keywordtype">double</span> modValue=estReadBuffer[modCol];</div>
-<div class="line"><a name="l01043"></a><span class="lineno"> 1043</span>       <span class="keywordflow">if</span>(imgReaderModel1.isNoData(modValue)){<span class="comment">//model is nodata: retain observation </span></div>
-<div class="line"><a name="l01044"></a><span class="lineno"> 1044</span>         estWriteBuffer[icol]=obsLineBuffer[icol];</div>
-<div class="line"><a name="l01045"></a><span class="lineno"> 1045</span>         <span class="keywordflow">if</span>(imgReaderObs.isNoData(obsLineBuffer[icol])){</div>
-<div class="line"><a name="l01046"></a><span class="lineno"> 1046</span>           estWriteBuffer[icol]=obsnodata_opt[0];</div>
-<div class="line"><a name="l01047"></a><span class="lineno"> 1047</span>           uncertWriteBuffer[icol]=uncertNodata_opt[0];</div>
-<div class="line"><a name="l01048"></a><span class="lineno"> 1048</span>         }</div>
-<div class="line"><a name="l01049"></a><span class="lineno"> 1049</span>         <span class="keywordflow">else</span> <span class="keywordflow">if</span>(uncertObsLineBuffer.size()>icol)</div>
-<div class="line"><a name="l01050"></a><span class="lineno"> 1050</span>           uncertWriteBuffer[icol]=uncertObsLineBuffer[icol];</div>
-<div class="line"><a name="l01051"></a><span class="lineno"> 1051</span>         <span class="keywordflow">else</span></div>
-<div class="line"><a name="l01052"></a><span class="lineno"> 1052</span>           uncertWriteBuffer[icol]=uncertObs_opt[0];</div>
-<div class="line"><a name="l01053"></a><span class="lineno"> 1053</span>       }</div>
-<div class="line"><a name="l01054"></a><span class="lineno"> 1054</span>       <span class="keywordflow">else</span>{<span class="comment">//model is valid: calculate estimate from model</span></div>
-<div class="line"><a name="l01055"></a><span class="lineno"> 1055</span>         <span class="keywordtype">double</span> errMod=uncertModel_opt[0]*stdDev;</div>
-<div class="line"><a name="l01056"></a><span class="lineno"> 1056</span>         errMod*=regTime_opt[0];</div>
-<div class="line"><a name="l01057"></a><span class="lineno"> 1057</span>         <span class="comment">// double certNorm=(errMod*errMod+errObs*errObs);</span></div>
-<div class="line"><a name="l01058"></a><span class="lineno"> 1058</span>         <span class="comment">// double certMod=errObs*errObs/certNorm;</span></div>
-<div class="line"><a name="l01059"></a><span class="lineno"> 1059</span>         <span class="comment">// double certObs=errMod*errMod/certNorm;</span></div>
-<div class="line"><a name="l01060"></a><span class="lineno"> 1060</span>         <span class="comment">// double regTime=0;</span></div>
-<div class="line"><a name="l01061"></a><span class="lineno"> 1061</span>         <span class="comment">// double regSensor=(c0obs+c1obs*modValue)*certMod;</span></div>
-<div class="line"><a name="l01062"></a><span class="lineno"> 1062</span>         <span class="comment">// estWriteBuffer[icol]=regTime+regSensor;</span></div>
-<div class="line"><a name="l01063"></a><span class="lineno"> 1063</span>         estWriteBuffer[icol]=modValue;</div>
-<div class="line"><a name="l01064"></a><span class="lineno"> 1064</span>         <span class="keywordtype">double</span> totalUncertainty=errMod;</div>
-<div class="line"><a name="l01065"></a><span class="lineno"> 1065</span>         <span class="comment">// if(errMod<eps_opt[0])</span></div>
-<div class="line"><a name="l01066"></a><span class="lineno"> 1066</span>         <span class="comment">//   totalUncertainty=errObs;</span></div>
-<div class="line"><a name="l01067"></a><span class="lineno"> 1067</span>         <span class="comment">// else if(errObs<eps_opt[0])</span></div>
-<div class="line"><a name="l01068"></a><span class="lineno"> 1068</span>         <span class="comment">//   totalUncertainty=errMod;</span></div>
-<div class="line"><a name="l01069"></a><span class="lineno"> 1069</span>         <span class="comment">// else{</span></div>
-<div class="line"><a name="l01070"></a><span class="lineno"> 1070</span>         <span class="comment">//   totalUncertainty=1.0/errMod/errMod+1/errObs/errObs;</span></div>
-<div class="line"><a name="l01071"></a><span class="lineno"> 1071</span>         <span class="comment">//   totalUncertainty=sqrt(1.0/totalUncertainty);</span></div>
-<div class="line"><a name="l01072"></a><span class="lineno"> 1072</span>         <span class="comment">// }</span></div>
-<div class="line"><a name="l01073"></a><span class="lineno"> 1073</span>         uncertWriteBuffer[icol]=totalUncertainty;<span class="comment">//in case observation is not valid</span></div>
-<div class="line"><a name="l01074"></a><span class="lineno"> 1074</span>       }</div>
-<div class="line"><a name="l01075"></a><span class="lineno"> 1075</span>       <span class="comment">//measurement update</span></div>
-<div class="line"><a name="l01076"></a><span class="lineno"> 1076</span>       <span class="keywordflow">if</span>(!imgReaderObs.isNoData(obsLineBuffer[icol])){</div>
-<div class="line"><a name="l01077"></a><span class="lineno"> 1077</span>         <span class="keywordtype">double</span> kalmanGain=1;</div>
-<div class="line"><a name="l01078"></a><span class="lineno"> 1078</span>         <span class="keywordtype">double</span> uncertObs=uncertObs_opt[0];</div>
-<div class="line"><a name="l01079"></a><span class="lineno"> 1079</span>         <span class="keywordflow">if</span>(uncertObsLineBuffer.size()>icol)</div>
-<div class="line"><a name="l01080"></a><span class="lineno"> 1080</span>           uncertObs=uncertObsLineBuffer[icol];</div>
-<div class="line"><a name="l01081"></a><span class="lineno"> 1081</span>         <span class="keywordflow">else</span> <span class="keywordflow">if</span>(weight_opt.size()>1||deltaObs_opt.size()){</div>
-<div class="line"><a name="l01082"></a><span class="lineno"> 1082</span>           vector<double> obsWindowBuffer;<span class="comment">//buffer for observation to calculate average corresponding to model pixel</span></div>
-<div class="line"><a name="l01083"></a><span class="lineno"> 1083</span>           <span class="keywordtype">int</span> minCol=(icol>down_opt[0]/2) ? icol-down_opt[0]/2 : 0;</div>
-<div class="line"><a name="l01084"></a><span class="lineno"> 1084</span>           <span class="keywordtype">int</span> maxCol=(icol+down_opt[0]/2<imgReaderObs.nrOfCol()) ? icol+down_opt[0]/2 : imgReaderObs.nrOfCol()-1;</div>
-<div class="line"><a name="l01085"></a><span class="lineno"> 1085</span>           <span class="keywordtype">int</span> minRow=(irow>down_opt[0]/2) ? irow-down_opt[0]/2 : 0;</div>
-<div class="line"><a name="l01086"></a><span class="lineno"> 1086</span>           <span class="keywordtype">int</span> maxRow=(irow+down_opt[0]/2<imgReaderObs.nrOfRow()) ? irow+down_opt[0]/2 : imgReaderObs.nrOfRow()-1;</div>
-<div class="line"><a name="l01087"></a><span class="lineno"> 1087</span>         </div>
-<div class="line"><a name="l01088"></a><span class="lineno"> 1088</span>           imgReaderObs.readDataBlock(obsWindowBuffer,GDT_Float64,minCol,maxCol,minRow,maxRow,0);</div>
-<div class="line"><a name="l01089"></a><span class="lineno"> 1089</span>           <a class="code" href="classstatfactory_1_1StatFactory.html">statfactory::StatFactory</a> statobs;</div>
-<div class="line"><a name="l01090"></a><span class="lineno"> 1090</span>           statobs.setNoDataValues(obsnodata_opt);</div>
-<div class="line"><a name="l01091"></a><span class="lineno"> 1091</span>           <span class="keywordtype">double</span> obsMeanValue=(statobs.mean(obsWindowBuffer)-c0obs)/c1obs;</div>
-<div class="line"><a name="l01092"></a><span class="lineno"> 1092</span>           <span class="keywordtype">double</span> difference=obsMeanValue-modValue;</div>
-<div class="line"><a name="l01093"></a><span class="lineno"> 1093</span>           <span class="keywordflow">if</span>(modValue){</div>
-<div class="line"><a name="l01094"></a><span class="lineno"> 1094</span>         <span class="keywordtype">double</span> relativeDifference=difference/modValue;</div>
-<div class="line"><a name="l01095"></a><span class="lineno"> 1095</span>         <span class="keywordflow">if</span>(deltaObs_opt.size()){</div>
-<div class="line"><a name="l01096"></a><span class="lineno"> 1096</span>           assert(deltaObs_opt.size()>1);</div>
-<div class="line"><a name="l01097"></a><span class="lineno"> 1097</span>           <span class="keywordflow">if</span>(100*relativeDifference<deltaObs_opt[0])<span class="comment">//lower bound</span></div>
-<div class="line"><a name="l01098"></a><span class="lineno"> 1098</span>             kalmanGain=0;</div>
-<div class="line"><a name="l01099"></a><span class="lineno"> 1099</span>           <span class="keywordflow">else</span> <span class="keywordflow">if</span>(100*relativeDifference>deltaObs_opt[1])<span class="comment">//upper bound</span></div>
-<div class="line"><a name="l01100"></a><span class="lineno"> 1100</span>             kalmanGain=0;</div>
-<div class="line"><a name="l01101"></a><span class="lineno"> 1101</span>         }</div>
-<div class="line"><a name="l01102"></a><span class="lineno"> 1102</span>         <span class="keywordflow">else</span> <span class="keywordflow">if</span>(weight_opt.size()){</div>
-<div class="line"><a name="l01103"></a><span class="lineno"> 1103</span>           assert(weight_opt.size()>1);</div>
-<div class="line"><a name="l01104"></a><span class="lineno"> 1104</span>           <span class="keywordflow">if</span>(obsMeanValue<modValue)</div>
-<div class="line"><a name="l01105"></a><span class="lineno"> 1105</span>             uncertObs=weight_opt[0]*relativeDifference;</div>
-<div class="line"><a name="l01106"></a><span class="lineno"> 1106</span>           <span class="keywordflow">else</span> <span class="keywordflow">if</span>(obsMeanValue>modValue)</div>
-<div class="line"><a name="l01107"></a><span class="lineno"> 1107</span>             uncertObs=weight_opt[1]*relativeDifference;</div>
-<div class="line"><a name="l01108"></a><span class="lineno"> 1108</span>         }</div>
-<div class="line"><a name="l01109"></a><span class="lineno"> 1109</span>           }</div>
-<div class="line"><a name="l01110"></a><span class="lineno"> 1110</span>           <span class="keywordflow">if</span>(uncertObs<=0)</div>
-<div class="line"><a name="l01111"></a><span class="lineno"> 1111</span>         uncertObs=0;</div>
-<div class="line"><a name="l01112"></a><span class="lineno"> 1112</span>           <span class="keywordflow">if</span>(verbose_opt[0]>1)</div>
-<div class="line"><a name="l01113"></a><span class="lineno"> 1113</span>         cout << <span class="stringliteral">"obsMeanValue:"</span> << obsMeanValue << <span class="stringliteral">", modValue: "</span> << modValue << endl;</div>
-<div class="line"><a name="l01114"></a><span class="lineno"> 1114</span>         }</div>
-<div class="line"><a name="l01115"></a><span class="lineno"> 1115</span>         <span class="keywordflow">if</span>(kalmanGain>0){</div>
-<div class="line"><a name="l01116"></a><span class="lineno"> 1116</span>           <span class="keywordflow">if</span>((uncertWriteBuffer[icol]+uncertObs)>eps_opt[0])</div>
-<div class="line"><a name="l01117"></a><span class="lineno"> 1117</span>         kalmanGain=uncertWriteBuffer[icol]/(uncertWriteBuffer[icol]+uncertObs);</div>
-<div class="line"><a name="l01118"></a><span class="lineno"> 1118</span>         }</div>
-<div class="line"><a name="l01119"></a><span class="lineno"> 1119</span>         assert(kalmanGain<=1);</div>
-<div class="line"><a name="l01120"></a><span class="lineno"> 1120</span>         estWriteBuffer[icol]+=kalmanGain*(obsLineBuffer[icol]-estWriteBuffer[icol]);</div>
-<div class="line"><a name="l01121"></a><span class="lineno"> 1121</span>         uncertWriteBuffer[icol]*=(1-kalmanGain);</div>
-<div class="line"><a name="l01122"></a><span class="lineno"> 1122</span>       }</div>
-<div class="line"><a name="l01123"></a><span class="lineno"> 1123</span>     }</div>
-<div class="line"><a name="l01124"></a><span class="lineno"> 1124</span>     imgWriterEst.writeData(estWriteBuffer,GDT_Float64,irow,0);</div>
-<div class="line"><a name="l01125"></a><span class="lineno"> 1125</span>     imgWriterEst.writeData(uncertWriteBuffer,GDT_Float64,irow,1);</div>
-<div class="line"><a name="l01126"></a><span class="lineno"> 1126</span>       }</div>
-<div class="line"><a name="l01127"></a><span class="lineno"> 1127</span>       imgReaderObs.close();</div>
-<div class="line"><a name="l01128"></a><span class="lineno"> 1128</span>       --obsindex;</div>
-<div class="line"><a name="l01129"></a><span class="lineno"> 1129</span>     }</div>
-<div class="line"><a name="l01130"></a><span class="lineno"> 1130</span>     imgReaderModel1.close();</div>
-<div class="line"><a name="l01131"></a><span class="lineno"> 1131</span>     imgWriterEst.close();</div>
-<div class="line"><a name="l01132"></a><span class="lineno"> 1132</span> </div>
-<div class="line"><a name="l01133"></a><span class="lineno"> 1133</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> modindex=model_opt.size()-2;modindex>=0;--modindex){</div>
-<div class="line"><a name="l01134"></a><span class="lineno"> 1134</span>       <span class="keywordflow">if</span>(verbose_opt[0]){</div>
-<div class="line"><a name="l01135"></a><span class="lineno"> 1135</span>     cout << <span class="stringliteral">"processing time "</span> << tmodel_opt[modindex] << endl;</div>
-<div class="line"><a name="l01136"></a><span class="lineno"> 1136</span>     <span class="keywordflow">if</span>(obsindex<relobsindex.size())</div>
-<div class="line"><a name="l01137"></a><span class="lineno"> 1137</span>       cout << <span class="stringliteral">"next observation "</span> << tmodel_opt[relobsindex[obsindex]] << endl;</div>
-<div class="line"><a name="l01138"></a><span class="lineno"> 1138</span>     <span class="keywordflow">else</span></div>
-<div class="line"><a name="l01139"></a><span class="lineno"> 1139</span>       cout << <span class="stringliteral">"There is no next observation"</span> << endl;</div>
-<div class="line"><a name="l01140"></a><span class="lineno"> 1140</span>       }</div>
-<div class="line"><a name="l01141"></a><span class="lineno"> 1141</span>       <span class="keywordtype">string</span> output;</div>
-<div class="line"><a name="l01142"></a><span class="lineno"> 1142</span>       <span class="keywordflow">if</span>(outputbw_opt.size()==model_opt.size())</div>
-<div class="line"><a name="l01143"></a><span class="lineno"> 1143</span>     output=outputbw_opt[modindex];</div>
-<div class="line"><a name="l01144"></a><span class="lineno"> 1144</span>       <span class="keywordflow">else</span>{</div>
-<div class="line"><a name="l01145"></a><span class="lineno"> 1145</span>     ostringstream outputstream;</div>
-<div class="line"><a name="l01146"></a><span class="lineno"> 1146</span>     outputstream << outputbw_opt[0] << <span class="stringliteral">"_"</span>;</div>
-<div class="line"><a name="l01147"></a><span class="lineno"> 1147</span>     outputstream << setfill(<span class="charliteral">'0'</span>) << setw(ndigit) << tmodel_opt[modindex];</div>
-<div class="line"><a name="l01148"></a><span class="lineno"> 1148</span>     outputstream << <span class="stringliteral">".tif"</span>;</div>
-<div class="line"><a name="l01149"></a><span class="lineno"> 1149</span>     <span class="comment">// outputstream << outputbw_opt[0] << "_" << tmodel_opt[modindex] << ".tif";</span></div>
-<div class="line"><a name="l01150"></a><span class="lineno"> 1150</span>     output=outputstream.str();</div>
-<div class="line"><a name="l01151"></a><span class="lineno"> 1151</span>       }</div>
-<div class="line"><a name="l01152"></a><span class="lineno"> 1152</span> </div>
-<div class="line"><a name="l01153"></a><span class="lineno"> 1153</span>       <span class="comment">//two band output band0=estimation, band1=uncertainty</span></div>
-<div class="line"><a name="l01154"></a><span class="lineno"> 1154</span>       imgWriterEst.open(output,ncol,nrow,2,GDT_Float32,imageType,option_opt);</div>
-<div class="line"><a name="l01155"></a><span class="lineno"> 1155</span>       imgWriterEst.setProjectionProj4(projection_opt[0]);</div>
-<div class="line"><a name="l01156"></a><span class="lineno"> 1156</span>       imgWriterEst.setGeoTransform(geotransform);</div>
-<div class="line"><a name="l01157"></a><span class="lineno"> 1157</span>       imgWriterEst.GDALSetNoDataValue(obsnodata_opt[0]);</div>
-<div class="line"><a name="l01158"></a><span class="lineno"> 1158</span> </div>
-<div class="line"><a name="l01159"></a><span class="lineno"> 1159</span>       <span class="comment">//calculate regression between two subsequence model inputs</span></div>
-<div class="line"><a name="l01160"></a><span class="lineno"> 1160</span>       imgReaderModel1.open(model_opt[modindex+1]);</div>
-<div class="line"><a name="l01161"></a><span class="lineno"> 1161</span>       imgReaderModel1.setNoData(modnodata_opt);</div>
-<div class="line"><a name="l01162"></a><span class="lineno"> 1162</span>       <span class="keywordflow">if</span>(modoffset_opt.size())</div>
-<div class="line"><a name="l01163"></a><span class="lineno"> 1163</span>     imgReaderModel1.setOffset(modoffset_opt[0]);</div>
-<div class="line"><a name="l01164"></a><span class="lineno"> 1164</span>       <span class="keywordflow">if</span>(modscale_opt.size())</div>
-<div class="line"><a name="l01165"></a><span class="lineno"> 1165</span>     imgReaderModel1.setScale(modscale_opt[0]);</div>
-<div class="line"><a name="l01166"></a><span class="lineno"> 1166</span>       imgReaderModel2.open(model_opt[modindex]);</div>
-<div class="line"><a name="l01167"></a><span class="lineno"> 1167</span>       imgReaderModel2.setNoData(modnodata_opt);</div>
-<div class="line"><a name="l01168"></a><span class="lineno"> 1168</span>       <span class="keywordflow">if</span>(modoffset_opt.size())</div>
-<div class="line"><a name="l01169"></a><span class="lineno"> 1169</span>     imgReaderModel2.setOffset(modoffset_opt[0]);</div>
-<div class="line"><a name="l01170"></a><span class="lineno"> 1170</span>       <span class="keywordflow">if</span>(modscale_opt.size())</div>
-<div class="line"><a name="l01171"></a><span class="lineno"> 1171</span>     imgReaderModel2.setScale(modscale_opt[0]);</div>
-<div class="line"><a name="l01172"></a><span class="lineno"> 1172</span>       <span class="comment">//calculate regression</span></div>
-<div class="line"><a name="l01173"></a><span class="lineno"> 1173</span>       <span class="comment">//we could re-use the points from second image from last run, but</span></div>
-<div class="line"><a name="l01174"></a><span class="lineno"> 1174</span>       <span class="comment">//to keep it general, we must redo it (overlap might have changed)</span></div>
-<div class="line"><a name="l01175"></a><span class="lineno"> 1175</span>     </div>
-<div class="line"><a name="l01176"></a><span class="lineno"> 1176</span>       pfnProgress(progress,pszMessage,pProgressArg);</div>
-<div class="line"><a name="l01177"></a><span class="lineno"> 1177</span> </div>
-<div class="line"><a name="l01178"></a><span class="lineno"> 1178</span>       <span class="keywordflow">if</span>(verbose_opt[0])</div>
-<div class="line"><a name="l01179"></a><span class="lineno"> 1179</span>     cout << <span class="stringliteral">"Calculating regression for "</span> << imgReaderModel1.getFileName() << <span class="stringliteral">" "</span> << imgReaderModel2.getFileName() << endl;</div>
-<div class="line"><a name="l01180"></a><span class="lineno"> 1180</span> </div>
-<div class="line"><a name="l01181"></a><span class="lineno"> 1181</span>       <span class="keywordtype">double</span> errMod=imgreg.getRMSE(imgReaderModel1,imgReaderModel2,c0modGlobal,c1modGlobal,0,0);</div>
-<div class="line"><a name="l01182"></a><span class="lineno"> 1182</span>       errMod*=regTime_opt[0];</div>
-<div class="line"><a name="l01183"></a><span class="lineno"> 1183</span> </div>
-<div class="line"><a name="l01184"></a><span class="lineno"> 1184</span>       <span class="comment">// double errMod=imgreg.getRMSE(imgReaderModel1,imgReaderModel2,c0modGlobal,c1modGlobal,verbose_opt[0]);</span></div>
-<div class="line"><a name="l01185"></a><span class="lineno"> 1185</span>       <span class="keywordflow">if</span>(verbose_opt[0])</div>
-<div class="line"><a name="l01186"></a><span class="lineno"> 1186</span>     cout << <span class="stringliteral">"c0modGlobal, c1modGlobal: "</span> << c0modGlobal << <span class="stringliteral">", "</span> << c1modGlobal << endl;</div>
-<div class="line"><a name="l01187"></a><span class="lineno"> 1187</span> </div>
-<div class="line"><a name="l01188"></a><span class="lineno"> 1188</span>       <span class="keywordtype">bool</span> update=<span class="keyword">false</span>;</div>
-<div class="line"><a name="l01189"></a><span class="lineno"> 1189</span>       <span class="keywordflow">if</span>(obsindex<relobsindex.size()){</div>
-<div class="line"><a name="l01190"></a><span class="lineno"> 1190</span>     update=(relobsindex[obsindex]==modindex);</div>
-<div class="line"><a name="l01191"></a><span class="lineno"> 1191</span>       }</div>
-<div class="line"><a name="l01192"></a><span class="lineno"> 1192</span>       <span class="keywordflow">if</span>(update){</div>
-<div class="line"><a name="l01193"></a><span class="lineno"> 1193</span>     <span class="keywordflow">if</span>(verbose_opt[0])</div>
-<div class="line"><a name="l01194"></a><span class="lineno"> 1194</span>       cout << <span class="stringliteral">"***update "</span> << relobsindex[obsindex] << <span class="stringliteral">" = "</span> << modindex << <span class="stringliteral">" "</span> << observation_opt[obsindex] << <span class="stringliteral">" ***"</span> << endl;</div>
-<div class="line"><a name="l01195"></a><span class="lineno"> 1195</span> </div>
-<div class="line"><a name="l01196"></a><span class="lineno"> 1196</span>     imgReaderObs.open(observation_opt[obsindex]);</div>
-<div class="line"><a name="l01197"></a><span class="lineno"> 1197</span>     imgReaderObs.getGeoTransform(geotransform);</div>
-<div class="line"><a name="l01198"></a><span class="lineno"> 1198</span>     imgReaderObs.setNoData(obsnodata_opt);</div>
-<div class="line"><a name="l01199"></a><span class="lineno"> 1199</span>     <span class="keywordflow">if</span>(obsoffset_opt.size())</div>
-<div class="line"><a name="l01200"></a><span class="lineno"> 1200</span>       imgReaderObs.setOffset(obsoffset_opt[0]);</div>
-<div class="line"><a name="l01201"></a><span class="lineno"> 1201</span>     <span class="keywordflow">if</span>(obsscale_opt.size())</div>
-<div class="line"><a name="l01202"></a><span class="lineno"> 1202</span>       imgReaderObs.setScale(obsscale_opt[0]);</div>
-<div class="line"><a name="l01203"></a><span class="lineno"> 1203</span>     <span class="comment">//calculate regression between model and observation</span></div>
-<div class="line"><a name="l01204"></a><span class="lineno"> 1204</span>     <span class="keywordflow">if</span>(verbose_opt[0])</div>
-<div class="line"><a name="l01205"></a><span class="lineno"> 1205</span>       cout << <span class="stringliteral">"Calculating regression for "</span> << imgReaderModel2.getFileName() << <span class="stringliteral">" "</span> << imgReaderObs.getFileName() << endl;</div>
-<div class="line"><a name="l01206"></a><span class="lineno"> 1206</span>     <span class="keywordflow">if</span>(regSensor_opt[0]>0)</div>
-<div class="line"><a name="l01207"></a><span class="lineno"> 1207</span>       errObs=regSensor_opt[0]*imgreg.getRMSE(imgReaderModel2,imgReaderObs,c0obs,c1obs,0,0,verbose_opt[0]);</div>
-<div class="line"><a name="l01208"></a><span class="lineno"> 1208</span>     <span class="keywordflow">else</span>{</div>
-<div class="line"><a name="l01209"></a><span class="lineno"> 1209</span>       c0obs=0;</div>
-<div class="line"><a name="l01210"></a><span class="lineno"> 1210</span>       c1obs=1;</div>
-<div class="line"><a name="l01211"></a><span class="lineno"> 1211</span>       errObs=0;</div>
-<div class="line"><a name="l01212"></a><span class="lineno"> 1212</span>     }</div>
-<div class="line"><a name="l01213"></a><span class="lineno"> 1213</span>     <span class="keywordflow">if</span>(verbose_opt[0])</div>
-<div class="line"><a name="l01214"></a><span class="lineno"> 1214</span>       cout << <span class="stringliteral">"c0obs, c1obs: "</span> << c0obs << <span class="stringliteral">", "</span> << c1obs << endl;</div>
-<div class="line"><a name="l01215"></a><span class="lineno"> 1215</span>       }</div>
-<div class="line"><a name="l01216"></a><span class="lineno"> 1216</span>       <span class="comment">//prediction (also to fill cloudy pixels in update mode)</span></div>
-<div class="line"><a name="l01217"></a><span class="lineno"> 1217</span>       <span class="keywordtype">string</span> input;</div>
-<div class="line"><a name="l01218"></a><span class="lineno"> 1218</span>       <span class="keywordflow">if</span>(outputbw_opt.size()==model_opt.size())</div>
-<div class="line"><a name="l01219"></a><span class="lineno"> 1219</span>     input=outputbw_opt[modindex+1];</div>
-<div class="line"><a name="l01220"></a><span class="lineno"> 1220</span>       <span class="keywordflow">else</span>{</div>
-<div class="line"><a name="l01221"></a><span class="lineno"> 1221</span>     ostringstream outputstream;</div>
-<div class="line"><a name="l01222"></a><span class="lineno"> 1222</span>     outputstream << outputbw_opt[0] << <span class="stringliteral">"_"</span>;</div>
-<div class="line"><a name="l01223"></a><span class="lineno"> 1223</span>     outputstream << setfill(<span class="charliteral">'0'</span>) << setw(ndigit) << tmodel_opt[modindex+1];</div>
-<div class="line"><a name="l01224"></a><span class="lineno"> 1224</span>     outputstream << <span class="stringliteral">".tif"</span>;</div>
-<div class="line"><a name="l01225"></a><span class="lineno"> 1225</span>     <span class="comment">// outputstream << outputbw_opt[0] << "_" << tmodel_opt[modindex+1] << ".tif";</span></div>
-<div class="line"><a name="l01226"></a><span class="lineno"> 1226</span>     input=outputstream.str();</div>
-<div class="line"><a name="l01227"></a><span class="lineno"> 1227</span>       }</div>
-<div class="line"><a name="l01228"></a><span class="lineno"> 1228</span>       <a class="code" href="classImgReaderGdal.html">ImgReaderGdal</a> imgReaderEst(input);</div>
-<div class="line"><a name="l01229"></a><span class="lineno"> 1229</span>       imgReaderEst.setNoData(obsnodata_opt);</div>
-<div class="line"><a name="l01230"></a><span class="lineno"> 1230</span>       <span class="keywordflow">if</span>(obsoffset_opt.size())</div>
-<div class="line"><a name="l01231"></a><span class="lineno"> 1231</span>     imgReaderEst.setOffset(obsoffset_opt[0]);</div>
-<div class="line"><a name="l01232"></a><span class="lineno"> 1232</span>       <span class="keywordflow">if</span>(obsscale_opt.size())</div>
-<div class="line"><a name="l01233"></a><span class="lineno"> 1233</span>     imgReaderEst.setScale(obsscale_opt[0]);</div>
-<div class="line"><a name="l01234"></a><span class="lineno"> 1234</span>       </div>
-<div class="line"><a name="l01235"></a><span class="lineno"> 1235</span>       vector< vector<double> > obsLineVector(down_opt[0]);</div>
-<div class="line"><a name="l01236"></a><span class="lineno"> 1236</span>       vector<double> obsLineBuffer;</div>
-<div class="line"><a name="l01237"></a><span class="lineno"> 1237</span>       vector<double> obsWindowBuffer;<span class="comment">//buffer for observation to calculate average corresponding to model pixel</span></div>
-<div class="line"><a name="l01238"></a><span class="lineno"> 1238</span>       vector<double> model1LineBuffer;</div>
-<div class="line"><a name="l01239"></a><span class="lineno"> 1239</span>       vector<double> model2LineBuffer;</div>
-<div class="line"><a name="l01240"></a><span class="lineno"> 1240</span>       vector<double> model1buffer;<span class="comment">//buffer for model 1 to calculate time regression based on window</span></div>
-<div class="line"><a name="l01241"></a><span class="lineno"> 1241</span>       vector<double> model2buffer;<span class="comment">//buffer for model 2 to calculate time regression based on window</span></div>
-<div class="line"><a name="l01242"></a><span class="lineno"> 1242</span>       vector<double> uncertObsLineBuffer;</div>
-<div class="line"><a name="l01243"></a><span class="lineno"> 1243</span>       vector<double> estReadBuffer;</div>
-<div class="line"><a name="l01244"></a><span class="lineno"> 1244</span>       <span class="comment">// vector<double> estWindowBuffer;//buffer for estimate to calculate average corresponding to model pixel</span></div>
-<div class="line"><a name="l01245"></a><span class="lineno"> 1245</span>       vector<double> uncertReadBuffer;</div>
-<div class="line"><a name="l01246"></a><span class="lineno"> 1246</span>       vector<double> estWriteBuffer(ncol);</div>
-<div class="line"><a name="l01247"></a><span class="lineno"> 1247</span>       vector<double> uncertWriteBuffer(ncol);</div>
-<div class="line"><a name="l01248"></a><span class="lineno"> 1248</span>       <span class="comment">// vector<double> lineMask;</span></div>
-<div class="line"><a name="l01249"></a><span class="lineno"> 1249</span> </div>
-<div class="line"><a name="l01250"></a><span class="lineno"> 1250</span>       <span class="comment">//initialize obsLineVector</span></div>
-<div class="line"><a name="l01251"></a><span class="lineno"> 1251</span>       <span class="keywordflow">if</span>(update){</div>
-<div class="line"><a name="l01252"></a><span class="lineno"> 1252</span>     assert(down_opt[0]%2);<span class="comment">//window size must be odd </span></div>
-<div class="line"><a name="l01253"></a><span class="lineno"> 1253</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iline=-down_opt[0]/2;iline<down_opt[0]/2+1;++iline){</div>
-<div class="line"><a name="l01254"></a><span class="lineno"> 1254</span>       <span class="keywordflow">if</span>(iline<0)<span class="comment">//replicate line 0</span></div>
-<div class="line"><a name="l01255"></a><span class="lineno"> 1255</span>         imgReaderObs.readData(obsLineVector[iline+down_opt[0]/2],GDT_Float64,0,0);</div>
-<div class="line"><a name="l01256"></a><span class="lineno"> 1256</span>       <span class="keywordflow">else</span></div>
-<div class="line"><a name="l01257"></a><span class="lineno"> 1257</span>         imgReaderObs.readData(obsLineVector[iline+down_opt[0]/2],GDT_Float64,iline,0);</div>
-<div class="line"><a name="l01258"></a><span class="lineno"> 1258</span>     }</div>
-<div class="line"><a name="l01259"></a><span class="lineno"> 1259</span>       }</div>
-<div class="line"><a name="l01260"></a><span class="lineno"> 1260</span>       <span class="keywordflow">for</span>(<span class="keywordtype">int</span> irow=0;irow<imgWriterEst.nrOfRow();++irow){</div>
-<div class="line"><a name="l01261"></a><span class="lineno"> 1261</span>     assert(irow<imgReaderEst.nrOfRow());</div>
-<div class="line"><a name="l01262"></a><span class="lineno"> 1262</span>     <span class="comment">//do not read from imgReaderObs, because we read entire window for each pixel...</span></div>
-<div class="line"><a name="l01263"></a><span class="lineno"> 1263</span>     imgReaderEst.readData(estReadBuffer,GDT_Float64,irow,0);</div>
-<div class="line"><a name="l01264"></a><span class="lineno"> 1264</span>     imgReaderEst.readData(uncertReadBuffer,GDT_Float64,irow,1);</div>
-<div class="line"><a name="l01265"></a><span class="lineno"> 1265</span>     <span class="comment">//read model2 in case current estimate is nodata</span></div>
-<div class="line"><a name="l01266"></a><span class="lineno"> 1266</span>     imgReaderEst.image2geo(0,irow,geox,geoy);</div>
-<div class="line"><a name="l01267"></a><span class="lineno"> 1267</span>     imgReaderModel2.geo2image(geox,geoy,modCol,modRow);</div>
-<div class="line"><a name="l01268"></a><span class="lineno"> 1268</span>     assert(modRow>=0&&modRow<imgReaderModel2.nrOfRow());</div>
-<div class="line"><a name="l01269"></a><span class="lineno"> 1269</span>     imgReaderModel2.readData(model2LineBuffer,GDT_Float64,modRow,0);</div>
-<div class="line"><a name="l01270"></a><span class="lineno"> 1270</span> </div>
-<div class="line"><a name="l01271"></a><span class="lineno"> 1271</span>     imgReaderModel1.geo2image(geox,geoy,modCol,modRow);</div>
-<div class="line"><a name="l01272"></a><span class="lineno"> 1272</span>     assert(modRow>=0&&modRow<imgReaderModel1.nrOfRow());</div>
-<div class="line"><a name="l01273"></a><span class="lineno"> 1273</span>     imgReaderModel1.readData(model1LineBuffer,GDT_Float64,modRow,0);</div>
-<div class="line"><a name="l01274"></a><span class="lineno"> 1274</span> </div>
-<div class="line"><a name="l01275"></a><span class="lineno"> 1275</span>     <span class="keywordflow">if</span>(update){</div>
-<div class="line"><a name="l01276"></a><span class="lineno"> 1276</span>       <span class="keywordtype">int</span> maxRow=(irow+down_opt[0]/2<imgReaderEst.nrOfRow()) ? irow+down_opt[0]/2 : imgReaderEst.nrOfRow()-1;</div>
-<div class="line"><a name="l01277"></a><span class="lineno"> 1277</span>       obsLineVector.erase(obsLineVector.begin());</div>
-<div class="line"><a name="l01278"></a><span class="lineno"> 1278</span>       imgReaderObs.readData(obsLineBuffer,GDT_Float64,maxRow,0);</div>
-<div class="line"><a name="l01279"></a><span class="lineno"> 1279</span>       obsLineVector.push_back(obsLineBuffer);</div>
-<div class="line"><a name="l01280"></a><span class="lineno"> 1280</span>       obsLineBuffer=obsLineVector[down_opt[0]/2];</div>
-<div class="line"><a name="l01281"></a><span class="lineno"> 1281</span>       <span class="comment">// imgReaderObs.readData(obsLineBuffer,GDT_Float64,irow,0);</span></div>
-<div class="line"><a name="l01282"></a><span class="lineno"> 1282</span>       <span class="keywordflow">if</span>(imgReaderObs.nrOfBand()>1)</div>
-<div class="line"><a name="l01283"></a><span class="lineno"> 1283</span>         imgReaderObs.readData(uncertObsLineBuffer,GDT_Float64,irow,1);</div>
-<div class="line"><a name="l01284"></a><span class="lineno"> 1284</span>     }</div>
-<div class="line"><a name="l01285"></a><span class="lineno"> 1285</span>     <span class="comment">// double oldRowMask=-1;//keep track of row mask to optimize number of line readings</span></div>
-<div class="line"><a name="l01286"></a><span class="lineno"> 1286</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> icol=0;icol<imgWriterEst.nrOfCol();++icol){</div>
-<div class="line"><a name="l01287"></a><span class="lineno"> 1287</span>       imgReaderEst.image2geo(icol,irow,geox,geoy);</div>
-<div class="line"><a name="l01288"></a><span class="lineno"> 1288</span>       <span class="keywordtype">int</span> minCol=(icol>down_opt[0]/2) ? icol-down_opt[0]/2 : 0;</div>
-<div class="line"><a name="l01289"></a><span class="lineno"> 1289</span>       <span class="keywordtype">int</span> maxCol=(icol+down_opt[0]/2<imgReaderEst.nrOfCol()) ? icol+down_opt[0]/2 : imgReaderEst.nrOfCol()-1;</div>
-<div class="line"><a name="l01290"></a><span class="lineno"> 1290</span>       <span class="keywordtype">int</span> minRow=(irow>down_opt[0]/2) ? irow-down_opt[0]/2 : 0;</div>
-<div class="line"><a name="l01291"></a><span class="lineno"> 1291</span>       <span class="keywordtype">int</span> maxRow=(irow+down_opt[0]/2<imgReaderEst.nrOfRow()) ? irow+down_opt[0]/2 : imgReaderEst.nrOfRow()-1;</div>
-<div class="line"><a name="l01292"></a><span class="lineno"> 1292</span>       <span class="keywordflow">if</span>(update){</div>
-<div class="line"><a name="l01293"></a><span class="lineno"> 1293</span>         obsWindowBuffer.clear();</div>
-<div class="line"><a name="l01294"></a><span class="lineno"> 1294</span>         <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iline=0;iline<obsLineVector.size();++iline){</div>
-<div class="line"><a name="l01295"></a><span class="lineno"> 1295</span>           <span class="keywordflow">for</span>(<span class="keywordtype">int</span> isample=minCol;isample<=maxCol;++isample){</div>
-<div class="line"><a name="l01296"></a><span class="lineno"> 1296</span>         assert(isample<obsLineVector[iline].size());</div>
-<div class="line"><a name="l01297"></a><span class="lineno"> 1297</span>         obsWindowBuffer.push_back(obsLineVector[iline][isample]);</div>
-<div class="line"><a name="l01298"></a><span class="lineno"> 1298</span>           }</div>
-<div class="line"><a name="l01299"></a><span class="lineno"> 1299</span>         }</div>
-<div class="line"><a name="l01300"></a><span class="lineno"> 1300</span>         <span class="comment">// imgReaderObs.readDataBlock(obsWindowBuffer,GDT_Float64,minCol,maxCol,minRow,maxRow,0);</span></div>
-<div class="line"><a name="l01301"></a><span class="lineno"> 1301</span>       }</div>
-<div class="line"><a name="l01302"></a><span class="lineno"> 1302</span>       <span class="keywordtype">double</span> estValue=estReadBuffer[icol];</div>
-<div class="line"><a name="l01303"></a><span class="lineno"> 1303</span>       <span class="keywordtype">double</span> estMeanValue=0;<span class="comment">//stat.mean(estWindowBuffer);</span></div>
-<div class="line"><a name="l01304"></a><span class="lineno"> 1304</span>       <span class="keywordtype">double</span> nvalid=0;</div>
-<div class="line"><a name="l01305"></a><span class="lineno"> 1305</span>       <span class="comment">//time update</span></div>
-<div class="line"><a name="l01306"></a><span class="lineno"> 1306</span>       imgReaderModel2.geo2image(geox,geoy,modCol,modRow);</div>
-<div class="line"><a name="l01307"></a><span class="lineno"> 1307</span>       assert(modRow>=0&&modRow<imgReaderModel2.nrOfRow());</div>
-<div class="line"><a name="l01308"></a><span class="lineno"> 1308</span>       <span class="keywordtype">double</span> modValue=model2LineBuffer[modCol];</div>
-<div class="line"><a name="l01309"></a><span class="lineno"> 1309</span>       <span class="keywordtype">bool</span> estNodata=imgReaderEst.isNoData(estValue);</div>
-<div class="line"><a name="l01310"></a><span class="lineno"> 1310</span>       <span class="keywordflow">if</span>(estNodata){</div>
-<div class="line"><a name="l01311"></a><span class="lineno"> 1311</span>         <span class="comment">//we have not found any valid data yet, better here to take the current model value if valid</span></div>
-<div class="line"><a name="l01312"></a><span class="lineno"> 1312</span>         <span class="keywordflow">if</span>(imgReaderModel2.isNoData(modValue)){<span class="comment">//if both estimate and model are no-data, set obs to nodata</span></div>
-<div class="line"><a name="l01313"></a><span class="lineno"> 1313</span>           estWriteBuffer[icol]=obsnodata_opt[0];</div>
-<div class="line"><a name="l01314"></a><span class="lineno"> 1314</span>           uncertWriteBuffer[icol]=uncertNodata_opt[0];</div>
-<div class="line"><a name="l01315"></a><span class="lineno"> 1315</span>         }</div>
-<div class="line"><a name="l01316"></a><span class="lineno"> 1316</span>         <span class="keywordflow">else</span>{</div>
-<div class="line"><a name="l01317"></a><span class="lineno"> 1317</span>           estWriteBuffer[icol]=modValue;</div>
-<div class="line"><a name="l01318"></a><span class="lineno"> 1318</span>           uncertWriteBuffer[icol]=uncertModel_opt[0]*stdDev;</div>
-<div class="line"><a name="l01319"></a><span class="lineno"> 1319</span>         }</div>
-<div class="line"><a name="l01320"></a><span class="lineno"> 1320</span>       }   </div>
-<div class="line"><a name="l01321"></a><span class="lineno"> 1321</span>       <span class="keywordflow">else</span>{</div>
-<div class="line"><a name="l01322"></a><span class="lineno"> 1322</span>         <span class="keywordflow">if</span>(window_opt[0]>0){</div>
-<div class="line"><a name="l01323"></a><span class="lineno"> 1323</span>           <span class="keywordflow">try</span>{</div>
-<div class="line"><a name="l01324"></a><span class="lineno"> 1324</span>         <span class="comment">// imgReaderModel2.geo2image(geox,geoy,modCol,modRow);//did that already</span></div>
-<div class="line"><a name="l01325"></a><span class="lineno"> 1325</span>         minCol=(modCol>window_opt[0]/2) ? modCol-window_opt[0]/2 : 0;</div>
-<div class="line"><a name="l01326"></a><span class="lineno"> 1326</span>         maxCol=(modCol+window_opt[0]/2<imgReaderModel2.nrOfCol()) ? modCol+window_opt[0]/2 : imgReaderModel2.nrOfCol()-1;</div>
-<div class="line"><a name="l01327"></a><span class="lineno"> 1327</span>         minRow=(modRow>window_opt[0]/2) ? modRow-window_opt[0]/2 : 0;</div>
-<div class="line"><a name="l01328"></a><span class="lineno"> 1328</span>         maxRow=(modRow+window_opt[0]/2<imgReaderModel2.nrOfRow()) ? modRow+window_opt[0]/2 : imgReaderModel2.nrOfRow()-1;</div>
-<div class="line"><a name="l01329"></a><span class="lineno"> 1329</span>         imgReaderModel2.readDataBlock(model2buffer,GDT_Float64,minCol,maxCol,minRow,maxRow,0);</div>
-<div class="line"><a name="l01330"></a><span class="lineno"> 1330</span> </div>
-<div class="line"><a name="l01331"></a><span class="lineno"> 1331</span>         imgReaderModel1.geo2image(geox,geoy,modCol,modRow);</div>
-<div class="line"><a name="l01332"></a><span class="lineno"> 1332</span>         assert(modRow>=0&&modRow<imgReaderModel1.nrOfRow());</div>
-<div class="line"><a name="l01333"></a><span class="lineno"> 1333</span>         minCol=(modCol>window_opt[0]/2) ? modCol-window_opt[0]/2 : 0;</div>
-<div class="line"><a name="l01334"></a><span class="lineno"> 1334</span>         maxCol=(modCol+window_opt[0]/2<imgReaderModel1.nrOfCol()) ? modCol+window_opt[0]/2 : imgReaderModel1.nrOfCol()-1;</div>
-<div class="line"><a name="l01335"></a><span class="lineno"> 1335</span>         minRow=(modRow>window_opt[0]/2) ? modRow-window_opt[0]/2 : 0;</div>
-<div class="line"><a name="l01336"></a><span class="lineno"> 1336</span>         maxRow=(modRow+window_opt[0]/2<imgReaderModel1.nrOfRow()) ? modRow+window_opt[0]/2 : imgReaderModel1.nrOfRow()-1;</div>
-<div class="line"><a name="l01337"></a><span class="lineno"> 1337</span>         imgReaderModel1.readDataBlock(model1buffer,GDT_Float64,minCol,maxCol,minRow,maxRow,0);</div>
-<div class="line"><a name="l01338"></a><span class="lineno"> 1338</span>         <span class="comment">// imgReaderEst.image2geo(icol,irow,geox,geoy);</span></div>
-<div class="line"><a name="l01339"></a><span class="lineno"> 1339</span>           }</div>
-<div class="line"><a name="l01340"></a><span class="lineno"> 1340</span>           <span class="keywordflow">catch</span>(<span class="keywordtype">string</span> errorString){</div>
-<div class="line"><a name="l01341"></a><span class="lineno"> 1341</span>         cerr << <span class="stringliteral">"Error reading data block for "</span> << minCol << <span class="stringliteral">"-"</span> << maxCol << <span class="stringliteral">", "</span> << minRow << <span class="stringliteral">"-"</span> << maxRow << endl;</div>
-<div class="line"><a name="l01342"></a><span class="lineno"> 1342</span>           }</div>
-<div class="line"><a name="l01343"></a><span class="lineno"> 1343</span>           <span class="comment">//erase no-data from buffer</span></div>
-<div class="line"><a name="l01344"></a><span class="lineno"> 1344</span>           vector<double>::iterator it1=model1buffer.begin();</div>
-<div class="line"><a name="l01345"></a><span class="lineno"> 1345</span>           vector<double>::iterator it2=model2buffer.begin();</div>
-<div class="line"><a name="l01346"></a><span class="lineno"> 1346</span>           <span class="keywordflow">while</span>(it1!=model1buffer.end()&&it2!=model2buffer.end()){</div>
-<div class="line"><a name="l01347"></a><span class="lineno"> 1347</span>         <span class="comment">//erase nodata</span></div>
-<div class="line"><a name="l01348"></a><span class="lineno"> 1348</span>         <span class="keywordtype">bool</span> modNodata=<span class="keyword">false</span>;</div>
-<div class="line"><a name="l01349"></a><span class="lineno"> 1349</span>         modNodata=modNodata||imgReaderModel1.isNoData(*it1);</div>
-<div class="line"><a name="l01350"></a><span class="lineno"> 1350</span>         modNodata=modNodata||imgReaderModel2.isNoData(*it2);</div>
-<div class="line"><a name="l01351"></a><span class="lineno"> 1351</span>         <span class="keywordflow">if</span>(modNodata){</div>
-<div class="line"><a name="l01352"></a><span class="lineno"> 1352</span>           model1buffer.erase(it1);</div>
-<div class="line"><a name="l01353"></a><span class="lineno"> 1353</span>           model2buffer.erase(it2);</div>
-<div class="line"><a name="l01354"></a><span class="lineno"> 1354</span>         }</div>
-<div class="line"><a name="l01355"></a><span class="lineno"> 1355</span>         <span class="keywordflow">else</span>{</div>
-<div class="line"><a name="l01356"></a><span class="lineno"> 1356</span>           ++it1;</div>
-<div class="line"><a name="l01357"></a><span class="lineno"> 1357</span>           ++it2;</div>
-<div class="line"><a name="l01358"></a><span class="lineno"> 1358</span>         }</div>
-<div class="line"><a name="l01359"></a><span class="lineno"> 1359</span>           }</div>
-<div class="line"><a name="l01360"></a><span class="lineno"> 1360</span>           <span class="keywordflow">if</span>(model1buffer.size()>minreg_opt[0]&&model2buffer.size()>minreg_opt[0]){</div>
-<div class="line"><a name="l01361"></a><span class="lineno"> 1361</span>         errMod=stat.linear_regression_err(model1buffer,model2buffer,c0mod,c1mod);</div>
-<div class="line"><a name="l01362"></a><span class="lineno"> 1362</span>         errMod*=regTime_opt[0];</div>
-<div class="line"><a name="l01363"></a><span class="lineno"> 1363</span>           }</div>
-<div class="line"><a name="l01364"></a><span class="lineno"> 1364</span>           <span class="keywordflow">else</span>{<span class="comment">//use global regression...</span></div>
-<div class="line"><a name="l01365"></a><span class="lineno"> 1365</span>         c0mod=c0modGlobal;</div>
-<div class="line"><a name="l01366"></a><span class="lineno"> 1366</span>         c1mod=c1modGlobal;</div>
-<div class="line"><a name="l01367"></a><span class="lineno"> 1367</span>           }</div>
-<div class="line"><a name="l01368"></a><span class="lineno"> 1368</span>         }</div>
-<div class="line"><a name="l01369"></a><span class="lineno"> 1369</span>         <span class="keywordflow">else</span>{</div>
-<div class="line"><a name="l01370"></a><span class="lineno"> 1370</span>           c0mod=c0modGlobal;</div>
-<div class="line"><a name="l01371"></a><span class="lineno"> 1371</span>           c1mod=c1modGlobal;</div>
-<div class="line"><a name="l01372"></a><span class="lineno"> 1372</span>         }</div>
-<div class="line"><a name="l01373"></a><span class="lineno"> 1373</span>         <span class="keywordtype">double</span> certNorm=(errMod*errMod+errObs*errObs);</div>
-<div class="line"><a name="l01374"></a><span class="lineno"> 1374</span>         <span class="keywordtype">double</span> certMod=errObs*errObs/certNorm;</div>
-<div class="line"><a name="l01375"></a><span class="lineno"> 1375</span>         <span class="keywordtype">double</span> certObs=errMod*errMod/certNorm;</div>
-<div class="line"><a name="l01376"></a><span class="lineno"> 1376</span>         <span class="keywordtype">double</span> regTime=(c0mod+c1mod*estValue)*certObs;</div>
-<div class="line"><a name="l01377"></a><span class="lineno"> 1377</span> </div>
-<div class="line"><a name="l01378"></a><span class="lineno"> 1378</span>         <span class="comment">// double regSensor=(c0obs+c1obs*estValue)*certObs;</span></div>
-<div class="line"><a name="l01379"></a><span class="lineno"> 1379</span>         <span class="keywordtype">double</span> regSensor=(c0obs+c1obs*modValue)*certMod;</div>
-<div class="line"><a name="l01380"></a><span class="lineno"> 1380</span>         estWriteBuffer[icol]=regTime+regSensor;</div>
-<div class="line"><a name="l01381"></a><span class="lineno"> 1381</span>         <span class="keywordtype">double</span> totalUncertainty=0;</div>
-<div class="line"><a name="l01382"></a><span class="lineno"> 1382</span>         <span class="keywordflow">if</span>(errMod<eps_opt[0])</div>
-<div class="line"><a name="l01383"></a><span class="lineno"> 1383</span>           totalUncertainty=errObs;</div>
-<div class="line"><a name="l01384"></a><span class="lineno"> 1384</span>         <span class="keywordflow">else</span> <span class="keywordflow">if</span>(errObs<eps_opt[0])</div>
-<div class="line"><a name="l01385"></a><span class="lineno"> 1385</span>           totalUncertainty=errMod;</div>
-<div class="line"><a name="l01386"></a><span class="lineno"> 1386</span>         <span class="keywordflow">else</span>{</div>
-<div class="line"><a name="l01387"></a><span class="lineno"> 1387</span>           totalUncertainty=1.0/errMod/errMod+1/errObs/errObs;</div>
-<div class="line"><a name="l01388"></a><span class="lineno"> 1388</span>           totalUncertainty=sqrt(1.0/totalUncertainty);</div>
-<div class="line"><a name="l01389"></a><span class="lineno"> 1389</span>         }</div>
-<div class="line"><a name="l01390"></a><span class="lineno"> 1390</span>         uncertWriteBuffer[icol]=totalUncertainty+uncertReadBuffer[icol];</div>
+<div class="line"><a name="l00934"></a><span class="lineno">  934</span>     <span class="keywordflow">else</span>{<span class="comment">//we have a measurement at end time</span></div>
+<div class="line"><a name="l00935"></a><span class="lineno">  935</span>       <span class="keywordflow">if</span>(verbose_opt[0])</div>
+<div class="line"><a name="l00936"></a><span class="lineno">  936</span>     cout << <span class="stringliteral">"we have a measurement at end time"</span> << endl;</div>
+<div class="line"><a name="l00937"></a><span class="lineno">  937</span>       imgReaderObs.open(observation_opt.back());</div>
+<div class="line"><a name="l00938"></a><span class="lineno">  938</span>       imgReaderObs.getGeoTransform(geotransform);</div>
+<div class="line"><a name="l00939"></a><span class="lineno">  939</span>       imgReaderObs.setNoData(obsnodata_opt);</div>
+<div class="line"><a name="l00940"></a><span class="lineno">  940</span>       </div>
+<div class="line"><a name="l00941"></a><span class="lineno">  941</span>       vector< vector<double> > obsLineVector(down_opt[0]);</div>
+<div class="line"><a name="l00942"></a><span class="lineno">  942</span>       vector<double> obsLineBuffer;</div>
+<div class="line"><a name="l00943"></a><span class="lineno">  943</span>       vector<double> obsWindowBuffer;<span class="comment">//buffer for observation to calculate average corresponding to model pixel</span></div>
+<div class="line"><a name="l00944"></a><span class="lineno">  944</span>       vector<double> estReadBuffer;</div>
+<div class="line"><a name="l00945"></a><span class="lineno">  945</span>       vector<double> estWriteBuffer(ncol);</div>
+<div class="line"><a name="l00946"></a><span class="lineno">  946</span>       vector<double> uncertWriteBuffer(ncol);</div>
+<div class="line"><a name="l00947"></a><span class="lineno">  947</span>       vector<double> uncertObsLineBuffer;</div>
+<div class="line"><a name="l00948"></a><span class="lineno">  948</span> </div>
+<div class="line"><a name="l00949"></a><span class="lineno">  949</span>       <span class="keywordflow">if</span>(verbose_opt[0])</div>
+<div class="line"><a name="l00950"></a><span class="lineno">  950</span>     cout << <span class="stringliteral">"initialize obsLineVector"</span> << endl;</div>
+<div class="line"><a name="l00951"></a><span class="lineno">  951</span>       assert(down_opt[0]%2);<span class="comment">//window size must be odd </span></div>
+<div class="line"><a name="l00952"></a><span class="lineno">  952</span>       <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iline=-down_opt[0]/2;iline<down_opt[0]/2+1;++iline){</div>
+<div class="line"><a name="l00953"></a><span class="lineno">  953</span>     <span class="keywordflow">if</span>(iline<0)<span class="comment">//replicate line 0</span></div>
+<div class="line"><a name="l00954"></a><span class="lineno">  954</span>       imgReaderObs.readData(obsLineVector[iline+down_opt[0]/2],GDT_Float64,0,0);</div>
+<div class="line"><a name="l00955"></a><span class="lineno">  955</span>     <span class="keywordflow">else</span></div>
+<div class="line"><a name="l00956"></a><span class="lineno">  956</span>       imgReaderObs.readData(obsLineVector[iline+down_opt[0]/2],GDT_Float64,iline,0);</div>
+<div class="line"><a name="l00957"></a><span class="lineno">  957</span>       }</div>
+<div class="line"><a name="l00958"></a><span class="lineno">  958</span>       <span class="keywordflow">for</span>(<span class="keywordtype">int</span> jrow=0;jrow<nrow;jrow+=down_opt[0]){</div>
+<div class="line"><a name="l00959"></a><span class="lineno">  959</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> irow=jrow;irow<jrow+down_opt[0];++irow){</div>
+<div class="line"><a name="l00960"></a><span class="lineno">  960</span>       imgWriterEst.image2geo(0,irow,geox,geoy);</div>
+<div class="line"><a name="l00961"></a><span class="lineno">  961</span>       imgReaderModel1.geo2image(geox,geoy,modCol,modRow);</div>
+<div class="line"><a name="l00962"></a><span class="lineno">  962</span>       assert(modRow>=0&&modRow<imgReaderModel1.nrOfRow());</div>
+<div class="line"><a name="l00963"></a><span class="lineno">  963</span>       RESAMPLE theResample=BILINEAR;</div>
+<div class="line"><a name="l00964"></a><span class="lineno">  964</span>       imgReaderModel1.readData(estReadBuffer,GDT_Float64,modRow,0,theResample);</div>
+<div class="line"><a name="l00965"></a><span class="lineno">  965</span>       <span class="keywordtype">int</span> maxRow=(irow+down_opt[0]/2<imgReaderObs.nrOfRow()) ? irow+down_opt[0]/2 : imgReaderObs.nrOfRow()-1;</div>
+<div class="line"><a name="l00966"></a><span class="lineno">  966</span>       obsLineVector.erase(obsLineVector.begin());</div>
+<div class="line"><a name="l00967"></a><span class="lineno">  967</span>       imgReaderObs.readData(obsLineBuffer,GDT_Float64,maxRow,0);</div>
+<div class="line"><a name="l00968"></a><span class="lineno">  968</span>       obsLineVector.push_back(obsLineBuffer);</div>
+<div class="line"><a name="l00969"></a><span class="lineno">  969</span>       <span class="comment">// obsLineBuffer=obsLineVector[down_opt[0]/2];</span></div>
+<div class="line"><a name="l00970"></a><span class="lineno">  970</span>       <span class="keywordflow">if</span>(imgReaderObs.nrOfBand()>1)</div>
+<div class="line"><a name="l00971"></a><span class="lineno">  971</span>         imgReaderObs.readData(uncertObsLineBuffer,GDT_Float64,irow,1);</div>
+<div class="line"><a name="l00972"></a><span class="lineno">  972</span> </div>
+<div class="line"><a name="l00973"></a><span class="lineno">  973</span>       <span class="keywordflow">for</span>(<span class="keywordtype">int</span> jcol=0;jcol<ncol;jcol+=down_opt[0]){</div>
+<div class="line"><a name="l00974"></a><span class="lineno">  974</span>         <span class="keywordflow">for</span>(<span class="keywordtype">int</span> icol=jcol;icol<jcol+down_opt[0];++icol){</div>
+<div class="line"><a name="l00975"></a><span class="lineno">  975</span>           imgWriterEst.image2geo(icol,irow,geox,geoy);</div>
+<div class="line"><a name="l00976"></a><span class="lineno">  976</span>           imgReaderModel1.geo2image(geox,geoy,modCol,modRow);</div>
+<div class="line"><a name="l00977"></a><span class="lineno">  977</span>           assert(modRow>=0&&modRow<imgReaderModel1.nrOfRow());</div>
+<div class="line"><a name="l00978"></a><span class="lineno">  978</span>           lowerCol=modCol-0.5;</div>
+<div class="line"><a name="l00979"></a><span class="lineno">  979</span>           lowerCol=<span class="keyword">static_cast<</span><span class="keywordtype">int</span><span class="keyword">></span>(lowerCol);</div>
+<div class="line"><a name="l00980"></a><span class="lineno">  980</span>           upperCol=modCol+0.5;</div>
+<div class="line"><a name="l00981"></a><span class="lineno">  981</span>           upperCol=<span class="keyword">static_cast<</span><span class="keywordtype">int</span><span class="keyword">></span>(upperCol);</div>
+<div class="line"><a name="l00982"></a><span class="lineno">  982</span>           <span class="keywordflow">if</span>(lowerCol<0)</div>
+<div class="line"><a name="l00983"></a><span class="lineno">  983</span>         lowerCol=0;</div>
+<div class="line"><a name="l00984"></a><span class="lineno">  984</span>           <span class="keywordflow">if</span>(upperCol>=imgReaderModel1.nrOfCol())</div>
+<div class="line"><a name="l00985"></a><span class="lineno">  985</span>         upperCol=imgReaderModel1.nrOfCol()-1;</div>
+<div class="line"><a name="l00986"></a><span class="lineno">  986</span>           <span class="keywordtype">double</span> modValue=(modCol-0.5-lowerCol)*estReadBuffer[upperCol]+(1-modCol+0.5+lowerCol)*estReadBuffer[lowerCol];</div>
+<div class="line"><a name="l00987"></a><span class="lineno">  987</span>           <span class="comment">// double modValue=estReadBuffer[modCol];</span></div>
+<div class="line"><a name="l00988"></a><span class="lineno">  988</span>           <span class="keywordtype">double</span> errMod=uncertModel_opt[0]*stdDev*stdDev;</div>
+<div class="line"><a name="l00989"></a><span class="lineno">  989</span>           <span class="keywordflow">if</span>(imgReaderModel1.isNoData(modValue)){<span class="comment">//model is nodata: retain observation </span></div>
+<div class="line"><a name="l00990"></a><span class="lineno">  990</span>         <span class="keywordflow">if</span>(imgReaderObs.isNoData(obsLineBuffer[icol])){<span class="comment">//both model and observation nodata</span></div>
+<div class="line"><a name="l00991"></a><span class="lineno">  991</span>           estWriteBuffer[icol]=obsnodata_opt[0];</div>
+<div class="line"><a name="l00992"></a><span class="lineno">  992</span>           uncertWriteBuffer[icol]=uncertNodata_opt[0];</div>
+<div class="line"><a name="l00993"></a><span class="lineno">  993</span>         }</div>
+<div class="line"><a name="l00994"></a><span class="lineno">  994</span>         <span class="keywordflow">else</span>{</div>
+<div class="line"><a name="l00995"></a><span class="lineno">  995</span>           estWriteBuffer[icol]=obsLineBuffer[icol];</div>
+<div class="line"><a name="l00996"></a><span class="lineno">  996</span>           <span class="keywordflow">if</span>(obsmin_opt.size()){</div>
+<div class="line"><a name="l00997"></a><span class="lineno">  997</span>             <span class="keywordflow">if</span>(estWriteBuffer[icol]<obsmin_opt[0])</div>
+<div class="line"><a name="l00998"></a><span class="lineno">  998</span>               estWriteBuffer[icol]=obsmin_opt[0];</div>
+<div class="line"><a name="l00999"></a><span class="lineno">  999</span>           }</div>
+<div class="line"><a name="l01000"></a><span class="lineno"> 1000</span>           <span class="keywordflow">if</span>(obsmax_opt.size()){</div>
+<div class="line"><a name="l01001"></a><span class="lineno"> 1001</span>             <span class="keywordflow">if</span>(estWriteBuffer[icol]>obsmax_opt[0])</div>
+<div class="line"><a name="l01002"></a><span class="lineno"> 1002</span>               estWriteBuffer[icol]=obsmax_opt[0];</div>
+<div class="line"><a name="l01003"></a><span class="lineno"> 1003</span>           }</div>
+<div class="line"><a name="l01004"></a><span class="lineno"> 1004</span>           <span class="keywordflow">if</span>(uncertObsLineBuffer.size()>icol)</div>
+<div class="line"><a name="l01005"></a><span class="lineno"> 1005</span>             uncertWriteBuffer[icol]=uncertObsLineBuffer[icol];</div>
+<div class="line"><a name="l01006"></a><span class="lineno"> 1006</span>           <span class="keywordflow">else</span></div>
+<div class="line"><a name="l01007"></a><span class="lineno"> 1007</span>             uncertWriteBuffer[icol]=uncertObs_opt[0];</div>
+<div class="line"><a name="l01008"></a><span class="lineno"> 1008</span>         }</div>
+<div class="line"><a name="l01009"></a><span class="lineno"> 1009</span>           }</div>
+<div class="line"><a name="l01010"></a><span class="lineno"> 1010</span>           <span class="keywordflow">else</span>{<span class="comment">//model is valid: calculate estimate from model</span></div>
+<div class="line"><a name="l01011"></a><span class="lineno"> 1011</span>         estWriteBuffer[icol]=modValue;</div>
+<div class="line"><a name="l01012"></a><span class="lineno"> 1012</span>         uncertWriteBuffer[icol]=errMod;<span class="comment">//in case observation is not valid</span></div>
+<div class="line"><a name="l01013"></a><span class="lineno"> 1013</span>           }</div>
+<div class="line"><a name="l01014"></a><span class="lineno"> 1014</span>           <span class="comment">//measurement update</span></div>
+<div class="line"><a name="l01015"></a><span class="lineno"> 1015</span>           <span class="keywordflow">if</span>(!imgReaderObs.isNoData(obsLineBuffer[icol])){</div>
+<div class="line"><a name="l01016"></a><span class="lineno"> 1016</span>         <span class="comment">// estWriteBuffer[icol]=estReadBuffer[icol]*modValue1/modValue2</span></div>
+<div class="line"><a name="l01017"></a><span class="lineno"> 1017</span>         <span class="keywordtype">double</span> kalmanGain=1;</div>
+<div class="line"><a name="l01018"></a><span class="lineno"> 1018</span>         <span class="keywordtype">int</span> minCol=(icol>down_opt[0]/2) ? icol-down_opt[0]/2 : 0;</div>
+<div class="line"><a name="l01019"></a><span class="lineno"> 1019</span>         <span class="keywordtype">int</span> maxCol=(icol+down_opt[0]/2<imgReaderObs.nrOfCol()) ? icol+down_opt[0]/2 : imgReaderObs.nrOfCol()-1;</div>
+<div class="line"><a name="l01020"></a><span class="lineno"> 1020</span>         <span class="keywordtype">int</span> minRow=(irow>down_opt[0]/2) ? irow-down_opt[0]/2 : 0;</div>
+<div class="line"><a name="l01021"></a><span class="lineno"> 1021</span>         <span class="keywordtype">int</span> maxRow=(irow+down_opt[0]/2<imgReaderObs.nrOfRow()) ? irow+down_opt[0]/2 : imgReaderObs.nrOfRow()-1;</div>
+<div class="line"><a name="l01022"></a><span class="lineno"> 1022</span>         obsWindowBuffer.clear();</div>
+<div class="line"><a name="l01023"></a><span class="lineno"> 1023</span>         <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iline=0;iline<obsLineVector.size();++iline){</div>
+<div class="line"><a name="l01024"></a><span class="lineno"> 1024</span>           <span class="keywordflow">for</span>(<span class="keywordtype">int</span> isample=minCol;isample<=maxCol;++isample){</div>
+<div class="line"><a name="l01025"></a><span class="lineno"> 1025</span>             assert(isample<obsLineVector[iline].size());</div>
+<div class="line"><a name="l01026"></a><span class="lineno"> 1026</span>             obsWindowBuffer.push_back(obsLineVector[iline][isample]);</div>
+<div class="line"><a name="l01027"></a><span class="lineno"> 1027</span>           }</div>
+<div class="line"><a name="l01028"></a><span class="lineno"> 1028</span>         }</div>
+<div class="line"><a name="l01029"></a><span class="lineno"> 1029</span>         <span class="keywordflow">if</span>(!imgReaderModel1.isNoData(modValue)){<span class="comment">//model is valid</span></div>
+<div class="line"><a name="l01030"></a><span class="lineno"> 1030</span>           <a class="code" href="classstatfactory_1_1StatFactory.html">statfactory::StatFactory</a> statobs;</div>
+<div class="line"><a name="l01031"></a><span class="lineno"> 1031</span>           statobs.setNoDataValues(obsnodata_opt);</div>
+<div class="line"><a name="l01032"></a><span class="lineno"> 1032</span>           <span class="keywordtype">double</span> obsMeanValue=statobs.mean(obsWindowBuffer);</div>
+<div class="line"><a name="l01033"></a><span class="lineno"> 1033</span>           <span class="keywordtype">double</span> difference=0;</div>
+<div class="line"><a name="l01034"></a><span class="lineno"> 1034</span>           difference=obsMeanValue-modValue;</div>
+<div class="line"><a name="l01035"></a><span class="lineno"> 1035</span>           errObs=uncertObs_opt[0]*sqrt(difference*difference);</div>
+<div class="line"><a name="l01036"></a><span class="lineno"> 1036</span>           <span class="comment">// errObs=(difference<0)? sqrt(difference*difference) : uncertObs_opt[0];</span></div>
+<div class="line"><a name="l01037"></a><span class="lineno"> 1037</span>           <span class="comment">//errObs=uncertObs_opt[0];//*difference*difference;//uncertainty of the observation (R in Kalman equations)</span></div>
+<div class="line"><a name="l01038"></a><span class="lineno"> 1038</span>           <span class="keywordtype">double</span> errorCovariance=errMod;<span class="comment">//assumed initial errorCovariance (P in Kalman equations)</span></div>
+<div class="line"><a name="l01039"></a><span class="lineno"> 1039</span>           <span class="keywordflow">if</span>(errorCovariance+errObs>eps_opt[0])</div>
+<div class="line"><a name="l01040"></a><span class="lineno"> 1040</span>             kalmanGain=errorCovariance/(errorCovariance+errObs);</div>
+<div class="line"><a name="l01041"></a><span class="lineno"> 1041</span>           <span class="keywordflow">else</span> </div>
+<div class="line"><a name="l01042"></a><span class="lineno"> 1042</span>             kalmanGain=1;</div>
+<div class="line"><a name="l01043"></a><span class="lineno"> 1043</span>           estWriteBuffer[icol]+=kalmanGain*(obsLineBuffer[icol]-estWriteBuffer[icol]);</div>
+<div class="line"><a name="l01044"></a><span class="lineno"> 1044</span>           <span class="keywordflow">if</span>(obsmin_opt.size()){</div>
+<div class="line"><a name="l01045"></a><span class="lineno"> 1045</span>             <span class="keywordflow">if</span>(estWriteBuffer[icol]<obsmin_opt[0])</div>
+<div class="line"><a name="l01046"></a><span class="lineno"> 1046</span>               estWriteBuffer[icol]=obsmin_opt[0];</div>
+<div class="line"><a name="l01047"></a><span class="lineno"> 1047</span>           }</div>
+<div class="line"><a name="l01048"></a><span class="lineno"> 1048</span>           <span class="keywordflow">if</span>(obsmax_opt.size()){</div>
+<div class="line"><a name="l01049"></a><span class="lineno"> 1049</span>             <span class="keywordflow">if</span>(estWriteBuffer[icol]>obsmax_opt[0])</div>
+<div class="line"><a name="l01050"></a><span class="lineno"> 1050</span>               estWriteBuffer[icol]=obsmax_opt[0];</div>
+<div class="line"><a name="l01051"></a><span class="lineno"> 1051</span>           }</div>
+<div class="line"><a name="l01052"></a><span class="lineno"> 1052</span>         }</div>
+<div class="line"><a name="l01053"></a><span class="lineno"> 1053</span>         assert(kalmanGain<=1);</div>
+<div class="line"><a name="l01054"></a><span class="lineno"> 1054</span>           }</div>
+<div class="line"><a name="l01055"></a><span class="lineno"> 1055</span>         }</div>
+<div class="line"><a name="l01056"></a><span class="lineno"> 1056</span>       }</div>
+<div class="line"><a name="l01057"></a><span class="lineno"> 1057</span>       imgWriterEst.writeData(estWriteBuffer,GDT_Float64,irow,0);</div>
+<div class="line"><a name="l01058"></a><span class="lineno"> 1058</span>       imgWriterEst.writeData(uncertWriteBuffer,GDT_Float64,irow,1);</div>
+<div class="line"><a name="l01059"></a><span class="lineno"> 1059</span>     }</div>
+<div class="line"><a name="l01060"></a><span class="lineno"> 1060</span>       }</div>
+<div class="line"><a name="l01061"></a><span class="lineno"> 1061</span>       imgReaderObs.close();</div>
+<div class="line"><a name="l01062"></a><span class="lineno"> 1062</span>       --obsindex;</div>
+<div class="line"><a name="l01063"></a><span class="lineno"> 1063</span>     }</div>
+<div class="line"><a name="l01064"></a><span class="lineno"> 1064</span>     </div>
+<div class="line"><a name="l01065"></a><span class="lineno"> 1065</span>     imgReaderModel1.close();</div>
+<div class="line"><a name="l01066"></a><span class="lineno"> 1066</span>     imgWriterEst.close();</div>
+<div class="line"><a name="l01067"></a><span class="lineno"> 1067</span> </div>
+<div class="line"><a name="l01068"></a><span class="lineno"> 1068</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> modindex=model_opt.size()-2;modindex>=0;--modindex){</div>
+<div class="line"><a name="l01069"></a><span class="lineno"> 1069</span>       <span class="keywordflow">if</span>(verbose_opt[0]){</div>
+<div class="line"><a name="l01070"></a><span class="lineno"> 1070</span>     cout << <span class="stringliteral">"processing time "</span> << tmodel_opt[modindex] << endl;</div>
+<div class="line"><a name="l01071"></a><span class="lineno"> 1071</span>     <span class="keywordflow">if</span>(obsindex<relobsindex.size())</div>
+<div class="line"><a name="l01072"></a><span class="lineno"> 1072</span>       cout << <span class="stringliteral">"next observation "</span> << tmodel_opt[relobsindex[obsindex]] << endl;</div>
+<div class="line"><a name="l01073"></a><span class="lineno"> 1073</span>     <span class="keywordflow">else</span></div>
+<div class="line"><a name="l01074"></a><span class="lineno"> 1074</span>       cout << <span class="stringliteral">"There is no next observation"</span> << endl;</div>
+<div class="line"><a name="l01075"></a><span class="lineno"> 1075</span>       }</div>
+<div class="line"><a name="l01076"></a><span class="lineno"> 1076</span>       <span class="keywordtype">string</span> output;</div>
+<div class="line"><a name="l01077"></a><span class="lineno"> 1077</span>       <span class="keywordflow">if</span>(outputbw_opt.size()==model_opt.size())</div>
+<div class="line"><a name="l01078"></a><span class="lineno"> 1078</span>     output=outputbw_opt[modindex];</div>
+<div class="line"><a name="l01079"></a><span class="lineno"> 1079</span>       <span class="keywordflow">else</span>{</div>
+<div class="line"><a name="l01080"></a><span class="lineno"> 1080</span>     ostringstream outputstream;</div>
+<div class="line"><a name="l01081"></a><span class="lineno"> 1081</span>     outputstream << outputbw_opt[0] << <span class="stringliteral">"_"</span>;</div>
+<div class="line"><a name="l01082"></a><span class="lineno"> 1082</span>     outputstream << setfill(<span class="charliteral">'0'</span>) << setw(ndigit) << tmodel_opt[modindex];</div>
+<div class="line"><a name="l01083"></a><span class="lineno"> 1083</span>     outputstream << <span class="stringliteral">".tif"</span>;</div>
+<div class="line"><a name="l01084"></a><span class="lineno"> 1084</span>     <span class="comment">// outputstream << outputbw_opt[0] << "_" << tmodel_opt[modindex] << ".tif";</span></div>
+<div class="line"><a name="l01085"></a><span class="lineno"> 1085</span>     output=outputstream.str();</div>
+<div class="line"><a name="l01086"></a><span class="lineno"> 1086</span>       }</div>
+<div class="line"><a name="l01087"></a><span class="lineno"> 1087</span> </div>
+<div class="line"><a name="l01088"></a><span class="lineno"> 1088</span>       <span class="comment">//two band output band0=estimation, band1=uncertainty</span></div>
+<div class="line"><a name="l01089"></a><span class="lineno"> 1089</span>       imgWriterEst.open(output,ncol,nrow,2,GDT_Float64,imageType,option_opt);</div>
+<div class="line"><a name="l01090"></a><span class="lineno"> 1090</span>       imgWriterEst.setProjectionProj4(projection_opt[0]);</div>
+<div class="line"><a name="l01091"></a><span class="lineno"> 1091</span>       imgWriterEst.setGeoTransform(geotransform);</div>
+<div class="line"><a name="l01092"></a><span class="lineno"> 1092</span>       imgWriterEst.GDALSetNoDataValue(obsnodata_opt[0]);</div>
+<div class="line"><a name="l01093"></a><span class="lineno"> 1093</span> </div>
+<div class="line"><a name="l01094"></a><span class="lineno"> 1094</span>       <span class="comment">//calculate regression between two subsequence model inputs</span></div>
+<div class="line"><a name="l01095"></a><span class="lineno"> 1095</span>       imgReaderModel1.open(model_opt[modindex+1]);</div>
+<div class="line"><a name="l01096"></a><span class="lineno"> 1096</span>       imgReaderModel1.setNoData(modnodata_opt);</div>
+<div class="line"><a name="l01097"></a><span class="lineno"> 1097</span>       imgReaderModel2.open(model_opt[modindex]);</div>
+<div class="line"><a name="l01098"></a><span class="lineno"> 1098</span>       imgReaderModel2.setNoData(modnodata_opt);</div>
+<div class="line"><a name="l01099"></a><span class="lineno"> 1099</span>       <span class="comment">//calculate regression</span></div>
+<div class="line"><a name="l01100"></a><span class="lineno"> 1100</span>       <span class="comment">//we could re-use the points from second image from last run, but</span></div>
+<div class="line"><a name="l01101"></a><span class="lineno"> 1101</span>       <span class="comment">//to keep it general, we must redo it (overlap might have changed)</span></div>
+<div class="line"><a name="l01102"></a><span class="lineno"> 1102</span>     </div>
+<div class="line"><a name="l01103"></a><span class="lineno"> 1103</span>       pfnProgress(progress,pszMessage,pProgressArg);</div>
+<div class="line"><a name="l01104"></a><span class="lineno"> 1104</span> </div>
+<div class="line"><a name="l01105"></a><span class="lineno"> 1105</span>       <span class="keywordtype">bool</span> update=<span class="keyword">false</span>;</div>
+<div class="line"><a name="l01106"></a><span class="lineno"> 1106</span>       <span class="keywordflow">if</span>(obsindex<relobsindex.size()){</div>
+<div class="line"><a name="l01107"></a><span class="lineno"> 1107</span>     update=(relobsindex[obsindex]==modindex);</div>
+<div class="line"><a name="l01108"></a><span class="lineno"> 1108</span>       }</div>
+<div class="line"><a name="l01109"></a><span class="lineno"> 1109</span>       <span class="keywordflow">if</span>(update){</div>
+<div class="line"><a name="l01110"></a><span class="lineno"> 1110</span>     <span class="keywordflow">if</span>(verbose_opt[0])</div>
+<div class="line"><a name="l01111"></a><span class="lineno"> 1111</span>       cout << <span class="stringliteral">"***update "</span> << relobsindex[obsindex] << <span class="stringliteral">" = "</span> << modindex << <span class="stringliteral">" "</span> << observation_opt[obsindex] << <span class="stringliteral">" ***"</span> << endl;</div>
+<div class="line"><a name="l01112"></a><span class="lineno"> 1112</span> </div>
+<div class="line"><a name="l01113"></a><span class="lineno"> 1113</span>     imgReaderObs.open(observation_opt[obsindex]);</div>
+<div class="line"><a name="l01114"></a><span class="lineno"> 1114</span>     imgReaderObs.getGeoTransform(geotransform);</div>
+<div class="line"><a name="l01115"></a><span class="lineno"> 1115</span>     imgReaderObs.setNoData(obsnodata_opt);</div>
+<div class="line"><a name="l01116"></a><span class="lineno"> 1116</span>       }</div>
+<div class="line"><a name="l01117"></a><span class="lineno"> 1117</span>       <span class="comment">//prediction (also to fill cloudy pixels in update mode)</span></div>
+<div class="line"><a name="l01118"></a><span class="lineno"> 1118</span>       <span class="keywordtype">string</span> input;</div>
+<div class="line"><a name="l01119"></a><span class="lineno"> 1119</span>       <span class="keywordflow">if</span>(outputbw_opt.size()==model_opt.size())</div>
+<div class="line"><a name="l01120"></a><span class="lineno"> 1120</span>     input=outputbw_opt[modindex+1];</div>
+<div class="line"><a name="l01121"></a><span class="lineno"> 1121</span>       <span class="keywordflow">else</span>{</div>
+<div class="line"><a name="l01122"></a><span class="lineno"> 1122</span>     ostringstream outputstream;</div>
+<div class="line"><a name="l01123"></a><span class="lineno"> 1123</span>     outputstream << outputbw_opt[0] << <span class="stringliteral">"_"</span>;</div>
+<div class="line"><a name="l01124"></a><span class="lineno"> 1124</span>     outputstream << setfill(<span class="charliteral">'0'</span>) << setw(ndigit) << tmodel_opt[modindex+1];</div>
+<div class="line"><a name="l01125"></a><span class="lineno"> 1125</span>     outputstream << <span class="stringliteral">".tif"</span>;</div>
+<div class="line"><a name="l01126"></a><span class="lineno"> 1126</span>     <span class="comment">// outputstream << outputbw_opt[0] << "_" << tmodel_opt[modindex+1] << ".tif";</span></div>
+<div class="line"><a name="l01127"></a><span class="lineno"> 1127</span>     input=outputstream.str();</div>
+<div class="line"><a name="l01128"></a><span class="lineno"> 1128</span>       }</div>
+<div class="line"><a name="l01129"></a><span class="lineno"> 1129</span>       <span class="keywordflow">if</span>(verbose_opt[0])</div>
+<div class="line"><a name="l01130"></a><span class="lineno"> 1130</span>     cout << <span class="stringliteral">"opening "</span> << input << endl;</div>
+<div class="line"><a name="l01131"></a><span class="lineno"> 1131</span>       <a class="code" href="classImgReaderGdal.html">ImgReaderGdal</a> imgReaderEst(input);</div>
+<div class="line"><a name="l01132"></a><span class="lineno"> 1132</span>       imgReaderEst.setNoData(obsnodata_opt);</div>
+<div class="line"><a name="l01133"></a><span class="lineno"> 1133</span>       </div>
+<div class="line"><a name="l01134"></a><span class="lineno"> 1134</span>       vector< vector<double> > obsLineVector(down_opt[0]);</div>
+<div class="line"><a name="l01135"></a><span class="lineno"> 1135</span>       vector<double> obsLineBuffer;</div>
+<div class="line"><a name="l01136"></a><span class="lineno"> 1136</span>       vector<double> obsWindowBuffer;<span class="comment">//buffer for observation to calculate average corresponding to model pixel</span></div>
+<div class="line"><a name="l01137"></a><span class="lineno"> 1137</span>       vector<double> model1LineBuffer;</div>
+<div class="line"><a name="l01138"></a><span class="lineno"> 1138</span>       vector<double> model2LineBuffer;</div>
+<div class="line"><a name="l01139"></a><span class="lineno"> 1139</span>       vector<double> model1buffer;<span class="comment">//buffer for model 1 to calculate time regression based on window</span></div>
+<div class="line"><a name="l01140"></a><span class="lineno"> 1140</span>       vector<double> model2buffer;<span class="comment">//buffer for model 2 to calculate time regression based on window</span></div>
+<div class="line"><a name="l01141"></a><span class="lineno"> 1141</span>       vector<double> uncertObsLineBuffer;</div>
+<div class="line"><a name="l01142"></a><span class="lineno"> 1142</span>       vector< vector<double> > estLineVector(down_opt[0]);</div>
+<div class="line"><a name="l01143"></a><span class="lineno"> 1143</span>       vector<double> estLineBuffer;</div>
+<div class="line"><a name="l01144"></a><span class="lineno"> 1144</span>       vector<double> estWindowBuffer;<span class="comment">//buffer for estimate to calculate average corresponding to model pixel</span></div>
+<div class="line"><a name="l01145"></a><span class="lineno"> 1145</span>       vector<double> uncertReadBuffer;</div>
+<div class="line"><a name="l01146"></a><span class="lineno"> 1146</span>       vector<double> estWriteBuffer(ncol);</div>
+<div class="line"><a name="l01147"></a><span class="lineno"> 1147</span>       vector<double> uncertWriteBuffer(ncol);</div>
+<div class="line"><a name="l01148"></a><span class="lineno"> 1148</span> </div>
+<div class="line"><a name="l01149"></a><span class="lineno"> 1149</span>       <span class="comment">//initialize obsLineVector</span></div>
+<div class="line"><a name="l01150"></a><span class="lineno"> 1150</span>       <span class="keywordflow">if</span>(update){</div>
+<div class="line"><a name="l01151"></a><span class="lineno"> 1151</span>     <span class="keywordflow">if</span>(verbose_opt[0])</div>
+<div class="line"><a name="l01152"></a><span class="lineno"> 1152</span>       cout << <span class="stringliteral">"initialize obsLineVector"</span> << endl;</div>
+<div class="line"><a name="l01153"></a><span class="lineno"> 1153</span>     assert(down_opt[0]%2);<span class="comment">//window size must be odd </span></div>
+<div class="line"><a name="l01154"></a><span class="lineno"> 1154</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iline=-down_opt[0]/2;iline<down_opt[0]/2+1;++iline){</div>
+<div class="line"><a name="l01155"></a><span class="lineno"> 1155</span>       <span class="keywordflow">if</span>(iline<0)<span class="comment">//replicate line 0</span></div>
+<div class="line"><a name="l01156"></a><span class="lineno"> 1156</span>         imgReaderObs.readData(obsLineVector[iline+down_opt[0]/2],GDT_Float64,0,0);</div>
+<div class="line"><a name="l01157"></a><span class="lineno"> 1157</span>       <span class="keywordflow">else</span></div>
+<div class="line"><a name="l01158"></a><span class="lineno"> 1158</span>         imgReaderObs.readData(obsLineVector[iline+down_opt[0]/2],GDT_Float64,iline,0);</div>
+<div class="line"><a name="l01159"></a><span class="lineno"> 1159</span>     }</div>
+<div class="line"><a name="l01160"></a><span class="lineno"> 1160</span>       }</div>
+<div class="line"><a name="l01161"></a><span class="lineno"> 1161</span>       <span class="comment">//initialize estLineVector</span></div>
+<div class="line"><a name="l01162"></a><span class="lineno"> 1162</span>       <span class="keywordflow">if</span>(verbose_opt[0])</div>
+<div class="line"><a name="l01163"></a><span class="lineno"> 1163</span>     cout << <span class="stringliteral">"initialize estLineVector"</span> << endl;</div>
+<div class="line"><a name="l01164"></a><span class="lineno"> 1164</span>       assert(down_opt[0]%2);<span class="comment">//window size must be odd </span></div>
+<div class="line"><a name="l01165"></a><span class="lineno"> 1165</span>       <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iline=-down_opt[0]/2;iline<down_opt[0]/2+1;++iline){</div>
+<div class="line"><a name="l01166"></a><span class="lineno"> 1166</span>     <span class="keywordflow">if</span>(iline<0)<span class="comment">//replicate line 0</span></div>
+<div class="line"><a name="l01167"></a><span class="lineno"> 1167</span>       imgReaderEst.readData(estLineVector[iline+down_opt[0]/2],GDT_Float64,0,0);</div>
+<div class="line"><a name="l01168"></a><span class="lineno"> 1168</span>     <span class="keywordflow">else</span></div>
+<div class="line"><a name="l01169"></a><span class="lineno"> 1169</span>       imgReaderEst.readData(estLineVector[iline+down_opt[0]/2],GDT_Float64,iline,0);</div>
+<div class="line"><a name="l01170"></a><span class="lineno"> 1170</span>       }</div>
+<div class="line"><a name="l01171"></a><span class="lineno"> 1171</span>       <a class="code" href="classstatfactory_1_1StatFactory.html">statfactory::StatFactory</a> statobs;</div>
+<div class="line"><a name="l01172"></a><span class="lineno"> 1172</span>       statobs.setNoDataValues(obsnodata_opt);</div>
+<div class="line"><a name="l01173"></a><span class="lineno"> 1173</span> </div>
+<div class="line"><a name="l01174"></a><span class="lineno"> 1174</span>       <span class="keywordflow">for</span>(<span class="keywordtype">int</span> jrow=0;jrow<nrow;jrow+=down_opt[0]){</div>
+<div class="line"><a name="l01175"></a><span class="lineno"> 1175</span>     <span class="comment">//todo: read entire window for uncertReadBuffer...</span></div>
+<div class="line"><a name="l01176"></a><span class="lineno"> 1176</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> irow=jrow;irow<jrow+down_opt[0];++irow){</div>
+<div class="line"><a name="l01177"></a><span class="lineno"> 1177</span>       imgReaderEst.readData(uncertReadBuffer,GDT_Float64,irow,1);</div>
+<div class="line"><a name="l01178"></a><span class="lineno"> 1178</span>       imgReaderEst.image2geo(0,irow,geox,geoy);</div>
+<div class="line"><a name="l01179"></a><span class="lineno"> 1179</span>       imgReaderModel2.geo2image(geox,geoy,modCol,modRow);</div>
+<div class="line"><a name="l01180"></a><span class="lineno"> 1180</span>       assert(modRow>=0&&modRow<imgReaderModel2.nrOfRow());</div>
+<div class="line"><a name="l01181"></a><span class="lineno"> 1181</span>       imgReaderModel2.readData(model2LineBuffer,GDT_Float64,modRow,0,theResample);</div>
+<div class="line"><a name="l01182"></a><span class="lineno"> 1182</span> </div>
+<div class="line"><a name="l01183"></a><span class="lineno"> 1183</span>       imgReaderModel1.geo2image(geox,geoy,modCol,modRow);</div>
+<div class="line"><a name="l01184"></a><span class="lineno"> 1184</span>       assert(modRow>=0&&modRow<imgReaderModel1.nrOfRow());</div>
+<div class="line"><a name="l01185"></a><span class="lineno"> 1185</span>       imgReaderModel1.readData(model1LineBuffer,GDT_Float64,modRow,0,theResample);</div>
+<div class="line"><a name="l01186"></a><span class="lineno"> 1186</span> </div>
+<div class="line"><a name="l01187"></a><span class="lineno"> 1187</span>       <span class="keywordtype">int</span> maxRow=(irow+down_opt[0]/2<imgReaderEst.nrOfRow()) ? irow+down_opt[0]/2 : imgReaderEst.nrOfRow()-1;</div>
+<div class="line"><a name="l01188"></a><span class="lineno"> 1188</span>       estLineVector.erase(estLineVector.begin());</div>
+<div class="line"><a name="l01189"></a><span class="lineno"> 1189</span>       imgReaderEst.readData(estLineBuffer,GDT_Float64,maxRow,0);</div>
+<div class="line"><a name="l01190"></a><span class="lineno"> 1190</span>       estLineVector.push_back(estLineBuffer);</div>
+<div class="line"><a name="l01191"></a><span class="lineno"> 1191</span>       estLineBuffer=estLineVector[down_opt[0]/2];</div>
+<div class="line"><a name="l01192"></a><span class="lineno"> 1192</span> </div>
+<div class="line"><a name="l01193"></a><span class="lineno"> 1193</span>       <span class="keywordflow">if</span>(update){</div>
+<div class="line"><a name="l01194"></a><span class="lineno"> 1194</span>         <span class="keywordtype">int</span> maxRow=(irow+down_opt[0]/2<imgReaderObs.nrOfRow()) ? irow+down_opt[0]/2 : imgReaderObs.nrOfRow()-1;</div>
+<div class="line"><a name="l01195"></a><span class="lineno"> 1195</span>         obsLineVector.erase(obsLineVector.begin());</div>
+<div class="line"><a name="l01196"></a><span class="lineno"> 1196</span>         imgReaderObs.readData(obsLineBuffer,GDT_Float64,maxRow,0);</div>
+<div class="line"><a name="l01197"></a><span class="lineno"> 1197</span>         obsLineVector.push_back(obsLineBuffer);</div>
+<div class="line"><a name="l01198"></a><span class="lineno"> 1198</span>         obsLineBuffer=obsLineVector[down_opt[0]/2];</div>
+<div class="line"><a name="l01199"></a><span class="lineno"> 1199</span>         <span class="comment">// imgReaderObs.readData(obsLineBuffer,GDT_Float64,irow,0);</span></div>
+<div class="line"><a name="l01200"></a><span class="lineno"> 1200</span>         <span class="keywordflow">if</span>(imgReaderObs.nrOfBand()>1)</div>
+<div class="line"><a name="l01201"></a><span class="lineno"> 1201</span>           imgReaderObs.readData(uncertObsLineBuffer,GDT_Float64,irow,1);</div>
+<div class="line"><a name="l01202"></a><span class="lineno"> 1202</span>       }</div>
+<div class="line"><a name="l01203"></a><span class="lineno"> 1203</span>       <span class="keywordflow">for</span>(<span class="keywordtype">int</span> jcol=0;jcol<ncol;jcol+=down_opt[0]){</div>
+<div class="line"><a name="l01204"></a><span class="lineno"> 1204</span>         <span class="keywordflow">for</span>(<span class="keywordtype">int</span> icol=jcol;icol<jcol+down_opt[0];++icol){</div>
+<div class="line"><a name="l01205"></a><span class="lineno"> 1205</span>           imgReaderEst.image2geo(icol,irow,geox,geoy);</div>
+<div class="line"><a name="l01206"></a><span class="lineno"> 1206</span>           <span class="keywordtype">int</span> minCol=(icol>down_opt[0]/2) ? icol-down_opt[0]/2 : 0;</div>
+<div class="line"><a name="l01207"></a><span class="lineno"> 1207</span>           <span class="keywordtype">int</span> maxCol=(icol+down_opt[0]/2<imgReaderEst.nrOfCol()) ? icol+down_opt[0]/2 : imgReaderEst.nrOfCol()-1;</div>
+<div class="line"><a name="l01208"></a><span class="lineno"> 1208</span>           <span class="keywordtype">int</span> minRow=(irow>down_opt[0]/2) ? irow-down_opt[0]/2 : 0;</div>
+<div class="line"><a name="l01209"></a><span class="lineno"> 1209</span>           <span class="keywordtype">int</span> maxRow=(irow+down_opt[0]/2<imgReaderEst.nrOfRow()) ? irow+down_opt[0]/2 : imgReaderEst.nrOfRow()-1;</div>
+<div class="line"><a name="l01210"></a><span class="lineno"> 1210</span>           estWindowBuffer.clear();</div>
+<div class="line"><a name="l01211"></a><span class="lineno"> 1211</span>           <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iline=0;iline<estLineVector.size();++iline){</div>
+<div class="line"><a name="l01212"></a><span class="lineno"> 1212</span>         <span class="keywordflow">for</span>(<span class="keywordtype">int</span> isample=minCol;isample<=maxCol;++isample){</div>
+<div class="line"><a name="l01213"></a><span class="lineno"> 1213</span>           assert(isample<estLineVector[iline].size());</div>
+<div class="line"><a name="l01214"></a><span class="lineno"> 1214</span>           estWindowBuffer.push_back(estLineVector[iline][isample]);</div>
+<div class="line"><a name="l01215"></a><span class="lineno"> 1215</span>         }</div>
+<div class="line"><a name="l01216"></a><span class="lineno"> 1216</span>           }</div>
+<div class="line"><a name="l01217"></a><span class="lineno"> 1217</span>           <span class="keywordflow">if</span>(update){</div>
+<div class="line"><a name="l01218"></a><span class="lineno"> 1218</span>         obsWindowBuffer.clear();</div>
+<div class="line"><a name="l01219"></a><span class="lineno"> 1219</span>         <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iline=0;iline<obsLineVector.size();++iline){</div>
+<div class="line"><a name="l01220"></a><span class="lineno"> 1220</span>           <span class="keywordflow">for</span>(<span class="keywordtype">int</span> isample=minCol;isample<=maxCol;++isample){</div>
+<div class="line"><a name="l01221"></a><span class="lineno"> 1221</span>             assert(isample<obsLineVector[iline].size());</div>
+<div class="line"><a name="l01222"></a><span class="lineno"> 1222</span>             obsWindowBuffer.push_back(obsLineVector[iline][isample]);</div>
+<div class="line"><a name="l01223"></a><span class="lineno"> 1223</span>           }</div>
+<div class="line"><a name="l01224"></a><span class="lineno"> 1224</span>         }</div>
+<div class="line"><a name="l01225"></a><span class="lineno"> 1225</span>           }</div>
+<div class="line"><a name="l01226"></a><span class="lineno"> 1226</span>           <span class="keywordtype">double</span> estValue=estLineBuffer[icol];</div>
+<div class="line"><a name="l01227"></a><span class="lineno"> 1227</span>           imgReaderModel1.geo2image(geox,geoy,modCol,modRow);</div>
+<div class="line"><a name="l01228"></a><span class="lineno"> 1228</span>           assert(modRow>=0&&modRow<imgReaderModel2.nrOfRow());</div>
+<div class="line"><a name="l01229"></a><span class="lineno"> 1229</span>           lowerCol=modCol-0.5;</div>
+<div class="line"><a name="l01230"></a><span class="lineno"> 1230</span>           lowerCol=<span class="keyword">static_cast<</span><span class="keywordtype">int</span><span class="keyword">></span>(lowerCol);</div>
+<div class="line"><a name="l01231"></a><span class="lineno"> 1231</span>           upperCol=modCol+0.5;</div>
+<div class="line"><a name="l01232"></a><span class="lineno"> 1232</span>           upperCol=<span class="keyword">static_cast<</span><span class="keywordtype">int</span><span class="keyword">></span>(upperCol);</div>
+<div class="line"><a name="l01233"></a><span class="lineno"> 1233</span>           <span class="keywordflow">if</span>(lowerCol<0)</div>
+<div class="line"><a name="l01234"></a><span class="lineno"> 1234</span>         lowerCol=0;</div>
+<div class="line"><a name="l01235"></a><span class="lineno"> 1235</span>           <span class="keywordflow">if</span>(upperCol>=imgReaderModel1.nrOfCol())</div>
+<div class="line"><a name="l01236"></a><span class="lineno"> 1236</span>         upperCol=imgReaderModel1.nrOfCol()-1;</div>
+<div class="line"><a name="l01237"></a><span class="lineno"> 1237</span>           <span class="keywordtype">double</span> modValue1=(modCol-0.5-lowerCol)*model1LineBuffer[upperCol]+(1-modCol+0.5+lowerCol)*model1LineBuffer[lowerCol];</div>
+<div class="line"><a name="l01238"></a><span class="lineno"> 1238</span>           <span class="comment">// double modValue1=model1LineBuffer[modCol];</span></div>
+<div class="line"><a name="l01239"></a><span class="lineno"> 1239</span>           imgReaderModel2.geo2image(geox,geoy,modCol,modRow);</div>
+<div class="line"><a name="l01240"></a><span class="lineno"> 1240</span>           assert(modRow>=0&&modRow<imgReaderModel2.nrOfRow());</div>
+<div class="line"><a name="l01241"></a><span class="lineno"> 1241</span>           lowerCol=modCol-0.5;</div>
+<div class="line"><a name="l01242"></a><span class="lineno"> 1242</span>           lowerCol=<span class="keyword">static_cast<</span><span class="keywordtype">int</span><span class="keyword">></span>(lowerCol);</div>
+<div class="line"><a name="l01243"></a><span class="lineno"> 1243</span>           upperCol=modCol+0.5;</div>
+<div class="line"><a name="l01244"></a><span class="lineno"> 1244</span>           upperCol=<span class="keyword">static_cast<</span><span class="keywordtype">int</span><span class="keyword">></span>(upperCol);</div>
+<div class="line"><a name="l01245"></a><span class="lineno"> 1245</span>           <span class="keywordflow">if</span>(lowerCol<0)</div>
+<div class="line"><a name="l01246"></a><span class="lineno"> 1246</span>         lowerCol=0;</div>
+<div class="line"><a name="l01247"></a><span class="lineno"> 1247</span>           <span class="keywordflow">if</span>(upperCol>=imgReaderModel1.nrOfCol())</div>
+<div class="line"><a name="l01248"></a><span class="lineno"> 1248</span>         upperCol=imgReaderModel1.nrOfCol()-1;</div>
+<div class="line"><a name="l01249"></a><span class="lineno"> 1249</span>           <span class="keywordtype">double</span> modValue2=(modCol-0.5-lowerCol)*model2LineBuffer[upperCol]+(1-modCol+0.5+lowerCol)*model2LineBuffer[lowerCol];</div>
+<div class="line"><a name="l01250"></a><span class="lineno"> 1250</span>           <span class="comment">// double modValue2=model2LineBuffer[modCol];</span></div>
+<div class="line"><a name="l01251"></a><span class="lineno"> 1251</span>           <span class="keywordflow">if</span>(imgReaderEst.isNoData(estValue)){</div>
+<div class="line"><a name="l01252"></a><span class="lineno"> 1252</span>         <span class="comment">//we have not found any valid data yet, better here to take the current model value if valid</span></div>
+<div class="line"><a name="l01253"></a><span class="lineno"> 1253</span>         <span class="keywordflow">if</span>(imgReaderModel2.isNoData(modValue2)){<span class="comment">//if both estimate and model are no-data, set obs to nodata</span></div>
+<div class="line"><a name="l01254"></a><span class="lineno"> 1254</span>           estWriteBuffer[icol]=obsnodata_opt[0];</div>
+<div class="line"><a name="l01255"></a><span class="lineno"> 1255</span>           uncertWriteBuffer[icol]=uncertNodata_opt[0];</div>
+<div class="line"><a name="l01256"></a><span class="lineno"> 1256</span>         }</div>
+<div class="line"><a name="l01257"></a><span class="lineno"> 1257</span>         <span class="keywordflow">else</span>{</div>
+<div class="line"><a name="l01258"></a><span class="lineno"> 1258</span>           estWriteBuffer[icol]=modValue2;</div>
+<div class="line"><a name="l01259"></a><span class="lineno"> 1259</span>           <span class="keywordflow">if</span>(obsmin_opt.size()){</div>
+<div class="line"><a name="l01260"></a><span class="lineno"> 1260</span>             <span class="keywordflow">if</span>(estWriteBuffer[icol]<obsmin_opt[0])</div>
+<div class="line"><a name="l01261"></a><span class="lineno"> 1261</span>               estWriteBuffer[icol]=obsmin_opt[0];</div>
+<div class="line"><a name="l01262"></a><span class="lineno"> 1262</span>           }</div>
+<div class="line"><a name="l01263"></a><span class="lineno"> 1263</span>           <span class="keywordflow">if</span>(obsmax_opt.size()){</div>
+<div class="line"><a name="l01264"></a><span class="lineno"> 1264</span>             <span class="keywordflow">if</span>(estWriteBuffer[icol]>obsmax_opt[0])</div>
+<div class="line"><a name="l01265"></a><span class="lineno"> 1265</span>               estWriteBuffer[icol]=obsmax_opt[0];</div>
+<div class="line"><a name="l01266"></a><span class="lineno"> 1266</span>           }</div>
+<div class="line"><a name="l01267"></a><span class="lineno"> 1267</span>           uncertWriteBuffer[icol]=uncertModel_opt[0]*stdDev*stdDev;</div>
+<div class="line"><a name="l01268"></a><span class="lineno"> 1268</span>         }</div>
+<div class="line"><a name="l01269"></a><span class="lineno"> 1269</span>           }</div>
+<div class="line"><a name="l01270"></a><span class="lineno"> 1270</span>           <span class="keywordflow">else</span>{<span class="comment">//previous estimate is valid</span></div>
+<div class="line"><a name="l01271"></a><span class="lineno"> 1271</span>         <span class="keywordtype">double</span> estMeanValue=statobs.mean(estWindowBuffer);</div>
+<div class="line"><a name="l01272"></a><span class="lineno"> 1272</span>         <span class="keywordtype">double</span> nvalid=0;</div>
+<div class="line"><a name="l01273"></a><span class="lineno"> 1273</span>         <span class="comment">//time update</span></div>
+<div class="line"><a name="l01274"></a><span class="lineno"> 1274</span>         <span class="keywordtype">double</span> processNoiseVariance=processNoise_opt[0];</div>
+<div class="line"><a name="l01275"></a><span class="lineno"> 1275</span>         <span class="comment">//todo: estimate process noise variance expressing instabilityof weights over time</span></div>
+<div class="line"><a name="l01276"></a><span class="lineno"> 1276</span>         <span class="comment">//estimate stability of weight distribution from model (low resolution) data in a window mod1 -> mod2 and assume distribution holds at fine spatial resolution. </span></div>
+<div class="line"><a name="l01277"></a><span class="lineno"> 1277</span> </div>
+<div class="line"><a name="l01278"></a><span class="lineno"> 1278</span>         <span class="keywordflow">if</span>(imgReaderModel1.isNoData(modValue1)||imgReaderModel2.isNoData(modValue2)){</div>
+<div class="line"><a name="l01279"></a><span class="lineno"> 1279</span>           estWriteBuffer[icol]=estValue;</div>
+<div class="line"><a name="l01280"></a><span class="lineno"> 1280</span>           uncertWriteBuffer[icol]=uncertReadBuffer[icol]+processNoiseVariance;</div>
+<div class="line"><a name="l01281"></a><span class="lineno"> 1281</span>         }</div>
+<div class="line"><a name="l01282"></a><span class="lineno"> 1282</span>         <span class="keywordflow">else</span>{<span class="comment">//model is good</span></div>
+<div class="line"><a name="l01283"></a><span class="lineno"> 1283</span>           <span class="keywordtype">double</span> modRatio=modValue2/modValue1;<span class="comment">//transition matrix A in Kalman equations</span></div>
+<div class="line"><a name="l01284"></a><span class="lineno"> 1284</span>           estWriteBuffer[icol]=estValue*modRatio;</div>
+<div class="line"><a name="l01285"></a><span class="lineno"> 1285</span>           uncertWriteBuffer[icol]=uncertReadBuffer[icol]*modRatio*modRatio+processNoiseVariance;</div>
+<div class="line"><a name="l01286"></a><span class="lineno"> 1286</span>         }</div>
+<div class="line"><a name="l01287"></a><span class="lineno"> 1287</span>         <span class="keywordflow">if</span>(obsmin_opt.size()){</div>
+<div class="line"><a name="l01288"></a><span class="lineno"> 1288</span>           <span class="keywordflow">if</span>(estWriteBuffer[icol]<obsmin_opt[0])</div>
+<div class="line"><a name="l01289"></a><span class="lineno"> 1289</span>             estWriteBuffer[icol]=obsmin_opt[0];</div>
+<div class="line"><a name="l01290"></a><span class="lineno"> 1290</span>         }</div>
+<div class="line"><a name="l01291"></a><span class="lineno"> 1291</span>         <span class="keywordflow">if</span>(obsmax_opt.size()){</div>
+<div class="line"><a name="l01292"></a><span class="lineno"> 1292</span>           <span class="keywordflow">if</span>(estWriteBuffer[icol]>obsmax_opt[0])</div>
+<div class="line"><a name="l01293"></a><span class="lineno"> 1293</span>             estWriteBuffer[icol]=obsmax_opt[0];</div>
+<div class="line"><a name="l01294"></a><span class="lineno"> 1294</span>         }</div>
+<div class="line"><a name="l01295"></a><span class="lineno"> 1295</span>           }</div>
+<div class="line"><a name="l01296"></a><span class="lineno"> 1296</span>           <span class="comment">//measurement update</span></div>
+<div class="line"><a name="l01297"></a><span class="lineno"> 1297</span>           <span class="keywordflow">if</span>(update&&!imgReaderObs.isNoData(obsLineBuffer[icol])){</div>
+<div class="line"><a name="l01298"></a><span class="lineno"> 1298</span>         <span class="keywordtype">double</span> kalmanGain=1;</div>
+<div class="line"><a name="l01299"></a><span class="lineno"> 1299</span>         <span class="keywordflow">if</span>(!imgReaderModel2.isNoData(modValue2)){<span class="comment">//model is valid</span></div>
+<div class="line"><a name="l01300"></a><span class="lineno"> 1300</span>           <a class="code" href="classstatfactory_1_1StatFactory.html">statfactory::StatFactory</a> statobs;</div>
+<div class="line"><a name="l01301"></a><span class="lineno"> 1301</span>           statobs.setNoDataValues(obsnodata_opt);</div>
+<div class="line"><a name="l01302"></a><span class="lineno"> 1302</span>           <span class="keywordtype">double</span> obsMeanValue=statobs.mean(obsWindowBuffer);</div>
+<div class="line"><a name="l01303"></a><span class="lineno"> 1303</span>           <span class="keywordtype">double</span> difference=0;</div>
+<div class="line"><a name="l01304"></a><span class="lineno"> 1304</span>           difference=obsMeanValue-modValue2;</div>
+<div class="line"><a name="l01305"></a><span class="lineno"> 1305</span>           errObs=uncertObs_opt[0]*sqrt(difference*difference);</div>
+<div class="line"><a name="l01306"></a><span class="lineno"> 1306</span>           <span class="comment">// errObs=(difference<0)? sqrt(difference*difference) : uncertObs_opt[0];</span></div>
+<div class="line"><a name="l01307"></a><span class="lineno"> 1307</span>           <span class="comment">//errObs=uncertObs_opt[0];//*difference*difference;//uncertainty of the observation (R in Kalman equations)</span></div>
+<div class="line"><a name="l01308"></a><span class="lineno"> 1308</span> </div>
+<div class="line"><a name="l01309"></a><span class="lineno"> 1309</span>           <span class="keywordtype">double</span> errorCovariance=uncertWriteBuffer[icol];<span class="comment">//P in Kalman equations</span></div>
+<div class="line"><a name="l01310"></a><span class="lineno"> 1310</span> </div>
+<div class="line"><a name="l01311"></a><span class="lineno"> 1311</span>           <span class="keywordflow">if</span>(errorCovariance+errObs>eps_opt[0])</div>
+<div class="line"><a name="l01312"></a><span class="lineno"> 1312</span>             kalmanGain=errorCovariance/(errorCovariance+errObs);</div>
+<div class="line"><a name="l01313"></a><span class="lineno"> 1313</span>           <span class="keywordflow">else</span> </div>
+<div class="line"><a name="l01314"></a><span class="lineno"> 1314</span>             kalmanGain=1;</div>
+<div class="line"><a name="l01315"></a><span class="lineno"> 1315</span>           estWriteBuffer[icol]+=kalmanGain*(obsLineBuffer[icol]-estWriteBuffer[icol]);</div>
+<div class="line"><a name="l01316"></a><span class="lineno"> 1316</span>           <span class="keywordflow">if</span>(obsmin_opt.size()){</div>
+<div class="line"><a name="l01317"></a><span class="lineno"> 1317</span>             <span class="keywordflow">if</span>(estWriteBuffer[icol]<obsmin_opt[0])</div>
+<div class="line"><a name="l01318"></a><span class="lineno"> 1318</span>               estWriteBuffer[icol]=obsmin_opt[0];</div>
+<div class="line"><a name="l01319"></a><span class="lineno"> 1319</span>           }</div>
+<div class="line"><a name="l01320"></a><span class="lineno"> 1320</span>           <span class="keywordflow">if</span>(obsmax_opt.size()){</div>
+<div class="line"><a name="l01321"></a><span class="lineno"> 1321</span>             <span class="keywordflow">if</span>(estWriteBuffer[icol]>obsmax_opt[0])</div>
+<div class="line"><a name="l01322"></a><span class="lineno"> 1322</span>               estWriteBuffer[icol]=obsmax_opt[0];</div>
+<div class="line"><a name="l01323"></a><span class="lineno"> 1323</span>           }</div>
+<div class="line"><a name="l01324"></a><span class="lineno"> 1324</span>           uncertWriteBuffer[icol]*=(1-kalmanGain);</div>
+<div class="line"><a name="l01325"></a><span class="lineno"> 1325</span>         }</div>
+<div class="line"><a name="l01326"></a><span class="lineno"> 1326</span>         assert(kalmanGain<=1);</div>
+<div class="line"><a name="l01327"></a><span class="lineno"> 1327</span>           }</div>
+<div class="line"><a name="l01328"></a><span class="lineno"> 1328</span>         }</div>
+<div class="line"><a name="l01329"></a><span class="lineno"> 1329</span>       }</div>
+<div class="line"><a name="l01330"></a><span class="lineno"> 1330</span>       imgWriterEst.writeData(estWriteBuffer,GDT_Float64,irow,0);</div>
+<div class="line"><a name="l01331"></a><span class="lineno"> 1331</span>       imgWriterEst.writeData(uncertWriteBuffer,GDT_Float64,irow,1);</div>
+<div class="line"><a name="l01332"></a><span class="lineno"> 1332</span>       progress=<span class="keyword">static_cast<</span><span class="keywordtype">float</span><span class="keyword">></span>((irow+1.0)/imgWriterEst.nrOfRow());</div>
+<div class="line"><a name="l01333"></a><span class="lineno"> 1333</span>       pfnProgress(progress,pszMessage,pProgressArg);</div>
+<div class="line"><a name="l01334"></a><span class="lineno"> 1334</span>     }</div>
+<div class="line"><a name="l01335"></a><span class="lineno"> 1335</span>       }</div>
+<div class="line"><a name="l01336"></a><span class="lineno"> 1336</span>       imgWriterEst.close();</div>
+<div class="line"><a name="l01337"></a><span class="lineno"> 1337</span>       imgReaderEst.close();</div>
+<div class="line"><a name="l01338"></a><span class="lineno"> 1338</span> </div>
+<div class="line"><a name="l01339"></a><span class="lineno"> 1339</span>       <span class="keywordflow">if</span>(update){</div>
+<div class="line"><a name="l01340"></a><span class="lineno"> 1340</span>     imgReaderObs.close();</div>
+<div class="line"><a name="l01341"></a><span class="lineno"> 1341</span>     --obsindex;</div>
+<div class="line"><a name="l01342"></a><span class="lineno"> 1342</span>       }</div>
+<div class="line"><a name="l01343"></a><span class="lineno"> 1343</span>       imgReaderModel1.close();</div>
+<div class="line"><a name="l01344"></a><span class="lineno"> 1344</span>       imgReaderModel2.close();</div>
+<div class="line"><a name="l01345"></a><span class="lineno"> 1345</span>     }</div>
+<div class="line"><a name="l01346"></a><span class="lineno"> 1346</span>   }</div>
+<div class="line"><a name="l01347"></a><span class="lineno"> 1347</span>   <span class="keywordflow">if</span>(find(direction_opt.begin(),direction_opt.end(),<span class="stringliteral">"smooth"</span>)!=direction_opt.end()){</div>
+<div class="line"><a name="l01349"></a><span class="lineno"> 1349</span>     cout << <span class="stringliteral">"Running smooth model"</span> << endl;</div>
+<div class="line"><a name="l01350"></a><span class="lineno"> 1350</span>     obsindex=0;</div>
+<div class="line"><a name="l01351"></a><span class="lineno"> 1351</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> modindex=0;modindex<model_opt.size();++modindex){</div>
+<div class="line"><a name="l01352"></a><span class="lineno"> 1352</span>       <span class="keywordflow">if</span>(verbose_opt[0]){</div>
+<div class="line"><a name="l01353"></a><span class="lineno"> 1353</span>     cout << <span class="stringliteral">"processing time "</span> << tmodel_opt[modindex] << endl;</div>
+<div class="line"><a name="l01354"></a><span class="lineno"> 1354</span>     <span class="keywordflow">if</span>(obsindex<relobsindex.size())</div>
+<div class="line"><a name="l01355"></a><span class="lineno"> 1355</span>       cout << <span class="stringliteral">"next observation "</span> << tmodel_opt[relobsindex[obsindex]] << endl;</div>
+<div class="line"><a name="l01356"></a><span class="lineno"> 1356</span>     <span class="keywordflow">else</span></div>
+<div class="line"><a name="l01357"></a><span class="lineno"> 1357</span>       cout << <span class="stringliteral">"There is no next observation"</span> << endl;</div>
+<div class="line"><a name="l01358"></a><span class="lineno"> 1358</span>       }</div>
+<div class="line"><a name="l01359"></a><span class="lineno"> 1359</span>       <span class="keywordtype">string</span> output;</div>
+<div class="line"><a name="l01360"></a><span class="lineno"> 1360</span>       <span class="keywordflow">if</span>(outputfb_opt.size()==model_opt.size())</div>
+<div class="line"><a name="l01361"></a><span class="lineno"> 1361</span>     output=outputfb_opt[modindex];</div>
+<div class="line"><a name="l01362"></a><span class="lineno"> 1362</span>       <span class="keywordflow">else</span>{</div>
+<div class="line"><a name="l01363"></a><span class="lineno"> 1363</span>     ostringstream outputstream;</div>
+<div class="line"><a name="l01364"></a><span class="lineno"> 1364</span>     outputstream << outputfb_opt[0] << <span class="stringliteral">"_"</span>;</div>
+<div class="line"><a name="l01365"></a><span class="lineno"> 1365</span>     outputstream << setfill(<span class="charliteral">'0'</span>) << setw(ndigit) << tmodel_opt[modindex];</div>
+<div class="line"><a name="l01366"></a><span class="lineno"> 1366</span>     outputstream << <span class="stringliteral">".tif"</span>;</div>
+<div class="line"><a name="l01367"></a><span class="lineno"> 1367</span>     <span class="comment">// outputstream << outputfb_opt[0] << "_" << tmodel_opt[modindex] << ".tif";</span></div>
+<div class="line"><a name="l01368"></a><span class="lineno"> 1368</span>     output=outputstream.str();</div>
+<div class="line"><a name="l01369"></a><span class="lineno"> 1369</span>       }</div>
+<div class="line"><a name="l01370"></a><span class="lineno"> 1370</span>     </div>
+<div class="line"><a name="l01371"></a><span class="lineno"> 1371</span>       <span class="comment">//two band output band0=estimation, band1=uncertainty</span></div>
+<div class="line"><a name="l01372"></a><span class="lineno"> 1372</span>       imgWriterEst.open(output,ncol,nrow,2,GDT_Float64,imageType,option_opt);</div>
+<div class="line"><a name="l01373"></a><span class="lineno"> 1373</span>       imgWriterEst.setProjectionProj4(projection_opt[0]);</div>
+<div class="line"><a name="l01374"></a><span class="lineno"> 1374</span>       imgWriterEst.setGeoTransform(geotransform);</div>
+<div class="line"><a name="l01375"></a><span class="lineno"> 1375</span>       imgWriterEst.GDALSetNoDataValue(obsnodata_opt[0]);</div>
+<div class="line"><a name="l01376"></a><span class="lineno"> 1376</span> </div>
+<div class="line"><a name="l01377"></a><span class="lineno"> 1377</span>       <span class="comment">//open forward and backward estimates</span></div>
+<div class="line"><a name="l01378"></a><span class="lineno"> 1378</span>       <span class="comment">//we assume forward in model and backward in observation...</span></div>
+<div class="line"><a name="l01379"></a><span class="lineno"> 1379</span> </div>
+<div class="line"><a name="l01380"></a><span class="lineno"> 1380</span>       <span class="keywordtype">string</span> inputfw;</div>
+<div class="line"><a name="l01381"></a><span class="lineno"> 1381</span>       <span class="keywordtype">string</span> inputbw;</div>
+<div class="line"><a name="l01382"></a><span class="lineno"> 1382</span>       <span class="keywordflow">if</span>(outputfw_opt.size()==model_opt.size())</div>
+<div class="line"><a name="l01383"></a><span class="lineno"> 1383</span>     inputfw=outputfw_opt[modindex];</div>
+<div class="line"><a name="l01384"></a><span class="lineno"> 1384</span>       <span class="keywordflow">else</span>{</div>
+<div class="line"><a name="l01385"></a><span class="lineno"> 1385</span>     ostringstream outputstream;</div>
+<div class="line"><a name="l01386"></a><span class="lineno"> 1386</span>     outputstream << outputfw_opt[0] << <span class="stringliteral">"_"</span>;</div>
+<div class="line"><a name="l01387"></a><span class="lineno"> 1387</span>     outputstream << setfill(<span class="charliteral">'0'</span>) << setw(ndigit) << tmodel_opt[modindex];</div>
+<div class="line"><a name="l01388"></a><span class="lineno"> 1388</span>     outputstream << <span class="stringliteral">".tif"</span>;</div>
+<div class="line"><a name="l01389"></a><span class="lineno"> 1389</span>     <span class="comment">// outputstream << outputfw_opt[0] << "_" << tmodel_opt[modindex] << ".tif";</span></div>
+<div class="line"><a name="l01390"></a><span class="lineno"> 1390</span>     inputfw=outputstream.str();</div>
 <div class="line"><a name="l01391"></a><span class="lineno"> 1391</span>       }</div>
-<div class="line"><a name="l01392"></a><span class="lineno"> 1392</span>       <span class="comment">//measurement update</span></div>
-<div class="line"><a name="l01393"></a><span class="lineno"> 1393</span>       <span class="keywordflow">if</span>(update&&!imgReaderObs.isNoData(obsLineBuffer[icol])){</div>
-<div class="line"><a name="l01394"></a><span class="lineno"> 1394</span>         <span class="keywordtype">double</span> kalmanGain=1;</div>
-<div class="line"><a name="l01395"></a><span class="lineno"> 1395</span>         <span class="keywordtype">double</span> uncertObs=uncertObs_opt[0];</div>
-<div class="line"><a name="l01396"></a><span class="lineno"> 1396</span>         <span class="keywordflow">if</span>(uncertObsLineBuffer.size()>icol)</div>
-<div class="line"><a name="l01397"></a><span class="lineno"> 1397</span>           uncertObs=uncertObsLineBuffer[icol];</div>
-<div class="line"><a name="l01398"></a><span class="lineno"> 1398</span>         <span class="keywordflow">else</span> <span class="keywordflow">if</span>(weight_opt.size()>1||deltaObs_opt.size()){</div>
-<div class="line"><a name="l01399"></a><span class="lineno"> 1399</span>           <a class="code" href="classstatfactory_1_1StatFactory.html">statfactory::StatFactory</a> statobs;</div>
-<div class="line"><a name="l01400"></a><span class="lineno"> 1400</span>           statobs.setNoDataValues(obsnodata_opt);</div>
-<div class="line"><a name="l01401"></a><span class="lineno"> 1401</span>           <span class="keywordtype">double</span> obsMeanValue=(statobs.mean(obsWindowBuffer)-c0obs)/c1obs;</div>
-<div class="line"><a name="l01402"></a><span class="lineno"> 1402</span>           <span class="keywordtype">double</span> difference=obsMeanValue-modValue;</div>
-<div class="line"><a name="l01403"></a><span class="lineno"> 1403</span>           <span class="keywordflow">if</span>(modValue){</div>
-<div class="line"><a name="l01404"></a><span class="lineno"> 1404</span>         <span class="keywordtype">double</span> relativeDifference=difference/modValue;</div>
-<div class="line"><a name="l01405"></a><span class="lineno"> 1405</span>         <span class="keywordflow">if</span>(deltaObs_opt.size()){</div>
-<div class="line"><a name="l01406"></a><span class="lineno"> 1406</span>           assert(deltaObs_opt.size()>1);</div>
-<div class="line"><a name="l01407"></a><span class="lineno"> 1407</span>           <span class="keywordflow">if</span>(100*relativeDifference<deltaObs_opt[0])<span class="comment">//lower bound</span></div>
-<div class="line"><a name="l01408"></a><span class="lineno"> 1408</span>             kalmanGain=0;</div>
-<div class="line"><a name="l01409"></a><span class="lineno"> 1409</span>           <span class="keywordflow">else</span> <span class="keywordflow">if</span>(100*relativeDifference>deltaObs_opt[1])<span class="comment">//upper bound</span></div>
-<div class="line"><a name="l01410"></a><span class="lineno"> 1410</span>             kalmanGain=0;</div>
-<div class="line"><a name="l01411"></a><span class="lineno"> 1411</span>         }</div>
-<div class="line"><a name="l01412"></a><span class="lineno"> 1412</span>         <span class="keywordflow">else</span> <span class="keywordflow">if</span>(weight_opt.size()){</div>
-<div class="line"><a name="l01413"></a><span class="lineno"> 1413</span>           assert(weight_opt.size()>1);</div>
-<div class="line"><a name="l01414"></a><span class="lineno"> 1414</span>           <span class="keywordflow">if</span>(obsMeanValue<modValue)</div>
-<div class="line"><a name="l01415"></a><span class="lineno"> 1415</span>             uncertObs=weight_opt[0]*relativeDifference;</div>
-<div class="line"><a name="l01416"></a><span class="lineno"> 1416</span>           <span class="keywordflow">else</span> <span class="keywordflow">if</span>(obsMeanValue>modValue)</div>
-<div class="line"><a name="l01417"></a><span class="lineno"> 1417</span>             uncertObs=weight_opt[1]*relativeDifference;</div>
-<div class="line"><a name="l01418"></a><span class="lineno"> 1418</span>         }</div>
-<div class="line"><a name="l01419"></a><span class="lineno"> 1419</span>           }</div>
-<div class="line"><a name="l01420"></a><span class="lineno"> 1420</span>           <span class="keywordflow">if</span>(uncertObs<=0)</div>
-<div class="line"><a name="l01421"></a><span class="lineno"> 1421</span>         uncertObs=0;</div>
-<div class="line"><a name="l01422"></a><span class="lineno"> 1422</span>           <span class="keywordflow">if</span>(verbose_opt[0]>1)</div>
-<div class="line"><a name="l01423"></a><span class="lineno"> 1423</span>         cout << <span class="stringliteral">"obsMeanValue:"</span> << obsMeanValue << <span class="stringliteral">", modValue: "</span> << modValue << endl;</div>
-<div class="line"><a name="l01424"></a><span class="lineno"> 1424</span>         }</div>
-<div class="line"><a name="l01425"></a><span class="lineno"> 1425</span>         <span class="keywordflow">if</span>(kalmanGain>0){</div>
-<div class="line"><a name="l01426"></a><span class="lineno"> 1426</span>           <span class="keywordflow">if</span>((uncertWriteBuffer[icol]+uncertObs)>eps_opt[0])</div>
-<div class="line"><a name="l01427"></a><span class="lineno"> 1427</span>         kalmanGain=uncertWriteBuffer[icol]/(uncertWriteBuffer[icol]+uncertObs);</div>
-<div class="line"><a name="l01428"></a><span class="lineno"> 1428</span>         }</div>
-<div class="line"><a name="l01429"></a><span class="lineno"> 1429</span>         assert(kalmanGain<=1);</div>
-<div class="line"><a name="l01430"></a><span class="lineno"> 1430</span>         estWriteBuffer[icol]+=kalmanGain*(obsLineBuffer[icol]-estWriteBuffer[icol]);</div>
-<div class="line"><a name="l01431"></a><span class="lineno"> 1431</span>         uncertWriteBuffer[icol]*=(1-kalmanGain);</div>
-<div class="line"><a name="l01432"></a><span class="lineno"> 1432</span>       }</div>
-<div class="line"><a name="l01433"></a><span class="lineno"> 1433</span>     }</div>
-<div class="line"><a name="l01434"></a><span class="lineno"> 1434</span>     imgWriterEst.writeData(estWriteBuffer,GDT_Float64,irow,0);</div>
-<div class="line"><a name="l01435"></a><span class="lineno"> 1435</span>     imgWriterEst.writeData(uncertWriteBuffer,GDT_Float64,irow,1);</div>
-<div class="line"><a name="l01436"></a><span class="lineno"> 1436</span>     progress=<span class="keyword">static_cast<</span><span class="keywordtype">float</span><span class="keyword">></span>((irow+1.0)/imgWriterEst.nrOfRow());</div>
-<div class="line"><a name="l01437"></a><span class="lineno"> 1437</span>     pfnProgress(progress,pszMessage,pProgressArg);</div>
-<div class="line"><a name="l01438"></a><span class="lineno"> 1438</span>       }</div>
-<div class="line"><a name="l01439"></a><span class="lineno"> 1439</span> </div>
-<div class="line"><a name="l01440"></a><span class="lineno"> 1440</span>       imgWriterEst.close();</div>
-<div class="line"><a name="l01441"></a><span class="lineno"> 1441</span>       imgReaderEst.close();</div>
-<div class="line"><a name="l01442"></a><span class="lineno"> 1442</span> </div>
-<div class="line"><a name="l01443"></a><span class="lineno"> 1443</span>       <span class="keywordflow">if</span>(update){</div>
-<div class="line"><a name="l01444"></a><span class="lineno"> 1444</span>     imgReaderObs.close();</div>
-<div class="line"><a name="l01445"></a><span class="lineno"> 1445</span>     --obsindex;</div>
-<div class="line"><a name="l01446"></a><span class="lineno"> 1446</span>       }</div>
-<div class="line"><a name="l01447"></a><span class="lineno"> 1447</span>       imgReaderModel1.close();</div>
-<div class="line"><a name="l01448"></a><span class="lineno"> 1448</span>       imgReaderModel2.close();</div>
-<div class="line"><a name="l01449"></a><span class="lineno"> 1449</span>     }</div>
-<div class="line"><a name="l01450"></a><span class="lineno"> 1450</span>   }</div>
-<div class="line"><a name="l01451"></a><span class="lineno"> 1451</span>   <span class="keywordflow">if</span>(find(direction_opt.begin(),direction_opt.end(),<span class="stringliteral">"smooth"</span>)!=direction_opt.end()){</div>
-<div class="line"><a name="l01453"></a><span class="lineno"> 1453</span>     cout << <span class="stringliteral">"Running smooth model"</span> << endl;</div>
-<div class="line"><a name="l01454"></a><span class="lineno"> 1454</span>     obsindex=0;</div>
-<div class="line"><a name="l01455"></a><span class="lineno"> 1455</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> modindex=0;modindex<model_opt.size();++modindex){</div>
-<div class="line"><a name="l01456"></a><span class="lineno"> 1456</span>       <span class="keywordflow">if</span>(verbose_opt[0]){</div>
-<div class="line"><a name="l01457"></a><span class="lineno"> 1457</span>     cout << <span class="stringliteral">"processing time "</span> << tmodel_opt[modindex] << endl;</div>
-<div class="line"><a name="l01458"></a><span class="lineno"> 1458</span>     <span class="keywordflow">if</span>(obsindex<relobsindex.size())</div>
-<div class="line"><a name="l01459"></a><span class="lineno"> 1459</span>       cout << <span class="stringliteral">"next observation "</span> << tmodel_opt[relobsindex[obsindex]] << endl;</div>
-<div class="line"><a name="l01460"></a><span class="lineno"> 1460</span>     <span class="keywordflow">else</span></div>
-<div class="line"><a name="l01461"></a><span class="lineno"> 1461</span>       cout << <span class="stringliteral">"There is no next observation"</span> << endl;</div>
-<div class="line"><a name="l01462"></a><span class="lineno"> 1462</span>       }</div>
-<div class="line"><a name="l01463"></a><span class="lineno"> 1463</span>       <span class="keywordtype">string</span> output;</div>
-<div class="line"><a name="l01464"></a><span class="lineno"> 1464</span>       <span class="keywordflow">if</span>(outputfb_opt.size()==model_opt.size())</div>
-<div class="line"><a name="l01465"></a><span class="lineno"> 1465</span>     output=outputfb_opt[modindex];</div>
-<div class="line"><a name="l01466"></a><span class="lineno"> 1466</span>       <span class="keywordflow">else</span>{</div>
-<div class="line"><a name="l01467"></a><span class="lineno"> 1467</span>     ostringstream outputstream;</div>
-<div class="line"><a name="l01468"></a><span class="lineno"> 1468</span>     outputstream << outputfb_opt[0] << <span class="stringliteral">"_"</span>;</div>
-<div class="line"><a name="l01469"></a><span class="lineno"> 1469</span>     outputstream << setfill(<span class="charliteral">'0'</span>) << setw(ndigit) << tmodel_opt[modindex];</div>
-<div class="line"><a name="l01470"></a><span class="lineno"> 1470</span>     outputstream << <span class="stringliteral">".tif"</span>;</div>
-<div class="line"><a name="l01471"></a><span class="lineno"> 1471</span>     <span class="comment">// outputstream << outputfb_opt[0] << "_" << tmodel_opt[modindex] << ".tif";</span></div>
-<div class="line"><a name="l01472"></a><span class="lineno"> 1472</span>     output=outputstream.str();</div>
-<div class="line"><a name="l01473"></a><span class="lineno"> 1473</span>       }</div>
-<div class="line"><a name="l01474"></a><span class="lineno"> 1474</span>     </div>
-<div class="line"><a name="l01475"></a><span class="lineno"> 1475</span>       <span class="comment">//two band output band0=estimation, band1=uncertainty</span></div>
-<div class="line"><a name="l01476"></a><span class="lineno"> 1476</span>       imgWriterEst.open(output,ncol,nrow,2,GDT_Float32,imageType,option_opt);</div>
-<div class="line"><a name="l01477"></a><span class="lineno"> 1477</span>       imgWriterEst.setProjectionProj4(projection_opt[0]);</div>
-<div class="line"><a name="l01478"></a><span class="lineno"> 1478</span>       imgWriterEst.setGeoTransform(geotransform);</div>
-<div class="line"><a name="l01479"></a><span class="lineno"> 1479</span>       imgWriterEst.GDALSetNoDataValue(obsnodata_opt[0]);</div>
-<div class="line"><a name="l01480"></a><span class="lineno"> 1480</span> </div>
-<div class="line"><a name="l01481"></a><span class="lineno"> 1481</span>       <span class="comment">//open forward and backward estimates</span></div>
-<div class="line"><a name="l01482"></a><span class="lineno"> 1482</span>       <span class="comment">//we assume forward in model and backward in observation...</span></div>
-<div class="line"><a name="l01483"></a><span class="lineno"> 1483</span> </div>
-<div class="line"><a name="l01484"></a><span class="lineno"> 1484</span>       <span class="keywordtype">string</span> inputfw;</div>
-<div class="line"><a name="l01485"></a><span class="lineno"> 1485</span>       <span class="keywordtype">string</span> inputbw;</div>
-<div class="line"><a name="l01486"></a><span class="lineno"> 1486</span>       <span class="keywordflow">if</span>(outputfw_opt.size()==model_opt.size())</div>
-<div class="line"><a name="l01487"></a><span class="lineno"> 1487</span>     inputfw=outputfw_opt[modindex];</div>
-<div class="line"><a name="l01488"></a><span class="lineno"> 1488</span>       <span class="keywordflow">else</span>{</div>
-<div class="line"><a name="l01489"></a><span class="lineno"> 1489</span>     ostringstream outputstream;</div>
-<div class="line"><a name="l01490"></a><span class="lineno"> 1490</span>     outputstream << outputfw_opt[0] << <span class="stringliteral">"_"</span>;</div>
-<div class="line"><a name="l01491"></a><span class="lineno"> 1491</span>     outputstream << setfill(<span class="charliteral">'0'</span>) << setw(ndigit) << tmodel_opt[modindex];</div>
-<div class="line"><a name="l01492"></a><span class="lineno"> 1492</span>     outputstream << <span class="stringliteral">".tif"</span>;</div>
-<div class="line"><a name="l01493"></a><span class="lineno"> 1493</span>     <span class="comment">// outputstream << outputfw_opt[0] << "_" << tmodel_opt[modindex] << ".tif";</span></div>
-<div class="line"><a name="l01494"></a><span class="lineno"> 1494</span>     inputfw=outputstream.str();</div>
-<div class="line"><a name="l01495"></a><span class="lineno"> 1495</span>       }</div>
-<div class="line"><a name="l01496"></a><span class="lineno"> 1496</span>       <span class="keywordflow">if</span>(outputbw_opt.size()==model_opt.size())</div>
-<div class="line"><a name="l01497"></a><span class="lineno"> 1497</span>     inputbw=outputbw_opt[modindex];</div>
-<div class="line"><a name="l01498"></a><span class="lineno"> 1498</span>       <span class="keywordflow">else</span>{</div>
-<div class="line"><a name="l01499"></a><span class="lineno"> 1499</span>     ostringstream outputstream;</div>
-<div class="line"><a name="l01500"></a><span class="lineno"> 1500</span>     outputstream << outputbw_opt[0] << <span class="stringliteral">"_"</span>;</div>
-<div class="line"><a name="l01501"></a><span class="lineno"> 1501</span>     outputstream << setfill(<span class="charliteral">'0'</span>) << setw(ndigit) << tmodel_opt[modindex];</div>
-<div class="line"><a name="l01502"></a><span class="lineno"> 1502</span>     outputstream << <span class="stringliteral">".tif"</span>;</div>
-<div class="line"><a name="l01503"></a><span class="lineno"> 1503</span>     <span class="comment">// outputstream << outputbw_opt[0] << "_" << tmodel_opt[modindex] << ".tif";</span></div>
-<div class="line"><a name="l01504"></a><span class="lineno"> 1504</span>     inputbw=outputstream.str();</div>
+<div class="line"><a name="l01392"></a><span class="lineno"> 1392</span>       <span class="keywordflow">if</span>(outputbw_opt.size()==model_opt.size())</div>
+<div class="line"><a name="l01393"></a><span class="lineno"> 1393</span>     inputbw=outputbw_opt[modindex];</div>
+<div class="line"><a name="l01394"></a><span class="lineno"> 1394</span>       <span class="keywordflow">else</span>{</div>
+<div class="line"><a name="l01395"></a><span class="lineno"> 1395</span>     ostringstream outputstream;</div>
+<div class="line"><a name="l01396"></a><span class="lineno"> 1396</span>     outputstream << outputbw_opt[0] << <span class="stringliteral">"_"</span>;</div>
+<div class="line"><a name="l01397"></a><span class="lineno"> 1397</span>     outputstream << setfill(<span class="charliteral">'0'</span>) << setw(ndigit) << tmodel_opt[modindex];</div>
+<div class="line"><a name="l01398"></a><span class="lineno"> 1398</span>     outputstream << <span class="stringliteral">".tif"</span>;</div>
+<div class="line"><a name="l01399"></a><span class="lineno"> 1399</span>     <span class="comment">// outputstream << outputbw_opt[0] << "_" << tmodel_opt[modindex] << ".tif";</span></div>
+<div class="line"><a name="l01400"></a><span class="lineno"> 1400</span>     inputbw=outputstream.str();</div>
+<div class="line"><a name="l01401"></a><span class="lineno"> 1401</span>       }</div>
+<div class="line"><a name="l01402"></a><span class="lineno"> 1402</span>       <a class="code" href="classImgReaderGdal.html">ImgReaderGdal</a> imgReaderForward(inputfw);</div>
+<div class="line"><a name="l01403"></a><span class="lineno"> 1403</span>       <a class="code" href="classImgReaderGdal.html">ImgReaderGdal</a> imgReaderBackward(inputbw);</div>
+<div class="line"><a name="l01404"></a><span class="lineno"> 1404</span>       imgReaderForward.setNoData(obsnodata_opt);</div>
+<div class="line"><a name="l01405"></a><span class="lineno"> 1405</span>       imgReaderBackward.setNoData(obsnodata_opt);</div>
+<div class="line"><a name="l01406"></a><span class="lineno"> 1406</span>       </div>
+<div class="line"><a name="l01407"></a><span class="lineno"> 1407</span>       vector<double> estForwardBuffer;</div>
+<div class="line"><a name="l01408"></a><span class="lineno"> 1408</span>       vector<double> estBackwardBuffer;</div>
+<div class="line"><a name="l01409"></a><span class="lineno"> 1409</span>       vector<double> uncertObsLineBuffer;</div>
+<div class="line"><a name="l01410"></a><span class="lineno"> 1410</span>       vector<double> uncertForwardBuffer;</div>
+<div class="line"><a name="l01411"></a><span class="lineno"> 1411</span>       vector<double> uncertBackwardBuffer;</div>
+<div class="line"><a name="l01412"></a><span class="lineno"> 1412</span>       vector<double> uncertReadBuffer;</div>
+<div class="line"><a name="l01413"></a><span class="lineno"> 1413</span>       vector<double> estWriteBuffer(ncol);</div>
+<div class="line"><a name="l01414"></a><span class="lineno"> 1414</span>       vector<double> uncertWriteBuffer(ncol);</div>
+<div class="line"><a name="l01415"></a><span class="lineno"> 1415</span>       <span class="comment">// vector<double> lineMask;</span></div>
+<div class="line"><a name="l01416"></a><span class="lineno"> 1416</span> </div>
+<div class="line"><a name="l01417"></a><span class="lineno"> 1417</span>       <span class="keywordtype">bool</span> update=<span class="keyword">false</span>;</div>
+<div class="line"><a name="l01418"></a><span class="lineno"> 1418</span>       <span class="keywordflow">if</span>(obsindex<relobsindex.size()){</div>
+<div class="line"><a name="l01419"></a><span class="lineno"> 1419</span>     update=(relobsindex[obsindex]==modindex);</div>
+<div class="line"><a name="l01420"></a><span class="lineno"> 1420</span>       }</div>
+<div class="line"><a name="l01421"></a><span class="lineno"> 1421</span> </div>
+<div class="line"><a name="l01422"></a><span class="lineno"> 1422</span>       <span class="keywordflow">if</span>(update){</div>
+<div class="line"><a name="l01423"></a><span class="lineno"> 1423</span>     <span class="keywordflow">if</span>(verbose_opt[0])</div>
+<div class="line"><a name="l01424"></a><span class="lineno"> 1424</span>       cout << <span class="stringliteral">"***update "</span> << relobsindex[obsindex] << <span class="stringliteral">" = "</span> << modindex << <span class="stringliteral">" "</span> << observation_opt[obsindex] << <span class="stringliteral">" ***"</span> << endl;</div>
+<div class="line"><a name="l01425"></a><span class="lineno"> 1425</span>     imgReaderObs.open(observation_opt[obsindex]);</div>
+<div class="line"><a name="l01426"></a><span class="lineno"> 1426</span>     imgReaderObs.getGeoTransform(geotransform);</div>
+<div class="line"><a name="l01427"></a><span class="lineno"> 1427</span>     imgReaderObs.setNoData(obsnodata_opt);</div>
+<div class="line"><a name="l01428"></a><span class="lineno"> 1428</span>     <span class="comment">//calculate regression between model and observation</span></div>
+<div class="line"><a name="l01429"></a><span class="lineno"> 1429</span>       }</div>
+<div class="line"><a name="l01430"></a><span class="lineno"> 1430</span> </div>
+<div class="line"><a name="l01431"></a><span class="lineno"> 1431</span>       pfnProgress(progress,pszMessage,pProgressArg);</div>
+<div class="line"><a name="l01432"></a><span class="lineno"> 1432</span> </div>
+<div class="line"><a name="l01433"></a><span class="lineno"> 1433</span>       <span class="keywordflow">for</span>(<span class="keywordtype">int</span> irow=0;irow<imgWriterEst.nrOfRow();++irow){</div>
+<div class="line"><a name="l01434"></a><span class="lineno"> 1434</span>     assert(irow<imgReaderForward.nrOfRow());</div>
+<div class="line"><a name="l01435"></a><span class="lineno"> 1435</span>     assert(irow<imgReaderBackward.nrOfRow());</div>
+<div class="line"><a name="l01436"></a><span class="lineno"> 1436</span>     imgReaderForward.readData(estForwardBuffer,GDT_Float64,irow,0);</div>
+<div class="line"><a name="l01437"></a><span class="lineno"> 1437</span>     imgReaderBackward.readData(estBackwardBuffer,GDT_Float64,irow,0);</div>
+<div class="line"><a name="l01438"></a><span class="lineno"> 1438</span>     imgReaderForward.readData(uncertForwardBuffer,GDT_Float64,irow,1);</div>
+<div class="line"><a name="l01439"></a><span class="lineno"> 1439</span>     imgReaderBackward.readData(uncertBackwardBuffer,GDT_Float64,irow,1);</div>
+<div class="line"><a name="l01440"></a><span class="lineno"> 1440</span> </div>
+<div class="line"><a name="l01441"></a><span class="lineno"> 1441</span>     <span class="keywordflow">if</span>(update){</div>
+<div class="line"><a name="l01442"></a><span class="lineno"> 1442</span>       imgReaderObs.readData(estWriteBuffer,GDT_Float64,irow,0);</div>
+<div class="line"><a name="l01443"></a><span class="lineno"> 1443</span>       <span class="keywordflow">if</span>(imgReaderObs.nrOfBand()>1)</div>
+<div class="line"><a name="l01444"></a><span class="lineno"> 1444</span>         imgReaderObs.readData(uncertObsLineBuffer,GDT_Float64,irow,1);</div>
+<div class="line"><a name="l01445"></a><span class="lineno"> 1445</span>     }</div>
+<div class="line"><a name="l01446"></a><span class="lineno"> 1446</span> </div>
+<div class="line"><a name="l01447"></a><span class="lineno"> 1447</span>     <span class="comment">// double oldRowMask=-1;//keep track of row mask to optimize number of line readings</span></div>
+<div class="line"><a name="l01448"></a><span class="lineno"> 1448</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> icol=0;icol<imgWriterEst.nrOfCol();++icol){</div>
+<div class="line"><a name="l01449"></a><span class="lineno"> 1449</span>       imgWriterEst.image2geo(icol,irow,geox,geoy);</div>
+<div class="line"><a name="l01450"></a><span class="lineno"> 1450</span>       <span class="keywordtype">double</span> A=estForwardBuffer[icol];</div>
+<div class="line"><a name="l01451"></a><span class="lineno"> 1451</span>       <span class="keywordtype">double</span> B=estBackwardBuffer[icol];</div>
+<div class="line"><a name="l01452"></a><span class="lineno"> 1452</span>       <span class="keywordtype">double</span> C=uncertForwardBuffer[icol]*uncertForwardBuffer[icol];</div>
+<div class="line"><a name="l01453"></a><span class="lineno"> 1453</span>       <span class="keywordtype">double</span> D=uncertBackwardBuffer[icol]*uncertBackwardBuffer[icol];</div>
+<div class="line"><a name="l01454"></a><span class="lineno"> 1454</span>       <span class="keywordtype">double</span> uncertObs=uncertObs_opt[0];</div>
+<div class="line"><a name="l01455"></a><span class="lineno"> 1455</span> </div>
+<div class="line"><a name="l01456"></a><span class="lineno"> 1456</span>       <span class="comment">// if(update){//check for nodata in observation</span></div>
+<div class="line"><a name="l01457"></a><span class="lineno"> 1457</span>       <span class="comment">//   if(imgReaderObs.isNoData(estWriteBuffer[icol]))</span></div>
+<div class="line"><a name="l01458"></a><span class="lineno"> 1458</span>       <span class="comment">//     uncertObs=uncertNodata_opt[0];</span></div>
+<div class="line"><a name="l01459"></a><span class="lineno"> 1459</span>       <span class="comment">//   else if(uncertObsLineBuffer.size()>icol)</span></div>
+<div class="line"><a name="l01460"></a><span class="lineno"> 1460</span>       <span class="comment">//     uncertObs=uncertObsLineBuffer[icol];</span></div>
+<div class="line"><a name="l01461"></a><span class="lineno"> 1461</span>       <span class="comment">// }</span></div>
+<div class="line"><a name="l01462"></a><span class="lineno"> 1462</span> </div>
+<div class="line"><a name="l01463"></a><span class="lineno"> 1463</span>       <span class="keywordtype">double</span> noemer=(C+D);</div>
+<div class="line"><a name="l01464"></a><span class="lineno"> 1464</span>       <span class="comment">//todo: consistently check for division by zero...</span></div>
+<div class="line"><a name="l01465"></a><span class="lineno"> 1465</span>       <span class="keywordflow">if</span>(imgReaderForward.isNoData(A)&&imgReaderBackward.isNoData(B)){</div>
+<div class="line"><a name="l01466"></a><span class="lineno"> 1466</span>         estWriteBuffer[icol]=obsnodata_opt[0];</div>
+<div class="line"><a name="l01467"></a><span class="lineno"> 1467</span>         uncertWriteBuffer[icol]=uncertNodata_opt[0];</div>
+<div class="line"><a name="l01468"></a><span class="lineno"> 1468</span>       }</div>
+<div class="line"><a name="l01469"></a><span class="lineno"> 1469</span>       <span class="keywordflow">else</span> <span class="keywordflow">if</span>(imgReaderForward.isNoData(A)){</div>
+<div class="line"><a name="l01470"></a><span class="lineno"> 1470</span>         estWriteBuffer[icol]=B;</div>
+<div class="line"><a name="l01471"></a><span class="lineno"> 1471</span>         uncertWriteBuffer[icol]=uncertBackwardBuffer[icol];</div>
+<div class="line"><a name="l01472"></a><span class="lineno"> 1472</span>       }</div>
+<div class="line"><a name="l01473"></a><span class="lineno"> 1473</span>       <span class="keywordflow">else</span> <span class="keywordflow">if</span>(imgReaderForward.isNoData(B)){</div>
+<div class="line"><a name="l01474"></a><span class="lineno"> 1474</span>         estWriteBuffer[icol]=A;</div>
+<div class="line"><a name="l01475"></a><span class="lineno"> 1475</span>         uncertWriteBuffer[icol]=uncertForwardBuffer[icol];</div>
+<div class="line"><a name="l01476"></a><span class="lineno"> 1476</span>       }</div>
+<div class="line"><a name="l01477"></a><span class="lineno"> 1477</span>       <span class="keywordflow">else</span>{</div>
+<div class="line"><a name="l01478"></a><span class="lineno"> 1478</span>         <span class="keywordflow">if</span>(noemer<eps_opt[0]){<span class="comment">//simple average if both uncertainties are ~>0</span></div>
+<div class="line"><a name="l01479"></a><span class="lineno"> 1479</span>           estWriteBuffer[icol]=0.5*(A+B);</div>
+<div class="line"><a name="l01480"></a><span class="lineno"> 1480</span>           uncertWriteBuffer[icol]=uncertObs;</div>
+<div class="line"><a name="l01481"></a><span class="lineno"> 1481</span>         }</div>
+<div class="line"><a name="l01482"></a><span class="lineno"> 1482</span>         <span class="keywordflow">else</span>{</div>
+<div class="line"><a name="l01483"></a><span class="lineno"> 1483</span>           estWriteBuffer[icol]=(A*D+B*C)/noemer;</div>
+<div class="line"><a name="l01484"></a><span class="lineno"> 1484</span>           <span class="keywordflow">if</span>(obsmin_opt.size()){</div>
+<div class="line"><a name="l01485"></a><span class="lineno"> 1485</span>         <span class="keywordflow">if</span>(estWriteBuffer[icol]<obsmin_opt[0])</div>
+<div class="line"><a name="l01486"></a><span class="lineno"> 1486</span>         estWriteBuffer[icol]=obsmin_opt[0];</div>
+<div class="line"><a name="l01487"></a><span class="lineno"> 1487</span>           }</div>
+<div class="line"><a name="l01488"></a><span class="lineno"> 1488</span>           <span class="keywordflow">if</span>(obsmax_opt.size()){</div>
+<div class="line"><a name="l01489"></a><span class="lineno"> 1489</span>         <span class="keywordflow">if</span>(estWriteBuffer[icol]>obsmax_opt[0])</div>
+<div class="line"><a name="l01490"></a><span class="lineno"> 1490</span>         estWriteBuffer[icol]=obsmax_opt[0];</div>
+<div class="line"><a name="l01491"></a><span class="lineno"> 1491</span>           }</div>
+<div class="line"><a name="l01492"></a><span class="lineno"> 1492</span>           <span class="keywordtype">double</span> P=0;</div>
+<div class="line"><a name="l01493"></a><span class="lineno"> 1493</span>           <span class="keywordflow">if</span>(C>eps_opt[0])</div>
+<div class="line"><a name="l01494"></a><span class="lineno"> 1494</span>         P+=1.0/C;</div>
+<div class="line"><a name="l01495"></a><span class="lineno"> 1495</span>           <span class="keywordflow">if</span>(D>eps_opt[0])</div>
+<div class="line"><a name="l01496"></a><span class="lineno"> 1496</span>         P+=1.0/D;</div>
+<div class="line"><a name="l01497"></a><span class="lineno"> 1497</span>           <span class="keywordflow">if</span>(uncertObs*uncertObs>eps_opt[0])</div>
+<div class="line"><a name="l01498"></a><span class="lineno"> 1498</span>         P-=1.0/uncertObs/uncertObs;</div>
+<div class="line"><a name="l01499"></a><span class="lineno"> 1499</span>           <span class="keywordflow">if</span>(P>eps_opt[0])</div>
+<div class="line"><a name="l01500"></a><span class="lineno"> 1500</span>         P=1.0/P;</div>
+<div class="line"><a name="l01501"></a><span class="lineno"> 1501</span>           <span class="keywordflow">else</span></div>
+<div class="line"><a name="l01502"></a><span class="lineno"> 1502</span>         P=0;</div>
+<div class="line"><a name="l01503"></a><span class="lineno"> 1503</span>           uncertWriteBuffer[icol]=P;</div>
+<div class="line"><a name="l01504"></a><span class="lineno"> 1504</span>         }</div>
 <div class="line"><a name="l01505"></a><span class="lineno"> 1505</span>       }</div>
-<div class="line"><a name="l01506"></a><span class="lineno"> 1506</span>       <a class="code" href="classImgReaderGdal.html">ImgReaderGdal</a> imgReaderForward(inputfw);</div>
-<div class="line"><a name="l01507"></a><span class="lineno"> 1507</span>       <a class="code" href="classImgReaderGdal.html">ImgReaderGdal</a> imgReaderBackward(inputbw);</div>
-<div class="line"><a name="l01508"></a><span class="lineno"> 1508</span>       imgReaderForward.setNoData(obsnodata_opt);</div>
-<div class="line"><a name="l01509"></a><span class="lineno"> 1509</span>       <span class="keywordflow">if</span>(obsoffset_opt.size())</div>
-<div class="line"><a name="l01510"></a><span class="lineno"> 1510</span>     imgReaderForward.setOffset(obsoffset_opt[0]);</div>
-<div class="line"><a name="l01511"></a><span class="lineno"> 1511</span>       <span class="keywordflow">if</span>(obsscale_opt.size())</div>
-<div class="line"><a name="l01512"></a><span class="lineno"> 1512</span>     imgReaderForward.setScale(obsscale_opt[0]);</div>
-<div class="line"><a name="l01513"></a><span class="lineno"> 1513</span>       imgReaderBackward.setNoData(obsnodata_opt);</div>
-<div class="line"><a name="l01514"></a><span class="lineno"> 1514</span>       <span class="keywordflow">if</span>(obsoffset_opt.size())</div>
-<div class="line"><a name="l01515"></a><span class="lineno"> 1515</span>     imgReaderBackward.setOffset(obsoffset_opt[0]);</div>
-<div class="line"><a name="l01516"></a><span class="lineno"> 1516</span>       <span class="keywordflow">if</span>(obsscale_opt.size())</div>
-<div class="line"><a name="l01517"></a><span class="lineno"> 1517</span>     imgReaderBackward.setScale(obsscale_opt[0]);</div>
-<div class="line"><a name="l01518"></a><span class="lineno"> 1518</span>       </div>
-<div class="line"><a name="l01519"></a><span class="lineno"> 1519</span>       vector<double> estForwardBuffer;</div>
-<div class="line"><a name="l01520"></a><span class="lineno"> 1520</span>       vector<double> estBackwardBuffer;</div>
-<div class="line"><a name="l01521"></a><span class="lineno"> 1521</span>       vector<double> uncertObsLineBuffer;</div>
-<div class="line"><a name="l01522"></a><span class="lineno"> 1522</span>       vector<double> uncertForwardBuffer;</div>
-<div class="line"><a name="l01523"></a><span class="lineno"> 1523</span>       vector<double> uncertBackwardBuffer;</div>
-<div class="line"><a name="l01524"></a><span class="lineno"> 1524</span>       vector<double> uncertReadBuffer;</div>
-<div class="line"><a name="l01525"></a><span class="lineno"> 1525</span>       vector<double> estWriteBuffer(ncol);</div>
-<div class="line"><a name="l01526"></a><span class="lineno"> 1526</span>       vector<double> uncertWriteBuffer(ncol);</div>
-<div class="line"><a name="l01527"></a><span class="lineno"> 1527</span>       <span class="comment">// vector<double> lineMask;</span></div>
-<div class="line"><a name="l01528"></a><span class="lineno"> 1528</span> </div>
-<div class="line"><a name="l01529"></a><span class="lineno"> 1529</span>       <span class="keywordtype">bool</span> update=<span class="keyword">false</span>;</div>
-<div class="line"><a name="l01530"></a><span class="lineno"> 1530</span>       <span class="keywordflow">if</span>(obsindex<relobsindex.size()){</div>
-<div class="line"><a name="l01531"></a><span class="lineno"> 1531</span>     update=(relobsindex[obsindex]==modindex);</div>
-<div class="line"><a name="l01532"></a><span class="lineno"> 1532</span>       }</div>
-<div class="line"><a name="l01533"></a><span class="lineno"> 1533</span> </div>
-<div class="line"><a name="l01534"></a><span class="lineno"> 1534</span>       <span class="keywordflow">if</span>(update){</div>
-<div class="line"><a name="l01535"></a><span class="lineno"> 1535</span>     <span class="keywordflow">if</span>(verbose_opt[0])</div>
-<div class="line"><a name="l01536"></a><span class="lineno"> 1536</span>       cout << <span class="stringliteral">"***update "</span> << relobsindex[obsindex] << <span class="stringliteral">" = "</span> << modindex << <span class="stringliteral">" "</span> << observation_opt[obsindex] << <span class="stringliteral">" ***"</span> << endl;</div>
-<div class="line"><a name="l01537"></a><span class="lineno"> 1537</span>     imgReaderObs.open(observation_opt[obsindex]);</div>
-<div class="line"><a name="l01538"></a><span class="lineno"> 1538</span>     imgReaderObs.getGeoTransform(geotransform);</div>
-<div class="line"><a name="l01539"></a><span class="lineno"> 1539</span>     imgReaderObs.setNoData(obsnodata_opt);</div>
-<div class="line"><a name="l01540"></a><span class="lineno"> 1540</span>     <span class="keywordflow">if</span>(obsoffset_opt.size())</div>
-<div class="line"><a name="l01541"></a><span class="lineno"> 1541</span>       imgReaderObs.setOffset(obsoffset_opt[0]);</div>
-<div class="line"><a name="l01542"></a><span class="lineno"> 1542</span>     <span class="keywordflow">if</span>(obsscale_opt.size())</div>
-<div class="line"><a name="l01543"></a><span class="lineno"> 1543</span>       imgReaderObs.setScale(obsscale_opt[0]);</div>
-<div class="line"><a name="l01544"></a><span class="lineno"> 1544</span>     <span class="comment">//calculate regression between model and observation</span></div>
-<div class="line"><a name="l01545"></a><span class="lineno"> 1545</span>       }</div>
-<div class="line"><a name="l01546"></a><span class="lineno"> 1546</span> </div>
-<div class="line"><a name="l01547"></a><span class="lineno"> 1547</span>       pfnProgress(progress,pszMessage,pProgressArg);</div>
-<div class="line"><a name="l01548"></a><span class="lineno"> 1548</span> </div>
-<div class="line"><a name="l01549"></a><span class="lineno"> 1549</span>       <span class="keywordflow">for</span>(<span class="keywordtype">int</span> irow=0;irow<imgWriterEst.nrOfRow();++irow){</div>
-<div class="line"><a name="l01550"></a><span class="lineno"> 1550</span>     assert(irow<imgReaderForward.nrOfRow());</div>
-<div class="line"><a name="l01551"></a><span class="lineno"> 1551</span>     assert(irow<imgReaderBackward.nrOfRow());</div>
-<div class="line"><a name="l01552"></a><span class="lineno"> 1552</span>     imgReaderForward.readData(estForwardBuffer,GDT_Float64,irow,0);</div>
-<div class="line"><a name="l01553"></a><span class="lineno"> 1553</span>     imgReaderBackward.readData(estBackwardBuffer,GDT_Float64,irow,0);</div>
-<div class="line"><a name="l01554"></a><span class="lineno"> 1554</span>     imgReaderForward.readData(uncertForwardBuffer,GDT_Float64,irow,1);</div>
-<div class="line"><a name="l01555"></a><span class="lineno"> 1555</span>     imgReaderBackward.readData(uncertBackwardBuffer,GDT_Float64,irow,1);</div>
-<div class="line"><a name="l01556"></a><span class="lineno"> 1556</span> </div>
-<div class="line"><a name="l01557"></a><span class="lineno"> 1557</span>     <span class="keywordflow">if</span>(update){</div>
-<div class="line"><a name="l01558"></a><span class="lineno"> 1558</span>       imgReaderObs.readData(estWriteBuffer,GDT_Float64,irow,0);</div>
-<div class="line"><a name="l01559"></a><span class="lineno"> 1559</span>       <span class="keywordflow">if</span>(imgReaderObs.nrOfBand()>1)</div>
-<div class="line"><a name="l01560"></a><span class="lineno"> 1560</span>         imgReaderObs.readData(uncertObsLineBuffer,GDT_Float64,irow,1);</div>
-<div class="line"><a name="l01561"></a><span class="lineno"> 1561</span>     }</div>
-<div class="line"><a name="l01562"></a><span class="lineno"> 1562</span> </div>
-<div class="line"><a name="l01563"></a><span class="lineno"> 1563</span>     <span class="comment">// double oldRowMask=-1;//keep track of row mask to optimize number of line readings</span></div>
-<div class="line"><a name="l01564"></a><span class="lineno"> 1564</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> icol=0;icol<imgWriterEst.nrOfCol();++icol){</div>
-<div class="line"><a name="l01565"></a><span class="lineno"> 1565</span>       imgWriterEst.image2geo(icol,irow,geox,geoy);</div>
-<div class="line"><a name="l01566"></a><span class="lineno"> 1566</span>       <span class="keywordtype">double</span> A=estForwardBuffer[icol];</div>
-<div class="line"><a name="l01567"></a><span class="lineno"> 1567</span>       <span class="keywordtype">double</span> B=estBackwardBuffer[icol];</div>
-<div class="line"><a name="l01568"></a><span class="lineno"> 1568</span>       <span class="keywordtype">double</span> C=uncertForwardBuffer[icol]*uncertForwardBuffer[icol];</div>
-<div class="line"><a name="l01569"></a><span class="lineno"> 1569</span>       <span class="keywordtype">double</span> D=uncertBackwardBuffer[icol]*uncertBackwardBuffer[icol];</div>
-<div class="line"><a name="l01570"></a><span class="lineno"> 1570</span>       <span class="keywordtype">double</span> uncertObs=uncertObs_opt[0];</div>
-<div class="line"><a name="l01571"></a><span class="lineno"> 1571</span> </div>
-<div class="line"><a name="l01572"></a><span class="lineno"> 1572</span>       <span class="comment">// if(update){//check for nodata in observation</span></div>
-<div class="line"><a name="l01573"></a><span class="lineno"> 1573</span>       <span class="comment">//   if(imgReaderObs.isNoData(estWriteBuffer[icol]))</span></div>
-<div class="line"><a name="l01574"></a><span class="lineno"> 1574</span>       <span class="comment">//     uncertObs=uncertNodata_opt[0];</span></div>
-<div class="line"><a name="l01575"></a><span class="lineno"> 1575</span>       <span class="comment">//   else if(uncertObsLineBuffer.size()>icol)</span></div>
-<div class="line"><a name="l01576"></a><span class="lineno"> 1576</span>       <span class="comment">//     uncertObs=uncertObsLineBuffer[icol];</span></div>
-<div class="line"><a name="l01577"></a><span class="lineno"> 1577</span>       <span class="comment">// }</span></div>
-<div class="line"><a name="l01578"></a><span class="lineno"> 1578</span> </div>
-<div class="line"><a name="l01579"></a><span class="lineno"> 1579</span>       <span class="keywordtype">double</span> noemer=(C+D);</div>
-<div class="line"><a name="l01580"></a><span class="lineno"> 1580</span>       <span class="comment">//todo: consistently check for division by zero...</span></div>
-<div class="line"><a name="l01581"></a><span class="lineno"> 1581</span>       <span class="keywordflow">if</span>(imgReaderForward.isNoData(A)&&imgReaderBackward.isNoData(B)){</div>
-<div class="line"><a name="l01582"></a><span class="lineno"> 1582</span>         estWriteBuffer[icol]=obsnodata_opt[0];</div>
-<div class="line"><a name="l01583"></a><span class="lineno"> 1583</span>         uncertWriteBuffer[icol]=uncertNodata_opt[0];</div>
-<div class="line"><a name="l01584"></a><span class="lineno"> 1584</span>       }</div>
-<div class="line"><a name="l01585"></a><span class="lineno"> 1585</span>       <span class="keywordflow">else</span> <span class="keywordflow">if</span>(imgReaderForward.isNoData(A)){</div>
-<div class="line"><a name="l01586"></a><span class="lineno"> 1586</span>         estWriteBuffer[icol]=B;</div>
-<div class="line"><a name="l01587"></a><span class="lineno"> 1587</span>         uncertWriteBuffer[icol]=uncertBackwardBuffer[icol];</div>
-<div class="line"><a name="l01588"></a><span class="lineno"> 1588</span>       }</div>
-<div class="line"><a name="l01589"></a><span class="lineno"> 1589</span>       <span class="keywordflow">else</span> <span class="keywordflow">if</span>(imgReaderForward.isNoData(B)){</div>
-<div class="line"><a name="l01590"></a><span class="lineno"> 1590</span>         estWriteBuffer[icol]=A;</div>
-<div class="line"><a name="l01591"></a><span class="lineno"> 1591</span>         uncertWriteBuffer[icol]=uncertForwardBuffer[icol];</div>
-<div class="line"><a name="l01592"></a><span class="lineno"> 1592</span>       }</div>
-<div class="line"><a name="l01593"></a><span class="lineno"> 1593</span>       <span class="keywordflow">else</span>{</div>
-<div class="line"><a name="l01594"></a><span class="lineno"> 1594</span>         <span class="keywordflow">if</span>(noemer<eps_opt[0]){<span class="comment">//simple average if both uncertainties are ~>0</span></div>
-<div class="line"><a name="l01595"></a><span class="lineno"> 1595</span>           estWriteBuffer[icol]=0.5*(A+B);</div>
-<div class="line"><a name="l01596"></a><span class="lineno"> 1596</span>           uncertWriteBuffer[icol]=uncertObs;</div>
-<div class="line"><a name="l01597"></a><span class="lineno"> 1597</span>         }</div>
-<div class="line"><a name="l01598"></a><span class="lineno"> 1598</span>         <span class="keywordflow">else</span>{</div>
-<div class="line"><a name="l01599"></a><span class="lineno"> 1599</span>           estWriteBuffer[icol]=(A*D+B*C)/noemer;</div>
-<div class="line"><a name="l01600"></a><span class="lineno"> 1600</span>           <span class="keywordtype">double</span> P=0;</div>
-<div class="line"><a name="l01601"></a><span class="lineno"> 1601</span>           <span class="keywordflow">if</span>(C>eps_opt[0])</div>
-<div class="line"><a name="l01602"></a><span class="lineno"> 1602</span>         P+=1.0/C;</div>
-<div class="line"><a name="l01603"></a><span class="lineno"> 1603</span>           <span class="keywordflow">if</span>(D>eps_opt[0])</div>
-<div class="line"><a name="l01604"></a><span class="lineno"> 1604</span>         P+=1.0/D;</div>
-<div class="line"><a name="l01605"></a><span class="lineno"> 1605</span>           <span class="keywordflow">if</span>(uncertObs*uncertObs>eps_opt[0])</div>
-<div class="line"><a name="l01606"></a><span class="lineno"> 1606</span>         P-=1.0/uncertObs/uncertObs;</div>
-<div class="line"><a name="l01607"></a><span class="lineno"> 1607</span>           <span class="keywordflow">if</span>(P>eps_opt[0])</div>
-<div class="line"><a name="l01608"></a><span class="lineno"> 1608</span>         P=sqrt(1.0/P);</div>
-<div class="line"><a name="l01609"></a><span class="lineno"> 1609</span>           <span class="keywordflow">else</span></div>
-<div class="line"><a name="l01610"></a><span class="lineno"> 1610</span>         P=0;</div>
-<div class="line"><a name="l01611"></a><span class="lineno"> 1611</span>           uncertWriteBuffer[icol]=P;</div>
-<div class="line"><a name="l01612"></a><span class="lineno"> 1612</span>         }</div>
-<div class="line"><a name="l01613"></a><span class="lineno"> 1613</span>       }</div>
-<div class="line"><a name="l01614"></a><span class="lineno"> 1614</span>     }</div>
-<div class="line"><a name="l01615"></a><span class="lineno"> 1615</span>     imgWriterEst.writeData(estWriteBuffer,GDT_Float64,irow,0);</div>
-<div class="line"><a name="l01616"></a><span class="lineno"> 1616</span>     imgWriterEst.writeData(uncertWriteBuffer,GDT_Float64,irow,1);</div>
-<div class="line"><a name="l01617"></a><span class="lineno"> 1617</span>     progress=<span class="keyword">static_cast<</span><span class="keywordtype">float</span><span class="keyword">></span>((irow+1.0)/imgWriterEst.nrOfRow());</div>
-<div class="line"><a name="l01618"></a><span class="lineno"> 1618</span>     pfnProgress(progress,pszMessage,pProgressArg);</div>
-<div class="line"><a name="l01619"></a><span class="lineno"> 1619</span>       }</div>
-<div class="line"><a name="l01620"></a><span class="lineno"> 1620</span> </div>
-<div class="line"><a name="l01621"></a><span class="lineno"> 1621</span>       imgWriterEst.close();</div>
-<div class="line"><a name="l01622"></a><span class="lineno"> 1622</span>       imgReaderForward.close();</div>
-<div class="line"><a name="l01623"></a><span class="lineno"> 1623</span>       imgReaderBackward.close();</div>
-<div class="line"><a name="l01624"></a><span class="lineno"> 1624</span>       <span class="keywordflow">if</span>(update){</div>
-<div class="line"><a name="l01625"></a><span class="lineno"> 1625</span>     imgReaderObs.close();</div>
-<div class="line"><a name="l01626"></a><span class="lineno"> 1626</span>     ++obsindex;</div>
-<div class="line"><a name="l01627"></a><span class="lineno"> 1627</span>       }</div>
-<div class="line"><a name="l01628"></a><span class="lineno"> 1628</span>     }</div>
-<div class="line"><a name="l01629"></a><span class="lineno"> 1629</span>   }</div>
-<div class="line"><a name="l01630"></a><span class="lineno"> 1630</span>   <span class="comment">// if(mask_opt.size())</span></div>
-<div class="line"><a name="l01631"></a><span class="lineno"> 1631</span>   <span class="comment">//   maskReader.close();</span></div>
-<div class="line"><a name="l01632"></a><span class="lineno"> 1632</span> }</div>
-<div class="line"><a name="l01633"></a><span class="lineno"> 1633</span> </div>
-<div class="ttc" id="classimgregression_1_1ImgRegression_html"><div class="ttname"><a href="classimgregression_1_1ImgRegression.html">imgregression::ImgRegression</a></div><div class="ttdef"><b>Definition:</b> <a href="ImgRegression_8h_source.html#l00030">ImgRegression.h:30</a></div></div>
+<div class="line"><a name="l01506"></a><span class="lineno"> 1506</span>     }</div>
+<div class="line"><a name="l01507"></a><span class="lineno"> 1507</span>     imgWriterEst.writeData(estWriteBuffer,GDT_Float64,irow,0);</div>
+<div class="line"><a name="l01508"></a><span class="lineno"> 1508</span>     imgWriterEst.writeData(uncertWriteBuffer,GDT_Float64,irow,1);</div>
+<div class="line"><a name="l01509"></a><span class="lineno"> 1509</span>     progress=<span class="keyword">static_cast<</span><span class="keywordtype">float</span><span class="keyword">></span>((irow+1.0)/imgWriterEst.nrOfRow());</div>
+<div class="line"><a name="l01510"></a><span class="lineno"> 1510</span>     pfnProgress(progress,pszMessage,pProgressArg);</div>
+<div class="line"><a name="l01511"></a><span class="lineno"> 1511</span>       }</div>
+<div class="line"><a name="l01512"></a><span class="lineno"> 1512</span> </div>
+<div class="line"><a name="l01513"></a><span class="lineno"> 1513</span>       imgWriterEst.close();</div>
+<div class="line"><a name="l01514"></a><span class="lineno"> 1514</span>       imgReaderForward.close();</div>
+<div class="line"><a name="l01515"></a><span class="lineno"> 1515</span>       imgReaderBackward.close();</div>
+<div class="line"><a name="l01516"></a><span class="lineno"> 1516</span>       <span class="keywordflow">if</span>(update){</div>
+<div class="line"><a name="l01517"></a><span class="lineno"> 1517</span>     imgReaderObs.close();</div>
+<div class="line"><a name="l01518"></a><span class="lineno"> 1518</span>     ++obsindex;</div>
+<div class="line"><a name="l01519"></a><span class="lineno"> 1519</span>       }</div>
+<div class="line"><a name="l01520"></a><span class="lineno"> 1520</span>     }</div>
+<div class="line"><a name="l01521"></a><span class="lineno"> 1521</span>   }</div>
+<div class="line"><a name="l01522"></a><span class="lineno"> 1522</span>   <span class="comment">// if(mask_opt.size())</span></div>
+<div class="line"><a name="l01523"></a><span class="lineno"> 1523</span>   <span class="comment">//   maskReader.close();</span></div>
+<div class="line"><a name="l01524"></a><span class="lineno"> 1524</span> }</div>
+<div class="line"><a name="l01525"></a><span class="lineno"> 1525</span> </div>
 <div class="ttc" id="classImgReaderGdal_html"><div class="ttname"><a href="classImgReaderGdal.html">ImgReaderGdal</a></div><div class="ttdef"><b>Definition:</b> <a href="ImgReaderGdal_8h_source.html#l00033">ImgReaderGdal.h:33</a></div></div>
 <div class="ttc" id="classImgWriterGdal_html"><div class="ttname"><a href="classImgWriterGdal.html">ImgWriterGdal</a></div><div class="ttdef"><b>Definition:</b> <a href="ImgWriterGdal_8h_source.html#l00032">ImgWriterGdal.h:32</a></div></div>
 <div class="ttc" id="classstatfactory_1_1StatFactory_html"><div class="ttname"><a href="classstatfactory_1_1StatFactory.html">statfactory::StatFactory</a></div><div class="ttdef"><b>Definition:</b> <a href="StatFactory_8h_source.html#l00043">StatFactory.h:43</a></div></div>
@@ -1646,7 +1544,7 @@
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Jun 23 2015 17:09:36 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Tue Nov 3 2015 15:58:26 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/pklas2img.html b/doc/html/pklas2img.html
index 071dd69..00d9eb4 100644
--- a/doc/html/pklas2img.html
+++ b/doc/html/pklas2img.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.3</span>
+    <span id="projectnumber">2.6.4</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -53,7 +53,7 @@
 <p><code></code></p>
 <h1><a class="anchor" id="pklas2img_description"></a>
 Description</h1>
-<p>The utility pklas2img converts a las/laz point cloud into a gridded raster dataset. The implementation is based on <a href="www.liblas.org">liblas</a> API. You can define the bounding box, grid cell size and spatial reference set. The composite rule for multiple returns within a single grid cell can be set with the option -comp. The default attribute is z (heiht), but can also be intensity (if available), the return number (-n return) or the total number of returns in that grid cell ( [...]
+<p>The utility pklas2img converts a las/laz point cloud into a gridded raster dataset. The implementation is based on <a href="www.liblas.org">liblas</a> API. You can define the bounding box, grid cell size and spatial reference set. The composite rule for multiple returns within a single grid cell can be set with the option -comp. The default attribute is z (heiht), but can also be intensity (if available), scan angle rank (-n angle), the return number (-n return) or the total number of [...]
 <h1><a class="anchor" id="pklas2img_options"></a>
 Options</h1>
 <ul>
@@ -64,7 +64,7 @@ Options</h1>
 <tr>
 <td>i </td><td>input </td><td>std::string </td><td></td><td>Input las file </td></tr>
 <tr>
-<td>n </td><td>name </td><td>std::string </td><td>z </td><td>names of the attribute to select: intensity, return, nreturn, z </td></tr>
+<td>n </td><td>name </td><td>std::string </td><td>z </td><td>names of the attribute to select: intensity, angle, return, nreturn, z </td></tr>
 <tr>
 <td>ret </td><td>ret </td><td>unsigned short </td><td></td><td>number(s) of returns to include </td></tr>
 <tr>
@@ -74,6 +74,10 @@ Options</h1>
 <tr>
 <td>fir </td><td>filter </td><td>std::string </td><td>all </td><td>filter las points (first,last,single,multiple,all). </td></tr>
 <tr>
+<td>angle_min </td><td>angle_min </td><td>unsigned short </td><td></td><td>minimum scan angle to read points. </td></tr>
+<tr>
+<td>angle_max </td><td>angle_max </td><td>unsigned short </td><td></td><td>maximum scan angle to read points. </td></tr>
+<tr>
 <td>o </td><td>output </td><td>std::string </td><td></td><td>Output image file </td></tr>
 <tr>
 <td>a_srs </td><td>a_srs </td><td>std::string </td><td></td><td>assign the projection for the output file in epsg code, e.g., epsg:3035 for European LAEA projection </td></tr>
@@ -110,7 +114,7 @@ pklas2img -i lasfile -o output </li>
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Jun 23 2015 17:09:37 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/pklas2img_8cc_source.html b/doc/html/pklas2img_8cc_source.html
index 4f67773..69d8ce0 100644
--- a/doc/html/pklas2img_8cc_source.html
+++ b/doc/html/pklas2img_8cc_source.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.3</span>
+    <span id="projectnumber">2.6.4</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -81,528 +81,551 @@
 <div class="line"><a name="l00027"></a><span class="lineno">   27</span> <span class="preprocessor">#include "algorithms/Filter2d.h"</span></div>
 <div class="line"><a name="l00028"></a><span class="lineno">   28</span> </div>
 <div class="line"><a name="l00029"></a><span class="lineno">   29</span> <span class="comment">/******************************************************************************/</span></div>
-<div class="line"><a name="l00081"></a><span class="lineno">   81</span> <span class="keyword">using namespace </span>std;</div>
-<div class="line"><a name="l00082"></a><span class="lineno">   82</span> </div>
-<div class="line"><a name="l00083"></a><span class="lineno">   83</span> <span class="keywordtype">int</span> main(<span class="keywordtype">int</span> argc,<span class="keywordtype">char</span> **argv) {</div>
-<div class="line"><a name="l00084"></a><span class="lineno">   84</span>   <a class="code" href="classOptionpk.html">Optionpk<string></a> input_opt(<span class="stringliteral">"i"</span>, <span class="stringliteral">"input"</span>, <span class="stringliteral">"Input las file"</span>);</div>
-<div class="line"><a name="l00085"></a><span class="lineno">   85</span>   <a class="code" href="classOptionpk.html">Optionpk<string></a> attribute_opt(<span class="stringliteral">"n"</span>, <span class="stringliteral">"name"</span>, <span class="stringliteral">"names of the point attribute to select: intensity, return, nreturn, z"</span>, <span class="stringliteral">"z"</span>);</div>
-<div class="line"><a name="l00086"></a><span class="lineno">   86</span>   <span class="comment">// Optionpk<bool> disc_opt("circ", "circular", "circular disc kernel for dilation and erosion", false);</span></div>
-<div class="line"><a name="l00087"></a><span class="lineno">   87</span>   <span class="comment">// Optionpk<double> maxSlope_opt("s", "maxSlope", "Maximum slope used for morphological filtering", 0.0);</span></div>
-<div class="line"><a name="l00088"></a><span class="lineno">   88</span>   <span class="comment">// Optionpk<double> hThreshold_opt("ht", "maxHeight", "initial and maximum height threshold for progressive morphological filtering (e.g., -ht 0.2 -ht 2.5)", 0.2);</span></div>
-<div class="line"><a name="l00089"></a><span class="lineno">   89</span>   <span class="comment">// Optionpk<short> maxIter_opt("maxit", "maxit", "Maximum number of iterations in post filter", 5);</span></div>
-<div class="line"><a name="l00090"></a><span class="lineno">   90</span>   <a class="code" href="classOptionpk.html">Optionpk<unsigned short></a> returns_opt(<span class="stringliteral">"ret"</span>, <span class="stringliteral">"ret"</span>, <span class="stringliteral">"number(s) of returns to include"</span>);</div>
-<div class="line"><a name="l00091"></a><span class="lineno">   91</span>   <a class="code" href="classOptionpk.html">Optionpk<unsigned short></a> classes_opt(<span class="stringliteral">"class"</span>, <span class="stringliteral">"class"</span>, <span class="stringliteral">"classes to keep: 0 (created, never classified), 1 (unclassified), 2 (ground), 3 (low vegetation), 4 (medium vegetation), 5 (high vegetation), 6 (building), 7 (low point, noise), 8 ( [...]
-<div class="line"><a name="l00092"></a><span class="lineno">   92</span>   <a class="code" href="classOptionpk.html">Optionpk<string></a> composite_opt(<span class="stringliteral">"comp"</span>, <span class="stringliteral">"comp"</span>, <span class="stringliteral">"composite for multiple points in cell (min, max, median, mean, sum, first, last, profile (percentile height values), percentile, number (point density)). Last: overwrite cells with latest p [...]
-<div class="line"><a name="l00093"></a><span class="lineno">   93</span>   <a class="code" href="classOptionpk.html">Optionpk<string></a> filter_opt(<span class="stringliteral">"fir"</span>, <span class="stringliteral">"filter"</span>, <span class="stringliteral">"filter las points (first,last,single,multiple,all)."</span>, <span class="stringliteral">"all"</span>);</div>
-<div class="line"><a name="l00094"></a><span class="lineno">   94</span>   <span class="comment">// Optionpk<string> postFilter_opt("pf", "pfilter", "post processing filter (etew_min,promorph (progressive morphological filter),bunting (adapted promorph),open,close,none).", "none");</span></div>
-<div class="line"><a name="l00095"></a><span class="lineno">   95</span>   <span class="comment">// Optionpk<short> dimx_opt("dimx", "dimx", "Dimension X of postFilter", 3);</span></div>
-<div class="line"><a name="l00096"></a><span class="lineno">   96</span>   <span class="comment">// Optionpk<short> dimy_opt("dimy", "dimy", "Dimension Y of postFilter", 3);</span></div>
-<div class="line"><a name="l00097"></a><span class="lineno">   97</span>   <a class="code" href="classOptionpk.html">Optionpk<string></a> output_opt(<span class="stringliteral">"o"</span>, <span class="stringliteral">"output"</span>, <span class="stringliteral">"Output image file"</span>);</div>
-<div class="line"><a name="l00098"></a><span class="lineno">   98</span>   <a class="code" href="classOptionpk.html">Optionpk<string></a> projection_opt(<span class="stringliteral">"a_srs"</span>, <span class="stringliteral">"a_srs"</span>, <span class="stringliteral">"assign the projection for the output file in epsg code, e.g., epsg:3035 for European LAEA projection"</span>);</div>
-<div class="line"><a name="l00099"></a><span class="lineno">   99</span>   <a class="code" href="classOptionpk.html">Optionpk<double></a> ulx_opt(<span class="stringliteral">"ulx"</span>, <span class="stringliteral">"ulx"</span>, <span class="stringliteral">"Upper left x value bounding box (in geocoordinates if georef is true). 0 is read from input file"</span>, 0.0);</div>
-<div class="line"><a name="l00100"></a><span class="lineno">  100</span>   <a class="code" href="classOptionpk.html">Optionpk<double></a> uly_opt(<span class="stringliteral">"uly"</span>, <span class="stringliteral">"uly"</span>, <span class="stringliteral">"Upper left y value bounding box (in geocoordinates if georef is true). 0 is read from input file"</span>, 0.0);</div>
-<div class="line"><a name="l00101"></a><span class="lineno">  101</span>   <a class="code" href="classOptionpk.html">Optionpk<double></a> lrx_opt(<span class="stringliteral">"lrx"</span>, <span class="stringliteral">"lrx"</span>, <span class="stringliteral">"Lower right x value bounding box (in geocoordinates if georef is true). 0 is read from input file"</span>, 0.0);</div>
-<div class="line"><a name="l00102"></a><span class="lineno">  102</span>   <a class="code" href="classOptionpk.html">Optionpk<double></a> lry_opt(<span class="stringliteral">"lry"</span>, <span class="stringliteral">"lry"</span>, <span class="stringliteral">"Lower right y value bounding box (in geocoordinates if georef is true). 0 is read from input file"</span>, 0.0);</div>
-<div class="line"><a name="l00103"></a><span class="lineno">  103</span>   <a class="code" href="classOptionpk.html">Optionpk<string></a> otype_opt(<span class="stringliteral">"ot"</span>, <span class="stringliteral">"otype"</span>, <span class="stringliteral">"Data type for output image ({Byte/Int16/UInt16/UInt32/Int32/Float32/Float64/CInt16/CInt32/CFloat32/CFloat64}). Empty string: inherit type from input image"</span>, <span class="stringlitera [...]
-<div class="line"><a name="l00104"></a><span class="lineno">  104</span>   <a class="code" href="classOptionpk.html">Optionpk<string></a> oformat_opt(<span class="stringliteral">"of"</span>, <span class="stringliteral">"oformat"</span>, <span class="stringliteral">"Output image format (see also gdal_translate). Empty string: inherit from input image"</span>, <span class="stringliteral">"GTiff"</span>);</div>
-<div class="line"><a name="l00105"></a><span class="lineno">  105</span>   <a class="code" href="classOptionpk.html">Optionpk<double></a> dx_opt(<span class="stringliteral">"dx"</span>, <span class="stringliteral">"dx"</span>, <span class="stringliteral">"Output resolution in x (in meter)"</span>, 1.0);</div>
-<div class="line"><a name="l00106"></a><span class="lineno">  106</span>   <a class="code" href="classOptionpk.html">Optionpk<double></a> dy_opt(<span class="stringliteral">"dy"</span>, <span class="stringliteral">"dy"</span>, <span class="stringliteral">"Output resolution in y (in meter)"</span>, 1.0);</div>
-<div class="line"><a name="l00107"></a><span class="lineno">  107</span>   <a class="code" href="classOptionpk.html">Optionpk<short></a> nbin_opt(<span class="stringliteral">"nbin"</span>, <span class="stringliteral">"nbin"</span>, <span class="stringliteral">"Number of percentile bins for calculating percentile height value profile (=number of output bands)"</span>, 10.0);</div>
-<div class="line"><a name="l00108"></a><span class="lineno">  108</span>   <a class="code" href="classOptionpk.html">Optionpk<double></a> percentile_opt(<span class="stringliteral">"perc"</span>,<span class="stringliteral">"perc"</span>,<span class="stringliteral">"Percentile value used for rule percentile"</span>,95);</div>
-<div class="line"><a name="l00109"></a><span class="lineno">  109</span>   <a class="code" href="classOptionpk.html">Optionpk<short></a> nodata_opt(<span class="stringliteral">"nodata"</span>, <span class="stringliteral">"nodata"</span>, <span class="stringliteral">"nodata value to put in image"</span>, 0);</div>
-<div class="line"><a name="l00110"></a><span class="lineno">  110</span>   <a class="code" href="classOptionpk.html">Optionpk<string></a> option_opt(<span class="stringliteral">"co"</span>, <span class="stringliteral">"co"</span>, <span class="stringliteral">"Creation option for output file. Multiple options can be specified."</span>);</div>
-<div class="line"><a name="l00111"></a><span class="lineno">  111</span>   <a class="code" href="classOptionpk.html">Optionpk<string></a> colorTable_opt(<span class="stringliteral">"ct"</span>, <span class="stringliteral">"ct"</span>, <span class="stringliteral">"color table (file with 5 columns: id R G B ALFA (0: transparent, 255: solid)"</span>);</div>
-<div class="line"><a name="l00112"></a><span class="lineno">  112</span>   <a class="code" href="classOptionpk.html">Optionpk<short></a> verbose_opt(<span class="stringliteral">"v"</span>, <span class="stringliteral">"verbose"</span>, <span class="stringliteral">"verbose mode"</span>, 0,2);</div>
-<div class="line"><a name="l00113"></a><span class="lineno">  113</span> </div>
-<div class="line"><a name="l00114"></a><span class="lineno">  114</span>   nbin_opt.setHide(1);</div>
-<div class="line"><a name="l00115"></a><span class="lineno">  115</span>   percentile_opt.setHide(1);</div>
-<div class="line"><a name="l00116"></a><span class="lineno">  116</span>   nodata_opt.setHide(1);</div>
-<div class="line"><a name="l00117"></a><span class="lineno">  117</span>   option_opt.setHide(1);</div>
-<div class="line"><a name="l00118"></a><span class="lineno">  118</span>   colorTable_opt.setHide(1);</div>
-<div class="line"><a name="l00119"></a><span class="lineno">  119</span> </div>
-<div class="line"><a name="l00120"></a><span class="lineno">  120</span>   <span class="keywordtype">bool</span> doProcess;<span class="comment">//stop process when program was invoked with help option (-h --help)</span></div>
-<div class="line"><a name="l00121"></a><span class="lineno">  121</span>   <span class="keywordflow">try</span>{</div>
-<div class="line"><a name="l00122"></a><span class="lineno">  122</span>     doProcess=input_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00123"></a><span class="lineno">  123</span>     attribute_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00124"></a><span class="lineno">  124</span>     returns_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00125"></a><span class="lineno">  125</span>     classes_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00126"></a><span class="lineno">  126</span>     composite_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00127"></a><span class="lineno">  127</span>     filter_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00128"></a><span class="lineno">  128</span>     output_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00129"></a><span class="lineno">  129</span>     projection_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00130"></a><span class="lineno">  130</span>     ulx_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00131"></a><span class="lineno">  131</span>     uly_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00132"></a><span class="lineno">  132</span>     lrx_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00133"></a><span class="lineno">  133</span>     lry_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00134"></a><span class="lineno">  134</span>     otype_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00135"></a><span class="lineno">  135</span>     oformat_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00136"></a><span class="lineno">  136</span>     dx_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00137"></a><span class="lineno">  137</span>     dy_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00138"></a><span class="lineno">  138</span>     nbin_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00139"></a><span class="lineno">  139</span>     percentile_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00140"></a><span class="lineno">  140</span>     nodata_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00141"></a><span class="lineno">  141</span>     option_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00142"></a><span class="lineno">  142</span>     colorTable_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00143"></a><span class="lineno">  143</span>     verbose_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00144"></a><span class="lineno">  144</span>   }</div>
-<div class="line"><a name="l00145"></a><span class="lineno">  145</span>   <span class="keywordflow">catch</span>(<span class="keywordtype">string</span> predefinedString){</div>
-<div class="line"><a name="l00146"></a><span class="lineno">  146</span>     std::cout << predefinedString << std::endl;</div>
-<div class="line"><a name="l00147"></a><span class="lineno">  147</span>     exit(0);</div>
-<div class="line"><a name="l00148"></a><span class="lineno">  148</span>   }</div>
-<div class="line"><a name="l00149"></a><span class="lineno">  149</span> </div>
-<div class="line"><a name="l00150"></a><span class="lineno">  150</span>   <span class="keywordflow">if</span>(!doProcess){</div>
-<div class="line"><a name="l00151"></a><span class="lineno">  151</span>     cout << endl;</div>
-<div class="line"><a name="l00152"></a><span class="lineno">  152</span>     cout << <span class="stringliteral">"pklas2img -i lasfile -o output"</span> << endl;</div>
-<div class="line"><a name="l00153"></a><span class="lineno">  153</span>     cout << endl;</div>
-<div class="line"><a name="l00154"></a><span class="lineno">  154</span>     std::cout << <span class="stringliteral">"short option -h shows basic options only, use long option --help to show all options"</span> << std::endl;</div>
-<div class="line"><a name="l00155"></a><span class="lineno">  155</span>     exit(0);<span class="comment">//help was invoked, stop processing</span></div>
-<div class="line"><a name="l00156"></a><span class="lineno">  156</span>   }</div>
-<div class="line"><a name="l00157"></a><span class="lineno">  157</span>   <span class="comment">//todo: is this needed?</span></div>
-<div class="line"><a name="l00158"></a><span class="lineno">  158</span>   GDALAllRegister();</div>
-<div class="line"><a name="l00159"></a><span class="lineno">  159</span> </div>
-<div class="line"><a name="l00160"></a><span class="lineno">  160</span>   <span class="keywordtype">double</span> dfComplete=0.0;</div>
-<div class="line"><a name="l00161"></a><span class="lineno">  161</span>   <span class="keyword">const</span> <span class="keywordtype">char</span>* pszMessage;</div>
-<div class="line"><a name="l00162"></a><span class="lineno">  162</span>   <span class="keywordtype">void</span>* pProgressArg=NULL;</div>
-<div class="line"><a name="l00163"></a><span class="lineno">  163</span>   GDALProgressFunc pfnProgress=GDALTermProgress;</div>
-<div class="line"><a name="l00164"></a><span class="lineno">  164</span>   <span class="keywordtype">double</span> progress=0;</div>
+<div class="line"><a name="l00083"></a><span class="lineno">   83</span> <span class="keyword">using namespace </span>std;</div>
+<div class="line"><a name="l00084"></a><span class="lineno">   84</span> </div>
+<div class="line"><a name="l00085"></a><span class="lineno">   85</span> <span class="keywordtype">int</span> main(<span class="keywordtype">int</span> argc,<span class="keywordtype">char</span> **argv) {</div>
+<div class="line"><a name="l00086"></a><span class="lineno">   86</span>   <a class="code" href="classOptionpk.html">Optionpk<string></a> input_opt(<span class="stringliteral">"i"</span>, <span class="stringliteral">"input"</span>, <span class="stringliteral">"Input las file"</span>);</div>
+<div class="line"><a name="l00087"></a><span class="lineno">   87</span>   <a class="code" href="classOptionpk.html">Optionpk<string></a> attribute_opt(<span class="stringliteral">"n"</span>, <span class="stringliteral">"name"</span>, <span class="stringliteral">"names of the point attribute to select: intensity, angle, return, nreturn, angle, z"</span>, <span class="stringliteral">"z"</span>);</div>
+<div class="line"><a name="l00088"></a><span class="lineno">   88</span>   <span class="comment">// Optionpk<bool> disc_opt("circ", "circular", "circular disc kernel for dilation and erosion", false);</span></div>
+<div class="line"><a name="l00089"></a><span class="lineno">   89</span>   <span class="comment">// Optionpk<double> maxSlope_opt("s", "maxSlope", "Maximum slope used for morphological filtering", 0.0);</span></div>
+<div class="line"><a name="l00090"></a><span class="lineno">   90</span>   <span class="comment">// Optionpk<double> hThreshold_opt("ht", "maxHeight", "initial and maximum height threshold for progressive morphological filtering (e.g., -ht 0.2 -ht 2.5)", 0.2);</span></div>
+<div class="line"><a name="l00091"></a><span class="lineno">   91</span>   <span class="comment">// Optionpk<short> maxIter_opt("maxit", "maxit", "Maximum number of iterations in post filter", 5);</span></div>
+<div class="line"><a name="l00092"></a><span class="lineno">   92</span>   <a class="code" href="classOptionpk.html">Optionpk<unsigned short></a> returns_opt(<span class="stringliteral">"ret"</span>, <span class="stringliteral">"ret"</span>, <span class="stringliteral">"number(s) of returns to include"</span>);</div>
+<div class="line"><a name="l00093"></a><span class="lineno">   93</span>   <a class="code" href="classOptionpk.html">Optionpk<unsigned short></a> classes_opt(<span class="stringliteral">"class"</span>, <span class="stringliteral">"class"</span>, <span class="stringliteral">"classes to keep: 0 (created, never classified), 1 (unclassified), 2 (ground), 3 (low vegetation), 4 (medium vegetation), 5 (high vegetation), 6 (building), 7 (low point, noise), 8 ( [...]
+<div class="line"><a name="l00094"></a><span class="lineno">   94</span>   <a class="code" href="classOptionpk.html">Optionpk<string></a> composite_opt(<span class="stringliteral">"comp"</span>, <span class="stringliteral">"comp"</span>, <span class="stringliteral">"composite for multiple points in cell (min, max, median, mean, sum, first, last, profile (percentile height values), percentile, number (point density)). Last: overwrite cells with latest p [...]
+<div class="line"><a name="l00095"></a><span class="lineno">   95</span>   <a class="code" href="classOptionpk.html">Optionpk<string></a> filter_opt(<span class="stringliteral">"fir"</span>, <span class="stringliteral">"filter"</span>, <span class="stringliteral">"filter las points (first,last,single,multiple,all)."</span>, <span class="stringliteral">"all"</span>);</div>
+<div class="line"><a name="l00096"></a><span class="lineno">   96</span>   <a class="code" href="classOptionpk.html">Optionpk<unsigned short></a> angle_min_opt(<span class="stringliteral">"angle_min"</span>, <span class="stringliteral">"angle_min"</span>, <span class="stringliteral">"Minimum scan angle to read points."</span>);</div>
+<div class="line"><a name="l00097"></a><span class="lineno">   97</span>   <a class="code" href="classOptionpk.html">Optionpk<unsigned short></a> angle_max_opt(<span class="stringliteral">"angle_max"</span>, <span class="stringliteral">"angle_max"</span>, <span class="stringliteral">"Maximum scan angle to read points."</span>);</div>
+<div class="line"><a name="l00098"></a><span class="lineno">   98</span>   <span class="comment">// Optionpk<string> postFilter_opt("pf", "pfilter", "post processing filter (etew_min,promorph (progressive morphological filter),bunting (adapted promorph),open,close,none).", "none");</span></div>
+<div class="line"><a name="l00099"></a><span class="lineno">   99</span>   <span class="comment">// Optionpk<short> dimx_opt("dimx", "dimx", "Dimension X of postFilter", 3);</span></div>
+<div class="line"><a name="l00100"></a><span class="lineno">  100</span>   <span class="comment">// Optionpk<short> dimy_opt("dimy", "dimy", "Dimension Y of postFilter", 3);</span></div>
+<div class="line"><a name="l00101"></a><span class="lineno">  101</span>   <a class="code" href="classOptionpk.html">Optionpk<string></a> output_opt(<span class="stringliteral">"o"</span>, <span class="stringliteral">"output"</span>, <span class="stringliteral">"Output image file"</span>);</div>
+<div class="line"><a name="l00102"></a><span class="lineno">  102</span>   <a class="code" href="classOptionpk.html">Optionpk<string></a> projection_opt(<span class="stringliteral">"a_srs"</span>, <span class="stringliteral">"a_srs"</span>, <span class="stringliteral">"assign the projection for the output file in epsg code, e.g., epsg:3035 for European LAEA projection"</span>);</div>
+<div class="line"><a name="l00103"></a><span class="lineno">  103</span>   <a class="code" href="classOptionpk.html">Optionpk<double></a> ulx_opt(<span class="stringliteral">"ulx"</span>, <span class="stringliteral">"ulx"</span>, <span class="stringliteral">"Upper left x value bounding box (in geocoordinates if georef is true). 0 is read from input file"</span>, 0.0);</div>
+<div class="line"><a name="l00104"></a><span class="lineno">  104</span>   <a class="code" href="classOptionpk.html">Optionpk<double></a> uly_opt(<span class="stringliteral">"uly"</span>, <span class="stringliteral">"uly"</span>, <span class="stringliteral">"Upper left y value bounding box (in geocoordinates if georef is true). 0 is read from input file"</span>, 0.0);</div>
+<div class="line"><a name="l00105"></a><span class="lineno">  105</span>   <a class="code" href="classOptionpk.html">Optionpk<double></a> lrx_opt(<span class="stringliteral">"lrx"</span>, <span class="stringliteral">"lrx"</span>, <span class="stringliteral">"Lower right x value bounding box (in geocoordinates if georef is true). 0 is read from input file"</span>, 0.0);</div>
+<div class="line"><a name="l00106"></a><span class="lineno">  106</span>   <a class="code" href="classOptionpk.html">Optionpk<double></a> lry_opt(<span class="stringliteral">"lry"</span>, <span class="stringliteral">"lry"</span>, <span class="stringliteral">"Lower right y value bounding box (in geocoordinates if georef is true). 0 is read from input file"</span>, 0.0);</div>
+<div class="line"><a name="l00107"></a><span class="lineno">  107</span>   <a class="code" href="classOptionpk.html">Optionpk<string></a> otype_opt(<span class="stringliteral">"ot"</span>, <span class="stringliteral">"otype"</span>, <span class="stringliteral">"Data type for output image ({Byte/Int16/UInt16/UInt32/Int32/Float32/Float64/CInt16/CInt32/CFloat32/CFloat64}). Empty string: inherit type from input image"</span>, <span class="stringlitera [...]
+<div class="line"><a name="l00108"></a><span class="lineno">  108</span>   <a class="code" href="classOptionpk.html">Optionpk<string></a> oformat_opt(<span class="stringliteral">"of"</span>, <span class="stringliteral">"oformat"</span>, <span class="stringliteral">"Output image format (see also gdal_translate). Empty string: inherit from input image"</span>, <span class="stringliteral">"GTiff"</span>);</div>
+<div class="line"><a name="l00109"></a><span class="lineno">  109</span>   <a class="code" href="classOptionpk.html">Optionpk<double></a> dx_opt(<span class="stringliteral">"dx"</span>, <span class="stringliteral">"dx"</span>, <span class="stringliteral">"Output resolution in x (in meter)"</span>, 1.0);</div>
+<div class="line"><a name="l00110"></a><span class="lineno">  110</span>   <a class="code" href="classOptionpk.html">Optionpk<double></a> dy_opt(<span class="stringliteral">"dy"</span>, <span class="stringliteral">"dy"</span>, <span class="stringliteral">"Output resolution in y (in meter)"</span>, 1.0);</div>
+<div class="line"><a name="l00111"></a><span class="lineno">  111</span>   <a class="code" href="classOptionpk.html">Optionpk<short></a> nbin_opt(<span class="stringliteral">"nbin"</span>, <span class="stringliteral">"nbin"</span>, <span class="stringliteral">"Number of percentile bins for calculating percentile height value profile (=number of output bands)"</span>, 10.0);</div>
+<div class="line"><a name="l00112"></a><span class="lineno">  112</span>   <a class="code" href="classOptionpk.html">Optionpk<double></a> percentile_opt(<span class="stringliteral">"perc"</span>,<span class="stringliteral">"perc"</span>,<span class="stringliteral">"Percentile value used for rule percentile"</span>,95);</div>
+<div class="line"><a name="l00113"></a><span class="lineno">  113</span>   <a class="code" href="classOptionpk.html">Optionpk<short></a> nodata_opt(<span class="stringliteral">"nodata"</span>, <span class="stringliteral">"nodata"</span>, <span class="stringliteral">"nodata value to put in image"</span>, 0);</div>
+<div class="line"><a name="l00114"></a><span class="lineno">  114</span>   <a class="code" href="classOptionpk.html">Optionpk<string></a> option_opt(<span class="stringliteral">"co"</span>, <span class="stringliteral">"co"</span>, <span class="stringliteral">"Creation option for output file. Multiple options can be specified."</span>);</div>
+<div class="line"><a name="l00115"></a><span class="lineno">  115</span>   <a class="code" href="classOptionpk.html">Optionpk<string></a> colorTable_opt(<span class="stringliteral">"ct"</span>, <span class="stringliteral">"ct"</span>, <span class="stringliteral">"color table (file with 5 columns: id R G B ALFA (0: transparent, 255: solid)"</span>);</div>
+<div class="line"><a name="l00116"></a><span class="lineno">  116</span>   <a class="code" href="classOptionpk.html">Optionpk<short></a> verbose_opt(<span class="stringliteral">"v"</span>, <span class="stringliteral">"verbose"</span>, <span class="stringliteral">"verbose mode"</span>, 0,2);</div>
+<div class="line"><a name="l00117"></a><span class="lineno">  117</span> </div>
+<div class="line"><a name="l00118"></a><span class="lineno">  118</span>   nbin_opt.setHide(1);</div>
+<div class="line"><a name="l00119"></a><span class="lineno">  119</span>   percentile_opt.setHide(1);</div>
+<div class="line"><a name="l00120"></a><span class="lineno">  120</span>   nodata_opt.setHide(1);</div>
+<div class="line"><a name="l00121"></a><span class="lineno">  121</span>   option_opt.setHide(1);</div>
+<div class="line"><a name="l00122"></a><span class="lineno">  122</span>   colorTable_opt.setHide(1);</div>
+<div class="line"><a name="l00123"></a><span class="lineno">  123</span> </div>
+<div class="line"><a name="l00124"></a><span class="lineno">  124</span>   <span class="keywordtype">bool</span> doProcess;<span class="comment">//stop process when program was invoked with help option (-h --help)</span></div>
+<div class="line"><a name="l00125"></a><span class="lineno">  125</span>   <span class="keywordflow">try</span>{</div>
+<div class="line"><a name="l00126"></a><span class="lineno">  126</span>     doProcess=input_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00127"></a><span class="lineno">  127</span>     attribute_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00128"></a><span class="lineno">  128</span>     returns_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00129"></a><span class="lineno">  129</span>     classes_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00130"></a><span class="lineno">  130</span>     composite_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00131"></a><span class="lineno">  131</span>     filter_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00132"></a><span class="lineno">  132</span>     angle_min_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00133"></a><span class="lineno">  133</span>     angle_max_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00134"></a><span class="lineno">  134</span>     output_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00135"></a><span class="lineno">  135</span>     projection_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00136"></a><span class="lineno">  136</span>     ulx_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00137"></a><span class="lineno">  137</span>     uly_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00138"></a><span class="lineno">  138</span>     lrx_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00139"></a><span class="lineno">  139</span>     lry_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00140"></a><span class="lineno">  140</span>     otype_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00141"></a><span class="lineno">  141</span>     oformat_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00142"></a><span class="lineno">  142</span>     dx_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00143"></a><span class="lineno">  143</span>     dy_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00144"></a><span class="lineno">  144</span>     nbin_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00145"></a><span class="lineno">  145</span>     percentile_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00146"></a><span class="lineno">  146</span>     nodata_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00147"></a><span class="lineno">  147</span>     option_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00148"></a><span class="lineno">  148</span>     colorTable_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00149"></a><span class="lineno">  149</span>     verbose_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00150"></a><span class="lineno">  150</span>   }</div>
+<div class="line"><a name="l00151"></a><span class="lineno">  151</span>   <span class="keywordflow">catch</span>(<span class="keywordtype">string</span> predefinedString){</div>
+<div class="line"><a name="l00152"></a><span class="lineno">  152</span>     std::cout << predefinedString << std::endl;</div>
+<div class="line"><a name="l00153"></a><span class="lineno">  153</span>     exit(0);</div>
+<div class="line"><a name="l00154"></a><span class="lineno">  154</span>   }</div>
+<div class="line"><a name="l00155"></a><span class="lineno">  155</span> </div>
+<div class="line"><a name="l00156"></a><span class="lineno">  156</span>   <span class="keywordflow">if</span>(!doProcess){</div>
+<div class="line"><a name="l00157"></a><span class="lineno">  157</span>     cout << endl;</div>
+<div class="line"><a name="l00158"></a><span class="lineno">  158</span>     cout << <span class="stringliteral">"pklas2img -i lasfile -o output"</span> << endl;</div>
+<div class="line"><a name="l00159"></a><span class="lineno">  159</span>     cout << endl;</div>
+<div class="line"><a name="l00160"></a><span class="lineno">  160</span>     std::cout << <span class="stringliteral">"short option -h shows basic options only, use long option --help to show all options"</span> << std::endl;</div>
+<div class="line"><a name="l00161"></a><span class="lineno">  161</span>     exit(0);<span class="comment">//help was invoked, stop processing</span></div>
+<div class="line"><a name="l00162"></a><span class="lineno">  162</span>   }</div>
+<div class="line"><a name="l00163"></a><span class="lineno">  163</span>   <span class="comment">//todo: is this needed?</span></div>
+<div class="line"><a name="l00164"></a><span class="lineno">  164</span>   GDALAllRegister();</div>
 <div class="line"><a name="l00165"></a><span class="lineno">  165</span> </div>
-<div class="line"><a name="l00166"></a><span class="lineno">  166</span>   <a class="code" href="classVector2d.html">Vector2d<vector<double></a> > inputData;<span class="comment">//row,col,point</span></div>
-<div class="line"><a name="l00167"></a><span class="lineno">  167</span> </div>
-<div class="line"><a name="l00168"></a><span class="lineno">  168</span>    </div>
-<div class="line"><a name="l00169"></a><span class="lineno">  169</span>   <a class="code" href="classImgReaderGdal.html">ImgReaderGdal</a> maskReader;</div>
-<div class="line"><a name="l00170"></a><span class="lineno">  170</span>   <a class="code" href="classImgWriterGdal.html">ImgWriterGdal</a> outputWriter;</div>
-<div class="line"><a name="l00171"></a><span class="lineno">  171</span>   GDALDataType theType=GDT_Unknown;</div>
-<div class="line"><a name="l00172"></a><span class="lineno">  172</span>   <span class="keywordflow">if</span>(verbose_opt[0])</div>
-<div class="line"><a name="l00173"></a><span class="lineno">  173</span>     cout << <span class="stringliteral">"possible output data types: "</span>;</div>
-<div class="line"><a name="l00174"></a><span class="lineno">  174</span>   <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iType = 0; iType < GDT_TypeCount; ++iType){</div>
-<div class="line"><a name="l00175"></a><span class="lineno">  175</span>     <span class="keywordflow">if</span>(verbose_opt[0])</div>
-<div class="line"><a name="l00176"></a><span class="lineno">  176</span>       cout << <span class="stringliteral">" "</span> << GDALGetDataTypeName((GDALDataType)iType);</div>
-<div class="line"><a name="l00177"></a><span class="lineno">  177</span>     <span class="keywordflow">if</span>( GDALGetDataTypeName((GDALDataType)iType) != NULL</div>
-<div class="line"><a name="l00178"></a><span class="lineno">  178</span>         && EQUAL(GDALGetDataTypeName((GDALDataType)iType),</div>
-<div class="line"><a name="l00179"></a><span class="lineno">  179</span>                  otype_opt[0].c_str()))</div>
-<div class="line"><a name="l00180"></a><span class="lineno">  180</span>       theType=(GDALDataType) iType;</div>
-<div class="line"><a name="l00181"></a><span class="lineno">  181</span>   }</div>
-<div class="line"><a name="l00182"></a><span class="lineno">  182</span>   <span class="keywordflow">if</span>(verbose_opt[0]){</div>
-<div class="line"><a name="l00183"></a><span class="lineno">  183</span>     <span class="keywordflow">if</span>(theType==GDT_Unknown)</div>
-<div class="line"><a name="l00184"></a><span class="lineno">  184</span>       cout << <span class="stringliteral">"Unknown output pixel type: "</span> << otype_opt[0] << endl;</div>
-<div class="line"><a name="l00185"></a><span class="lineno">  185</span>     <span class="keywordflow">else</span></div>
-<div class="line"><a name="l00186"></a><span class="lineno">  186</span>       cout << <span class="stringliteral">"Output pixel type:  "</span> << GDALGetDataTypeName(theType) << endl;</div>
+<div class="line"><a name="l00166"></a><span class="lineno">  166</span>   <span class="keywordtype">double</span> dfComplete=0.0;</div>
+<div class="line"><a name="l00167"></a><span class="lineno">  167</span>   <span class="keyword">const</span> <span class="keywordtype">char</span>* pszMessage;</div>
+<div class="line"><a name="l00168"></a><span class="lineno">  168</span>   <span class="keywordtype">void</span>* pProgressArg=NULL;</div>
+<div class="line"><a name="l00169"></a><span class="lineno">  169</span>   GDALProgressFunc pfnProgress=GDALTermProgress;</div>
+<div class="line"><a name="l00170"></a><span class="lineno">  170</span>   <span class="keywordtype">double</span> progress=0;</div>
+<div class="line"><a name="l00171"></a><span class="lineno">  171</span> </div>
+<div class="line"><a name="l00172"></a><span class="lineno">  172</span>   <a class="code" href="classVector2d.html">Vector2d<vector<double></a> > inputData;<span class="comment">//row,col,point</span></div>
+<div class="line"><a name="l00173"></a><span class="lineno">  173</span> </div>
+<div class="line"><a name="l00174"></a><span class="lineno">  174</span>    </div>
+<div class="line"><a name="l00175"></a><span class="lineno">  175</span>   <a class="code" href="classImgReaderGdal.html">ImgReaderGdal</a> maskReader;</div>
+<div class="line"><a name="l00176"></a><span class="lineno">  176</span>   <a class="code" href="classImgWriterGdal.html">ImgWriterGdal</a> outputWriter;</div>
+<div class="line"><a name="l00177"></a><span class="lineno">  177</span>   GDALDataType theType=GDT_Unknown;</div>
+<div class="line"><a name="l00178"></a><span class="lineno">  178</span>   <span class="keywordflow">if</span>(verbose_opt[0])</div>
+<div class="line"><a name="l00179"></a><span class="lineno">  179</span>     cout << <span class="stringliteral">"possible output data types: "</span>;</div>
+<div class="line"><a name="l00180"></a><span class="lineno">  180</span>   <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iType = 0; iType < GDT_TypeCount; ++iType){</div>
+<div class="line"><a name="l00181"></a><span class="lineno">  181</span>     <span class="keywordflow">if</span>(verbose_opt[0])</div>
+<div class="line"><a name="l00182"></a><span class="lineno">  182</span>       cout << <span class="stringliteral">" "</span> << GDALGetDataTypeName((GDALDataType)iType);</div>
+<div class="line"><a name="l00183"></a><span class="lineno">  183</span>     <span class="keywordflow">if</span>( GDALGetDataTypeName((GDALDataType)iType) != NULL</div>
+<div class="line"><a name="l00184"></a><span class="lineno">  184</span>         && EQUAL(GDALGetDataTypeName((GDALDataType)iType),</div>
+<div class="line"><a name="l00185"></a><span class="lineno">  185</span>                  otype_opt[0].c_str()))</div>
+<div class="line"><a name="l00186"></a><span class="lineno">  186</span>       theType=(GDALDataType) iType;</div>
 <div class="line"><a name="l00187"></a><span class="lineno">  187</span>   }</div>
-<div class="line"><a name="l00188"></a><span class="lineno">  188</span> </div>
-<div class="line"><a name="l00189"></a><span class="lineno">  189</span>   <span class="keywordtype">double</span> maxLRX=0;</div>
-<div class="line"><a name="l00190"></a><span class="lineno">  190</span>   <span class="keywordtype">double</span> maxULY=0;</div>
-<div class="line"><a name="l00191"></a><span class="lineno">  191</span>   <span class="keywordtype">double</span> minULX=0;</div>
-<div class="line"><a name="l00192"></a><span class="lineno">  192</span>   <span class="keywordtype">double</span> minLRY=0;</div>
-<div class="line"><a name="l00193"></a><span class="lineno">  193</span> </div>
-<div class="line"><a name="l00194"></a><span class="lineno">  194</span>   <span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> totalPoints=0;</div>
-<div class="line"><a name="l00195"></a><span class="lineno">  195</span>   <span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> nPoints=0;</div>
-<div class="line"><a name="l00196"></a><span class="lineno">  196</span>   <span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> ipoint=0;</div>
-<div class="line"><a name="l00197"></a><span class="lineno">  197</span>   <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iinput=0;iinput<input_opt.size();++iinput){</div>
-<div class="line"><a name="l00198"></a><span class="lineno">  198</span>     <span class="comment">// assert(input_opt[iinput].find(".las")!=string::npos);</span></div>
-<div class="line"><a name="l00199"></a><span class="lineno">  199</span>     <a class="code" href="classFileReaderLas.html">FileReaderLas</a> lasReader;</div>
-<div class="line"><a name="l00200"></a><span class="lineno">  200</span>     <span class="keywordflow">try</span>{</div>
-<div class="line"><a name="l00201"></a><span class="lineno">  201</span>       lasReader.open(input_opt[iinput]);</div>
-<div class="line"><a name="l00202"></a><span class="lineno">  202</span>     }</div>
-<div class="line"><a name="l00203"></a><span class="lineno">  203</span>     <span class="keywordflow">catch</span>(<span class="keywordtype">string</span> errorString){</div>
-<div class="line"><a name="l00204"></a><span class="lineno">  204</span>       cerr << errorString << endl;</div>
-<div class="line"><a name="l00205"></a><span class="lineno">  205</span>       exit(1);</div>
-<div class="line"><a name="l00206"></a><span class="lineno">  206</span>     }</div>
-<div class="line"><a name="l00207"></a><span class="lineno">  207</span>     <span class="keywordflow">catch</span>(...){</div>
-<div class="line"><a name="l00208"></a><span class="lineno">  208</span>       cerr << <span class="stringliteral">"Error opening input "</span> << input_opt[iinput] << endl;</div>
-<div class="line"><a name="l00209"></a><span class="lineno">  209</span>       exit(2);</div>
-<div class="line"><a name="l00210"></a><span class="lineno">  210</span>     }</div>
-<div class="line"><a name="l00211"></a><span class="lineno">  211</span>     nPoints=lasReader.getPointCount();</div>
-<div class="line"><a name="l00212"></a><span class="lineno">  212</span>     totalPoints+=nPoints;</div>
-<div class="line"><a name="l00213"></a><span class="lineno">  213</span> </div>
-<div class="line"><a name="l00214"></a><span class="lineno">  214</span>     <span class="keywordflow">if</span>(ulx_opt[0]>=lrx_opt[0]||uly_opt[0]<=lry_opt[0]){</div>
-<div class="line"><a name="l00215"></a><span class="lineno">  215</span>       <span class="keywordtype">double</span> ulx,uly,lrx,lry;</div>
-<div class="line"><a name="l00216"></a><span class="lineno">  216</span>       lasReader.getExtent(ulx,uly,lrx,lry);</div>
-<div class="line"><a name="l00217"></a><span class="lineno">  217</span>       lrx+=dx_opt[0];<span class="comment">//pixel coordinates are referenced to upper left corner (las coordinates are centres)</span></div>
-<div class="line"><a name="l00218"></a><span class="lineno">  218</span>       lry-=dy_opt[0];<span class="comment">//pixel coordinates are referenced to upper left corner (las coordinates are centres)</span></div>
-<div class="line"><a name="l00219"></a><span class="lineno">  219</span>       <span class="keywordflow">if</span>(ulx>=lrx){</div>
-<div class="line"><a name="l00220"></a><span class="lineno">  220</span>         ulx=ulx-dx_opt[0]/2.0;</div>
-<div class="line"><a name="l00221"></a><span class="lineno">  221</span>         lrx=ulx+dx_opt[0]/2.0;</div>
-<div class="line"><a name="l00222"></a><span class="lineno">  222</span>       }</div>
-<div class="line"><a name="l00223"></a><span class="lineno">  223</span>       <span class="keywordflow">if</span>(uly<=lry){</div>
-<div class="line"><a name="l00224"></a><span class="lineno">  224</span>         uly=lry+dy_opt[0]/2.0;</div>
-<div class="line"><a name="l00225"></a><span class="lineno">  225</span>         lry=lry-dy_opt[0]/2.0;</div>
-<div class="line"><a name="l00226"></a><span class="lineno">  226</span>       }</div>
-<div class="line"><a name="l00227"></a><span class="lineno">  227</span>       <span class="keywordflow">if</span>(maxLRX>minULX){</div>
-<div class="line"><a name="l00228"></a><span class="lineno">  228</span>         maxLRX=(lrx>maxLRX)?lrx:maxLRX;</div>
-<div class="line"><a name="l00229"></a><span class="lineno">  229</span>         maxULY=(uly>maxULY)?uly:maxULY;</div>
-<div class="line"><a name="l00230"></a><span class="lineno">  230</span>         minULX=(ulx<minULX)?ulx:minULX;</div>
-<div class="line"><a name="l00231"></a><span class="lineno">  231</span>         minLRY=(lry<minLRY)?lry:minLRY;</div>
+<div class="line"><a name="l00188"></a><span class="lineno">  188</span>   <span class="keywordflow">if</span>(verbose_opt[0]){</div>
+<div class="line"><a name="l00189"></a><span class="lineno">  189</span>     <span class="keywordflow">if</span>(theType==GDT_Unknown)</div>
+<div class="line"><a name="l00190"></a><span class="lineno">  190</span>       cout << <span class="stringliteral">"Unknown output pixel type: "</span> << otype_opt[0] << endl;</div>
+<div class="line"><a name="l00191"></a><span class="lineno">  191</span>     <span class="keywordflow">else</span></div>
+<div class="line"><a name="l00192"></a><span class="lineno">  192</span>       cout << <span class="stringliteral">"Output pixel type:  "</span> << GDALGetDataTypeName(theType) << endl;</div>
+<div class="line"><a name="l00193"></a><span class="lineno">  193</span>   }</div>
+<div class="line"><a name="l00194"></a><span class="lineno">  194</span> </div>
+<div class="line"><a name="l00195"></a><span class="lineno">  195</span>   <span class="keywordtype">double</span> maxLRX=0;</div>
+<div class="line"><a name="l00196"></a><span class="lineno">  196</span>   <span class="keywordtype">double</span> maxULY=0;</div>
+<div class="line"><a name="l00197"></a><span class="lineno">  197</span>   <span class="keywordtype">double</span> minULX=0;</div>
+<div class="line"><a name="l00198"></a><span class="lineno">  198</span>   <span class="keywordtype">double</span> minLRY=0;</div>
+<div class="line"><a name="l00199"></a><span class="lineno">  199</span> </div>
+<div class="line"><a name="l00200"></a><span class="lineno">  200</span>   <span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> totalPoints=0;</div>
+<div class="line"><a name="l00201"></a><span class="lineno">  201</span>   <span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> nPoints=0;</div>
+<div class="line"><a name="l00202"></a><span class="lineno">  202</span>   <span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> ipoint=0;</div>
+<div class="line"><a name="l00203"></a><span class="lineno">  203</span>   <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iinput=0;iinput<input_opt.size();++iinput){</div>
+<div class="line"><a name="l00204"></a><span class="lineno">  204</span>     <span class="comment">// assert(input_opt[iinput].find(".las")!=string::npos);</span></div>
+<div class="line"><a name="l00205"></a><span class="lineno">  205</span>     <a class="code" href="classFileReaderLas.html">FileReaderLas</a> lasReader;</div>
+<div class="line"><a name="l00206"></a><span class="lineno">  206</span>     <span class="keywordflow">try</span>{</div>
+<div class="line"><a name="l00207"></a><span class="lineno">  207</span>       lasReader.open(input_opt[iinput]);</div>
+<div class="line"><a name="l00208"></a><span class="lineno">  208</span>     }</div>
+<div class="line"><a name="l00209"></a><span class="lineno">  209</span>     <span class="keywordflow">catch</span>(<span class="keywordtype">string</span> errorString){</div>
+<div class="line"><a name="l00210"></a><span class="lineno">  210</span>       cerr << errorString << endl;</div>
+<div class="line"><a name="l00211"></a><span class="lineno">  211</span>       exit(1);</div>
+<div class="line"><a name="l00212"></a><span class="lineno">  212</span>     }</div>
+<div class="line"><a name="l00213"></a><span class="lineno">  213</span>     <span class="keywordflow">catch</span>(...){</div>
+<div class="line"><a name="l00214"></a><span class="lineno">  214</span>       cerr << <span class="stringliteral">"Error opening input "</span> << input_opt[iinput] << endl;</div>
+<div class="line"><a name="l00215"></a><span class="lineno">  215</span>       exit(2);</div>
+<div class="line"><a name="l00216"></a><span class="lineno">  216</span>     }</div>
+<div class="line"><a name="l00217"></a><span class="lineno">  217</span>     nPoints=lasReader.getPointCount();</div>
+<div class="line"><a name="l00218"></a><span class="lineno">  218</span>     totalPoints+=nPoints;</div>
+<div class="line"><a name="l00219"></a><span class="lineno">  219</span> </div>
+<div class="line"><a name="l00220"></a><span class="lineno">  220</span>     <span class="keywordflow">if</span>(ulx_opt[0]>=lrx_opt[0]||uly_opt[0]<=lry_opt[0]){</div>
+<div class="line"><a name="l00221"></a><span class="lineno">  221</span>       <span class="keywordtype">double</span> ulx,uly,lrx,lry;</div>
+<div class="line"><a name="l00222"></a><span class="lineno">  222</span>       lasReader.getExtent(ulx,uly,lrx,lry);</div>
+<div class="line"><a name="l00223"></a><span class="lineno">  223</span>       lrx+=dx_opt[0];<span class="comment">//pixel coordinates are referenced to upper left corner (las coordinates are centres)</span></div>
+<div class="line"><a name="l00224"></a><span class="lineno">  224</span>       lry-=dy_opt[0];<span class="comment">//pixel coordinates are referenced to upper left corner (las coordinates are centres)</span></div>
+<div class="line"><a name="l00225"></a><span class="lineno">  225</span>       <span class="keywordflow">if</span>(ulx>=lrx){</div>
+<div class="line"><a name="l00226"></a><span class="lineno">  226</span>         ulx=ulx-dx_opt[0]/2.0;</div>
+<div class="line"><a name="l00227"></a><span class="lineno">  227</span>         lrx=ulx+dx_opt[0]/2.0;</div>
+<div class="line"><a name="l00228"></a><span class="lineno">  228</span>       }</div>
+<div class="line"><a name="l00229"></a><span class="lineno">  229</span>       <span class="keywordflow">if</span>(uly<=lry){</div>
+<div class="line"><a name="l00230"></a><span class="lineno">  230</span>         uly=lry+dy_opt[0]/2.0;</div>
+<div class="line"><a name="l00231"></a><span class="lineno">  231</span>         lry=lry-dy_opt[0]/2.0;</div>
 <div class="line"><a name="l00232"></a><span class="lineno">  232</span>       }</div>
-<div class="line"><a name="l00233"></a><span class="lineno">  233</span>       <span class="keywordflow">else</span>{<span class="comment">//initialize</span></div>
-<div class="line"><a name="l00234"></a><span class="lineno">  234</span>         maxLRX=lrx;</div>
-<div class="line"><a name="l00235"></a><span class="lineno">  235</span>         maxULY=uly;</div>
-<div class="line"><a name="l00236"></a><span class="lineno">  236</span>         minULX=ulx;</div>
-<div class="line"><a name="l00237"></a><span class="lineno">  237</span>         minLRY=lry;</div>
-<div class="line"><a name="l00238"></a><span class="lineno">  238</span>       }        </div>
-<div class="line"><a name="l00239"></a><span class="lineno">  239</span>     }</div>
-<div class="line"><a name="l00240"></a><span class="lineno">  240</span>     <span class="keywordflow">else</span>{</div>
-<div class="line"><a name="l00241"></a><span class="lineno">  241</span>       maxLRX=lrx_opt[0];</div>
-<div class="line"><a name="l00242"></a><span class="lineno">  242</span>       maxULY=uly_opt[0];</div>
-<div class="line"><a name="l00243"></a><span class="lineno">  243</span>       minULX=ulx_opt[0];</div>
-<div class="line"><a name="l00244"></a><span class="lineno">  244</span>       minLRY=lry_opt[0];</div>
+<div class="line"><a name="l00233"></a><span class="lineno">  233</span>       <span class="keywordflow">if</span>(maxLRX>minULX){</div>
+<div class="line"><a name="l00234"></a><span class="lineno">  234</span>         maxLRX=(lrx>maxLRX)?lrx:maxLRX;</div>
+<div class="line"><a name="l00235"></a><span class="lineno">  235</span>         maxULY=(uly>maxULY)?uly:maxULY;</div>
+<div class="line"><a name="l00236"></a><span class="lineno">  236</span>         minULX=(ulx<minULX)?ulx:minULX;</div>
+<div class="line"><a name="l00237"></a><span class="lineno">  237</span>         minLRY=(lry<minLRY)?lry:minLRY;</div>
+<div class="line"><a name="l00238"></a><span class="lineno">  238</span>       }</div>
+<div class="line"><a name="l00239"></a><span class="lineno">  239</span>       <span class="keywordflow">else</span>{<span class="comment">//initialize</span></div>
+<div class="line"><a name="l00240"></a><span class="lineno">  240</span>         maxLRX=lrx;</div>
+<div class="line"><a name="l00241"></a><span class="lineno">  241</span>         maxULY=uly;</div>
+<div class="line"><a name="l00242"></a><span class="lineno">  242</span>         minULX=ulx;</div>
+<div class="line"><a name="l00243"></a><span class="lineno">  243</span>         minLRY=lry;</div>
+<div class="line"><a name="l00244"></a><span class="lineno">  244</span>       }        </div>
 <div class="line"><a name="l00245"></a><span class="lineno">  245</span>     }</div>
-<div class="line"><a name="l00246"></a><span class="lineno">  246</span>     lasReader.close();</div>
-<div class="line"><a name="l00247"></a><span class="lineno">  247</span>   }</div>
-<div class="line"><a name="l00248"></a><span class="lineno">  248</span>   <span class="keywordflow">if</span>(verbose_opt[0]){</div>
-<div class="line"><a name="l00249"></a><span class="lineno">  249</span>     std::cout << setprecision(12) << <span class="stringliteral">"--ulx="</span> << minULX << <span class="stringliteral">" --uly="</span> << maxULY << <span class="stringliteral">" --lrx="</span> << maxLRX << <span class="stringliteral">" --lry="</span> << minLRY << std::endl;</div>
-<div class="line"><a name="l00250"></a><span class="lineno">  250</span>     std::cout << <span class="stringliteral">"total number of points before filtering: "</span> << totalPoints << std::endl;</div>
-<div class="line"><a name="l00251"></a><span class="lineno">  251</span>     std::cout << <span class="stringliteral">"filter set to "</span> << filter_opt[0] << std::endl;</div>
-<div class="line"><a name="l00252"></a><span class="lineno">  252</span>     <span class="comment">// std::cout << "postFilter set to " << postFilter_opt[0] << std::endl;</span></div>
+<div class="line"><a name="l00246"></a><span class="lineno">  246</span>     <span class="keywordflow">else</span>{</div>
+<div class="line"><a name="l00247"></a><span class="lineno">  247</span>       maxLRX=lrx_opt[0];</div>
+<div class="line"><a name="l00248"></a><span class="lineno">  248</span>       maxULY=uly_opt[0];</div>
+<div class="line"><a name="l00249"></a><span class="lineno">  249</span>       minULX=ulx_opt[0];</div>
+<div class="line"><a name="l00250"></a><span class="lineno">  250</span>       minLRY=lry_opt[0];</div>
+<div class="line"><a name="l00251"></a><span class="lineno">  251</span>     }</div>
+<div class="line"><a name="l00252"></a><span class="lineno">  252</span>     lasReader.close();</div>
 <div class="line"><a name="l00253"></a><span class="lineno">  253</span>   }</div>
-<div class="line"><a name="l00254"></a><span class="lineno">  254</span>   <span class="keywordtype">int</span> ncol=ceil(maxLRX-minULX)/dx_opt[0];<span class="comment">//number of columns in outputGrid</span></div>
-<div class="line"><a name="l00255"></a><span class="lineno">  255</span>   <span class="keywordtype">int</span> nrow=ceil(maxULY-minLRY)/dy_opt[0];<span class="comment">//number of rows in outputGrid</span></div>
-<div class="line"><a name="l00256"></a><span class="lineno">  256</span>   <span class="comment">//todo: multiple bands</span></div>
-<div class="line"><a name="l00257"></a><span class="lineno">  257</span>   <span class="keywordtype">int</span> nband=(composite_opt[0]==<span class="stringliteral">"profile"</span>)? nbin_opt[0] : 1;</div>
-<div class="line"><a name="l00258"></a><span class="lineno">  258</span>   <span class="keywordflow">if</span>(!output_opt.size()){</div>
-<div class="line"><a name="l00259"></a><span class="lineno">  259</span>     cerr << <span class="stringliteral">"Error: no output file defined"</span> << endl;</div>
-<div class="line"><a name="l00260"></a><span class="lineno">  260</span>     exit(1);</div>
-<div class="line"><a name="l00261"></a><span class="lineno">  261</span>   }</div>
-<div class="line"><a name="l00262"></a><span class="lineno">  262</span>   <span class="keywordflow">if</span>(verbose_opt[0])</div>
-<div class="line"><a name="l00263"></a><span class="lineno">  263</span>     cout << <span class="stringliteral">"opening output file "</span> << output_opt[0] << endl;</div>
-<div class="line"><a name="l00264"></a><span class="lineno">  264</span>   outputWriter.open(output_opt[0],ncol,nrow,nband,theType,oformat_opt[0],option_opt);</div>
-<div class="line"><a name="l00265"></a><span class="lineno">  265</span>   outputWriter.GDALSetNoDataValue(nodata_opt[0]);</div>
-<div class="line"><a name="l00266"></a><span class="lineno">  266</span>   <span class="comment">//set projection</span></div>
-<div class="line"><a name="l00267"></a><span class="lineno">  267</span>   <span class="keywordtype">double</span> gt[6];</div>
-<div class="line"><a name="l00268"></a><span class="lineno">  268</span>   gt[0]=minULX;</div>
-<div class="line"><a name="l00269"></a><span class="lineno">  269</span>   gt[1]=dx_opt[0];</div>
-<div class="line"><a name="l00270"></a><span class="lineno">  270</span>   gt[2]=0;</div>
-<div class="line"><a name="l00271"></a><span class="lineno">  271</span>   gt[3]=maxULY;</div>
-<div class="line"><a name="l00272"></a><span class="lineno">  272</span>   gt[4]=0;</div>
-<div class="line"><a name="l00273"></a><span class="lineno">  273</span>   gt[5]=-dy_opt[0];</div>
-<div class="line"><a name="l00274"></a><span class="lineno">  274</span>   outputWriter.setGeoTransform(gt);</div>
-<div class="line"><a name="l00275"></a><span class="lineno">  275</span>   <span class="keywordflow">if</span>(projection_opt.size()){</div>
-<div class="line"><a name="l00276"></a><span class="lineno">  276</span>     <span class="keywordtype">string</span> projectionString=outputWriter.setProjectionProj4(projection_opt[0]);</div>
-<div class="line"><a name="l00277"></a><span class="lineno">  277</span>     <span class="keywordflow">if</span>(verbose_opt[0])</div>
-<div class="line"><a name="l00278"></a><span class="lineno">  278</span>       cout << <span class="stringliteral">"projection: "</span> << projectionString << endl;</div>
-<div class="line"><a name="l00279"></a><span class="lineno">  279</span>   }</div>
-<div class="line"><a name="l00280"></a><span class="lineno">  280</span>   <span class="keywordflow">if</span>(!outputWriter.isGeoRef())</div>
-<div class="line"><a name="l00281"></a><span class="lineno">  281</span>     cout << <span class="stringliteral">"Warning: output image "</span> << output_opt[0] << <span class="stringliteral">" is not georeferenced!"</span> << endl;</div>
-<div class="line"><a name="l00282"></a><span class="lineno">  282</span>   <span class="keywordflow">if</span>(colorTable_opt.size())</div>
-<div class="line"><a name="l00283"></a><span class="lineno">  283</span>     outputWriter.setColorTable(colorTable_opt[0]);</div>
-<div class="line"><a name="l00284"></a><span class="lineno">  284</span> </div>
-<div class="line"><a name="l00285"></a><span class="lineno">  285</span>   inputData.clear();</div>
-<div class="line"><a name="l00286"></a><span class="lineno">  286</span>   inputData.resize(nrow,ncol);</div>
-<div class="line"><a name="l00287"></a><span class="lineno">  287</span>   <a class="code" href="classVector2d.html">Vector2d<double></a> outputData(nrow,ncol);</div>
-<div class="line"><a name="l00288"></a><span class="lineno">  288</span>   <span class="keywordflow">for</span>(<span class="keywordtype">int</span> irow=0;irow<nrow;++irow)</div>
-<div class="line"><a name="l00289"></a><span class="lineno">  289</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> icol=0;icol<ncol;++icol)</div>
-<div class="line"><a name="l00290"></a><span class="lineno">  290</span>       outputData[irow][icol]=0;</div>
-<div class="line"><a name="l00291"></a><span class="lineno">  291</span> </div>
-<div class="line"><a name="l00292"></a><span class="lineno">  292</span>   cout << <span class="stringliteral">"Reading "</span> << input_opt.size() << <span class="stringliteral">" point cloud files"</span> << endl;</div>
-<div class="line"><a name="l00293"></a><span class="lineno">  293</span>   pfnProgress(progress,pszMessage,pProgressArg);</div>
-<div class="line"><a name="l00294"></a><span class="lineno">  294</span>   <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iinput=0;iinput<input_opt.size();++iinput){</div>
-<div class="line"><a name="l00295"></a><span class="lineno">  295</span>     <a class="code" href="classFileReaderLas.html">FileReaderLas</a> lasReader;</div>
-<div class="line"><a name="l00296"></a><span class="lineno">  296</span>     <span class="keywordflow">try</span>{</div>
-<div class="line"><a name="l00297"></a><span class="lineno">  297</span>       lasReader.open(input_opt[iinput]);</div>
-<div class="line"><a name="l00298"></a><span class="lineno">  298</span>     }</div>
-<div class="line"><a name="l00299"></a><span class="lineno">  299</span>     <span class="keywordflow">catch</span>(<span class="keywordtype">string</span> errorString){</div>
-<div class="line"><a name="l00300"></a><span class="lineno">  300</span>       cout << errorString << endl;</div>
-<div class="line"><a name="l00301"></a><span class="lineno">  301</span>       exit(1);</div>
-<div class="line"><a name="l00302"></a><span class="lineno">  302</span>     }</div>
-<div class="line"><a name="l00303"></a><span class="lineno">  303</span>     <span class="keywordflow">if</span>(verbose_opt[0]){</div>
-<div class="line"><a name="l00304"></a><span class="lineno">  304</span>       <span class="keywordflow">if</span>(lasReader.isCompressed())</div>
-<div class="line"><a name="l00305"></a><span class="lineno">  305</span>     cout << <span class="stringliteral">"Reading compressed point cloud "</span> << input_opt[iinput]<< endl;</div>
-<div class="line"><a name="l00306"></a><span class="lineno">  306</span>       <span class="keywordflow">else</span></div>
-<div class="line"><a name="l00307"></a><span class="lineno">  307</span>     cout << <span class="stringliteral">"Reading uncompressed point cloud "</span> << input_opt[iinput] << endl;</div>
+<div class="line"><a name="l00254"></a><span class="lineno">  254</span>   <span class="keywordflow">if</span>(verbose_opt[0]){</div>
+<div class="line"><a name="l00255"></a><span class="lineno">  255</span>     std::cout << setprecision(12) << <span class="stringliteral">"--ulx="</span> << minULX << <span class="stringliteral">" --uly="</span> << maxULY << <span class="stringliteral">" --lrx="</span> << maxLRX << <span class="stringliteral">" --lry="</span> << minLRY << std::endl;</div>
+<div class="line"><a name="l00256"></a><span class="lineno">  256</span>     std::cout << <span class="stringliteral">"total number of points before filtering: "</span> << totalPoints << std::endl;</div>
+<div class="line"><a name="l00257"></a><span class="lineno">  257</span>     std::cout << <span class="stringliteral">"filter set to "</span> << filter_opt[0] << std::endl;</div>
+<div class="line"><a name="l00258"></a><span class="lineno">  258</span>     <span class="keywordflow">if</span>(angle_min_opt.size())</div>
+<div class="line"><a name="l00259"></a><span class="lineno">  259</span>       std::cout << <span class="stringliteral">"minimum scan angle: "</span> << angle_min_opt[0] << std::endl;</div>
+<div class="line"><a name="l00260"></a><span class="lineno">  260</span>     <span class="keywordflow">if</span>(angle_max_opt.size())</div>
+<div class="line"><a name="l00261"></a><span class="lineno">  261</span>       std::cout << <span class="stringliteral">"maximum scan angle: "</span> << angle_max_opt[0] << std::endl;</div>
+<div class="line"><a name="l00262"></a><span class="lineno">  262</span>     <span class="comment">// std::cout << "postFilter set to " << postFilter_opt[0] << std::endl;</span></div>
+<div class="line"><a name="l00263"></a><span class="lineno">  263</span>   }</div>
+<div class="line"><a name="l00264"></a><span class="lineno">  264</span>   <span class="keywordtype">int</span> ncol=ceil(maxLRX-minULX)/dx_opt[0];<span class="comment">//number of columns in outputGrid</span></div>
+<div class="line"><a name="l00265"></a><span class="lineno">  265</span>   <span class="keywordtype">int</span> nrow=ceil(maxULY-minLRY)/dy_opt[0];<span class="comment">//number of rows in outputGrid</span></div>
+<div class="line"><a name="l00266"></a><span class="lineno">  266</span>   <span class="comment">//todo: multiple bands</span></div>
+<div class="line"><a name="l00267"></a><span class="lineno">  267</span>   <span class="keywordtype">int</span> nband=(composite_opt[0]==<span class="stringliteral">"profile"</span>)? nbin_opt[0] : 1;</div>
+<div class="line"><a name="l00268"></a><span class="lineno">  268</span>   <span class="keywordflow">if</span>(!output_opt.size()){</div>
+<div class="line"><a name="l00269"></a><span class="lineno">  269</span>     cerr << <span class="stringliteral">"Error: no output file defined"</span> << endl;</div>
+<div class="line"><a name="l00270"></a><span class="lineno">  270</span>     exit(1);</div>
+<div class="line"><a name="l00271"></a><span class="lineno">  271</span>   }</div>
+<div class="line"><a name="l00272"></a><span class="lineno">  272</span>   <span class="keywordflow">if</span>(verbose_opt[0])</div>
+<div class="line"><a name="l00273"></a><span class="lineno">  273</span>     cout << <span class="stringliteral">"opening output file "</span> << output_opt[0] << endl;</div>
+<div class="line"><a name="l00274"></a><span class="lineno">  274</span>   outputWriter.open(output_opt[0],ncol,nrow,nband,theType,oformat_opt[0],option_opt);</div>
+<div class="line"><a name="l00275"></a><span class="lineno">  275</span>   outputWriter.GDALSetNoDataValue(nodata_opt[0]);</div>
+<div class="line"><a name="l00276"></a><span class="lineno">  276</span>   <span class="comment">//set projection</span></div>
+<div class="line"><a name="l00277"></a><span class="lineno">  277</span>   <span class="keywordtype">double</span> gt[6];</div>
+<div class="line"><a name="l00278"></a><span class="lineno">  278</span>   gt[0]=minULX;</div>
+<div class="line"><a name="l00279"></a><span class="lineno">  279</span>   gt[1]=dx_opt[0];</div>
+<div class="line"><a name="l00280"></a><span class="lineno">  280</span>   gt[2]=0;</div>
+<div class="line"><a name="l00281"></a><span class="lineno">  281</span>   gt[3]=maxULY;</div>
+<div class="line"><a name="l00282"></a><span class="lineno">  282</span>   gt[4]=0;</div>
+<div class="line"><a name="l00283"></a><span class="lineno">  283</span>   gt[5]=-dy_opt[0];</div>
+<div class="line"><a name="l00284"></a><span class="lineno">  284</span>   outputWriter.setGeoTransform(gt);</div>
+<div class="line"><a name="l00285"></a><span class="lineno">  285</span>   <span class="keywordflow">if</span>(projection_opt.size()){</div>
+<div class="line"><a name="l00286"></a><span class="lineno">  286</span>     <span class="keywordtype">string</span> projectionString=outputWriter.setProjectionProj4(projection_opt[0]);</div>
+<div class="line"><a name="l00287"></a><span class="lineno">  287</span>     <span class="keywordflow">if</span>(verbose_opt[0])</div>
+<div class="line"><a name="l00288"></a><span class="lineno">  288</span>       cout << <span class="stringliteral">"projection: "</span> << projectionString << endl;</div>
+<div class="line"><a name="l00289"></a><span class="lineno">  289</span>   }</div>
+<div class="line"><a name="l00290"></a><span class="lineno">  290</span>   <span class="keywordflow">if</span>(!outputWriter.isGeoRef())</div>
+<div class="line"><a name="l00291"></a><span class="lineno">  291</span>     cout << <span class="stringliteral">"Warning: output image "</span> << output_opt[0] << <span class="stringliteral">" is not georeferenced!"</span> << endl;</div>
+<div class="line"><a name="l00292"></a><span class="lineno">  292</span>   <span class="keywordflow">if</span>(colorTable_opt.size())</div>
+<div class="line"><a name="l00293"></a><span class="lineno">  293</span>     outputWriter.setColorTable(colorTable_opt[0]);</div>
+<div class="line"><a name="l00294"></a><span class="lineno">  294</span> </div>
+<div class="line"><a name="l00295"></a><span class="lineno">  295</span>   inputData.clear();</div>
+<div class="line"><a name="l00296"></a><span class="lineno">  296</span>   inputData.resize(nrow,ncol);</div>
+<div class="line"><a name="l00297"></a><span class="lineno">  297</span>   <a class="code" href="classVector2d.html">Vector2d<double></a> outputData(nrow,ncol);</div>
+<div class="line"><a name="l00298"></a><span class="lineno">  298</span>   <span class="keywordflow">for</span>(<span class="keywordtype">int</span> irow=0;irow<nrow;++irow)</div>
+<div class="line"><a name="l00299"></a><span class="lineno">  299</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> icol=0;icol<ncol;++icol)</div>
+<div class="line"><a name="l00300"></a><span class="lineno">  300</span>       outputData[irow][icol]=0;</div>
+<div class="line"><a name="l00301"></a><span class="lineno">  301</span> </div>
+<div class="line"><a name="l00302"></a><span class="lineno">  302</span>   cout << <span class="stringliteral">"Reading "</span> << input_opt.size() << <span class="stringliteral">" point cloud files"</span> << endl;</div>
+<div class="line"><a name="l00303"></a><span class="lineno">  303</span>   pfnProgress(progress,pszMessage,pProgressArg);</div>
+<div class="line"><a name="l00304"></a><span class="lineno">  304</span>   <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iinput=0;iinput<input_opt.size();++iinput){</div>
+<div class="line"><a name="l00305"></a><span class="lineno">  305</span>     <a class="code" href="classFileReaderLas.html">FileReaderLas</a> lasReader;</div>
+<div class="line"><a name="l00306"></a><span class="lineno">  306</span>     <span class="keywordflow">try</span>{</div>
+<div class="line"><a name="l00307"></a><span class="lineno">  307</span>       lasReader.open(input_opt[iinput]);</div>
 <div class="line"><a name="l00308"></a><span class="lineno">  308</span>     }</div>
-<div class="line"><a name="l00309"></a><span class="lineno">  309</span>     <span class="comment">//set bounding filter</span></div>
-<div class="line"><a name="l00310"></a><span class="lineno">  310</span>     <span class="comment">// lasReader.addBoundsFilter(minULX,maxULY,maxLRX,minLRY);</span></div>
-<div class="line"><a name="l00311"></a><span class="lineno">  311</span>     <span class="comment">//set returns filter</span></div>
-<div class="line"><a name="l00312"></a><span class="lineno">  312</span>     <span class="keywordflow">if</span>(returns_opt.size())</div>
-<div class="line"><a name="l00313"></a><span class="lineno">  313</span>       lasReader.addReturnsFilter(returns_opt);</div>
-<div class="line"><a name="l00314"></a><span class="lineno">  314</span>     <span class="keywordflow">if</span>(classes_opt.size())</div>
-<div class="line"><a name="l00315"></a><span class="lineno">  315</span>       lasReader.addClassFilter(classes_opt);</div>
-<div class="line"><a name="l00316"></a><span class="lineno">  316</span>     lasReader.setFilters();</div>
-<div class="line"><a name="l00317"></a><span class="lineno">  317</span> </div>
-<div class="line"><a name="l00318"></a><span class="lineno">  318</span>     <span class="keywordflow">if</span>(attribute_opt[0]!=<span class="stringliteral">"z"</span>){</div>
-<div class="line"><a name="l00319"></a><span class="lineno">  319</span>       vector<boost::uint16_t> returnsVector;</div>
-<div class="line"><a name="l00320"></a><span class="lineno">  320</span>       vector<string>::iterator ait=attribute_opt.begin();</div>
-<div class="line"><a name="l00321"></a><span class="lineno">  321</span>       <span class="keywordflow">while</span>(ait!=attribute_opt.end()){</div>
-<div class="line"><a name="l00322"></a><span class="lineno">  322</span>         <span class="keywordflow">if</span>(*ait==<span class="stringliteral">"intensity"</span>){</div>
-<div class="line"><a name="l00323"></a><span class="lineno">  323</span>           <span class="keywordflow">if</span>(verbose_opt[0])</div>
-<div class="line"><a name="l00324"></a><span class="lineno">  324</span>             std::cout << <span class="stringliteral">"writing intensity"</span> << std::endl;</div>
-<div class="line"><a name="l00325"></a><span class="lineno">  325</span>           ++ait;</div>
-<div class="line"><a name="l00326"></a><span class="lineno">  326</span>         }</div>
-<div class="line"><a name="l00327"></a><span class="lineno">  327</span>         <span class="keywordflow">else</span> <span class="keywordflow">if</span>(*ait==<span class="stringliteral">"return"</span>){</div>
-<div class="line"><a name="l00328"></a><span class="lineno">  328</span>           <span class="keywordflow">if</span>(verbose_opt[0])</div>
-<div class="line"><a name="l00329"></a><span class="lineno">  329</span>             std::cout << <span class="stringliteral">"writing return number"</span> << std::endl;</div>
-<div class="line"><a name="l00330"></a><span class="lineno">  330</span>           ++ait;</div>
-<div class="line"><a name="l00331"></a><span class="lineno">  331</span>         }</div>
-<div class="line"><a name="l00332"></a><span class="lineno">  332</span>         <span class="keywordflow">else</span> <span class="keywordflow">if</span>(*ait==<span class="stringliteral">"nreturn"</span>){</div>
+<div class="line"><a name="l00309"></a><span class="lineno">  309</span>     <span class="keywordflow">catch</span>(<span class="keywordtype">string</span> errorString){</div>
+<div class="line"><a name="l00310"></a><span class="lineno">  310</span>       cout << errorString << endl;</div>
+<div class="line"><a name="l00311"></a><span class="lineno">  311</span>       exit(1);</div>
+<div class="line"><a name="l00312"></a><span class="lineno">  312</span>     }</div>
+<div class="line"><a name="l00313"></a><span class="lineno">  313</span>     <span class="keywordflow">if</span>(verbose_opt[0]){</div>
+<div class="line"><a name="l00314"></a><span class="lineno">  314</span>       <span class="keywordflow">if</span>(lasReader.isCompressed())</div>
+<div class="line"><a name="l00315"></a><span class="lineno">  315</span>     cout << <span class="stringliteral">"Reading compressed point cloud "</span> << input_opt[iinput]<< endl;</div>
+<div class="line"><a name="l00316"></a><span class="lineno">  316</span>       <span class="keywordflow">else</span></div>
+<div class="line"><a name="l00317"></a><span class="lineno">  317</span>     cout << <span class="stringliteral">"Reading uncompressed point cloud "</span> << input_opt[iinput] << endl;</div>
+<div class="line"><a name="l00318"></a><span class="lineno">  318</span>     }</div>
+<div class="line"><a name="l00319"></a><span class="lineno">  319</span>     <span class="comment">//set bounding filter</span></div>
+<div class="line"><a name="l00320"></a><span class="lineno">  320</span>     <span class="comment">// lasReader.addBoundsFilter(minULX,maxULY,maxLRX,minLRY);</span></div>
+<div class="line"><a name="l00321"></a><span class="lineno">  321</span>     <span class="comment">//set returns filter</span></div>
+<div class="line"><a name="l00322"></a><span class="lineno">  322</span>     <span class="keywordflow">if</span>(returns_opt.size())</div>
+<div class="line"><a name="l00323"></a><span class="lineno">  323</span>       lasReader.addReturnsFilter(returns_opt);</div>
+<div class="line"><a name="l00324"></a><span class="lineno">  324</span>     <span class="keywordflow">if</span>(classes_opt.size())</div>
+<div class="line"><a name="l00325"></a><span class="lineno">  325</span>       lasReader.addClassFilter(classes_opt);</div>
+<div class="line"><a name="l00326"></a><span class="lineno">  326</span>     lasReader.setFilters();</div>
+<div class="line"><a name="l00327"></a><span class="lineno">  327</span> </div>
+<div class="line"><a name="l00328"></a><span class="lineno">  328</span>     <span class="keywordflow">if</span>(attribute_opt[0]!=<span class="stringliteral">"z"</span>){</div>
+<div class="line"><a name="l00329"></a><span class="lineno">  329</span>       vector<boost::uint16_t> returnsVector;</div>
+<div class="line"><a name="l00330"></a><span class="lineno">  330</span>       vector<string>::iterator ait=attribute_opt.begin();</div>
+<div class="line"><a name="l00331"></a><span class="lineno">  331</span>       <span class="keywordflow">while</span>(ait!=attribute_opt.end()){</div>
+<div class="line"><a name="l00332"></a><span class="lineno">  332</span>         <span class="keywordflow">if</span>(*ait==<span class="stringliteral">"intensity"</span>){</div>
 <div class="line"><a name="l00333"></a><span class="lineno">  333</span>           <span class="keywordflow">if</span>(verbose_opt[0])</div>
-<div class="line"><a name="l00334"></a><span class="lineno">  334</span>             std::cout << <span class="stringliteral">"writing number of returns"</span> << std::endl;</div>
+<div class="line"><a name="l00334"></a><span class="lineno">  334</span>             std::cout << <span class="stringliteral">"writing intensity"</span> << std::endl;</div>
 <div class="line"><a name="l00335"></a><span class="lineno">  335</span>           ++ait;</div>
 <div class="line"><a name="l00336"></a><span class="lineno">  336</span>         }</div>
-<div class="line"><a name="l00337"></a><span class="lineno">  337</span>         <span class="keywordflow">else</span></div>
-<div class="line"><a name="l00338"></a><span class="lineno">  338</span>           attribute_opt.erase(ait);</div>
-<div class="line"><a name="l00339"></a><span class="lineno">  339</span>       }</div>
-<div class="line"><a name="l00340"></a><span class="lineno">  340</span>     }</div>
-<div class="line"><a name="l00341"></a><span class="lineno">  341</span>     liblas::Point thePoint(&(lasReader.getHeader()));</div>
-<div class="line"><a name="l00342"></a><span class="lineno">  342</span>     <span class="keywordflow">while</span>(lasReader.readNextPoint(thePoint)){</div>
-<div class="line"><a name="l00343"></a><span class="lineno">  343</span>       progress=<span class="keyword">static_cast<</span><span class="keywordtype">float</span><span class="keyword">></span>(ipoint)/totalPoints;</div>
-<div class="line"><a name="l00344"></a><span class="lineno">  344</span>       pfnProgress(progress,pszMessage,pProgressArg);</div>
-<div class="line"><a name="l00345"></a><span class="lineno">  345</span>       <span class="keywordflow">if</span>(verbose_opt[0]>1)</div>
-<div class="line"><a name="l00346"></a><span class="lineno">  346</span>         cout << <span class="stringliteral">"reading point "</span> << ipoint << endl;</div>
-<div class="line"><a name="l00347"></a><span class="lineno">  347</span>       <span class="keywordflow">if</span>(thePoint.GetX()<minULX||thePoint.GetX()>=maxLRX||thePoint.GetY()>=maxULY||thePoint.GetY()<minLRY)</div>
-<div class="line"><a name="l00348"></a><span class="lineno">  348</span>         <span class="keywordflow">continue</span>;</div>
-<div class="line"><a name="l00349"></a><span class="lineno">  349</span>       <span class="keywordflow">if</span>((filter_opt[0]==<span class="stringliteral">"single"</span>)&&(thePoint.GetNumberOfReturns()!=1))</div>
-<div class="line"><a name="l00350"></a><span class="lineno">  350</span>         <span class="keywordflow">continue</span>;</div>
-<div class="line"><a name="l00351"></a><span class="lineno">  351</span>       <span class="keywordflow">if</span>((filter_opt[0]==<span class="stringliteral">"multiple"</span>)&&(thePoint.GetNumberOfReturns()<2))</div>
-<div class="line"><a name="l00352"></a><span class="lineno">  352</span>         <span class="keywordflow">continue</span>;</div>
-<div class="line"><a name="l00353"></a><span class="lineno">  353</span>       <span class="keywordflow">if</span>((filter_opt[0]==<span class="stringliteral">"last"</span>)&&(thePoint.GetReturnNumber()!=thePoint.GetNumberOfReturns()))</div>
-<div class="line"><a name="l00354"></a><span class="lineno">  354</span>     <span class="keywordflow">continue</span>;</div>
-<div class="line"><a name="l00355"></a><span class="lineno">  355</span>       <span class="keywordflow">if</span>((filter_opt[0]==<span class="stringliteral">"first"</span>)&&(thePoint.GetReturnNumber()!=1))</div>
-<div class="line"><a name="l00356"></a><span class="lineno">  356</span>     <span class="keywordflow">continue</span>;</div>
-<div class="line"><a name="l00357"></a><span class="lineno">  357</span>       <span class="keywordtype">double</span> dcol,drow;</div>
-<div class="line"><a name="l00358"></a><span class="lineno">  358</span>       outputWriter.geo2image(thePoint.GetX(),thePoint.GetY(),dcol,drow);</div>
-<div class="line"><a name="l00359"></a><span class="lineno">  359</span>       <span class="keywordtype">int</span> icol=<span class="keyword">static_cast<</span><span class="keywordtype">int</span><span class="keyword">></span>(dcol);</div>
-<div class="line"><a name="l00360"></a><span class="lineno">  360</span>       <span class="keywordtype">int</span> irow=<span class="keyword">static_cast<</span><span class="keywordtype">int</span><span class="keyword">></span>(drow);</div>
-<div class="line"><a name="l00361"></a><span class="lineno">  361</span>       <span class="keywordflow">if</span>(irow<0||irow>=nrow){</div>
-<div class="line"><a name="l00362"></a><span class="lineno">  362</span>     <span class="comment">// //test</span></div>
-<div class="line"><a name="l00363"></a><span class="lineno">  363</span>     <span class="comment">// cout << "Error: thePoint.GetX(),thePoint.GetY(),dcol,drow" << thePoint.GetX() << ", " << thePoint.GetY() << ", " << dcol << ", " << drow << endl;</span></div>
-<div class="line"><a name="l00364"></a><span class="lineno">  364</span>     <span class="keywordflow">continue</span>;</div>
-<div class="line"><a name="l00365"></a><span class="lineno">  365</span>       }</div>
-<div class="line"><a name="l00366"></a><span class="lineno">  366</span>       <span class="keywordflow">if</span>(icol<0||icol>=ncol){</div>
-<div class="line"><a name="l00367"></a><span class="lineno">  367</span>     <span class="comment">// //test</span></div>
-<div class="line"><a name="l00368"></a><span class="lineno">  368</span>     <span class="comment">// cout << "Error: thePoint.GetX(),thePoint.GetY(),dcol,drow" << thePoint.GetX() << ", " << thePoint.GetY() << ", " << dcol << ", " << drow << endl;</span></div>
+<div class="line"><a name="l00337"></a><span class="lineno">  337</span>         <span class="keywordflow">if</span>(*ait==<span class="stringliteral">"angle"</span>){</div>
+<div class="line"><a name="l00338"></a><span class="lineno">  338</span>           <span class="keywordflow">if</span>(verbose_opt[0])</div>
+<div class="line"><a name="l00339"></a><span class="lineno">  339</span>             std::cout << <span class="stringliteral">"writing angle"</span> << std::endl;</div>
+<div class="line"><a name="l00340"></a><span class="lineno">  340</span>           ++ait;</div>
+<div class="line"><a name="l00341"></a><span class="lineno">  341</span>         }</div>
+<div class="line"><a name="l00342"></a><span class="lineno">  342</span>         <span class="keywordflow">else</span> <span class="keywordflow">if</span>(*ait==<span class="stringliteral">"return"</span>){</div>
+<div class="line"><a name="l00343"></a><span class="lineno">  343</span>           <span class="keywordflow">if</span>(verbose_opt[0])</div>
+<div class="line"><a name="l00344"></a><span class="lineno">  344</span>             std::cout << <span class="stringliteral">"writing return number"</span> << std::endl;</div>
+<div class="line"><a name="l00345"></a><span class="lineno">  345</span>           ++ait;</div>
+<div class="line"><a name="l00346"></a><span class="lineno">  346</span>         }</div>
+<div class="line"><a name="l00347"></a><span class="lineno">  347</span>         <span class="keywordflow">else</span> <span class="keywordflow">if</span>(*ait==<span class="stringliteral">"nreturn"</span>){</div>
+<div class="line"><a name="l00348"></a><span class="lineno">  348</span>           <span class="keywordflow">if</span>(verbose_opt[0])</div>
+<div class="line"><a name="l00349"></a><span class="lineno">  349</span>             std::cout << <span class="stringliteral">"writing number of returns"</span> << std::endl;</div>
+<div class="line"><a name="l00350"></a><span class="lineno">  350</span>           ++ait;</div>
+<div class="line"><a name="l00351"></a><span class="lineno">  351</span>         }</div>
+<div class="line"><a name="l00352"></a><span class="lineno">  352</span>         <span class="keywordflow">else</span></div>
+<div class="line"><a name="l00353"></a><span class="lineno">  353</span>           attribute_opt.erase(ait);</div>
+<div class="line"><a name="l00354"></a><span class="lineno">  354</span>       }</div>
+<div class="line"><a name="l00355"></a><span class="lineno">  355</span>     }</div>
+<div class="line"><a name="l00356"></a><span class="lineno">  356</span>     liblas::Point thePoint(&(lasReader.getHeader()));</div>
+<div class="line"><a name="l00357"></a><span class="lineno">  357</span>     <span class="keywordflow">while</span>(lasReader.readNextPoint(thePoint)){</div>
+<div class="line"><a name="l00358"></a><span class="lineno">  358</span>       progress=<span class="keyword">static_cast<</span><span class="keywordtype">float</span><span class="keyword">></span>(ipoint)/totalPoints;</div>
+<div class="line"><a name="l00359"></a><span class="lineno">  359</span>       pfnProgress(progress,pszMessage,pProgressArg);</div>
+<div class="line"><a name="l00360"></a><span class="lineno">  360</span>       <span class="keywordflow">if</span>(verbose_opt[0]>1)</div>
+<div class="line"><a name="l00361"></a><span class="lineno">  361</span>         cout << <span class="stringliteral">"reading point "</span> << ipoint << endl;</div>
+<div class="line"><a name="l00362"></a><span class="lineno">  362</span>       <span class="keywordflow">if</span>(thePoint.GetX()<minULX||thePoint.GetX()>=maxLRX||thePoint.GetY()>=maxULY||thePoint.GetY()<minLRY)</div>
+<div class="line"><a name="l00363"></a><span class="lineno">  363</span>         <span class="keywordflow">continue</span>;</div>
+<div class="line"><a name="l00364"></a><span class="lineno">  364</span>       <span class="keywordflow">if</span>((filter_opt[0]==<span class="stringliteral">"single"</span>)&&(thePoint.GetNumberOfReturns()!=1))</div>
+<div class="line"><a name="l00365"></a><span class="lineno">  365</span>         <span class="keywordflow">continue</span>;</div>
+<div class="line"><a name="l00366"></a><span class="lineno">  366</span>       <span class="keywordflow">if</span>((filter_opt[0]==<span class="stringliteral">"multiple"</span>)&&(thePoint.GetNumberOfReturns()<2))</div>
+<div class="line"><a name="l00367"></a><span class="lineno">  367</span>         <span class="keywordflow">continue</span>;</div>
+<div class="line"><a name="l00368"></a><span class="lineno">  368</span>       <span class="keywordflow">if</span>((filter_opt[0]==<span class="stringliteral">"last"</span>)&&(thePoint.GetReturnNumber()!=thePoint.GetNumberOfReturns()))</div>
 <div class="line"><a name="l00369"></a><span class="lineno">  369</span>     <span class="keywordflow">continue</span>;</div>
-<div class="line"><a name="l00370"></a><span class="lineno">  370</span>       }</div>
-<div class="line"><a name="l00371"></a><span class="lineno">  371</span>       assert(irow>=0);</div>
-<div class="line"><a name="l00372"></a><span class="lineno">  372</span>       assert(irow<nrow);</div>
-<div class="line"><a name="l00373"></a><span class="lineno">  373</span>       assert(icol>=0);</div>
-<div class="line"><a name="l00374"></a><span class="lineno">  374</span>       assert(icol<ncol);</div>
-<div class="line"><a name="l00375"></a><span class="lineno">  375</span>       <span class="keywordflow">if</span>(composite_opt[0]==<span class="stringliteral">"number"</span>)</div>
-<div class="line"><a name="l00376"></a><span class="lineno">  376</span>         outputData[irow][icol]+=1;</div>
-<div class="line"><a name="l00377"></a><span class="lineno">  377</span>       <span class="keywordflow">else</span> <span class="keywordflow">if</span>(attribute_opt[0]==<span class="stringliteral">"z"</span>)</div>
-<div class="line"><a name="l00378"></a><span class="lineno">  378</span>         inputData[irow][icol].push_back(thePoint.GetZ());</div>
-<div class="line"><a name="l00379"></a><span class="lineno">  379</span>       <span class="keywordflow">else</span> <span class="keywordflow">if</span>(attribute_opt[0]==<span class="stringliteral">"intensity"</span>)</div>
-<div class="line"><a name="l00380"></a><span class="lineno">  380</span>         inputData[irow][icol].push_back(thePoint.GetIntensity());</div>
-<div class="line"><a name="l00381"></a><span class="lineno">  381</span>       <span class="keywordflow">else</span> <span class="keywordflow">if</span>(attribute_opt[0]==<span class="stringliteral">"return"</span>)</div>
-<div class="line"><a name="l00382"></a><span class="lineno">  382</span>         inputData[irow][icol].push_back(thePoint.GetReturnNumber());</div>
-<div class="line"><a name="l00383"></a><span class="lineno">  383</span>       <span class="keywordflow">else</span> <span class="keywordflow">if</span>(attribute_opt[0]==<span class="stringliteral">"nreturn"</span>)</div>
-<div class="line"><a name="l00384"></a><span class="lineno">  384</span>         inputData[irow][icol].push_back(thePoint.GetNumberOfReturns());</div>
-<div class="line"><a name="l00385"></a><span class="lineno">  385</span>       <span class="keywordflow">else</span>{</div>
-<div class="line"><a name="l00386"></a><span class="lineno">  386</span>         std::string errorString=<span class="stringliteral">"attribute not supported"</span>;</div>
-<div class="line"><a name="l00387"></a><span class="lineno">  387</span>         <span class="keywordflow">throw</span>(errorString);</div>
+<div class="line"><a name="l00370"></a><span class="lineno">  370</span>       <span class="keywordflow">if</span>((filter_opt[0]==<span class="stringliteral">"first"</span>)&&(thePoint.GetReturnNumber()!=1))</div>
+<div class="line"><a name="l00371"></a><span class="lineno">  371</span>     <span class="keywordflow">continue</span>;</div>
+<div class="line"><a name="l00372"></a><span class="lineno">  372</span>       <span class="keywordflow">if</span>(angle_min_opt.size()){</div>
+<div class="line"><a name="l00373"></a><span class="lineno">  373</span>     <span class="keywordflow">if</span>(angle_min_opt[0]>thePoint.GetScanAngleRank())</div>
+<div class="line"><a name="l00374"></a><span class="lineno">  374</span>       <span class="keywordflow">continue</span>;</div>
+<div class="line"><a name="l00375"></a><span class="lineno">  375</span>       }</div>
+<div class="line"><a name="l00376"></a><span class="lineno">  376</span>       <span class="keywordflow">if</span>(angle_max_opt.size()){</div>
+<div class="line"><a name="l00377"></a><span class="lineno">  377</span>     <span class="keywordflow">if</span>(angle_max_opt[0]<thePoint.GetScanAngleRank())</div>
+<div class="line"><a name="l00378"></a><span class="lineno">  378</span>       <span class="keywordflow">continue</span>;</div>
+<div class="line"><a name="l00379"></a><span class="lineno">  379</span>       }</div>
+<div class="line"><a name="l00380"></a><span class="lineno">  380</span>       <span class="keywordtype">double</span> dcol,drow;</div>
+<div class="line"><a name="l00381"></a><span class="lineno">  381</span>       outputWriter.geo2image(thePoint.GetX(),thePoint.GetY(),dcol,drow);</div>
+<div class="line"><a name="l00382"></a><span class="lineno">  382</span>       <span class="keywordtype">int</span> icol=<span class="keyword">static_cast<</span><span class="keywordtype">int</span><span class="keyword">></span>(dcol);</div>
+<div class="line"><a name="l00383"></a><span class="lineno">  383</span>       <span class="keywordtype">int</span> irow=<span class="keyword">static_cast<</span><span class="keywordtype">int</span><span class="keyword">></span>(drow);</div>
+<div class="line"><a name="l00384"></a><span class="lineno">  384</span>       <span class="keywordflow">if</span>(irow<0||irow>=nrow){</div>
+<div class="line"><a name="l00385"></a><span class="lineno">  385</span>     <span class="comment">// //test</span></div>
+<div class="line"><a name="l00386"></a><span class="lineno">  386</span>     <span class="comment">// cout << "Error: thePoint.GetX(),thePoint.GetY(),dcol,drow" << thePoint.GetX() << ", " << thePoint.GetY() << ", " << dcol << ", " << drow << endl;</span></div>
+<div class="line"><a name="l00387"></a><span class="lineno">  387</span>     <span class="keywordflow">continue</span>;</div>
 <div class="line"><a name="l00388"></a><span class="lineno">  388</span>       }</div>
-<div class="line"><a name="l00389"></a><span class="lineno">  389</span>       ++ipoint;</div>
-<div class="line"><a name="l00390"></a><span class="lineno">  390</span>     }</div>
-<div class="line"><a name="l00391"></a><span class="lineno">  391</span>     <span class="keywordflow">if</span>(verbose_opt[0])</div>
-<div class="line"><a name="l00392"></a><span class="lineno">  392</span>       std::cout << <span class="stringliteral">"number of points: "</span> << ipoint << std::endl;</div>
-<div class="line"><a name="l00393"></a><span class="lineno">  393</span>     lasReader.close();</div>
-<div class="line"><a name="l00394"></a><span class="lineno">  394</span>   }</div>
-<div class="line"><a name="l00395"></a><span class="lineno">  395</span>   progress=1;</div>
-<div class="line"><a name="l00396"></a><span class="lineno">  396</span>   pfnProgress(progress,pszMessage,pProgressArg);</div>
-<div class="line"><a name="l00397"></a><span class="lineno">  397</span> </div>
-<div class="line"><a name="l00398"></a><span class="lineno">  398</span>   std::cout << <span class="stringliteral">"processing LiDAR points"</span> << std::endl;</div>
-<div class="line"><a name="l00399"></a><span class="lineno">  399</span>   progress=0;</div>
-<div class="line"><a name="l00400"></a><span class="lineno">  400</span>   pfnProgress(progress,pszMessage,pProgressArg);</div>
-<div class="line"><a name="l00401"></a><span class="lineno">  401</span>   <a class="code" href="classstatfactory_1_1StatFactory.html">statfactory::StatFactory</a> stat;</div>
-<div class="line"><a name="l00402"></a><span class="lineno">  402</span>   <span class="comment">//fill inputData in outputData</span></div>
-<div class="line"><a name="l00403"></a><span class="lineno">  403</span>   <span class="comment">// if(composite_opt[0]=="profile"){</span></div>
-<div class="line"><a name="l00404"></a><span class="lineno">  404</span>     <span class="comment">// assert(postFilter_opt[0]=="none");</span></div>
-<div class="line"><a name="l00405"></a><span class="lineno">  405</span>     <span class="comment">// for(int iband=0;iband<nband;++iband)</span></div>
-<div class="line"><a name="l00406"></a><span class="lineno">  406</span>       <span class="comment">// outputProfile[iband].resize(nrow,ncol);</span></div>
-<div class="line"><a name="l00407"></a><span class="lineno">  407</span>   <span class="comment">// }</span></div>
-<div class="line"><a name="l00408"></a><span class="lineno">  408</span>   <span class="keywordflow">for</span>(<span class="keywordtype">int</span> irow=0;irow<nrow;++irow){</div>
-<div class="line"><a name="l00409"></a><span class="lineno">  409</span>     <span class="keywordflow">if</span>(composite_opt[0]==<span class="stringliteral">"number"</span>)</div>
-<div class="line"><a name="l00410"></a><span class="lineno">  410</span>       <span class="keywordflow">continue</span>;<span class="comment">//outputData already set</span></div>
-<div class="line"><a name="l00411"></a><span class="lineno">  411</span>     <a class="code" href="classVector2d.html">Vector2d<double></a> outputProfile(nband,ncol);</div>
-<div class="line"><a name="l00412"></a><span class="lineno">  412</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> icol=0;icol<ncol;++icol){</div>
-<div class="line"><a name="l00413"></a><span class="lineno">  413</span>       std::vector<double> profile;</div>
-<div class="line"><a name="l00414"></a><span class="lineno">  414</span>       <span class="keywordflow">if</span>(!inputData[irow][icol].size())</div>
-<div class="line"><a name="l00415"></a><span class="lineno">  415</span>         outputData[irow][icol]=(<span class="keyword">static_cast<</span><span class="keywordtype">double</span><span class="keyword">></span>((nodata_opt[0])));</div>
-<div class="line"><a name="l00416"></a><span class="lineno">  416</span>       <span class="keywordflow">else</span>{</div>
-<div class="line"><a name="l00417"></a><span class="lineno">  417</span>         <a class="code" href="classstatfactory_1_1StatFactory.html">statfactory::StatFactory</a> stat;</div>
-<div class="line"><a name="l00418"></a><span class="lineno">  418</span>         <span class="keywordflow">if</span>(composite_opt[0]==<span class="stringliteral">"min"</span>)</div>
-<div class="line"><a name="l00419"></a><span class="lineno">  419</span>           outputData[irow][icol]=stat.mymin(inputData[irow][icol]);</div>
-<div class="line"><a name="l00420"></a><span class="lineno">  420</span>         <span class="keywordflow">else</span> <span class="keywordflow">if</span>(composite_opt[0]==<span class="stringliteral">"max"</span>)</div>
-<div class="line"><a name="l00421"></a><span class="lineno">  421</span>           outputData[irow][icol]=stat.mymax(inputData[irow][icol]);</div>
-<div class="line"><a name="l00422"></a><span class="lineno">  422</span>         <span class="keywordflow">else</span> <span class="keywordflow">if</span>(composite_opt[0]==<span class="stringliteral">"median"</span>)</div>
-<div class="line"><a name="l00423"></a><span class="lineno">  423</span>           outputData[irow][icol]=stat.median(inputData[irow][icol]);</div>
-<div class="line"><a name="l00424"></a><span class="lineno">  424</span>         <span class="keywordflow">else</span> <span class="keywordflow">if</span>(composite_opt[0]==<span class="stringliteral">"percentile"</span>)</div>
-<div class="line"><a name="l00425"></a><span class="lineno">  425</span>           outputData[irow][icol]=stat.percentile(inputData[irow][icol],inputData[irow][icol].begin(),inputData[irow][icol].end(),percentile_opt[0]);</div>
-<div class="line"><a name="l00426"></a><span class="lineno">  426</span>         <span class="keywordflow">else</span> <span class="keywordflow">if</span>(composite_opt[0]==<span class="stringliteral">"mean"</span>)</div>
-<div class="line"><a name="l00427"></a><span class="lineno">  427</span>           outputData[irow][icol]=stat.mean(inputData[irow][icol]);</div>
-<div class="line"><a name="l00428"></a><span class="lineno">  428</span>         <span class="keywordflow">else</span> <span class="keywordflow">if</span>(composite_opt[0]==<span class="stringliteral">"sum"</span>)</div>
-<div class="line"><a name="l00429"></a><span class="lineno">  429</span>           outputData[irow][icol]=stat.sum(inputData[irow][icol]);</div>
-<div class="line"><a name="l00430"></a><span class="lineno">  430</span>         <span class="keywordflow">else</span> <span class="keywordflow">if</span>(composite_opt[0]==<span class="stringliteral">"first"</span>)</div>
-<div class="line"><a name="l00431"></a><span class="lineno">  431</span>           outputData[irow][icol]=inputData[irow][icol][0];</div>
-<div class="line"><a name="l00432"></a><span class="lineno">  432</span>         <span class="keywordflow">else</span> <span class="keywordflow">if</span>(composite_opt[0]==<span class="stringliteral">"last"</span>)</div>
-<div class="line"><a name="l00433"></a><span class="lineno">  433</span>           outputData[irow][icol]=inputData[irow][icol].back();</div>
-<div class="line"><a name="l00434"></a><span class="lineno">  434</span>         <span class="keywordflow">else</span> <span class="keywordflow">if</span>(composite_opt[0]==<span class="stringliteral">"profile"</span>){</div>
-<div class="line"><a name="l00435"></a><span class="lineno">  435</span>           <span class="keywordflow">if</span>(inputData[irow][icol].size()<2){</div>
-<div class="line"><a name="l00436"></a><span class="lineno">  436</span>             <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iband=0;iband<nband;++iband)</div>
-<div class="line"><a name="l00437"></a><span class="lineno">  437</span>               outputProfile[iband][icol]=static_cast<double>(nodata_opt[0]);</div>
-<div class="line"><a name="l00438"></a><span class="lineno">  438</span>             <span class="keywordflow">continue</span>;</div>
-<div class="line"><a name="l00439"></a><span class="lineno">  439</span>           }</div>
-<div class="line"><a name="l00440"></a><span class="lineno">  440</span>           <span class="keywordtype">double</span> min=0;</div>
-<div class="line"><a name="l00441"></a><span class="lineno">  441</span>           <span class="keywordtype">double</span> max=0;</div>
-<div class="line"><a name="l00442"></a><span class="lineno">  442</span>           stat.minmax(inputData[irow][icol],inputData[irow][icol].begin(),inputData[irow][icol].end(),min,max);</div>
-<div class="line"><a name="l00443"></a><span class="lineno">  443</span>           <span class="keywordflow">if</span>(verbose_opt[0])</div>
-<div class="line"><a name="l00444"></a><span class="lineno">  444</span>             std::cout << <span class="stringliteral">"min,max: "</span> << min << <span class="stringliteral">","</span> << max << std::endl;</div>
-<div class="line"><a name="l00445"></a><span class="lineno">  445</span>           <span class="keywordflow">if</span>(max>min){</div>
-<div class="line"><a name="l00446"></a><span class="lineno">  446</span>             stat.percentiles(inputData[irow][icol],inputData[irow][icol].begin(),inputData[irow][icol].end(),profile,nband,min,max);</div>
-<div class="line"><a name="l00447"></a><span class="lineno">  447</span>             assert(profile.size()==nband);</div>
-<div class="line"><a name="l00448"></a><span class="lineno">  448</span>             <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iband=0;iband<nband;++iband)</div>
-<div class="line"><a name="l00449"></a><span class="lineno">  449</span>               outputProfile[iband][icol]=profile[iband];</div>
-<div class="line"><a name="l00450"></a><span class="lineno">  450</span>           }</div>
-<div class="line"><a name="l00451"></a><span class="lineno">  451</span>           <span class="keywordflow">else</span>{</div>
-<div class="line"><a name="l00452"></a><span class="lineno">  452</span>             <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iband=0;iband<nband;++iband)</div>
-<div class="line"><a name="l00453"></a><span class="lineno">  453</span>               outputProfile[iband][icol]=max;</div>
-<div class="line"><a name="l00454"></a><span class="lineno">  454</span>           }</div>
-<div class="line"><a name="l00455"></a><span class="lineno">  455</span>         }</div>
-<div class="line"><a name="l00456"></a><span class="lineno">  456</span>         <span class="keywordflow">else</span>{</div>
-<div class="line"><a name="l00457"></a><span class="lineno">  457</span>           std::cout << <span class="stringliteral">"Error: composite_opt "</span> << composite_opt[0] << <span class="stringliteral">" not supported"</span> << std::endl;</div>
-<div class="line"><a name="l00458"></a><span class="lineno">  458</span>           exit(2);</div>
-<div class="line"><a name="l00459"></a><span class="lineno">  459</span>         }</div>
-<div class="line"><a name="l00460"></a><span class="lineno">  460</span>       }</div>
-<div class="line"><a name="l00461"></a><span class="lineno">  461</span>     }</div>
-<div class="line"><a name="l00462"></a><span class="lineno">  462</span>     <span class="keywordflow">if</span>(composite_opt[0]==<span class="stringliteral">"profile"</span>){</div>
-<div class="line"><a name="l00463"></a><span class="lineno">  463</span>       <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iband=0;iband<nband;++iband){</div>
-<div class="line"><a name="l00464"></a><span class="lineno">  464</span>         <span class="comment">// assert(outputProfile[iband].size()==outputWriter.nrOfRow());</span></div>
-<div class="line"><a name="l00465"></a><span class="lineno">  465</span>         assert(outputProfile[iband].size()==outputWriter.nrOfCol());</div>
-<div class="line"><a name="l00466"></a><span class="lineno">  466</span>         <span class="keywordflow">try</span>{</div>
-<div class="line"><a name="l00467"></a><span class="lineno">  467</span>           outputWriter.writeData(outputProfile[iband],GDT_Float64,irow,iband);</div>
-<div class="line"><a name="l00468"></a><span class="lineno">  468</span>         }</div>
-<div class="line"><a name="l00469"></a><span class="lineno">  469</span>         <span class="keywordflow">catch</span>(std::string errorString){</div>
-<div class="line"><a name="l00470"></a><span class="lineno">  470</span>           cout << errorString << endl;</div>
-<div class="line"><a name="l00471"></a><span class="lineno">  471</span>           exit(1);</div>
-<div class="line"><a name="l00472"></a><span class="lineno">  472</span>         }</div>
-<div class="line"><a name="l00473"></a><span class="lineno">  473</span>       }</div>
-<div class="line"><a name="l00474"></a><span class="lineno">  474</span>     }</div>
-<div class="line"><a name="l00475"></a><span class="lineno">  475</span>     progress=<span class="keyword">static_cast<</span><span class="keywordtype">float</span><span class="keyword">></span>(irow)/outputWriter.nrOfRow();</div>
-<div class="line"><a name="l00476"></a><span class="lineno">  476</span>     pfnProgress(progress,pszMessage,pProgressArg);</div>
-<div class="line"><a name="l00477"></a><span class="lineno">  477</span>   }</div>
-<div class="line"><a name="l00478"></a><span class="lineno">  478</span>   progress=1;</div>
-<div class="line"><a name="l00479"></a><span class="lineno">  479</span>   pfnProgress(progress,pszMessage,pProgressArg);</div>
-<div class="line"><a name="l00480"></a><span class="lineno">  480</span>   inputData.clear();<span class="comment">//clean up memory</span></div>
-<div class="line"><a name="l00481"></a><span class="lineno">  481</span>   <span class="comment">//apply post filter</span></div>
-<div class="line"><a name="l00482"></a><span class="lineno">  482</span>   <span class="comment">// std::cout << "Applying post processing filter: " << postFilter_opt[0] << std::endl;</span></div>
-<div class="line"><a name="l00483"></a><span class="lineno">  483</span>   <span class="comment">// if(postFilter_opt[0]=="etew_min"){</span></div>
-<div class="line"><a name="l00484"></a><span class="lineno">  484</span>   <span class="comment">//   if(composite_opt[0]!="min")</span></div>
-<div class="line"><a name="l00485"></a><span class="lineno">  485</span>   <span class="comment">//     std::cout << "Warning: composite option is not set to min!" << std::endl;</span></div>
-<div class="line"><a name="l00486"></a><span class="lineno">  486</span>   <span class="comment">//   //Elevation Threshold with Expand Window (ETEW) Filter (p.73 frmo Airborne LIDAR Data Processing and Analysis Tools ALDPAT 1.0)</span></div>
-<div class="line"><a name="l00487"></a><span class="lineno">  487</span>   <span class="comment">//   //first iteration is performed assuming only minima are selected using options -fir all -comp min</span></div>
-<div class="line"><a name="l00488"></a><span class="lineno">  488</span>   <span class="comment">//   unsigned long int nchange=1;</span></div>
-<div class="line"><a name="l00489"></a><span class="lineno">  489</span>   <span class="comment">//   //increase cells and thresholds until no points from the previous iteration are discarded.</span></div>
-<div class="line"><a name="l00490"></a><span class="lineno">  490</span>   <span class="comment">//   int dimx=dimx_opt[0];</span></div>
-<div class="line"><a name="l00491"></a><span class="lineno">  491</span>   <span class="comment">//   int dimy=dimy_opt[0];</span></div>
-<div class="line"><a name="l00492"></a><span class="lineno">  492</span>   <span class="comment">//   filter2d::Filter2d morphFilter;</span></div>
-<div class="line"><a name="l00493"></a><span class="lineno">  493</span>   <span class="comment">//   // morphFilter.setNoValue(0);</span></div>
-<div class="line"><a name="l00494"></a><span class="lineno">  494</span>   <span class="comment">//   Vector2d<float> currentOutput=outputData;</span></div>
-<div class="line"><a name="l00495"></a><span class="lineno">  495</span>   <span class="comment">//   int iteration=1;</span></div>
-<div class="line"><a name="l00496"></a><span class="lineno">  496</span>   <span class="comment">//   while(nchange&&iteration<=maxIter_opt[0]){</span></div>
-<div class="line"><a name="l00497"></a><span class="lineno">  497</span>   <span class="comment">//     double hThreshold=maxSlope_opt[0]*dimx;</span></div>
-<div class="line"><a name="l00498"></a><span class="lineno">  498</span>   <span class="comment">//     Vector2d<float> newOutput;</span></div>
-<div class="line"><a name="l00499"></a><span class="lineno">  499</span>   <span class="comment">//     nchange=morphFilter.morphology(currentOutput,newOutput,"erode",dimx,dimy,disc_opt[0],hThreshold);</span></div>
-<div class="line"><a name="l00500"></a><span class="lineno">  500</span>   <span class="comment">//     currentOutput=newOutput;</span></div>
-<div class="line"><a name="l00501"></a><span class="lineno">  501</span>   <span class="comment">//     dimx+=2;//change from theory: originally double cellCize</span></div>
-<div class="line"><a name="l00502"></a><span class="lineno">  502</span>   <span class="comment">//     dimy+=2;//change from theory: originally double cellCize</span></div>
-<div class="line"><a name="l00503"></a><span class="lineno">  503</span>   <span class="comment">//     std::cout << "iteration " << iteration << ": " << nchange << " pixels changed" << std::endl;</span></div>
-<div class="line"><a name="l00504"></a><span class="lineno">  504</span>   <span class="comment">//     ++iteration;</span></div>
-<div class="line"><a name="l00505"></a><span class="lineno">  505</span>   <span class="comment">//   }</span></div>
-<div class="line"><a name="l00506"></a><span class="lineno">  506</span>   <span class="comment">//   outputData=currentOutput;</span></div>
-<div class="line"><a name="l00507"></a><span class="lineno">  507</span>   <span class="comment">// }    </span></div>
-<div class="line"><a name="l00508"></a><span class="lineno">  508</span>   <span class="comment">// else if(postFilter_opt[0]=="promorph"||postFilter_opt[0]=="bunting"){</span></div>
+<div class="line"><a name="l00389"></a><span class="lineno">  389</span>       <span class="keywordflow">if</span>(icol<0||icol>=ncol){</div>
+<div class="line"><a name="l00390"></a><span class="lineno">  390</span>     <span class="comment">// //test</span></div>
+<div class="line"><a name="l00391"></a><span class="lineno">  391</span>     <span class="comment">// cout << "Error: thePoint.GetX(),thePoint.GetY(),dcol,drow" << thePoint.GetX() << ", " << thePoint.GetY() << ", " << dcol << ", " << drow << endl;</span></div>
+<div class="line"><a name="l00392"></a><span class="lineno">  392</span>     <span class="keywordflow">continue</span>;</div>
+<div class="line"><a name="l00393"></a><span class="lineno">  393</span>       }</div>
+<div class="line"><a name="l00394"></a><span class="lineno">  394</span>       assert(irow>=0);</div>
+<div class="line"><a name="l00395"></a><span class="lineno">  395</span>       assert(irow<nrow);</div>
+<div class="line"><a name="l00396"></a><span class="lineno">  396</span>       assert(icol>=0);</div>
+<div class="line"><a name="l00397"></a><span class="lineno">  397</span>       assert(icol<ncol);</div>
+<div class="line"><a name="l00398"></a><span class="lineno">  398</span>       <span class="keywordflow">if</span>(composite_opt[0]==<span class="stringliteral">"number"</span>)</div>
+<div class="line"><a name="l00399"></a><span class="lineno">  399</span>         outputData[irow][icol]+=1;</div>
+<div class="line"><a name="l00400"></a><span class="lineno">  400</span>       <span class="keywordflow">else</span> <span class="keywordflow">if</span>(attribute_opt[0]==<span class="stringliteral">"z"</span>)</div>
+<div class="line"><a name="l00401"></a><span class="lineno">  401</span>         inputData[irow][icol].push_back(thePoint.GetZ());</div>
+<div class="line"><a name="l00402"></a><span class="lineno">  402</span>       <span class="keywordflow">else</span> <span class="keywordflow">if</span>(attribute_opt[0]==<span class="stringliteral">"intensity"</span>)</div>
+<div class="line"><a name="l00403"></a><span class="lineno">  403</span>         inputData[irow][icol].push_back(thePoint.GetIntensity());</div>
+<div class="line"><a name="l00404"></a><span class="lineno">  404</span>       <span class="keywordflow">else</span> <span class="keywordflow">if</span>(attribute_opt[0]==<span class="stringliteral">"angle"</span>)</div>
+<div class="line"><a name="l00405"></a><span class="lineno">  405</span>         inputData[irow][icol].push_back(thePoint.GetScanAngleRank());</div>
+<div class="line"><a name="l00406"></a><span class="lineno">  406</span>       <span class="keywordflow">else</span> <span class="keywordflow">if</span>(attribute_opt[0]==<span class="stringliteral">"return"</span>)</div>
+<div class="line"><a name="l00407"></a><span class="lineno">  407</span>         inputData[irow][icol].push_back(thePoint.GetReturnNumber());</div>
+<div class="line"><a name="l00408"></a><span class="lineno">  408</span>       <span class="keywordflow">else</span> <span class="keywordflow">if</span>(attribute_opt[0]==<span class="stringliteral">"nreturn"</span>)</div>
+<div class="line"><a name="l00409"></a><span class="lineno">  409</span>         inputData[irow][icol].push_back(thePoint.GetNumberOfReturns());</div>
+<div class="line"><a name="l00410"></a><span class="lineno">  410</span>       <span class="keywordflow">else</span>{</div>
+<div class="line"><a name="l00411"></a><span class="lineno">  411</span>         std::string errorString=<span class="stringliteral">"attribute not supported"</span>;</div>
+<div class="line"><a name="l00412"></a><span class="lineno">  412</span>         <span class="keywordflow">throw</span>(errorString);</div>
+<div class="line"><a name="l00413"></a><span class="lineno">  413</span>       }</div>
+<div class="line"><a name="l00414"></a><span class="lineno">  414</span>       ++ipoint;</div>
+<div class="line"><a name="l00415"></a><span class="lineno">  415</span>     }</div>
+<div class="line"><a name="l00416"></a><span class="lineno">  416</span>     <span class="keywordflow">if</span>(verbose_opt[0])</div>
+<div class="line"><a name="l00417"></a><span class="lineno">  417</span>       std::cout << <span class="stringliteral">"number of points: "</span> << ipoint << std::endl;</div>
+<div class="line"><a name="l00418"></a><span class="lineno">  418</span>     lasReader.close();</div>
+<div class="line"><a name="l00419"></a><span class="lineno">  419</span>   }</div>
+<div class="line"><a name="l00420"></a><span class="lineno">  420</span>   progress=1;</div>
+<div class="line"><a name="l00421"></a><span class="lineno">  421</span>   pfnProgress(progress,pszMessage,pProgressArg);</div>
+<div class="line"><a name="l00422"></a><span class="lineno">  422</span> </div>
+<div class="line"><a name="l00423"></a><span class="lineno">  423</span>   std::cout << <span class="stringliteral">"processing LiDAR points"</span> << std::endl;</div>
+<div class="line"><a name="l00424"></a><span class="lineno">  424</span>   progress=0;</div>
+<div class="line"><a name="l00425"></a><span class="lineno">  425</span>   pfnProgress(progress,pszMessage,pProgressArg);</div>
+<div class="line"><a name="l00426"></a><span class="lineno">  426</span>   <a class="code" href="classstatfactory_1_1StatFactory.html">statfactory::StatFactory</a> stat;</div>
+<div class="line"><a name="l00427"></a><span class="lineno">  427</span>   <span class="comment">//fill inputData in outputData</span></div>
+<div class="line"><a name="l00428"></a><span class="lineno">  428</span>   <span class="comment">// if(composite_opt[0]=="profile"){</span></div>
+<div class="line"><a name="l00429"></a><span class="lineno">  429</span>     <span class="comment">// assert(postFilter_opt[0]=="none");</span></div>
+<div class="line"><a name="l00430"></a><span class="lineno">  430</span>     <span class="comment">// for(int iband=0;iband<nband;++iband)</span></div>
+<div class="line"><a name="l00431"></a><span class="lineno">  431</span>       <span class="comment">// outputProfile[iband].resize(nrow,ncol);</span></div>
+<div class="line"><a name="l00432"></a><span class="lineno">  432</span>   <span class="comment">// }</span></div>
+<div class="line"><a name="l00433"></a><span class="lineno">  433</span>   <span class="keywordflow">for</span>(<span class="keywordtype">int</span> irow=0;irow<nrow;++irow){</div>
+<div class="line"><a name="l00434"></a><span class="lineno">  434</span>     <span class="keywordflow">if</span>(composite_opt[0]==<span class="stringliteral">"number"</span>)</div>
+<div class="line"><a name="l00435"></a><span class="lineno">  435</span>       <span class="keywordflow">continue</span>;<span class="comment">//outputData already set</span></div>
+<div class="line"><a name="l00436"></a><span class="lineno">  436</span>     <a class="code" href="classVector2d.html">Vector2d<double></a> outputProfile(nband,ncol);</div>
+<div class="line"><a name="l00437"></a><span class="lineno">  437</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> icol=0;icol<ncol;++icol){</div>
+<div class="line"><a name="l00438"></a><span class="lineno">  438</span>       std::vector<double> profile;</div>
+<div class="line"><a name="l00439"></a><span class="lineno">  439</span>       <span class="keywordflow">if</span>(!inputData[irow][icol].size())</div>
+<div class="line"><a name="l00440"></a><span class="lineno">  440</span>         outputData[irow][icol]=(<span class="keyword">static_cast<</span><span class="keywordtype">double</span><span class="keyword">></span>((nodata_opt[0])));</div>
+<div class="line"><a name="l00441"></a><span class="lineno">  441</span>       <span class="keywordflow">else</span>{</div>
+<div class="line"><a name="l00442"></a><span class="lineno">  442</span>         <a class="code" href="classstatfactory_1_1StatFactory.html">statfactory::StatFactory</a> stat;</div>
+<div class="line"><a name="l00443"></a><span class="lineno">  443</span>         <span class="keywordflow">if</span>(composite_opt[0]==<span class="stringliteral">"min"</span>)</div>
+<div class="line"><a name="l00444"></a><span class="lineno">  444</span>           outputData[irow][icol]=stat.mymin(inputData[irow][icol]);</div>
+<div class="line"><a name="l00445"></a><span class="lineno">  445</span>         <span class="keywordflow">else</span> <span class="keywordflow">if</span>(composite_opt[0]==<span class="stringliteral">"max"</span>)</div>
+<div class="line"><a name="l00446"></a><span class="lineno">  446</span>           outputData[irow][icol]=stat.mymax(inputData[irow][icol]);</div>
+<div class="line"><a name="l00447"></a><span class="lineno">  447</span>         <span class="keywordflow">else</span> <span class="keywordflow">if</span>(composite_opt[0]==<span class="stringliteral">"median"</span>)</div>
+<div class="line"><a name="l00448"></a><span class="lineno">  448</span>           outputData[irow][icol]=stat.median(inputData[irow][icol]);</div>
+<div class="line"><a name="l00449"></a><span class="lineno">  449</span>         <span class="keywordflow">else</span> <span class="keywordflow">if</span>(composite_opt[0]==<span class="stringliteral">"percentile"</span>)</div>
+<div class="line"><a name="l00450"></a><span class="lineno">  450</span>           outputData[irow][icol]=stat.percentile(inputData[irow][icol],inputData[irow][icol].begin(),inputData[irow][icol].end(),percentile_opt[0]);</div>
+<div class="line"><a name="l00451"></a><span class="lineno">  451</span>         <span class="keywordflow">else</span> <span class="keywordflow">if</span>(composite_opt[0]==<span class="stringliteral">"mean"</span>)</div>
+<div class="line"><a name="l00452"></a><span class="lineno">  452</span>           outputData[irow][icol]=stat.mean(inputData[irow][icol]);</div>
+<div class="line"><a name="l00453"></a><span class="lineno">  453</span>         <span class="keywordflow">else</span> <span class="keywordflow">if</span>(composite_opt[0]==<span class="stringliteral">"sum"</span>)</div>
+<div class="line"><a name="l00454"></a><span class="lineno">  454</span>           outputData[irow][icol]=stat.sum(inputData[irow][icol]);</div>
+<div class="line"><a name="l00455"></a><span class="lineno">  455</span>         <span class="keywordflow">else</span> <span class="keywordflow">if</span>(composite_opt[0]==<span class="stringliteral">"first"</span>)</div>
+<div class="line"><a name="l00456"></a><span class="lineno">  456</span>           outputData[irow][icol]=inputData[irow][icol][0];</div>
+<div class="line"><a name="l00457"></a><span class="lineno">  457</span>         <span class="keywordflow">else</span> <span class="keywordflow">if</span>(composite_opt[0]==<span class="stringliteral">"last"</span>)</div>
+<div class="line"><a name="l00458"></a><span class="lineno">  458</span>           outputData[irow][icol]=inputData[irow][icol].back();</div>
+<div class="line"><a name="l00459"></a><span class="lineno">  459</span>         <span class="keywordflow">else</span> <span class="keywordflow">if</span>(composite_opt[0]==<span class="stringliteral">"profile"</span>){</div>
+<div class="line"><a name="l00460"></a><span class="lineno">  460</span>           <span class="keywordflow">if</span>(inputData[irow][icol].size()<2){</div>
+<div class="line"><a name="l00461"></a><span class="lineno">  461</span>             <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iband=0;iband<nband;++iband)</div>
+<div class="line"><a name="l00462"></a><span class="lineno">  462</span>               outputProfile[iband][icol]=static_cast<double>(nodata_opt[0]);</div>
+<div class="line"><a name="l00463"></a><span class="lineno">  463</span>             <span class="keywordflow">continue</span>;</div>
+<div class="line"><a name="l00464"></a><span class="lineno">  464</span>           }</div>
+<div class="line"><a name="l00465"></a><span class="lineno">  465</span>           <span class="keywordtype">double</span> min=0;</div>
+<div class="line"><a name="l00466"></a><span class="lineno">  466</span>           <span class="keywordtype">double</span> max=0;</div>
+<div class="line"><a name="l00467"></a><span class="lineno">  467</span>           stat.minmax(inputData[irow][icol],inputData[irow][icol].begin(),inputData[irow][icol].end(),min,max);</div>
+<div class="line"><a name="l00468"></a><span class="lineno">  468</span>           <span class="keywordflow">if</span>(verbose_opt[0])</div>
+<div class="line"><a name="l00469"></a><span class="lineno">  469</span>             std::cout << <span class="stringliteral">"min,max: "</span> << min << <span class="stringliteral">","</span> << max << std::endl;</div>
+<div class="line"><a name="l00470"></a><span class="lineno">  470</span>           <span class="keywordflow">if</span>(max>min){</div>
+<div class="line"><a name="l00471"></a><span class="lineno">  471</span>             stat.percentiles(inputData[irow][icol],inputData[irow][icol].begin(),inputData[irow][icol].end(),profile,nband,min,max);</div>
+<div class="line"><a name="l00472"></a><span class="lineno">  472</span>             assert(profile.size()==nband);</div>
+<div class="line"><a name="l00473"></a><span class="lineno">  473</span>             <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iband=0;iband<nband;++iband)</div>
+<div class="line"><a name="l00474"></a><span class="lineno">  474</span>               outputProfile[iband][icol]=profile[iband];</div>
+<div class="line"><a name="l00475"></a><span class="lineno">  475</span>           }</div>
+<div class="line"><a name="l00476"></a><span class="lineno">  476</span>           <span class="keywordflow">else</span>{</div>
+<div class="line"><a name="l00477"></a><span class="lineno">  477</span>             <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iband=0;iband<nband;++iband)</div>
+<div class="line"><a name="l00478"></a><span class="lineno">  478</span>               outputProfile[iband][icol]=max;</div>
+<div class="line"><a name="l00479"></a><span class="lineno">  479</span>           }</div>
+<div class="line"><a name="l00480"></a><span class="lineno">  480</span>         }</div>
+<div class="line"><a name="l00481"></a><span class="lineno">  481</span>         <span class="keywordflow">else</span>{</div>
+<div class="line"><a name="l00482"></a><span class="lineno">  482</span>           std::cout << <span class="stringliteral">"Error: composite_opt "</span> << composite_opt[0] << <span class="stringliteral">" not supported"</span> << std::endl;</div>
+<div class="line"><a name="l00483"></a><span class="lineno">  483</span>           exit(2);</div>
+<div class="line"><a name="l00484"></a><span class="lineno">  484</span>         }</div>
+<div class="line"><a name="l00485"></a><span class="lineno">  485</span>       }</div>
+<div class="line"><a name="l00486"></a><span class="lineno">  486</span>     }</div>
+<div class="line"><a name="l00487"></a><span class="lineno">  487</span>     <span class="keywordflow">if</span>(composite_opt[0]==<span class="stringliteral">"profile"</span>){</div>
+<div class="line"><a name="l00488"></a><span class="lineno">  488</span>       <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iband=0;iband<nband;++iband){</div>
+<div class="line"><a name="l00489"></a><span class="lineno">  489</span>         <span class="comment">// assert(outputProfile[iband].size()==outputWriter.nrOfRow());</span></div>
+<div class="line"><a name="l00490"></a><span class="lineno">  490</span>         assert(outputProfile[iband].size()==outputWriter.nrOfCol());</div>
+<div class="line"><a name="l00491"></a><span class="lineno">  491</span>         <span class="keywordflow">try</span>{</div>
+<div class="line"><a name="l00492"></a><span class="lineno">  492</span>           outputWriter.writeData(outputProfile[iband],GDT_Float64,irow,iband);</div>
+<div class="line"><a name="l00493"></a><span class="lineno">  493</span>         }</div>
+<div class="line"><a name="l00494"></a><span class="lineno">  494</span>         <span class="keywordflow">catch</span>(std::string errorString){</div>
+<div class="line"><a name="l00495"></a><span class="lineno">  495</span>           cout << errorString << endl;</div>
+<div class="line"><a name="l00496"></a><span class="lineno">  496</span>           exit(1);</div>
+<div class="line"><a name="l00497"></a><span class="lineno">  497</span>         }</div>
+<div class="line"><a name="l00498"></a><span class="lineno">  498</span>       }</div>
+<div class="line"><a name="l00499"></a><span class="lineno">  499</span>     }</div>
+<div class="line"><a name="l00500"></a><span class="lineno">  500</span>     progress=<span class="keyword">static_cast<</span><span class="keywordtype">float</span><span class="keyword">></span>(irow)/outputWriter.nrOfRow();</div>
+<div class="line"><a name="l00501"></a><span class="lineno">  501</span>     pfnProgress(progress,pszMessage,pProgressArg);</div>
+<div class="line"><a name="l00502"></a><span class="lineno">  502</span>   }</div>
+<div class="line"><a name="l00503"></a><span class="lineno">  503</span>   progress=1;</div>
+<div class="line"><a name="l00504"></a><span class="lineno">  504</span>   pfnProgress(progress,pszMessage,pProgressArg);</div>
+<div class="line"><a name="l00505"></a><span class="lineno">  505</span>   inputData.clear();<span class="comment">//clean up memory</span></div>
+<div class="line"><a name="l00506"></a><span class="lineno">  506</span>   <span class="comment">//apply post filter</span></div>
+<div class="line"><a name="l00507"></a><span class="lineno">  507</span>   <span class="comment">// std::cout << "Applying post processing filter: " << postFilter_opt[0] << std::endl;</span></div>
+<div class="line"><a name="l00508"></a><span class="lineno">  508</span>   <span class="comment">// if(postFilter_opt[0]=="etew_min"){</span></div>
 <div class="line"><a name="l00509"></a><span class="lineno">  509</span>   <span class="comment">//   if(composite_opt[0]!="min")</span></div>
 <div class="line"><a name="l00510"></a><span class="lineno">  510</span>   <span class="comment">//     std::cout << "Warning: composite option is not set to min!" << std::endl;</span></div>
-<div class="line"><a name="l00511"></a><span class="lineno">  511</span>   <span class="comment">//   assert(hThreshold_opt.size()>1);</span></div>
-<div class="line"><a name="l00512"></a><span class="lineno">  512</span>   <span class="comment">//   //Progressive morphological filter tgrs2003_zhang vol41 pp 872-882</span></div>
-<div class="line"><a name="l00513"></a><span class="lineno">  513</span>   <span class="comment">//   //first iteration is performed assuming only minima are selected using options -fir all -comp min</span></div>
+<div class="line"><a name="l00511"></a><span class="lineno">  511</span>   <span class="comment">//   //Elevation Threshold with Expand Window (ETEW) Filter (p.73 frmo Airborne LIDAR Data Processing and Analysis Tools ALDPAT 1.0)</span></div>
+<div class="line"><a name="l00512"></a><span class="lineno">  512</span>   <span class="comment">//   //first iteration is performed assuming only minima are selected using options -fir all -comp min</span></div>
+<div class="line"><a name="l00513"></a><span class="lineno">  513</span>   <span class="comment">//   unsigned long int nchange=1;</span></div>
 <div class="line"><a name="l00514"></a><span class="lineno">  514</span>   <span class="comment">//   //increase cells and thresholds until no points from the previous iteration are discarded.</span></div>
 <div class="line"><a name="l00515"></a><span class="lineno">  515</span>   <span class="comment">//   int dimx=dimx_opt[0];</span></div>
 <div class="line"><a name="l00516"></a><span class="lineno">  516</span>   <span class="comment">//   int dimy=dimy_opt[0];</span></div>
-<div class="line"><a name="l00517"></a><span class="lineno">  517</span>   <span class="comment">//   filter2d::Filter2d theFilter;</span></div>
-<div class="line"><a name="l00518"></a><span class="lineno">  518</span>   <span class="comment">//   // theFilter.setNoValue(0);</span></div>
+<div class="line"><a name="l00517"></a><span class="lineno">  517</span>   <span class="comment">//   filter2d::Filter2d morphFilter;</span></div>
+<div class="line"><a name="l00518"></a><span class="lineno">  518</span>   <span class="comment">//   // morphFilter.setNoValue(0);</span></div>
 <div class="line"><a name="l00519"></a><span class="lineno">  519</span>   <span class="comment">//   Vector2d<float> currentOutput=outputData;</span></div>
-<div class="line"><a name="l00520"></a><span class="lineno">  520</span>   <span class="comment">//   double hThreshold=hThreshold_opt[0];</span></div>
-<div class="line"><a name="l00521"></a><span class="lineno">  521</span>   <span class="comment">//   int iteration=1;</span></div>
-<div class="line"><a name="l00522"></a><span class="lineno">  522</span>   <span class="comment">//   while(iteration<=maxIter_opt[0]){</span></div>
-<div class="line"><a name="l00523"></a><span class="lineno">  523</span>   <span class="comment">//     std::cout << "iteration " << iteration << " with window size " << dimx << " and dh_max: " << hThreshold << std::endl;</span></div>
-<div class="line"><a name="l00524"></a><span class="lineno">  524</span>   <span class="comment">//     Vector2d<float> newOutput;</span></div>
-<div class="line"><a name="l00525"></a><span class="lineno">  525</span>   <span class="comment">//     try{</span></div>
-<div class="line"><a name="l00526"></a><span class="lineno">  526</span>   <span class="comment">//       theFilter.morphology(outputData,currentOutput,"erode",dimx,dimy,disc_opt[0],hThreshold);</span></div>
-<div class="line"><a name="l00527"></a><span class="lineno">  527</span>   <span class="comment">//       theFilter.morphology(currentOutput,outputData,"dilate",dimx,dimy,disc_opt[0],hThreshold);</span></div>
-<div class="line"><a name="l00528"></a><span class="lineno">  528</span>   <span class="comment">//       if(postFilter_opt[0]=="bunting"){</span></div>
-<div class="line"><a name="l00529"></a><span class="lineno">  529</span>   <span class="comment">//         theFilter.doit(outputData,currentOutput,"median",dimx,dimy,1,disc_opt[0]);</span></div>
-<div class="line"><a name="l00530"></a><span class="lineno">  530</span>   <span class="comment">//         outputData=currentOutput;</span></div>
-<div class="line"><a name="l00531"></a><span class="lineno">  531</span>   <span class="comment">//       }</span></div>
-<div class="line"><a name="l00532"></a><span class="lineno">  532</span>   <span class="comment">//     }</span></div>
-<div class="line"><a name="l00533"></a><span class="lineno">  533</span>   <span class="comment">//     catch(std::string errorString){</span></div>
-<div class="line"><a name="l00534"></a><span class="lineno">  534</span>   <span class="comment">//       cout << errorString << endl;</span></div>
-<div class="line"><a name="l00535"></a><span class="lineno">  535</span>   <span class="comment">//       exit(1);</span></div>
-<div class="line"><a name="l00536"></a><span class="lineno">  536</span>   <span class="comment">//     }</span></div>
-<div class="line"><a name="l00537"></a><span class="lineno">  537</span>   <span class="comment">//     int newdimx=(dimx==1)? 3: 2*(dimx-1)+1;</span></div>
-<div class="line"><a name="l00538"></a><span class="lineno">  538</span>   <span class="comment">//     int newdimy=(dimx==1)? 3: 2*(dimy-1)+1;//from PE&RS vol 71 pp313-324</span></div>
-<div class="line"><a name="l00539"></a><span class="lineno">  539</span>   <span class="comment">//     hThreshold=hThreshold_opt[0]+maxSlope_opt[0]*(newdimx-dimx)*dx_opt[0];</span></div>
-<div class="line"><a name="l00540"></a><span class="lineno">  540</span>   <span class="comment">//     dimx=newdimx;</span></div>
-<div class="line"><a name="l00541"></a><span class="lineno">  541</span>   <span class="comment">//     dimy=newdimy;</span></div>
-<div class="line"><a name="l00542"></a><span class="lineno">  542</span>   <span class="comment">//     if(hThreshold>hThreshold_opt[1])</span></div>
-<div class="line"><a name="l00543"></a><span class="lineno">  543</span>   <span class="comment">//       hThreshold=hThreshold_opt[1];</span></div>
-<div class="line"><a name="l00544"></a><span class="lineno">  544</span>   <span class="comment">//     ++iteration;</span></div>
-<div class="line"><a name="l00545"></a><span class="lineno">  545</span>   <span class="comment">//   }</span></div>
-<div class="line"><a name="l00546"></a><span class="lineno">  546</span>   <span class="comment">//   outputData=currentOutput;</span></div>
-<div class="line"><a name="l00547"></a><span class="lineno">  547</span>   <span class="comment">// }    </span></div>
-<div class="line"><a name="l00548"></a><span class="lineno">  548</span>   <span class="comment">// else if(postFilter_opt[0]=="open"){</span></div>
-<div class="line"><a name="l00549"></a><span class="lineno">  549</span>   <span class="comment">//   if(composite_opt[0]!="min")</span></div>
-<div class="line"><a name="l00550"></a><span class="lineno">  550</span>   <span class="comment">//     std::cout << "Warning: composite option is not set to min!" << std::endl;</span></div>
-<div class="line"><a name="l00551"></a><span class="lineno">  551</span>   <span class="comment">//   filter2d::Filter2d morphFilter;</span></div>
-<div class="line"><a name="l00552"></a><span class="lineno">  552</span>   <span class="comment">//   // morphFilter.setNoValue(0);</span></div>
-<div class="line"><a name="l00553"></a><span class="lineno">  553</span>   <span class="comment">//   Vector2d<float> filterInput=outputData;</span></div>
-<div class="line"><a name="l00554"></a><span class="lineno">  554</span>   <span class="comment">//   try{</span></div>
-<div class="line"><a name="l00555"></a><span class="lineno">  555</span>   <span class="comment">//     morphFilter.morphology(outputData,filterInput,"erode",dimx_opt[0],dimy_opt[0],disc_opt[0],maxSlope_opt[0]);</span></div>
-<div class="line"><a name="l00556"></a><span class="lineno">  556</span>   <span class="comment">//     morphFilter.morphology(filterInput,outputData,"dilate",dimx_opt[0],dimy_opt[0],disc_opt[0],maxSlope_opt[0]);</span></div>
-<div class="line"><a name="l00557"></a><span class="lineno">  557</span>   <span class="comment">//   }</span></div>
-<div class="line"><a name="l00558"></a><span class="lineno">  558</span>   <span class="comment">//   catch(std::string errorString){</span></div>
-<div class="line"><a name="l00559"></a><span class="lineno">  559</span>   <span class="comment">//     cout << errorString << endl;</span></div>
-<div class="line"><a name="l00560"></a><span class="lineno">  560</span>   <span class="comment">//     exit(1);</span></div>
-<div class="line"><a name="l00561"></a><span class="lineno">  561</span>   <span class="comment">//   }</span></div>
-<div class="line"><a name="l00562"></a><span class="lineno">  562</span>   <span class="comment">// }</span></div>
-<div class="line"><a name="l00563"></a><span class="lineno">  563</span>   <span class="comment">// else if(postFilter_opt[0]=="close"){</span></div>
-<div class="line"><a name="l00564"></a><span class="lineno">  564</span>   <span class="comment">//   if(composite_opt[0]!="max")</span></div>
-<div class="line"><a name="l00565"></a><span class="lineno">  565</span>   <span class="comment">//     std::cout << "Warning: composite option is not set to max!" << std::endl;</span></div>
-<div class="line"><a name="l00566"></a><span class="lineno">  566</span>   <span class="comment">//   filter2d::Filter2d morphFilter;</span></div>
-<div class="line"><a name="l00567"></a><span class="lineno">  567</span>   <span class="comment">//   // morphFilter.setNoValue(0);</span></div>
-<div class="line"><a name="l00568"></a><span class="lineno">  568</span>   <span class="comment">//   Vector2d<float> filterInput=outputData;</span></div>
-<div class="line"><a name="l00569"></a><span class="lineno">  569</span>   <span class="comment">//   try{</span></div>
-<div class="line"><a name="l00570"></a><span class="lineno">  570</span>   <span class="comment">//     morphFilter.morphology(outputData,filterInput,"dilate",dimx_opt[0],dimy_opt[0],disc_opt[0],maxSlope_opt[0]);</span></div>
-<div class="line"><a name="l00571"></a><span class="lineno">  571</span>   <span class="comment">//     morphFilter.morphology(filterInput,outputData,"erode",dimx_opt[0],dimy_opt[0],disc_opt[0],maxSlope_opt[0]);</span></div>
-<div class="line"><a name="l00572"></a><span class="lineno">  572</span>   <span class="comment">//   }</span></div>
-<div class="line"><a name="l00573"></a><span class="lineno">  573</span>   <span class="comment">//   catch(std::string errorString){</span></div>
-<div class="line"><a name="l00574"></a><span class="lineno">  574</span>   <span class="comment">//     cout << errorString << endl;</span></div>
-<div class="line"><a name="l00575"></a><span class="lineno">  575</span>   <span class="comment">//     exit(1);</span></div>
-<div class="line"><a name="l00576"></a><span class="lineno">  576</span>   <span class="comment">//   }</span></div>
-<div class="line"><a name="l00577"></a><span class="lineno">  577</span>   <span class="comment">// }</span></div>
-<div class="line"><a name="l00578"></a><span class="lineno">  578</span>   <span class="keywordflow">if</span>(composite_opt[0]!=<span class="stringliteral">"profile"</span>){</div>
-<div class="line"><a name="l00579"></a><span class="lineno">  579</span>     <span class="comment">//write output file</span></div>
-<div class="line"><a name="l00580"></a><span class="lineno">  580</span>     std::cout << <span class="stringliteral">"writing output raster file"</span> << std::endl;</div>
-<div class="line"><a name="l00581"></a><span class="lineno">  581</span>     progress=0;</div>
-<div class="line"><a name="l00582"></a><span class="lineno">  582</span>     pfnProgress(progress,pszMessage,pProgressArg);</div>
-<div class="line"><a name="l00583"></a><span class="lineno">  583</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> irow=0;irow<nrow;++irow){</div>
-<div class="line"><a name="l00584"></a><span class="lineno">  584</span>       <span class="keywordflow">try</span>{</div>
-<div class="line"><a name="l00585"></a><span class="lineno">  585</span>         assert(outputData.size()==outputWriter.nrOfRow());</div>
-<div class="line"><a name="l00586"></a><span class="lineno">  586</span>         assert(outputData[0].size()==outputWriter.nrOfCol());</div>
-<div class="line"><a name="l00587"></a><span class="lineno">  587</span>         outputWriter.writeData(outputData[irow],GDT_Float64,irow,0);</div>
-<div class="line"><a name="l00588"></a><span class="lineno">  588</span>       }</div>
-<div class="line"><a name="l00589"></a><span class="lineno">  589</span>       <span class="keywordflow">catch</span>(std::string errorString){</div>
-<div class="line"><a name="l00590"></a><span class="lineno">  590</span>         cout << errorString << endl;</div>
-<div class="line"><a name="l00591"></a><span class="lineno">  591</span>         exit(1);</div>
-<div class="line"><a name="l00592"></a><span class="lineno">  592</span>       }</div>
-<div class="line"><a name="l00593"></a><span class="lineno">  593</span>       progress=<span class="keyword">static_cast<</span><span class="keywordtype">float</span><span class="keyword">></span>(irow)/outputWriter.nrOfRow();</div>
-<div class="line"><a name="l00594"></a><span class="lineno">  594</span>       pfnProgress(progress,pszMessage,pProgressArg);</div>
-<div class="line"><a name="l00595"></a><span class="lineno">  595</span>     }</div>
-<div class="line"><a name="l00596"></a><span class="lineno">  596</span>   }</div>
-<div class="line"><a name="l00597"></a><span class="lineno">  597</span>   progress=1;</div>
-<div class="line"><a name="l00598"></a><span class="lineno">  598</span>   pfnProgress(progress,pszMessage,pProgressArg);</div>
-<div class="line"><a name="l00599"></a><span class="lineno">  599</span>   <span class="keywordflow">if</span>(verbose_opt[0])</div>
-<div class="line"><a name="l00600"></a><span class="lineno">  600</span>     std::cout << <span class="stringliteral">"closing lasReader"</span> << std::endl;</div>
-<div class="line"><a name="l00601"></a><span class="lineno">  601</span>   outputWriter.close();</div>
-<div class="line"><a name="l00602"></a><span class="lineno">  602</span> }</div>
+<div class="line"><a name="l00520"></a><span class="lineno">  520</span>   <span class="comment">//   int iteration=1;</span></div>
+<div class="line"><a name="l00521"></a><span class="lineno">  521</span>   <span class="comment">//   while(nchange&&iteration<=maxIter_opt[0]){</span></div>
+<div class="line"><a name="l00522"></a><span class="lineno">  522</span>   <span class="comment">//     double hThreshold=maxSlope_opt[0]*dimx;</span></div>
+<div class="line"><a name="l00523"></a><span class="lineno">  523</span>   <span class="comment">//     Vector2d<float> newOutput;</span></div>
+<div class="line"><a name="l00524"></a><span class="lineno">  524</span>   <span class="comment">//     nchange=morphFilter.morphology(currentOutput,newOutput,"erode",dimx,dimy,disc_opt[0],hThreshold);</span></div>
+<div class="line"><a name="l00525"></a><span class="lineno">  525</span>   <span class="comment">//     currentOutput=newOutput;</span></div>
+<div class="line"><a name="l00526"></a><span class="lineno">  526</span>   <span class="comment">//     dimx+=2;//change from theory: originally double cellCize</span></div>
+<div class="line"><a name="l00527"></a><span class="lineno">  527</span>   <span class="comment">//     dimy+=2;//change from theory: originally double cellCize</span></div>
+<div class="line"><a name="l00528"></a><span class="lineno">  528</span>   <span class="comment">//     std::cout << "iteration " << iteration << ": " << nchange << " pixels changed" << std::endl;</span></div>
+<div class="line"><a name="l00529"></a><span class="lineno">  529</span>   <span class="comment">//     ++iteration;</span></div>
+<div class="line"><a name="l00530"></a><span class="lineno">  530</span>   <span class="comment">//   }</span></div>
+<div class="line"><a name="l00531"></a><span class="lineno">  531</span>   <span class="comment">//   outputData=currentOutput;</span></div>
+<div class="line"><a name="l00532"></a><span class="lineno">  532</span>   <span class="comment">// }    </span></div>
+<div class="line"><a name="l00533"></a><span class="lineno">  533</span>   <span class="comment">// else if(postFilter_opt[0]=="promorph"||postFilter_opt[0]=="bunting"){</span></div>
+<div class="line"><a name="l00534"></a><span class="lineno">  534</span>   <span class="comment">//   if(composite_opt[0]!="min")</span></div>
+<div class="line"><a name="l00535"></a><span class="lineno">  535</span>   <span class="comment">//     std::cout << "Warning: composite option is not set to min!" << std::endl;</span></div>
+<div class="line"><a name="l00536"></a><span class="lineno">  536</span>   <span class="comment">//   assert(hThreshold_opt.size()>1);</span></div>
+<div class="line"><a name="l00537"></a><span class="lineno">  537</span>   <span class="comment">//   //Progressive morphological filter tgrs2003_zhang vol41 pp 872-882</span></div>
+<div class="line"><a name="l00538"></a><span class="lineno">  538</span>   <span class="comment">//   //first iteration is performed assuming only minima are selected using options -fir all -comp min</span></div>
+<div class="line"><a name="l00539"></a><span class="lineno">  539</span>   <span class="comment">//   //increase cells and thresholds until no points from the previous iteration are discarded.</span></div>
+<div class="line"><a name="l00540"></a><span class="lineno">  540</span>   <span class="comment">//   int dimx=dimx_opt[0];</span></div>
+<div class="line"><a name="l00541"></a><span class="lineno">  541</span>   <span class="comment">//   int dimy=dimy_opt[0];</span></div>
+<div class="line"><a name="l00542"></a><span class="lineno">  542</span>   <span class="comment">//   filter2d::Filter2d theFilter;</span></div>
+<div class="line"><a name="l00543"></a><span class="lineno">  543</span>   <span class="comment">//   // theFilter.setNoValue(0);</span></div>
+<div class="line"><a name="l00544"></a><span class="lineno">  544</span>   <span class="comment">//   Vector2d<float> currentOutput=outputData;</span></div>
+<div class="line"><a name="l00545"></a><span class="lineno">  545</span>   <span class="comment">//   double hThreshold=hThreshold_opt[0];</span></div>
+<div class="line"><a name="l00546"></a><span class="lineno">  546</span>   <span class="comment">//   int iteration=1;</span></div>
+<div class="line"><a name="l00547"></a><span class="lineno">  547</span>   <span class="comment">//   while(iteration<=maxIter_opt[0]){</span></div>
+<div class="line"><a name="l00548"></a><span class="lineno">  548</span>   <span class="comment">//     std::cout << "iteration " << iteration << " with window size " << dimx << " and dh_max: " << hThreshold << std::endl;</span></div>
+<div class="line"><a name="l00549"></a><span class="lineno">  549</span>   <span class="comment">//     Vector2d<float> newOutput;</span></div>
+<div class="line"><a name="l00550"></a><span class="lineno">  550</span>   <span class="comment">//     try{</span></div>
+<div class="line"><a name="l00551"></a><span class="lineno">  551</span>   <span class="comment">//       theFilter.morphology(outputData,currentOutput,"erode",dimx,dimy,disc_opt[0],hThreshold);</span></div>
+<div class="line"><a name="l00552"></a><span class="lineno">  552</span>   <span class="comment">//       theFilter.morphology(currentOutput,outputData,"dilate",dimx,dimy,disc_opt[0],hThreshold);</span></div>
+<div class="line"><a name="l00553"></a><span class="lineno">  553</span>   <span class="comment">//       if(postFilter_opt[0]=="bunting"){</span></div>
+<div class="line"><a name="l00554"></a><span class="lineno">  554</span>   <span class="comment">//         theFilter.doit(outputData,currentOutput,"median",dimx,dimy,1,disc_opt[0]);</span></div>
+<div class="line"><a name="l00555"></a><span class="lineno">  555</span>   <span class="comment">//         outputData=currentOutput;</span></div>
+<div class="line"><a name="l00556"></a><span class="lineno">  556</span>   <span class="comment">//       }</span></div>
+<div class="line"><a name="l00557"></a><span class="lineno">  557</span>   <span class="comment">//     }</span></div>
+<div class="line"><a name="l00558"></a><span class="lineno">  558</span>   <span class="comment">//     catch(std::string errorString){</span></div>
+<div class="line"><a name="l00559"></a><span class="lineno">  559</span>   <span class="comment">//       cout << errorString << endl;</span></div>
+<div class="line"><a name="l00560"></a><span class="lineno">  560</span>   <span class="comment">//       exit(1);</span></div>
+<div class="line"><a name="l00561"></a><span class="lineno">  561</span>   <span class="comment">//     }</span></div>
+<div class="line"><a name="l00562"></a><span class="lineno">  562</span>   <span class="comment">//     int newdimx=(dimx==1)? 3: 2*(dimx-1)+1;</span></div>
+<div class="line"><a name="l00563"></a><span class="lineno">  563</span>   <span class="comment">//     int newdimy=(dimx==1)? 3: 2*(dimy-1)+1;//from PE&RS vol 71 pp313-324</span></div>
+<div class="line"><a name="l00564"></a><span class="lineno">  564</span>   <span class="comment">//     hThreshold=hThreshold_opt[0]+maxSlope_opt[0]*(newdimx-dimx)*dx_opt[0];</span></div>
+<div class="line"><a name="l00565"></a><span class="lineno">  565</span>   <span class="comment">//     dimx=newdimx;</span></div>
+<div class="line"><a name="l00566"></a><span class="lineno">  566</span>   <span class="comment">//     dimy=newdimy;</span></div>
+<div class="line"><a name="l00567"></a><span class="lineno">  567</span>   <span class="comment">//     if(hThreshold>hThreshold_opt[1])</span></div>
+<div class="line"><a name="l00568"></a><span class="lineno">  568</span>   <span class="comment">//       hThreshold=hThreshold_opt[1];</span></div>
+<div class="line"><a name="l00569"></a><span class="lineno">  569</span>   <span class="comment">//     ++iteration;</span></div>
+<div class="line"><a name="l00570"></a><span class="lineno">  570</span>   <span class="comment">//   }</span></div>
+<div class="line"><a name="l00571"></a><span class="lineno">  571</span>   <span class="comment">//   outputData=currentOutput;</span></div>
+<div class="line"><a name="l00572"></a><span class="lineno">  572</span>   <span class="comment">// }    </span></div>
+<div class="line"><a name="l00573"></a><span class="lineno">  573</span>   <span class="comment">// else if(postFilter_opt[0]=="open"){</span></div>
+<div class="line"><a name="l00574"></a><span class="lineno">  574</span>   <span class="comment">//   if(composite_opt[0]!="min")</span></div>
+<div class="line"><a name="l00575"></a><span class="lineno">  575</span>   <span class="comment">//     std::cout << "Warning: composite option is not set to min!" << std::endl;</span></div>
+<div class="line"><a name="l00576"></a><span class="lineno">  576</span>   <span class="comment">//   filter2d::Filter2d morphFilter;</span></div>
+<div class="line"><a name="l00577"></a><span class="lineno">  577</span>   <span class="comment">//   // morphFilter.setNoValue(0);</span></div>
+<div class="line"><a name="l00578"></a><span class="lineno">  578</span>   <span class="comment">//   Vector2d<float> filterInput=outputData;</span></div>
+<div class="line"><a name="l00579"></a><span class="lineno">  579</span>   <span class="comment">//   try{</span></div>
+<div class="line"><a name="l00580"></a><span class="lineno">  580</span>   <span class="comment">//     morphFilter.morphology(outputData,filterInput,"erode",dimx_opt[0],dimy_opt[0],disc_opt[0],maxSlope_opt[0]);</span></div>
+<div class="line"><a name="l00581"></a><span class="lineno">  581</span>   <span class="comment">//     morphFilter.morphology(filterInput,outputData,"dilate",dimx_opt[0],dimy_opt[0],disc_opt[0],maxSlope_opt[0]);</span></div>
+<div class="line"><a name="l00582"></a><span class="lineno">  582</span>   <span class="comment">//   }</span></div>
+<div class="line"><a name="l00583"></a><span class="lineno">  583</span>   <span class="comment">//   catch(std::string errorString){</span></div>
+<div class="line"><a name="l00584"></a><span class="lineno">  584</span>   <span class="comment">//     cout << errorString << endl;</span></div>
+<div class="line"><a name="l00585"></a><span class="lineno">  585</span>   <span class="comment">//     exit(1);</span></div>
+<div class="line"><a name="l00586"></a><span class="lineno">  586</span>   <span class="comment">//   }</span></div>
+<div class="line"><a name="l00587"></a><span class="lineno">  587</span>   <span class="comment">// }</span></div>
+<div class="line"><a name="l00588"></a><span class="lineno">  588</span>   <span class="comment">// else if(postFilter_opt[0]=="close"){</span></div>
+<div class="line"><a name="l00589"></a><span class="lineno">  589</span>   <span class="comment">//   if(composite_opt[0]!="max")</span></div>
+<div class="line"><a name="l00590"></a><span class="lineno">  590</span>   <span class="comment">//     std::cout << "Warning: composite option is not set to max!" << std::endl;</span></div>
+<div class="line"><a name="l00591"></a><span class="lineno">  591</span>   <span class="comment">//   filter2d::Filter2d morphFilter;</span></div>
+<div class="line"><a name="l00592"></a><span class="lineno">  592</span>   <span class="comment">//   // morphFilter.setNoValue(0);</span></div>
+<div class="line"><a name="l00593"></a><span class="lineno">  593</span>   <span class="comment">//   Vector2d<float> filterInput=outputData;</span></div>
+<div class="line"><a name="l00594"></a><span class="lineno">  594</span>   <span class="comment">//   try{</span></div>
+<div class="line"><a name="l00595"></a><span class="lineno">  595</span>   <span class="comment">//     morphFilter.morphology(outputData,filterInput,"dilate",dimx_opt[0],dimy_opt[0],disc_opt[0],maxSlope_opt[0]);</span></div>
+<div class="line"><a name="l00596"></a><span class="lineno">  596</span>   <span class="comment">//     morphFilter.morphology(filterInput,outputData,"erode",dimx_opt[0],dimy_opt[0],disc_opt[0],maxSlope_opt[0]);</span></div>
+<div class="line"><a name="l00597"></a><span class="lineno">  597</span>   <span class="comment">//   }</span></div>
+<div class="line"><a name="l00598"></a><span class="lineno">  598</span>   <span class="comment">//   catch(std::string errorString){</span></div>
+<div class="line"><a name="l00599"></a><span class="lineno">  599</span>   <span class="comment">//     cout << errorString << endl;</span></div>
+<div class="line"><a name="l00600"></a><span class="lineno">  600</span>   <span class="comment">//     exit(1);</span></div>
+<div class="line"><a name="l00601"></a><span class="lineno">  601</span>   <span class="comment">//   }</span></div>
+<div class="line"><a name="l00602"></a><span class="lineno">  602</span>   <span class="comment">// }</span></div>
+<div class="line"><a name="l00603"></a><span class="lineno">  603</span>   <span class="keywordflow">if</span>(composite_opt[0]!=<span class="stringliteral">"profile"</span>){</div>
+<div class="line"><a name="l00604"></a><span class="lineno">  604</span>     <span class="comment">//write output file</span></div>
+<div class="line"><a name="l00605"></a><span class="lineno">  605</span>     std::cout << <span class="stringliteral">"writing output raster file"</span> << std::endl;</div>
+<div class="line"><a name="l00606"></a><span class="lineno">  606</span>     progress=0;</div>
+<div class="line"><a name="l00607"></a><span class="lineno">  607</span>     pfnProgress(progress,pszMessage,pProgressArg);</div>
+<div class="line"><a name="l00608"></a><span class="lineno">  608</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> irow=0;irow<nrow;++irow){</div>
+<div class="line"><a name="l00609"></a><span class="lineno">  609</span>       <span class="keywordflow">try</span>{</div>
+<div class="line"><a name="l00610"></a><span class="lineno">  610</span>         assert(outputData.size()==outputWriter.nrOfRow());</div>
+<div class="line"><a name="l00611"></a><span class="lineno">  611</span>         assert(outputData[0].size()==outputWriter.nrOfCol());</div>
+<div class="line"><a name="l00612"></a><span class="lineno">  612</span>         outputWriter.writeData(outputData[irow],GDT_Float64,irow,0);</div>
+<div class="line"><a name="l00613"></a><span class="lineno">  613</span>       }</div>
+<div class="line"><a name="l00614"></a><span class="lineno">  614</span>       <span class="keywordflow">catch</span>(std::string errorString){</div>
+<div class="line"><a name="l00615"></a><span class="lineno">  615</span>         cout << errorString << endl;</div>
+<div class="line"><a name="l00616"></a><span class="lineno">  616</span>         exit(1);</div>
+<div class="line"><a name="l00617"></a><span class="lineno">  617</span>       }</div>
+<div class="line"><a name="l00618"></a><span class="lineno">  618</span>       progress=<span class="keyword">static_cast<</span><span class="keywordtype">float</span><span class="keyword">></span>(irow)/outputWriter.nrOfRow();</div>
+<div class="line"><a name="l00619"></a><span class="lineno">  619</span>       pfnProgress(progress,pszMessage,pProgressArg);</div>
+<div class="line"><a name="l00620"></a><span class="lineno">  620</span>     }</div>
+<div class="line"><a name="l00621"></a><span class="lineno">  621</span>   }</div>
+<div class="line"><a name="l00622"></a><span class="lineno">  622</span>   progress=1;</div>
+<div class="line"><a name="l00623"></a><span class="lineno">  623</span>   pfnProgress(progress,pszMessage,pProgressArg);</div>
+<div class="line"><a name="l00624"></a><span class="lineno">  624</span>   <span class="keywordflow">if</span>(verbose_opt[0])</div>
+<div class="line"><a name="l00625"></a><span class="lineno">  625</span>     std::cout << <span class="stringliteral">"closing lasReader"</span> << std::endl;</div>
+<div class="line"><a name="l00626"></a><span class="lineno">  626</span>   outputWriter.close();</div>
+<div class="line"><a name="l00627"></a><span class="lineno">  627</span> }</div>
 <div class="ttc" id="classImgReaderGdal_html"><div class="ttname"><a href="classImgReaderGdal.html">ImgReaderGdal</a></div><div class="ttdef"><b>Definition:</b> <a href="ImgReaderGdal_8h_source.html#l00033">ImgReaderGdal.h:33</a></div></div>
 <div class="ttc" id="classImgWriterGdal_html"><div class="ttname"><a href="classImgWriterGdal.html">ImgWriterGdal</a></div><div class="ttdef"><b>Definition:</b> <a href="ImgWriterGdal_8h_source.html#l00032">ImgWriterGdal.h:32</a></div></div>
 <div class="ttc" id="classVector2d_html"><div class="ttname"><a href="classVector2d.html">Vector2d</a></div><div class="ttdef"><b>Definition:</b> <a href="Vector2d_8h_source.html#l00031">Vector2d.h:31</a></div></div>
@@ -613,7 +636,7 @@
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Jun 23 2015 17:09:36 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/pklas2img_8py_source.html b/doc/html/pklas2img_8py_source.html
index 169e72f..01247b8 100644
--- a/doc/html/pklas2img_8py_source.html
+++ b/doc/html/pklas2img_8py_source.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.3</span>
+    <span id="projectnumber">2.6.4</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -206,7 +206,7 @@
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Jun 23 2015 17:09:36 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Tue Nov 3 2015 15:58:26 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/pkndvi_8cc_source.html b/doc/html/pkndvi_8cc_source.html
index d9a004e..88fd527 100644
--- a/doc/html/pkndvi_8cc_source.html
+++ b/doc/html/pkndvi_8cc_source.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.3</span>
+    <span id="projectnumber">2.6.4</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -388,7 +388,7 @@
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Jun 23 2015 17:09:36 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Tue Nov 3 2015 15:58:26 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/pkoptsvm.html b/doc/html/pkoptsvm.html
index 5417a0e..80a538f 100644
--- a/doc/html/pkoptsvm.html
+++ b/doc/html/pkoptsvm.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.3</span>
+    <span id="projectnumber">2.6.4</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -83,15 +83,15 @@ Options</h1>
 <tr>
 <td>min </td><td>min </td><td>int </td><td>0 </td><td>if number of training pixels is less then min, do not take this class into account </td></tr>
 <tr>
-<td>b </td><td>band </td><td>short </td><td></td><td>band index (starting from 0, either use band option or use start to end) </td></tr>
+<td>b </td><td>band </td><td>unsigned short </td><td></td><td>band index (starting from 0, either use band option or use start to end) </td></tr>
 <tr>
-<td>s </td><td>start </td><td>double </td><td>0 </td><td>start band sequence number </td></tr>
+<td>sband </td><td>startband </td><td>unsigned short </td><td></td><td>Start band sequence number </td></tr>
 <tr>
-<td>e </td><td>end </td><td>double </td><td>0 </td><td>end band sequence number (set to 0 to include all bands) </td></tr>
+<td>eband </td><td>endband </td><td>unsigned short </td><td></td><td>End band sequence number </td></tr>
 <tr>
-<td></td><td>offset </td><td>double </td><td>0 </td><td>offset value for each spectral band input features: refl[band]=(DN[band]-offset[band])/scale[band] </td></tr>
+<td>offset </td><td>offset </td><td>double </td><td>0 </td><td>offset value for each spectral band input features: refl[band]=(DN[band]-offset[band])/scale[band] </td></tr>
 <tr>
-<td></td><td>scale </td><td>double </td><td>0 </td><td>scale value for each spectral band input features: refl=(DN[band]-offset[band])/scale<a href="use 0 if scale min and max in each band to -1.0 and 1.0">band</a> </td></tr>
+<td>scale </td><td>scale </td><td>double </td><td>0 </td><td>scale value for each spectral band input features: refl=(DN[band]-offset[band])/scale<a href="use 0 if scale min and max in each band to -1.0 and 1.0">band</a> </td></tr>
 <tr>
 <td>svmt </td><td>svmtype </td><td>std::string </td><td>C_SVC </td><td>type of SVM (C_SVC, nu_SVC,one_class, epsilon_SVR, nu_SVR) </td></tr>
 <tr>
@@ -131,7 +131,7 @@ Usage: pkoptsvm -t training </li>
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Jun 23 2015 17:09:37 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/pkoptsvm_8cc_source.html b/doc/html/pkoptsvm_8cc_source.html
index 48e70fc..15b3e36 100644
--- a/doc/html/pkoptsvm_8cc_source.html
+++ b/doc/html/pkoptsvm_8cc_source.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.3</span>
+    <span id="projectnumber">2.6.4</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -177,11 +177,11 @@
 <div class="line"><a name="l00187"></a><span class="lineno">  187</span>   <a class="code" href="classOptionpk.html">Optionpk<unsigned int></a> balance_opt(<span class="stringliteral">"bal"</span>, <span class="stringliteral">"balance"</span>, <span class="stringliteral">"balance the input data to this number of samples for each class"</span>, 0);</div>
 <div class="line"><a name="l00188"></a><span class="lineno">  188</span>   <a class="code" href="classOptionpk.html">Optionpk<bool></a> random_opt(<span class="stringliteral">"random"</span>,<span class="stringliteral">"random"</span>, <span class="stringliteral">"in case of balance, randomize input data"</span>, <span class="keyword">true</span>);</div>
 <div class="line"><a name="l00189"></a><span class="lineno">  189</span>   <a class="code" href="classOptionpk.html">Optionpk<int></a> minSize_opt(<span class="stringliteral">"min"</span>, <span class="stringliteral">"min"</span>, <span class="stringliteral">"if number of training pixels is less then min, do not take this class into account"</span>, 0);</div>
-<div class="line"><a name="l00190"></a><span class="lineno">  190</span>   <a class="code" href="classOptionpk.html">Optionpk<short></a> band_opt(<span class="stringliteral">"b"</span>, <span class="stringliteral">"band"</span>, <span class="stringliteral">"band index (starting from 0, either use band option or use start to end)"</span>);</div>
-<div class="line"><a name="l00191"></a><span class="lineno">  191</span>   <a class="code" href="classOptionpk.html">Optionpk<double></a> bstart_opt(<span class="stringliteral">"s"</span>, <span class="stringliteral">"start"</span>, <span class="stringliteral">"start band sequence number"</span>,0); </div>
-<div class="line"><a name="l00192"></a><span class="lineno">  192</span>   <a class="code" href="classOptionpk.html">Optionpk<double></a> bend_opt(<span class="stringliteral">"e"</span>, <span class="stringliteral">"end"</span>, <span class="stringliteral">"end band sequence number (set to 0 to include all bands)"</span>, 0); </div>
-<div class="line"><a name="l00193"></a><span class="lineno">  193</span>   <a class="code" href="classOptionpk.html">Optionpk<double></a> offset_opt(<span class="stringliteral">"\0"</span>, <span class="stringliteral">"offset"</span>, <span class="stringliteral">"offset value for each spectral band input features: refl[band]=(DN[band]-offset[band])/scale[band]"</span>, 0.0);</div>
-<div class="line"><a name="l00194"></a><span class="lineno">  194</span>   <a class="code" href="classOptionpk.html">Optionpk<double></a> scale_opt(<span class="stringliteral">"\0"</span>, <span class="stringliteral">"scale"</span>, <span class="stringliteral">"scale value for each spectral band input features: refl=(DN[band]-offset[band])/scale[band] (use 0 if scale min and max in each band to -1.0 and 1.0)"</span>, 0.0);</div>
+<div class="line"><a name="l00190"></a><span class="lineno">  190</span>   <a class="code" href="classOptionpk.html">Optionpk<unsigned short></a> band_opt(<span class="stringliteral">"b"</span>, <span class="stringliteral">"band"</span>, <span class="stringliteral">"band index (starting from 0, either use band option or use start to end)"</span>);</div>
+<div class="line"><a name="l00191"></a><span class="lineno">  191</span>   <a class="code" href="classOptionpk.html">Optionpk<unsigned short></a> bstart_opt(<span class="stringliteral">"sband"</span>, <span class="stringliteral">"startband"</span>, <span class="stringliteral">"Start band sequence number"</span>); </div>
+<div class="line"><a name="l00192"></a><span class="lineno">  192</span>   <a class="code" href="classOptionpk.html">Optionpk<unsigned short></a> bend_opt(<span class="stringliteral">"eband"</span>, <span class="stringliteral">"endband"</span>, <span class="stringliteral">"End band sequence number"</span>); </div>
+<div class="line"><a name="l00193"></a><span class="lineno">  193</span>   <a class="code" href="classOptionpk.html">Optionpk<double></a> offset_opt(<span class="stringliteral">"offset"</span>, <span class="stringliteral">"offset"</span>, <span class="stringliteral">"offset value for each spectral band input features: refl[band]=(DN[band]-offset[band])/scale[band]"</span>, 0.0);</div>
+<div class="line"><a name="l00194"></a><span class="lineno">  194</span>   <a class="code" href="classOptionpk.html">Optionpk<double></a> scale_opt(<span class="stringliteral">"scale"</span>, <span class="stringliteral">"scale"</span>, <span class="stringliteral">"scale value for each spectral band input features: refl=(DN[band]-offset[band])/scale[band] (use 0 if scale min and max in each band to -1.0 and 1.0)"</span>, 0.0);</div>
 <div class="line"><a name="l00195"></a><span class="lineno">  195</span>   <a class="code" href="classOptionpk.html">Optionpk<unsigned int></a> maxit_opt(<span class="stringliteral">"maxit"</span>,<span class="stringliteral">"maxit"</span>,<span class="stringliteral">"maximum number of iterations"</span>,500);</div>
 <div class="line"><a name="l00196"></a><span class="lineno">  196</span> <span class="comment">//Optionpk<string> algorithm_opt("a", "algorithm", "GRID, or any optimization algorithm from http://ab-initio.mit.edu/wiki/index.php/NLopt_Algorithms","GRID"); </span></div>
 <div class="line"><a name="l00197"></a><span class="lineno">  197</span>   <a class="code" href="classOptionpk.html">Optionpk<double></a> tolerance_opt(<span class="stringliteral">"tol"</span>,<span class="stringliteral">"tolerance"</span>,<span class="stringliteral">"relative tolerance for stopping criterion"</span>,0.0001);</div>
@@ -301,361 +301,383 @@
 <div class="line"><a name="l00311"></a><span class="lineno">  311</span>   <span class="comment">//     priors[iclass]/=normPrior;</span></div>
 <div class="line"><a name="l00312"></a><span class="lineno">  312</span>   <span class="comment">// }</span></div>
 <div class="line"><a name="l00313"></a><span class="lineno">  313</span> </div>
-<div class="line"><a name="l00314"></a><span class="lineno">  314</span>   <span class="comment">//sort bands</span></div>
-<div class="line"><a name="l00315"></a><span class="lineno">  315</span>   <span class="keywordflow">if</span>(band_opt.size())</div>
-<div class="line"><a name="l00316"></a><span class="lineno">  316</span>     std::sort(band_opt.begin(),band_opt.end());</div>
-<div class="line"><a name="l00317"></a><span class="lineno">  317</span> </div>
-<div class="line"><a name="l00318"></a><span class="lineno">  318</span>   <span class="comment">// map<string,short> classValueMap;//global variable for now (due to getCost)</span></div>
-<div class="line"><a name="l00319"></a><span class="lineno">  319</span>   <span class="keywordflow">if</span>(classname_opt.size()){</div>
-<div class="line"><a name="l00320"></a><span class="lineno">  320</span>     assert(classname_opt.size()==classvalue_opt.size());</div>
-<div class="line"><a name="l00321"></a><span class="lineno">  321</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iclass=0;iclass<classname_opt.size();++iclass)</div>
-<div class="line"><a name="l00322"></a><span class="lineno">  322</span>       classValueMap[classname_opt[iclass]]=classvalue_opt[iclass];</div>
-<div class="line"><a name="l00323"></a><span class="lineno">  323</span>   }</div>
-<div class="line"><a name="l00324"></a><span class="lineno">  324</span> </div>
-<div class="line"><a name="l00325"></a><span class="lineno">  325</span>   <span class="comment">//----------------------------------- Training -------------------------------</span></div>
-<div class="line"><a name="l00326"></a><span class="lineno">  326</span>   <span class="keyword">struct </span><a class="code" href="structsvm__problem.html">svm_problem</a> prob;</div>
-<div class="line"><a name="l00327"></a><span class="lineno">  327</span>   vector<string> fields;</div>
-<div class="line"><a name="l00328"></a><span class="lineno">  328</span>   <span class="comment">//organize training data</span></div>
-<div class="line"><a name="l00329"></a><span class="lineno">  329</span>   trainingPixels.clear();</div>
-<div class="line"><a name="l00330"></a><span class="lineno">  330</span>   testPixels.clear();</div>
-<div class="line"><a name="l00331"></a><span class="lineno">  331</span>   map<string,Vector2d<float> > trainingMap;</div>
-<div class="line"><a name="l00332"></a><span class="lineno">  332</span>   map<string,Vector2d<float> > testMap;</div>
-<div class="line"><a name="l00333"></a><span class="lineno">  333</span>   <span class="keywordflow">if</span>(verbose_opt[0]>=1)</div>
-<div class="line"><a name="l00334"></a><span class="lineno">  334</span>     std::cout << <span class="stringliteral">"reading training file "</span> << training_opt[0] << std::endl;</div>
-<div class="line"><a name="l00335"></a><span class="lineno">  335</span>   <span class="keywordflow">try</span>{</div>
-<div class="line"><a name="l00336"></a><span class="lineno">  336</span>     <a class="code" href="classImgReaderOgr.html">ImgReaderOgr</a> trainingReader(training_opt[0]);</div>
-<div class="line"><a name="l00337"></a><span class="lineno">  337</span>     <span class="keywordflow">if</span>(band_opt.size()){</div>
-<div class="line"><a name="l00338"></a><span class="lineno">  338</span>       totalSamples=trainingReader.readDataImageOgr(trainingMap,fields,band_opt,label_opt[0],tlayer_opt,verbose_opt[0]);</div>
-<div class="line"><a name="l00339"></a><span class="lineno">  339</span>       <span class="keywordflow">if</span>(input_opt.size()){</div>
-<div class="line"><a name="l00340"></a><span class="lineno">  340</span>     <a class="code" href="classImgReaderOgr.html">ImgReaderOgr</a> inputReader(input_opt[0]);</div>
-<div class="line"><a name="l00341"></a><span class="lineno">  341</span>     totalTestSamples=inputReader.readDataImageOgr(testMap,fields,band_opt,label_opt[0],tlayer_opt,verbose_opt[0]);</div>
-<div class="line"><a name="l00342"></a><span class="lineno">  342</span>     inputReader.close();</div>
-<div class="line"><a name="l00343"></a><span class="lineno">  343</span>       }</div>
-<div class="line"><a name="l00344"></a><span class="lineno">  344</span>     }</div>
-<div class="line"><a name="l00345"></a><span class="lineno">  345</span>     <span class="keywordflow">else</span>{</div>
-<div class="line"><a name="l00346"></a><span class="lineno">  346</span>       totalSamples=trainingReader.readDataImageOgr(trainingMap,fields,bstart_opt[0],bend_opt[0],label_opt[0],tlayer_opt,verbose_opt[0]);</div>
-<div class="line"><a name="l00347"></a><span class="lineno">  347</span>       <span class="keywordflow">if</span>(input_opt.size()){</div>
-<div class="line"><a name="l00348"></a><span class="lineno">  348</span>     <a class="code" href="classImgReaderOgr.html">ImgReaderOgr</a> inputReader(input_opt[0]);</div>
-<div class="line"><a name="l00349"></a><span class="lineno">  349</span>     totalTestSamples=inputReader.readDataImageOgr(testMap,fields,bstart_opt[0],bend_opt[0],label_opt[0],tlayer_opt,verbose_opt[0]);</div>
-<div class="line"><a name="l00350"></a><span class="lineno">  350</span>     inputReader.close();</div>
-<div class="line"><a name="l00351"></a><span class="lineno">  351</span>       }</div>
-<div class="line"><a name="l00352"></a><span class="lineno">  352</span>       trainingReader.close();</div>
-<div class="line"><a name="l00353"></a><span class="lineno">  353</span>     }</div>
-<div class="line"><a name="l00354"></a><span class="lineno">  354</span>     <span class="keywordflow">if</span>(trainingMap.size()<2){</div>
-<div class="line"><a name="l00355"></a><span class="lineno">  355</span>       <span class="comment">// map<string,Vector2d<float> >::iterator mapit=trainingMap.begin();</span></div>
-<div class="line"><a name="l00356"></a><span class="lineno">  356</span>       <span class="comment">// while(mapit!=trainingMap.end())</span></div>
-<div class="line"><a name="l00357"></a><span class="lineno">  357</span>       <span class="comment">//    cerr << mapit->first << " -> " << classValueMap[mapit->first] << std::endl;</span></div>
-<div class="line"><a name="l00358"></a><span class="lineno">  358</span>       <span class="keywordtype">string</span> errorstring=<span class="stringliteral">"Error: could not read at least two classes from training input file"</span>;</div>
-<div class="line"><a name="l00359"></a><span class="lineno">  359</span>       <span class="keywordflow">throw</span>(errorstring);</div>
-<div class="line"><a name="l00360"></a><span class="lineno">  360</span>     }</div>
-<div class="line"><a name="l00361"></a><span class="lineno">  361</span>     <span class="keywordflow">if</span>(input_opt.size()&&testMap.size()<2){</div>
-<div class="line"><a name="l00362"></a><span class="lineno">  362</span>       <span class="keywordtype">string</span> errorstring=<span class="stringliteral">"Error: could not read at least two classes from test input file"</span>;</div>
-<div class="line"><a name="l00363"></a><span class="lineno">  363</span>       <span class="keywordflow">throw</span>(errorstring);</div>
-<div class="line"><a name="l00364"></a><span class="lineno">  364</span>     }</div>
-<div class="line"><a name="l00365"></a><span class="lineno">  365</span>   }</div>
-<div class="line"><a name="l00366"></a><span class="lineno">  366</span>   <span class="keywordflow">catch</span>(<span class="keywordtype">string</span> error){</div>
-<div class="line"><a name="l00367"></a><span class="lineno">  367</span>     cerr << error << std::endl;</div>
-<div class="line"><a name="l00368"></a><span class="lineno">  368</span>     exit(1);</div>
-<div class="line"><a name="l00369"></a><span class="lineno">  369</span>   }</div>
-<div class="line"><a name="l00370"></a><span class="lineno">  370</span>   <span class="keywordflow">catch</span>(...){</div>
-<div class="line"><a name="l00371"></a><span class="lineno">  371</span>     cerr << <span class="stringliteral">"error catched"</span> << std::endl;</div>
-<div class="line"><a name="l00372"></a><span class="lineno">  372</span>     exit(1);</div>
-<div class="line"><a name="l00373"></a><span class="lineno">  373</span>   }</div>
-<div class="line"><a name="l00374"></a><span class="lineno">  374</span>   <span class="comment">//todo delete class 0 ?</span></div>
-<div class="line"><a name="l00375"></a><span class="lineno">  375</span>   <span class="comment">// if(verbose_opt[0]>=1)</span></div>
-<div class="line"><a name="l00376"></a><span class="lineno">  376</span>   <span class="comment">//   std::cout << "erasing class 0 from training set (" << trainingMap[0].size() << " from " << totalSamples << ") samples" << std::endl;</span></div>
-<div class="line"><a name="l00377"></a><span class="lineno">  377</span>   <span class="comment">// totalSamples-=trainingMap[0].size();</span></div>
-<div class="line"><a name="l00378"></a><span class="lineno">  378</span>   <span class="comment">// trainingMap.erase(0);</span></div>
-<div class="line"><a name="l00379"></a><span class="lineno">  379</span> </div>
-<div class="line"><a name="l00380"></a><span class="lineno">  380</span>   <span class="keywordflow">if</span>(verbose_opt[0]>1)</div>
-<div class="line"><a name="l00381"></a><span class="lineno">  381</span>     std::cout << <span class="stringliteral">"training pixels: "</span> << std::endl;</div>
-<div class="line"><a name="l00382"></a><span class="lineno">  382</span>   map<string,Vector2d<float> >::iterator mapit;</div>
-<div class="line"><a name="l00383"></a><span class="lineno">  383</span>   mapit=trainingMap.begin();</div>
-<div class="line"><a name="l00384"></a><span class="lineno">  384</span>   <span class="keywordflow">while</span>(mapit!=trainingMap.end()){</div>
-<div class="line"><a name="l00385"></a><span class="lineno">  385</span>     <span class="keywordflow">if</span>(classValueMap.size()){</div>
-<div class="line"><a name="l00386"></a><span class="lineno">  386</span>       <span class="comment">//check if name in training is covered by classname_opt (values can not be 0)</span></div>
-<div class="line"><a name="l00387"></a><span class="lineno">  387</span>       <span class="keywordflow">if</span>(classValueMap[mapit->first]>0){</div>
-<div class="line"><a name="l00388"></a><span class="lineno">  388</span>     <span class="keywordflow">if</span>(verbose_opt[0])</div>
-<div class="line"><a name="l00389"></a><span class="lineno">  389</span>       std::cout << mapit->first << <span class="stringliteral">" -> "</span> << classValueMap[mapit->first] << std::endl;</div>
-<div class="line"><a name="l00390"></a><span class="lineno">  390</span>       }</div>
-<div class="line"><a name="l00391"></a><span class="lineno">  391</span>       <span class="keywordflow">else</span>{</div>
-<div class="line"><a name="l00392"></a><span class="lineno">  392</span>     std::cerr << <span class="stringliteral">"Error: names in classname option are not complete, please check names in training vector and make sure classvalue is > 0"</span> << std::endl;</div>
-<div class="line"><a name="l00393"></a><span class="lineno">  393</span>     exit(1);</div>
-<div class="line"><a name="l00394"></a><span class="lineno">  394</span>       }</div>
-<div class="line"><a name="l00395"></a><span class="lineno">  395</span>     }    </div>
-<div class="line"><a name="l00396"></a><span class="lineno">  396</span>     <span class="comment">//delete small classes</span></div>
-<div class="line"><a name="l00397"></a><span class="lineno">  397</span>     <span class="keywordflow">if</span>((mapit->second).size()<minSize_opt[0]){</div>
-<div class="line"><a name="l00398"></a><span class="lineno">  398</span>       trainingMap.erase(mapit);</div>
-<div class="line"><a name="l00399"></a><span class="lineno">  399</span>       <span class="keywordflow">continue</span>;</div>
-<div class="line"><a name="l00400"></a><span class="lineno">  400</span>     }</div>
-<div class="line"><a name="l00401"></a><span class="lineno">  401</span>     nameVector.push_back(mapit->first);</div>
-<div class="line"><a name="l00402"></a><span class="lineno">  402</span>     trainingPixels.push_back(mapit->second);</div>
-<div class="line"><a name="l00403"></a><span class="lineno">  403</span>     <span class="keywordflow">if</span>(verbose_opt[0]>1)</div>
-<div class="line"><a name="l00404"></a><span class="lineno">  404</span>       std::cout << mapit->first << <span class="stringliteral">": "</span> << (mapit->second).size() << <span class="stringliteral">" samples"</span> << std::endl;</div>
-<div class="line"><a name="l00405"></a><span class="lineno">  405</span>     <span class="comment">// trainingPixels.push_back(mapit->second); ??</span></div>
-<div class="line"><a name="l00406"></a><span class="lineno">  406</span>     <span class="comment">// ++iclass;</span></div>
-<div class="line"><a name="l00407"></a><span class="lineno">  407</span>     ++mapit;</div>
-<div class="line"><a name="l00408"></a><span class="lineno">  408</span>   }</div>
-<div class="line"><a name="l00409"></a><span class="lineno">  409</span>   nclass=trainingPixels.size();</div>
-<div class="line"><a name="l00410"></a><span class="lineno">  410</span>   <span class="keywordflow">if</span>(classname_opt.size())</div>
-<div class="line"><a name="l00411"></a><span class="lineno">  411</span>     assert(nclass==classname_opt.size());</div>
-<div class="line"><a name="l00412"></a><span class="lineno">  412</span>   nband=trainingPixels[0][0].size()-2;<span class="comment">//X and Y//trainingPixels[0][0].size();</span></div>
-<div class="line"><a name="l00413"></a><span class="lineno">  413</span> </div>
-<div class="line"><a name="l00414"></a><span class="lineno">  414</span>   mapit=testMap.begin();</div>
-<div class="line"><a name="l00415"></a><span class="lineno">  415</span>   <span class="keywordflow">while</span>(mapit!=testMap.end()){</div>
-<div class="line"><a name="l00416"></a><span class="lineno">  416</span>     <span class="keywordflow">if</span>(classValueMap.size()){</div>
-<div class="line"><a name="l00417"></a><span class="lineno">  417</span>       <span class="comment">//check if name in test is covered by classname_opt (values can not be 0)</span></div>
-<div class="line"><a name="l00418"></a><span class="lineno">  418</span>       <span class="keywordflow">if</span>(classValueMap[mapit->first]>0){</div>
-<div class="line"><a name="l00419"></a><span class="lineno">  419</span>     ;<span class="comment">//ok, no need to print to std::cout </span></div>
-<div class="line"><a name="l00420"></a><span class="lineno">  420</span>       }</div>
-<div class="line"><a name="l00421"></a><span class="lineno">  421</span>       <span class="keywordflow">else</span>{</div>
-<div class="line"><a name="l00422"></a><span class="lineno">  422</span>     std::cerr << <span class="stringliteral">"Error: names in classname option are not complete, please check names in test vector and make sure classvalue is > 0"</span> << std::endl;</div>
-<div class="line"><a name="l00423"></a><span class="lineno">  423</span>     exit(1);</div>
-<div class="line"><a name="l00424"></a><span class="lineno">  424</span>       }</div>
-<div class="line"><a name="l00425"></a><span class="lineno">  425</span>     }    </div>
-<div class="line"><a name="l00426"></a><span class="lineno">  426</span>     <span class="comment">//no need to delete small classes for test sample</span></div>
-<div class="line"><a name="l00427"></a><span class="lineno">  427</span>     testPixels.push_back(mapit->second);</div>
-<div class="line"><a name="l00428"></a><span class="lineno">  428</span>     <span class="keywordflow">if</span>(verbose_opt[0]>1)</div>
-<div class="line"><a name="l00429"></a><span class="lineno">  429</span>       std::cout << mapit->first << <span class="stringliteral">": "</span> << (mapit->second).size() << <span class="stringliteral">" samples"</span> << std::endl;</div>
-<div class="line"><a name="l00430"></a><span class="lineno">  430</span>     ++mapit;</div>
-<div class="line"><a name="l00431"></a><span class="lineno">  431</span>   }</div>
-<div class="line"><a name="l00432"></a><span class="lineno">  432</span>   <span class="keywordflow">if</span>(input_opt.size()){</div>
-<div class="line"><a name="l00433"></a><span class="lineno">  433</span>     assert(nclass==testPixels.size());</div>
-<div class="line"><a name="l00434"></a><span class="lineno">  434</span>     assert(nband=testPixels[0][0].size()-2);<span class="comment">//X and Y//testPixels[0][0].size();</span></div>
-<div class="line"><a name="l00435"></a><span class="lineno">  435</span>     assert(!cv_opt[0]);</div>
-<div class="line"><a name="l00436"></a><span class="lineno">  436</span>   }</div>
-<div class="line"><a name="l00437"></a><span class="lineno">  437</span> </div>
-<div class="line"><a name="l00438"></a><span class="lineno">  438</span>   <span class="comment">//do not remove outliers here: could easily be obtained through ogr2ogr -where 'B2<110' output.shp input.shp</span></div>
-<div class="line"><a name="l00439"></a><span class="lineno">  439</span>   <span class="comment">//balance training data</span></div>
-<div class="line"><a name="l00440"></a><span class="lineno">  440</span>   <span class="keywordflow">if</span>(balance_opt[0]>0){</div>
-<div class="line"><a name="l00441"></a><span class="lineno">  441</span>     <span class="keywordflow">if</span>(random_opt[0])</div>
-<div class="line"><a name="l00442"></a><span class="lineno">  442</span>       srand(time(NULL));</div>
-<div class="line"><a name="l00443"></a><span class="lineno">  443</span>     totalSamples=0;</div>
-<div class="line"><a name="l00444"></a><span class="lineno">  444</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iclass=0;iclass<nclass;++iclass){</div>
-<div class="line"><a name="l00445"></a><span class="lineno">  445</span>       <span class="keywordflow">if</span>(trainingPixels[iclass].size()>balance_opt[0]){</div>
-<div class="line"><a name="l00446"></a><span class="lineno">  446</span>         <span class="keywordflow">while</span>(trainingPixels[iclass].size()>balance_opt[0]){</div>
-<div class="line"><a name="l00447"></a><span class="lineno">  447</span>           <span class="keywordtype">int</span> index=rand()%trainingPixels[iclass].size();</div>
-<div class="line"><a name="l00448"></a><span class="lineno">  448</span>           trainingPixels[iclass].erase(trainingPixels[iclass].begin()+index);</div>
-<div class="line"><a name="l00449"></a><span class="lineno">  449</span>         }</div>
-<div class="line"><a name="l00450"></a><span class="lineno">  450</span>       }</div>
-<div class="line"><a name="l00451"></a><span class="lineno">  451</span>       <span class="keywordflow">else</span>{</div>
-<div class="line"><a name="l00452"></a><span class="lineno">  452</span>         <span class="keywordtype">int</span> oldsize=trainingPixels[iclass].size();</div>
-<div class="line"><a name="l00453"></a><span class="lineno">  453</span>         <span class="keywordflow">for</span>(<span class="keywordtype">int</span> isample=trainingPixels[iclass].size();isample<balance_opt[0];++isample){</div>
-<div class="line"><a name="l00454"></a><span class="lineno">  454</span>           <span class="keywordtype">int</span> index = rand()%oldsize;</div>
-<div class="line"><a name="l00455"></a><span class="lineno">  455</span>           trainingPixels[iclass].push_back(trainingPixels[iclass][index]);</div>
-<div class="line"><a name="l00456"></a><span class="lineno">  456</span>         }</div>
-<div class="line"><a name="l00457"></a><span class="lineno">  457</span>       }</div>
-<div class="line"><a name="l00458"></a><span class="lineno">  458</span>       totalSamples+=trainingPixels[iclass].size();</div>
-<div class="line"><a name="l00459"></a><span class="lineno">  459</span>     }</div>
-<div class="line"><a name="l00460"></a><span class="lineno">  460</span>     assert(totalSamples==nclass*balance_opt[0]);</div>
-<div class="line"><a name="l00461"></a><span class="lineno">  461</span>   }</div>
-<div class="line"><a name="l00462"></a><span class="lineno">  462</span> </div>
-<div class="line"><a name="l00463"></a><span class="lineno">  463</span>   <span class="comment">//no need to balance test sample    </span></div>
-<div class="line"><a name="l00464"></a><span class="lineno">  464</span>   <span class="comment">//set scale and offset</span></div>
-<div class="line"><a name="l00465"></a><span class="lineno">  465</span>   offset.resize(nband);</div>
-<div class="line"><a name="l00466"></a><span class="lineno">  466</span>   scale.resize(nband);</div>
-<div class="line"><a name="l00467"></a><span class="lineno">  467</span>   <span class="keywordflow">if</span>(offset_opt.size()>1)</div>
-<div class="line"><a name="l00468"></a><span class="lineno">  468</span>     assert(offset_opt.size()==nband);</div>
-<div class="line"><a name="l00469"></a><span class="lineno">  469</span>   <span class="keywordflow">if</span>(scale_opt.size()>1)</div>
-<div class="line"><a name="l00470"></a><span class="lineno">  470</span>     assert(scale_opt.size()==nband);</div>
-<div class="line"><a name="l00471"></a><span class="lineno">  471</span>   <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iband=0;iband<nband;++iband){</div>
-<div class="line"><a name="l00472"></a><span class="lineno">  472</span>     <span class="keywordflow">if</span>(verbose_opt[0]>1)</div>
-<div class="line"><a name="l00473"></a><span class="lineno">  473</span>       std::cout << <span class="stringliteral">"scaling for band"</span> << iband << std::endl;</div>
-<div class="line"><a name="l00474"></a><span class="lineno">  474</span>     offset[iband]=(offset_opt.size()==1)?offset_opt[0]:offset_opt[iband];</div>
-<div class="line"><a name="l00475"></a><span class="lineno">  475</span>     scale[iband]=(scale_opt.size()==1)?scale_opt[0]:scale_opt[iband];</div>
-<div class="line"><a name="l00476"></a><span class="lineno">  476</span>     <span class="comment">//search for min and maximum</span></div>
-<div class="line"><a name="l00477"></a><span class="lineno">  477</span>     <span class="keywordflow">if</span>(scale[iband]<=0){</div>
-<div class="line"><a name="l00478"></a><span class="lineno">  478</span>       <span class="keywordtype">float</span> theMin=trainingPixels[0][0][iband+startBand];</div>
-<div class="line"><a name="l00479"></a><span class="lineno">  479</span>       <span class="keywordtype">float</span> theMax=trainingPixels[0][0][iband+startBand];</div>
-<div class="line"><a name="l00480"></a><span class="lineno">  480</span>       <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iclass=0;iclass<nclass;++iclass){</div>
-<div class="line"><a name="l00481"></a><span class="lineno">  481</span>         <span class="keywordflow">for</span>(<span class="keywordtype">int</span> isample=0;isample<trainingPixels[iclass].size();++isample){</div>
-<div class="line"><a name="l00482"></a><span class="lineno">  482</span>           <span class="keywordflow">if</span>(theMin>trainingPixels[iclass][isample][iband+startBand])</div>
-<div class="line"><a name="l00483"></a><span class="lineno">  483</span>             theMin=trainingPixels[iclass][isample][iband+startBand];</div>
-<div class="line"><a name="l00484"></a><span class="lineno">  484</span>           <span class="keywordflow">if</span>(theMax<trainingPixels[iclass][isample][iband+startBand])</div>
-<div class="line"><a name="l00485"></a><span class="lineno">  485</span>             theMax=trainingPixels[iclass][isample][iband+startBand];</div>
-<div class="line"><a name="l00486"></a><span class="lineno">  486</span>         }</div>
-<div class="line"><a name="l00487"></a><span class="lineno">  487</span>       }</div>
-<div class="line"><a name="l00488"></a><span class="lineno">  488</span>       offset[iband]=theMin+(theMax-theMin)/2.0;</div>
-<div class="line"><a name="l00489"></a><span class="lineno">  489</span>       scale[iband]=(theMax-theMin)/2.0;</div>
-<div class="line"><a name="l00490"></a><span class="lineno">  490</span>       <span class="keywordflow">if</span>(verbose_opt[0]>1){</div>
-<div class="line"><a name="l00491"></a><span class="lineno">  491</span>         std::cout << <span class="stringliteral">"Extreme image values for band "</span> << iband << <span class="stringliteral">": ["</span> << theMin << <span class="stringliteral">","</span> << theMax << <span class="stringliteral">"]"</span> << std::endl;</div>
-<div class="line"><a name="l00492"></a><span class="lineno">  492</span>         std::cout << <span class="stringliteral">"Using offset, scale: "</span> << offset[iband] << <span class="stringliteral">", "</span> << scale[iband] << std::endl;</div>
-<div class="line"><a name="l00493"></a><span class="lineno">  493</span>         std::cout << <span class="stringliteral">"scaled values for band "</span> << iband << <span class="stringliteral">": ["</span> << (theMin-offset[iband])/scale[iband] << <span class="stringliteral">","</span> << (theMax-offset[iband])/scale[iband] << <span class="stringliteral">"]"</span> << std::endl;</div>
-<div class="line"><a name="l00494"></a><span class="lineno">  494</span>       }</div>
-<div class="line"><a name="l00495"></a><span class="lineno">  495</span>     }</div>
-<div class="line"><a name="l00496"></a><span class="lineno">  496</span>   }</div>
-<div class="line"><a name="l00497"></a><span class="lineno">  497</span> </div>
-<div class="line"><a name="l00498"></a><span class="lineno">  498</span>   <span class="comment">// if(priors_opt.size()==1){//default: equal priors for each class</span></div>
-<div class="line"><a name="l00499"></a><span class="lineno">  499</span>   <span class="comment">//   priors.resize(nclass);</span></div>
-<div class="line"><a name="l00500"></a><span class="lineno">  500</span>   <span class="comment">//   for(int iclass=0;iclass<nclass;++iclass)</span></div>
-<div class="line"><a name="l00501"></a><span class="lineno">  501</span>   <span class="comment">//     priors[iclass]=1.0/nclass;</span></div>
-<div class="line"><a name="l00502"></a><span class="lineno">  502</span>   <span class="comment">// }</span></div>
-<div class="line"><a name="l00503"></a><span class="lineno">  503</span>   <span class="comment">// assert(priors_opt.size()==1||priors_opt.size()==nclass);</span></div>
-<div class="line"><a name="l00504"></a><span class="lineno">  504</span>     </div>
-<div class="line"><a name="l00505"></a><span class="lineno">  505</span>   <span class="keywordflow">if</span>(verbose_opt[0]>=1){</div>
-<div class="line"><a name="l00506"></a><span class="lineno">  506</span>     std::cout << <span class="stringliteral">"number of bands: "</span> << nband << std::endl;</div>
-<div class="line"><a name="l00507"></a><span class="lineno">  507</span>     std::cout << <span class="stringliteral">"number of classes: "</span> << nclass << std::endl;</div>
-<div class="line"><a name="l00508"></a><span class="lineno">  508</span>     <span class="comment">// std::cout << "priors:";</span></div>
-<div class="line"><a name="l00509"></a><span class="lineno">  509</span>     <span class="comment">// for(int iclass=0;iclass<nclass;++iclass)</span></div>
-<div class="line"><a name="l00510"></a><span class="lineno">  510</span>     <span class="comment">//   std::cout << " " << priors[iclass];</span></div>
-<div class="line"><a name="l00511"></a><span class="lineno">  511</span>     <span class="comment">// std::cout << std::endl;</span></div>
-<div class="line"><a name="l00512"></a><span class="lineno">  512</span>   }</div>
-<div class="line"><a name="l00513"></a><span class="lineno">  513</span> </div>
-<div class="line"><a name="l00514"></a><span class="lineno">  514</span>   <span class="comment">//Calculate features of training (and test) set</span></div>
-<div class="line"><a name="l00515"></a><span class="lineno">  515</span>   nctraining.resize(nclass);</div>
-<div class="line"><a name="l00516"></a><span class="lineno">  516</span>   nctest.resize(nclass);</div>
-<div class="line"><a name="l00517"></a><span class="lineno">  517</span>   vector< Vector2d<float> > trainingFeatures(nclass);</div>
-<div class="line"><a name="l00518"></a><span class="lineno">  518</span>   <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iclass=0;iclass<nclass;++iclass){</div>
-<div class="line"><a name="l00519"></a><span class="lineno">  519</span>     <span class="keywordflow">if</span>(verbose_opt[0]>=1)</div>
-<div class="line"><a name="l00520"></a><span class="lineno">  520</span>       std::cout << <span class="stringliteral">"calculating features for class "</span> << iclass << std::endl;</div>
-<div class="line"><a name="l00521"></a><span class="lineno">  521</span>     nctraining[iclass]=trainingPixels[iclass].size();</div>
-<div class="line"><a name="l00522"></a><span class="lineno">  522</span>     <span class="keywordflow">if</span>(verbose_opt[0]>=1)</div>
-<div class="line"><a name="l00523"></a><span class="lineno">  523</span>       std::cout << <span class="stringliteral">"nctraining["</span> << iclass << <span class="stringliteral">"]: "</span> << nctraining[iclass] << std::endl;</div>
-<div class="line"><a name="l00524"></a><span class="lineno">  524</span>     <span class="keywordflow">if</span>(testPixels.size()>iclass){</div>
-<div class="line"><a name="l00525"></a><span class="lineno">  525</span>       nctest[iclass]=testPixels[iclass].size();</div>
-<div class="line"><a name="l00526"></a><span class="lineno">  526</span>       <span class="keywordflow">if</span>(verbose_opt[0]>=1){</div>
-<div class="line"><a name="l00527"></a><span class="lineno">  527</span>     std::cout << <span class="stringliteral">"nctest["</span> << iclass << <span class="stringliteral">"]: "</span> << nctest[iclass] << std::endl;</div>
-<div class="line"><a name="l00528"></a><span class="lineno">  528</span>       }</div>
-<div class="line"><a name="l00529"></a><span class="lineno">  529</span>     }</div>
-<div class="line"><a name="l00530"></a><span class="lineno">  530</span>     <span class="keywordflow">else</span></div>
-<div class="line"><a name="l00531"></a><span class="lineno">  531</span>       nctest[iclass]=0;</div>
-<div class="line"><a name="l00532"></a><span class="lineno">  532</span>     <span class="comment">// trainingFeatures[iclass].resize(nctraining[iclass]);</span></div>
-<div class="line"><a name="l00533"></a><span class="lineno">  533</span>     trainingFeatures[iclass].resize(nctraining[iclass]+nctest[iclass]);</div>
-<div class="line"><a name="l00534"></a><span class="lineno">  534</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> isample=0;isample<nctraining[iclass];++isample){</div>
-<div class="line"><a name="l00535"></a><span class="lineno">  535</span>       <span class="comment">//scale pixel values according to scale and offset!!!</span></div>
-<div class="line"><a name="l00536"></a><span class="lineno">  536</span>       <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iband=0;iband<nband;++iband){</div>
-<div class="line"><a name="l00537"></a><span class="lineno">  537</span>         assert(trainingPixels[iclass].size()>isample);</div>
-<div class="line"><a name="l00538"></a><span class="lineno">  538</span>         assert(trainingPixels[iclass][isample].size()>iband+startBand);</div>
-<div class="line"><a name="l00539"></a><span class="lineno">  539</span>         assert(offset.size()>iband);</div>
-<div class="line"><a name="l00540"></a><span class="lineno">  540</span>         assert(scale.size()>iband);</div>
-<div class="line"><a name="l00541"></a><span class="lineno">  541</span>         <span class="keywordtype">float</span> value=trainingPixels[iclass][isample][iband+startBand];</div>
-<div class="line"><a name="l00542"></a><span class="lineno">  542</span>         trainingFeatures[iclass][isample].push_back((value-offset[iband])/scale[iband]);</div>
-<div class="line"><a name="l00543"></a><span class="lineno">  543</span>       }</div>
-<div class="line"><a name="l00544"></a><span class="lineno">  544</span>     }</div>
-<div class="line"><a name="l00545"></a><span class="lineno">  545</span>     <span class="comment">// assert(trainingFeatures[iclass].size()==nctraining[iclass]);</span></div>
-<div class="line"><a name="l00546"></a><span class="lineno">  546</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> isample=0;isample<nctest[iclass];++isample){</div>
-<div class="line"><a name="l00547"></a><span class="lineno">  547</span>       <span class="comment">//scale pixel values according to scale and offset!!!</span></div>
-<div class="line"><a name="l00548"></a><span class="lineno">  548</span>       <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iband=0;iband<nband;++iband){</div>
-<div class="line"><a name="l00549"></a><span class="lineno">  549</span>         assert(testPixels[iclass].size()>isample);</div>
-<div class="line"><a name="l00550"></a><span class="lineno">  550</span>         assert(testPixels[iclass][isample].size()>iband+startBand);</div>
-<div class="line"><a name="l00551"></a><span class="lineno">  551</span>         assert(offset.size()>iband);</div>
-<div class="line"><a name="l00552"></a><span class="lineno">  552</span>         assert(scale.size()>iband);</div>
-<div class="line"><a name="l00553"></a><span class="lineno">  553</span>         <span class="keywordtype">float</span> value=testPixels[iclass][isample][iband+startBand];</div>
-<div class="line"><a name="l00554"></a><span class="lineno">  554</span>         <span class="comment">// testFeatures[iclass][isample].push_back((value-offset[iband])/scale[iband]);</span></div>
-<div class="line"><a name="l00555"></a><span class="lineno">  555</span>         trainingFeatures[iclass][nctraining[iclass]+isample].push_back((value-offset[iband])/scale[iband]);</div>
-<div class="line"><a name="l00556"></a><span class="lineno">  556</span>       }</div>
-<div class="line"><a name="l00557"></a><span class="lineno">  557</span>     }</div>
-<div class="line"><a name="l00558"></a><span class="lineno">  558</span>     assert(trainingFeatures[iclass].size()==nctraining[iclass]+nctest[iclass]);</div>
-<div class="line"><a name="l00559"></a><span class="lineno">  559</span>   }</div>
-<div class="line"><a name="l00560"></a><span class="lineno">  560</span> </div>
-<div class="line"><a name="l00561"></a><span class="lineno">  561</span>   assert(ccost_opt.size()>1);<span class="comment">//must have boundaries at least (initial value is optional)</span></div>
-<div class="line"><a name="l00562"></a><span class="lineno">  562</span>   <span class="keywordflow">if</span>(ccost_opt.size()<3)<span class="comment">//create initial value</span></div>
-<div class="line"><a name="l00563"></a><span class="lineno">  563</span>     ccost_opt.push_back(sqrt(ccost_opt[0]*ccost_opt[1]));</div>
-<div class="line"><a name="l00564"></a><span class="lineno">  564</span>   assert(gamma_opt.size()>1);<span class="comment">//must have boundaries at least (initial value is optional)</span></div>
-<div class="line"><a name="l00565"></a><span class="lineno">  565</span>   <span class="keywordflow">if</span>(gamma_opt.size()<3)<span class="comment">//create initial value</span></div>
-<div class="line"><a name="l00566"></a><span class="lineno">  566</span>     gamma_opt.push_back(sqrt(gamma_opt[0]*gamma_opt[1]));<span class="comment">//will be translated to 1.0/nFeatures</span></div>
-<div class="line"><a name="l00567"></a><span class="lineno">  567</span>   assert(ccost_opt.size()==3);<span class="comment">//min, init, max</span></div>
-<div class="line"><a name="l00568"></a><span class="lineno">  568</span>   assert(gamma_opt.size()==3);<span class="comment">//min, init, max</span></div>
-<div class="line"><a name="l00569"></a><span class="lineno">  569</span>   assert(gamma_opt[0]<gamma_opt[1]);</div>
-<div class="line"><a name="l00570"></a><span class="lineno">  570</span>   assert(gamma_opt[0]<gamma_opt[2]);</div>
-<div class="line"><a name="l00571"></a><span class="lineno">  571</span>   assert(gamma_opt[2]<gamma_opt[1]);</div>
-<div class="line"><a name="l00572"></a><span class="lineno">  572</span>   assert(ccost_opt[0]<ccost_opt[1]);</div>
-<div class="line"><a name="l00573"></a><span class="lineno">  573</span>   assert(ccost_opt[0]<ccost_opt[2]);</div>
-<div class="line"><a name="l00574"></a><span class="lineno">  574</span>   assert(ccost_opt[2]<ccost_opt[1]);</div>
-<div class="line"><a name="l00575"></a><span class="lineno">  575</span> </div>
-<div class="line"><a name="l00576"></a><span class="lineno">  576</span>   std::vector<double> x(2);</div>
-<div class="line"><a name="l00577"></a><span class="lineno">  577</span> <span class="comment">//  if(algorithm_opt[0]=="GRID"){</span></div>
-<div class="line"><a name="l00578"></a><span class="lineno">  578</span>   <span class="keywordflow">if</span> (1){</div>
-<div class="line"><a name="l00579"></a><span class="lineno">  579</span>     <span class="comment">// double minError=1000;</span></div>
-<div class="line"><a name="l00580"></a><span class="lineno">  580</span>     <span class="comment">// double minCost=0;</span></div>
-<div class="line"><a name="l00581"></a><span class="lineno">  581</span>     <span class="comment">// double minGamma=0;</span></div>
-<div class="line"><a name="l00582"></a><span class="lineno">  582</span>     <span class="keywordtype">double</span> maxKappa=0;</div>
-<div class="line"><a name="l00583"></a><span class="lineno">  583</span>     <span class="keywordtype">double</span> maxCost=0;</div>
-<div class="line"><a name="l00584"></a><span class="lineno">  584</span>     <span class="keywordtype">double</span> maxGamma=0;</div>
-<div class="line"><a name="l00585"></a><span class="lineno">  585</span>     <span class="keyword">const</span> <span class="keywordtype">char</span>* pszMessage;</div>
-<div class="line"><a name="l00586"></a><span class="lineno">  586</span>     <span class="keywordtype">void</span>* pProgressArg=NULL;</div>
-<div class="line"><a name="l00587"></a><span class="lineno">  587</span>     GDALProgressFunc pfnProgress=GDALTermProgress;</div>
-<div class="line"><a name="l00588"></a><span class="lineno">  588</span>     <span class="keywordtype">double</span> progress=0;</div>
-<div class="line"><a name="l00589"></a><span class="lineno">  589</span>     <span class="keywordflow">if</span>(!verbose_opt[0])</div>
-<div class="line"><a name="l00590"></a><span class="lineno">  590</span>       pfnProgress(progress,pszMessage,pProgressArg);</div>
-<div class="line"><a name="l00591"></a><span class="lineno">  591</span>     <span class="keywordtype">double</span> ncost=log(ccost_opt[1])/log(stepcc_opt[0])-log(ccost_opt[0])/log(stepcc_opt[0]);</div>
-<div class="line"><a name="l00592"></a><span class="lineno">  592</span>     <span class="keywordtype">double</span> ngamma=log(gamma_opt[1])/log(stepg_opt[0])-log(gamma_opt[0])/log(stepg_opt[0]);</div>
-<div class="line"><a name="l00593"></a><span class="lineno">  593</span>     <span class="keywordflow">for</span>(<span class="keywordtype">double</span> ccost=ccost_opt[0];ccost<=ccost_opt[1];ccost*=stepcc_opt[0]){</div>
-<div class="line"><a name="l00594"></a><span class="lineno">  594</span>       <span class="keywordflow">for</span>(<span class="keywordtype">double</span> gamma=gamma_opt[0];gamma<=gamma_opt[1];gamma*=stepg_opt[0]){</div>
-<div class="line"><a name="l00595"></a><span class="lineno">  595</span>     x[0]=ccost;</div>
-<div class="line"><a name="l00596"></a><span class="lineno">  596</span>     x[1]=gamma;</div>
-<div class="line"><a name="l00597"></a><span class="lineno">  597</span>     std::vector<double> theGrad;</div>
-<div class="line"><a name="l00598"></a><span class="lineno">  598</span>     <span class="keywordtype">double</span> kappa=0;</div>
-<div class="line"><a name="l00599"></a><span class="lineno">  599</span>     kappa=objFunction(x,theGrad,&trainingFeatures);</div>
-<div class="line"><a name="l00600"></a><span class="lineno">  600</span>     <span class="keywordflow">if</span>(kappa>maxKappa){</div>
-<div class="line"><a name="l00601"></a><span class="lineno">  601</span>       maxKappa=kappa;</div>
-<div class="line"><a name="l00602"></a><span class="lineno">  602</span>       maxCost=ccost;</div>
-<div class="line"><a name="l00603"></a><span class="lineno">  603</span>       maxGamma=gamma;</div>
-<div class="line"><a name="l00604"></a><span class="lineno">  604</span>     }</div>
-<div class="line"><a name="l00605"></a><span class="lineno">  605</span>     <span class="keywordflow">if</span>(verbose_opt[0])</div>
-<div class="line"><a name="l00606"></a><span class="lineno">  606</span>       std::cout << ccost << <span class="stringliteral">" "</span> << gamma << <span class="stringliteral">" "</span> << kappa<< std::endl;</div>
-<div class="line"><a name="l00607"></a><span class="lineno">  607</span>     progress+=1.0/ncost/ngamma;</div>
-<div class="line"><a name="l00608"></a><span class="lineno">  608</span>     <span class="keywordflow">if</span>(!verbose_opt[0])</div>
-<div class="line"><a name="l00609"></a><span class="lineno">  609</span>       pfnProgress(progress,pszMessage,pProgressArg);</div>
-<div class="line"><a name="l00610"></a><span class="lineno">  610</span>       }</div>
-<div class="line"><a name="l00611"></a><span class="lineno">  611</span>     }</div>
-<div class="line"><a name="l00612"></a><span class="lineno">  612</span>     progress=1.0;</div>
-<div class="line"><a name="l00613"></a><span class="lineno">  613</span>     <span class="keywordflow">if</span>(!verbose_opt[0])</div>
-<div class="line"><a name="l00614"></a><span class="lineno">  614</span>       pfnProgress(progress,pszMessage,pProgressArg);</div>
-<div class="line"><a name="l00615"></a><span class="lineno">  615</span>     x[0]=maxCost;</div>
-<div class="line"><a name="l00616"></a><span class="lineno">  616</span>     x[1]=maxGamma;</div>
-<div class="line"><a name="l00617"></a><span class="lineno">  617</span>   }</div>
-<div class="line"><a name="l00618"></a><span class="lineno">  618</span>   <span class="comment">//else{</span></div>
-<div class="line"><a name="l00619"></a><span class="lineno">  619</span>   <span class="comment">//  nlopt::opt optimizer=OptFactory::getOptimizer(algorithm_opt[0],2);</span></div>
-<div class="line"><a name="l00620"></a><span class="lineno">  620</span>   <span class="comment">//  if(verbose_opt[0]>1)</span></div>
-<div class="line"><a name="l00621"></a><span class="lineno">  621</span>   <span class="comment">//    std::cout << "optimization algorithm: " << optimizer.get_algorithm_name() << "..." << std::endl;</span></div>
-<div class="line"><a name="l00622"></a><span class="lineno">  622</span>   <span class="comment">//  std::vector<double> lb(2);</span></div>
-<div class="line"><a name="l00623"></a><span class="lineno">  623</span>   <span class="comment">//  std::vector<double> init(2);</span></div>
-<div class="line"><a name="l00624"></a><span class="lineno">  624</span>   <span class="comment">//  std::vector<double> ub(2);</span></div>
-<div class="line"><a name="l00625"></a><span class="lineno">  625</span> </div>
-<div class="line"><a name="l00626"></a><span class="lineno">  626</span>   <span class="comment">//  lb[0]=ccost_opt[0];</span></div>
-<div class="line"><a name="l00627"></a><span class="lineno">  627</span>   <span class="comment">//  lb[1]=(gamma_opt[0]>0)? gamma_opt[0] : 1.0/trainingFeatures[0][0].size();</span></div>
-<div class="line"><a name="l00628"></a><span class="lineno">  628</span>   <span class="comment">//  init[0]=ccost_opt[2];</span></div>
-<div class="line"><a name="l00629"></a><span class="lineno">  629</span>   <span class="comment">//  init[1]=(gamma_opt[2]>0)? gamma_opt[1] : 1.0/trainingFeatures[0][0].size();</span></div>
-<div class="line"><a name="l00630"></a><span class="lineno">  630</span>   <span class="comment">//  ub[0]=ccost_opt[1];</span></div>
-<div class="line"><a name="l00631"></a><span class="lineno">  631</span>   <span class="comment">//  ub[1]=(gamma_opt[1]>0)? gamma_opt[1] : 1.0/trainingFeatures[0][0].size();</span></div>
-<div class="line"><a name="l00632"></a><span class="lineno">  632</span>   <span class="comment">//  // optimizer.set_min_objective(objFunction, &trainingFeatures);</span></div>
-<div class="line"><a name="l00633"></a><span class="lineno">  633</span>   <span class="comment">//  optimizer.set_max_objective(objFunction, &trainingFeatures);</span></div>
-<div class="line"><a name="l00634"></a><span class="lineno">  634</span>   <span class="comment">//  optimizer.set_lower_bounds(lb);</span></div>
-<div class="line"><a name="l00635"></a><span class="lineno">  635</span>   <span class="comment">//  optimizer.set_upper_bounds(ub);</span></div>
-<div class="line"><a name="l00636"></a><span class="lineno">  636</span>   <span class="comment">//  if(verbose_opt[0]>1)</span></div>
-<div class="line"><a name="l00637"></a><span class="lineno">  637</span>   <span class="comment">//    std::cout << "set stopping criteria" << std::endl;</span></div>
-<div class="line"><a name="l00638"></a><span class="lineno">  638</span>   <span class="comment">//  //set stopping criteria</span></div>
-<div class="line"><a name="l00639"></a><span class="lineno">  639</span>   <span class="comment">//  if(maxit_opt[0])</span></div>
-<div class="line"><a name="l00640"></a><span class="lineno">  640</span>   <span class="comment">//    optimizer.set_maxeval(maxit_opt[0]);</span></div>
-<div class="line"><a name="l00641"></a><span class="lineno">  641</span>   <span class="comment">//  else</span></div>
-<div class="line"><a name="l00642"></a><span class="lineno">  642</span>   <span class="comment">//    optimizer.set_xtol_rel(tolerance_opt[0]);</span></div>
-<div class="line"><a name="l00643"></a><span class="lineno">  643</span>   <span class="comment">//  double minf=0;</span></div>
-<div class="line"><a name="l00644"></a><span class="lineno">  644</span>   <span class="comment">//  x=init;</span></div>
-<div class="line"><a name="l00645"></a><span class="lineno">  645</span>   <span class="comment">//  try{</span></div>
-<div class="line"><a name="l00646"></a><span class="lineno">  646</span>   <span class="comment">//    optimizer.optimize(x, minf);</span></div>
-<div class="line"><a name="l00647"></a><span class="lineno">  647</span>   <span class="comment">//  }</span></div>
-<div class="line"><a name="l00648"></a><span class="lineno">  648</span>   <span class="comment">//  catch(string error){</span></div>
-<div class="line"><a name="l00649"></a><span class="lineno">  649</span>   <span class="comment">//    cerr << error << std::endl;</span></div>
-<div class="line"><a name="l00650"></a><span class="lineno">  650</span>   <span class="comment">//    exit(1);</span></div>
-<div class="line"><a name="l00651"></a><span class="lineno">  651</span>   <span class="comment">//  }</span></div>
-<div class="line"><a name="l00652"></a><span class="lineno">  652</span>   <span class="comment">//  catch (exception& e){</span></div>
-<div class="line"><a name="l00653"></a><span class="lineno">  653</span>   <span class="comment">//    cout << e.what() << endl;</span></div>
-<div class="line"><a name="l00654"></a><span class="lineno">  654</span>   <span class="comment">//  }</span></div>
-<div class="line"><a name="l00655"></a><span class="lineno">  655</span>   <span class="comment">//  catch(...){</span></div>
-<div class="line"><a name="l00656"></a><span class="lineno">  656</span>   <span class="comment">//    cerr << "error catched" << std::endl;</span></div>
-<div class="line"><a name="l00657"></a><span class="lineno">  657</span>   <span class="comment">//    exit(1);</span></div>
-<div class="line"><a name="l00658"></a><span class="lineno">  658</span>   <span class="comment">//  }</span></div>
-<div class="line"><a name="l00659"></a><span class="lineno">  659</span> </div>
-<div class="line"><a name="l00660"></a><span class="lineno">  660</span>   <span class="comment">//  double ccost=x[0];</span></div>
-<div class="line"><a name="l00661"></a><span class="lineno">  661</span>   <span class="comment">//  double gamma=x[1];</span></div>
-<div class="line"><a name="l00662"></a><span class="lineno">  662</span>   <span class="comment">//  if(verbose_opt[0])</span></div>
-<div class="line"><a name="l00663"></a><span class="lineno">  663</span>   <span class="comment">//    std::cout << "optimized with " << optimizer.get_algorithm_name() << "..." << std::endl;</span></div>
-<div class="line"><a name="l00664"></a><span class="lineno">  664</span>   <span class="comment">//}</span></div>
-<div class="line"><a name="l00665"></a><span class="lineno">  665</span>   std::cout << <span class="stringliteral">" --ccost "</span> << x[0];</div>
-<div class="line"><a name="l00666"></a><span class="lineno">  666</span>   std::cout << <span class="stringliteral">" --gamma "</span> << x[1];</div>
-<div class="line"><a name="l00667"></a><span class="lineno">  667</span>   std::cout << std::endl;</div>
-<div class="line"><a name="l00668"></a><span class="lineno">  668</span> }</div>
+<div class="line"><a name="l00314"></a><span class="lineno">  314</span>   <span class="comment">//convert start and end band options to vector of band indexes</span></div>
+<div class="line"><a name="l00315"></a><span class="lineno">  315</span>   <span class="keywordflow">try</span>{</div>
+<div class="line"><a name="l00316"></a><span class="lineno">  316</span>     <span class="keywordflow">if</span>(bstart_opt.size()){</div>
+<div class="line"><a name="l00317"></a><span class="lineno">  317</span>       <span class="keywordflow">if</span>(bend_opt.size()!=bstart_opt.size()){</div>
+<div class="line"><a name="l00318"></a><span class="lineno">  318</span>     <span class="keywordtype">string</span> errorstring=<span class="stringliteral">"Error: options for start and end band indexes must be provided as pairs, missing end band"</span>;</div>
+<div class="line"><a name="l00319"></a><span class="lineno">  319</span>     <span class="keywordflow">throw</span>(errorstring);</div>
+<div class="line"><a name="l00320"></a><span class="lineno">  320</span>       }</div>
+<div class="line"><a name="l00321"></a><span class="lineno">  321</span>       band_opt.clear();</div>
+<div class="line"><a name="l00322"></a><span class="lineno">  322</span>       <span class="keywordflow">for</span>(<span class="keywordtype">int</span> ipair=0;ipair<bstart_opt.size();++ipair){</div>
+<div class="line"><a name="l00323"></a><span class="lineno">  323</span>     <span class="keywordflow">if</span>(bend_opt[ipair]<=bstart_opt[ipair]){</div>
+<div class="line"><a name="l00324"></a><span class="lineno">  324</span>       <span class="keywordtype">string</span> errorstring=<span class="stringliteral">"Error: index for end band must be smaller then start band"</span>;</div>
+<div class="line"><a name="l00325"></a><span class="lineno">  325</span>       <span class="keywordflow">throw</span>(errorstring);</div>
+<div class="line"><a name="l00326"></a><span class="lineno">  326</span>     }</div>
+<div class="line"><a name="l00327"></a><span class="lineno">  327</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iband=bstart_opt[ipair];iband<=bend_opt[ipair];++iband)</div>
+<div class="line"><a name="l00328"></a><span class="lineno">  328</span>       band_opt.push_back(iband);</div>
+<div class="line"><a name="l00329"></a><span class="lineno">  329</span>       }</div>
+<div class="line"><a name="l00330"></a><span class="lineno">  330</span>     }</div>
+<div class="line"><a name="l00331"></a><span class="lineno">  331</span>   }</div>
+<div class="line"><a name="l00332"></a><span class="lineno">  332</span>   <span class="keywordflow">catch</span>(<span class="keywordtype">string</span> error){</div>
+<div class="line"><a name="l00333"></a><span class="lineno">  333</span>     cerr << error << std::endl;</div>
+<div class="line"><a name="l00334"></a><span class="lineno">  334</span>     exit(1);</div>
+<div class="line"><a name="l00335"></a><span class="lineno">  335</span>   }</div>
+<div class="line"><a name="l00336"></a><span class="lineno">  336</span>   <span class="comment">//sort bands</span></div>
+<div class="line"><a name="l00337"></a><span class="lineno">  337</span>   <span class="keywordflow">if</span>(band_opt.size())</div>
+<div class="line"><a name="l00338"></a><span class="lineno">  338</span>     std::sort(band_opt.begin(),band_opt.end());</div>
+<div class="line"><a name="l00339"></a><span class="lineno">  339</span> </div>
+<div class="line"><a name="l00340"></a><span class="lineno">  340</span>   <span class="comment">// map<string,short> classValueMap;//global variable for now (due to getCost)</span></div>
+<div class="line"><a name="l00341"></a><span class="lineno">  341</span>   <span class="keywordflow">if</span>(classname_opt.size()){</div>
+<div class="line"><a name="l00342"></a><span class="lineno">  342</span>     assert(classname_opt.size()==classvalue_opt.size());</div>
+<div class="line"><a name="l00343"></a><span class="lineno">  343</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iclass=0;iclass<classname_opt.size();++iclass)</div>
+<div class="line"><a name="l00344"></a><span class="lineno">  344</span>       classValueMap[classname_opt[iclass]]=classvalue_opt[iclass];</div>
+<div class="line"><a name="l00345"></a><span class="lineno">  345</span>   }</div>
+<div class="line"><a name="l00346"></a><span class="lineno">  346</span> </div>
+<div class="line"><a name="l00347"></a><span class="lineno">  347</span>   <span class="comment">//----------------------------------- Training -------------------------------</span></div>
+<div class="line"><a name="l00348"></a><span class="lineno">  348</span>   <span class="keyword">struct </span><a class="code" href="structsvm__problem.html">svm_problem</a> prob;</div>
+<div class="line"><a name="l00349"></a><span class="lineno">  349</span>   vector<string> fields;</div>
+<div class="line"><a name="l00350"></a><span class="lineno">  350</span>   <span class="comment">//organize training data</span></div>
+<div class="line"><a name="l00351"></a><span class="lineno">  351</span>   trainingPixels.clear();</div>
+<div class="line"><a name="l00352"></a><span class="lineno">  352</span>   testPixels.clear();</div>
+<div class="line"><a name="l00353"></a><span class="lineno">  353</span>   map<string,Vector2d<float> > trainingMap;</div>
+<div class="line"><a name="l00354"></a><span class="lineno">  354</span>   map<string,Vector2d<float> > testMap;</div>
+<div class="line"><a name="l00355"></a><span class="lineno">  355</span>   <span class="keywordflow">if</span>(verbose_opt[0]>=1)</div>
+<div class="line"><a name="l00356"></a><span class="lineno">  356</span>     std::cout << <span class="stringliteral">"reading training file "</span> << training_opt[0] << std::endl;</div>
+<div class="line"><a name="l00357"></a><span class="lineno">  357</span>   <span class="keywordflow">try</span>{</div>
+<div class="line"><a name="l00358"></a><span class="lineno">  358</span>     <a class="code" href="classImgReaderOgr.html">ImgReaderOgr</a> trainingReader(training_opt[0]);</div>
+<div class="line"><a name="l00359"></a><span class="lineno">  359</span>     <span class="keywordflow">if</span>(band_opt.size()){</div>
+<div class="line"><a name="l00360"></a><span class="lineno">  360</span>       totalSamples=trainingReader.readDataImageOgr(trainingMap,fields,band_opt,label_opt[0],tlayer_opt,verbose_opt[0]);</div>
+<div class="line"><a name="l00361"></a><span class="lineno">  361</span>       <span class="keywordflow">if</span>(input_opt.size()){</div>
+<div class="line"><a name="l00362"></a><span class="lineno">  362</span>     <a class="code" href="classImgReaderOgr.html">ImgReaderOgr</a> inputReader(input_opt[0]);</div>
+<div class="line"><a name="l00363"></a><span class="lineno">  363</span>     totalTestSamples=inputReader.readDataImageOgr(testMap,fields,band_opt,label_opt[0],tlayer_opt,verbose_opt[0]);</div>
+<div class="line"><a name="l00364"></a><span class="lineno">  364</span>     inputReader.close();</div>
+<div class="line"><a name="l00365"></a><span class="lineno">  365</span>       }</div>
+<div class="line"><a name="l00366"></a><span class="lineno">  366</span>     }</div>
+<div class="line"><a name="l00367"></a><span class="lineno">  367</span>     <span class="keywordflow">else</span>{</div>
+<div class="line"><a name="l00368"></a><span class="lineno">  368</span>       totalSamples=trainingReader.readDataImageOgr(trainingMap,fields,0,0,label_opt[0],tlayer_opt,verbose_opt[0]);</div>
+<div class="line"><a name="l00369"></a><span class="lineno">  369</span>       <span class="keywordflow">if</span>(input_opt.size()){</div>
+<div class="line"><a name="l00370"></a><span class="lineno">  370</span>     <a class="code" href="classImgReaderOgr.html">ImgReaderOgr</a> inputReader(input_opt[0]);</div>
+<div class="line"><a name="l00371"></a><span class="lineno">  371</span>     totalTestSamples=inputReader.readDataImageOgr(testMap,fields,0,0,label_opt[0],tlayer_opt,verbose_opt[0]);</div>
+<div class="line"><a name="l00372"></a><span class="lineno">  372</span>     inputReader.close();</div>
+<div class="line"><a name="l00373"></a><span class="lineno">  373</span>       }</div>
+<div class="line"><a name="l00374"></a><span class="lineno">  374</span>       trainingReader.close();</div>
+<div class="line"><a name="l00375"></a><span class="lineno">  375</span>     }</div>
+<div class="line"><a name="l00376"></a><span class="lineno">  376</span>     <span class="keywordflow">if</span>(trainingMap.size()<2){</div>
+<div class="line"><a name="l00377"></a><span class="lineno">  377</span>       <span class="comment">// map<string,Vector2d<float> >::iterator mapit=trainingMap.begin();</span></div>
+<div class="line"><a name="l00378"></a><span class="lineno">  378</span>       <span class="comment">// while(mapit!=trainingMap.end())</span></div>
+<div class="line"><a name="l00379"></a><span class="lineno">  379</span>       <span class="comment">//    cerr << mapit->first << " -> " << classValueMap[mapit->first] << std::endl;</span></div>
+<div class="line"><a name="l00380"></a><span class="lineno">  380</span>       <span class="keywordtype">string</span> errorstring=<span class="stringliteral">"Error: could not read at least two classes from training input file"</span>;</div>
+<div class="line"><a name="l00381"></a><span class="lineno">  381</span>       <span class="keywordflow">throw</span>(errorstring);</div>
+<div class="line"><a name="l00382"></a><span class="lineno">  382</span>     }</div>
+<div class="line"><a name="l00383"></a><span class="lineno">  383</span>     <span class="keywordflow">if</span>(input_opt.size()&&testMap.size()<2){</div>
+<div class="line"><a name="l00384"></a><span class="lineno">  384</span>       <span class="keywordtype">string</span> errorstring=<span class="stringliteral">"Error: could not read at least two classes from test input file"</span>;</div>
+<div class="line"><a name="l00385"></a><span class="lineno">  385</span>       <span class="keywordflow">throw</span>(errorstring);</div>
+<div class="line"><a name="l00386"></a><span class="lineno">  386</span>     }</div>
+<div class="line"><a name="l00387"></a><span class="lineno">  387</span>   }</div>
+<div class="line"><a name="l00388"></a><span class="lineno">  388</span>   <span class="keywordflow">catch</span>(<span class="keywordtype">string</span> error){</div>
+<div class="line"><a name="l00389"></a><span class="lineno">  389</span>     cerr << error << std::endl;</div>
+<div class="line"><a name="l00390"></a><span class="lineno">  390</span>     exit(1);</div>
+<div class="line"><a name="l00391"></a><span class="lineno">  391</span>   }</div>
+<div class="line"><a name="l00392"></a><span class="lineno">  392</span>   <span class="keywordflow">catch</span>(...){</div>
+<div class="line"><a name="l00393"></a><span class="lineno">  393</span>     cerr << <span class="stringliteral">"error catched"</span> << std::endl;</div>
+<div class="line"><a name="l00394"></a><span class="lineno">  394</span>     exit(1);</div>
+<div class="line"><a name="l00395"></a><span class="lineno">  395</span>   }</div>
+<div class="line"><a name="l00396"></a><span class="lineno">  396</span>   <span class="comment">//todo delete class 0 ?</span></div>
+<div class="line"><a name="l00397"></a><span class="lineno">  397</span>   <span class="comment">// if(verbose_opt[0]>=1)</span></div>
+<div class="line"><a name="l00398"></a><span class="lineno">  398</span>   <span class="comment">//   std::cout << "erasing class 0 from training set (" << trainingMap[0].size() << " from " << totalSamples << ") samples" << std::endl;</span></div>
+<div class="line"><a name="l00399"></a><span class="lineno">  399</span>   <span class="comment">// totalSamples-=trainingMap[0].size();</span></div>
+<div class="line"><a name="l00400"></a><span class="lineno">  400</span>   <span class="comment">// trainingMap.erase(0);</span></div>
+<div class="line"><a name="l00401"></a><span class="lineno">  401</span> </div>
+<div class="line"><a name="l00402"></a><span class="lineno">  402</span>   <span class="keywordflow">if</span>(verbose_opt[0]>1)</div>
+<div class="line"><a name="l00403"></a><span class="lineno">  403</span>     std::cout << <span class="stringliteral">"training pixels: "</span> << std::endl;</div>
+<div class="line"><a name="l00404"></a><span class="lineno">  404</span>   map<string,Vector2d<float> >::iterator mapit;</div>
+<div class="line"><a name="l00405"></a><span class="lineno">  405</span>   mapit=trainingMap.begin();</div>
+<div class="line"><a name="l00406"></a><span class="lineno">  406</span>   <span class="keywordflow">while</span>(mapit!=trainingMap.end()){</div>
+<div class="line"><a name="l00407"></a><span class="lineno">  407</span>     <span class="keywordflow">if</span>(classValueMap.size()){</div>
+<div class="line"><a name="l00408"></a><span class="lineno">  408</span>       <span class="comment">//check if name in training is covered by classname_opt (values can not be 0)</span></div>
+<div class="line"><a name="l00409"></a><span class="lineno">  409</span>       <span class="keywordflow">if</span>(classValueMap[mapit->first]>0){</div>
+<div class="line"><a name="l00410"></a><span class="lineno">  410</span>     <span class="keywordflow">if</span>(verbose_opt[0])</div>
+<div class="line"><a name="l00411"></a><span class="lineno">  411</span>       std::cout << mapit->first << <span class="stringliteral">" -> "</span> << classValueMap[mapit->first] << std::endl;</div>
+<div class="line"><a name="l00412"></a><span class="lineno">  412</span>       }</div>
+<div class="line"><a name="l00413"></a><span class="lineno">  413</span>       <span class="keywordflow">else</span>{</div>
+<div class="line"><a name="l00414"></a><span class="lineno">  414</span>     std::cerr << <span class="stringliteral">"Error: names in classname option are not complete, please check names in training vector and make sure classvalue is > 0"</span> << std::endl;</div>
+<div class="line"><a name="l00415"></a><span class="lineno">  415</span>     exit(1);</div>
+<div class="line"><a name="l00416"></a><span class="lineno">  416</span>       }</div>
+<div class="line"><a name="l00417"></a><span class="lineno">  417</span>     }    </div>
+<div class="line"><a name="l00418"></a><span class="lineno">  418</span>     <span class="comment">//delete small classes</span></div>
+<div class="line"><a name="l00419"></a><span class="lineno">  419</span>     <span class="keywordflow">if</span>((mapit->second).size()<minSize_opt[0]){</div>
+<div class="line"><a name="l00420"></a><span class="lineno">  420</span>       trainingMap.erase(mapit);</div>
+<div class="line"><a name="l00421"></a><span class="lineno">  421</span>       <span class="keywordflow">continue</span>;</div>
+<div class="line"><a name="l00422"></a><span class="lineno">  422</span>     }</div>
+<div class="line"><a name="l00423"></a><span class="lineno">  423</span>     nameVector.push_back(mapit->first);</div>
+<div class="line"><a name="l00424"></a><span class="lineno">  424</span>     trainingPixels.push_back(mapit->second);</div>
+<div class="line"><a name="l00425"></a><span class="lineno">  425</span>     <span class="keywordflow">if</span>(verbose_opt[0]>1)</div>
+<div class="line"><a name="l00426"></a><span class="lineno">  426</span>       std::cout << mapit->first << <span class="stringliteral">": "</span> << (mapit->second).size() << <span class="stringliteral">" samples"</span> << std::endl;</div>
+<div class="line"><a name="l00427"></a><span class="lineno">  427</span>     <span class="comment">// trainingPixels.push_back(mapit->second); ??</span></div>
+<div class="line"><a name="l00428"></a><span class="lineno">  428</span>     <span class="comment">// ++iclass;</span></div>
+<div class="line"><a name="l00429"></a><span class="lineno">  429</span>     ++mapit;</div>
+<div class="line"><a name="l00430"></a><span class="lineno">  430</span>   }</div>
+<div class="line"><a name="l00431"></a><span class="lineno">  431</span>   nclass=trainingPixels.size();</div>
+<div class="line"><a name="l00432"></a><span class="lineno">  432</span>   <span class="keywordflow">if</span>(classname_opt.size())</div>
+<div class="line"><a name="l00433"></a><span class="lineno">  433</span>     assert(nclass==classname_opt.size());</div>
+<div class="line"><a name="l00434"></a><span class="lineno">  434</span>   nband=trainingPixels[0][0].size()-2;<span class="comment">//X and Y//trainingPixels[0][0].size();</span></div>
+<div class="line"><a name="l00435"></a><span class="lineno">  435</span> </div>
+<div class="line"><a name="l00436"></a><span class="lineno">  436</span>   mapit=testMap.begin();</div>
+<div class="line"><a name="l00437"></a><span class="lineno">  437</span>   <span class="keywordflow">while</span>(mapit!=testMap.end()){</div>
+<div class="line"><a name="l00438"></a><span class="lineno">  438</span>     <span class="keywordflow">if</span>(classValueMap.size()){</div>
+<div class="line"><a name="l00439"></a><span class="lineno">  439</span>       <span class="comment">//check if name in test is covered by classname_opt (values can not be 0)</span></div>
+<div class="line"><a name="l00440"></a><span class="lineno">  440</span>       <span class="keywordflow">if</span>(classValueMap[mapit->first]>0){</div>
+<div class="line"><a name="l00441"></a><span class="lineno">  441</span>     ;<span class="comment">//ok, no need to print to std::cout </span></div>
+<div class="line"><a name="l00442"></a><span class="lineno">  442</span>       }</div>
+<div class="line"><a name="l00443"></a><span class="lineno">  443</span>       <span class="keywordflow">else</span>{</div>
+<div class="line"><a name="l00444"></a><span class="lineno">  444</span>     std::cerr << <span class="stringliteral">"Error: names in classname option are not complete, please check names in test vector and make sure classvalue is > 0"</span> << std::endl;</div>
+<div class="line"><a name="l00445"></a><span class="lineno">  445</span>     exit(1);</div>
+<div class="line"><a name="l00446"></a><span class="lineno">  446</span>       }</div>
+<div class="line"><a name="l00447"></a><span class="lineno">  447</span>     }    </div>
+<div class="line"><a name="l00448"></a><span class="lineno">  448</span>     <span class="comment">//no need to delete small classes for test sample</span></div>
+<div class="line"><a name="l00449"></a><span class="lineno">  449</span>     testPixels.push_back(mapit->second);</div>
+<div class="line"><a name="l00450"></a><span class="lineno">  450</span>     <span class="keywordflow">if</span>(verbose_opt[0]>1)</div>
+<div class="line"><a name="l00451"></a><span class="lineno">  451</span>       std::cout << mapit->first << <span class="stringliteral">": "</span> << (mapit->second).size() << <span class="stringliteral">" samples"</span> << std::endl;</div>
+<div class="line"><a name="l00452"></a><span class="lineno">  452</span>     ++mapit;</div>
+<div class="line"><a name="l00453"></a><span class="lineno">  453</span>   }</div>
+<div class="line"><a name="l00454"></a><span class="lineno">  454</span>   <span class="keywordflow">if</span>(input_opt.size()){</div>
+<div class="line"><a name="l00455"></a><span class="lineno">  455</span>     assert(nclass==testPixels.size());</div>
+<div class="line"><a name="l00456"></a><span class="lineno">  456</span>     assert(nband=testPixels[0][0].size()-2);<span class="comment">//X and Y//testPixels[0][0].size();</span></div>
+<div class="line"><a name="l00457"></a><span class="lineno">  457</span>     assert(!cv_opt[0]);</div>
+<div class="line"><a name="l00458"></a><span class="lineno">  458</span>   }</div>
+<div class="line"><a name="l00459"></a><span class="lineno">  459</span> </div>
+<div class="line"><a name="l00460"></a><span class="lineno">  460</span>   <span class="comment">//do not remove outliers here: could easily be obtained through ogr2ogr -where 'B2<110' output.shp input.shp</span></div>
+<div class="line"><a name="l00461"></a><span class="lineno">  461</span>   <span class="comment">//balance training data</span></div>
+<div class="line"><a name="l00462"></a><span class="lineno">  462</span>   <span class="keywordflow">if</span>(balance_opt[0]>0){</div>
+<div class="line"><a name="l00463"></a><span class="lineno">  463</span>     <span class="keywordflow">if</span>(random_opt[0])</div>
+<div class="line"><a name="l00464"></a><span class="lineno">  464</span>       srand(time(NULL));</div>
+<div class="line"><a name="l00465"></a><span class="lineno">  465</span>     totalSamples=0;</div>
+<div class="line"><a name="l00466"></a><span class="lineno">  466</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iclass=0;iclass<nclass;++iclass){</div>
+<div class="line"><a name="l00467"></a><span class="lineno">  467</span>       <span class="keywordflow">if</span>(trainingPixels[iclass].size()>balance_opt[0]){</div>
+<div class="line"><a name="l00468"></a><span class="lineno">  468</span>         <span class="keywordflow">while</span>(trainingPixels[iclass].size()>balance_opt[0]){</div>
+<div class="line"><a name="l00469"></a><span class="lineno">  469</span>           <span class="keywordtype">int</span> index=rand()%trainingPixels[iclass].size();</div>
+<div class="line"><a name="l00470"></a><span class="lineno">  470</span>           trainingPixels[iclass].erase(trainingPixels[iclass].begin()+index);</div>
+<div class="line"><a name="l00471"></a><span class="lineno">  471</span>         }</div>
+<div class="line"><a name="l00472"></a><span class="lineno">  472</span>       }</div>
+<div class="line"><a name="l00473"></a><span class="lineno">  473</span>       <span class="keywordflow">else</span>{</div>
+<div class="line"><a name="l00474"></a><span class="lineno">  474</span>         <span class="keywordtype">int</span> oldsize=trainingPixels[iclass].size();</div>
+<div class="line"><a name="l00475"></a><span class="lineno">  475</span>         <span class="keywordflow">for</span>(<span class="keywordtype">int</span> isample=trainingPixels[iclass].size();isample<balance_opt[0];++isample){</div>
+<div class="line"><a name="l00476"></a><span class="lineno">  476</span>           <span class="keywordtype">int</span> index = rand()%oldsize;</div>
+<div class="line"><a name="l00477"></a><span class="lineno">  477</span>           trainingPixels[iclass].push_back(trainingPixels[iclass][index]);</div>
+<div class="line"><a name="l00478"></a><span class="lineno">  478</span>         }</div>
+<div class="line"><a name="l00479"></a><span class="lineno">  479</span>       }</div>
+<div class="line"><a name="l00480"></a><span class="lineno">  480</span>       totalSamples+=trainingPixels[iclass].size();</div>
+<div class="line"><a name="l00481"></a><span class="lineno">  481</span>     }</div>
+<div class="line"><a name="l00482"></a><span class="lineno">  482</span>     assert(totalSamples==nclass*balance_opt[0]);</div>
+<div class="line"><a name="l00483"></a><span class="lineno">  483</span>   }</div>
+<div class="line"><a name="l00484"></a><span class="lineno">  484</span> </div>
+<div class="line"><a name="l00485"></a><span class="lineno">  485</span>   <span class="comment">//no need to balance test sample    </span></div>
+<div class="line"><a name="l00486"></a><span class="lineno">  486</span>   <span class="comment">//set scale and offset</span></div>
+<div class="line"><a name="l00487"></a><span class="lineno">  487</span>   offset.resize(nband);</div>
+<div class="line"><a name="l00488"></a><span class="lineno">  488</span>   scale.resize(nband);</div>
+<div class="line"><a name="l00489"></a><span class="lineno">  489</span>   <span class="keywordflow">if</span>(offset_opt.size()>1)</div>
+<div class="line"><a name="l00490"></a><span class="lineno">  490</span>     assert(offset_opt.size()==nband);</div>
+<div class="line"><a name="l00491"></a><span class="lineno">  491</span>   <span class="keywordflow">if</span>(scale_opt.size()>1)</div>
+<div class="line"><a name="l00492"></a><span class="lineno">  492</span>     assert(scale_opt.size()==nband);</div>
+<div class="line"><a name="l00493"></a><span class="lineno">  493</span>   <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iband=0;iband<nband;++iband){</div>
+<div class="line"><a name="l00494"></a><span class="lineno">  494</span>     <span class="keywordflow">if</span>(verbose_opt[0]>1)</div>
+<div class="line"><a name="l00495"></a><span class="lineno">  495</span>       std::cout << <span class="stringliteral">"scaling for band"</span> << iband << std::endl;</div>
+<div class="line"><a name="l00496"></a><span class="lineno">  496</span>     offset[iband]=(offset_opt.size()==1)?offset_opt[0]:offset_opt[iband];</div>
+<div class="line"><a name="l00497"></a><span class="lineno">  497</span>     scale[iband]=(scale_opt.size()==1)?scale_opt[0]:scale_opt[iband];</div>
+<div class="line"><a name="l00498"></a><span class="lineno">  498</span>     <span class="comment">//search for min and maximum</span></div>
+<div class="line"><a name="l00499"></a><span class="lineno">  499</span>     <span class="keywordflow">if</span>(scale[iband]<=0){</div>
+<div class="line"><a name="l00500"></a><span class="lineno">  500</span>       <span class="keywordtype">float</span> theMin=trainingPixels[0][0][iband+startBand];</div>
+<div class="line"><a name="l00501"></a><span class="lineno">  501</span>       <span class="keywordtype">float</span> theMax=trainingPixels[0][0][iband+startBand];</div>
+<div class="line"><a name="l00502"></a><span class="lineno">  502</span>       <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iclass=0;iclass<nclass;++iclass){</div>
+<div class="line"><a name="l00503"></a><span class="lineno">  503</span>         <span class="keywordflow">for</span>(<span class="keywordtype">int</span> isample=0;isample<trainingPixels[iclass].size();++isample){</div>
+<div class="line"><a name="l00504"></a><span class="lineno">  504</span>           <span class="keywordflow">if</span>(theMin>trainingPixels[iclass][isample][iband+startBand])</div>
+<div class="line"><a name="l00505"></a><span class="lineno">  505</span>             theMin=trainingPixels[iclass][isample][iband+startBand];</div>
+<div class="line"><a name="l00506"></a><span class="lineno">  506</span>           <span class="keywordflow">if</span>(theMax<trainingPixels[iclass][isample][iband+startBand])</div>
+<div class="line"><a name="l00507"></a><span class="lineno">  507</span>             theMax=trainingPixels[iclass][isample][iband+startBand];</div>
+<div class="line"><a name="l00508"></a><span class="lineno">  508</span>         }</div>
+<div class="line"><a name="l00509"></a><span class="lineno">  509</span>       }</div>
+<div class="line"><a name="l00510"></a><span class="lineno">  510</span>       offset[iband]=theMin+(theMax-theMin)/2.0;</div>
+<div class="line"><a name="l00511"></a><span class="lineno">  511</span>       scale[iband]=(theMax-theMin)/2.0;</div>
+<div class="line"><a name="l00512"></a><span class="lineno">  512</span>       <span class="keywordflow">if</span>(verbose_opt[0]>1){</div>
+<div class="line"><a name="l00513"></a><span class="lineno">  513</span>         std::cout << <span class="stringliteral">"Extreme image values for band "</span> << iband << <span class="stringliteral">": ["</span> << theMin << <span class="stringliteral">","</span> << theMax << <span class="stringliteral">"]"</span> << std::endl;</div>
+<div class="line"><a name="l00514"></a><span class="lineno">  514</span>         std::cout << <span class="stringliteral">"Using offset, scale: "</span> << offset[iband] << <span class="stringliteral">", "</span> << scale[iband] << std::endl;</div>
+<div class="line"><a name="l00515"></a><span class="lineno">  515</span>         std::cout << <span class="stringliteral">"scaled values for band "</span> << iband << <span class="stringliteral">": ["</span> << (theMin-offset[iband])/scale[iband] << <span class="stringliteral">","</span> << (theMax-offset[iband])/scale[iband] << <span class="stringliteral">"]"</span> << std::endl;</div>
+<div class="line"><a name="l00516"></a><span class="lineno">  516</span>       }</div>
+<div class="line"><a name="l00517"></a><span class="lineno">  517</span>     }</div>
+<div class="line"><a name="l00518"></a><span class="lineno">  518</span>   }</div>
+<div class="line"><a name="l00519"></a><span class="lineno">  519</span> </div>
+<div class="line"><a name="l00520"></a><span class="lineno">  520</span>   <span class="comment">// if(priors_opt.size()==1){//default: equal priors for each class</span></div>
+<div class="line"><a name="l00521"></a><span class="lineno">  521</span>   <span class="comment">//   priors.resize(nclass);</span></div>
+<div class="line"><a name="l00522"></a><span class="lineno">  522</span>   <span class="comment">//   for(int iclass=0;iclass<nclass;++iclass)</span></div>
+<div class="line"><a name="l00523"></a><span class="lineno">  523</span>   <span class="comment">//     priors[iclass]=1.0/nclass;</span></div>
+<div class="line"><a name="l00524"></a><span class="lineno">  524</span>   <span class="comment">// }</span></div>
+<div class="line"><a name="l00525"></a><span class="lineno">  525</span>   <span class="comment">// assert(priors_opt.size()==1||priors_opt.size()==nclass);</span></div>
+<div class="line"><a name="l00526"></a><span class="lineno">  526</span>     </div>
+<div class="line"><a name="l00527"></a><span class="lineno">  527</span>   <span class="keywordflow">if</span>(verbose_opt[0]>=1){</div>
+<div class="line"><a name="l00528"></a><span class="lineno">  528</span>     std::cout << <span class="stringliteral">"number of bands: "</span> << nband << std::endl;</div>
+<div class="line"><a name="l00529"></a><span class="lineno">  529</span>     std::cout << <span class="stringliteral">"number of classes: "</span> << nclass << std::endl;</div>
+<div class="line"><a name="l00530"></a><span class="lineno">  530</span>     <span class="comment">// std::cout << "priors:";</span></div>
+<div class="line"><a name="l00531"></a><span class="lineno">  531</span>     <span class="comment">// for(int iclass=0;iclass<nclass;++iclass)</span></div>
+<div class="line"><a name="l00532"></a><span class="lineno">  532</span>     <span class="comment">//   std::cout << " " << priors[iclass];</span></div>
+<div class="line"><a name="l00533"></a><span class="lineno">  533</span>     <span class="comment">// std::cout << std::endl;</span></div>
+<div class="line"><a name="l00534"></a><span class="lineno">  534</span>   }</div>
+<div class="line"><a name="l00535"></a><span class="lineno">  535</span> </div>
+<div class="line"><a name="l00536"></a><span class="lineno">  536</span>   <span class="comment">//Calculate features of training (and test) set</span></div>
+<div class="line"><a name="l00537"></a><span class="lineno">  537</span>   nctraining.resize(nclass);</div>
+<div class="line"><a name="l00538"></a><span class="lineno">  538</span>   nctest.resize(nclass);</div>
+<div class="line"><a name="l00539"></a><span class="lineno">  539</span>   vector< Vector2d<float> > trainingFeatures(nclass);</div>
+<div class="line"><a name="l00540"></a><span class="lineno">  540</span>   <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iclass=0;iclass<nclass;++iclass){</div>
+<div class="line"><a name="l00541"></a><span class="lineno">  541</span>     <span class="keywordflow">if</span>(verbose_opt[0]>=1)</div>
+<div class="line"><a name="l00542"></a><span class="lineno">  542</span>       std::cout << <span class="stringliteral">"calculating features for class "</span> << iclass << std::endl;</div>
+<div class="line"><a name="l00543"></a><span class="lineno">  543</span>     nctraining[iclass]=trainingPixels[iclass].size();</div>
+<div class="line"><a name="l00544"></a><span class="lineno">  544</span>     <span class="keywordflow">if</span>(verbose_opt[0]>=1)</div>
+<div class="line"><a name="l00545"></a><span class="lineno">  545</span>       std::cout << <span class="stringliteral">"nctraining["</span> << iclass << <span class="stringliteral">"]: "</span> << nctraining[iclass] << std::endl;</div>
+<div class="line"><a name="l00546"></a><span class="lineno">  546</span>     <span class="keywordflow">if</span>(testPixels.size()>iclass){</div>
+<div class="line"><a name="l00547"></a><span class="lineno">  547</span>       nctest[iclass]=testPixels[iclass].size();</div>
+<div class="line"><a name="l00548"></a><span class="lineno">  548</span>       <span class="keywordflow">if</span>(verbose_opt[0]>=1){</div>
+<div class="line"><a name="l00549"></a><span class="lineno">  549</span>     std::cout << <span class="stringliteral">"nctest["</span> << iclass << <span class="stringliteral">"]: "</span> << nctest[iclass] << std::endl;</div>
+<div class="line"><a name="l00550"></a><span class="lineno">  550</span>       }</div>
+<div class="line"><a name="l00551"></a><span class="lineno">  551</span>     }</div>
+<div class="line"><a name="l00552"></a><span class="lineno">  552</span>     <span class="keywordflow">else</span></div>
+<div class="line"><a name="l00553"></a><span class="lineno">  553</span>       nctest[iclass]=0;</div>
+<div class="line"><a name="l00554"></a><span class="lineno">  554</span>     <span class="comment">// trainingFeatures[iclass].resize(nctraining[iclass]);</span></div>
+<div class="line"><a name="l00555"></a><span class="lineno">  555</span>     trainingFeatures[iclass].resize(nctraining[iclass]+nctest[iclass]);</div>
+<div class="line"><a name="l00556"></a><span class="lineno">  556</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> isample=0;isample<nctraining[iclass];++isample){</div>
+<div class="line"><a name="l00557"></a><span class="lineno">  557</span>       <span class="comment">//scale pixel values according to scale and offset!!!</span></div>
+<div class="line"><a name="l00558"></a><span class="lineno">  558</span>       <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iband=0;iband<nband;++iband){</div>
+<div class="line"><a name="l00559"></a><span class="lineno">  559</span>         assert(trainingPixels[iclass].size()>isample);</div>
+<div class="line"><a name="l00560"></a><span class="lineno">  560</span>         assert(trainingPixels[iclass][isample].size()>iband+startBand);</div>
+<div class="line"><a name="l00561"></a><span class="lineno">  561</span>         assert(offset.size()>iband);</div>
+<div class="line"><a name="l00562"></a><span class="lineno">  562</span>         assert(scale.size()>iband);</div>
+<div class="line"><a name="l00563"></a><span class="lineno">  563</span>         <span class="keywordtype">float</span> value=trainingPixels[iclass][isample][iband+startBand];</div>
+<div class="line"><a name="l00564"></a><span class="lineno">  564</span>         trainingFeatures[iclass][isample].push_back((value-offset[iband])/scale[iband]);</div>
+<div class="line"><a name="l00565"></a><span class="lineno">  565</span>       }</div>
+<div class="line"><a name="l00566"></a><span class="lineno">  566</span>     }</div>
+<div class="line"><a name="l00567"></a><span class="lineno">  567</span>     <span class="comment">// assert(trainingFeatures[iclass].size()==nctraining[iclass]);</span></div>
+<div class="line"><a name="l00568"></a><span class="lineno">  568</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> isample=0;isample<nctest[iclass];++isample){</div>
+<div class="line"><a name="l00569"></a><span class="lineno">  569</span>       <span class="comment">//scale pixel values according to scale and offset!!!</span></div>
+<div class="line"><a name="l00570"></a><span class="lineno">  570</span>       <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iband=0;iband<nband;++iband){</div>
+<div class="line"><a name="l00571"></a><span class="lineno">  571</span>         assert(testPixels[iclass].size()>isample);</div>
+<div class="line"><a name="l00572"></a><span class="lineno">  572</span>         assert(testPixels[iclass][isample].size()>iband+startBand);</div>
+<div class="line"><a name="l00573"></a><span class="lineno">  573</span>         assert(offset.size()>iband);</div>
+<div class="line"><a name="l00574"></a><span class="lineno">  574</span>         assert(scale.size()>iband);</div>
+<div class="line"><a name="l00575"></a><span class="lineno">  575</span>         <span class="keywordtype">float</span> value=testPixels[iclass][isample][iband+startBand];</div>
+<div class="line"><a name="l00576"></a><span class="lineno">  576</span>         <span class="comment">// testFeatures[iclass][isample].push_back((value-offset[iband])/scale[iband]);</span></div>
+<div class="line"><a name="l00577"></a><span class="lineno">  577</span>         trainingFeatures[iclass][nctraining[iclass]+isample].push_back((value-offset[iband])/scale[iband]);</div>
+<div class="line"><a name="l00578"></a><span class="lineno">  578</span>       }</div>
+<div class="line"><a name="l00579"></a><span class="lineno">  579</span>     }</div>
+<div class="line"><a name="l00580"></a><span class="lineno">  580</span>     assert(trainingFeatures[iclass].size()==nctraining[iclass]+nctest[iclass]);</div>
+<div class="line"><a name="l00581"></a><span class="lineno">  581</span>   }</div>
+<div class="line"><a name="l00582"></a><span class="lineno">  582</span> </div>
+<div class="line"><a name="l00583"></a><span class="lineno">  583</span>   assert(ccost_opt.size()>1);<span class="comment">//must have boundaries at least (initial value is optional)</span></div>
+<div class="line"><a name="l00584"></a><span class="lineno">  584</span>   <span class="keywordflow">if</span>(ccost_opt.size()<3)<span class="comment">//create initial value</span></div>
+<div class="line"><a name="l00585"></a><span class="lineno">  585</span>     ccost_opt.push_back(sqrt(ccost_opt[0]*ccost_opt[1]));</div>
+<div class="line"><a name="l00586"></a><span class="lineno">  586</span>   assert(gamma_opt.size()>1);<span class="comment">//must have boundaries at least (initial value is optional)</span></div>
+<div class="line"><a name="l00587"></a><span class="lineno">  587</span>   <span class="keywordflow">if</span>(gamma_opt.size()<3)<span class="comment">//create initial value</span></div>
+<div class="line"><a name="l00588"></a><span class="lineno">  588</span>     gamma_opt.push_back(sqrt(gamma_opt[0]*gamma_opt[1]));<span class="comment">//will be translated to 1.0/nFeatures</span></div>
+<div class="line"><a name="l00589"></a><span class="lineno">  589</span>   assert(ccost_opt.size()==3);<span class="comment">//min, init, max</span></div>
+<div class="line"><a name="l00590"></a><span class="lineno">  590</span>   assert(gamma_opt.size()==3);<span class="comment">//min, init, max</span></div>
+<div class="line"><a name="l00591"></a><span class="lineno">  591</span>   assert(gamma_opt[0]<gamma_opt[1]);</div>
+<div class="line"><a name="l00592"></a><span class="lineno">  592</span>   assert(gamma_opt[0]<gamma_opt[2]);</div>
+<div class="line"><a name="l00593"></a><span class="lineno">  593</span>   assert(gamma_opt[2]<gamma_opt[1]);</div>
+<div class="line"><a name="l00594"></a><span class="lineno">  594</span>   assert(ccost_opt[0]<ccost_opt[1]);</div>
+<div class="line"><a name="l00595"></a><span class="lineno">  595</span>   assert(ccost_opt[0]<ccost_opt[2]);</div>
+<div class="line"><a name="l00596"></a><span class="lineno">  596</span>   assert(ccost_opt[2]<ccost_opt[1]);</div>
+<div class="line"><a name="l00597"></a><span class="lineno">  597</span> </div>
+<div class="line"><a name="l00598"></a><span class="lineno">  598</span>   std::vector<double> x(2);</div>
+<div class="line"><a name="l00599"></a><span class="lineno">  599</span> <span class="comment">//  if(algorithm_opt[0]=="GRID"){</span></div>
+<div class="line"><a name="l00600"></a><span class="lineno">  600</span>   <span class="keywordflow">if</span> (1){</div>
+<div class="line"><a name="l00601"></a><span class="lineno">  601</span>     <span class="comment">// double minError=1000;</span></div>
+<div class="line"><a name="l00602"></a><span class="lineno">  602</span>     <span class="comment">// double minCost=0;</span></div>
+<div class="line"><a name="l00603"></a><span class="lineno">  603</span>     <span class="comment">// double minGamma=0;</span></div>
+<div class="line"><a name="l00604"></a><span class="lineno">  604</span>     <span class="keywordtype">double</span> maxKappa=0;</div>
+<div class="line"><a name="l00605"></a><span class="lineno">  605</span>     <span class="keywordtype">double</span> maxCost=0;</div>
+<div class="line"><a name="l00606"></a><span class="lineno">  606</span>     <span class="keywordtype">double</span> maxGamma=0;</div>
+<div class="line"><a name="l00607"></a><span class="lineno">  607</span>     <span class="keyword">const</span> <span class="keywordtype">char</span>* pszMessage;</div>
+<div class="line"><a name="l00608"></a><span class="lineno">  608</span>     <span class="keywordtype">void</span>* pProgressArg=NULL;</div>
+<div class="line"><a name="l00609"></a><span class="lineno">  609</span>     GDALProgressFunc pfnProgress=GDALTermProgress;</div>
+<div class="line"><a name="l00610"></a><span class="lineno">  610</span>     <span class="keywordtype">double</span> progress=0;</div>
+<div class="line"><a name="l00611"></a><span class="lineno">  611</span>     <span class="keywordflow">if</span>(!verbose_opt[0])</div>
+<div class="line"><a name="l00612"></a><span class="lineno">  612</span>       pfnProgress(progress,pszMessage,pProgressArg);</div>
+<div class="line"><a name="l00613"></a><span class="lineno">  613</span>     <span class="keywordtype">double</span> ncost=log(ccost_opt[1])/log(stepcc_opt[0])-log(ccost_opt[0])/log(stepcc_opt[0]);</div>
+<div class="line"><a name="l00614"></a><span class="lineno">  614</span>     <span class="keywordtype">double</span> ngamma=log(gamma_opt[1])/log(stepg_opt[0])-log(gamma_opt[0])/log(stepg_opt[0]);</div>
+<div class="line"><a name="l00615"></a><span class="lineno">  615</span>     <span class="keywordflow">for</span>(<span class="keywordtype">double</span> ccost=ccost_opt[0];ccost<=ccost_opt[1];ccost*=stepcc_opt[0]){</div>
+<div class="line"><a name="l00616"></a><span class="lineno">  616</span>       <span class="keywordflow">for</span>(<span class="keywordtype">double</span> gamma=gamma_opt[0];gamma<=gamma_opt[1];gamma*=stepg_opt[0]){</div>
+<div class="line"><a name="l00617"></a><span class="lineno">  617</span>     x[0]=ccost;</div>
+<div class="line"><a name="l00618"></a><span class="lineno">  618</span>     x[1]=gamma;</div>
+<div class="line"><a name="l00619"></a><span class="lineno">  619</span>     std::vector<double> theGrad;</div>
+<div class="line"><a name="l00620"></a><span class="lineno">  620</span>     <span class="keywordtype">double</span> kappa=0;</div>
+<div class="line"><a name="l00621"></a><span class="lineno">  621</span>     kappa=objFunction(x,theGrad,&trainingFeatures);</div>
+<div class="line"><a name="l00622"></a><span class="lineno">  622</span>     <span class="keywordflow">if</span>(kappa>maxKappa){</div>
+<div class="line"><a name="l00623"></a><span class="lineno">  623</span>       maxKappa=kappa;</div>
+<div class="line"><a name="l00624"></a><span class="lineno">  624</span>       maxCost=ccost;</div>
+<div class="line"><a name="l00625"></a><span class="lineno">  625</span>       maxGamma=gamma;</div>
+<div class="line"><a name="l00626"></a><span class="lineno">  626</span>     }</div>
+<div class="line"><a name="l00627"></a><span class="lineno">  627</span>     <span class="keywordflow">if</span>(verbose_opt[0])</div>
+<div class="line"><a name="l00628"></a><span class="lineno">  628</span>       std::cout << ccost << <span class="stringliteral">" "</span> << gamma << <span class="stringliteral">" "</span> << kappa<< std::endl;</div>
+<div class="line"><a name="l00629"></a><span class="lineno">  629</span>     progress+=1.0/ncost/ngamma;</div>
+<div class="line"><a name="l00630"></a><span class="lineno">  630</span>     <span class="keywordflow">if</span>(!verbose_opt[0])</div>
+<div class="line"><a name="l00631"></a><span class="lineno">  631</span>       pfnProgress(progress,pszMessage,pProgressArg);</div>
+<div class="line"><a name="l00632"></a><span class="lineno">  632</span>       }</div>
+<div class="line"><a name="l00633"></a><span class="lineno">  633</span>     }</div>
+<div class="line"><a name="l00634"></a><span class="lineno">  634</span>     progress=1.0;</div>
+<div class="line"><a name="l00635"></a><span class="lineno">  635</span>     <span class="keywordflow">if</span>(!verbose_opt[0])</div>
+<div class="line"><a name="l00636"></a><span class="lineno">  636</span>       pfnProgress(progress,pszMessage,pProgressArg);</div>
+<div class="line"><a name="l00637"></a><span class="lineno">  637</span>     x[0]=maxCost;</div>
+<div class="line"><a name="l00638"></a><span class="lineno">  638</span>     x[1]=maxGamma;</div>
+<div class="line"><a name="l00639"></a><span class="lineno">  639</span>   }</div>
+<div class="line"><a name="l00640"></a><span class="lineno">  640</span>   <span class="comment">//else{</span></div>
+<div class="line"><a name="l00641"></a><span class="lineno">  641</span>   <span class="comment">//  nlopt::opt optimizer=OptFactory::getOptimizer(algorithm_opt[0],2);</span></div>
+<div class="line"><a name="l00642"></a><span class="lineno">  642</span>   <span class="comment">//  if(verbose_opt[0]>1)</span></div>
+<div class="line"><a name="l00643"></a><span class="lineno">  643</span>   <span class="comment">//    std::cout << "optimization algorithm: " << optimizer.get_algorithm_name() << "..." << std::endl;</span></div>
+<div class="line"><a name="l00644"></a><span class="lineno">  644</span>   <span class="comment">//  std::vector<double> lb(2);</span></div>
+<div class="line"><a name="l00645"></a><span class="lineno">  645</span>   <span class="comment">//  std::vector<double> init(2);</span></div>
+<div class="line"><a name="l00646"></a><span class="lineno">  646</span>   <span class="comment">//  std::vector<double> ub(2);</span></div>
+<div class="line"><a name="l00647"></a><span class="lineno">  647</span> </div>
+<div class="line"><a name="l00648"></a><span class="lineno">  648</span>   <span class="comment">//  lb[0]=ccost_opt[0];</span></div>
+<div class="line"><a name="l00649"></a><span class="lineno">  649</span>   <span class="comment">//  lb[1]=(gamma_opt[0]>0)? gamma_opt[0] : 1.0/trainingFeatures[0][0].size();</span></div>
+<div class="line"><a name="l00650"></a><span class="lineno">  650</span>   <span class="comment">//  init[0]=ccost_opt[2];</span></div>
+<div class="line"><a name="l00651"></a><span class="lineno">  651</span>   <span class="comment">//  init[1]=(gamma_opt[2]>0)? gamma_opt[1] : 1.0/trainingFeatures[0][0].size();</span></div>
+<div class="line"><a name="l00652"></a><span class="lineno">  652</span>   <span class="comment">//  ub[0]=ccost_opt[1];</span></div>
+<div class="line"><a name="l00653"></a><span class="lineno">  653</span>   <span class="comment">//  ub[1]=(gamma_opt[1]>0)? gamma_opt[1] : 1.0/trainingFeatures[0][0].size();</span></div>
+<div class="line"><a name="l00654"></a><span class="lineno">  654</span>   <span class="comment">//  // optimizer.set_min_objective(objFunction, &trainingFeatures);</span></div>
+<div class="line"><a name="l00655"></a><span class="lineno">  655</span>   <span class="comment">//  optimizer.set_max_objective(objFunction, &trainingFeatures);</span></div>
+<div class="line"><a name="l00656"></a><span class="lineno">  656</span>   <span class="comment">//  optimizer.set_lower_bounds(lb);</span></div>
+<div class="line"><a name="l00657"></a><span class="lineno">  657</span>   <span class="comment">//  optimizer.set_upper_bounds(ub);</span></div>
+<div class="line"><a name="l00658"></a><span class="lineno">  658</span>   <span class="comment">//  if(verbose_opt[0]>1)</span></div>
+<div class="line"><a name="l00659"></a><span class="lineno">  659</span>   <span class="comment">//    std::cout << "set stopping criteria" << std::endl;</span></div>
+<div class="line"><a name="l00660"></a><span class="lineno">  660</span>   <span class="comment">//  //set stopping criteria</span></div>
+<div class="line"><a name="l00661"></a><span class="lineno">  661</span>   <span class="comment">//  if(maxit_opt[0])</span></div>
+<div class="line"><a name="l00662"></a><span class="lineno">  662</span>   <span class="comment">//    optimizer.set_maxeval(maxit_opt[0]);</span></div>
+<div class="line"><a name="l00663"></a><span class="lineno">  663</span>   <span class="comment">//  else</span></div>
+<div class="line"><a name="l00664"></a><span class="lineno">  664</span>   <span class="comment">//    optimizer.set_xtol_rel(tolerance_opt[0]);</span></div>
+<div class="line"><a name="l00665"></a><span class="lineno">  665</span>   <span class="comment">//  double minf=0;</span></div>
+<div class="line"><a name="l00666"></a><span class="lineno">  666</span>   <span class="comment">//  x=init;</span></div>
+<div class="line"><a name="l00667"></a><span class="lineno">  667</span>   <span class="comment">//  try{</span></div>
+<div class="line"><a name="l00668"></a><span class="lineno">  668</span>   <span class="comment">//    optimizer.optimize(x, minf);</span></div>
+<div class="line"><a name="l00669"></a><span class="lineno">  669</span>   <span class="comment">//  }</span></div>
+<div class="line"><a name="l00670"></a><span class="lineno">  670</span>   <span class="comment">//  catch(string error){</span></div>
+<div class="line"><a name="l00671"></a><span class="lineno">  671</span>   <span class="comment">//    cerr << error << std::endl;</span></div>
+<div class="line"><a name="l00672"></a><span class="lineno">  672</span>   <span class="comment">//    exit(1);</span></div>
+<div class="line"><a name="l00673"></a><span class="lineno">  673</span>   <span class="comment">//  }</span></div>
+<div class="line"><a name="l00674"></a><span class="lineno">  674</span>   <span class="comment">//  catch (exception& e){</span></div>
+<div class="line"><a name="l00675"></a><span class="lineno">  675</span>   <span class="comment">//    cout << e.what() << endl;</span></div>
+<div class="line"><a name="l00676"></a><span class="lineno">  676</span>   <span class="comment">//  }</span></div>
+<div class="line"><a name="l00677"></a><span class="lineno">  677</span>   <span class="comment">//  catch(...){</span></div>
+<div class="line"><a name="l00678"></a><span class="lineno">  678</span>   <span class="comment">//    cerr << "error catched" << std::endl;</span></div>
+<div class="line"><a name="l00679"></a><span class="lineno">  679</span>   <span class="comment">//    exit(1);</span></div>
+<div class="line"><a name="l00680"></a><span class="lineno">  680</span>   <span class="comment">//  }</span></div>
+<div class="line"><a name="l00681"></a><span class="lineno">  681</span> </div>
+<div class="line"><a name="l00682"></a><span class="lineno">  682</span>   <span class="comment">//  double ccost=x[0];</span></div>
+<div class="line"><a name="l00683"></a><span class="lineno">  683</span>   <span class="comment">//  double gamma=x[1];</span></div>
+<div class="line"><a name="l00684"></a><span class="lineno">  684</span>   <span class="comment">//  if(verbose_opt[0])</span></div>
+<div class="line"><a name="l00685"></a><span class="lineno">  685</span>   <span class="comment">//    std::cout << "optimized with " << optimizer.get_algorithm_name() << "..." << std::endl;</span></div>
+<div class="line"><a name="l00686"></a><span class="lineno">  686</span>   <span class="comment">//}</span></div>
+<div class="line"><a name="l00687"></a><span class="lineno">  687</span>   std::cout << <span class="stringliteral">" --ccost "</span> << x[0];</div>
+<div class="line"><a name="l00688"></a><span class="lineno">  688</span>   std::cout << <span class="stringliteral">" --gamma "</span> << x[1];</div>
+<div class="line"><a name="l00689"></a><span class="lineno">  689</span>   std::cout << std::endl;</div>
+<div class="line"><a name="l00690"></a><span class="lineno">  690</span> }</div>
 <div class="ttc" id="classImgReaderOgr_html"><div class="ttname"><a href="classImgReaderOgr.html">ImgReaderOgr</a></div><div class="ttdef"><b>Definition:</b> <a href="ImgReaderOgr_8h_source.html#l00035">ImgReaderOgr.h:35</a></div></div>
 <div class="ttc" id="classOptionpk_html"><div class="ttname"><a href="classOptionpk.html">Optionpk</a></div><div class="ttdef"><b>Definition:</b> <a href="Optionpk_8h_source.html#l00106">Optionpk.h:106</a></div></div>
 <div class="ttc" id="classCostFactorySVM_html"><div class="ttname"><a href="classCostFactorySVM.html">CostFactorySVM</a></div><div class="ttdef"><b>Definition:</b> <a href="CostFactorySVM_8h_source.html#l00034">CostFactorySVM.h:34</a></div></div>
@@ -664,7 +686,7 @@
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Jun 23 2015 17:09:36 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/pkpolygonize.html b/doc/html/pkpolygonize.html
index 76501fc..274cfe6 100644
--- a/doc/html/pkpolygonize.html
+++ b/doc/html/pkpolygonize.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.3</span>
+    <span id="projectnumber">2.6.4</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -82,7 +82,7 @@ Usage: pkpolygonize -i input [-m mask] -o output</li>
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Jun 23 2015 17:09:37 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/pkpolygonize_8cc_source.html b/doc/html/pkpolygonize_8cc_source.html
index c07ff63..992487f 100644
--- a/doc/html/pkpolygonize_8cc_source.html
+++ b/doc/html/pkpolygonize_8cc_source.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.3</span>
+    <span id="projectnumber">2.6.4</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -187,7 +187,7 @@
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Jun 23 2015 17:09:36 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/pkreclass.html b/doc/html/pkreclass.html
index 453b245..e3ccb38 100644
--- a/doc/html/pkreclass.html
+++ b/doc/html/pkreclass.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.3</span>
+    <span id="projectnumber">2.6.4</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -92,7 +92,7 @@ Usage: pkreclass -i input [-c from -r to]* -o output</li>
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Jun 23 2015 17:09:37 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/pkreclass_8cc_source.html b/doc/html/pkreclass_8cc_source.html
index 74a0155..bac431b 100644
--- a/doc/html/pkreclass_8cc_source.html
+++ b/doc/html/pkreclass_8cc_source.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.3</span>
+    <span id="projectnumber">2.6.4</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -418,7 +418,7 @@
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Jun 23 2015 17:09:36 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/pkreclass_8py_source.html b/doc/html/pkreclass_8py_source.html
index 5b7a7f7..b178c87 100644
--- a/doc/html/pkreclass_8py_source.html
+++ b/doc/html/pkreclass_8py_source.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.3</span>
+    <span id="projectnumber">2.6.4</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -195,7 +195,7 @@
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Jun 23 2015 17:09:36 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Tue Nov 3 2015 15:58:26 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/pkregann.html b/doc/html/pkregann.html
index faa4c0b..d4d0fe2 100644
--- a/doc/html/pkregann.html
+++ b/doc/html/pkregann.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.3</span>
+    <span id="projectnumber">2.6.4</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -94,7 +94,7 @@ Usage: pkregann -i input -t training [-ic col]* [-oc col]* -o output </li>
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Jun 23 2015 17:09:37 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/pkregann_8cc_source.html b/doc/html/pkregann_8cc_source.html
index 860d0d9..9372a65 100644
--- a/doc/html/pkregann_8cc_source.html
+++ b/doc/html/pkregann_8cc_source.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.3</span>
+    <span id="projectnumber">2.6.4</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -428,7 +428,7 @@
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Jun 23 2015 17:09:36 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/pksensormodel_8h_source.html b/doc/html/pksensormodel_8h_source.html
index 61c6754..7cb95a9 100644
--- a/doc/html/pksensormodel_8h_source.html
+++ b/doc/html/pksensormodel_8h_source.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.3</span>
+    <span id="projectnumber">2.6.4</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -139,7 +139,7 @@
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Jun 23 2015 17:09:36 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/pksetmask.html b/doc/html/pksetmask.html
index 070ad91..469a854 100644
--- a/doc/html/pksetmask.html
+++ b/doc/html/pksetmask.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.3</span>
+    <span id="projectnumber">2.6.4</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -45,10 +45,10 @@
 <div class="contents">
 <div class="textblock"><p>program to apply mask image (set invalid values) to raster image </p>
 <h2>SYNOPSIS</h2>
-<p><code> Usage: pksetmask -i input -m mask [-msknodata value] -o output </code></p>
+<p><code> Usage: pksetmask -i input -m mask [-m mask]* -o output </code></p>
 <p><code></code></p>
-<p><code> Options: [-min value]* [-max value]* [-data value]* [-nodata value]*</code></p>
-<p><code> Advanced options: [-b band]* [–operator '<'|'='|'<'] [-ot type] [-of format] [-co option]* [-ct table]</code></p>
+<p><code> Options: [-mskband value]* [-msknodata value -nodata value]*</code></p>
+<p><code> Advanced options: [–operator '<'|'='|'<'] [-ot type] [-of format] [-co option]* [-ct table]</code></p>
 <p><code></code></p>
 <h1><a class="anchor" id="pksetmask_description"></a>
 Description</h1>
@@ -83,7 +83,7 @@ Options</h1>
 <tr>
 <td>ct </td><td>ct </td><td>std::string </td><td></td><td>color table (file with 5 columns: id R G B ALFA (0: transparent, 255: solid) </td></tr>
 </table>
-Usage: pksetmask -i input -m mask [-msknodata value] -o output</li>
+Usage: pksetmask -i input -m mask [-m mask]* [-msknodata value -nodata value]* -o output</li>
 </ul>
 <h1>Examples </h1>
 <p>Some examples how to use pksetmask can be found <a class="el" href="md_examples_pksetmask.html#examples_pksetmask">here</a> </p>
@@ -93,7 +93,7 @@ Usage: pksetmask -i input -m mask [-msknodata value] -o output</li>
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Jun 23 2015 17:09:37 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/pksetmask_8cc_source.html b/doc/html/pksetmask_8cc_source.html
index 7aa6332..ea6c802 100644
--- a/doc/html/pksetmask_8cc_source.html
+++ b/doc/html/pksetmask_8cc_source.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.3</span>
+    <span id="projectnumber">2.6.4</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -77,310 +77,310 @@
 <div class="line"><a name="l00023"></a><span class="lineno">   23</span> <span class="preprocessor">#include "imageclasses/ImgWriterGdal.h"</span></div>
 <div class="line"><a name="l00024"></a><span class="lineno">   24</span> <span class="preprocessor">#include "base/Optionpk.h"</span></div>
 <div class="line"><a name="l00025"></a><span class="lineno">   25</span> <span class="comment">/******************************************************************************/</span></div>
-<div class="line"><a name="l00072"></a><span class="lineno">   72</span> <span class="keyword">using namespace </span>std;</div>
-<div class="line"><a name="l00073"></a><span class="lineno">   73</span> </div>
-<div class="line"><a name="l00074"></a><span class="lineno">   74</span> <span class="keywordtype">int</span> main(<span class="keywordtype">int</span> argc, <span class="keywordtype">char</span> *argv[])</div>
-<div class="line"><a name="l00075"></a><span class="lineno">   75</span> {</div>
-<div class="line"><a name="l00076"></a><span class="lineno">   76</span>   <span class="comment">//command line options</span></div>
-<div class="line"><a name="l00077"></a><span class="lineno">   77</span>   <a class="code" href="classOptionpk.html">Optionpk<string></a> input_opt(<span class="stringliteral">"i"</span>, <span class="stringliteral">"input"</span>, <span class="stringliteral">"Input image"</span>);</div>
-<div class="line"><a name="l00078"></a><span class="lineno">   78</span>   <a class="code" href="classOptionpk.html">Optionpk<string></a> mask_opt(<span class="stringliteral">"m"</span>, <span class="stringliteral">"mask"</span>, <span class="stringliteral">"Mask image(s)"</span>);</div>
-<div class="line"><a name="l00079"></a><span class="lineno">   79</span>   <a class="code" href="classOptionpk.html">Optionpk<string></a> output_opt(<span class="stringliteral">"o"</span>, <span class="stringliteral">"output"</span>, <span class="stringliteral">"Output mask file"</span>);</div>
-<div class="line"><a name="l00080"></a><span class="lineno">   80</span>   <a class="code" href="classOptionpk.html">Optionpk<string></a> otype_opt(<span class="stringliteral">"ot"</span>, <span class="stringliteral">"otype"</span>, <span class="stringliteral">"Data type for output image ({Byte/Int16/UInt16/UInt32/Int32/Float32/Float64/CInt16/CInt32/CFloat32/CFloat64}). Empty string: inherit type from input image"</span>, <span class="stringlitera [...]
-<div class="line"><a name="l00081"></a><span class="lineno">   81</span>   <a class="code" href="classOptionpk.html">Optionpk<string></a> oformat_opt(<span class="stringliteral">"of"</span>, <span class="stringliteral">"oformat"</span>, <span class="stringliteral">"Output image format (see also gdal_translate). Empty string: inherit from input image"</span>);</div>
-<div class="line"><a name="l00082"></a><span class="lineno">   82</span>   <a class="code" href="classOptionpk.html">Optionpk<string></a> option_opt(<span class="stringliteral">"co"</span>, <span class="stringliteral">"co"</span>, <span class="stringliteral">"Creation option for output file. Multiple options can be specified."</span>);</div>
-<div class="line"><a name="l00083"></a><span class="lineno">   83</span>   <a class="code" href="classOptionpk.html">Optionpk<int></a> msknodata_opt(<span class="stringliteral">"msknodata"</span>, <span class="stringliteral">"msknodata"</span>, <span class="stringliteral">"Mask value(s) where image has nodata. Use one value for each mask, or multiple values for a single mask."</span>, 1);</div>
-<div class="line"><a name="l00084"></a><span class="lineno">   84</span>   <a class="code" href="classOptionpk.html">Optionpk<short></a> mskband_opt(<span class="stringliteral">"mskband"</span>, <span class="stringliteral">"mskband"</span>, <span class="stringliteral">"Mask band to read (0 indexed). Provide band for each mask."</span>, 0);</div>
-<div class="line"><a name="l00085"></a><span class="lineno">   85</span>   <a class="code" href="classOptionpk.html">Optionpk<char></a> operator_opt(<span class="stringliteral">"p"</span>, <span class="stringliteral">"operator"</span>, <span class="stringliteral">"Operator: < = > !. Use operator for each msknodata option"</span>, <span class="charliteral">'='</span>);</div>
-<div class="line"><a name="l00086"></a><span class="lineno">   86</span>   <a class="code" href="classOptionpk.html">Optionpk<int></a> nodata_opt(<span class="stringliteral">"nodata"</span>, <span class="stringliteral">"nodata"</span>, <span class="stringliteral">"nodata value to put in image if not valid"</span>, 0);</div>
-<div class="line"><a name="l00087"></a><span class="lineno">   87</span>   <a class="code" href="classOptionpk.html">Optionpk<string></a> colorTable_opt(<span class="stringliteral">"ct"</span>, <span class="stringliteral">"ct"</span>, <span class="stringliteral">"color table (file with 5 columns: id R G B ALFA (0: transparent, 255: solid)"</span>);</div>
-<div class="line"><a name="l00088"></a><span class="lineno">   88</span>   <a class="code" href="classOptionpk.html">Optionpk<short></a> verbose_opt(<span class="stringliteral">"v"</span>, <span class="stringliteral">"verbose"</span>, <span class="stringliteral">"verbose"</span>, 0,2);</div>
-<div class="line"><a name="l00089"></a><span class="lineno">   89</span> </div>
-<div class="line"><a name="l00090"></a><span class="lineno">   90</span>   otype_opt.setHide(1);</div>
-<div class="line"><a name="l00091"></a><span class="lineno">   91</span>   oformat_opt.setHide(1);</div>
-<div class="line"><a name="l00092"></a><span class="lineno">   92</span>   option_opt.setHide(1);</div>
-<div class="line"><a name="l00093"></a><span class="lineno">   93</span>   colorTable_opt.setHide(1);</div>
-<div class="line"><a name="l00094"></a><span class="lineno">   94</span>   mskband_opt.setHide(1);</div>
-<div class="line"><a name="l00095"></a><span class="lineno">   95</span>   </div>
-<div class="line"><a name="l00096"></a><span class="lineno">   96</span>   <span class="keywordtype">bool</span> doProcess;<span class="comment">//stop process when program was invoked with help option (-h --help)</span></div>
-<div class="line"><a name="l00097"></a><span class="lineno">   97</span>   <span class="keywordflow">try</span>{</div>
-<div class="line"><a name="l00098"></a><span class="lineno">   98</span>     doProcess=input_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00099"></a><span class="lineno">   99</span>     mask_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00100"></a><span class="lineno">  100</span>     msknodata_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00101"></a><span class="lineno">  101</span>     mskband_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00102"></a><span class="lineno">  102</span>     output_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00103"></a><span class="lineno">  103</span>     nodata_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00104"></a><span class="lineno">  104</span>     operator_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00105"></a><span class="lineno">  105</span>     otype_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00106"></a><span class="lineno">  106</span>     oformat_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00107"></a><span class="lineno">  107</span>     option_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00108"></a><span class="lineno">  108</span>     colorTable_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00109"></a><span class="lineno">  109</span>     verbose_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00110"></a><span class="lineno">  110</span>   }</div>
-<div class="line"><a name="l00111"></a><span class="lineno">  111</span>   <span class="keywordflow">catch</span>(<span class="keywordtype">string</span> predefinedString){</div>
-<div class="line"><a name="l00112"></a><span class="lineno">  112</span>     std::cout << predefinedString << std::endl;</div>
-<div class="line"><a name="l00113"></a><span class="lineno">  113</span>     exit(0);</div>
-<div class="line"><a name="l00114"></a><span class="lineno">  114</span>   }</div>
-<div class="line"><a name="l00115"></a><span class="lineno">  115</span>   <span class="keywordflow">if</span>(!doProcess){</div>
-<div class="line"><a name="l00116"></a><span class="lineno">  116</span>     cout << endl;</div>
-<div class="line"><a name="l00117"></a><span class="lineno">  117</span>     cout << <span class="stringliteral">"Usage: pksetmask -i input -m mask [-msknodata value] -o output"</span> << endl;</div>
-<div class="line"><a name="l00118"></a><span class="lineno">  118</span>     cout << endl;</div>
-<div class="line"><a name="l00119"></a><span class="lineno">  119</span>     std::cout << <span class="stringliteral">"short option -h shows basic options only, use long option --help to show all options"</span> << std::endl;</div>
-<div class="line"><a name="l00120"></a><span class="lineno">  120</span>     exit(0);<span class="comment">//help was invoked, stop processing</span></div>
-<div class="line"><a name="l00121"></a><span class="lineno">  121</span>   }</div>
-<div class="line"><a name="l00122"></a><span class="lineno">  122</span> </div>
-<div class="line"><a name="l00123"></a><span class="lineno">  123</span>   <span class="keywordflow">if</span>(verbose_opt[0])</div>
-<div class="line"><a name="l00124"></a><span class="lineno">  124</span>      cout << <span class="stringliteral">"number of mask images: "</span> << mask_opt.size() << endl;</div>
-<div class="line"><a name="l00125"></a><span class="lineno">  125</span> </div>
-<div class="line"><a name="l00126"></a><span class="lineno">  126</span>   <span class="comment">//duplicate band used for mask if not explicitly provided</span></div>
-<div class="line"><a name="l00127"></a><span class="lineno">  127</span>   <span class="keywordflow">while</span>(mskband_opt.size()<mask_opt.size())</div>
-<div class="line"><a name="l00128"></a><span class="lineno">  128</span>     mskband_opt.push_back(mskband_opt[0]);</div>
-<div class="line"><a name="l00129"></a><span class="lineno">  129</span> </div>
-<div class="line"><a name="l00130"></a><span class="lineno">  130</span>   vector<ImgReaderGdal> maskReader(mask_opt.size()); </div>
-<div class="line"><a name="l00131"></a><span class="lineno">  131</span>   <span class="keywordflow">for</span>(<span class="keywordtype">int</span> imask=0;imask<mask_opt.size();++imask){</div>
-<div class="line"><a name="l00132"></a><span class="lineno">  132</span>     <span class="keywordflow">if</span>(verbose_opt[0])</div>
-<div class="line"><a name="l00133"></a><span class="lineno">  133</span>       cout << <span class="stringliteral">"opening mask image file "</span> << mask_opt[imask] << endl;</div>
-<div class="line"><a name="l00134"></a><span class="lineno">  134</span>     maskReader[imask].open(mask_opt[imask]);</div>
-<div class="line"><a name="l00135"></a><span class="lineno">  135</span>   }</div>
-<div class="line"><a name="l00136"></a><span class="lineno">  136</span>   assert(input_opt.size());</div>
-<div class="line"><a name="l00137"></a><span class="lineno">  137</span>   <span class="keywordflow">if</span>(verbose_opt[0])</div>
-<div class="line"><a name="l00138"></a><span class="lineno">  138</span>     cout << <span class="stringliteral">"opening input image file "</span> << input_opt[0] << endl;</div>
-<div class="line"><a name="l00139"></a><span class="lineno">  139</span>   <a class="code" href="classImgReaderGdal.html">ImgReaderGdal</a> inputReader;</div>
-<div class="line"><a name="l00140"></a><span class="lineno">  140</span>   inputReader.open(input_opt[0]);</div>
-<div class="line"><a name="l00141"></a><span class="lineno">  141</span>   <span class="keywordtype">string</span> imageType=inputReader.getImageType();</div>
-<div class="line"><a name="l00142"></a><span class="lineno">  142</span>   <span class="keywordflow">if</span>(oformat_opt.size())<span class="comment">//default</span></div>
-<div class="line"><a name="l00143"></a><span class="lineno">  143</span>     imageType=oformat_opt[0];</div>
-<div class="line"><a name="l00144"></a><span class="lineno">  144</span>   GDALDataType theType=GDT_Unknown;</div>
-<div class="line"><a name="l00145"></a><span class="lineno">  145</span>   <span class="keywordflow">if</span>(verbose_opt[0]){</div>
-<div class="line"><a name="l00146"></a><span class="lineno">  146</span>     std::cout << <span class="stringliteral">"Image type: "</span> << imageType << std::endl;</div>
-<div class="line"><a name="l00147"></a><span class="lineno">  147</span>     std::cout << <span class="stringliteral">"possible output data types: "</span>;</div>
-<div class="line"><a name="l00148"></a><span class="lineno">  148</span>   }</div>
-<div class="line"><a name="l00149"></a><span class="lineno">  149</span>   <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iType = 0; iType < GDT_TypeCount; ++iType){</div>
-<div class="line"><a name="l00150"></a><span class="lineno">  150</span>     <span class="keywordflow">if</span>(verbose_opt[0])</div>
-<div class="line"><a name="l00151"></a><span class="lineno">  151</span>       cout << <span class="stringliteral">" "</span> << GDALGetDataTypeName((GDALDataType)iType);</div>
-<div class="line"><a name="l00152"></a><span class="lineno">  152</span>     <span class="keywordflow">if</span>( GDALGetDataTypeName((GDALDataType)iType) != NULL</div>
-<div class="line"><a name="l00153"></a><span class="lineno">  153</span>         && EQUAL(GDALGetDataTypeName((GDALDataType)iType),</div>
-<div class="line"><a name="l00154"></a><span class="lineno">  154</span>                  otype_opt[0].c_str()))</div>
-<div class="line"><a name="l00155"></a><span class="lineno">  155</span>       theType=(GDALDataType) iType;</div>
-<div class="line"><a name="l00156"></a><span class="lineno">  156</span>   }</div>
-<div class="line"><a name="l00157"></a><span class="lineno">  157</span>   <span class="keywordflow">if</span>(theType==GDT_Unknown)</div>
-<div class="line"><a name="l00158"></a><span class="lineno">  158</span>     theType=inputReader.getDataType();</div>
-<div class="line"><a name="l00159"></a><span class="lineno">  159</span> </div>
-<div class="line"><a name="l00160"></a><span class="lineno">  160</span>   assert(output_opt.size());</div>
-<div class="line"><a name="l00161"></a><span class="lineno">  161</span>   <span class="keywordflow">if</span>(verbose_opt[0]){</div>
-<div class="line"><a name="l00162"></a><span class="lineno">  162</span>     std::cout << std::endl << <span class="stringliteral">"Output data type:  "</span> << GDALGetDataTypeName(theType) << std::endl;</div>
-<div class="line"><a name="l00163"></a><span class="lineno">  163</span>     std::cout << <span class="stringliteral">"opening output image for writing: "</span> << output_opt[0] << std::endl;</div>
-<div class="line"><a name="l00164"></a><span class="lineno">  164</span>   }</div>
-<div class="line"><a name="l00165"></a><span class="lineno">  165</span>   <a class="code" href="classImgWriterGdal.html">ImgWriterGdal</a> outputWriter;</div>
-<div class="line"><a name="l00166"></a><span class="lineno">  166</span>   <span class="keywordflow">try</span>{</div>
-<div class="line"><a name="l00167"></a><span class="lineno">  167</span>     <span class="keywordflow">if</span>(option_opt.findSubstring(<span class="stringliteral">"INTERLEAVE="</span>)==option_opt.end()){</div>
-<div class="line"><a name="l00168"></a><span class="lineno">  168</span>       <span class="keywordtype">string</span> theInterleave=<span class="stringliteral">"INTERLEAVE="</span>;</div>
-<div class="line"><a name="l00169"></a><span class="lineno">  169</span>       theInterleave+=inputReader.getInterleave();</div>
-<div class="line"><a name="l00170"></a><span class="lineno">  170</span>       option_opt.push_back(theInterleave);</div>
-<div class="line"><a name="l00171"></a><span class="lineno">  171</span>     }</div>
-<div class="line"><a name="l00172"></a><span class="lineno">  172</span>     outputWriter.open(output_opt[0],inputReader.nrOfCol(),inputReader.nrOfRow(),inputReader.nrOfBand(),theType,imageType,option_opt);</div>
-<div class="line"><a name="l00173"></a><span class="lineno">  173</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iband=0;iband<inputReader.nrOfBand();++iband)</div>
-<div class="line"><a name="l00174"></a><span class="lineno">  174</span>       outputWriter.GDALSetNoDataValue(nodata_opt[0],iband);</div>
-<div class="line"><a name="l00175"></a><span class="lineno">  175</span>     outputWriter.setProjection(inputReader.getProjection());</div>
-<div class="line"><a name="l00176"></a><span class="lineno">  176</span>     outputWriter.copyGeoTransform(inputReader);</div>
-<div class="line"><a name="l00177"></a><span class="lineno">  177</span>   }</div>
-<div class="line"><a name="l00178"></a><span class="lineno">  178</span>   <span class="keywordflow">catch</span>(<span class="keywordtype">string</span> errorstring){</div>
-<div class="line"><a name="l00179"></a><span class="lineno">  179</span>     cout << errorstring << endl;</div>
-<div class="line"><a name="l00180"></a><span class="lineno">  180</span>     exit(1);</div>
-<div class="line"><a name="l00181"></a><span class="lineno">  181</span>   }</div>
-<div class="line"><a name="l00182"></a><span class="lineno">  182</span>   <span class="comment">// if(verbose_opt[0])</span></div>
-<div class="line"><a name="l00183"></a><span class="lineno">  183</span>   <span class="comment">//   cout << "opening output image file " << output_opt[0] << endl;</span></div>
-<div class="line"><a name="l00184"></a><span class="lineno">  184</span>   <span class="comment">// outputWriter.open(output_opt[0],inputReader);</span></div>
-<div class="line"><a name="l00185"></a><span class="lineno">  185</span>   <span class="keywordflow">if</span>(colorTable_opt.size()){</div>
-<div class="line"><a name="l00186"></a><span class="lineno">  186</span>     <span class="keywordflow">if</span>(colorTable_opt[0]!=<span class="stringliteral">"none"</span>)</div>
-<div class="line"><a name="l00187"></a><span class="lineno">  187</span>       outputWriter.setColorTable(colorTable_opt[0]);</div>
-<div class="line"><a name="l00188"></a><span class="lineno">  188</span>   }</div>
-<div class="line"><a name="l00189"></a><span class="lineno">  189</span>   <span class="keywordflow">else</span> <span class="keywordflow">if</span> (inputReader.getColorTable()!=NULL)<span class="comment">//copy colorTable from input image</span></div>
-<div class="line"><a name="l00190"></a><span class="lineno">  190</span>     outputWriter.setColorTable(inputReader.getColorTable());</div>
-<div class="line"><a name="l00191"></a><span class="lineno">  191</span>   <span class="keywordflow">if</span>(inputReader.isGeoRef()){</div>
-<div class="line"><a name="l00192"></a><span class="lineno">  192</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> imask=0;imask<mask_opt.size();++imask)</div>
-<div class="line"><a name="l00193"></a><span class="lineno">  193</span>       assert(maskReader[imask].isGeoRef());</div>
-<div class="line"><a name="l00194"></a><span class="lineno">  194</span>   }</div>
-<div class="line"><a name="l00195"></a><span class="lineno">  195</span>   assert(nodata_opt.size()==msknodata_opt.size());</div>
-<div class="line"><a name="l00196"></a><span class="lineno">  196</span>   assert(operator_opt.size()==msknodata_opt.size()||operator_opt.size()==1);</div>
-<div class="line"><a name="l00197"></a><span class="lineno">  197</span>   <span class="keywordflow">if</span>(verbose_opt[0]){</div>
-<div class="line"><a name="l00198"></a><span class="lineno">  198</span>     cout << <span class="stringliteral">" mask files selected: "</span> << mask_opt.size() << endl;</div>
-<div class="line"><a name="l00199"></a><span class="lineno">  199</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iv=0;iv<msknodata_opt.size();++iv){</div>
-<div class="line"><a name="l00200"></a><span class="lineno">  200</span>       <span class="keywordtype">char</span> op=(operator_opt.size()==msknodata_opt.size())?operator_opt[iv]:operator_opt[0];</div>
-<div class="line"><a name="l00201"></a><span class="lineno">  201</span>       cout << op << <span class="stringliteral">" "</span> << msknodata_opt[iv] << <span class="stringliteral">"->"</span> << nodata_opt[iv] << endl;</div>
-<div class="line"><a name="l00202"></a><span class="lineno">  202</span>     }</div>
-<div class="line"><a name="l00203"></a><span class="lineno">  203</span>   }</div>
-<div class="line"><a name="l00204"></a><span class="lineno">  204</span>   </div>
-<div class="line"><a name="l00205"></a><span class="lineno">  205</span>   <a class="code" href="classVector2d.html">Vector2d<double></a> lineInput(inputReader.nrOfBand(),inputReader.nrOfCol());</div>
-<div class="line"><a name="l00206"></a><span class="lineno">  206</span>   <a class="code" href="classVector2d.html">Vector2d<double></a> lineOutput(outputWriter.nrOfBand(),outputWriter.nrOfCol());</div>
-<div class="line"><a name="l00207"></a><span class="lineno">  207</span>   assert(lineOutput.size()==lineInput.size());</div>
-<div class="line"><a name="l00208"></a><span class="lineno">  208</span>   assert(inputReader.nrOfCol()==outputWriter.nrOfCol());</div>
-<div class="line"><a name="l00209"></a><span class="lineno">  209</span>   <span class="comment">// Vector2d<int> lineMask(mask_opt.size());</span></div>
-<div class="line"><a name="l00210"></a><span class="lineno">  210</span>   <a class="code" href="classVector2d.html">Vector2d<double></a> lineMask(mask_opt.size());</div>
-<div class="line"><a name="l00211"></a><span class="lineno">  211</span>   <span class="keywordflow">for</span>(<span class="keywordtype">int</span> imask=0;imask<mask_opt.size();++imask){</div>
-<div class="line"><a name="l00212"></a><span class="lineno">  212</span>     <span class="keywordflow">if</span>(verbose_opt[0])</div>
-<div class="line"><a name="l00213"></a><span class="lineno">  213</span>       cout << <span class="stringliteral">"mask "</span> << imask << <span class="stringliteral">" has "</span> << maskReader[imask].nrOfCol() << <span class="stringliteral">" columns and "</span> << maskReader[imask].nrOfRow() << <span class="stringliteral">" rows"</span> << endl;</div>
-<div class="line"><a name="l00214"></a><span class="lineno">  214</span>     lineMask[imask].resize(maskReader[imask].nrOfCol());</div>
-<div class="line"><a name="l00215"></a><span class="lineno">  215</span>   }</div>
-<div class="line"><a name="l00216"></a><span class="lineno">  216</span>   <span class="keywordtype">int</span> irow=0;</div>
-<div class="line"><a name="l00217"></a><span class="lineno">  217</span>   <span class="keywordtype">int</span> icol=0;</div>
-<div class="line"><a name="l00218"></a><span class="lineno">  218</span>   <span class="keyword">const</span> <span class="keywordtype">char</span>* pszMessage;</div>
-<div class="line"><a name="l00219"></a><span class="lineno">  219</span>   <span class="keywordtype">void</span>* pProgressArg=NULL;</div>
-<div class="line"><a name="l00220"></a><span class="lineno">  220</span>   GDALProgressFunc pfnProgress=GDALTermProgress;</div>
-<div class="line"><a name="l00221"></a><span class="lineno">  221</span>   <span class="keywordtype">float</span> progress=0;</div>
-<div class="line"><a name="l00222"></a><span class="lineno">  222</span>   <span class="keywordflow">if</span>(!verbose_opt[0])</div>
-<div class="line"><a name="l00223"></a><span class="lineno">  223</span>     pfnProgress(progress,pszMessage,pProgressArg);</div>
-<div class="line"><a name="l00224"></a><span class="lineno">  224</span>   <span class="comment">// double oldRowMask=-1;</span></div>
-<div class="line"><a name="l00225"></a><span class="lineno">  225</span>   vector<double> oldRowMask(mask_opt.size());</div>
-<div class="line"><a name="l00226"></a><span class="lineno">  226</span>   <span class="keywordflow">for</span>(<span class="keywordtype">int</span> imask=0;imask<mask_opt.size();++imask)</div>
-<div class="line"><a name="l00227"></a><span class="lineno">  227</span>     oldRowMask[imask]=-1;</div>
-<div class="line"><a name="l00228"></a><span class="lineno">  228</span>   <span class="keywordflow">for</span>(irow=0;irow<inputReader.nrOfRow();++irow){</div>
-<div class="line"><a name="l00229"></a><span class="lineno">  229</span>     <span class="comment">//read line in lineInput buffer</span></div>
-<div class="line"><a name="l00230"></a><span class="lineno">  230</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iband=0;iband<inputReader.nrOfBand();++iband){</div>
-<div class="line"><a name="l00231"></a><span class="lineno">  231</span>       <span class="keywordflow">try</span>{</div>
-<div class="line"><a name="l00232"></a><span class="lineno">  232</span>         inputReader.readData(lineInput[iband],GDT_Float64,irow,iband);</div>
-<div class="line"><a name="l00233"></a><span class="lineno">  233</span>       }</div>
-<div class="line"><a name="l00234"></a><span class="lineno">  234</span>       <span class="keywordflow">catch</span>(<span class="keywordtype">string</span> errorstring){</div>
-<div class="line"><a name="l00235"></a><span class="lineno">  235</span>         cerr << errorstring << endl;</div>
-<div class="line"><a name="l00236"></a><span class="lineno">  236</span>         exit(1);</div>
-<div class="line"><a name="l00237"></a><span class="lineno">  237</span>       }</div>
-<div class="line"><a name="l00238"></a><span class="lineno">  238</span>     }</div>
-<div class="line"><a name="l00239"></a><span class="lineno">  239</span>     <span class="keywordtype">double</span> x,y;<span class="comment">//geo coordinates</span></div>
-<div class="line"><a name="l00240"></a><span class="lineno">  240</span>     <span class="keywordtype">double</span> colMask,rowMask;<span class="comment">//image coordinates in mask image</span></div>
-<div class="line"><a name="l00241"></a><span class="lineno">  241</span>     <span class="keywordflow">for</span>(icol=0;icol<inputReader.nrOfCol();++icol){</div>
-<div class="line"><a name="l00242"></a><span class="lineno">  242</span>       <span class="keywordflow">if</span>(mask_opt.size()>1){<span class="comment">//multiple masks</span></div>
-<div class="line"><a name="l00243"></a><span class="lineno">  243</span>         <span class="keywordflow">for</span>(<span class="keywordtype">int</span> imask=0;imask<mask_opt.size();++imask){</div>
-<div class="line"><a name="l00244"></a><span class="lineno">  244</span>       inputReader.image2geo(icol,irow,x,y);</div>
-<div class="line"><a name="l00245"></a><span class="lineno">  245</span>       maskReader[imask].geo2image(x,y,colMask,rowMask);</div>
-<div class="line"><a name="l00246"></a><span class="lineno">  246</span>       colMask=<span class="keyword">static_cast<</span><span class="keywordtype">int</span><span class="keyword">></span>(colMask);</div>
-<div class="line"><a name="l00247"></a><span class="lineno">  247</span>       rowMask=<span class="keyword">static_cast<</span><span class="keywordtype">int</span><span class="keyword">></span>(rowMask);</div>
-<div class="line"><a name="l00248"></a><span class="lineno">  248</span>           <span class="keywordtype">bool</span> masked=<span class="keyword">false</span>;</div>
-<div class="line"><a name="l00249"></a><span class="lineno">  249</span>           <span class="keywordflow">if</span>(rowMask>=0&&rowMask<maskReader[imask].nrOfRow()&&colMask>=0&&colMask<maskReader[imask].nrOfCol()){</div>
-<div class="line"><a name="l00250"></a><span class="lineno">  250</span>         <span class="keywordflow">if</span>(static_cast<int>(rowMask)!=<span class="keyword">static_cast<</span><span class="keywordtype">int</span><span class="keyword">></span>(oldRowMask[imask])){</div>
-<div class="line"><a name="l00251"></a><span class="lineno">  251</span>           assert(rowMask>=0&&rowMask<maskReader[imask].nrOfRow());</div>
-<div class="line"><a name="l00252"></a><span class="lineno">  252</span>           <span class="keywordflow">try</span>{</div>
-<div class="line"><a name="l00253"></a><span class="lineno">  253</span>         <span class="comment">// maskReader[imask].readData(lineMask[imask],GDT_Int32,static_cast<int>(rowMask));</span></div>
-<div class="line"><a name="l00254"></a><span class="lineno">  254</span>         maskReader[imask].readData(lineMask[imask],GDT_Float64,static_cast<int>(rowMask),mskband_opt[imask]);</div>
-<div class="line"><a name="l00255"></a><span class="lineno">  255</span>           }</div>
-<div class="line"><a name="l00256"></a><span class="lineno">  256</span>           <span class="keywordflow">catch</span>(<span class="keywordtype">string</span> errorstring){</div>
-<div class="line"><a name="l00257"></a><span class="lineno">  257</span>         cerr << errorstring << endl;</div>
-<div class="line"><a name="l00258"></a><span class="lineno">  258</span>         exit(1);</div>
-<div class="line"><a name="l00259"></a><span class="lineno">  259</span>           }</div>
-<div class="line"><a name="l00260"></a><span class="lineno">  260</span>           oldRowMask[imask]=rowMask;</div>
-<div class="line"><a name="l00261"></a><span class="lineno">  261</span>         }</div>
-<div class="line"><a name="l00262"></a><span class="lineno">  262</span>       }</div>
-<div class="line"><a name="l00263"></a><span class="lineno">  263</span>           <span class="keywordflow">else</span></div>
-<div class="line"><a name="l00264"></a><span class="lineno">  264</span>             <span class="keywordflow">continue</span>;<span class="comment">//no coverage in this mask</span></div>
-<div class="line"><a name="l00265"></a><span class="lineno">  265</span>       <span class="keywordtype">int</span> ivalue=0;</div>
-<div class="line"><a name="l00266"></a><span class="lineno">  266</span>       <span class="keywordflow">if</span>(mask_opt.size()==msknodata_opt.size())<span class="comment">//one invalid value for each mask</span></div>
-<div class="line"><a name="l00267"></a><span class="lineno">  267</span>         ivalue=msknodata_opt[imask];</div>
-<div class="line"><a name="l00268"></a><span class="lineno">  268</span>       <span class="keywordflow">else</span><span class="comment">//use same invalid value for each mask</span></div>
-<div class="line"><a name="l00269"></a><span class="lineno">  269</span>         ivalue=msknodata_opt[0];</div>
-<div class="line"><a name="l00270"></a><span class="lineno">  270</span>       <span class="keywordtype">char</span> op=(operator_opt.size()==mask_opt.size())?operator_opt[imask]:operator_opt[0];</div>
-<div class="line"><a name="l00271"></a><span class="lineno">  271</span>       <span class="keywordflow">switch</span>(op){</div>
-<div class="line"><a name="l00272"></a><span class="lineno">  272</span>       <span class="keywordflow">case</span>(<span class="charliteral">'='</span>):</div>
-<div class="line"><a name="l00273"></a><span class="lineno">  273</span>       <span class="keywordflow">default</span>:</div>
-<div class="line"><a name="l00274"></a><span class="lineno">  274</span>         <span class="keywordflow">if</span>(lineMask[imask][colMask]==ivalue)</div>
-<div class="line"><a name="l00275"></a><span class="lineno">  275</span>           masked=<span class="keyword">true</span>;</div>
-<div class="line"><a name="l00276"></a><span class="lineno">  276</span>       <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l00277"></a><span class="lineno">  277</span>       <span class="keywordflow">case</span>(<span class="charliteral">'<'</span>):</div>
-<div class="line"><a name="l00278"></a><span class="lineno">  278</span>         <span class="keywordflow">if</span>(lineMask[imask][colMask]<ivalue)</div>
-<div class="line"><a name="l00279"></a><span class="lineno">  279</span>           masked=<span class="keyword">true</span>;</div>
-<div class="line"><a name="l00280"></a><span class="lineno">  280</span>         <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l00281"></a><span class="lineno">  281</span>       <span class="keywordflow">case</span>(<span class="charliteral">'>'</span>):</div>
-<div class="line"><a name="l00282"></a><span class="lineno">  282</span>         <span class="keywordflow">if</span>(lineMask[imask][colMask]>ivalue)</div>
-<div class="line"><a name="l00283"></a><span class="lineno">  283</span>           masked=<span class="keyword">true</span>;</div>
-<div class="line"><a name="l00284"></a><span class="lineno">  284</span>         <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l00285"></a><span class="lineno">  285</span>       <span class="keywordflow">case</span>(<span class="charliteral">'!'</span>):</div>
-<div class="line"><a name="l00286"></a><span class="lineno">  286</span>         <span class="keywordflow">if</span>(lineMask[imask][colMask]!=ivalue)</div>
-<div class="line"><a name="l00287"></a><span class="lineno">  287</span>           masked=<span class="keyword">true</span>;</div>
-<div class="line"><a name="l00288"></a><span class="lineno">  288</span>         <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l00289"></a><span class="lineno">  289</span>       }</div>
-<div class="line"><a name="l00290"></a><span class="lineno">  290</span>       <span class="keywordflow">if</span>(masked){</div>
-<div class="line"><a name="l00291"></a><span class="lineno">  291</span>             <span class="keywordflow">if</span>(verbose_opt[0]>1)</div>
-<div class="line"><a name="l00292"></a><span class="lineno">  292</span>               cout << <span class="stringliteral">"image masked at (col="</span> << icol << <span class="stringliteral">",row="</span> << irow <<<span class="stringliteral">") with mask "</span> << mask_opt[imask] << <span class="stringliteral">" and value "</span> << ivalue << endl;</div>
-<div class="line"><a name="l00293"></a><span class="lineno">  293</span>         <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iband=0;iband<inputReader.nrOfBand();++iband){</div>
-<div class="line"><a name="l00294"></a><span class="lineno">  294</span>               <span class="keywordflow">if</span>(mask_opt.size()==nodata_opt.size())<span class="comment">//one flag value for each mask</span></div>
-<div class="line"><a name="l00295"></a><span class="lineno">  295</span>                 lineInput[iband][icol]=nodata_opt[imask];</div>
-<div class="line"><a name="l00296"></a><span class="lineno">  296</span>               <span class="keywordflow">else</span>                </div>
-<div class="line"><a name="l00297"></a><span class="lineno">  297</span>                 lineInput[iband][icol]=nodata_opt[0];</div>
-<div class="line"><a name="l00298"></a><span class="lineno">  298</span>             }</div>
-<div class="line"><a name="l00299"></a><span class="lineno">  299</span>             masked=<span class="keyword">false</span>;</div>
-<div class="line"><a name="l00300"></a><span class="lineno">  300</span>         <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l00301"></a><span class="lineno">  301</span>       }</div>
-<div class="line"><a name="l00302"></a><span class="lineno">  302</span>         }</div>
-<div class="line"><a name="l00303"></a><span class="lineno">  303</span>       }</div>
-<div class="line"><a name="l00304"></a><span class="lineno">  304</span>       <span class="keywordflow">else</span>{<span class="comment">//potentially more invalid values for single mask</span></div>
-<div class="line"><a name="l00305"></a><span class="lineno">  305</span>     inputReader.image2geo(icol,irow,x,y);</div>
-<div class="line"><a name="l00306"></a><span class="lineno">  306</span>     maskReader[0].geo2image(x,y,colMask,rowMask);</div>
-<div class="line"><a name="l00307"></a><span class="lineno">  307</span>     colMask=<span class="keyword">static_cast<</span><span class="keywordtype">int</span><span class="keyword">></span>(colMask);</div>
-<div class="line"><a name="l00308"></a><span class="lineno">  308</span>     rowMask=<span class="keyword">static_cast<</span><span class="keywordtype">int</span><span class="keyword">></span>(rowMask);</div>
-<div class="line"><a name="l00309"></a><span class="lineno">  309</span>         <span class="keywordtype">bool</span> masked=<span class="keyword">false</span>;</div>
-<div class="line"><a name="l00310"></a><span class="lineno">  310</span>         <span class="keywordflow">if</span>(rowMask>=0&&rowMask<maskReader[0].nrOfRow()&&colMask>=0&&colMask<maskReader[0].nrOfCol()){</div>
-<div class="line"><a name="l00311"></a><span class="lineno">  311</span>           <span class="keywordflow">if</span>(static_cast<int>(rowMask)!=<span class="keyword">static_cast<</span><span class="keywordtype">int</span><span class="keyword">></span>(oldRowMask[0])){</div>
-<div class="line"><a name="l00312"></a><span class="lineno">  312</span>             assert(rowMask>=0&&rowMask<maskReader[0].nrOfRow());</div>
-<div class="line"><a name="l00313"></a><span class="lineno">  313</span>             <span class="keywordflow">try</span>{</div>
-<div class="line"><a name="l00314"></a><span class="lineno">  314</span>               <span class="comment">// maskReader[0].readData(lineMask[0],GDT_Int32,static_cast<int>(rowMask));</span></div>
-<div class="line"><a name="l00315"></a><span class="lineno">  315</span>               maskReader[0].readData(lineMask[0],GDT_Float64,static_cast<int>(rowMask),mskband_opt[0]);</div>
-<div class="line"><a name="l00316"></a><span class="lineno">  316</span>         }</div>
-<div class="line"><a name="l00317"></a><span class="lineno">  317</span>             <span class="keywordflow">catch</span>(<span class="keywordtype">string</span> errorstring){</div>
-<div class="line"><a name="l00318"></a><span class="lineno">  318</span>               cerr << errorstring << endl;</div>
-<div class="line"><a name="l00319"></a><span class="lineno">  319</span>               exit(1);</div>
-<div class="line"><a name="l00320"></a><span class="lineno">  320</span>         }</div>
-<div class="line"><a name="l00321"></a><span class="lineno">  321</span>             oldRowMask[0]=rowMask;</div>
-<div class="line"><a name="l00322"></a><span class="lineno">  322</span>       }</div>
-<div class="line"><a name="l00323"></a><span class="lineno">  323</span>           <span class="keywordflow">for</span>(<span class="keywordtype">int</span> ivalue=0;ivalue<msknodata_opt.size();++ivalue){</div>
-<div class="line"><a name="l00324"></a><span class="lineno">  324</span>             assert(msknodata_opt.size()==nodata_opt.size());</div>
-<div class="line"><a name="l00325"></a><span class="lineno">  325</span>             <span class="keywordtype">char</span> op=(operator_opt.size()==msknodata_opt.size())?operator_opt[ivalue]:operator_opt[0];</div>
-<div class="line"><a name="l00326"></a><span class="lineno">  326</span>             <span class="keywordflow">switch</span>(op){</div>
-<div class="line"><a name="l00327"></a><span class="lineno">  327</span>             <span class="keywordflow">case</span>(<span class="charliteral">'='</span>):</div>
-<div class="line"><a name="l00328"></a><span class="lineno">  328</span>             <span class="keywordflow">default</span>:</div>
-<div class="line"><a name="l00329"></a><span class="lineno">  329</span>               <span class="keywordflow">if</span>(lineMask[0][colMask]==msknodata_opt[ivalue])</div>
-<div class="line"><a name="l00330"></a><span class="lineno">  330</span>                 masked=<span class="keyword">true</span>;</div>
-<div class="line"><a name="l00331"></a><span class="lineno">  331</span>               <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l00332"></a><span class="lineno">  332</span>             <span class="keywordflow">case</span>(<span class="charliteral">'<'</span>):</div>
-<div class="line"><a name="l00333"></a><span class="lineno">  333</span>               <span class="keywordflow">if</span>(lineMask[0][colMask]<msknodata_opt[ivalue])</div>
-<div class="line"><a name="l00334"></a><span class="lineno">  334</span>                 masked=<span class="keyword">true</span>;</div>
-<div class="line"><a name="l00335"></a><span class="lineno">  335</span>               <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l00336"></a><span class="lineno">  336</span>             <span class="keywordflow">case</span>(<span class="charliteral">'>'</span>):</div>
-<div class="line"><a name="l00337"></a><span class="lineno">  337</span>               <span class="keywordflow">if</span>(lineMask[0][colMask]>msknodata_opt[ivalue])</div>
-<div class="line"><a name="l00338"></a><span class="lineno">  338</span>                 masked=<span class="keyword">true</span>;</div>
-<div class="line"><a name="l00339"></a><span class="lineno">  339</span>               <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l00340"></a><span class="lineno">  340</span>             <span class="keywordflow">case</span>(<span class="charliteral">'!'</span>):</div>
-<div class="line"><a name="l00341"></a><span class="lineno">  341</span>               <span class="keywordflow">if</span>(lineMask[0][colMask]!=msknodata_opt[ivalue])</div>
-<div class="line"><a name="l00342"></a><span class="lineno">  342</span>                 masked=<span class="keyword">true</span>;</div>
-<div class="line"><a name="l00343"></a><span class="lineno">  343</span>               <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l00344"></a><span class="lineno">  344</span>             }</div>
-<div class="line"><a name="l00345"></a><span class="lineno">  345</span>             <span class="keywordflow">if</span>(masked){</div>
-<div class="line"><a name="l00346"></a><span class="lineno">  346</span>               <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iband=0;iband<inputReader.nrOfBand();++iband)</div>
-<div class="line"><a name="l00347"></a><span class="lineno">  347</span>                 lineInput[iband][icol]=nodata_opt[ivalue];</div>
-<div class="line"><a name="l00348"></a><span class="lineno">  348</span>               masked=<span class="keyword">false</span>;</div>
-<div class="line"><a name="l00349"></a><span class="lineno">  349</span>               <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l00350"></a><span class="lineno">  350</span>             }</div>
-<div class="line"><a name="l00351"></a><span class="lineno">  351</span>           }</div>
-<div class="line"><a name="l00352"></a><span class="lineno">  352</span>     }</div>
-<div class="line"><a name="l00353"></a><span class="lineno">  353</span>       }</div>
-<div class="line"><a name="l00354"></a><span class="lineno">  354</span>       <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iband=0;iband<lineOutput.size();++iband)</div>
-<div class="line"><a name="l00355"></a><span class="lineno">  355</span>         lineOutput[iband][icol]=lineInput[iband][icol];</div>
-<div class="line"><a name="l00356"></a><span class="lineno">  356</span>     }</div>
-<div class="line"><a name="l00357"></a><span class="lineno">  357</span>     <span class="comment">//write buffer lineOutput to output file</span></div>
-<div class="line"><a name="l00358"></a><span class="lineno">  358</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iband=0;iband<outputWriter.nrOfBand();++iband){</div>
-<div class="line"><a name="l00359"></a><span class="lineno">  359</span>       <span class="keywordflow">try</span>{</div>
-<div class="line"><a name="l00360"></a><span class="lineno">  360</span>         outputWriter.writeData(lineOutput[iband],GDT_Float64,irow,iband);</div>
-<div class="line"><a name="l00361"></a><span class="lineno">  361</span>       }</div>
-<div class="line"><a name="l00362"></a><span class="lineno">  362</span>       <span class="keywordflow">catch</span>(<span class="keywordtype">string</span> errorstring){</div>
-<div class="line"><a name="l00363"></a><span class="lineno">  363</span>         cerr << errorstring << endl;</div>
-<div class="line"><a name="l00364"></a><span class="lineno">  364</span>         exit(1);</div>
-<div class="line"><a name="l00365"></a><span class="lineno">  365</span>       }</div>
-<div class="line"><a name="l00366"></a><span class="lineno">  366</span>     }</div>
-<div class="line"><a name="l00367"></a><span class="lineno">  367</span>     <span class="comment">//progress bar</span></div>
-<div class="line"><a name="l00368"></a><span class="lineno">  368</span>     progress=<span class="keyword">static_cast<</span><span class="keywordtype">float</span><span class="keyword">></span>(irow+1.0)/outputWriter.nrOfRow();</div>
-<div class="line"><a name="l00369"></a><span class="lineno">  369</span>     pfnProgress(progress,pszMessage,pProgressArg);</div>
-<div class="line"><a name="l00370"></a><span class="lineno">  370</span>   }</div>
-<div class="line"><a name="l00371"></a><span class="lineno">  371</span>   inputReader.close();</div>
-<div class="line"><a name="l00372"></a><span class="lineno">  372</span>   <span class="keywordflow">for</span>(<span class="keywordtype">int</span> imask=0;imask<mask_opt.size();++imask)</div>
-<div class="line"><a name="l00373"></a><span class="lineno">  373</span>     maskReader[imask].close();</div>
-<div class="line"><a name="l00374"></a><span class="lineno">  374</span>   outputWriter.close();</div>
-<div class="line"><a name="l00375"></a><span class="lineno">  375</span> }</div>
+<div class="line"><a name="l00071"></a><span class="lineno">   71</span> <span class="keyword">using namespace </span>std;</div>
+<div class="line"><a name="l00072"></a><span class="lineno">   72</span> </div>
+<div class="line"><a name="l00073"></a><span class="lineno">   73</span> <span class="keywordtype">int</span> main(<span class="keywordtype">int</span> argc, <span class="keywordtype">char</span> *argv[])</div>
+<div class="line"><a name="l00074"></a><span class="lineno">   74</span> {</div>
+<div class="line"><a name="l00075"></a><span class="lineno">   75</span>   <span class="comment">//command line options</span></div>
+<div class="line"><a name="l00076"></a><span class="lineno">   76</span>   <a class="code" href="classOptionpk.html">Optionpk<string></a> input_opt(<span class="stringliteral">"i"</span>, <span class="stringliteral">"input"</span>, <span class="stringliteral">"Input image"</span>);</div>
+<div class="line"><a name="l00077"></a><span class="lineno">   77</span>   <a class="code" href="classOptionpk.html">Optionpk<string></a> mask_opt(<span class="stringliteral">"m"</span>, <span class="stringliteral">"mask"</span>, <span class="stringliteral">"Mask image(s)"</span>);</div>
+<div class="line"><a name="l00078"></a><span class="lineno">   78</span>   <a class="code" href="classOptionpk.html">Optionpk<string></a> output_opt(<span class="stringliteral">"o"</span>, <span class="stringliteral">"output"</span>, <span class="stringliteral">"Output mask file"</span>);</div>
+<div class="line"><a name="l00079"></a><span class="lineno">   79</span>   <a class="code" href="classOptionpk.html">Optionpk<string></a> otype_opt(<span class="stringliteral">"ot"</span>, <span class="stringliteral">"otype"</span>, <span class="stringliteral">"Data type for output image ({Byte/Int16/UInt16/UInt32/Int32/Float32/Float64/CInt16/CInt32/CFloat32/CFloat64}). Empty string: inherit type from input image"</span>, <span class="stringlitera [...]
+<div class="line"><a name="l00080"></a><span class="lineno">   80</span>   <a class="code" href="classOptionpk.html">Optionpk<string></a> oformat_opt(<span class="stringliteral">"of"</span>, <span class="stringliteral">"oformat"</span>, <span class="stringliteral">"Output image format (see also gdal_translate). Empty string: inherit from input image"</span>);</div>
+<div class="line"><a name="l00081"></a><span class="lineno">   81</span>   <a class="code" href="classOptionpk.html">Optionpk<string></a> option_opt(<span class="stringliteral">"co"</span>, <span class="stringliteral">"co"</span>, <span class="stringliteral">"Creation option for output file. Multiple options can be specified."</span>);</div>
+<div class="line"><a name="l00082"></a><span class="lineno">   82</span>   <a class="code" href="classOptionpk.html">Optionpk<int></a> msknodata_opt(<span class="stringliteral">"msknodata"</span>, <span class="stringliteral">"msknodata"</span>, <span class="stringliteral">"Mask value(s) where image has nodata. Use one value for each mask, or multiple values for a single mask."</span>, 1);</div>
+<div class="line"><a name="l00083"></a><span class="lineno">   83</span>   <a class="code" href="classOptionpk.html">Optionpk<short></a> mskband_opt(<span class="stringliteral">"mskband"</span>, <span class="stringliteral">"mskband"</span>, <span class="stringliteral">"Mask band to read (0 indexed). Provide band for each mask."</span>, 0);</div>
+<div class="line"><a name="l00084"></a><span class="lineno">   84</span>   <a class="code" href="classOptionpk.html">Optionpk<char></a> operator_opt(<span class="stringliteral">"p"</span>, <span class="stringliteral">"operator"</span>, <span class="stringliteral">"Operator: < = > !. Use operator for each msknodata option"</span>, <span class="charliteral">'='</span>);</div>
+<div class="line"><a name="l00085"></a><span class="lineno">   85</span>   <a class="code" href="classOptionpk.html">Optionpk<int></a> nodata_opt(<span class="stringliteral">"nodata"</span>, <span class="stringliteral">"nodata"</span>, <span class="stringliteral">"nodata value to put in image if not valid"</span>, 0);</div>
+<div class="line"><a name="l00086"></a><span class="lineno">   86</span>   <a class="code" href="classOptionpk.html">Optionpk<string></a> colorTable_opt(<span class="stringliteral">"ct"</span>, <span class="stringliteral">"ct"</span>, <span class="stringliteral">"color table (file with 5 columns: id R G B ALFA (0: transparent, 255: solid)"</span>);</div>
+<div class="line"><a name="l00087"></a><span class="lineno">   87</span>   <a class="code" href="classOptionpk.html">Optionpk<short></a> verbose_opt(<span class="stringliteral">"v"</span>, <span class="stringliteral">"verbose"</span>, <span class="stringliteral">"verbose"</span>, 0,2);</div>
+<div class="line"><a name="l00088"></a><span class="lineno">   88</span> </div>
+<div class="line"><a name="l00089"></a><span class="lineno">   89</span>   otype_opt.setHide(1);</div>
+<div class="line"><a name="l00090"></a><span class="lineno">   90</span>   oformat_opt.setHide(1);</div>
+<div class="line"><a name="l00091"></a><span class="lineno">   91</span>   option_opt.setHide(1);</div>
+<div class="line"><a name="l00092"></a><span class="lineno">   92</span>   colorTable_opt.setHide(1);</div>
+<div class="line"><a name="l00093"></a><span class="lineno">   93</span>   mskband_opt.setHide(1);</div>
+<div class="line"><a name="l00094"></a><span class="lineno">   94</span>   </div>
+<div class="line"><a name="l00095"></a><span class="lineno">   95</span>   <span class="keywordtype">bool</span> doProcess;<span class="comment">//stop process when program was invoked with help option (-h --help)</span></div>
+<div class="line"><a name="l00096"></a><span class="lineno">   96</span>   <span class="keywordflow">try</span>{</div>
+<div class="line"><a name="l00097"></a><span class="lineno">   97</span>     doProcess=input_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00098"></a><span class="lineno">   98</span>     mask_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00099"></a><span class="lineno">   99</span>     msknodata_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00100"></a><span class="lineno">  100</span>     mskband_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00101"></a><span class="lineno">  101</span>     output_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00102"></a><span class="lineno">  102</span>     nodata_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00103"></a><span class="lineno">  103</span>     operator_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00104"></a><span class="lineno">  104</span>     otype_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00105"></a><span class="lineno">  105</span>     oformat_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00106"></a><span class="lineno">  106</span>     option_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00107"></a><span class="lineno">  107</span>     colorTable_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00108"></a><span class="lineno">  108</span>     verbose_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00109"></a><span class="lineno">  109</span>   }</div>
+<div class="line"><a name="l00110"></a><span class="lineno">  110</span>   <span class="keywordflow">catch</span>(<span class="keywordtype">string</span> predefinedString){</div>
+<div class="line"><a name="l00111"></a><span class="lineno">  111</span>     std::cout << predefinedString << std::endl;</div>
+<div class="line"><a name="l00112"></a><span class="lineno">  112</span>     exit(0);</div>
+<div class="line"><a name="l00113"></a><span class="lineno">  113</span>   }</div>
+<div class="line"><a name="l00114"></a><span class="lineno">  114</span>   <span class="keywordflow">if</span>(!doProcess){</div>
+<div class="line"><a name="l00115"></a><span class="lineno">  115</span>     cout << endl;</div>
+<div class="line"><a name="l00116"></a><span class="lineno">  116</span>     cout << <span class="stringliteral">"Usage: pksetmask -i input -m mask [-m mask]* [-msknodata value -nodata value]* -o output"</span> << endl;</div>
+<div class="line"><a name="l00117"></a><span class="lineno">  117</span>     cout << endl;</div>
+<div class="line"><a name="l00118"></a><span class="lineno">  118</span>     std::cout << <span class="stringliteral">"short option -h shows basic options only, use long option --help to show all options"</span> << std::endl;</div>
+<div class="line"><a name="l00119"></a><span class="lineno">  119</span>     exit(0);<span class="comment">//help was invoked, stop processing</span></div>
+<div class="line"><a name="l00120"></a><span class="lineno">  120</span>   }</div>
+<div class="line"><a name="l00121"></a><span class="lineno">  121</span> </div>
+<div class="line"><a name="l00122"></a><span class="lineno">  122</span>   <span class="keywordflow">if</span>(verbose_opt[0])</div>
+<div class="line"><a name="l00123"></a><span class="lineno">  123</span>      cout << <span class="stringliteral">"number of mask images: "</span> << mask_opt.size() << endl;</div>
+<div class="line"><a name="l00124"></a><span class="lineno">  124</span> </div>
+<div class="line"><a name="l00125"></a><span class="lineno">  125</span>   <span class="comment">//duplicate band used for mask if not explicitly provided</span></div>
+<div class="line"><a name="l00126"></a><span class="lineno">  126</span>   <span class="keywordflow">while</span>(mskband_opt.size()<mask_opt.size())</div>
+<div class="line"><a name="l00127"></a><span class="lineno">  127</span>     mskband_opt.push_back(mskband_opt[0]);</div>
+<div class="line"><a name="l00128"></a><span class="lineno">  128</span> </div>
+<div class="line"><a name="l00129"></a><span class="lineno">  129</span>   vector<ImgReaderGdal> maskReader(mask_opt.size()); </div>
+<div class="line"><a name="l00130"></a><span class="lineno">  130</span>   <span class="keywordflow">for</span>(<span class="keywordtype">int</span> imask=0;imask<mask_opt.size();++imask){</div>
+<div class="line"><a name="l00131"></a><span class="lineno">  131</span>     <span class="keywordflow">if</span>(verbose_opt[0])</div>
+<div class="line"><a name="l00132"></a><span class="lineno">  132</span>       cout << <span class="stringliteral">"opening mask image file "</span> << mask_opt[imask] << endl;</div>
+<div class="line"><a name="l00133"></a><span class="lineno">  133</span>     maskReader[imask].open(mask_opt[imask]);</div>
+<div class="line"><a name="l00134"></a><span class="lineno">  134</span>   }</div>
+<div class="line"><a name="l00135"></a><span class="lineno">  135</span>   assert(input_opt.size());</div>
+<div class="line"><a name="l00136"></a><span class="lineno">  136</span>   <span class="keywordflow">if</span>(verbose_opt[0])</div>
+<div class="line"><a name="l00137"></a><span class="lineno">  137</span>     cout << <span class="stringliteral">"opening input image file "</span> << input_opt[0] << endl;</div>
+<div class="line"><a name="l00138"></a><span class="lineno">  138</span>   <a class="code" href="classImgReaderGdal.html">ImgReaderGdal</a> inputReader;</div>
+<div class="line"><a name="l00139"></a><span class="lineno">  139</span>   inputReader.open(input_opt[0]);</div>
+<div class="line"><a name="l00140"></a><span class="lineno">  140</span>   <span class="keywordtype">string</span> imageType=inputReader.getImageType();</div>
+<div class="line"><a name="l00141"></a><span class="lineno">  141</span>   <span class="keywordflow">if</span>(oformat_opt.size())<span class="comment">//default</span></div>
+<div class="line"><a name="l00142"></a><span class="lineno">  142</span>     imageType=oformat_opt[0];</div>
+<div class="line"><a name="l00143"></a><span class="lineno">  143</span>   GDALDataType theType=GDT_Unknown;</div>
+<div class="line"><a name="l00144"></a><span class="lineno">  144</span>   <span class="keywordflow">if</span>(verbose_opt[0]){</div>
+<div class="line"><a name="l00145"></a><span class="lineno">  145</span>     std::cout << <span class="stringliteral">"Image type: "</span> << imageType << std::endl;</div>
+<div class="line"><a name="l00146"></a><span class="lineno">  146</span>     std::cout << <span class="stringliteral">"possible output data types: "</span>;</div>
+<div class="line"><a name="l00147"></a><span class="lineno">  147</span>   }</div>
+<div class="line"><a name="l00148"></a><span class="lineno">  148</span>   <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iType = 0; iType < GDT_TypeCount; ++iType){</div>
+<div class="line"><a name="l00149"></a><span class="lineno">  149</span>     <span class="keywordflow">if</span>(verbose_opt[0])</div>
+<div class="line"><a name="l00150"></a><span class="lineno">  150</span>       cout << <span class="stringliteral">" "</span> << GDALGetDataTypeName((GDALDataType)iType);</div>
+<div class="line"><a name="l00151"></a><span class="lineno">  151</span>     <span class="keywordflow">if</span>( GDALGetDataTypeName((GDALDataType)iType) != NULL</div>
+<div class="line"><a name="l00152"></a><span class="lineno">  152</span>         && EQUAL(GDALGetDataTypeName((GDALDataType)iType),</div>
+<div class="line"><a name="l00153"></a><span class="lineno">  153</span>                  otype_opt[0].c_str()))</div>
+<div class="line"><a name="l00154"></a><span class="lineno">  154</span>       theType=(GDALDataType) iType;</div>
+<div class="line"><a name="l00155"></a><span class="lineno">  155</span>   }</div>
+<div class="line"><a name="l00156"></a><span class="lineno">  156</span>   <span class="keywordflow">if</span>(theType==GDT_Unknown)</div>
+<div class="line"><a name="l00157"></a><span class="lineno">  157</span>     theType=inputReader.getDataType();</div>
+<div class="line"><a name="l00158"></a><span class="lineno">  158</span> </div>
+<div class="line"><a name="l00159"></a><span class="lineno">  159</span>   assert(output_opt.size());</div>
+<div class="line"><a name="l00160"></a><span class="lineno">  160</span>   <span class="keywordflow">if</span>(verbose_opt[0]){</div>
+<div class="line"><a name="l00161"></a><span class="lineno">  161</span>     std::cout << std::endl << <span class="stringliteral">"Output data type:  "</span> << GDALGetDataTypeName(theType) << std::endl;</div>
+<div class="line"><a name="l00162"></a><span class="lineno">  162</span>     std::cout << <span class="stringliteral">"opening output image for writing: "</span> << output_opt[0] << std::endl;</div>
+<div class="line"><a name="l00163"></a><span class="lineno">  163</span>   }</div>
+<div class="line"><a name="l00164"></a><span class="lineno">  164</span>   <a class="code" href="classImgWriterGdal.html">ImgWriterGdal</a> outputWriter;</div>
+<div class="line"><a name="l00165"></a><span class="lineno">  165</span>   <span class="keywordflow">try</span>{</div>
+<div class="line"><a name="l00166"></a><span class="lineno">  166</span>     <span class="keywordflow">if</span>(option_opt.findSubstring(<span class="stringliteral">"INTERLEAVE="</span>)==option_opt.end()){</div>
+<div class="line"><a name="l00167"></a><span class="lineno">  167</span>       <span class="keywordtype">string</span> theInterleave=<span class="stringliteral">"INTERLEAVE="</span>;</div>
+<div class="line"><a name="l00168"></a><span class="lineno">  168</span>       theInterleave+=inputReader.getInterleave();</div>
+<div class="line"><a name="l00169"></a><span class="lineno">  169</span>       option_opt.push_back(theInterleave);</div>
+<div class="line"><a name="l00170"></a><span class="lineno">  170</span>     }</div>
+<div class="line"><a name="l00171"></a><span class="lineno">  171</span>     outputWriter.open(output_opt[0],inputReader.nrOfCol(),inputReader.nrOfRow(),inputReader.nrOfBand(),theType,imageType,option_opt);</div>
+<div class="line"><a name="l00172"></a><span class="lineno">  172</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iband=0;iband<inputReader.nrOfBand();++iband)</div>
+<div class="line"><a name="l00173"></a><span class="lineno">  173</span>       outputWriter.GDALSetNoDataValue(nodata_opt[0],iband);</div>
+<div class="line"><a name="l00174"></a><span class="lineno">  174</span>     outputWriter.setProjection(inputReader.getProjection());</div>
+<div class="line"><a name="l00175"></a><span class="lineno">  175</span>     outputWriter.copyGeoTransform(inputReader);</div>
+<div class="line"><a name="l00176"></a><span class="lineno">  176</span>   }</div>
+<div class="line"><a name="l00177"></a><span class="lineno">  177</span>   <span class="keywordflow">catch</span>(<span class="keywordtype">string</span> errorstring){</div>
+<div class="line"><a name="l00178"></a><span class="lineno">  178</span>     cout << errorstring << endl;</div>
+<div class="line"><a name="l00179"></a><span class="lineno">  179</span>     exit(1);</div>
+<div class="line"><a name="l00180"></a><span class="lineno">  180</span>   }</div>
+<div class="line"><a name="l00181"></a><span class="lineno">  181</span>   <span class="comment">// if(verbose_opt[0])</span></div>
+<div class="line"><a name="l00182"></a><span class="lineno">  182</span>   <span class="comment">//   cout << "opening output image file " << output_opt[0] << endl;</span></div>
+<div class="line"><a name="l00183"></a><span class="lineno">  183</span>   <span class="comment">// outputWriter.open(output_opt[0],inputReader);</span></div>
+<div class="line"><a name="l00184"></a><span class="lineno">  184</span>   <span class="keywordflow">if</span>(colorTable_opt.size()){</div>
+<div class="line"><a name="l00185"></a><span class="lineno">  185</span>     <span class="keywordflow">if</span>(colorTable_opt[0]!=<span class="stringliteral">"none"</span>)</div>
+<div class="line"><a name="l00186"></a><span class="lineno">  186</span>       outputWriter.setColorTable(colorTable_opt[0]);</div>
+<div class="line"><a name="l00187"></a><span class="lineno">  187</span>   }</div>
+<div class="line"><a name="l00188"></a><span class="lineno">  188</span>   <span class="keywordflow">else</span> <span class="keywordflow">if</span> (inputReader.getColorTable()!=NULL)<span class="comment">//copy colorTable from input image</span></div>
+<div class="line"><a name="l00189"></a><span class="lineno">  189</span>     outputWriter.setColorTable(inputReader.getColorTable());</div>
+<div class="line"><a name="l00190"></a><span class="lineno">  190</span>   <span class="keywordflow">if</span>(inputReader.isGeoRef()){</div>
+<div class="line"><a name="l00191"></a><span class="lineno">  191</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> imask=0;imask<mask_opt.size();++imask)</div>
+<div class="line"><a name="l00192"></a><span class="lineno">  192</span>       assert(maskReader[imask].isGeoRef());</div>
+<div class="line"><a name="l00193"></a><span class="lineno">  193</span>   }</div>
+<div class="line"><a name="l00194"></a><span class="lineno">  194</span>   assert(nodata_opt.size()==msknodata_opt.size());</div>
+<div class="line"><a name="l00195"></a><span class="lineno">  195</span>   assert(operator_opt.size()==msknodata_opt.size()||operator_opt.size()==1);</div>
+<div class="line"><a name="l00196"></a><span class="lineno">  196</span>   <span class="keywordflow">if</span>(verbose_opt[0]){</div>
+<div class="line"><a name="l00197"></a><span class="lineno">  197</span>     cout << <span class="stringliteral">" mask files selected: "</span> << mask_opt.size() << endl;</div>
+<div class="line"><a name="l00198"></a><span class="lineno">  198</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iv=0;iv<msknodata_opt.size();++iv){</div>
+<div class="line"><a name="l00199"></a><span class="lineno">  199</span>       <span class="keywordtype">char</span> op=(operator_opt.size()==msknodata_opt.size())?operator_opt[iv]:operator_opt[0];</div>
+<div class="line"><a name="l00200"></a><span class="lineno">  200</span>       cout << op << <span class="stringliteral">" "</span> << msknodata_opt[iv] << <span class="stringliteral">"->"</span> << nodata_opt[iv] << endl;</div>
+<div class="line"><a name="l00201"></a><span class="lineno">  201</span>     }</div>
+<div class="line"><a name="l00202"></a><span class="lineno">  202</span>   }</div>
+<div class="line"><a name="l00203"></a><span class="lineno">  203</span>   </div>
+<div class="line"><a name="l00204"></a><span class="lineno">  204</span>   <a class="code" href="classVector2d.html">Vector2d<double></a> lineInput(inputReader.nrOfBand(),inputReader.nrOfCol());</div>
+<div class="line"><a name="l00205"></a><span class="lineno">  205</span>   <a class="code" href="classVector2d.html">Vector2d<double></a> lineOutput(outputWriter.nrOfBand(),outputWriter.nrOfCol());</div>
+<div class="line"><a name="l00206"></a><span class="lineno">  206</span>   assert(lineOutput.size()==lineInput.size());</div>
+<div class="line"><a name="l00207"></a><span class="lineno">  207</span>   assert(inputReader.nrOfCol()==outputWriter.nrOfCol());</div>
+<div class="line"><a name="l00208"></a><span class="lineno">  208</span>   <span class="comment">// Vector2d<int> lineMask(mask_opt.size());</span></div>
+<div class="line"><a name="l00209"></a><span class="lineno">  209</span>   <a class="code" href="classVector2d.html">Vector2d<double></a> lineMask(mask_opt.size());</div>
+<div class="line"><a name="l00210"></a><span class="lineno">  210</span>   <span class="keywordflow">for</span>(<span class="keywordtype">int</span> imask=0;imask<mask_opt.size();++imask){</div>
+<div class="line"><a name="l00211"></a><span class="lineno">  211</span>     <span class="keywordflow">if</span>(verbose_opt[0])</div>
+<div class="line"><a name="l00212"></a><span class="lineno">  212</span>       cout << <span class="stringliteral">"mask "</span> << imask << <span class="stringliteral">" has "</span> << maskReader[imask].nrOfCol() << <span class="stringliteral">" columns and "</span> << maskReader[imask].nrOfRow() << <span class="stringliteral">" rows"</span> << endl;</div>
+<div class="line"><a name="l00213"></a><span class="lineno">  213</span>     lineMask[imask].resize(maskReader[imask].nrOfCol());</div>
+<div class="line"><a name="l00214"></a><span class="lineno">  214</span>   }</div>
+<div class="line"><a name="l00215"></a><span class="lineno">  215</span>   <span class="keywordtype">int</span> irow=0;</div>
+<div class="line"><a name="l00216"></a><span class="lineno">  216</span>   <span class="keywordtype">int</span> icol=0;</div>
+<div class="line"><a name="l00217"></a><span class="lineno">  217</span>   <span class="keyword">const</span> <span class="keywordtype">char</span>* pszMessage;</div>
+<div class="line"><a name="l00218"></a><span class="lineno">  218</span>   <span class="keywordtype">void</span>* pProgressArg=NULL;</div>
+<div class="line"><a name="l00219"></a><span class="lineno">  219</span>   GDALProgressFunc pfnProgress=GDALTermProgress;</div>
+<div class="line"><a name="l00220"></a><span class="lineno">  220</span>   <span class="keywordtype">float</span> progress=0;</div>
+<div class="line"><a name="l00221"></a><span class="lineno">  221</span>   <span class="keywordflow">if</span>(!verbose_opt[0])</div>
+<div class="line"><a name="l00222"></a><span class="lineno">  222</span>     pfnProgress(progress,pszMessage,pProgressArg);</div>
+<div class="line"><a name="l00223"></a><span class="lineno">  223</span>   <span class="comment">// double oldRowMask=-1;</span></div>
+<div class="line"><a name="l00224"></a><span class="lineno">  224</span>   vector<double> oldRowMask(mask_opt.size());</div>
+<div class="line"><a name="l00225"></a><span class="lineno">  225</span>   <span class="keywordflow">for</span>(<span class="keywordtype">int</span> imask=0;imask<mask_opt.size();++imask)</div>
+<div class="line"><a name="l00226"></a><span class="lineno">  226</span>     oldRowMask[imask]=-1;</div>
+<div class="line"><a name="l00227"></a><span class="lineno">  227</span>   <span class="keywordflow">for</span>(irow=0;irow<inputReader.nrOfRow();++irow){</div>
+<div class="line"><a name="l00228"></a><span class="lineno">  228</span>     <span class="comment">//read line in lineInput buffer</span></div>
+<div class="line"><a name="l00229"></a><span class="lineno">  229</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iband=0;iband<inputReader.nrOfBand();++iband){</div>
+<div class="line"><a name="l00230"></a><span class="lineno">  230</span>       <span class="keywordflow">try</span>{</div>
+<div class="line"><a name="l00231"></a><span class="lineno">  231</span>         inputReader.readData(lineInput[iband],GDT_Float64,irow,iband);</div>
+<div class="line"><a name="l00232"></a><span class="lineno">  232</span>       }</div>
+<div class="line"><a name="l00233"></a><span class="lineno">  233</span>       <span class="keywordflow">catch</span>(<span class="keywordtype">string</span> errorstring){</div>
+<div class="line"><a name="l00234"></a><span class="lineno">  234</span>         cerr << errorstring << endl;</div>
+<div class="line"><a name="l00235"></a><span class="lineno">  235</span>         exit(1);</div>
+<div class="line"><a name="l00236"></a><span class="lineno">  236</span>       }</div>
+<div class="line"><a name="l00237"></a><span class="lineno">  237</span>     }</div>
+<div class="line"><a name="l00238"></a><span class="lineno">  238</span>     <span class="keywordtype">double</span> x,y;<span class="comment">//geo coordinates</span></div>
+<div class="line"><a name="l00239"></a><span class="lineno">  239</span>     <span class="keywordtype">double</span> colMask,rowMask;<span class="comment">//image coordinates in mask image</span></div>
+<div class="line"><a name="l00240"></a><span class="lineno">  240</span>     <span class="keywordflow">for</span>(icol=0;icol<inputReader.nrOfCol();++icol){</div>
+<div class="line"><a name="l00241"></a><span class="lineno">  241</span>       <span class="keywordflow">if</span>(mask_opt.size()>1){<span class="comment">//multiple masks</span></div>
+<div class="line"><a name="l00242"></a><span class="lineno">  242</span>         <span class="keywordflow">for</span>(<span class="keywordtype">int</span> imask=0;imask<mask_opt.size();++imask){</div>
+<div class="line"><a name="l00243"></a><span class="lineno">  243</span>       inputReader.image2geo(icol,irow,x,y);</div>
+<div class="line"><a name="l00244"></a><span class="lineno">  244</span>       maskReader[imask].geo2image(x,y,colMask,rowMask);</div>
+<div class="line"><a name="l00245"></a><span class="lineno">  245</span>       colMask=<span class="keyword">static_cast<</span><span class="keywordtype">int</span><span class="keyword">></span>(colMask);</div>
+<div class="line"><a name="l00246"></a><span class="lineno">  246</span>       rowMask=<span class="keyword">static_cast<</span><span class="keywordtype">int</span><span class="keyword">></span>(rowMask);</div>
+<div class="line"><a name="l00247"></a><span class="lineno">  247</span>           <span class="keywordtype">bool</span> masked=<span class="keyword">false</span>;</div>
+<div class="line"><a name="l00248"></a><span class="lineno">  248</span>           <span class="keywordflow">if</span>(rowMask>=0&&rowMask<maskReader[imask].nrOfRow()&&colMask>=0&&colMask<maskReader[imask].nrOfCol()){</div>
+<div class="line"><a name="l00249"></a><span class="lineno">  249</span>         <span class="keywordflow">if</span>(static_cast<int>(rowMask)!=<span class="keyword">static_cast<</span><span class="keywordtype">int</span><span class="keyword">></span>(oldRowMask[imask])){</div>
+<div class="line"><a name="l00250"></a><span class="lineno">  250</span>           assert(rowMask>=0&&rowMask<maskReader[imask].nrOfRow());</div>
+<div class="line"><a name="l00251"></a><span class="lineno">  251</span>           <span class="keywordflow">try</span>{</div>
+<div class="line"><a name="l00252"></a><span class="lineno">  252</span>         <span class="comment">// maskReader[imask].readData(lineMask[imask],GDT_Int32,static_cast<int>(rowMask));</span></div>
+<div class="line"><a name="l00253"></a><span class="lineno">  253</span>         maskReader[imask].readData(lineMask[imask],GDT_Float64,static_cast<int>(rowMask),mskband_opt[imask]);</div>
+<div class="line"><a name="l00254"></a><span class="lineno">  254</span>           }</div>
+<div class="line"><a name="l00255"></a><span class="lineno">  255</span>           <span class="keywordflow">catch</span>(<span class="keywordtype">string</span> errorstring){</div>
+<div class="line"><a name="l00256"></a><span class="lineno">  256</span>         cerr << errorstring << endl;</div>
+<div class="line"><a name="l00257"></a><span class="lineno">  257</span>         exit(1);</div>
+<div class="line"><a name="l00258"></a><span class="lineno">  258</span>           }</div>
+<div class="line"><a name="l00259"></a><span class="lineno">  259</span>           oldRowMask[imask]=rowMask;</div>
+<div class="line"><a name="l00260"></a><span class="lineno">  260</span>         }</div>
+<div class="line"><a name="l00261"></a><span class="lineno">  261</span>       }</div>
+<div class="line"><a name="l00262"></a><span class="lineno">  262</span>           <span class="keywordflow">else</span></div>
+<div class="line"><a name="l00263"></a><span class="lineno">  263</span>             <span class="keywordflow">continue</span>;<span class="comment">//no coverage in this mask</span></div>
+<div class="line"><a name="l00264"></a><span class="lineno">  264</span>       <span class="keywordtype">int</span> ivalue=0;</div>
+<div class="line"><a name="l00265"></a><span class="lineno">  265</span>       <span class="keywordflow">if</span>(mask_opt.size()==msknodata_opt.size())<span class="comment">//one invalid value for each mask</span></div>
+<div class="line"><a name="l00266"></a><span class="lineno">  266</span>         ivalue=msknodata_opt[imask];</div>
+<div class="line"><a name="l00267"></a><span class="lineno">  267</span>       <span class="keywordflow">else</span><span class="comment">//use same invalid value for each mask</span></div>
+<div class="line"><a name="l00268"></a><span class="lineno">  268</span>         ivalue=msknodata_opt[0];</div>
+<div class="line"><a name="l00269"></a><span class="lineno">  269</span>       <span class="keywordtype">char</span> op=(operator_opt.size()==mask_opt.size())?operator_opt[imask]:operator_opt[0];</div>
+<div class="line"><a name="l00270"></a><span class="lineno">  270</span>       <span class="keywordflow">switch</span>(op){</div>
+<div class="line"><a name="l00271"></a><span class="lineno">  271</span>       <span class="keywordflow">case</span>(<span class="charliteral">'='</span>):</div>
+<div class="line"><a name="l00272"></a><span class="lineno">  272</span>       <span class="keywordflow">default</span>:</div>
+<div class="line"><a name="l00273"></a><span class="lineno">  273</span>         <span class="keywordflow">if</span>(lineMask[imask][colMask]==ivalue)</div>
+<div class="line"><a name="l00274"></a><span class="lineno">  274</span>           masked=<span class="keyword">true</span>;</div>
+<div class="line"><a name="l00275"></a><span class="lineno">  275</span>       <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l00276"></a><span class="lineno">  276</span>       <span class="keywordflow">case</span>(<span class="charliteral">'<'</span>):</div>
+<div class="line"><a name="l00277"></a><span class="lineno">  277</span>         <span class="keywordflow">if</span>(lineMask[imask][colMask]<ivalue)</div>
+<div class="line"><a name="l00278"></a><span class="lineno">  278</span>           masked=<span class="keyword">true</span>;</div>
+<div class="line"><a name="l00279"></a><span class="lineno">  279</span>         <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l00280"></a><span class="lineno">  280</span>       <span class="keywordflow">case</span>(<span class="charliteral">'>'</span>):</div>
+<div class="line"><a name="l00281"></a><span class="lineno">  281</span>         <span class="keywordflow">if</span>(lineMask[imask][colMask]>ivalue)</div>
+<div class="line"><a name="l00282"></a><span class="lineno">  282</span>           masked=<span class="keyword">true</span>;</div>
+<div class="line"><a name="l00283"></a><span class="lineno">  283</span>         <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l00284"></a><span class="lineno">  284</span>       <span class="keywordflow">case</span>(<span class="charliteral">'!'</span>):</div>
+<div class="line"><a name="l00285"></a><span class="lineno">  285</span>         <span class="keywordflow">if</span>(lineMask[imask][colMask]!=ivalue)</div>
+<div class="line"><a name="l00286"></a><span class="lineno">  286</span>           masked=<span class="keyword">true</span>;</div>
+<div class="line"><a name="l00287"></a><span class="lineno">  287</span>         <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l00288"></a><span class="lineno">  288</span>       }</div>
+<div class="line"><a name="l00289"></a><span class="lineno">  289</span>       <span class="keywordflow">if</span>(masked){</div>
+<div class="line"><a name="l00290"></a><span class="lineno">  290</span>             <span class="keywordflow">if</span>(verbose_opt[0]>1)</div>
+<div class="line"><a name="l00291"></a><span class="lineno">  291</span>               cout << <span class="stringliteral">"image masked at (col="</span> << icol << <span class="stringliteral">",row="</span> << irow <<<span class="stringliteral">") with mask "</span> << mask_opt[imask] << <span class="stringliteral">" and value "</span> << ivalue << endl;</div>
+<div class="line"><a name="l00292"></a><span class="lineno">  292</span>         <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iband=0;iband<inputReader.nrOfBand();++iband){</div>
+<div class="line"><a name="l00293"></a><span class="lineno">  293</span>               <span class="keywordflow">if</span>(mask_opt.size()==nodata_opt.size())<span class="comment">//one flag value for each mask</span></div>
+<div class="line"><a name="l00294"></a><span class="lineno">  294</span>                 lineInput[iband][icol]=nodata_opt[imask];</div>
+<div class="line"><a name="l00295"></a><span class="lineno">  295</span>               <span class="keywordflow">else</span>                </div>
+<div class="line"><a name="l00296"></a><span class="lineno">  296</span>                 lineInput[iband][icol]=nodata_opt[0];</div>
+<div class="line"><a name="l00297"></a><span class="lineno">  297</span>             }</div>
+<div class="line"><a name="l00298"></a><span class="lineno">  298</span>             masked=<span class="keyword">false</span>;</div>
+<div class="line"><a name="l00299"></a><span class="lineno">  299</span>         <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l00300"></a><span class="lineno">  300</span>       }</div>
+<div class="line"><a name="l00301"></a><span class="lineno">  301</span>         }</div>
+<div class="line"><a name="l00302"></a><span class="lineno">  302</span>       }</div>
+<div class="line"><a name="l00303"></a><span class="lineno">  303</span>       <span class="keywordflow">else</span>{<span class="comment">//potentially more invalid values for single mask</span></div>
+<div class="line"><a name="l00304"></a><span class="lineno">  304</span>     inputReader.image2geo(icol,irow,x,y);</div>
+<div class="line"><a name="l00305"></a><span class="lineno">  305</span>     maskReader[0].geo2image(x,y,colMask,rowMask);</div>
+<div class="line"><a name="l00306"></a><span class="lineno">  306</span>     colMask=<span class="keyword">static_cast<</span><span class="keywordtype">int</span><span class="keyword">></span>(colMask);</div>
+<div class="line"><a name="l00307"></a><span class="lineno">  307</span>     rowMask=<span class="keyword">static_cast<</span><span class="keywordtype">int</span><span class="keyword">></span>(rowMask);</div>
+<div class="line"><a name="l00308"></a><span class="lineno">  308</span>         <span class="keywordtype">bool</span> masked=<span class="keyword">false</span>;</div>
+<div class="line"><a name="l00309"></a><span class="lineno">  309</span>         <span class="keywordflow">if</span>(rowMask>=0&&rowMask<maskReader[0].nrOfRow()&&colMask>=0&&colMask<maskReader[0].nrOfCol()){</div>
+<div class="line"><a name="l00310"></a><span class="lineno">  310</span>           <span class="keywordflow">if</span>(static_cast<int>(rowMask)!=<span class="keyword">static_cast<</span><span class="keywordtype">int</span><span class="keyword">></span>(oldRowMask[0])){</div>
+<div class="line"><a name="l00311"></a><span class="lineno">  311</span>             assert(rowMask>=0&&rowMask<maskReader[0].nrOfRow());</div>
+<div class="line"><a name="l00312"></a><span class="lineno">  312</span>             <span class="keywordflow">try</span>{</div>
+<div class="line"><a name="l00313"></a><span class="lineno">  313</span>               <span class="comment">// maskReader[0].readData(lineMask[0],GDT_Int32,static_cast<int>(rowMask));</span></div>
+<div class="line"><a name="l00314"></a><span class="lineno">  314</span>               maskReader[0].readData(lineMask[0],GDT_Float64,static_cast<int>(rowMask),mskband_opt[0]);</div>
+<div class="line"><a name="l00315"></a><span class="lineno">  315</span>         }</div>
+<div class="line"><a name="l00316"></a><span class="lineno">  316</span>             <span class="keywordflow">catch</span>(<span class="keywordtype">string</span> errorstring){</div>
+<div class="line"><a name="l00317"></a><span class="lineno">  317</span>               cerr << errorstring << endl;</div>
+<div class="line"><a name="l00318"></a><span class="lineno">  318</span>               exit(1);</div>
+<div class="line"><a name="l00319"></a><span class="lineno">  319</span>         }</div>
+<div class="line"><a name="l00320"></a><span class="lineno">  320</span>             oldRowMask[0]=rowMask;</div>
+<div class="line"><a name="l00321"></a><span class="lineno">  321</span>       }</div>
+<div class="line"><a name="l00322"></a><span class="lineno">  322</span>           <span class="keywordflow">for</span>(<span class="keywordtype">int</span> ivalue=0;ivalue<msknodata_opt.size();++ivalue){</div>
+<div class="line"><a name="l00323"></a><span class="lineno">  323</span>             assert(msknodata_opt.size()==nodata_opt.size());</div>
+<div class="line"><a name="l00324"></a><span class="lineno">  324</span>             <span class="keywordtype">char</span> op=(operator_opt.size()==msknodata_opt.size())?operator_opt[ivalue]:operator_opt[0];</div>
+<div class="line"><a name="l00325"></a><span class="lineno">  325</span>             <span class="keywordflow">switch</span>(op){</div>
+<div class="line"><a name="l00326"></a><span class="lineno">  326</span>             <span class="keywordflow">case</span>(<span class="charliteral">'='</span>):</div>
+<div class="line"><a name="l00327"></a><span class="lineno">  327</span>             <span class="keywordflow">default</span>:</div>
+<div class="line"><a name="l00328"></a><span class="lineno">  328</span>               <span class="keywordflow">if</span>(lineMask[0][colMask]==msknodata_opt[ivalue])</div>
+<div class="line"><a name="l00329"></a><span class="lineno">  329</span>                 masked=<span class="keyword">true</span>;</div>
+<div class="line"><a name="l00330"></a><span class="lineno">  330</span>               <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l00331"></a><span class="lineno">  331</span>             <span class="keywordflow">case</span>(<span class="charliteral">'<'</span>):</div>
+<div class="line"><a name="l00332"></a><span class="lineno">  332</span>               <span class="keywordflow">if</span>(lineMask[0][colMask]<msknodata_opt[ivalue])</div>
+<div class="line"><a name="l00333"></a><span class="lineno">  333</span>                 masked=<span class="keyword">true</span>;</div>
+<div class="line"><a name="l00334"></a><span class="lineno">  334</span>               <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l00335"></a><span class="lineno">  335</span>             <span class="keywordflow">case</span>(<span class="charliteral">'>'</span>):</div>
+<div class="line"><a name="l00336"></a><span class="lineno">  336</span>               <span class="keywordflow">if</span>(lineMask[0][colMask]>msknodata_opt[ivalue])</div>
+<div class="line"><a name="l00337"></a><span class="lineno">  337</span>                 masked=<span class="keyword">true</span>;</div>
+<div class="line"><a name="l00338"></a><span class="lineno">  338</span>               <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l00339"></a><span class="lineno">  339</span>             <span class="keywordflow">case</span>(<span class="charliteral">'!'</span>):</div>
+<div class="line"><a name="l00340"></a><span class="lineno">  340</span>               <span class="keywordflow">if</span>(lineMask[0][colMask]!=msknodata_opt[ivalue])</div>
+<div class="line"><a name="l00341"></a><span class="lineno">  341</span>                 masked=<span class="keyword">true</span>;</div>
+<div class="line"><a name="l00342"></a><span class="lineno">  342</span>               <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l00343"></a><span class="lineno">  343</span>             }</div>
+<div class="line"><a name="l00344"></a><span class="lineno">  344</span>             <span class="keywordflow">if</span>(masked){</div>
+<div class="line"><a name="l00345"></a><span class="lineno">  345</span>               <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iband=0;iband<inputReader.nrOfBand();++iband)</div>
+<div class="line"><a name="l00346"></a><span class="lineno">  346</span>                 lineInput[iband][icol]=nodata_opt[ivalue];</div>
+<div class="line"><a name="l00347"></a><span class="lineno">  347</span>               masked=<span class="keyword">false</span>;</div>
+<div class="line"><a name="l00348"></a><span class="lineno">  348</span>               <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l00349"></a><span class="lineno">  349</span>             }</div>
+<div class="line"><a name="l00350"></a><span class="lineno">  350</span>           }</div>
+<div class="line"><a name="l00351"></a><span class="lineno">  351</span>     }</div>
+<div class="line"><a name="l00352"></a><span class="lineno">  352</span>       }</div>
+<div class="line"><a name="l00353"></a><span class="lineno">  353</span>       <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iband=0;iband<lineOutput.size();++iband)</div>
+<div class="line"><a name="l00354"></a><span class="lineno">  354</span>         lineOutput[iband][icol]=lineInput[iband][icol];</div>
+<div class="line"><a name="l00355"></a><span class="lineno">  355</span>     }</div>
+<div class="line"><a name="l00356"></a><span class="lineno">  356</span>     <span class="comment">//write buffer lineOutput to output file</span></div>
+<div class="line"><a name="l00357"></a><span class="lineno">  357</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iband=0;iband<outputWriter.nrOfBand();++iband){</div>
+<div class="line"><a name="l00358"></a><span class="lineno">  358</span>       <span class="keywordflow">try</span>{</div>
+<div class="line"><a name="l00359"></a><span class="lineno">  359</span>         outputWriter.writeData(lineOutput[iband],GDT_Float64,irow,iband);</div>
+<div class="line"><a name="l00360"></a><span class="lineno">  360</span>       }</div>
+<div class="line"><a name="l00361"></a><span class="lineno">  361</span>       <span class="keywordflow">catch</span>(<span class="keywordtype">string</span> errorstring){</div>
+<div class="line"><a name="l00362"></a><span class="lineno">  362</span>         cerr << errorstring << endl;</div>
+<div class="line"><a name="l00363"></a><span class="lineno">  363</span>         exit(1);</div>
+<div class="line"><a name="l00364"></a><span class="lineno">  364</span>       }</div>
+<div class="line"><a name="l00365"></a><span class="lineno">  365</span>     }</div>
+<div class="line"><a name="l00366"></a><span class="lineno">  366</span>     <span class="comment">//progress bar</span></div>
+<div class="line"><a name="l00367"></a><span class="lineno">  367</span>     progress=<span class="keyword">static_cast<</span><span class="keywordtype">float</span><span class="keyword">></span>(irow+1.0)/outputWriter.nrOfRow();</div>
+<div class="line"><a name="l00368"></a><span class="lineno">  368</span>     pfnProgress(progress,pszMessage,pProgressArg);</div>
+<div class="line"><a name="l00369"></a><span class="lineno">  369</span>   }</div>
+<div class="line"><a name="l00370"></a><span class="lineno">  370</span>   inputReader.close();</div>
+<div class="line"><a name="l00371"></a><span class="lineno">  371</span>   <span class="keywordflow">for</span>(<span class="keywordtype">int</span> imask=0;imask<mask_opt.size();++imask)</div>
+<div class="line"><a name="l00372"></a><span class="lineno">  372</span>     maskReader[imask].close();</div>
+<div class="line"><a name="l00373"></a><span class="lineno">  373</span>   outputWriter.close();</div>
+<div class="line"><a name="l00374"></a><span class="lineno">  374</span> }</div>
 <div class="ttc" id="classImgReaderGdal_html"><div class="ttname"><a href="classImgReaderGdal.html">ImgReaderGdal</a></div><div class="ttdef"><b>Definition:</b> <a href="ImgReaderGdal_8h_source.html#l00033">ImgReaderGdal.h:33</a></div></div>
 <div class="ttc" id="classImgWriterGdal_html"><div class="ttname"><a href="classImgWriterGdal.html">ImgWriterGdal</a></div><div class="ttdef"><b>Definition:</b> <a href="ImgWriterGdal_8h_source.html#l00032">ImgWriterGdal.h:32</a></div></div>
 <div class="ttc" id="classVector2d_html"><div class="ttname"><a href="classVector2d.html">Vector2d< double ></a></div></div>
@@ -389,7 +389,7 @@
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Jun 23 2015 17:09:36 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/pksetmask_8py_source.html b/doc/html/pksetmask_8py_source.html
index 4db1f73..96f6064 100644
--- a/doc/html/pksetmask_8py_source.html
+++ b/doc/html/pksetmask_8py_source.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.3</span>
+    <span id="projectnumber">2.6.4</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -147,27 +147,24 @@
 <div class="line"><a name="l00093"></a><span class="lineno">   93</span>                 commands.append(<span class="stringliteral">'-msknodata'</span>)</div>
 <div class="line"><a name="l00094"></a><span class="lineno">   94</span>                 commands.append(msknodataValue)</div>
 <div class="line"><a name="l00095"></a><span class="lineno">   95</span> </div>
-<div class="line"><a name="l00096"></a><span class="lineno">   96</span>         band=self.getParameterValue(self.BAND)</div>
-<div class="line"><a name="l00097"></a><span class="lineno">   97</span>         commands.append(<span class="stringliteral">"-p"</span>)</div>
-<div class="line"><a name="l00098"></a><span class="lineno">   98</span>         commands.append(self.<a class="code" href="classqgis_1_1pksetmask_1_1pksetmask.html#a0ec16c72e434e986dc7127edd22a8756">OPERATOR_OPTIONS</a>[self.getParameterValue(self.<a class="code" href="classqgis_1_1pksetmask_1_1pksetmask.html#a68d2802febad55d67d4848ee6553d21e">OPERATOR</a>)])</div>
-<div class="line"><a name="l00099"></a><span class="lineno">   99</span>         nodata=self.getParameterValue(self.<a class="code" href="classqgis_1_1pksetmask_1_1pksetmask.html#a7db2c15757ac66baf866fcaaba9f27ac">NODATA</a>)</div>
-<div class="line"><a name="l00100"></a><span class="lineno">  100</span>         commands.append(<span class="stringliteral">'-nodata'</span>)</div>
-<div class="line"><a name="l00101"></a><span class="lineno">  101</span>         commands.append(nodataValue)</div>
-<div class="line"><a name="l00102"></a><span class="lineno">  102</span>         <span class="keywordflow">if</span> self.<a class="code" href="classqgis_1_1pksetmask_1_1pksetmask.html#a4c222c8118aa51967806a48f9e67151a">TYPE</a>[self.getParameterValue(self.<a class="code" href="classqgis_1_1pksetmask_1_1pksetmask.html#a53adabeb756e8f6c38b739a182b4c351">RTYPE</a>)] != <span class="stringliteral">"none"</span>:</div>
-<div class="line"><a name="l00103"></a><span class="lineno">  103</span>             commands.append(<span class="stringliteral">'-ot'</span>)</div>
-<div class="line"><a name="l00104"></a><span class="lineno">  104</span>             commands.append(self.<a class="code" href="classqgis_1_1pksetmask_1_1pksetmask.html#a4c222c8118aa51967806a48f9e67151a">TYPE</a>[self.getParameterValue(self.<a class="code" href="classqgis_1_1pksetmask_1_1pksetmask.html#a53adabeb756e8f6c38b739a182b4c351">RTYPE</a>)])</div>
-<div class="line"><a name="l00105"></a><span class="lineno">  105</span>         output=self.getOutputValue(self.<a class="code" href="classqgis_1_1pksetmask_1_1pksetmask.html#a1f43a43129a59344782bd62b9984045b">OUTPUT</a>)</div>
-<div class="line"><a name="l00106"></a><span class="lineno">  106</span>         <span class="keywordflow">if</span> output != <span class="stringliteral">""</span>:</div>
-<div class="line"><a name="l00107"></a><span class="lineno">  107</span>             commands.append(<span class="stringliteral">"-o"</span>)</div>
-<div class="line"><a name="l00108"></a><span class="lineno">  108</span>             commands.append(<span class="stringliteral">'"'</span> + output + <span class="stringliteral">'"'</span>)</div>
-<div class="line"><a name="l00109"></a><span class="lineno">  109</span> </div>
-<div class="line"><a name="l00110"></a><span class="lineno">  110</span>         data=self.getParameterValue(self.DATA)</div>
-<div class="line"><a name="l00111"></a><span class="lineno">  111</span> </div>
-<div class="line"><a name="l00112"></a><span class="lineno">  112</span>         extra = str(self.getParameterValue(self.<a class="code" href="classqgis_1_1pksetmask_1_1pksetmask.html#ae31305e3b79571cc6475b47cf9c4762e">EXTRA</a>))</div>
-<div class="line"><a name="l00113"></a><span class="lineno">  113</span>         <span class="keywordflow">if</span> len(extra) > 0:</div>
-<div class="line"><a name="l00114"></a><span class="lineno">  114</span>             commands.append(extra)</div>
-<div class="line"><a name="l00115"></a><span class="lineno">  115</span> </div>
-<div class="line"><a name="l00116"></a><span class="lineno">  116</span>         pktoolsUtils.runpktools(commands, progress)</div>
+<div class="line"><a name="l00096"></a><span class="lineno">   96</span>         commands.append(<span class="stringliteral">"-p"</span>)</div>
+<div class="line"><a name="l00097"></a><span class="lineno">   97</span>         commands.append(self.<a class="code" href="classqgis_1_1pksetmask_1_1pksetmask.html#a0ec16c72e434e986dc7127edd22a8756">OPERATOR_OPTIONS</a>[self.getParameterValue(self.<a class="code" href="classqgis_1_1pksetmask_1_1pksetmask.html#a68d2802febad55d67d4848ee6553d21e">OPERATOR</a>)])</div>
+<div class="line"><a name="l00098"></a><span class="lineno">   98</span>         nodata=self.getParameterValue(self.<a class="code" href="classqgis_1_1pksetmask_1_1pksetmask.html#a7db2c15757ac66baf866fcaaba9f27ac">NODATA</a>)</div>
+<div class="line"><a name="l00099"></a><span class="lineno">   99</span>         commands.append(<span class="stringliteral">'-nodata'</span>)</div>
+<div class="line"><a name="l00100"></a><span class="lineno">  100</span>         commands.append(nodata)</div>
+<div class="line"><a name="l00101"></a><span class="lineno">  101</span>         <span class="keywordflow">if</span> self.<a class="code" href="classqgis_1_1pksetmask_1_1pksetmask.html#a4c222c8118aa51967806a48f9e67151a">TYPE</a>[self.getParameterValue(self.<a class="code" href="classqgis_1_1pksetmask_1_1pksetmask.html#a53adabeb756e8f6c38b739a182b4c351">RTYPE</a>)] != <span class="stringliteral">"none"</span>:</div>
+<div class="line"><a name="l00102"></a><span class="lineno">  102</span>             commands.append(<span class="stringliteral">'-ot'</span>)</div>
+<div class="line"><a name="l00103"></a><span class="lineno">  103</span>             commands.append(self.<a class="code" href="classqgis_1_1pksetmask_1_1pksetmask.html#a4c222c8118aa51967806a48f9e67151a">TYPE</a>[self.getParameterValue(self.<a class="code" href="classqgis_1_1pksetmask_1_1pksetmask.html#a53adabeb756e8f6c38b739a182b4c351">RTYPE</a>)])</div>
+<div class="line"><a name="l00104"></a><span class="lineno">  104</span>         output=self.getOutputValue(self.<a class="code" href="classqgis_1_1pksetmask_1_1pksetmask.html#a1f43a43129a59344782bd62b9984045b">OUTPUT</a>)</div>
+<div class="line"><a name="l00105"></a><span class="lineno">  105</span>         <span class="keywordflow">if</span> output != <span class="stringliteral">""</span>:</div>
+<div class="line"><a name="l00106"></a><span class="lineno">  106</span>             commands.append(<span class="stringliteral">"-o"</span>)</div>
+<div class="line"><a name="l00107"></a><span class="lineno">  107</span>             commands.append(<span class="stringliteral">'"'</span> + output + <span class="stringliteral">'"'</span>)</div>
+<div class="line"><a name="l00108"></a><span class="lineno">  108</span> </div>
+<div class="line"><a name="l00109"></a><span class="lineno">  109</span>         extra = str(self.getParameterValue(self.<a class="code" href="classqgis_1_1pksetmask_1_1pksetmask.html#ae31305e3b79571cc6475b47cf9c4762e">EXTRA</a>))</div>
+<div class="line"><a name="l00110"></a><span class="lineno">  110</span>         <span class="keywordflow">if</span> len(extra) > 0:</div>
+<div class="line"><a name="l00111"></a><span class="lineno">  111</span>             commands.append(extra)</div>
+<div class="line"><a name="l00112"></a><span class="lineno">  112</span> </div>
+<div class="line"><a name="l00113"></a><span class="lineno">  113</span>         pktoolsUtils.runpktools(commands, progress)</div>
 <div class="ttc" id="classqgis_1_1pksetmask_1_1pksetmask_html_a0ec16c72e434e986dc7127edd22a8756"><div class="ttname"><a href="classqgis_1_1pksetmask_1_1pksetmask.html#a0ec16c72e434e986dc7127edd22a8756">qgis.pksetmask.pksetmask.OPERATOR_OPTIONS</a></div><div class="ttdeci">list OPERATOR_OPTIONS</div><div class="ttdef"><b>Definition:</b> <a href="pksetmask_8py_source.html#l00044">pksetmask.py:44</a></div></div>
 <div class="ttc" id="classqgis_1_1pksetmask_1_1pksetmask_html_a4c222c8118aa51967806a48f9e67151a"><div class="ttname"><a href="classqgis_1_1pksetmask_1_1pksetmask.html#a4c222c8118aa51967806a48f9e67151a">qgis.pksetmask.pksetmask.TYPE</a></div><div class="ttdeci">list TYPE</div><div class="ttdef"><b>Definition:</b> <a href="pksetmask_8py_source.html#l00049">pksetmask.py:49</a></div></div>
 <div class="ttc" id="classqgis_1_1pksetmask_1_1pksetmask_html_a68d2802febad55d67d4848ee6553d21e"><div class="ttname"><a href="classqgis_1_1pksetmask_1_1pksetmask.html#a68d2802febad55d67d4848ee6553d21e">qgis.pksetmask.pksetmask.OPERATOR</a></div><div class="ttdeci">string OPERATOR</div><div class="ttdef"><b>Definition:</b> <a href="pksetmask_8py_source.html#l00045">pksetmask.py:45</a></div></div>
@@ -187,7 +184,7 @@
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Jun 23 2015 17:09:36 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Tue Nov 3 2015 15:58:26 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/pksieve.html b/doc/html/pksieve.html
index 0c8b346..854c190 100644
--- a/doc/html/pksieve.html
+++ b/doc/html/pksieve.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.3</span>
+    <span id="projectnumber">2.6.4</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -86,7 +86,7 @@ Usage: pksieve -i input [-s size] -o output</li>
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Jun 23 2015 17:09:37 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/pksieve_8cc_source.html b/doc/html/pksieve_8cc_source.html
index 3e97389..b6b2367 100644
--- a/doc/html/pksieve_8cc_source.html
+++ b/doc/html/pksieve_8cc_source.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.3</span>
+    <span id="projectnumber">2.6.4</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -180,7 +180,7 @@
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Jun 23 2015 17:09:36 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/pkstat.html b/doc/html/pkstat.html
index 4a78648..1f80e22 100644
--- a/doc/html/pkstat.html
+++ b/doc/html/pkstat.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.3</span>
+    <span id="projectnumber">2.6.4</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -124,7 +124,7 @@ Usage: pkstat -i input </li>
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Jun 23 2015 17:09:37 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/pkstat_8cc_source.html b/doc/html/pkstat_8cc_source.html
index ab9e916..3fa3df7 100644
--- a/doc/html/pkstat_8cc_source.html
+++ b/doc/html/pkstat_8cc_source.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.3</span>
+    <span id="projectnumber">2.6.4</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -85,957 +85,969 @@
 <div class="line"><a name="l00082"></a><span class="lineno">   82</span>   <a class="code" href="classOptionpk.html">Optionpk<string></a> input_opt(<span class="stringliteral">"i"</span>,<span class="stringliteral">"input"</span>,<span class="stringliteral">"name of the input raster dataset"</span>);</div>
 <div class="line"><a name="l00083"></a><span class="lineno">   83</span>   <a class="code" href="classOptionpk.html">Optionpk<unsigned short></a> band_opt(<span class="stringliteral">"b"</span>,<span class="stringliteral">"band"</span>,<span class="stringliteral">"band(s) on which to calculate statistics"</span>,0);</div>
 <div class="line"><a name="l00084"></a><span class="lineno">   84</span>   <a class="code" href="classOptionpk.html">Optionpk<bool></a>  filename_opt(<span class="stringliteral">"f"</span>, <span class="stringliteral">"filename"</span>, <span class="stringliteral">"Shows image filename "</span>, <span class="keyword">false</span>);</div>
-<div class="line"><a name="l00085"></a><span class="lineno">   85</span>   <a class="code" href="classOptionpk.html">Optionpk<bool></a>  stat_opt(<span class="stringliteral">"stats"</span>, <span class="stringliteral">"statistics"</span>, <span class="stringliteral">"Shows basic statistics (min,max, mean and stdDev of the raster datasets)"</span>, <span class="keyword">false</span>);</div>
-<div class="line"><a name="l00086"></a><span class="lineno">   86</span>   <a class="code" href="classOptionpk.html">Optionpk<double></a>  ulx_opt(<span class="stringliteral">"ulx"</span>, <span class="stringliteral">"ulx"</span>, <span class="stringliteral">"Upper left x value bounding box"</span>);</div>
-<div class="line"><a name="l00087"></a><span class="lineno">   87</span>   <a class="code" href="classOptionpk.html">Optionpk<double></a>  uly_opt(<span class="stringliteral">"uly"</span>, <span class="stringliteral">"uly"</span>, <span class="stringliteral">"Upper left y value bounding box"</span>);</div>
-<div class="line"><a name="l00088"></a><span class="lineno">   88</span>   <a class="code" href="classOptionpk.html">Optionpk<double></a>  lrx_opt(<span class="stringliteral">"lrx"</span>, <span class="stringliteral">"lrx"</span>, <span class="stringliteral">"Lower right x value bounding box"</span>);</div>
-<div class="line"><a name="l00089"></a><span class="lineno">   89</span>   <a class="code" href="classOptionpk.html">Optionpk<double></a>  lry_opt(<span class="stringliteral">"lry"</span>, <span class="stringliteral">"lry"</span>, <span class="stringliteral">"Lower right y value bounding box"</span>);</div>
-<div class="line"><a name="l00090"></a><span class="lineno">   90</span>   <a class="code" href="classOptionpk.html">Optionpk<double></a> nodata_opt(<span class="stringliteral">"nodata"</span>,<span class="stringliteral">"nodata"</span>,<span class="stringliteral">"Set nodata value(s)"</span>);</div>
-<div class="line"><a name="l00091"></a><span class="lineno">   91</span>   <a class="code" href="classOptionpk.html">Optionpk<short></a> down_opt(<span class="stringliteral">"down"</span>, <span class="stringliteral">"down"</span>, <span class="stringliteral">"Down sampling factor (for raster sample datasets only). Can be used to create grid points"</span>, 1);</div>
-<div class="line"><a name="l00092"></a><span class="lineno">   92</span>   <a class="code" href="classOptionpk.html">Optionpk<unsigned int></a> random_opt(<span class="stringliteral">"rnd"</span>, <span class="stringliteral">"rnd"</span>, <span class="stringliteral">"generate random numbers"</span>, 0);</div>
-<div class="line"><a name="l00093"></a><span class="lineno">   93</span>   <a class="code" href="classOptionpk.html">Optionpk<double></a>  scale_opt(<span class="stringliteral">"scale"</span>, <span class="stringliteral">"scale"</span>, <span class="stringliteral">"Scale(s) for reading input image(s)"</span>);</div>
-<div class="line"><a name="l00094"></a><span class="lineno">   94</span>   <a class="code" href="classOptionpk.html">Optionpk<double></a>  offset_opt(<span class="stringliteral">"offset"</span>, <span class="stringliteral">"offset"</span>, <span class="stringliteral">"Offset(s) for reading input image(s)"</span>);</div>
-<div class="line"><a name="l00095"></a><span class="lineno">   95</span> </div>
-<div class="line"><a name="l00096"></a><span class="lineno">   96</span>   <span class="comment">// Optionpk<bool> transpose_opt("t","transpose","transpose output",false);</span></div>
-<div class="line"><a name="l00097"></a><span class="lineno">   97</span>   <span class="comment">// Optionpk<std::string> randdist_opt("dist", "dist", "distribution for generating random numbers, see http://www.gn/software/gsl/manual/gsl-ref_toc.html#TOC320 (only uniform and Gaussian supported yet)", "gaussian");</span></div>
-<div class="line"><a name="l00098"></a><span class="lineno">   98</span>   <span class="comment">// Optionpk<double> randa_opt("rnda", "rnda", "first parameter for random distribution (mean value in case of Gaussian)", 0);</span></div>
-<div class="line"><a name="l00099"></a><span class="lineno">   99</span>   <span class="comment">// Optionpk<double> randb_opt("rndb", "rndb", "second parameter for random distribution (standard deviation in case of Gaussian)", 1);</span></div>
-<div class="line"><a name="l00100"></a><span class="lineno">  100</span>   <a class="code" href="classOptionpk.html">Optionpk<bool></a> mean_opt(<span class="stringliteral">"mean"</span>,<span class="stringliteral">"mean"</span>,<span class="stringliteral">"calculate mean"</span>,<span class="keyword">false</span>);</div>
-<div class="line"><a name="l00101"></a><span class="lineno">  101</span>   <a class="code" href="classOptionpk.html">Optionpk<bool></a> median_opt(<span class="stringliteral">"median"</span>,<span class="stringliteral">"median"</span>,<span class="stringliteral">"calculate median"</span>,<span class="keyword">false</span>);</div>
-<div class="line"><a name="l00102"></a><span class="lineno">  102</span>   <a class="code" href="classOptionpk.html">Optionpk<bool></a> var_opt(<span class="stringliteral">"var"</span>,<span class="stringliteral">"var"</span>,<span class="stringliteral">"calculate variance"</span>,<span class="keyword">false</span>);</div>
-<div class="line"><a name="l00103"></a><span class="lineno">  103</span>   <a class="code" href="classOptionpk.html">Optionpk<bool></a> skewness_opt(<span class="stringliteral">"skew"</span>,<span class="stringliteral">"skewness"</span>,<span class="stringliteral">"calculate skewness"</span>,<span class="keyword">false</span>);</div>
-<div class="line"><a name="l00104"></a><span class="lineno">  104</span>   <a class="code" href="classOptionpk.html">Optionpk<bool></a> kurtosis_opt(<span class="stringliteral">"kurt"</span>,<span class="stringliteral">"kurtosis"</span>,<span class="stringliteral">"calculate kurtosis"</span>,<span class="keyword">false</span>);</div>
-<div class="line"><a name="l00105"></a><span class="lineno">  105</span>   <a class="code" href="classOptionpk.html">Optionpk<bool></a> stdev_opt(<span class="stringliteral">"stdev"</span>,<span class="stringliteral">"stdev"</span>,<span class="stringliteral">"calculate standard deviation"</span>,<span class="keyword">false</span>);</div>
-<div class="line"><a name="l00106"></a><span class="lineno">  106</span>   <a class="code" href="classOptionpk.html">Optionpk<bool></a> sum_opt(<span class="stringliteral">"sum"</span>,<span class="stringliteral">"sum"</span>,<span class="stringliteral">"calculate sum of column"</span>,<span class="keyword">false</span>);</div>
-<div class="line"><a name="l00107"></a><span class="lineno">  107</span>   <a class="code" href="classOptionpk.html">Optionpk<bool></a> minmax_opt(<span class="stringliteral">"mm"</span>,<span class="stringliteral">"minmax"</span>,<span class="stringliteral">"calculate minimum and maximum value"</span>,<span class="keyword">false</span>);</div>
-<div class="line"><a name="l00108"></a><span class="lineno">  108</span>   <a class="code" href="classOptionpk.html">Optionpk<bool></a> min_opt(<span class="stringliteral">"min"</span>,<span class="stringliteral">"min"</span>,<span class="stringliteral">"calculate minimum value"</span>,<span class="keyword">false</span>);</div>
-<div class="line"><a name="l00109"></a><span class="lineno">  109</span>   <a class="code" href="classOptionpk.html">Optionpk<bool></a> max_opt(<span class="stringliteral">"max"</span>,<span class="stringliteral">"max"</span>,<span class="stringliteral">"calculate maximum value"</span>,<span class="keyword">false</span>);</div>
-<div class="line"><a name="l00110"></a><span class="lineno">  110</span>   <a class="code" href="classOptionpk.html">Optionpk<double></a> src_min_opt(<span class="stringliteral">"src_min"</span>,<span class="stringliteral">"src_min"</span>,<span class="stringliteral">"start reading source from this minimum value"</span>);</div>
-<div class="line"><a name="l00111"></a><span class="lineno">  111</span>   <a class="code" href="classOptionpk.html">Optionpk<double></a> src_max_opt(<span class="stringliteral">"src_max"</span>,<span class="stringliteral">"src_max"</span>,<span class="stringliteral">"stop reading source from this maximum value"</span>);</div>
-<div class="line"><a name="l00112"></a><span class="lineno">  112</span>   <a class="code" href="classOptionpk.html">Optionpk<bool></a> histogram_opt(<span class="stringliteral">"hist"</span>,<span class="stringliteral">"hist"</span>,<span class="stringliteral">"calculate histogram"</span>,<span class="keyword">false</span>);</div>
-<div class="line"><a name="l00113"></a><span class="lineno">  113</span>   <a class="code" href="classOptionpk.html">Optionpk<bool></a> histogram2d_opt(<span class="stringliteral">"hist2d"</span>,<span class="stringliteral">"hist2d"</span>,<span class="stringliteral">"calculate 2-dimensional histogram based on two images"</span>,<span class="keyword">false</span>);</div>
-<div class="line"><a name="l00114"></a><span class="lineno">  114</span>   <a class="code" href="classOptionpk.html">Optionpk<short></a> nbin_opt(<span class="stringliteral">"nbin"</span>,<span class="stringliteral">"nbin"</span>,<span class="stringliteral">"number of bins to calculate histogram"</span>);</div>
-<div class="line"><a name="l00115"></a><span class="lineno">  115</span>   <a class="code" href="classOptionpk.html">Optionpk<bool></a> relative_opt(<span class="stringliteral">"rel"</span>,<span class="stringliteral">"relative"</span>,<span class="stringliteral">"use percentiles for histogram to calculate histogram"</span>,<span class="keyword">false</span>);</div>
-<div class="line"><a name="l00116"></a><span class="lineno">  116</span>   <a class="code" href="classOptionpk.html">Optionpk<bool></a> kde_opt(<span class="stringliteral">"kde"</span>,<span class="stringliteral">"kde"</span>,<span class="stringliteral">"Use Kernel density estimation when producing histogram. The standard deviation is estimated based on Silverman's rule of thumb"</span>,<span class="keyword">false</span>);</div>
-<div class="line"><a name="l00117"></a><span class="lineno">  117</span>   <a class="code" href="classOptionpk.html">Optionpk<bool></a> correlation_opt(<span class="stringliteral">"cor"</span>,<span class="stringliteral">"correlation"</span>,<span class="stringliteral">"calculate Pearson produc-moment correlation coefficient between two raster datasets (defined by -c <col1> -c <col2>)"</span>,<span class="keyword">false</span>);</div>
+<div class="line"><a name="l00085"></a><span class="lineno">   85</span>   <a class="code" href="classOptionpk.html">Optionpk<bool></a>  stat_opt(<span class="stringliteral">"stats"</span>, <span class="stringliteral">"statistics"</span>, <span class="stringliteral">"Shows basic statistics (calculate in memory) (min,max, mean and stdDev of the raster datasets)"</span>, <span class="keyword">false</span>);</div>
+<div class="line"><a name="l00086"></a><span class="lineno">   86</span>   <a class="code" href="classOptionpk.html">Optionpk<bool></a>  fstat_opt(<span class="stringliteral">"fstats"</span>, <span class="stringliteral">"fstatistics"</span>, <span class="stringliteral">"Shows basic statistics using GDAL computeStatistics  (min,max, mean and stdDev of the raster datasets)"</span>, <span class="keyword">false</span>);</div>
+<div class="line"><a name="l00087"></a><span class="lineno">   87</span>   <a class="code" href="classOptionpk.html">Optionpk<double></a>  ulx_opt(<span class="stringliteral">"ulx"</span>, <span class="stringliteral">"ulx"</span>, <span class="stringliteral">"Upper left x value bounding box"</span>);</div>
+<div class="line"><a name="l00088"></a><span class="lineno">   88</span>   <a class="code" href="classOptionpk.html">Optionpk<double></a>  uly_opt(<span class="stringliteral">"uly"</span>, <span class="stringliteral">"uly"</span>, <span class="stringliteral">"Upper left y value bounding box"</span>);</div>
+<div class="line"><a name="l00089"></a><span class="lineno">   89</span>   <a class="code" href="classOptionpk.html">Optionpk<double></a>  lrx_opt(<span class="stringliteral">"lrx"</span>, <span class="stringliteral">"lrx"</span>, <span class="stringliteral">"Lower right x value bounding box"</span>);</div>
+<div class="line"><a name="l00090"></a><span class="lineno">   90</span>   <a class="code" href="classOptionpk.html">Optionpk<double></a>  lry_opt(<span class="stringliteral">"lry"</span>, <span class="stringliteral">"lry"</span>, <span class="stringliteral">"Lower right y value bounding box"</span>);</div>
+<div class="line"><a name="l00091"></a><span class="lineno">   91</span>   <a class="code" href="classOptionpk.html">Optionpk<double></a> nodata_opt(<span class="stringliteral">"nodata"</span>,<span class="stringliteral">"nodata"</span>,<span class="stringliteral">"Set nodata value(s)"</span>);</div>
+<div class="line"><a name="l00092"></a><span class="lineno">   92</span>   <a class="code" href="classOptionpk.html">Optionpk<short></a> down_opt(<span class="stringliteral">"down"</span>, <span class="stringliteral">"down"</span>, <span class="stringliteral">"Down sampling factor (for raster sample datasets only). Can be used to create grid points"</span>, 1);</div>
+<div class="line"><a name="l00093"></a><span class="lineno">   93</span>   <a class="code" href="classOptionpk.html">Optionpk<unsigned int></a> random_opt(<span class="stringliteral">"rnd"</span>, <span class="stringliteral">"rnd"</span>, <span class="stringliteral">"generate random numbers"</span>, 0);</div>
+<div class="line"><a name="l00094"></a><span class="lineno">   94</span>   <a class="code" href="classOptionpk.html">Optionpk<double></a>  scale_opt(<span class="stringliteral">"scale"</span>, <span class="stringliteral">"scale"</span>, <span class="stringliteral">"Scale(s) for reading input image(s)"</span>);</div>
+<div class="line"><a name="l00095"></a><span class="lineno">   95</span>   <a class="code" href="classOptionpk.html">Optionpk<double></a>  offset_opt(<span class="stringliteral">"offset"</span>, <span class="stringliteral">"offset"</span>, <span class="stringliteral">"Offset(s) for reading input image(s)"</span>);</div>
+<div class="line"><a name="l00096"></a><span class="lineno">   96</span> </div>
+<div class="line"><a name="l00097"></a><span class="lineno">   97</span>   <span class="comment">// Optionpk<bool> transpose_opt("t","transpose","transpose output",false);</span></div>
+<div class="line"><a name="l00098"></a><span class="lineno">   98</span>   <span class="comment">// Optionpk<std::string> randdist_opt("dist", "dist", "distribution for generating random numbers, see http://www.gn/software/gsl/manual/gsl-ref_toc.html#TOC320 (only uniform and Gaussian supported yet)", "gaussian");</span></div>
+<div class="line"><a name="l00099"></a><span class="lineno">   99</span>   <span class="comment">// Optionpk<double> randa_opt("rnda", "rnda", "first parameter for random distribution (mean value in case of Gaussian)", 0);</span></div>
+<div class="line"><a name="l00100"></a><span class="lineno">  100</span>   <span class="comment">// Optionpk<double> randb_opt("rndb", "rndb", "second parameter for random distribution (standard deviation in case of Gaussian)", 1);</span></div>
+<div class="line"><a name="l00101"></a><span class="lineno">  101</span>   <a class="code" href="classOptionpk.html">Optionpk<bool></a> mean_opt(<span class="stringliteral">"mean"</span>,<span class="stringliteral">"mean"</span>,<span class="stringliteral">"calculate mean"</span>,<span class="keyword">false</span>);</div>
+<div class="line"><a name="l00102"></a><span class="lineno">  102</span>   <a class="code" href="classOptionpk.html">Optionpk<bool></a> median_opt(<span class="stringliteral">"median"</span>,<span class="stringliteral">"median"</span>,<span class="stringliteral">"calculate median"</span>,<span class="keyword">false</span>);</div>
+<div class="line"><a name="l00103"></a><span class="lineno">  103</span>   <a class="code" href="classOptionpk.html">Optionpk<bool></a> var_opt(<span class="stringliteral">"var"</span>,<span class="stringliteral">"var"</span>,<span class="stringliteral">"calculate variance"</span>,<span class="keyword">false</span>);</div>
+<div class="line"><a name="l00104"></a><span class="lineno">  104</span>   <a class="code" href="classOptionpk.html">Optionpk<bool></a> skewness_opt(<span class="stringliteral">"skew"</span>,<span class="stringliteral">"skewness"</span>,<span class="stringliteral">"calculate skewness"</span>,<span class="keyword">false</span>);</div>
+<div class="line"><a name="l00105"></a><span class="lineno">  105</span>   <a class="code" href="classOptionpk.html">Optionpk<bool></a> kurtosis_opt(<span class="stringliteral">"kurt"</span>,<span class="stringliteral">"kurtosis"</span>,<span class="stringliteral">"calculate kurtosis"</span>,<span class="keyword">false</span>);</div>
+<div class="line"><a name="l00106"></a><span class="lineno">  106</span>   <a class="code" href="classOptionpk.html">Optionpk<bool></a> stdev_opt(<span class="stringliteral">"stdev"</span>,<span class="stringliteral">"stdev"</span>,<span class="stringliteral">"calculate standard deviation"</span>,<span class="keyword">false</span>);</div>
+<div class="line"><a name="l00107"></a><span class="lineno">  107</span>   <a class="code" href="classOptionpk.html">Optionpk<bool></a> sum_opt(<span class="stringliteral">"sum"</span>,<span class="stringliteral">"sum"</span>,<span class="stringliteral">"calculate sum of column"</span>,<span class="keyword">false</span>);</div>
+<div class="line"><a name="l00108"></a><span class="lineno">  108</span>   <a class="code" href="classOptionpk.html">Optionpk<bool></a> minmax_opt(<span class="stringliteral">"mm"</span>,<span class="stringliteral">"minmax"</span>,<span class="stringliteral">"calculate minimum and maximum value"</span>,<span class="keyword">false</span>);</div>
+<div class="line"><a name="l00109"></a><span class="lineno">  109</span>   <a class="code" href="classOptionpk.html">Optionpk<bool></a> min_opt(<span class="stringliteral">"min"</span>,<span class="stringliteral">"min"</span>,<span class="stringliteral">"calculate minimum value"</span>,<span class="keyword">false</span>);</div>
+<div class="line"><a name="l00110"></a><span class="lineno">  110</span>   <a class="code" href="classOptionpk.html">Optionpk<bool></a> max_opt(<span class="stringliteral">"max"</span>,<span class="stringliteral">"max"</span>,<span class="stringliteral">"calculate maximum value"</span>,<span class="keyword">false</span>);</div>
+<div class="line"><a name="l00111"></a><span class="lineno">  111</span>   <a class="code" href="classOptionpk.html">Optionpk<double></a> src_min_opt(<span class="stringliteral">"src_min"</span>,<span class="stringliteral">"src_min"</span>,<span class="stringliteral">"start reading source from this minimum value"</span>);</div>
+<div class="line"><a name="l00112"></a><span class="lineno">  112</span>   <a class="code" href="classOptionpk.html">Optionpk<double></a> src_max_opt(<span class="stringliteral">"src_max"</span>,<span class="stringliteral">"src_max"</span>,<span class="stringliteral">"stop reading source from this maximum value"</span>);</div>
+<div class="line"><a name="l00113"></a><span class="lineno">  113</span>   <a class="code" href="classOptionpk.html">Optionpk<bool></a> histogram_opt(<span class="stringliteral">"hist"</span>,<span class="stringliteral">"hist"</span>,<span class="stringliteral">"calculate histogram"</span>,<span class="keyword">false</span>);</div>
+<div class="line"><a name="l00114"></a><span class="lineno">  114</span>   <a class="code" href="classOptionpk.html">Optionpk<bool></a> histogram2d_opt(<span class="stringliteral">"hist2d"</span>,<span class="stringliteral">"hist2d"</span>,<span class="stringliteral">"calculate 2-dimensional histogram based on two images"</span>,<span class="keyword">false</span>);</div>
+<div class="line"><a name="l00115"></a><span class="lineno">  115</span>   <a class="code" href="classOptionpk.html">Optionpk<short></a> nbin_opt(<span class="stringliteral">"nbin"</span>,<span class="stringliteral">"nbin"</span>,<span class="stringliteral">"number of bins to calculate histogram"</span>);</div>
+<div class="line"><a name="l00116"></a><span class="lineno">  116</span>   <a class="code" href="classOptionpk.html">Optionpk<bool></a> relative_opt(<span class="stringliteral">"rel"</span>,<span class="stringliteral">"relative"</span>,<span class="stringliteral">"use percentiles for histogram to calculate histogram"</span>,<span class="keyword">false</span>);</div>
+<div class="line"><a name="l00117"></a><span class="lineno">  117</span>   <a class="code" href="classOptionpk.html">Optionpk<bool></a> kde_opt(<span class="stringliteral">"kde"</span>,<span class="stringliteral">"kde"</span>,<span class="stringliteral">"Use Kernel density estimation when producing histogram. The standard deviation is estimated based on Silverman's rule of thumb"</span>,<span class="keyword">false</span>);</div>
 <div class="line"><a name="l00118"></a><span class="lineno">  118</span>   <a class="code" href="classOptionpk.html">Optionpk<bool></a> rmse_opt(<span class="stringliteral">"rmse"</span>,<span class="stringliteral">"rmse"</span>,<span class="stringliteral">"calculate root mean square error between two raster datasets"</span>,<span class="keyword">false</span>);</div>
 <div class="line"><a name="l00119"></a><span class="lineno">  119</span>   <a class="code" href="classOptionpk.html">Optionpk<bool></a> reg_opt(<span class="stringliteral">"reg"</span>,<span class="stringliteral">"regression"</span>,<span class="stringliteral">"calculate linear regression between two raster datasets and get correlation coefficient"</span>,<span class="keyword">false</span>);</div>
 <div class="line"><a name="l00120"></a><span class="lineno">  120</span>   <a class="code" href="classOptionpk.html">Optionpk<bool></a> regerr_opt(<span class="stringliteral">"regerr"</span>,<span class="stringliteral">"regerr"</span>,<span class="stringliteral">"calculate linear regression between two raster datasets and get root mean square error"</span>,<span class="keyword">false</span>);</div>
 <div class="line"><a name="l00121"></a><span class="lineno">  121</span>   <a class="code" href="classOptionpk.html">Optionpk<bool></a> preg_opt(<span class="stringliteral">"preg"</span>,<span class="stringliteral">"preg"</span>,<span class="stringliteral">"calculate perpendicular regression between two raster datasets and get correlation coefficient"</span>,<span class="keyword">false</span>);</div>
 <div class="line"><a name="l00122"></a><span class="lineno">  122</span>   <a class="code" href="classOptionpk.html">Optionpk<short></a> verbose_opt(<span class="stringliteral">"v"</span>, <span class="stringliteral">"verbose"</span>, <span class="stringliteral">"verbose mode when positive"</span>, 0,2);</div>
-<div class="line"><a name="l00123"></a><span class="lineno">  123</span>   ulx_opt.setHide(1);</div>
-<div class="line"><a name="l00124"></a><span class="lineno">  124</span>   uly_opt.setHide(1);</div>
-<div class="line"><a name="l00125"></a><span class="lineno">  125</span>   lrx_opt.setHide(1);</div>
-<div class="line"><a name="l00126"></a><span class="lineno">  126</span>   lry_opt.setHide(1);</div>
-<div class="line"><a name="l00127"></a><span class="lineno">  127</span>   down_opt.setHide(1);</div>
-<div class="line"><a name="l00128"></a><span class="lineno">  128</span>   random_opt.setHide(1);</div>
-<div class="line"><a name="l00129"></a><span class="lineno">  129</span>   scale_opt.setHide(1);</div>
-<div class="line"><a name="l00130"></a><span class="lineno">  130</span>   offset_opt.setHide(1);</div>
-<div class="line"><a name="l00131"></a><span class="lineno">  131</span>   src_min_opt.setHide(1);</div>
-<div class="line"><a name="l00132"></a><span class="lineno">  132</span>   src_max_opt.setHide(1);</div>
-<div class="line"><a name="l00133"></a><span class="lineno">  133</span>   kde_opt.setHide(1);</div>
-<div class="line"><a name="l00134"></a><span class="lineno">  134</span> </div>
-<div class="line"><a name="l00135"></a><span class="lineno">  135</span>   <span class="comment">// range_opt.setHide(1);</span></div>
-<div class="line"><a name="l00136"></a><span class="lineno">  136</span>   <span class="comment">// transpose_opt.setHide(1);</span></div>
-<div class="line"><a name="l00137"></a><span class="lineno">  137</span> </div>
-<div class="line"><a name="l00138"></a><span class="lineno">  138</span>   <span class="keywordtype">bool</span> doProcess;<span class="comment">//stop process when program was invoked with help option (-h --help)</span></div>
-<div class="line"><a name="l00139"></a><span class="lineno">  139</span>   <span class="keywordflow">try</span>{</div>
-<div class="line"><a name="l00140"></a><span class="lineno">  140</span>     <span class="comment">//mandatory options</span></div>
-<div class="line"><a name="l00141"></a><span class="lineno">  141</span>     doProcess=input_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00142"></a><span class="lineno">  142</span>     <span class="comment">//optional options</span></div>
-<div class="line"><a name="l00143"></a><span class="lineno">  143</span>     band_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00144"></a><span class="lineno">  144</span>     filename_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00145"></a><span class="lineno">  145</span>     stat_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00146"></a><span class="lineno">  146</span>     nodata_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00147"></a><span class="lineno">  147</span>     mean_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00148"></a><span class="lineno">  148</span>     median_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00149"></a><span class="lineno">  149</span>     var_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00150"></a><span class="lineno">  150</span>     stdev_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00151"></a><span class="lineno">  151</span>     minmax_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00152"></a><span class="lineno">  152</span>     min_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00153"></a><span class="lineno">  153</span>     max_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00154"></a><span class="lineno">  154</span>     histogram_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00155"></a><span class="lineno">  155</span>     nbin_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00156"></a><span class="lineno">  156</span>     relative_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00157"></a><span class="lineno">  157</span>     histogram2d_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00158"></a><span class="lineno">  158</span>     correlation_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00159"></a><span class="lineno">  159</span>     rmse_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00160"></a><span class="lineno">  160</span>     reg_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00161"></a><span class="lineno">  161</span>     regerr_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00162"></a><span class="lineno">  162</span>     preg_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00163"></a><span class="lineno">  163</span>     <span class="comment">//advanced options</span></div>
-<div class="line"><a name="l00164"></a><span class="lineno">  164</span>     ulx_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00165"></a><span class="lineno">  165</span>     uly_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00166"></a><span class="lineno">  166</span>     lrx_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00167"></a><span class="lineno">  167</span>     lry_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00168"></a><span class="lineno">  168</span>     down_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00169"></a><span class="lineno">  169</span>     random_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00170"></a><span class="lineno">  170</span>     scale_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00171"></a><span class="lineno">  171</span>     offset_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00172"></a><span class="lineno">  172</span>     src_min_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00173"></a><span class="lineno">  173</span>     src_max_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00174"></a><span class="lineno">  174</span>     kde_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00175"></a><span class="lineno">  175</span>     verbose_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00176"></a><span class="lineno">  176</span>   }</div>
-<div class="line"><a name="l00177"></a><span class="lineno">  177</span>   <span class="keywordflow">catch</span>(<span class="keywordtype">string</span> predefinedString){</div>
-<div class="line"><a name="l00178"></a><span class="lineno">  178</span>     std::cout << predefinedString << std::endl;</div>
-<div class="line"><a name="l00179"></a><span class="lineno">  179</span>     exit(0);</div>
-<div class="line"><a name="l00180"></a><span class="lineno">  180</span>   }</div>
-<div class="line"><a name="l00181"></a><span class="lineno">  181</span>   <span class="keywordflow">if</span>(!doProcess){</div>
-<div class="line"><a name="l00182"></a><span class="lineno">  182</span>     cout << endl;</div>
-<div class="line"><a name="l00183"></a><span class="lineno">  183</span>     cout << <span class="stringliteral">"Usage: pkstat -i input"</span> << endl;</div>
-<div class="line"><a name="l00184"></a><span class="lineno">  184</span>     cout << endl;</div>
-<div class="line"><a name="l00185"></a><span class="lineno">  185</span>     std::cout << <span class="stringliteral">"short option -h shows basic options only, use long option --help to show all options"</span> << std::endl;</div>
-<div class="line"><a name="l00186"></a><span class="lineno">  186</span>     exit(0);<span class="comment">//help was invoked, stop processing</span></div>
-<div class="line"><a name="l00187"></a><span class="lineno">  187</span>   }</div>
-<div class="line"><a name="l00188"></a><span class="lineno">  188</span> </div>
-<div class="line"><a name="l00189"></a><span class="lineno">  189</span>   <span class="keywordflow">if</span>(src_min_opt.size()){</div>
-<div class="line"><a name="l00190"></a><span class="lineno">  190</span>     <span class="keywordflow">while</span>(src_min_opt.size()<band_opt.size())</div>
-<div class="line"><a name="l00191"></a><span class="lineno">  191</span>       src_min_opt.push_back(src_min_opt[0]);</div>
-<div class="line"><a name="l00192"></a><span class="lineno">  192</span>   }</div>
-<div class="line"><a name="l00193"></a><span class="lineno">  193</span>   <span class="keywordflow">if</span>(src_max_opt.size()){</div>
-<div class="line"><a name="l00194"></a><span class="lineno">  194</span>     <span class="keywordflow">while</span>(src_max_opt.size()<band_opt.size())</div>
-<div class="line"><a name="l00195"></a><span class="lineno">  195</span>       src_max_opt.push_back(src_max_opt[0]);</div>
-<div class="line"><a name="l00196"></a><span class="lineno">  196</span>   }</div>
-<div class="line"><a name="l00197"></a><span class="lineno">  197</span> </div>
-<div class="line"><a name="l00198"></a><span class="lineno">  198</span>   <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> nbin=0;</div>
-<div class="line"><a name="l00199"></a><span class="lineno">  199</span>   <span class="keywordtype">double</span> minX=0;</div>
-<div class="line"><a name="l00200"></a><span class="lineno">  200</span>   <span class="keywordtype">double</span> minY=0;</div>
-<div class="line"><a name="l00201"></a><span class="lineno">  201</span>   <span class="keywordtype">double</span> maxX=0;</div>
-<div class="line"><a name="l00202"></a><span class="lineno">  202</span>   <span class="keywordtype">double</span> maxY=0;</div>
-<div class="line"><a name="l00203"></a><span class="lineno">  203</span>   <span class="keywordtype">double</span> minValue=0;</div>
-<div class="line"><a name="l00204"></a><span class="lineno">  204</span>   <span class="keywordtype">double</span> maxValue=0;</div>
-<div class="line"><a name="l00205"></a><span class="lineno">  205</span>   <span class="keywordtype">double</span> meanValue=0;</div>
-<div class="line"><a name="l00206"></a><span class="lineno">  206</span>   <span class="keywordtype">double</span> stdDev=0;</div>
-<div class="line"><a name="l00207"></a><span class="lineno">  207</span> </div>
-<div class="line"><a name="l00208"></a><span class="lineno">  208</span>   <span class="keyword">const</span> <span class="keywordtype">char</span>* pszMessage;</div>
-<div class="line"><a name="l00209"></a><span class="lineno">  209</span>   <span class="keywordtype">void</span>* pProgressArg=NULL;</div>
-<div class="line"><a name="l00210"></a><span class="lineno">  210</span>   GDALProgressFunc pfnProgress=GDALTermProgress;</div>
-<div class="line"><a name="l00211"></a><span class="lineno">  211</span>   <span class="keywordtype">double</span> progress=0;</div>
-<div class="line"><a name="l00212"></a><span class="lineno">  212</span>   srand(time(NULL));</div>
-<div class="line"><a name="l00213"></a><span class="lineno">  213</span> </div>
-<div class="line"><a name="l00214"></a><span class="lineno">  214</span>   <a class="code" href="classstatfactory_1_1StatFactory.html">statfactory::StatFactory</a> stat;</div>
-<div class="line"><a name="l00215"></a><span class="lineno">  215</span>   <a class="code" href="classimgregression_1_1ImgRegression.html">imgregression::ImgRegression</a> imgreg;</div>
-<div class="line"><a name="l00216"></a><span class="lineno">  216</span>   std::vector<double> histogramOutput;</div>
-<div class="line"><a name="l00217"></a><span class="lineno">  217</span>   <span class="keywordtype">double</span> nsample=0;</div>
-<div class="line"><a name="l00218"></a><span class="lineno">  218</span> </div>
-<div class="line"><a name="l00219"></a><span class="lineno">  219</span>   <a class="code" href="classImgReaderGdal.html">ImgReaderGdal</a> imgReader;</div>
-<div class="line"><a name="l00220"></a><span class="lineno">  220</span> </div>
-<div class="line"><a name="l00221"></a><span class="lineno">  221</span>   <span class="keywordflow">if</span>(scale_opt.size()){</div>
-<div class="line"><a name="l00222"></a><span class="lineno">  222</span>     <span class="keywordflow">while</span>(scale_opt.size()<input_opt.size())</div>
-<div class="line"><a name="l00223"></a><span class="lineno">  223</span>       scale_opt.push_back(scale_opt[0]);</div>
-<div class="line"><a name="l00224"></a><span class="lineno">  224</span>   }</div>
-<div class="line"><a name="l00225"></a><span class="lineno">  225</span>   <span class="keywordflow">if</span>(offset_opt.size()){</div>
-<div class="line"><a name="l00226"></a><span class="lineno">  226</span>     <span class="keywordflow">while</span>(offset_opt.size()<input_opt.size())</div>
-<div class="line"><a name="l00227"></a><span class="lineno">  227</span>       offset_opt.push_back(offset_opt[0]);</div>
-<div class="line"><a name="l00228"></a><span class="lineno">  228</span>   }</div>
-<div class="line"><a name="l00229"></a><span class="lineno">  229</span>   <span class="keywordflow">if</span>(input_opt.empty()){</div>
-<div class="line"><a name="l00230"></a><span class="lineno">  230</span>     std::cerr << <span class="stringliteral">"No image dataset provided (use option -i). Use --help for help information"</span>;</div>
-<div class="line"><a name="l00231"></a><span class="lineno">  231</span>       exit(0);</div>
-<div class="line"><a name="l00232"></a><span class="lineno">  232</span>   }</div>
-<div class="line"><a name="l00233"></a><span class="lineno">  233</span>   <span class="keywordflow">for</span>(<span class="keywordtype">int</span> ifile=0;ifile<input_opt.size();++ifile){</div>
-<div class="line"><a name="l00234"></a><span class="lineno">  234</span>     <span class="keywordflow">try</span>{</div>
-<div class="line"><a name="l00235"></a><span class="lineno">  235</span>       imgReader.open(input_opt[ifile]);</div>
-<div class="line"><a name="l00236"></a><span class="lineno">  236</span>     }</div>
-<div class="line"><a name="l00237"></a><span class="lineno">  237</span>     <span class="keywordflow">catch</span>(std::string errorstring){</div>
-<div class="line"><a name="l00238"></a><span class="lineno">  238</span>       std::cout << errorstring << std::endl;</div>
-<div class="line"><a name="l00239"></a><span class="lineno">  239</span>       exit(0);</div>
-<div class="line"><a name="l00240"></a><span class="lineno">  240</span>     }</div>
-<div class="line"><a name="l00241"></a><span class="lineno">  241</span> </div>
-<div class="line"><a name="l00242"></a><span class="lineno">  242</span>     <span class="keywordflow">if</span>(filename_opt[0])</div>
-<div class="line"><a name="l00243"></a><span class="lineno">  243</span>       std::cout << <span class="stringliteral">" --input "</span> << input_opt[ifile] << <span class="stringliteral">" "</span>;</div>
-<div class="line"><a name="l00244"></a><span class="lineno">  244</span> </div>
-<div class="line"><a name="l00245"></a><span class="lineno">  245</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> inodata=0;inodata<nodata_opt.size();++inodata)</div>
-<div class="line"><a name="l00246"></a><span class="lineno">  246</span>       imgReader.pushNoDataValue(nodata_opt[inodata]);</div>
-<div class="line"><a name="l00247"></a><span class="lineno">  247</span> </div>
-<div class="line"><a name="l00248"></a><span class="lineno">  248</span>     <span class="keywordtype">int</span> nband=band_opt.size();</div>
-<div class="line"><a name="l00249"></a><span class="lineno">  249</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iband=0;iband<nband;++iband){</div>
-<div class="line"><a name="l00250"></a><span class="lineno">  250</span> </div>
-<div class="line"><a name="l00251"></a><span class="lineno">  251</span>       <span class="keywordflow">for</span>(<span class="keywordtype">int</span> inodata=0;inodata<nodata_opt.size();++inodata){</div>
-<div class="line"><a name="l00252"></a><span class="lineno">  252</span>     <span class="keywordflow">if</span>(!inodata)</div>
-<div class="line"><a name="l00253"></a><span class="lineno">  253</span>       imgReader.GDALSetNoDataValue(nodata_opt[0],iband);<span class="comment">//only single no data can be set in GDALRasterBand (used for ComputeStatistics)</span></div>
-<div class="line"><a name="l00254"></a><span class="lineno">  254</span>       }</div>
-<div class="line"><a name="l00255"></a><span class="lineno">  255</span> </div>
-<div class="line"><a name="l00256"></a><span class="lineno">  256</span>       <span class="keywordflow">if</span>(offset_opt.size()>ifile)</div>
-<div class="line"><a name="l00257"></a><span class="lineno">  257</span>         imgReader.setOffset(offset_opt[ifile],band_opt[iband]);</div>
-<div class="line"><a name="l00258"></a><span class="lineno">  258</span>       <span class="keywordflow">if</span>(scale_opt.size()>ifile)</div>
-<div class="line"><a name="l00259"></a><span class="lineno">  259</span>         imgReader.setScale(scale_opt[ifile],band_opt[iband]);</div>
-<div class="line"><a name="l00260"></a><span class="lineno">  260</span> </div>
-<div class="line"><a name="l00261"></a><span class="lineno">  261</span>       <span class="comment">// if(stat_opt[0]||mean_opt[0]||var_opt[0]||stdev_opt[0]){</span></div>
-<div class="line"><a name="l00262"></a><span class="lineno">  262</span>       <span class="comment">//    assert(band_opt[iband]<imgReader.nrOfBand());</span></div>
-<div class="line"><a name="l00263"></a><span class="lineno">  263</span>     <span class="comment">// GDALProgressFunc pfnProgress;</span></div>
-<div class="line"><a name="l00264"></a><span class="lineno">  264</span>     <span class="comment">// void* pProgressData;</span></div>
-<div class="line"><a name="l00265"></a><span class="lineno">  265</span>     <span class="comment">// GDALRasterBand* rasterBand;</span></div>
-<div class="line"><a name="l00266"></a><span class="lineno">  266</span>       <span class="comment">//    rasterBand=imgReader.getRasterBand(band_opt[iband]);</span></div>
-<div class="line"><a name="l00267"></a><span class="lineno">  267</span>       <span class="comment">//    rasterBand->ComputeStatistics(0,&minValue,&maxValue,&meanValue,&stdDev,pfnProgress,pProgressData);</span></div>
-<div class="line"><a name="l00268"></a><span class="lineno">  268</span> </div>
-<div class="line"><a name="l00269"></a><span class="lineno">  269</span>       <span class="comment">//    if(mean_opt[0])</span></div>
-<div class="line"><a name="l00270"></a><span class="lineno">  270</span>       <span class="comment">//      std::cout << "--mean " << meanValue << " ";</span></div>
-<div class="line"><a name="l00271"></a><span class="lineno">  271</span>       <span class="comment">//    if(stdev_opt[0])</span></div>
-<div class="line"><a name="l00272"></a><span class="lineno">  272</span>       <span class="comment">//      std::cout << "--stdDev " << stdDev << " ";</span></div>
-<div class="line"><a name="l00273"></a><span class="lineno">  273</span>       <span class="comment">//    if(var_opt[0])</span></div>
-<div class="line"><a name="l00274"></a><span class="lineno">  274</span>       <span class="comment">//      std::cout << "--var " << stdDev*stdDev << " ";</span></div>
-<div class="line"><a name="l00275"></a><span class="lineno">  275</span>       <span class="comment">//    if(stat_opt[0])</span></div>
-<div class="line"><a name="l00276"></a><span class="lineno">  276</span>       <span class="comment">//      std::cout << "-min " << minValue << " -max " << maxValue << " --mean " << meanValue << " --stdDev " << stdDev << " ";</span></div>
-<div class="line"><a name="l00277"></a><span class="lineno">  277</span>       <span class="comment">// }</span></div>
-<div class="line"><a name="l00278"></a><span class="lineno">  278</span> </div>
-<div class="line"><a name="l00279"></a><span class="lineno">  279</span>       <span class="keywordflow">if</span>(minmax_opt[0]||min_opt[0]||max_opt[0]){</div>
-<div class="line"><a name="l00280"></a><span class="lineno">  280</span>     assert(band_opt[iband]<imgReader.nrOfBand());</div>
-<div class="line"><a name="l00281"></a><span class="lineno">  281</span> </div>
-<div class="line"><a name="l00282"></a><span class="lineno">  282</span>     <span class="keywordflow">if</span>((ulx_opt.size()||uly_opt.size()||lrx_opt.size()||lry_opt.size())&&(imgReader.covers(ulx_opt[0],uly_opt[0],lrx_opt[0],lry_opt[0]))){</div>
-<div class="line"><a name="l00283"></a><span class="lineno">  283</span>       <span class="keywordtype">double</span> uli,ulj,lri,lrj;</div>
-<div class="line"><a name="l00284"></a><span class="lineno">  284</span>       imgReader.geo2image(ulx_opt[0],uly_opt[0],uli,ulj);</div>
-<div class="line"><a name="l00285"></a><span class="lineno">  285</span>       imgReader.geo2image(lrx_opt[0],lry_opt[0],lri,lrj);</div>
-<div class="line"><a name="l00286"></a><span class="lineno">  286</span>       imgReader.getMinMax(static_cast<int>(uli),static_cast<int>(lri),static_cast<int>(ulj),static_cast<int>(lrj),band_opt[iband],minValue,maxValue);</div>
-<div class="line"><a name="l00287"></a><span class="lineno">  287</span>     }</div>
-<div class="line"><a name="l00288"></a><span class="lineno">  288</span>     <span class="keywordflow">else</span>{</div>
-<div class="line"><a name="l00289"></a><span class="lineno">  289</span>       imgReader.getMinMax(minValue,maxValue,band_opt[iband],<span class="keyword">true</span>);</div>
-<div class="line"><a name="l00290"></a><span class="lineno">  290</span>     }</div>
-<div class="line"><a name="l00291"></a><span class="lineno">  291</span>     <span class="keywordflow">if</span>(minmax_opt[0])</div>
-<div class="line"><a name="l00292"></a><span class="lineno">  292</span>       std::cout << <span class="stringliteral">"-min "</span> << minValue << <span class="stringliteral">" -max "</span> << maxValue << <span class="stringliteral">" "</span>;</div>
-<div class="line"><a name="l00293"></a><span class="lineno">  293</span>     <span class="keywordflow">else</span>{</div>
-<div class="line"><a name="l00294"></a><span class="lineno">  294</span>       <span class="keywordflow">if</span>(min_opt[0])</div>
-<div class="line"><a name="l00295"></a><span class="lineno">  295</span>         std::cout << <span class="stringliteral">"-min "</span> << minValue << <span class="stringliteral">" "</span>;</div>
-<div class="line"><a name="l00296"></a><span class="lineno">  296</span>       <span class="keywordflow">if</span>(max_opt[0])</div>
-<div class="line"><a name="l00297"></a><span class="lineno">  297</span>         std::cout << <span class="stringliteral">"-max "</span> << maxValue << <span class="stringliteral">" "</span>;</div>
-<div class="line"><a name="l00298"></a><span class="lineno">  298</span>     }</div>
-<div class="line"><a name="l00299"></a><span class="lineno">  299</span>       }</div>
-<div class="line"><a name="l00300"></a><span class="lineno">  300</span>     }</div>
-<div class="line"><a name="l00301"></a><span class="lineno">  301</span>     <span class="keywordflow">if</span>(histogram_opt[0]){<span class="comment">//aggregate results from multiple inputs, but only calculate for first selected band</span></div>
-<div class="line"><a name="l00302"></a><span class="lineno">  302</span>       assert(band_opt[0]<imgReader.nrOfBand());</div>
-<div class="line"><a name="l00303"></a><span class="lineno">  303</span>       nbin=(nbin_opt.size())? nbin_opt[0]:0;</div>
-<div class="line"><a name="l00304"></a><span class="lineno">  304</span>       </div>
-<div class="line"><a name="l00305"></a><span class="lineno">  305</span>       imgReader.getMinMax(minValue,maxValue,band_opt[0]);</div>
-<div class="line"><a name="l00306"></a><span class="lineno">  306</span>       <span class="keywordflow">if</span>(src_min_opt.size())</div>
-<div class="line"><a name="l00307"></a><span class="lineno">  307</span>         minValue=src_min_opt[0];</div>
-<div class="line"><a name="l00308"></a><span class="lineno">  308</span>       <span class="keywordflow">if</span>(src_max_opt.size())</div>
-<div class="line"><a name="l00309"></a><span class="lineno">  309</span>         maxValue=src_max_opt[0];</div>
-<div class="line"><a name="l00310"></a><span class="lineno">  310</span>       <span class="keywordflow">if</span>(minValue>=maxValue)</div>
-<div class="line"><a name="l00311"></a><span class="lineno">  311</span>     imgReader.getMinMax(minValue,maxValue,band_opt[0]);</div>
-<div class="line"><a name="l00312"></a><span class="lineno">  312</span> </div>
-<div class="line"><a name="l00313"></a><span class="lineno">  313</span>       <span class="keywordflow">if</span>(verbose_opt[0])</div>
-<div class="line"><a name="l00314"></a><span class="lineno">  314</span>     cout << <span class="stringliteral">"number of valid pixels in image: "</span> << imgReader.getNvalid(band_opt[0]) << endl;</div>
-<div class="line"><a name="l00315"></a><span class="lineno">  315</span> </div>
-<div class="line"><a name="l00316"></a><span class="lineno">  316</span>       nsample+=imgReader.getHistogram(histogramOutput,minValue,maxValue,nbin,band_opt[0],kde_opt[0]);</div>
-<div class="line"><a name="l00317"></a><span class="lineno">  317</span> </div>
-<div class="line"><a name="l00318"></a><span class="lineno">  318</span>       <span class="comment">//only output for last input file</span></div>
-<div class="line"><a name="l00319"></a><span class="lineno">  319</span>       <span class="keywordflow">if</span>(ifile==input_opt.size()-1){</div>
-<div class="line"><a name="l00320"></a><span class="lineno">  320</span>     std::cout.precision(10);</div>
-<div class="line"><a name="l00321"></a><span class="lineno">  321</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> bin=0;bin<nbin;++bin){</div>
-<div class="line"><a name="l00322"></a><span class="lineno">  322</span>       <span class="keywordtype">double</span> binValue=0;</div>
-<div class="line"><a name="l00323"></a><span class="lineno">  323</span>       <span class="keywordflow">if</span>(nbin==maxValue-minValue+1)</div>
-<div class="line"><a name="l00324"></a><span class="lineno">  324</span>         binValue=minValue+bin;</div>
-<div class="line"><a name="l00325"></a><span class="lineno">  325</span>       <span class="keywordflow">else</span></div>
-<div class="line"><a name="l00326"></a><span class="lineno">  326</span>         binValue=minValue+<span class="keyword">static_cast<</span><span class="keywordtype">double</span><span class="keyword">></span>(maxValue-minValue)*(bin+0.5)/nbin;</div>
-<div class="line"><a name="l00327"></a><span class="lineno">  327</span>       std::cout << binValue << <span class="stringliteral">" "</span>;</div>
-<div class="line"><a name="l00328"></a><span class="lineno">  328</span>       <span class="keywordflow">if</span>(relative_opt[0]||kde_opt[0])</div>
-<div class="line"><a name="l00329"></a><span class="lineno">  329</span>         std::cout << 100.0*<span class="keyword">static_cast<</span><span class="keywordtype">double</span><span class="keyword">></span>(histogramOutput[bin])/static_cast<double>(nsample) << std::endl;</div>
-<div class="line"><a name="l00330"></a><span class="lineno">  330</span>       <span class="keywordflow">else</span></div>
-<div class="line"><a name="l00331"></a><span class="lineno">  331</span>         std::cout << static_cast<double>(histogramOutput[bin]) << std::endl;</div>
-<div class="line"><a name="l00332"></a><span class="lineno">  332</span>     }</div>
-<div class="line"><a name="l00333"></a><span class="lineno">  333</span>       }</div>
-<div class="line"><a name="l00334"></a><span class="lineno">  334</span>     }</div>
-<div class="line"><a name="l00335"></a><span class="lineno">  335</span>     <span class="keywordflow">if</span>(histogram2d_opt[0]&&input_opt.size()<2){</div>
-<div class="line"><a name="l00336"></a><span class="lineno">  336</span>       assert(band_opt.size()>1);</div>
-<div class="line"><a name="l00337"></a><span class="lineno">  337</span>       imgReader.getMinMax(minX,maxX,band_opt[0]);</div>
-<div class="line"><a name="l00338"></a><span class="lineno">  338</span>       imgReader.getMinMax(minY,maxY,band_opt[1]);</div>
-<div class="line"><a name="l00339"></a><span class="lineno">  339</span>       <span class="keywordflow">if</span>(src_min_opt.size()){</div>
-<div class="line"><a name="l00340"></a><span class="lineno">  340</span>     minX=src_min_opt[0];</div>
-<div class="line"><a name="l00341"></a><span class="lineno">  341</span>     minY=src_min_opt[1];</div>
-<div class="line"><a name="l00342"></a><span class="lineno">  342</span>       }</div>
-<div class="line"><a name="l00343"></a><span class="lineno">  343</span>       <span class="keywordflow">if</span>(src_max_opt.size()){</div>
-<div class="line"><a name="l00344"></a><span class="lineno">  344</span>     maxX=src_max_opt[0];</div>
-<div class="line"><a name="l00345"></a><span class="lineno">  345</span>     maxY=src_max_opt[1];</div>
-<div class="line"><a name="l00346"></a><span class="lineno">  346</span>       }</div>
-<div class="line"><a name="l00347"></a><span class="lineno">  347</span>       nbin=(nbin_opt.size())? nbin_opt[0]:0;</div>
-<div class="line"><a name="l00348"></a><span class="lineno">  348</span>       <span class="keywordflow">if</span>(nbin<=1){</div>
-<div class="line"><a name="l00349"></a><span class="lineno">  349</span>     std::cerr << <span class="stringliteral">"Warning: number of bins not defined, calculating bins from min and max value"</span> << std::endl;</div>
-<div class="line"><a name="l00350"></a><span class="lineno">  350</span>     <span class="keywordflow">if</span>(minX>=maxX)</div>
-<div class="line"><a name="l00351"></a><span class="lineno">  351</span>       imgReader.getMinMax(minX,maxX,band_opt[0]);</div>
-<div class="line"><a name="l00352"></a><span class="lineno">  352</span>     <span class="keywordflow">if</span>(minY>=maxY)</div>
-<div class="line"><a name="l00353"></a><span class="lineno">  353</span>       imgReader.getMinMax(minY,maxY,band_opt[1]);</div>
-<div class="line"><a name="l00354"></a><span class="lineno">  354</span> </div>
-<div class="line"><a name="l00355"></a><span class="lineno">  355</span>     minValue=(minX<minY)? minX:minY;</div>
-<div class="line"><a name="l00356"></a><span class="lineno">  356</span>     maxValue=(maxX>maxY)? maxX:maxY;</div>
-<div class="line"><a name="l00357"></a><span class="lineno">  357</span>     <span class="keywordflow">if</span>(verbose_opt[0])</div>
-<div class="line"><a name="l00358"></a><span class="lineno">  358</span>       std::cout << <span class="stringliteral">"min and max values: "</span> << minValue << <span class="stringliteral">", "</span> << maxValue << std::endl;</div>
-<div class="line"><a name="l00359"></a><span class="lineno">  359</span>     nbin=maxValue-minValue+1;</div>
-<div class="line"><a name="l00360"></a><span class="lineno">  360</span>       }</div>
-<div class="line"><a name="l00361"></a><span class="lineno">  361</span>       assert(nbin>1);</div>
-<div class="line"><a name="l00362"></a><span class="lineno">  362</span>       <span class="keywordtype">double</span> sigma=0;</div>
-<div class="line"><a name="l00363"></a><span class="lineno">  363</span>       <span class="comment">//kernel density estimation as in http://en.wikipedia.org/wiki/Kernel_density_estimation</span></div>
-<div class="line"><a name="l00364"></a><span class="lineno">  364</span>       <span class="keywordflow">if</span>(kde_opt[0]){</div>
-<div class="line"><a name="l00365"></a><span class="lineno">  365</span>     assert(band_opt[0]<imgReader.nrOfBand());</div>
-<div class="line"><a name="l00366"></a><span class="lineno">  366</span>     assert(band_opt[1]<imgReader.nrOfBand());</div>
-<div class="line"><a name="l00367"></a><span class="lineno">  367</span>     GDALProgressFunc pfnProgress;</div>
-<div class="line"><a name="l00368"></a><span class="lineno">  368</span>     <span class="keywordtype">void</span>* pProgressData;</div>
-<div class="line"><a name="l00369"></a><span class="lineno">  369</span>     GDALRasterBand* rasterBand;</div>
-<div class="line"><a name="l00370"></a><span class="lineno">  370</span>     <span class="keywordtype">double</span> stdDev1=0;</div>
-<div class="line"><a name="l00371"></a><span class="lineno">  371</span>     <span class="keywordtype">double</span> stdDev2=0;</div>
-<div class="line"><a name="l00372"></a><span class="lineno">  372</span>     rasterBand=imgReader.getRasterBand(band_opt[0]);</div>
-<div class="line"><a name="l00373"></a><span class="lineno">  373</span>     rasterBand->ComputeStatistics(0,&minValue,&maxValue,&meanValue,&stdDev1,pfnProgress,pProgressData);</div>
-<div class="line"><a name="l00374"></a><span class="lineno">  374</span>     rasterBand=imgReader.getRasterBand(band_opt[1]);</div>
-<div class="line"><a name="l00375"></a><span class="lineno">  375</span>     rasterBand->ComputeStatistics(0,&minValue,&maxValue,&meanValue,&stdDev2,pfnProgress,pProgressData);</div>
-<div class="line"><a name="l00376"></a><span class="lineno">  376</span> </div>
-<div class="line"><a name="l00377"></a><span class="lineno">  377</span>     <span class="keywordtype">double</span> estimatedSize=1.0*imgReader.getNvalid(band_opt[0])/down_opt[0]/down_opt[0];</div>
-<div class="line"><a name="l00378"></a><span class="lineno">  378</span>     <span class="keywordflow">if</span>(random_opt[0]>0)</div>
-<div class="line"><a name="l00379"></a><span class="lineno">  379</span>       estimatedSize*=random_opt[0]/100.0;</div>
-<div class="line"><a name="l00380"></a><span class="lineno">  380</span>         sigma=1.06*sqrt(stdDev1*stdDev2)*pow(estimatedSize,-0.2);</div>
-<div class="line"><a name="l00381"></a><span class="lineno">  381</span>       }</div>
-<div class="line"><a name="l00382"></a><span class="lineno">  382</span>       assert(nbin);</div>
-<div class="line"><a name="l00383"></a><span class="lineno">  383</span>       <span class="keywordflow">if</span>(verbose_opt[0]){</div>
-<div class="line"><a name="l00384"></a><span class="lineno">  384</span>     <span class="keywordflow">if</span>(sigma>0)</div>
-<div class="line"><a name="l00385"></a><span class="lineno">  385</span>       std::cout << <span class="stringliteral">"calculating 2d kernel density estimate with sigma "</span> << sigma << <span class="stringliteral">" for bands "</span> << band_opt[0] << <span class="stringliteral">" and "</span> << band_opt[1] << std::endl;</div>
-<div class="line"><a name="l00386"></a><span class="lineno">  386</span>     <span class="keywordflow">else</span></div>
-<div class="line"><a name="l00387"></a><span class="lineno">  387</span>       std::cout << <span class="stringliteral">"calculating 2d histogram for bands "</span> << band_opt[0] << <span class="stringliteral">" and "</span> << band_opt[1] << std::endl;</div>
-<div class="line"><a name="l00388"></a><span class="lineno">  388</span>     std::cout << <span class="stringliteral">"nbin: "</span> << nbin << std::endl;</div>
-<div class="line"><a name="l00389"></a><span class="lineno">  389</span>       }</div>
-<div class="line"><a name="l00390"></a><span class="lineno">  390</span> </div>
-<div class="line"><a name="l00391"></a><span class="lineno">  391</span> </div>
-<div class="line"><a name="l00392"></a><span class="lineno">  392</span>       vector< vector<double> > output;</div>
-<div class="line"><a name="l00393"></a><span class="lineno">  393</span> </div>
-<div class="line"><a name="l00394"></a><span class="lineno">  394</span>       <span class="keywordflow">if</span>(maxX<=minX)</div>
-<div class="line"><a name="l00395"></a><span class="lineno">  395</span>     imgReader.getMinMax(minX,maxX,band_opt[0]);</div>
-<div class="line"><a name="l00396"></a><span class="lineno">  396</span>       <span class="keywordflow">if</span>(maxY<=minY)</div>
-<div class="line"><a name="l00397"></a><span class="lineno">  397</span>     imgReader.getMinMax(minY,maxY,band_opt[1]);</div>
-<div class="line"><a name="l00398"></a><span class="lineno">  398</span> </div>
-<div class="line"><a name="l00399"></a><span class="lineno">  399</span>       <span class="keywordflow">if</span>(maxX<=minX){</div>
-<div class="line"><a name="l00400"></a><span class="lineno">  400</span>     std::ostringstream s;</div>
-<div class="line"><a name="l00401"></a><span class="lineno">  401</span>     s<<<span class="stringliteral">"Error: could not calculate distribution (minX>=maxX)"</span>;</div>
-<div class="line"><a name="l00402"></a><span class="lineno">  402</span>     <span class="keywordflow">throw</span>(s.str());</div>
-<div class="line"><a name="l00403"></a><span class="lineno">  403</span>       }</div>
-<div class="line"><a name="l00404"></a><span class="lineno">  404</span>       <span class="keywordflow">if</span>(maxY<=minY){</div>
-<div class="line"><a name="l00405"></a><span class="lineno">  405</span>     std::ostringstream s;</div>
-<div class="line"><a name="l00406"></a><span class="lineno">  406</span>     s<<<span class="stringliteral">"Error: could not calculate distribution (minY>=maxY)"</span>;</div>
-<div class="line"><a name="l00407"></a><span class="lineno">  407</span>     <span class="keywordflow">throw</span>(s.str());</div>
-<div class="line"><a name="l00408"></a><span class="lineno">  408</span>       }</div>
-<div class="line"><a name="l00409"></a><span class="lineno">  409</span>       output.resize(nbin);</div>
-<div class="line"><a name="l00410"></a><span class="lineno">  410</span>       <span class="keywordflow">for</span>(<span class="keywordtype">int</span> i=0;i<nbin;++i){</div>
-<div class="line"><a name="l00411"></a><span class="lineno">  411</span>     output[i].resize(nbin);</div>
-<div class="line"><a name="l00412"></a><span class="lineno">  412</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> j=0;j<nbin;++j)</div>
-<div class="line"><a name="l00413"></a><span class="lineno">  413</span>       output[i][j]=0;</div>
-<div class="line"><a name="l00414"></a><span class="lineno">  414</span>       }</div>
-<div class="line"><a name="l00415"></a><span class="lineno">  415</span>       <span class="keywordtype">int</span> binX=0;</div>
-<div class="line"><a name="l00416"></a><span class="lineno">  416</span>       <span class="keywordtype">int</span> binY=0;</div>
-<div class="line"><a name="l00417"></a><span class="lineno">  417</span>       vector<double> inputX(imgReader.nrOfCol());</div>
-<div class="line"><a name="l00418"></a><span class="lineno">  418</span>       vector<double> inputY(imgReader.nrOfCol());</div>
-<div class="line"><a name="l00419"></a><span class="lineno">  419</span>       <span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> nvalid=0;</div>
-<div class="line"><a name="l00420"></a><span class="lineno">  420</span>       <span class="keywordflow">for</span>(<span class="keywordtype">int</span> irow=0;irow<imgReader.nrOfRow();++irow){</div>
-<div class="line"><a name="l00421"></a><span class="lineno">  421</span>         <span class="keywordflow">if</span>(irow%down_opt[0])</div>
-<div class="line"><a name="l00422"></a><span class="lineno">  422</span>           <span class="keywordflow">continue</span>;</div>
-<div class="line"><a name="l00423"></a><span class="lineno">  423</span>     imgReader.readData(inputX,GDT_Float64,irow,band_opt[0]);</div>
-<div class="line"><a name="l00424"></a><span class="lineno">  424</span>     imgReader.readData(inputY,GDT_Float64,irow,band_opt[1]);</div>
-<div class="line"><a name="l00425"></a><span class="lineno">  425</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> icol=0;icol<imgReader.nrOfCol();++icol){</div>
-<div class="line"><a name="l00426"></a><span class="lineno">  426</span>           <span class="keywordflow">if</span>(icol%down_opt[0])</div>
-<div class="line"><a name="l00427"></a><span class="lineno">  427</span>             <span class="keywordflow">continue</span>;</div>
-<div class="line"><a name="l00428"></a><span class="lineno">  428</span>       <span class="keywordflow">if</span>(random_opt[0]>0){</div>
-<div class="line"><a name="l00429"></a><span class="lineno">  429</span>         <span class="keywordtype">double</span> p=<span class="keyword">static_cast<</span><span class="keywordtype">double</span><span class="keyword">></span>(rand())/(RAND_MAX);</div>
-<div class="line"><a name="l00430"></a><span class="lineno">  430</span>         p*=100.0;</div>
-<div class="line"><a name="l00431"></a><span class="lineno">  431</span>         <span class="keywordflow">if</span>(p>random_opt[0])</div>
-<div class="line"><a name="l00432"></a><span class="lineno">  432</span>           <span class="keywordflow">continue</span>;<span class="comment">//do not select for now, go to next column</span></div>
-<div class="line"><a name="l00433"></a><span class="lineno">  433</span>       }</div>
-<div class="line"><a name="l00434"></a><span class="lineno">  434</span>       <span class="keywordflow">if</span>(imgReader.isNoData(inputX[icol]))</div>
-<div class="line"><a name="l00435"></a><span class="lineno">  435</span>         <span class="keywordflow">continue</span>;</div>
-<div class="line"><a name="l00436"></a><span class="lineno">  436</span>       <span class="keywordflow">if</span>(imgReader.isNoData(inputY[icol]))</div>
-<div class="line"><a name="l00437"></a><span class="lineno">  437</span>         <span class="keywordflow">continue</span>;</div>
-<div class="line"><a name="l00438"></a><span class="lineno">  438</span>       ++nvalid;</div>
-<div class="line"><a name="l00439"></a><span class="lineno">  439</span>       <span class="keywordflow">if</span>(inputX[icol]>=maxX)</div>
-<div class="line"><a name="l00440"></a><span class="lineno">  440</span>         binX=nbin-1;</div>
-<div class="line"><a name="l00441"></a><span class="lineno">  441</span>       <span class="keywordflow">else</span> <span class="keywordflow">if</span>(inputX[icol]<=minX)</div>
-<div class="line"><a name="l00442"></a><span class="lineno">  442</span>         binX=0;</div>
-<div class="line"><a name="l00443"></a><span class="lineno">  443</span>       <span class="keywordflow">else</span></div>
-<div class="line"><a name="l00444"></a><span class="lineno">  444</span>         binX=<span class="keyword">static_cast<</span><span class="keywordtype">int</span><span class="keyword">></span>(<span class="keyword">static_cast<</span><span class="keywordtype">double</span><span class="keyword">></span>(inputX[icol]-minX)/(maxX-minX)*nbin);</div>
-<div class="line"><a name="l00445"></a><span class="lineno">  445</span>       <span class="keywordflow">if</span>(inputY[icol]>=maxY)</div>
-<div class="line"><a name="l00446"></a><span class="lineno">  446</span>         binY=nbin-1;</div>
-<div class="line"><a name="l00447"></a><span class="lineno">  447</span>       <span class="keywordflow">else</span> <span class="keywordflow">if</span>(inputY[icol]<=minX)</div>
-<div class="line"><a name="l00448"></a><span class="lineno">  448</span>         binY=0;</div>
-<div class="line"><a name="l00449"></a><span class="lineno">  449</span>       <span class="keywordflow">else</span></div>
-<div class="line"><a name="l00450"></a><span class="lineno">  450</span>         binY=<span class="keyword">static_cast<</span><span class="keywordtype">int</span><span class="keyword">></span>(<span class="keyword">static_cast<</span><span class="keywordtype">double</span><span class="keyword">></span>(inputY[icol]-minY)/(maxY-minY)*nbin);</div>
-<div class="line"><a name="l00451"></a><span class="lineno">  451</span>       assert(binX>=0);</div>
-<div class="line"><a name="l00452"></a><span class="lineno">  452</span>       assert(binX<output.size());</div>
-<div class="line"><a name="l00453"></a><span class="lineno">  453</span>       assert(binY>=0);</div>
-<div class="line"><a name="l00454"></a><span class="lineno">  454</span>       assert(binY<output[binX].size());</div>
-<div class="line"><a name="l00455"></a><span class="lineno">  455</span>       <span class="keywordflow">if</span>(sigma>0){</div>
-<div class="line"><a name="l00456"></a><span class="lineno">  456</span>         <span class="comment">//create kde for Gaussian basis function</span></div>
-<div class="line"><a name="l00457"></a><span class="lineno">  457</span>         <span class="comment">//todo: speed up by calculating first and last bin with non-zero contriubtion...</span></div>
-<div class="line"><a name="l00458"></a><span class="lineno">  458</span>         <span class="keywordflow">for</span>(<span class="keywordtype">int</span> ibinX=0;ibinX<nbin;++ibinX){</div>
-<div class="line"><a name="l00459"></a><span class="lineno">  459</span>           <span class="keywordtype">double</span> centerX=minX+<span class="keyword">static_cast<</span><span class="keywordtype">double</span><span class="keyword">></span>(maxX-minX)*ibinX/nbin;</div>
-<div class="line"><a name="l00460"></a><span class="lineno">  460</span>           <span class="keywordtype">double</span> pdfX=gsl_ran_gaussian_pdf(inputX[icol]-centerX, sigma);</div>
-<div class="line"><a name="l00461"></a><span class="lineno">  461</span>           <span class="keywordflow">for</span>(<span class="keywordtype">int</span> ibinY=0;ibinY<nbin;++ibinY){</div>
-<div class="line"><a name="l00462"></a><span class="lineno">  462</span>         <span class="comment">//calculate  \integral_ibinX^(ibinX+1)</span></div>
-<div class="line"><a name="l00463"></a><span class="lineno">  463</span>         <span class="keywordtype">double</span> centerY=minY+<span class="keyword">static_cast<</span><span class="keywordtype">double</span><span class="keyword">></span>(maxY-minY)*ibinY/nbin;</div>
-<div class="line"><a name="l00464"></a><span class="lineno">  464</span>         <span class="keywordtype">double</span> pdfY=gsl_ran_gaussian_pdf(inputY[icol]-centerY, sigma);</div>
-<div class="line"><a name="l00465"></a><span class="lineno">  465</span>         output[ibinX][binY]+=pdfX*pdfY;</div>
-<div class="line"><a name="l00466"></a><span class="lineno">  466</span>           }</div>
-<div class="line"><a name="l00467"></a><span class="lineno">  467</span>         }</div>
-<div class="line"><a name="l00468"></a><span class="lineno">  468</span>       }</div>
-<div class="line"><a name="l00469"></a><span class="lineno">  469</span>       <span class="keywordflow">else</span></div>
-<div class="line"><a name="l00470"></a><span class="lineno">  470</span>         ++output[binX][binY];</div>
-<div class="line"><a name="l00471"></a><span class="lineno">  471</span>     }</div>
-<div class="line"><a name="l00472"></a><span class="lineno">  472</span>       }</div>
-<div class="line"><a name="l00473"></a><span class="lineno">  473</span>       <span class="keywordflow">if</span>(verbose_opt[0])</div>
-<div class="line"><a name="l00474"></a><span class="lineno">  474</span>     cout << <span class="stringliteral">"number of valid pixels: "</span> << nvalid << endl;</div>
-<div class="line"><a name="l00475"></a><span class="lineno">  475</span> </div>
-<div class="line"><a name="l00476"></a><span class="lineno">  476</span>       <span class="keywordflow">for</span>(<span class="keywordtype">int</span> binX=0;binX<nbin;++binX){</div>
-<div class="line"><a name="l00477"></a><span class="lineno">  477</span>     cout << endl;</div>
-<div class="line"><a name="l00478"></a><span class="lineno">  478</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> binY=0;binY<nbin;++binY){</div>
-<div class="line"><a name="l00479"></a><span class="lineno">  479</span>       <span class="keywordtype">double</span> binValueX=0;</div>
-<div class="line"><a name="l00480"></a><span class="lineno">  480</span>       <span class="keywordflow">if</span>(nbin==maxX-minX+1)</div>
-<div class="line"><a name="l00481"></a><span class="lineno">  481</span>         binValueX=minX+binX;</div>
-<div class="line"><a name="l00482"></a><span class="lineno">  482</span>       <span class="keywordflow">else</span></div>
-<div class="line"><a name="l00483"></a><span class="lineno">  483</span>         binValueX=minX+<span class="keyword">static_cast<</span><span class="keywordtype">double</span><span class="keyword">></span>(maxX-minX)*(binX+0.5)/nbin;</div>
-<div class="line"><a name="l00484"></a><span class="lineno">  484</span>       <span class="keywordtype">double</span> binValueY=0;</div>
-<div class="line"><a name="l00485"></a><span class="lineno">  485</span>       <span class="keywordflow">if</span>(nbin==maxY-minY+1)</div>
-<div class="line"><a name="l00486"></a><span class="lineno">  486</span>         binValueY=minY+binY;</div>
-<div class="line"><a name="l00487"></a><span class="lineno">  487</span>       <span class="keywordflow">else</span></div>
-<div class="line"><a name="l00488"></a><span class="lineno">  488</span>         binValueY=minY+<span class="keyword">static_cast<</span><span class="keywordtype">double</span><span class="keyword">></span>(maxY-minY)*(binY+0.5)/nbin;</div>
-<div class="line"><a name="l00489"></a><span class="lineno">  489</span> </div>
-<div class="line"><a name="l00490"></a><span class="lineno">  490</span>       <span class="keywordtype">double</span> value=<span class="keyword">static_cast<</span><span class="keywordtype">double</span><span class="keyword">></span>(output[binX][binY]);</div>
-<div class="line"><a name="l00491"></a><span class="lineno">  491</span>       </div>
-<div class="line"><a name="l00492"></a><span class="lineno">  492</span>       <span class="keywordflow">if</span>(relative_opt[0])</div>
-<div class="line"><a name="l00493"></a><span class="lineno">  493</span>         value*=100.0/nvalid;</div>
-<div class="line"><a name="l00494"></a><span class="lineno">  494</span> </div>
-<div class="line"><a name="l00495"></a><span class="lineno">  495</span>       cout << binValueX << <span class="stringliteral">" "</span> << binValueY << <span class="stringliteral">" "</span> << value << std::endl;</div>
-<div class="line"><a name="l00496"></a><span class="lineno">  496</span>       <span class="comment">// double value=static_cast<double>(output[binX][binY])/nvalid;</span></div>
-<div class="line"><a name="l00497"></a><span class="lineno">  497</span>       <span class="comment">// cout << (maxX-minX)*bin/(nbin-1)+minX << " " << (maxY-minY)*bin/(nbin-1)+minY << " " << value << std::endl;</span></div>
-<div class="line"><a name="l00498"></a><span class="lineno">  498</span>     }</div>
-<div class="line"><a name="l00499"></a><span class="lineno">  499</span>       }</div>
-<div class="line"><a name="l00500"></a><span class="lineno">  500</span>     }</div>
-<div class="line"><a name="l00501"></a><span class="lineno">  501</span>     <span class="keywordflow">if</span>(reg_opt[0]&&input_opt.size()<2){</div>
-<div class="line"><a name="l00502"></a><span class="lineno">  502</span>       <span class="keywordflow">if</span>(band_opt.size()<2)</div>
-<div class="line"><a name="l00503"></a><span class="lineno">  503</span>     <span class="keywordflow">continue</span>;</div>
-<div class="line"><a name="l00504"></a><span class="lineno">  504</span>       imgreg.setDown(down_opt[0]);</div>
-<div class="line"><a name="l00505"></a><span class="lineno">  505</span>       imgreg.setThreshold(random_opt[0]);</div>
-<div class="line"><a name="l00506"></a><span class="lineno">  506</span>       <span class="keywordtype">double</span> c0=0;<span class="comment">//offset</span></div>
-<div class="line"><a name="l00507"></a><span class="lineno">  507</span>       <span class="keywordtype">double</span> c1=1;<span class="comment">//scale</span></div>
-<div class="line"><a name="l00508"></a><span class="lineno">  508</span>       <span class="keywordtype">double</span> r2=imgreg.getR2(imgReader,band_opt[0],band_opt[1],c0,c1,verbose_opt[0]);</div>
-<div class="line"><a name="l00509"></a><span class="lineno">  509</span>       std::cout << <span class="stringliteral">"-c0 "</span> << c0 << <span class="stringliteral">" -c1 "</span> << c1 << <span class="stringliteral">" -r2 "</span> << r2 << std::endl;</div>
+<div class="line"><a name="l00123"></a><span class="lineno">  123</span>   fstat_opt.setHide(1);</div>
+<div class="line"><a name="l00124"></a><span class="lineno">  124</span>   ulx_opt.setHide(1);</div>
+<div class="line"><a name="l00125"></a><span class="lineno">  125</span>   uly_opt.setHide(1);</div>
+<div class="line"><a name="l00126"></a><span class="lineno">  126</span>   lrx_opt.setHide(1);</div>
+<div class="line"><a name="l00127"></a><span class="lineno">  127</span>   lry_opt.setHide(1);</div>
+<div class="line"><a name="l00128"></a><span class="lineno">  128</span>   down_opt.setHide(1);</div>
+<div class="line"><a name="l00129"></a><span class="lineno">  129</span>   random_opt.setHide(1);</div>
+<div class="line"><a name="l00130"></a><span class="lineno">  130</span>   scale_opt.setHide(1);</div>
+<div class="line"><a name="l00131"></a><span class="lineno">  131</span>   offset_opt.setHide(1);</div>
+<div class="line"><a name="l00132"></a><span class="lineno">  132</span>   src_min_opt.setHide(1);</div>
+<div class="line"><a name="l00133"></a><span class="lineno">  133</span>   src_max_opt.setHide(1);</div>
+<div class="line"><a name="l00134"></a><span class="lineno">  134</span>   kde_opt.setHide(1);</div>
+<div class="line"><a name="l00135"></a><span class="lineno">  135</span> </div>
+<div class="line"><a name="l00136"></a><span class="lineno">  136</span>   <span class="comment">// range_opt.setHide(1);</span></div>
+<div class="line"><a name="l00137"></a><span class="lineno">  137</span>   <span class="comment">// transpose_opt.setHide(1);</span></div>
+<div class="line"><a name="l00138"></a><span class="lineno">  138</span> </div>
+<div class="line"><a name="l00139"></a><span class="lineno">  139</span>   <span class="keywordtype">bool</span> doProcess;<span class="comment">//stop process when program was invoked with help option (-h --help)</span></div>
+<div class="line"><a name="l00140"></a><span class="lineno">  140</span>   <span class="keywordflow">try</span>{</div>
+<div class="line"><a name="l00141"></a><span class="lineno">  141</span>     <span class="comment">//mandatory options</span></div>
+<div class="line"><a name="l00142"></a><span class="lineno">  142</span>     doProcess=input_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00143"></a><span class="lineno">  143</span>     <span class="comment">//optional options</span></div>
+<div class="line"><a name="l00144"></a><span class="lineno">  144</span>     band_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00145"></a><span class="lineno">  145</span>     filename_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00146"></a><span class="lineno">  146</span>     stat_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00147"></a><span class="lineno">  147</span>     fstat_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00148"></a><span class="lineno">  148</span>     nodata_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00149"></a><span class="lineno">  149</span>     mean_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00150"></a><span class="lineno">  150</span>     median_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00151"></a><span class="lineno">  151</span>     var_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00152"></a><span class="lineno">  152</span>     stdev_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00153"></a><span class="lineno">  153</span>     minmax_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00154"></a><span class="lineno">  154</span>     min_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00155"></a><span class="lineno">  155</span>     max_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00156"></a><span class="lineno">  156</span>     histogram_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00157"></a><span class="lineno">  157</span>     nbin_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00158"></a><span class="lineno">  158</span>     relative_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00159"></a><span class="lineno">  159</span>     histogram2d_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00160"></a><span class="lineno">  160</span>     rmse_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00161"></a><span class="lineno">  161</span>     reg_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00162"></a><span class="lineno">  162</span>     regerr_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00163"></a><span class="lineno">  163</span>     preg_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00164"></a><span class="lineno">  164</span>     <span class="comment">//advanced options</span></div>
+<div class="line"><a name="l00165"></a><span class="lineno">  165</span>     ulx_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00166"></a><span class="lineno">  166</span>     uly_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00167"></a><span class="lineno">  167</span>     lrx_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00168"></a><span class="lineno">  168</span>     lry_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00169"></a><span class="lineno">  169</span>     down_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00170"></a><span class="lineno">  170</span>     random_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00171"></a><span class="lineno">  171</span>     scale_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00172"></a><span class="lineno">  172</span>     offset_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00173"></a><span class="lineno">  173</span>     src_min_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00174"></a><span class="lineno">  174</span>     src_max_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00175"></a><span class="lineno">  175</span>     kde_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00176"></a><span class="lineno">  176</span>     verbose_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00177"></a><span class="lineno">  177</span>   }</div>
+<div class="line"><a name="l00178"></a><span class="lineno">  178</span>   <span class="keywordflow">catch</span>(<span class="keywordtype">string</span> predefinedString){</div>
+<div class="line"><a name="l00179"></a><span class="lineno">  179</span>     std::cout << predefinedString << std::endl;</div>
+<div class="line"><a name="l00180"></a><span class="lineno">  180</span>     exit(0);</div>
+<div class="line"><a name="l00181"></a><span class="lineno">  181</span>   }</div>
+<div class="line"><a name="l00182"></a><span class="lineno">  182</span>   <span class="keywordflow">if</span>(!doProcess){</div>
+<div class="line"><a name="l00183"></a><span class="lineno">  183</span>     cout << endl;</div>
+<div class="line"><a name="l00184"></a><span class="lineno">  184</span>     cout << <span class="stringliteral">"Usage: pkstat -i input"</span> << endl;</div>
+<div class="line"><a name="l00185"></a><span class="lineno">  185</span>     cout << endl;</div>
+<div class="line"><a name="l00186"></a><span class="lineno">  186</span>     std::cout << <span class="stringliteral">"short option -h shows basic options only, use long option --help to show all options"</span> << std::endl;</div>
+<div class="line"><a name="l00187"></a><span class="lineno">  187</span>     exit(0);<span class="comment">//help was invoked, stop processing</span></div>
+<div class="line"><a name="l00188"></a><span class="lineno">  188</span>   }</div>
+<div class="line"><a name="l00189"></a><span class="lineno">  189</span> </div>
+<div class="line"><a name="l00190"></a><span class="lineno">  190</span>   <span class="keywordflow">if</span>(src_min_opt.size()){</div>
+<div class="line"><a name="l00191"></a><span class="lineno">  191</span>     <span class="keywordflow">while</span>(src_min_opt.size()<band_opt.size())</div>
+<div class="line"><a name="l00192"></a><span class="lineno">  192</span>       src_min_opt.push_back(src_min_opt[0]);</div>
+<div class="line"><a name="l00193"></a><span class="lineno">  193</span>   }</div>
+<div class="line"><a name="l00194"></a><span class="lineno">  194</span>   <span class="keywordflow">if</span>(src_max_opt.size()){</div>
+<div class="line"><a name="l00195"></a><span class="lineno">  195</span>     <span class="keywordflow">while</span>(src_max_opt.size()<band_opt.size())</div>
+<div class="line"><a name="l00196"></a><span class="lineno">  196</span>       src_max_opt.push_back(src_max_opt[0]);</div>
+<div class="line"><a name="l00197"></a><span class="lineno">  197</span>   }</div>
+<div class="line"><a name="l00198"></a><span class="lineno">  198</span> </div>
+<div class="line"><a name="l00199"></a><span class="lineno">  199</span>   <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> nbin=0;</div>
+<div class="line"><a name="l00200"></a><span class="lineno">  200</span>   <span class="keywordtype">double</span> minX=0;</div>
+<div class="line"><a name="l00201"></a><span class="lineno">  201</span>   <span class="keywordtype">double</span> minY=0;</div>
+<div class="line"><a name="l00202"></a><span class="lineno">  202</span>   <span class="keywordtype">double</span> maxX=0;</div>
+<div class="line"><a name="l00203"></a><span class="lineno">  203</span>   <span class="keywordtype">double</span> maxY=0;</div>
+<div class="line"><a name="l00204"></a><span class="lineno">  204</span>   <span class="keywordtype">double</span> minValue=0;</div>
+<div class="line"><a name="l00205"></a><span class="lineno">  205</span>   <span class="keywordtype">double</span> maxValue=0;</div>
+<div class="line"><a name="l00206"></a><span class="lineno">  206</span>   <span class="keywordtype">double</span> meanValue=0;</div>
+<div class="line"><a name="l00207"></a><span class="lineno">  207</span>   <span class="keywordtype">double</span> stdDev=0;</div>
+<div class="line"><a name="l00208"></a><span class="lineno">  208</span> </div>
+<div class="line"><a name="l00209"></a><span class="lineno">  209</span>   <span class="keyword">const</span> <span class="keywordtype">char</span>* pszMessage;</div>
+<div class="line"><a name="l00210"></a><span class="lineno">  210</span>   <span class="keywordtype">void</span>* pProgressArg=NULL;</div>
+<div class="line"><a name="l00211"></a><span class="lineno">  211</span>   GDALProgressFunc pfnProgress=GDALTermProgress;</div>
+<div class="line"><a name="l00212"></a><span class="lineno">  212</span>   <span class="keywordtype">double</span> progress=0;</div>
+<div class="line"><a name="l00213"></a><span class="lineno">  213</span>   srand(time(NULL));</div>
+<div class="line"><a name="l00214"></a><span class="lineno">  214</span> </div>
+<div class="line"><a name="l00215"></a><span class="lineno">  215</span>   <a class="code" href="classstatfactory_1_1StatFactory.html">statfactory::StatFactory</a> stat;</div>
+<div class="line"><a name="l00216"></a><span class="lineno">  216</span>   <a class="code" href="classimgregression_1_1ImgRegression.html">imgregression::ImgRegression</a> imgreg;</div>
+<div class="line"><a name="l00217"></a><span class="lineno">  217</span>   std::vector<double> histogramOutput;</div>
+<div class="line"><a name="l00218"></a><span class="lineno">  218</span>   <span class="keywordtype">double</span> nsample=0;</div>
+<div class="line"><a name="l00219"></a><span class="lineno">  219</span> </div>
+<div class="line"><a name="l00220"></a><span class="lineno">  220</span>   <a class="code" href="classImgReaderGdal.html">ImgReaderGdal</a> imgReader;</div>
+<div class="line"><a name="l00221"></a><span class="lineno">  221</span> </div>
+<div class="line"><a name="l00222"></a><span class="lineno">  222</span>   <span class="keywordflow">if</span>(scale_opt.size()){</div>
+<div class="line"><a name="l00223"></a><span class="lineno">  223</span>     <span class="keywordflow">while</span>(scale_opt.size()<input_opt.size())</div>
+<div class="line"><a name="l00224"></a><span class="lineno">  224</span>       scale_opt.push_back(scale_opt[0]);</div>
+<div class="line"><a name="l00225"></a><span class="lineno">  225</span>   }</div>
+<div class="line"><a name="l00226"></a><span class="lineno">  226</span>   <span class="keywordflow">if</span>(offset_opt.size()){</div>
+<div class="line"><a name="l00227"></a><span class="lineno">  227</span>     <span class="keywordflow">while</span>(offset_opt.size()<input_opt.size())</div>
+<div class="line"><a name="l00228"></a><span class="lineno">  228</span>       offset_opt.push_back(offset_opt[0]);</div>
+<div class="line"><a name="l00229"></a><span class="lineno">  229</span>   }</div>
+<div class="line"><a name="l00230"></a><span class="lineno">  230</span>   <span class="keywordflow">if</span>(input_opt.empty()){</div>
+<div class="line"><a name="l00231"></a><span class="lineno">  231</span>     std::cerr << <span class="stringliteral">"No image dataset provided (use option -i). Use --help for help information"</span>;</div>
+<div class="line"><a name="l00232"></a><span class="lineno">  232</span>       exit(0);</div>
+<div class="line"><a name="l00233"></a><span class="lineno">  233</span>   }</div>
+<div class="line"><a name="l00234"></a><span class="lineno">  234</span>   <span class="keywordflow">for</span>(<span class="keywordtype">int</span> ifile=0;ifile<input_opt.size();++ifile){</div>
+<div class="line"><a name="l00235"></a><span class="lineno">  235</span>     <span class="keywordflow">try</span>{</div>
+<div class="line"><a name="l00236"></a><span class="lineno">  236</span>       imgReader.open(input_opt[ifile]);</div>
+<div class="line"><a name="l00237"></a><span class="lineno">  237</span>     }</div>
+<div class="line"><a name="l00238"></a><span class="lineno">  238</span>     <span class="keywordflow">catch</span>(std::string errorstring){</div>
+<div class="line"><a name="l00239"></a><span class="lineno">  239</span>       std::cout << errorstring << std::endl;</div>
+<div class="line"><a name="l00240"></a><span class="lineno">  240</span>       exit(0);</div>
+<div class="line"><a name="l00241"></a><span class="lineno">  241</span>     }</div>
+<div class="line"><a name="l00242"></a><span class="lineno">  242</span> </div>
+<div class="line"><a name="l00243"></a><span class="lineno">  243</span>     <span class="keywordflow">if</span>(filename_opt[0])</div>
+<div class="line"><a name="l00244"></a><span class="lineno">  244</span>       std::cout << <span class="stringliteral">" --input "</span> << input_opt[ifile] << <span class="stringliteral">" "</span>;</div>
+<div class="line"><a name="l00245"></a><span class="lineno">  245</span> </div>
+<div class="line"><a name="l00246"></a><span class="lineno">  246</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> inodata=0;inodata<nodata_opt.size();++inodata)</div>
+<div class="line"><a name="l00247"></a><span class="lineno">  247</span>       imgReader.pushNoDataValue(nodata_opt[inodata]);</div>
+<div class="line"><a name="l00248"></a><span class="lineno">  248</span> </div>
+<div class="line"><a name="l00249"></a><span class="lineno">  249</span>     <span class="keywordtype">int</span> nband=band_opt.size();</div>
+<div class="line"><a name="l00250"></a><span class="lineno">  250</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iband=0;iband<nband;++iband){</div>
+<div class="line"><a name="l00251"></a><span class="lineno">  251</span> </div>
+<div class="line"><a name="l00252"></a><span class="lineno">  252</span>       <span class="keywordflow">for</span>(<span class="keywordtype">int</span> inodata=0;inodata<nodata_opt.size();++inodata){</div>
+<div class="line"><a name="l00253"></a><span class="lineno">  253</span>     <span class="keywordflow">if</span>(!inodata)</div>
+<div class="line"><a name="l00254"></a><span class="lineno">  254</span>       imgReader.GDALSetNoDataValue(nodata_opt[0],band_opt[iband]);<span class="comment">//only single no data can be set in GDALRasterBand (used for ComputeStatistics)</span></div>
+<div class="line"><a name="l00255"></a><span class="lineno">  255</span>       }</div>
+<div class="line"><a name="l00256"></a><span class="lineno">  256</span> </div>
+<div class="line"><a name="l00257"></a><span class="lineno">  257</span>       <span class="keywordflow">if</span>(offset_opt.size()>ifile)</div>
+<div class="line"><a name="l00258"></a><span class="lineno">  258</span>         imgReader.setOffset(offset_opt[ifile],band_opt[iband]);</div>
+<div class="line"><a name="l00259"></a><span class="lineno">  259</span>       <span class="keywordflow">if</span>(scale_opt.size()>ifile)</div>
+<div class="line"><a name="l00260"></a><span class="lineno">  260</span>         imgReader.setScale(scale_opt[ifile],band_opt[iband]);</div>
+<div class="line"><a name="l00261"></a><span class="lineno">  261</span> </div>
+<div class="line"><a name="l00262"></a><span class="lineno">  262</span>       <span class="keywordflow">if</span>(stat_opt[0]||mean_opt[0]||var_opt[0]||stdev_opt[0]){<span class="comment">//the hard way (in memory)</span></div>
+<div class="line"><a name="l00263"></a><span class="lineno">  263</span>     <a class="code" href="classstatfactory_1_1StatFactory.html">statfactory::StatFactory</a> stat;</div>
+<div class="line"><a name="l00264"></a><span class="lineno">  264</span>     vector<double> readBuffer;</div>
+<div class="line"><a name="l00265"></a><span class="lineno">  265</span>     <span class="keywordtype">double</span> varValue;</div>
+<div class="line"><a name="l00266"></a><span class="lineno">  266</span>     imgReader.readDataBlock(readBuffer, GDT_Float64, 0, imgReader.nrOfCol()-1, 0, imgReader.nrOfRow()-1, band_opt[0]);</div>
+<div class="line"><a name="l00267"></a><span class="lineno">  267</span>     stat.setNoDataValues(nodata_opt);</div>
+<div class="line"><a name="l00268"></a><span class="lineno">  268</span>     stat.meanVar(readBuffer,meanValue,varValue);</div>
+<div class="line"><a name="l00269"></a><span class="lineno">  269</span>     stat.minmax(readBuffer,readBuffer.begin(),readBuffer.end(),minValue,maxValue);</div>
+<div class="line"><a name="l00270"></a><span class="lineno">  270</span>         <span class="keywordflow">if</span>(mean_opt[0])</div>
+<div class="line"><a name="l00271"></a><span class="lineno">  271</span>           std::cout << <span class="stringliteral">"--mean "</span> << meanValue << <span class="stringliteral">" "</span>;</div>
+<div class="line"><a name="l00272"></a><span class="lineno">  272</span>         <span class="keywordflow">if</span>(stdev_opt[0])</div>
+<div class="line"><a name="l00273"></a><span class="lineno">  273</span>           std::cout << <span class="stringliteral">"--stdDev "</span> << sqrt(varValue) << <span class="stringliteral">" "</span>;</div>
+<div class="line"><a name="l00274"></a><span class="lineno">  274</span>         <span class="keywordflow">if</span>(var_opt[0])</div>
+<div class="line"><a name="l00275"></a><span class="lineno">  275</span>           std::cout << <span class="stringliteral">"--var "</span> << varValue << <span class="stringliteral">" "</span>;</div>
+<div class="line"><a name="l00276"></a><span class="lineno">  276</span>         <span class="keywordflow">if</span>(stat_opt[0])</div>
+<div class="line"><a name="l00277"></a><span class="lineno">  277</span>           std::cout << <span class="stringliteral">"-min "</span> << minValue << <span class="stringliteral">" -max "</span> << maxValue << <span class="stringliteral">" --mean "</span> << meanValue << <span class="stringliteral">" --stdDev "</span> << sqrt(varValue) << <span class="stringliteral">" "</span>;</div>
+<div class="line"><a name="l00278"></a><span class="lineno">  278</span>       }</div>
+<div class="line"><a name="l00279"></a><span class="lineno">  279</span> </div>
+<div class="line"><a name="l00280"></a><span class="lineno">  280</span>       <span class="keywordflow">if</span>(fstat_opt[0]){<span class="comment">//the fast way</span></div>
+<div class="line"><a name="l00281"></a><span class="lineno">  281</span>         assert(band_opt[iband]<imgReader.nrOfBand());</div>
+<div class="line"><a name="l00282"></a><span class="lineno">  282</span>     GDALProgressFunc pfnProgress;</div>
+<div class="line"><a name="l00283"></a><span class="lineno">  283</span>     <span class="keywordtype">void</span>* pProgressData;</div>
+<div class="line"><a name="l00284"></a><span class="lineno">  284</span>     GDALRasterBand* rasterBand;</div>
+<div class="line"><a name="l00285"></a><span class="lineno">  285</span>         rasterBand=imgReader.getRasterBand(band_opt[iband]);</div>
+<div class="line"><a name="l00286"></a><span class="lineno">  286</span>         rasterBand->ComputeStatistics(0,&minValue,&maxValue,&meanValue,&stdDev,pfnProgress,pProgressData);</div>
+<div class="line"><a name="l00287"></a><span class="lineno">  287</span> </div>
+<div class="line"><a name="l00288"></a><span class="lineno">  288</span>     std::cout << <span class="stringliteral">"-min "</span> << minValue << <span class="stringliteral">" -max "</span> << maxValue << <span class="stringliteral">" --mean "</span> << meanValue << <span class="stringliteral">" --stdDev "</span> << stdDev << <span class="stringliteral">" "</span>;</div>
+<div class="line"><a name="l00289"></a><span class="lineno">  289</span>       }</div>
+<div class="line"><a name="l00290"></a><span class="lineno">  290</span> </div>
+<div class="line"><a name="l00291"></a><span class="lineno">  291</span>       <span class="keywordflow">if</span>(minmax_opt[0]||min_opt[0]||max_opt[0]){</div>
+<div class="line"><a name="l00292"></a><span class="lineno">  292</span>     assert(band_opt[iband]<imgReader.nrOfBand());</div>
+<div class="line"><a name="l00293"></a><span class="lineno">  293</span> </div>
+<div class="line"><a name="l00294"></a><span class="lineno">  294</span>     <span class="keywordflow">if</span>((ulx_opt.size()||uly_opt.size()||lrx_opt.size()||lry_opt.size())&&(imgReader.covers(ulx_opt[0],uly_opt[0],lrx_opt[0],lry_opt[0]))){</div>
+<div class="line"><a name="l00295"></a><span class="lineno">  295</span>       <span class="keywordtype">double</span> uli,ulj,lri,lrj;</div>
+<div class="line"><a name="l00296"></a><span class="lineno">  296</span>       imgReader.geo2image(ulx_opt[0],uly_opt[0],uli,ulj);</div>
+<div class="line"><a name="l00297"></a><span class="lineno">  297</span>       imgReader.geo2image(lrx_opt[0],lry_opt[0],lri,lrj);</div>
+<div class="line"><a name="l00298"></a><span class="lineno">  298</span>       imgReader.getMinMax(static_cast<int>(uli),static_cast<int>(lri),static_cast<int>(ulj),static_cast<int>(lrj),band_opt[iband],minValue,maxValue);</div>
+<div class="line"><a name="l00299"></a><span class="lineno">  299</span>     }</div>
+<div class="line"><a name="l00300"></a><span class="lineno">  300</span>     <span class="keywordflow">else</span>{</div>
+<div class="line"><a name="l00301"></a><span class="lineno">  301</span>       imgReader.getMinMax(minValue,maxValue,band_opt[iband],<span class="keyword">true</span>);</div>
+<div class="line"><a name="l00302"></a><span class="lineno">  302</span>     }</div>
+<div class="line"><a name="l00303"></a><span class="lineno">  303</span>     <span class="keywordflow">if</span>(minmax_opt[0])</div>
+<div class="line"><a name="l00304"></a><span class="lineno">  304</span>       std::cout << <span class="stringliteral">"-min "</span> << minValue << <span class="stringliteral">" -max "</span> << maxValue << <span class="stringliteral">" "</span>;</div>
+<div class="line"><a name="l00305"></a><span class="lineno">  305</span>     <span class="keywordflow">else</span>{</div>
+<div class="line"><a name="l00306"></a><span class="lineno">  306</span>       <span class="keywordflow">if</span>(min_opt[0])</div>
+<div class="line"><a name="l00307"></a><span class="lineno">  307</span>         std::cout << <span class="stringliteral">"-min "</span> << minValue << <span class="stringliteral">" "</span>;</div>
+<div class="line"><a name="l00308"></a><span class="lineno">  308</span>       <span class="keywordflow">if</span>(max_opt[0])</div>
+<div class="line"><a name="l00309"></a><span class="lineno">  309</span>         std::cout << <span class="stringliteral">"-max "</span> << maxValue << <span class="stringliteral">" "</span>;</div>
+<div class="line"><a name="l00310"></a><span class="lineno">  310</span>     }</div>
+<div class="line"><a name="l00311"></a><span class="lineno">  311</span>       }</div>
+<div class="line"><a name="l00312"></a><span class="lineno">  312</span>     }</div>
+<div class="line"><a name="l00313"></a><span class="lineno">  313</span>     <span class="keywordflow">if</span>(histogram_opt[0]){<span class="comment">//aggregate results from multiple inputs, but only calculate for first selected band</span></div>
+<div class="line"><a name="l00314"></a><span class="lineno">  314</span>       assert(band_opt[0]<imgReader.nrOfBand());</div>
+<div class="line"><a name="l00315"></a><span class="lineno">  315</span>       nbin=(nbin_opt.size())? nbin_opt[0]:0;</div>
+<div class="line"><a name="l00316"></a><span class="lineno">  316</span>       </div>
+<div class="line"><a name="l00317"></a><span class="lineno">  317</span>       imgReader.getMinMax(minValue,maxValue,band_opt[0]);</div>
+<div class="line"><a name="l00318"></a><span class="lineno">  318</span>       <span class="keywordflow">if</span>(src_min_opt.size())</div>
+<div class="line"><a name="l00319"></a><span class="lineno">  319</span>         minValue=src_min_opt[0];</div>
+<div class="line"><a name="l00320"></a><span class="lineno">  320</span>       <span class="keywordflow">if</span>(src_max_opt.size())</div>
+<div class="line"><a name="l00321"></a><span class="lineno">  321</span>         maxValue=src_max_opt[0];</div>
+<div class="line"><a name="l00322"></a><span class="lineno">  322</span>       <span class="keywordflow">if</span>(minValue>=maxValue)</div>
+<div class="line"><a name="l00323"></a><span class="lineno">  323</span>     imgReader.getMinMax(minValue,maxValue,band_opt[0]);</div>
+<div class="line"><a name="l00324"></a><span class="lineno">  324</span> </div>
+<div class="line"><a name="l00325"></a><span class="lineno">  325</span>       <span class="keywordflow">if</span>(verbose_opt[0])</div>
+<div class="line"><a name="l00326"></a><span class="lineno">  326</span>     cout << <span class="stringliteral">"number of valid pixels in image: "</span> << imgReader.getNvalid(band_opt[0]) << endl;</div>
+<div class="line"><a name="l00327"></a><span class="lineno">  327</span> </div>
+<div class="line"><a name="l00328"></a><span class="lineno">  328</span>       nsample+=imgReader.getHistogram(histogramOutput,minValue,maxValue,nbin,band_opt[0],kde_opt[0]);</div>
+<div class="line"><a name="l00329"></a><span class="lineno">  329</span> </div>
+<div class="line"><a name="l00330"></a><span class="lineno">  330</span>       <span class="comment">//only output for last input file</span></div>
+<div class="line"><a name="l00331"></a><span class="lineno">  331</span>       <span class="keywordflow">if</span>(ifile==input_opt.size()-1){</div>
+<div class="line"><a name="l00332"></a><span class="lineno">  332</span>     std::cout.precision(10);</div>
+<div class="line"><a name="l00333"></a><span class="lineno">  333</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> bin=0;bin<nbin;++bin){</div>
+<div class="line"><a name="l00334"></a><span class="lineno">  334</span>       <span class="keywordtype">double</span> binValue=0;</div>
+<div class="line"><a name="l00335"></a><span class="lineno">  335</span>       <span class="keywordflow">if</span>(nbin==maxValue-minValue+1)</div>
+<div class="line"><a name="l00336"></a><span class="lineno">  336</span>         binValue=minValue+bin;</div>
+<div class="line"><a name="l00337"></a><span class="lineno">  337</span>       <span class="keywordflow">else</span></div>
+<div class="line"><a name="l00338"></a><span class="lineno">  338</span>         binValue=minValue+<span class="keyword">static_cast<</span><span class="keywordtype">double</span><span class="keyword">></span>(maxValue-minValue)*(bin+0.5)/nbin;</div>
+<div class="line"><a name="l00339"></a><span class="lineno">  339</span>       std::cout << binValue << <span class="stringliteral">" "</span>;</div>
+<div class="line"><a name="l00340"></a><span class="lineno">  340</span>       <span class="keywordflow">if</span>(relative_opt[0]||kde_opt[0])</div>
+<div class="line"><a name="l00341"></a><span class="lineno">  341</span>         std::cout << 100.0*<span class="keyword">static_cast<</span><span class="keywordtype">double</span><span class="keyword">></span>(histogramOutput[bin])/static_cast<double>(nsample) << std::endl;</div>
+<div class="line"><a name="l00342"></a><span class="lineno">  342</span>       <span class="keywordflow">else</span></div>
+<div class="line"><a name="l00343"></a><span class="lineno">  343</span>         std::cout << static_cast<double>(histogramOutput[bin]) << std::endl;</div>
+<div class="line"><a name="l00344"></a><span class="lineno">  344</span>     }</div>
+<div class="line"><a name="l00345"></a><span class="lineno">  345</span>       }</div>
+<div class="line"><a name="l00346"></a><span class="lineno">  346</span>     }</div>
+<div class="line"><a name="l00347"></a><span class="lineno">  347</span>     <span class="keywordflow">if</span>(histogram2d_opt[0]&&input_opt.size()<2){</div>
+<div class="line"><a name="l00348"></a><span class="lineno">  348</span>       assert(band_opt.size()>1);</div>
+<div class="line"><a name="l00349"></a><span class="lineno">  349</span>       imgReader.getMinMax(minX,maxX,band_opt[0]);</div>
+<div class="line"><a name="l00350"></a><span class="lineno">  350</span>       imgReader.getMinMax(minY,maxY,band_opt[1]);</div>
+<div class="line"><a name="l00351"></a><span class="lineno">  351</span>       <span class="keywordflow">if</span>(src_min_opt.size()){</div>
+<div class="line"><a name="l00352"></a><span class="lineno">  352</span>     minX=src_min_opt[0];</div>
+<div class="line"><a name="l00353"></a><span class="lineno">  353</span>     minY=src_min_opt[1];</div>
+<div class="line"><a name="l00354"></a><span class="lineno">  354</span>       }</div>
+<div class="line"><a name="l00355"></a><span class="lineno">  355</span>       <span class="keywordflow">if</span>(src_max_opt.size()){</div>
+<div class="line"><a name="l00356"></a><span class="lineno">  356</span>     maxX=src_max_opt[0];</div>
+<div class="line"><a name="l00357"></a><span class="lineno">  357</span>     maxY=src_max_opt[1];</div>
+<div class="line"><a name="l00358"></a><span class="lineno">  358</span>       }</div>
+<div class="line"><a name="l00359"></a><span class="lineno">  359</span>       nbin=(nbin_opt.size())? nbin_opt[0]:0;</div>
+<div class="line"><a name="l00360"></a><span class="lineno">  360</span>       <span class="keywordflow">if</span>(nbin<=1){</div>
+<div class="line"><a name="l00361"></a><span class="lineno">  361</span>     std::cerr << <span class="stringliteral">"Warning: number of bins not defined, calculating bins from min and max value"</span> << std::endl;</div>
+<div class="line"><a name="l00362"></a><span class="lineno">  362</span>     <span class="keywordflow">if</span>(minX>=maxX)</div>
+<div class="line"><a name="l00363"></a><span class="lineno">  363</span>       imgReader.getMinMax(minX,maxX,band_opt[0]);</div>
+<div class="line"><a name="l00364"></a><span class="lineno">  364</span>     <span class="keywordflow">if</span>(minY>=maxY)</div>
+<div class="line"><a name="l00365"></a><span class="lineno">  365</span>       imgReader.getMinMax(minY,maxY,band_opt[1]);</div>
+<div class="line"><a name="l00366"></a><span class="lineno">  366</span> </div>
+<div class="line"><a name="l00367"></a><span class="lineno">  367</span>     minValue=(minX<minY)? minX:minY;</div>
+<div class="line"><a name="l00368"></a><span class="lineno">  368</span>     maxValue=(maxX>maxY)? maxX:maxY;</div>
+<div class="line"><a name="l00369"></a><span class="lineno">  369</span>     <span class="keywordflow">if</span>(verbose_opt[0])</div>
+<div class="line"><a name="l00370"></a><span class="lineno">  370</span>       std::cout << <span class="stringliteral">"min and max values: "</span> << minValue << <span class="stringliteral">", "</span> << maxValue << std::endl;</div>
+<div class="line"><a name="l00371"></a><span class="lineno">  371</span>     nbin=maxValue-minValue+1;</div>
+<div class="line"><a name="l00372"></a><span class="lineno">  372</span>       }</div>
+<div class="line"><a name="l00373"></a><span class="lineno">  373</span>       assert(nbin>1);</div>
+<div class="line"><a name="l00374"></a><span class="lineno">  374</span>       <span class="keywordtype">double</span> sigma=0;</div>
+<div class="line"><a name="l00375"></a><span class="lineno">  375</span>       <span class="comment">//kernel density estimation as in http://en.wikipedia.org/wiki/Kernel_density_estimation</span></div>
+<div class="line"><a name="l00376"></a><span class="lineno">  376</span>       <span class="keywordflow">if</span>(kde_opt[0]){</div>
+<div class="line"><a name="l00377"></a><span class="lineno">  377</span>     assert(band_opt[0]<imgReader.nrOfBand());</div>
+<div class="line"><a name="l00378"></a><span class="lineno">  378</span>     assert(band_opt[1]<imgReader.nrOfBand());</div>
+<div class="line"><a name="l00379"></a><span class="lineno">  379</span>     GDALProgressFunc pfnProgress;</div>
+<div class="line"><a name="l00380"></a><span class="lineno">  380</span>     <span class="keywordtype">void</span>* pProgressData;</div>
+<div class="line"><a name="l00381"></a><span class="lineno">  381</span>     GDALRasterBand* rasterBand;</div>
+<div class="line"><a name="l00382"></a><span class="lineno">  382</span>     <span class="keywordtype">double</span> stdDev1=0;</div>
+<div class="line"><a name="l00383"></a><span class="lineno">  383</span>     <span class="keywordtype">double</span> stdDev2=0;</div>
+<div class="line"><a name="l00384"></a><span class="lineno">  384</span>     rasterBand=imgReader.getRasterBand(band_opt[0]);</div>
+<div class="line"><a name="l00385"></a><span class="lineno">  385</span>     rasterBand->ComputeStatistics(0,&minValue,&maxValue,&meanValue,&stdDev1,pfnProgress,pProgressData);</div>
+<div class="line"><a name="l00386"></a><span class="lineno">  386</span>     rasterBand=imgReader.getRasterBand(band_opt[1]);</div>
+<div class="line"><a name="l00387"></a><span class="lineno">  387</span>     rasterBand->ComputeStatistics(0,&minValue,&maxValue,&meanValue,&stdDev2,pfnProgress,pProgressData);</div>
+<div class="line"><a name="l00388"></a><span class="lineno">  388</span> </div>
+<div class="line"><a name="l00389"></a><span class="lineno">  389</span>     <span class="keywordtype">double</span> estimatedSize=1.0*imgReader.getNvalid(band_opt[0])/down_opt[0]/down_opt[0];</div>
+<div class="line"><a name="l00390"></a><span class="lineno">  390</span>     <span class="keywordflow">if</span>(random_opt[0]>0)</div>
+<div class="line"><a name="l00391"></a><span class="lineno">  391</span>       estimatedSize*=random_opt[0]/100.0;</div>
+<div class="line"><a name="l00392"></a><span class="lineno">  392</span>         sigma=1.06*sqrt(stdDev1*stdDev2)*pow(estimatedSize,-0.2);</div>
+<div class="line"><a name="l00393"></a><span class="lineno">  393</span>       }</div>
+<div class="line"><a name="l00394"></a><span class="lineno">  394</span>       assert(nbin);</div>
+<div class="line"><a name="l00395"></a><span class="lineno">  395</span>       <span class="keywordflow">if</span>(verbose_opt[0]){</div>
+<div class="line"><a name="l00396"></a><span class="lineno">  396</span>     <span class="keywordflow">if</span>(sigma>0)</div>
+<div class="line"><a name="l00397"></a><span class="lineno">  397</span>       std::cout << <span class="stringliteral">"calculating 2d kernel density estimate with sigma "</span> << sigma << <span class="stringliteral">" for bands "</span> << band_opt[0] << <span class="stringliteral">" and "</span> << band_opt[1] << std::endl;</div>
+<div class="line"><a name="l00398"></a><span class="lineno">  398</span>     <span class="keywordflow">else</span></div>
+<div class="line"><a name="l00399"></a><span class="lineno">  399</span>       std::cout << <span class="stringliteral">"calculating 2d histogram for bands "</span> << band_opt[0] << <span class="stringliteral">" and "</span> << band_opt[1] << std::endl;</div>
+<div class="line"><a name="l00400"></a><span class="lineno">  400</span>     std::cout << <span class="stringliteral">"nbin: "</span> << nbin << std::endl;</div>
+<div class="line"><a name="l00401"></a><span class="lineno">  401</span>       }</div>
+<div class="line"><a name="l00402"></a><span class="lineno">  402</span> </div>
+<div class="line"><a name="l00403"></a><span class="lineno">  403</span> </div>
+<div class="line"><a name="l00404"></a><span class="lineno">  404</span>       vector< vector<double> > output;</div>
+<div class="line"><a name="l00405"></a><span class="lineno">  405</span> </div>
+<div class="line"><a name="l00406"></a><span class="lineno">  406</span>       <span class="keywordflow">if</span>(maxX<=minX)</div>
+<div class="line"><a name="l00407"></a><span class="lineno">  407</span>     imgReader.getMinMax(minX,maxX,band_opt[0]);</div>
+<div class="line"><a name="l00408"></a><span class="lineno">  408</span>       <span class="keywordflow">if</span>(maxY<=minY)</div>
+<div class="line"><a name="l00409"></a><span class="lineno">  409</span>     imgReader.getMinMax(minY,maxY,band_opt[1]);</div>
+<div class="line"><a name="l00410"></a><span class="lineno">  410</span> </div>
+<div class="line"><a name="l00411"></a><span class="lineno">  411</span>       <span class="keywordflow">if</span>(maxX<=minX){</div>
+<div class="line"><a name="l00412"></a><span class="lineno">  412</span>     std::ostringstream s;</div>
+<div class="line"><a name="l00413"></a><span class="lineno">  413</span>     s<<<span class="stringliteral">"Error: could not calculate distribution (minX>=maxX)"</span>;</div>
+<div class="line"><a name="l00414"></a><span class="lineno">  414</span>     <span class="keywordflow">throw</span>(s.str());</div>
+<div class="line"><a name="l00415"></a><span class="lineno">  415</span>       }</div>
+<div class="line"><a name="l00416"></a><span class="lineno">  416</span>       <span class="keywordflow">if</span>(maxY<=minY){</div>
+<div class="line"><a name="l00417"></a><span class="lineno">  417</span>     std::ostringstream s;</div>
+<div class="line"><a name="l00418"></a><span class="lineno">  418</span>     s<<<span class="stringliteral">"Error: could not calculate distribution (minY>=maxY)"</span>;</div>
+<div class="line"><a name="l00419"></a><span class="lineno">  419</span>     <span class="keywordflow">throw</span>(s.str());</div>
+<div class="line"><a name="l00420"></a><span class="lineno">  420</span>       }</div>
+<div class="line"><a name="l00421"></a><span class="lineno">  421</span>       output.resize(nbin);</div>
+<div class="line"><a name="l00422"></a><span class="lineno">  422</span>       <span class="keywordflow">for</span>(<span class="keywordtype">int</span> i=0;i<nbin;++i){</div>
+<div class="line"><a name="l00423"></a><span class="lineno">  423</span>     output[i].resize(nbin);</div>
+<div class="line"><a name="l00424"></a><span class="lineno">  424</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> j=0;j<nbin;++j)</div>
+<div class="line"><a name="l00425"></a><span class="lineno">  425</span>       output[i][j]=0;</div>
+<div class="line"><a name="l00426"></a><span class="lineno">  426</span>       }</div>
+<div class="line"><a name="l00427"></a><span class="lineno">  427</span>       <span class="keywordtype">int</span> binX=0;</div>
+<div class="line"><a name="l00428"></a><span class="lineno">  428</span>       <span class="keywordtype">int</span> binY=0;</div>
+<div class="line"><a name="l00429"></a><span class="lineno">  429</span>       vector<double> inputX(imgReader.nrOfCol());</div>
+<div class="line"><a name="l00430"></a><span class="lineno">  430</span>       vector<double> inputY(imgReader.nrOfCol());</div>
+<div class="line"><a name="l00431"></a><span class="lineno">  431</span>       <span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> nvalid=0;</div>
+<div class="line"><a name="l00432"></a><span class="lineno">  432</span>       <span class="keywordflow">for</span>(<span class="keywordtype">int</span> irow=0;irow<imgReader.nrOfRow();++irow){</div>
+<div class="line"><a name="l00433"></a><span class="lineno">  433</span>         <span class="keywordflow">if</span>(irow%down_opt[0])</div>
+<div class="line"><a name="l00434"></a><span class="lineno">  434</span>           <span class="keywordflow">continue</span>;</div>
+<div class="line"><a name="l00435"></a><span class="lineno">  435</span>     imgReader.readData(inputX,GDT_Float64,irow,band_opt[0]);</div>
+<div class="line"><a name="l00436"></a><span class="lineno">  436</span>     imgReader.readData(inputY,GDT_Float64,irow,band_opt[1]);</div>
+<div class="line"><a name="l00437"></a><span class="lineno">  437</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> icol=0;icol<imgReader.nrOfCol();++icol){</div>
+<div class="line"><a name="l00438"></a><span class="lineno">  438</span>           <span class="keywordflow">if</span>(icol%down_opt[0])</div>
+<div class="line"><a name="l00439"></a><span class="lineno">  439</span>             <span class="keywordflow">continue</span>;</div>
+<div class="line"><a name="l00440"></a><span class="lineno">  440</span>       <span class="keywordflow">if</span>(random_opt[0]>0){</div>
+<div class="line"><a name="l00441"></a><span class="lineno">  441</span>         <span class="keywordtype">double</span> p=<span class="keyword">static_cast<</span><span class="keywordtype">double</span><span class="keyword">></span>(rand())/(RAND_MAX);</div>
+<div class="line"><a name="l00442"></a><span class="lineno">  442</span>         p*=100.0;</div>
+<div class="line"><a name="l00443"></a><span class="lineno">  443</span>         <span class="keywordflow">if</span>(p>random_opt[0])</div>
+<div class="line"><a name="l00444"></a><span class="lineno">  444</span>           <span class="keywordflow">continue</span>;<span class="comment">//do not select for now, go to next column</span></div>
+<div class="line"><a name="l00445"></a><span class="lineno">  445</span>       }</div>
+<div class="line"><a name="l00446"></a><span class="lineno">  446</span>       <span class="keywordflow">if</span>(imgReader.isNoData(inputX[icol]))</div>
+<div class="line"><a name="l00447"></a><span class="lineno">  447</span>         <span class="keywordflow">continue</span>;</div>
+<div class="line"><a name="l00448"></a><span class="lineno">  448</span>       <span class="keywordflow">if</span>(imgReader.isNoData(inputY[icol]))</div>
+<div class="line"><a name="l00449"></a><span class="lineno">  449</span>         <span class="keywordflow">continue</span>;</div>
+<div class="line"><a name="l00450"></a><span class="lineno">  450</span>       ++nvalid;</div>
+<div class="line"><a name="l00451"></a><span class="lineno">  451</span>       <span class="keywordflow">if</span>(inputX[icol]>=maxX)</div>
+<div class="line"><a name="l00452"></a><span class="lineno">  452</span>         binX=nbin-1;</div>
+<div class="line"><a name="l00453"></a><span class="lineno">  453</span>       <span class="keywordflow">else</span> <span class="keywordflow">if</span>(inputX[icol]<=minX)</div>
+<div class="line"><a name="l00454"></a><span class="lineno">  454</span>         binX=0;</div>
+<div class="line"><a name="l00455"></a><span class="lineno">  455</span>       <span class="keywordflow">else</span></div>
+<div class="line"><a name="l00456"></a><span class="lineno">  456</span>         binX=<span class="keyword">static_cast<</span><span class="keywordtype">int</span><span class="keyword">></span>(<span class="keyword">static_cast<</span><span class="keywordtype">double</span><span class="keyword">></span>(inputX[icol]-minX)/(maxX-minX)*nbin);</div>
+<div class="line"><a name="l00457"></a><span class="lineno">  457</span>       <span class="keywordflow">if</span>(inputY[icol]>=maxY)</div>
+<div class="line"><a name="l00458"></a><span class="lineno">  458</span>         binY=nbin-1;</div>
+<div class="line"><a name="l00459"></a><span class="lineno">  459</span>       <span class="keywordflow">else</span> <span class="keywordflow">if</span>(inputY[icol]<=minX)</div>
+<div class="line"><a name="l00460"></a><span class="lineno">  460</span>         binY=0;</div>
+<div class="line"><a name="l00461"></a><span class="lineno">  461</span>       <span class="keywordflow">else</span></div>
+<div class="line"><a name="l00462"></a><span class="lineno">  462</span>         binY=<span class="keyword">static_cast<</span><span class="keywordtype">int</span><span class="keyword">></span>(<span class="keyword">static_cast<</span><span class="keywordtype">double</span><span class="keyword">></span>(inputY[icol]-minY)/(maxY-minY)*nbin);</div>
+<div class="line"><a name="l00463"></a><span class="lineno">  463</span>       assert(binX>=0);</div>
+<div class="line"><a name="l00464"></a><span class="lineno">  464</span>       assert(binX<output.size());</div>
+<div class="line"><a name="l00465"></a><span class="lineno">  465</span>       assert(binY>=0);</div>
+<div class="line"><a name="l00466"></a><span class="lineno">  466</span>       assert(binY<output[binX].size());</div>
+<div class="line"><a name="l00467"></a><span class="lineno">  467</span>       <span class="keywordflow">if</span>(sigma>0){</div>
+<div class="line"><a name="l00468"></a><span class="lineno">  468</span>         <span class="comment">//create kde for Gaussian basis function</span></div>
+<div class="line"><a name="l00469"></a><span class="lineno">  469</span>         <span class="comment">//todo: speed up by calculating first and last bin with non-zero contriubtion...</span></div>
+<div class="line"><a name="l00470"></a><span class="lineno">  470</span>         <span class="keywordflow">for</span>(<span class="keywordtype">int</span> ibinX=0;ibinX<nbin;++ibinX){</div>
+<div class="line"><a name="l00471"></a><span class="lineno">  471</span>           <span class="keywordtype">double</span> centerX=minX+<span class="keyword">static_cast<</span><span class="keywordtype">double</span><span class="keyword">></span>(maxX-minX)*ibinX/nbin;</div>
+<div class="line"><a name="l00472"></a><span class="lineno">  472</span>           <span class="keywordtype">double</span> pdfX=gsl_ran_gaussian_pdf(inputX[icol]-centerX, sigma);</div>
+<div class="line"><a name="l00473"></a><span class="lineno">  473</span>           <span class="keywordflow">for</span>(<span class="keywordtype">int</span> ibinY=0;ibinY<nbin;++ibinY){</div>
+<div class="line"><a name="l00474"></a><span class="lineno">  474</span>         <span class="comment">//calculate  \integral_ibinX^(ibinX+1)</span></div>
+<div class="line"><a name="l00475"></a><span class="lineno">  475</span>         <span class="keywordtype">double</span> centerY=minY+<span class="keyword">static_cast<</span><span class="keywordtype">double</span><span class="keyword">></span>(maxY-minY)*ibinY/nbin;</div>
+<div class="line"><a name="l00476"></a><span class="lineno">  476</span>         <span class="keywordtype">double</span> pdfY=gsl_ran_gaussian_pdf(inputY[icol]-centerY, sigma);</div>
+<div class="line"><a name="l00477"></a><span class="lineno">  477</span>         output[ibinX][binY]+=pdfX*pdfY;</div>
+<div class="line"><a name="l00478"></a><span class="lineno">  478</span>           }</div>
+<div class="line"><a name="l00479"></a><span class="lineno">  479</span>         }</div>
+<div class="line"><a name="l00480"></a><span class="lineno">  480</span>       }</div>
+<div class="line"><a name="l00481"></a><span class="lineno">  481</span>       <span class="keywordflow">else</span></div>
+<div class="line"><a name="l00482"></a><span class="lineno">  482</span>         ++output[binX][binY];</div>
+<div class="line"><a name="l00483"></a><span class="lineno">  483</span>     }</div>
+<div class="line"><a name="l00484"></a><span class="lineno">  484</span>       }</div>
+<div class="line"><a name="l00485"></a><span class="lineno">  485</span>       <span class="keywordflow">if</span>(verbose_opt[0])</div>
+<div class="line"><a name="l00486"></a><span class="lineno">  486</span>     cout << <span class="stringliteral">"number of valid pixels: "</span> << nvalid << endl;</div>
+<div class="line"><a name="l00487"></a><span class="lineno">  487</span> </div>
+<div class="line"><a name="l00488"></a><span class="lineno">  488</span>       <span class="keywordflow">for</span>(<span class="keywordtype">int</span> binX=0;binX<nbin;++binX){</div>
+<div class="line"><a name="l00489"></a><span class="lineno">  489</span>     cout << endl;</div>
+<div class="line"><a name="l00490"></a><span class="lineno">  490</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> binY=0;binY<nbin;++binY){</div>
+<div class="line"><a name="l00491"></a><span class="lineno">  491</span>       <span class="keywordtype">double</span> binValueX=0;</div>
+<div class="line"><a name="l00492"></a><span class="lineno">  492</span>       <span class="keywordflow">if</span>(nbin==maxX-minX+1)</div>
+<div class="line"><a name="l00493"></a><span class="lineno">  493</span>         binValueX=minX+binX;</div>
+<div class="line"><a name="l00494"></a><span class="lineno">  494</span>       <span class="keywordflow">else</span></div>
+<div class="line"><a name="l00495"></a><span class="lineno">  495</span>         binValueX=minX+<span class="keyword">static_cast<</span><span class="keywordtype">double</span><span class="keyword">></span>(maxX-minX)*(binX+0.5)/nbin;</div>
+<div class="line"><a name="l00496"></a><span class="lineno">  496</span>       <span class="keywordtype">double</span> binValueY=0;</div>
+<div class="line"><a name="l00497"></a><span class="lineno">  497</span>       <span class="keywordflow">if</span>(nbin==maxY-minY+1)</div>
+<div class="line"><a name="l00498"></a><span class="lineno">  498</span>         binValueY=minY+binY;</div>
+<div class="line"><a name="l00499"></a><span class="lineno">  499</span>       <span class="keywordflow">else</span></div>
+<div class="line"><a name="l00500"></a><span class="lineno">  500</span>         binValueY=minY+<span class="keyword">static_cast<</span><span class="keywordtype">double</span><span class="keyword">></span>(maxY-minY)*(binY+0.5)/nbin;</div>
+<div class="line"><a name="l00501"></a><span class="lineno">  501</span> </div>
+<div class="line"><a name="l00502"></a><span class="lineno">  502</span>       <span class="keywordtype">double</span> value=<span class="keyword">static_cast<</span><span class="keywordtype">double</span><span class="keyword">></span>(output[binX][binY]);</div>
+<div class="line"><a name="l00503"></a><span class="lineno">  503</span>       </div>
+<div class="line"><a name="l00504"></a><span class="lineno">  504</span>       <span class="keywordflow">if</span>(relative_opt[0])</div>
+<div class="line"><a name="l00505"></a><span class="lineno">  505</span>         value*=100.0/nvalid;</div>
+<div class="line"><a name="l00506"></a><span class="lineno">  506</span> </div>
+<div class="line"><a name="l00507"></a><span class="lineno">  507</span>       cout << binValueX << <span class="stringliteral">" "</span> << binValueY << <span class="stringliteral">" "</span> << value << std::endl;</div>
+<div class="line"><a name="l00508"></a><span class="lineno">  508</span>       <span class="comment">// double value=static_cast<double>(output[binX][binY])/nvalid;</span></div>
+<div class="line"><a name="l00509"></a><span class="lineno">  509</span>       <span class="comment">// cout << (maxX-minX)*bin/(nbin-1)+minX << " " << (maxY-minY)*bin/(nbin-1)+minY << " " << value << std::endl;</span></div>
 <div class="line"><a name="l00510"></a><span class="lineno">  510</span>     }</div>
-<div class="line"><a name="l00511"></a><span class="lineno">  511</span>     <span class="keywordflow">if</span>(regerr_opt[0]&&input_opt.size()<2){</div>
-<div class="line"><a name="l00512"></a><span class="lineno">  512</span>       <span class="keywordflow">if</span>(band_opt.size()<2)</div>
-<div class="line"><a name="l00513"></a><span class="lineno">  513</span>     <span class="keywordflow">continue</span>;</div>
-<div class="line"><a name="l00514"></a><span class="lineno">  514</span>       imgreg.setDown(down_opt[0]);</div>
-<div class="line"><a name="l00515"></a><span class="lineno">  515</span>       imgreg.setThreshold(random_opt[0]);</div>
-<div class="line"><a name="l00516"></a><span class="lineno">  516</span>       <span class="keywordtype">double</span> c0=0;<span class="comment">//offset</span></div>
-<div class="line"><a name="l00517"></a><span class="lineno">  517</span>       <span class="keywordtype">double</span> c1=1;<span class="comment">//scale</span></div>
-<div class="line"><a name="l00518"></a><span class="lineno">  518</span>       <span class="keywordtype">double</span> err=imgreg.getRMSE(imgReader,band_opt[0],band_opt[1],c0,c1,verbose_opt[0]);</div>
-<div class="line"><a name="l00519"></a><span class="lineno">  519</span>       std::cout << <span class="stringliteral">"-c0 "</span> << c0 << <span class="stringliteral">" -c1 "</span> << c1 << <span class="stringliteral">" -rmse "</span> << err << std::endl;</div>
-<div class="line"><a name="l00520"></a><span class="lineno">  520</span>     }</div>
-<div class="line"><a name="l00521"></a><span class="lineno">  521</span>     <span class="keywordflow">if</span>(rmse_opt[0]&&input_opt.size()<2){</div>
-<div class="line"><a name="l00522"></a><span class="lineno">  522</span>       <span class="keywordflow">if</span>(band_opt.size()<2)</div>
-<div class="line"><a name="l00523"></a><span class="lineno">  523</span>     <span class="keywordflow">continue</span>;</div>
-<div class="line"><a name="l00524"></a><span class="lineno">  524</span>       imgreg.setDown(down_opt[0]);</div>
-<div class="line"><a name="l00525"></a><span class="lineno">  525</span>       imgreg.setThreshold(random_opt[0]);</div>
-<div class="line"><a name="l00526"></a><span class="lineno">  526</span>       <span class="keywordtype">double</span> c0=0;<span class="comment">//offset</span></div>
-<div class="line"><a name="l00527"></a><span class="lineno">  527</span>       <span class="keywordtype">double</span> c1=1;<span class="comment">//scale</span></div>
-<div class="line"><a name="l00528"></a><span class="lineno">  528</span>       <span class="keywordtype">double</span> err=imgreg.getRMSE(imgReader,band_opt[0],band_opt[1],c0,c1,verbose_opt[0]);</div>
-<div class="line"><a name="l00529"></a><span class="lineno">  529</span>       std::cout << <span class="stringliteral">" -rmse "</span> << err << std::endl;</div>
-<div class="line"><a name="l00530"></a><span class="lineno">  530</span>     }</div>
-<div class="line"><a name="l00531"></a><span class="lineno">  531</span>     <span class="keywordflow">if</span>(preg_opt[0]&&input_opt.size()<2){</div>
-<div class="line"><a name="l00532"></a><span class="lineno">  532</span>       <span class="keywordflow">if</span>(band_opt.size()<2)</div>
-<div class="line"><a name="l00533"></a><span class="lineno">  533</span>     <span class="keywordflow">continue</span>;</div>
-<div class="line"><a name="l00534"></a><span class="lineno">  534</span>       imgreg.setDown(down_opt[0]);</div>
-<div class="line"><a name="l00535"></a><span class="lineno">  535</span>       imgreg.setThreshold(random_opt[0]);</div>
-<div class="line"><a name="l00536"></a><span class="lineno">  536</span>       <span class="keywordtype">double</span> c0=0;<span class="comment">//offset</span></div>
-<div class="line"><a name="l00537"></a><span class="lineno">  537</span>       <span class="keywordtype">double</span> c1=1;<span class="comment">//scale</span></div>
-<div class="line"><a name="l00538"></a><span class="lineno">  538</span>       <span class="keywordtype">double</span> r2=imgreg.pgetR2(imgReader,band_opt[0],band_opt[1],c0,c1,verbose_opt[0]);</div>
-<div class="line"><a name="l00539"></a><span class="lineno">  539</span>       std::cout << <span class="stringliteral">"-c0 "</span> << c0 << <span class="stringliteral">" -c1 "</span> << c1 << <span class="stringliteral">" -r2 "</span> << r2 << std::endl;</div>
-<div class="line"><a name="l00540"></a><span class="lineno">  540</span>     }</div>
-<div class="line"><a name="l00541"></a><span class="lineno">  541</span>     imgReader.close();</div>
-<div class="line"><a name="l00542"></a><span class="lineno">  542</span>   }</div>
-<div class="line"><a name="l00543"></a><span class="lineno">  543</span>   <span class="keywordflow">if</span>(reg_opt[0]&&(input_opt.size()>1)){</div>
-<div class="line"><a name="l00544"></a><span class="lineno">  544</span>     imgreg.setDown(down_opt[0]);</div>
-<div class="line"><a name="l00545"></a><span class="lineno">  545</span>     imgreg.setThreshold(random_opt[0]);</div>
-<div class="line"><a name="l00546"></a><span class="lineno">  546</span>     <span class="keywordtype">double</span> c0=0;<span class="comment">//offset</span></div>
-<div class="line"><a name="l00547"></a><span class="lineno">  547</span>     <span class="keywordtype">double</span> c1=1;<span class="comment">//scale</span></div>
-<div class="line"><a name="l00548"></a><span class="lineno">  548</span>     <span class="keywordflow">while</span>(band_opt.size()<input_opt.size())</div>
-<div class="line"><a name="l00549"></a><span class="lineno">  549</span>       band_opt.push_back(band_opt[0]);</div>
-<div class="line"><a name="l00550"></a><span class="lineno">  550</span>     <span class="keywordflow">if</span>(src_min_opt.size()){</div>
-<div class="line"><a name="l00551"></a><span class="lineno">  551</span>       <span class="keywordflow">while</span>(src_min_opt.size()<input_opt.size())</div>
-<div class="line"><a name="l00552"></a><span class="lineno">  552</span>     src_min_opt.push_back(src_min_opt[0]);</div>
-<div class="line"><a name="l00553"></a><span class="lineno">  553</span>     }</div>
-<div class="line"><a name="l00554"></a><span class="lineno">  554</span>     <span class="keywordflow">if</span>(src_max_opt.size()){</div>
-<div class="line"><a name="l00555"></a><span class="lineno">  555</span>       <span class="keywordflow">while</span>(src_max_opt.size()<input_opt.size())</div>
-<div class="line"><a name="l00556"></a><span class="lineno">  556</span>     src_max_opt.push_back(src_max_opt[0]);</div>
-<div class="line"><a name="l00557"></a><span class="lineno">  557</span>     }</div>
-<div class="line"><a name="l00558"></a><span class="lineno">  558</span>     <a class="code" href="classImgReaderGdal.html">ImgReaderGdal</a> imgReader1(input_opt[0]);</div>
-<div class="line"><a name="l00559"></a><span class="lineno">  559</span>     <a class="code" href="classImgReaderGdal.html">ImgReaderGdal</a> imgReader2(input_opt[1]);</div>
-<div class="line"><a name="l00560"></a><span class="lineno">  560</span> </div>
-<div class="line"><a name="l00561"></a><span class="lineno">  561</span>     <span class="keywordflow">if</span>(offset_opt.size())</div>
-<div class="line"><a name="l00562"></a><span class="lineno">  562</span>       imgReader1.setOffset(offset_opt[0],band_opt[0]);</div>
-<div class="line"><a name="l00563"></a><span class="lineno">  563</span>     <span class="keywordflow">if</span>(scale_opt.size())</div>
-<div class="line"><a name="l00564"></a><span class="lineno">  564</span>       imgReader1.setScale(scale_opt[0],band_opt[0]);</div>
-<div class="line"><a name="l00565"></a><span class="lineno">  565</span>     <span class="keywordflow">if</span>(offset_opt.size()>1)</div>
-<div class="line"><a name="l00566"></a><span class="lineno">  566</span>       imgReader2.setOffset(offset_opt[1],band_opt[1]);</div>
-<div class="line"><a name="l00567"></a><span class="lineno">  567</span>     <span class="keywordflow">if</span>(scale_opt.size()>1)</div>
-<div class="line"><a name="l00568"></a><span class="lineno">  568</span>       imgReader2.setScale(scale_opt[1],band_opt[1]);</div>
-<div class="line"><a name="l00569"></a><span class="lineno">  569</span> </div>
-<div class="line"><a name="l00570"></a><span class="lineno">  570</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> inodata=0;inodata<nodata_opt.size();++inodata){</div>
-<div class="line"><a name="l00571"></a><span class="lineno">  571</span>       <span class="keywordflow">if</span>(!inodata){</div>
-<div class="line"><a name="l00572"></a><span class="lineno">  572</span>         imgReader1.GDALSetNoDataValue(nodata_opt[0],band_opt[0]);<span class="comment">//only single no data can be set in GDALRasterBand (used for ComputeStatistics)</span></div>
-<div class="line"><a name="l00573"></a><span class="lineno">  573</span>         imgReader2.GDALSetNoDataValue(nodata_opt[0]),band_opt[1];<span class="comment">//only single no data can be set in GDALRasterBand (used for ComputeStatistics)</span></div>
-<div class="line"><a name="l00574"></a><span class="lineno">  574</span>       }</div>
-<div class="line"><a name="l00575"></a><span class="lineno">  575</span>       imgReader1.pushNoDataValue(nodata_opt[inodata]);</div>
-<div class="line"><a name="l00576"></a><span class="lineno">  576</span>       imgReader2.pushNoDataValue(nodata_opt[inodata]);</div>
-<div class="line"><a name="l00577"></a><span class="lineno">  577</span>     }</div>
-<div class="line"><a name="l00578"></a><span class="lineno">  578</span> </div>
-<div class="line"><a name="l00579"></a><span class="lineno">  579</span>     <span class="keywordtype">double</span> r2=imgreg.getR2(imgReader1,imgReader2,c0,c1,band_opt[0],band_opt[1],verbose_opt[0]);</div>
-<div class="line"><a name="l00580"></a><span class="lineno">  580</span>     std::cout << <span class="stringliteral">"-c0 "</span> << c0 << <span class="stringliteral">" -c1 "</span> << c1 << <span class="stringliteral">" -r2 "</span> << r2 << std::endl;</div>
-<div class="line"><a name="l00581"></a><span class="lineno">  581</span>     imgReader1.close();</div>
-<div class="line"><a name="l00582"></a><span class="lineno">  582</span>     imgReader2.close();</div>
-<div class="line"><a name="l00583"></a><span class="lineno">  583</span>   }</div>
-<div class="line"><a name="l00584"></a><span class="lineno">  584</span>   <span class="keywordflow">if</span>(preg_opt[0]&&(input_opt.size()>1)){</div>
-<div class="line"><a name="l00585"></a><span class="lineno">  585</span>     imgreg.setDown(down_opt[0]);</div>
-<div class="line"><a name="l00586"></a><span class="lineno">  586</span>     imgreg.setThreshold(random_opt[0]);</div>
-<div class="line"><a name="l00587"></a><span class="lineno">  587</span>     <span class="keywordtype">double</span> c0=0;<span class="comment">//offset</span></div>
-<div class="line"><a name="l00588"></a><span class="lineno">  588</span>     <span class="keywordtype">double</span> c1=1;<span class="comment">//scale</span></div>
-<div class="line"><a name="l00589"></a><span class="lineno">  589</span>     <span class="keywordflow">while</span>(band_opt.size()<input_opt.size())</div>
-<div class="line"><a name="l00590"></a><span class="lineno">  590</span>       band_opt.push_back(band_opt[0]);</div>
-<div class="line"><a name="l00591"></a><span class="lineno">  591</span>     <span class="keywordflow">if</span>(src_min_opt.size()){</div>
-<div class="line"><a name="l00592"></a><span class="lineno">  592</span>       <span class="keywordflow">while</span>(src_min_opt.size()<input_opt.size())</div>
-<div class="line"><a name="l00593"></a><span class="lineno">  593</span>     src_min_opt.push_back(src_min_opt[0]);</div>
-<div class="line"><a name="l00594"></a><span class="lineno">  594</span>     }</div>
-<div class="line"><a name="l00595"></a><span class="lineno">  595</span>     <span class="keywordflow">if</span>(src_max_opt.size()){</div>
-<div class="line"><a name="l00596"></a><span class="lineno">  596</span>       <span class="keywordflow">while</span>(src_max_opt.size()<input_opt.size())</div>
-<div class="line"><a name="l00597"></a><span class="lineno">  597</span>     src_max_opt.push_back(src_max_opt[0]);</div>
-<div class="line"><a name="l00598"></a><span class="lineno">  598</span>     }</div>
-<div class="line"><a name="l00599"></a><span class="lineno">  599</span>     <a class="code" href="classImgReaderGdal.html">ImgReaderGdal</a> imgReader1(input_opt[0]);</div>
-<div class="line"><a name="l00600"></a><span class="lineno">  600</span>     <a class="code" href="classImgReaderGdal.html">ImgReaderGdal</a> imgReader2(input_opt[1]);</div>
-<div class="line"><a name="l00601"></a><span class="lineno">  601</span> </div>
-<div class="line"><a name="l00602"></a><span class="lineno">  602</span>     <span class="keywordflow">if</span>(offset_opt.size())</div>
-<div class="line"><a name="l00603"></a><span class="lineno">  603</span>       imgReader1.setOffset(offset_opt[0],band_opt[0]);</div>
-<div class="line"><a name="l00604"></a><span class="lineno">  604</span>     <span class="keywordflow">if</span>(scale_opt.size())</div>
-<div class="line"><a name="l00605"></a><span class="lineno">  605</span>       imgReader1.setScale(scale_opt[0],band_opt[0]);</div>
-<div class="line"><a name="l00606"></a><span class="lineno">  606</span>     <span class="keywordflow">if</span>(offset_opt.size()>1)</div>
-<div class="line"><a name="l00607"></a><span class="lineno">  607</span>       imgReader2.setOffset(offset_opt[1],band_opt[1]);</div>
-<div class="line"><a name="l00608"></a><span class="lineno">  608</span>     <span class="keywordflow">if</span>(scale_opt.size()>1)</div>
-<div class="line"><a name="l00609"></a><span class="lineno">  609</span>       imgReader2.setScale(scale_opt[1],band_opt[1]);</div>
-<div class="line"><a name="l00610"></a><span class="lineno">  610</span> </div>
-<div class="line"><a name="l00611"></a><span class="lineno">  611</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> inodata=0;inodata<nodata_opt.size();++inodata){</div>
-<div class="line"><a name="l00612"></a><span class="lineno">  612</span>       <span class="keywordflow">if</span>(!inodata){</div>
-<div class="line"><a name="l00613"></a><span class="lineno">  613</span>         imgReader1.GDALSetNoDataValue(nodata_opt[0],band_opt[0]);<span class="comment">//only single no data can be set in GDALRasterBand (used for ComputeStatistics)</span></div>
-<div class="line"><a name="l00614"></a><span class="lineno">  614</span>         imgReader2.GDALSetNoDataValue(nodata_opt[0]),band_opt[1];<span class="comment">//only single no data can be set in GDALRasterBand (used for ComputeStatistics)</span></div>
-<div class="line"><a name="l00615"></a><span class="lineno">  615</span>       }</div>
-<div class="line"><a name="l00616"></a><span class="lineno">  616</span>       imgReader1.pushNoDataValue(nodata_opt[inodata]);</div>
-<div class="line"><a name="l00617"></a><span class="lineno">  617</span>       imgReader2.pushNoDataValue(nodata_opt[inodata]);</div>
-<div class="line"><a name="l00618"></a><span class="lineno">  618</span>     }</div>
-<div class="line"><a name="l00619"></a><span class="lineno">  619</span> </div>
-<div class="line"><a name="l00620"></a><span class="lineno">  620</span>     <span class="keywordtype">double</span> r2=imgreg.pgetR2(imgReader1,imgReader2,c0,c1,band_opt[0],band_opt[1],verbose_opt[0]);</div>
-<div class="line"><a name="l00621"></a><span class="lineno">  621</span>     std::cout << <span class="stringliteral">"-c0 "</span> << c0 << <span class="stringliteral">" -c1 "</span> << c1 << <span class="stringliteral">" -r2 "</span> << r2 << std::endl;</div>
-<div class="line"><a name="l00622"></a><span class="lineno">  622</span>     imgReader1.close();</div>
-<div class="line"><a name="l00623"></a><span class="lineno">  623</span>     imgReader2.close();</div>
-<div class="line"><a name="l00624"></a><span class="lineno">  624</span>   }</div>
-<div class="line"><a name="l00625"></a><span class="lineno">  625</span>   <span class="keywordflow">if</span>(regerr_opt[0]&&(input_opt.size()>1)){</div>
-<div class="line"><a name="l00626"></a><span class="lineno">  626</span>     imgreg.setDown(down_opt[0]);</div>
-<div class="line"><a name="l00627"></a><span class="lineno">  627</span>     imgreg.setThreshold(random_opt[0]);</div>
-<div class="line"><a name="l00628"></a><span class="lineno">  628</span>     <span class="keywordtype">double</span> c0=0;<span class="comment">//offset</span></div>
-<div class="line"><a name="l00629"></a><span class="lineno">  629</span>     <span class="keywordtype">double</span> c1=1;<span class="comment">//scale</span></div>
-<div class="line"><a name="l00630"></a><span class="lineno">  630</span>     <span class="keywordflow">while</span>(band_opt.size()<input_opt.size())</div>
-<div class="line"><a name="l00631"></a><span class="lineno">  631</span>       band_opt.push_back(band_opt[0]);</div>
-<div class="line"><a name="l00632"></a><span class="lineno">  632</span>     <span class="keywordflow">if</span>(src_min_opt.size()){</div>
-<div class="line"><a name="l00633"></a><span class="lineno">  633</span>       <span class="keywordflow">while</span>(src_min_opt.size()<input_opt.size())</div>
-<div class="line"><a name="l00634"></a><span class="lineno">  634</span>     src_min_opt.push_back(src_min_opt[0]);</div>
-<div class="line"><a name="l00635"></a><span class="lineno">  635</span>     }</div>
-<div class="line"><a name="l00636"></a><span class="lineno">  636</span>     <span class="keywordflow">if</span>(src_max_opt.size()){</div>
-<div class="line"><a name="l00637"></a><span class="lineno">  637</span>       <span class="keywordflow">while</span>(src_max_opt.size()<input_opt.size())</div>
-<div class="line"><a name="l00638"></a><span class="lineno">  638</span>     src_max_opt.push_back(src_max_opt[0]);</div>
-<div class="line"><a name="l00639"></a><span class="lineno">  639</span>     }</div>
-<div class="line"><a name="l00640"></a><span class="lineno">  640</span>     <a class="code" href="classImgReaderGdal.html">ImgReaderGdal</a> imgReader1(input_opt[0]);</div>
-<div class="line"><a name="l00641"></a><span class="lineno">  641</span>     <a class="code" href="classImgReaderGdal.html">ImgReaderGdal</a> imgReader2(input_opt[1]);</div>
-<div class="line"><a name="l00642"></a><span class="lineno">  642</span> </div>
-<div class="line"><a name="l00643"></a><span class="lineno">  643</span>     <span class="keywordflow">if</span>(offset_opt.size())</div>
-<div class="line"><a name="l00644"></a><span class="lineno">  644</span>       imgReader1.setOffset(offset_opt[0],band_opt[0]);</div>
-<div class="line"><a name="l00645"></a><span class="lineno">  645</span>     <span class="keywordflow">if</span>(scale_opt.size())</div>
-<div class="line"><a name="l00646"></a><span class="lineno">  646</span>       imgReader1.setScale(scale_opt[0],band_opt[0]);</div>
-<div class="line"><a name="l00647"></a><span class="lineno">  647</span>     <span class="keywordflow">if</span>(offset_opt.size()>1)</div>
-<div class="line"><a name="l00648"></a><span class="lineno">  648</span>       imgReader2.setOffset(offset_opt[1],band_opt[1]);</div>
-<div class="line"><a name="l00649"></a><span class="lineno">  649</span>     <span class="keywordflow">if</span>(scale_opt.size()>1)</div>
-<div class="line"><a name="l00650"></a><span class="lineno">  650</span>       imgReader2.setScale(scale_opt[1],band_opt[1]);</div>
-<div class="line"><a name="l00651"></a><span class="lineno">  651</span> </div>
-<div class="line"><a name="l00652"></a><span class="lineno">  652</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> inodata=0;inodata<nodata_opt.size();++inodata){</div>
-<div class="line"><a name="l00653"></a><span class="lineno">  653</span>       <span class="keywordflow">if</span>(!inodata){</div>
-<div class="line"><a name="l00654"></a><span class="lineno">  654</span>         imgReader1.GDALSetNoDataValue(nodata_opt[0],band_opt[0]);<span class="comment">//only single no data can be set in GDALRasterBand (used for ComputeStatistics)</span></div>
-<div class="line"><a name="l00655"></a><span class="lineno">  655</span>         imgReader2.GDALSetNoDataValue(nodata_opt[0]),band_opt[1];<span class="comment">//only single no data can be set in GDALRasterBand (used for ComputeStatistics)</span></div>
-<div class="line"><a name="l00656"></a><span class="lineno">  656</span>       }</div>
-<div class="line"><a name="l00657"></a><span class="lineno">  657</span>       imgReader1.pushNoDataValue(nodata_opt[inodata]);</div>
-<div class="line"><a name="l00658"></a><span class="lineno">  658</span>       imgReader2.pushNoDataValue(nodata_opt[inodata]);</div>
-<div class="line"><a name="l00659"></a><span class="lineno">  659</span>     }</div>
-<div class="line"><a name="l00660"></a><span class="lineno">  660</span> </div>
-<div class="line"><a name="l00661"></a><span class="lineno">  661</span>     <span class="keywordtype">double</span> err=imgreg.getRMSE(imgReader1,imgReader2,c0,c1,band_opt[0],band_opt[1],verbose_opt[0]);</div>
-<div class="line"><a name="l00662"></a><span class="lineno">  662</span>     std::cout << <span class="stringliteral">"-c0 "</span> << c0 << <span class="stringliteral">" -c1 "</span> << c1 << <span class="stringliteral">" -rmse "</span> << err << std::endl;</div>
-<div class="line"><a name="l00663"></a><span class="lineno">  663</span>     imgReader1.close();</div>
-<div class="line"><a name="l00664"></a><span class="lineno">  664</span>     imgReader2.close();</div>
-<div class="line"><a name="l00665"></a><span class="lineno">  665</span>   }</div>
-<div class="line"><a name="l00666"></a><span class="lineno">  666</span>   <span class="keywordflow">if</span>(rmse_opt[0]&&(input_opt.size()>1)){</div>
-<div class="line"><a name="l00667"></a><span class="lineno">  667</span>     imgreg.setDown(down_opt[0]);</div>
-<div class="line"><a name="l00668"></a><span class="lineno">  668</span>     imgreg.setThreshold(random_opt[0]);</div>
-<div class="line"><a name="l00669"></a><span class="lineno">  669</span>     <span class="keywordtype">double</span> c0=0;<span class="comment">//offset</span></div>
-<div class="line"><a name="l00670"></a><span class="lineno">  670</span>     <span class="keywordtype">double</span> c1=1;<span class="comment">//scale</span></div>
-<div class="line"><a name="l00671"></a><span class="lineno">  671</span>     <span class="keywordflow">while</span>(band_opt.size()<input_opt.size())</div>
-<div class="line"><a name="l00672"></a><span class="lineno">  672</span>       band_opt.push_back(band_opt[0]);</div>
-<div class="line"><a name="l00673"></a><span class="lineno">  673</span>     <span class="keywordflow">if</span>(src_min_opt.size()){</div>
-<div class="line"><a name="l00674"></a><span class="lineno">  674</span>       <span class="keywordflow">while</span>(src_min_opt.size()<input_opt.size())</div>
-<div class="line"><a name="l00675"></a><span class="lineno">  675</span>     src_min_opt.push_back(src_min_opt[0]);</div>
-<div class="line"><a name="l00676"></a><span class="lineno">  676</span>     }</div>
-<div class="line"><a name="l00677"></a><span class="lineno">  677</span>     <span class="keywordflow">if</span>(src_max_opt.size()){</div>
-<div class="line"><a name="l00678"></a><span class="lineno">  678</span>       <span class="keywordflow">while</span>(src_max_opt.size()<input_opt.size())</div>
-<div class="line"><a name="l00679"></a><span class="lineno">  679</span>     src_max_opt.push_back(src_max_opt[0]);</div>
-<div class="line"><a name="l00680"></a><span class="lineno">  680</span>     }</div>
-<div class="line"><a name="l00681"></a><span class="lineno">  681</span>     <a class="code" href="classImgReaderGdal.html">ImgReaderGdal</a> imgReader1(input_opt[0]);</div>
-<div class="line"><a name="l00682"></a><span class="lineno">  682</span>     <a class="code" href="classImgReaderGdal.html">ImgReaderGdal</a> imgReader2(input_opt[1]);</div>
-<div class="line"><a name="l00683"></a><span class="lineno">  683</span> </div>
-<div class="line"><a name="l00684"></a><span class="lineno">  684</span>     <span class="keywordflow">if</span>(offset_opt.size())</div>
-<div class="line"><a name="l00685"></a><span class="lineno">  685</span>       imgReader1.setOffset(offset_opt[0],band_opt[0]);</div>
-<div class="line"><a name="l00686"></a><span class="lineno">  686</span>     <span class="keywordflow">if</span>(scale_opt.size())</div>
-<div class="line"><a name="l00687"></a><span class="lineno">  687</span>       imgReader1.setScale(scale_opt[0],band_opt[0]);</div>
-<div class="line"><a name="l00688"></a><span class="lineno">  688</span>     <span class="keywordflow">if</span>(offset_opt.size()>1)</div>
-<div class="line"><a name="l00689"></a><span class="lineno">  689</span>       imgReader2.setOffset(offset_opt[1],band_opt[1]);</div>
-<div class="line"><a name="l00690"></a><span class="lineno">  690</span>     <span class="keywordflow">if</span>(scale_opt.size()>1)</div>
-<div class="line"><a name="l00691"></a><span class="lineno">  691</span>       imgReader2.setScale(scale_opt[1],band_opt[1]);</div>
-<div class="line"><a name="l00692"></a><span class="lineno">  692</span> </div>
-<div class="line"><a name="l00693"></a><span class="lineno">  693</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> inodata=0;inodata<nodata_opt.size();++inodata){</div>
-<div class="line"><a name="l00694"></a><span class="lineno">  694</span>       <span class="keywordflow">if</span>(!inodata){</div>
-<div class="line"><a name="l00695"></a><span class="lineno">  695</span>         imgReader1.GDALSetNoDataValue(nodata_opt[0],band_opt[0]);<span class="comment">//only single no data can be set in GDALRasterBand (used for ComputeStatistics)</span></div>
-<div class="line"><a name="l00696"></a><span class="lineno">  696</span>         imgReader2.GDALSetNoDataValue(nodata_opt[0]),band_opt[1];<span class="comment">//only single no data can be set in GDALRasterBand (used for ComputeStatistics)</span></div>
-<div class="line"><a name="l00697"></a><span class="lineno">  697</span>       }</div>
-<div class="line"><a name="l00698"></a><span class="lineno">  698</span>       imgReader1.pushNoDataValue(nodata_opt[inodata]);</div>
-<div class="line"><a name="l00699"></a><span class="lineno">  699</span>       imgReader2.pushNoDataValue(nodata_opt[inodata]);</div>
-<div class="line"><a name="l00700"></a><span class="lineno">  700</span>     }</div>
-<div class="line"><a name="l00701"></a><span class="lineno">  701</span> </div>
-<div class="line"><a name="l00702"></a><span class="lineno">  702</span>     <span class="keywordtype">double</span> err=imgreg.getRMSE(imgReader1,imgReader2,c0,c1,band_opt[0],band_opt[1],verbose_opt[0]);</div>
-<div class="line"><a name="l00703"></a><span class="lineno">  703</span>     std::cout << <span class="stringliteral">"-rmse "</span> << err << std::endl;</div>
-<div class="line"><a name="l00704"></a><span class="lineno">  704</span>     imgReader1.close();</div>
-<div class="line"><a name="l00705"></a><span class="lineno">  705</span>     imgReader2.close();</div>
-<div class="line"><a name="l00706"></a><span class="lineno">  706</span>   }</div>
-<div class="line"><a name="l00707"></a><span class="lineno">  707</span>   <span class="keywordflow">if</span>(histogram2d_opt[0]&&(input_opt.size()>1)){</div>
-<div class="line"><a name="l00708"></a><span class="lineno">  708</span>     <span class="keywordflow">while</span>(band_opt.size()<input_opt.size())</div>
-<div class="line"><a name="l00709"></a><span class="lineno">  709</span>       band_opt.push_back(band_opt[0]);</div>
-<div class="line"><a name="l00710"></a><span class="lineno">  710</span>     <span class="keywordflow">if</span>(src_min_opt.size()){</div>
-<div class="line"><a name="l00711"></a><span class="lineno">  711</span>       <span class="keywordflow">while</span>(src_min_opt.size()<input_opt.size())</div>
-<div class="line"><a name="l00712"></a><span class="lineno">  712</span>     src_min_opt.push_back(src_min_opt[0]);</div>
-<div class="line"><a name="l00713"></a><span class="lineno">  713</span>     }</div>
-<div class="line"><a name="l00714"></a><span class="lineno">  714</span>     <span class="keywordflow">if</span>(src_max_opt.size()){</div>
-<div class="line"><a name="l00715"></a><span class="lineno">  715</span>       <span class="keywordflow">while</span>(src_max_opt.size()<input_opt.size())</div>
-<div class="line"><a name="l00716"></a><span class="lineno">  716</span>     src_max_opt.push_back(src_max_opt[0]);</div>
-<div class="line"><a name="l00717"></a><span class="lineno">  717</span>     }</div>
-<div class="line"><a name="l00718"></a><span class="lineno">  718</span>     <a class="code" href="classImgReaderGdal.html">ImgReaderGdal</a> imgReader1(input_opt[0]);</div>
-<div class="line"><a name="l00719"></a><span class="lineno">  719</span>     <a class="code" href="classImgReaderGdal.html">ImgReaderGdal</a> imgReader2(input_opt[1]);</div>
-<div class="line"><a name="l00720"></a><span class="lineno">  720</span> </div>
-<div class="line"><a name="l00721"></a><span class="lineno">  721</span>     <span class="keywordflow">if</span>(offset_opt.size())</div>
-<div class="line"><a name="l00722"></a><span class="lineno">  722</span>       imgReader1.setOffset(offset_opt[0],band_opt[0]);</div>
-<div class="line"><a name="l00723"></a><span class="lineno">  723</span>     <span class="keywordflow">if</span>(scale_opt.size())</div>
-<div class="line"><a name="l00724"></a><span class="lineno">  724</span>       imgReader1.setScale(scale_opt[0],band_opt[0]);</div>
-<div class="line"><a name="l00725"></a><span class="lineno">  725</span>     <span class="keywordflow">if</span>(offset_opt.size()>1)</div>
-<div class="line"><a name="l00726"></a><span class="lineno">  726</span>       imgReader2.setOffset(offset_opt[1],band_opt[1]);</div>
-<div class="line"><a name="l00727"></a><span class="lineno">  727</span>     <span class="keywordflow">if</span>(scale_opt.size()>1)</div>
-<div class="line"><a name="l00728"></a><span class="lineno">  728</span>       imgReader2.setScale(scale_opt[1],band_opt[1]);</div>
-<div class="line"><a name="l00729"></a><span class="lineno">  729</span> </div>
-<div class="line"><a name="l00730"></a><span class="lineno">  730</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> inodata=0;inodata<nodata_opt.size();++inodata){</div>
-<div class="line"><a name="l00731"></a><span class="lineno">  731</span>       <span class="keywordflow">if</span>(!inodata){</div>
-<div class="line"><a name="l00732"></a><span class="lineno">  732</span>         imgReader1.GDALSetNoDataValue(nodata_opt[0],band_opt[0]);<span class="comment">//only single no data can be set in GDALRasterBand (used for ComputeStatistics)</span></div>
-<div class="line"><a name="l00733"></a><span class="lineno">  733</span>         imgReader2.GDALSetNoDataValue(nodata_opt[0]),band_opt[1];<span class="comment">//only single no data can be set in GDALRasterBand (used for ComputeStatistics)</span></div>
-<div class="line"><a name="l00734"></a><span class="lineno">  734</span>       }</div>
-<div class="line"><a name="l00735"></a><span class="lineno">  735</span>       imgReader1.pushNoDataValue(nodata_opt[inodata]);</div>
-<div class="line"><a name="l00736"></a><span class="lineno">  736</span>       imgReader2.pushNoDataValue(nodata_opt[inodata]);</div>
-<div class="line"><a name="l00737"></a><span class="lineno">  737</span>     }</div>
-<div class="line"><a name="l00738"></a><span class="lineno">  738</span> </div>
-<div class="line"><a name="l00739"></a><span class="lineno">  739</span>     imgReader1.getMinMax(minX,maxX,band_opt[0]);</div>
-<div class="line"><a name="l00740"></a><span class="lineno">  740</span>     imgReader2.getMinMax(minY,maxY,band_opt[1]);</div>
+<div class="line"><a name="l00511"></a><span class="lineno">  511</span>       }</div>
+<div class="line"><a name="l00512"></a><span class="lineno">  512</span>     }</div>
+<div class="line"><a name="l00513"></a><span class="lineno">  513</span>     <span class="keywordflow">if</span>(reg_opt[0]&&input_opt.size()<2){</div>
+<div class="line"><a name="l00514"></a><span class="lineno">  514</span>       <span class="keywordflow">if</span>(band_opt.size()<2)</div>
+<div class="line"><a name="l00515"></a><span class="lineno">  515</span>     <span class="keywordflow">continue</span>;</div>
+<div class="line"><a name="l00516"></a><span class="lineno">  516</span>       imgreg.setDown(down_opt[0]);</div>
+<div class="line"><a name="l00517"></a><span class="lineno">  517</span>       imgreg.setThreshold(random_opt[0]);</div>
+<div class="line"><a name="l00518"></a><span class="lineno">  518</span>       <span class="keywordtype">double</span> c0=0;<span class="comment">//offset</span></div>
+<div class="line"><a name="l00519"></a><span class="lineno">  519</span>       <span class="keywordtype">double</span> c1=1;<span class="comment">//scale</span></div>
+<div class="line"><a name="l00520"></a><span class="lineno">  520</span>       <span class="keywordtype">double</span> r2=imgreg.getR2(imgReader,band_opt[0],band_opt[1],c0,c1,verbose_opt[0]);</div>
+<div class="line"><a name="l00521"></a><span class="lineno">  521</span>       std::cout << <span class="stringliteral">"-c0 "</span> << c0 << <span class="stringliteral">" -c1 "</span> << c1 << <span class="stringliteral">" -r2 "</span> << r2 << std::endl;</div>
+<div class="line"><a name="l00522"></a><span class="lineno">  522</span>     }</div>
+<div class="line"><a name="l00523"></a><span class="lineno">  523</span>     <span class="keywordflow">if</span>(regerr_opt[0]&&input_opt.size()<2){</div>
+<div class="line"><a name="l00524"></a><span class="lineno">  524</span>       <span class="keywordflow">if</span>(band_opt.size()<2)</div>
+<div class="line"><a name="l00525"></a><span class="lineno">  525</span>     <span class="keywordflow">continue</span>;</div>
+<div class="line"><a name="l00526"></a><span class="lineno">  526</span>       imgreg.setDown(down_opt[0]);</div>
+<div class="line"><a name="l00527"></a><span class="lineno">  527</span>       imgreg.setThreshold(random_opt[0]);</div>
+<div class="line"><a name="l00528"></a><span class="lineno">  528</span>       <span class="keywordtype">double</span> c0=0;<span class="comment">//offset</span></div>
+<div class="line"><a name="l00529"></a><span class="lineno">  529</span>       <span class="keywordtype">double</span> c1=1;<span class="comment">//scale</span></div>
+<div class="line"><a name="l00530"></a><span class="lineno">  530</span>       <span class="keywordtype">double</span> err=imgreg.getRMSE(imgReader,band_opt[0],band_opt[1],c0,c1,verbose_opt[0]);</div>
+<div class="line"><a name="l00531"></a><span class="lineno">  531</span>       std::cout << <span class="stringliteral">"-c0 "</span> << c0 << <span class="stringliteral">" -c1 "</span> << c1 << <span class="stringliteral">" -rmse "</span> << err << std::endl;</div>
+<div class="line"><a name="l00532"></a><span class="lineno">  532</span>     }</div>
+<div class="line"><a name="l00533"></a><span class="lineno">  533</span>     <span class="keywordflow">if</span>(rmse_opt[0]&&input_opt.size()<2){</div>
+<div class="line"><a name="l00534"></a><span class="lineno">  534</span>       <span class="keywordflow">if</span>(band_opt.size()<2)</div>
+<div class="line"><a name="l00535"></a><span class="lineno">  535</span>     <span class="keywordflow">continue</span>;</div>
+<div class="line"><a name="l00536"></a><span class="lineno">  536</span>       imgreg.setDown(down_opt[0]);</div>
+<div class="line"><a name="l00537"></a><span class="lineno">  537</span>       imgreg.setThreshold(random_opt[0]);</div>
+<div class="line"><a name="l00538"></a><span class="lineno">  538</span>       <span class="keywordtype">double</span> c0=0;<span class="comment">//offset</span></div>
+<div class="line"><a name="l00539"></a><span class="lineno">  539</span>       <span class="keywordtype">double</span> c1=1;<span class="comment">//scale</span></div>
+<div class="line"><a name="l00540"></a><span class="lineno">  540</span>       <span class="keywordtype">double</span> err=imgreg.getRMSE(imgReader,band_opt[0],band_opt[1],c0,c1,verbose_opt[0]);</div>
+<div class="line"><a name="l00541"></a><span class="lineno">  541</span>       std::cout << <span class="stringliteral">" -rmse "</span> << err << std::endl;</div>
+<div class="line"><a name="l00542"></a><span class="lineno">  542</span>     }</div>
+<div class="line"><a name="l00543"></a><span class="lineno">  543</span>     <span class="keywordflow">if</span>(preg_opt[0]&&input_opt.size()<2){</div>
+<div class="line"><a name="l00544"></a><span class="lineno">  544</span>       <span class="keywordflow">if</span>(band_opt.size()<2)</div>
+<div class="line"><a name="l00545"></a><span class="lineno">  545</span>     <span class="keywordflow">continue</span>;</div>
+<div class="line"><a name="l00546"></a><span class="lineno">  546</span>       imgreg.setDown(down_opt[0]);</div>
+<div class="line"><a name="l00547"></a><span class="lineno">  547</span>       imgreg.setThreshold(random_opt[0]);</div>
+<div class="line"><a name="l00548"></a><span class="lineno">  548</span>       <span class="keywordtype">double</span> c0=0;<span class="comment">//offset</span></div>
+<div class="line"><a name="l00549"></a><span class="lineno">  549</span>       <span class="keywordtype">double</span> c1=1;<span class="comment">//scale</span></div>
+<div class="line"><a name="l00550"></a><span class="lineno">  550</span>       <span class="keywordtype">double</span> r2=imgreg.pgetR2(imgReader,band_opt[0],band_opt[1],c0,c1,verbose_opt[0]);</div>
+<div class="line"><a name="l00551"></a><span class="lineno">  551</span>       std::cout << <span class="stringliteral">"-c0 "</span> << c0 << <span class="stringliteral">" -c1 "</span> << c1 << <span class="stringliteral">" -r2 "</span> << r2 << std::endl;</div>
+<div class="line"><a name="l00552"></a><span class="lineno">  552</span>     }</div>
+<div class="line"><a name="l00553"></a><span class="lineno">  553</span>     imgReader.close();</div>
+<div class="line"><a name="l00554"></a><span class="lineno">  554</span>   }</div>
+<div class="line"><a name="l00555"></a><span class="lineno">  555</span>   <span class="keywordflow">if</span>(reg_opt[0]&&(input_opt.size()>1)){</div>
+<div class="line"><a name="l00556"></a><span class="lineno">  556</span>     imgreg.setDown(down_opt[0]);</div>
+<div class="line"><a name="l00557"></a><span class="lineno">  557</span>     imgreg.setThreshold(random_opt[0]);</div>
+<div class="line"><a name="l00558"></a><span class="lineno">  558</span>     <span class="keywordtype">double</span> c0=0;<span class="comment">//offset</span></div>
+<div class="line"><a name="l00559"></a><span class="lineno">  559</span>     <span class="keywordtype">double</span> c1=1;<span class="comment">//scale</span></div>
+<div class="line"><a name="l00560"></a><span class="lineno">  560</span>     <span class="keywordflow">while</span>(band_opt.size()<input_opt.size())</div>
+<div class="line"><a name="l00561"></a><span class="lineno">  561</span>       band_opt.push_back(band_opt[0]);</div>
+<div class="line"><a name="l00562"></a><span class="lineno">  562</span>     <span class="keywordflow">if</span>(src_min_opt.size()){</div>
+<div class="line"><a name="l00563"></a><span class="lineno">  563</span>       <span class="keywordflow">while</span>(src_min_opt.size()<input_opt.size())</div>
+<div class="line"><a name="l00564"></a><span class="lineno">  564</span>     src_min_opt.push_back(src_min_opt[0]);</div>
+<div class="line"><a name="l00565"></a><span class="lineno">  565</span>     }</div>
+<div class="line"><a name="l00566"></a><span class="lineno">  566</span>     <span class="keywordflow">if</span>(src_max_opt.size()){</div>
+<div class="line"><a name="l00567"></a><span class="lineno">  567</span>       <span class="keywordflow">while</span>(src_max_opt.size()<input_opt.size())</div>
+<div class="line"><a name="l00568"></a><span class="lineno">  568</span>     src_max_opt.push_back(src_max_opt[0]);</div>
+<div class="line"><a name="l00569"></a><span class="lineno">  569</span>     }</div>
+<div class="line"><a name="l00570"></a><span class="lineno">  570</span>     <a class="code" href="classImgReaderGdal.html">ImgReaderGdal</a> imgReader1(input_opt[0]);</div>
+<div class="line"><a name="l00571"></a><span class="lineno">  571</span>     <a class="code" href="classImgReaderGdal.html">ImgReaderGdal</a> imgReader2(input_opt[1]);</div>
+<div class="line"><a name="l00572"></a><span class="lineno">  572</span> </div>
+<div class="line"><a name="l00573"></a><span class="lineno">  573</span>     <span class="keywordflow">if</span>(offset_opt.size())</div>
+<div class="line"><a name="l00574"></a><span class="lineno">  574</span>       imgReader1.setOffset(offset_opt[0],band_opt[0]);</div>
+<div class="line"><a name="l00575"></a><span class="lineno">  575</span>     <span class="keywordflow">if</span>(scale_opt.size())</div>
+<div class="line"><a name="l00576"></a><span class="lineno">  576</span>       imgReader1.setScale(scale_opt[0],band_opt[0]);</div>
+<div class="line"><a name="l00577"></a><span class="lineno">  577</span>     <span class="keywordflow">if</span>(offset_opt.size()>1)</div>
+<div class="line"><a name="l00578"></a><span class="lineno">  578</span>       imgReader2.setOffset(offset_opt[1],band_opt[1]);</div>
+<div class="line"><a name="l00579"></a><span class="lineno">  579</span>     <span class="keywordflow">if</span>(scale_opt.size()>1)</div>
+<div class="line"><a name="l00580"></a><span class="lineno">  580</span>       imgReader2.setScale(scale_opt[1],band_opt[1]);</div>
+<div class="line"><a name="l00581"></a><span class="lineno">  581</span> </div>
+<div class="line"><a name="l00582"></a><span class="lineno">  582</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> inodata=0;inodata<nodata_opt.size();++inodata){</div>
+<div class="line"><a name="l00583"></a><span class="lineno">  583</span>       <span class="keywordflow">if</span>(!inodata){</div>
+<div class="line"><a name="l00584"></a><span class="lineno">  584</span>         imgReader1.GDALSetNoDataValue(nodata_opt[0],band_opt[0]);<span class="comment">//only single no data can be set in GDALRasterBand (used for ComputeStatistics)</span></div>
+<div class="line"><a name="l00585"></a><span class="lineno">  585</span>         imgReader2.GDALSetNoDataValue(nodata_opt[0]),band_opt[1];<span class="comment">//only single no data can be set in GDALRasterBand (used for ComputeStatistics)</span></div>
+<div class="line"><a name="l00586"></a><span class="lineno">  586</span>       }</div>
+<div class="line"><a name="l00587"></a><span class="lineno">  587</span>       imgReader1.pushNoDataValue(nodata_opt[inodata]);</div>
+<div class="line"><a name="l00588"></a><span class="lineno">  588</span>       imgReader2.pushNoDataValue(nodata_opt[inodata]);</div>
+<div class="line"><a name="l00589"></a><span class="lineno">  589</span>     }</div>
+<div class="line"><a name="l00590"></a><span class="lineno">  590</span> </div>
+<div class="line"><a name="l00591"></a><span class="lineno">  591</span>     <span class="keywordtype">double</span> r2=imgreg.getR2(imgReader1,imgReader2,c0,c1,band_opt[0],band_opt[1],verbose_opt[0]);</div>
+<div class="line"><a name="l00592"></a><span class="lineno">  592</span>     std::cout << <span class="stringliteral">"-c0 "</span> << c0 << <span class="stringliteral">" -c1 "</span> << c1 << <span class="stringliteral">" -r2 "</span> << r2 << std::endl;</div>
+<div class="line"><a name="l00593"></a><span class="lineno">  593</span>     imgReader1.close();</div>
+<div class="line"><a name="l00594"></a><span class="lineno">  594</span>     imgReader2.close();</div>
+<div class="line"><a name="l00595"></a><span class="lineno">  595</span>   }</div>
+<div class="line"><a name="l00596"></a><span class="lineno">  596</span>   <span class="keywordflow">if</span>(preg_opt[0]&&(input_opt.size()>1)){</div>
+<div class="line"><a name="l00597"></a><span class="lineno">  597</span>     imgreg.setDown(down_opt[0]);</div>
+<div class="line"><a name="l00598"></a><span class="lineno">  598</span>     imgreg.setThreshold(random_opt[0]);</div>
+<div class="line"><a name="l00599"></a><span class="lineno">  599</span>     <span class="keywordtype">double</span> c0=0;<span class="comment">//offset</span></div>
+<div class="line"><a name="l00600"></a><span class="lineno">  600</span>     <span class="keywordtype">double</span> c1=1;<span class="comment">//scale</span></div>
+<div class="line"><a name="l00601"></a><span class="lineno">  601</span>     <span class="keywordflow">while</span>(band_opt.size()<input_opt.size())</div>
+<div class="line"><a name="l00602"></a><span class="lineno">  602</span>       band_opt.push_back(band_opt[0]);</div>
+<div class="line"><a name="l00603"></a><span class="lineno">  603</span>     <span class="keywordflow">if</span>(src_min_opt.size()){</div>
+<div class="line"><a name="l00604"></a><span class="lineno">  604</span>       <span class="keywordflow">while</span>(src_min_opt.size()<input_opt.size())</div>
+<div class="line"><a name="l00605"></a><span class="lineno">  605</span>     src_min_opt.push_back(src_min_opt[0]);</div>
+<div class="line"><a name="l00606"></a><span class="lineno">  606</span>     }</div>
+<div class="line"><a name="l00607"></a><span class="lineno">  607</span>     <span class="keywordflow">if</span>(src_max_opt.size()){</div>
+<div class="line"><a name="l00608"></a><span class="lineno">  608</span>       <span class="keywordflow">while</span>(src_max_opt.size()<input_opt.size())</div>
+<div class="line"><a name="l00609"></a><span class="lineno">  609</span>     src_max_opt.push_back(src_max_opt[0]);</div>
+<div class="line"><a name="l00610"></a><span class="lineno">  610</span>     }</div>
+<div class="line"><a name="l00611"></a><span class="lineno">  611</span>     <a class="code" href="classImgReaderGdal.html">ImgReaderGdal</a> imgReader1(input_opt[0]);</div>
+<div class="line"><a name="l00612"></a><span class="lineno">  612</span>     <a class="code" href="classImgReaderGdal.html">ImgReaderGdal</a> imgReader2(input_opt[1]);</div>
+<div class="line"><a name="l00613"></a><span class="lineno">  613</span> </div>
+<div class="line"><a name="l00614"></a><span class="lineno">  614</span>     <span class="keywordflow">if</span>(offset_opt.size())</div>
+<div class="line"><a name="l00615"></a><span class="lineno">  615</span>       imgReader1.setOffset(offset_opt[0],band_opt[0]);</div>
+<div class="line"><a name="l00616"></a><span class="lineno">  616</span>     <span class="keywordflow">if</span>(scale_opt.size())</div>
+<div class="line"><a name="l00617"></a><span class="lineno">  617</span>       imgReader1.setScale(scale_opt[0],band_opt[0]);</div>
+<div class="line"><a name="l00618"></a><span class="lineno">  618</span>     <span class="keywordflow">if</span>(offset_opt.size()>1)</div>
+<div class="line"><a name="l00619"></a><span class="lineno">  619</span>       imgReader2.setOffset(offset_opt[1],band_opt[1]);</div>
+<div class="line"><a name="l00620"></a><span class="lineno">  620</span>     <span class="keywordflow">if</span>(scale_opt.size()>1)</div>
+<div class="line"><a name="l00621"></a><span class="lineno">  621</span>       imgReader2.setScale(scale_opt[1],band_opt[1]);</div>
+<div class="line"><a name="l00622"></a><span class="lineno">  622</span> </div>
+<div class="line"><a name="l00623"></a><span class="lineno">  623</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> inodata=0;inodata<nodata_opt.size();++inodata){</div>
+<div class="line"><a name="l00624"></a><span class="lineno">  624</span>       <span class="keywordflow">if</span>(!inodata){</div>
+<div class="line"><a name="l00625"></a><span class="lineno">  625</span>         imgReader1.GDALSetNoDataValue(nodata_opt[0],band_opt[0]);<span class="comment">//only single no data can be set in GDALRasterBand (used for ComputeStatistics)</span></div>
+<div class="line"><a name="l00626"></a><span class="lineno">  626</span>         imgReader2.GDALSetNoDataValue(nodata_opt[0]),band_opt[1];<span class="comment">//only single no data can be set in GDALRasterBand (used for ComputeStatistics)</span></div>
+<div class="line"><a name="l00627"></a><span class="lineno">  627</span>       }</div>
+<div class="line"><a name="l00628"></a><span class="lineno">  628</span>       imgReader1.pushNoDataValue(nodata_opt[inodata]);</div>
+<div class="line"><a name="l00629"></a><span class="lineno">  629</span>       imgReader2.pushNoDataValue(nodata_opt[inodata]);</div>
+<div class="line"><a name="l00630"></a><span class="lineno">  630</span>     }</div>
+<div class="line"><a name="l00631"></a><span class="lineno">  631</span> </div>
+<div class="line"><a name="l00632"></a><span class="lineno">  632</span>     <span class="keywordtype">double</span> r2=imgreg.pgetR2(imgReader1,imgReader2,c0,c1,band_opt[0],band_opt[1],verbose_opt[0]);</div>
+<div class="line"><a name="l00633"></a><span class="lineno">  633</span>     std::cout << <span class="stringliteral">"-c0 "</span> << c0 << <span class="stringliteral">" -c1 "</span> << c1 << <span class="stringliteral">" -r2 "</span> << r2 << std::endl;</div>
+<div class="line"><a name="l00634"></a><span class="lineno">  634</span>     imgReader1.close();</div>
+<div class="line"><a name="l00635"></a><span class="lineno">  635</span>     imgReader2.close();</div>
+<div class="line"><a name="l00636"></a><span class="lineno">  636</span>   }</div>
+<div class="line"><a name="l00637"></a><span class="lineno">  637</span>   <span class="keywordflow">if</span>(regerr_opt[0]&&(input_opt.size()>1)){</div>
+<div class="line"><a name="l00638"></a><span class="lineno">  638</span>     imgreg.setDown(down_opt[0]);</div>
+<div class="line"><a name="l00639"></a><span class="lineno">  639</span>     imgreg.setThreshold(random_opt[0]);</div>
+<div class="line"><a name="l00640"></a><span class="lineno">  640</span>     <span class="keywordtype">double</span> c0=0;<span class="comment">//offset</span></div>
+<div class="line"><a name="l00641"></a><span class="lineno">  641</span>     <span class="keywordtype">double</span> c1=1;<span class="comment">//scale</span></div>
+<div class="line"><a name="l00642"></a><span class="lineno">  642</span>     <span class="keywordflow">while</span>(band_opt.size()<input_opt.size())</div>
+<div class="line"><a name="l00643"></a><span class="lineno">  643</span>       band_opt.push_back(band_opt[0]);</div>
+<div class="line"><a name="l00644"></a><span class="lineno">  644</span>     <span class="keywordflow">if</span>(src_min_opt.size()){</div>
+<div class="line"><a name="l00645"></a><span class="lineno">  645</span>       <span class="keywordflow">while</span>(src_min_opt.size()<input_opt.size())</div>
+<div class="line"><a name="l00646"></a><span class="lineno">  646</span>     src_min_opt.push_back(src_min_opt[0]);</div>
+<div class="line"><a name="l00647"></a><span class="lineno">  647</span>     }</div>
+<div class="line"><a name="l00648"></a><span class="lineno">  648</span>     <span class="keywordflow">if</span>(src_max_opt.size()){</div>
+<div class="line"><a name="l00649"></a><span class="lineno">  649</span>       <span class="keywordflow">while</span>(src_max_opt.size()<input_opt.size())</div>
+<div class="line"><a name="l00650"></a><span class="lineno">  650</span>     src_max_opt.push_back(src_max_opt[0]);</div>
+<div class="line"><a name="l00651"></a><span class="lineno">  651</span>     }</div>
+<div class="line"><a name="l00652"></a><span class="lineno">  652</span>     <a class="code" href="classImgReaderGdal.html">ImgReaderGdal</a> imgReader1(input_opt[0]);</div>
+<div class="line"><a name="l00653"></a><span class="lineno">  653</span>     <a class="code" href="classImgReaderGdal.html">ImgReaderGdal</a> imgReader2(input_opt[1]);</div>
+<div class="line"><a name="l00654"></a><span class="lineno">  654</span> </div>
+<div class="line"><a name="l00655"></a><span class="lineno">  655</span>     <span class="keywordflow">if</span>(offset_opt.size())</div>
+<div class="line"><a name="l00656"></a><span class="lineno">  656</span>       imgReader1.setOffset(offset_opt[0],band_opt[0]);</div>
+<div class="line"><a name="l00657"></a><span class="lineno">  657</span>     <span class="keywordflow">if</span>(scale_opt.size())</div>
+<div class="line"><a name="l00658"></a><span class="lineno">  658</span>       imgReader1.setScale(scale_opt[0],band_opt[0]);</div>
+<div class="line"><a name="l00659"></a><span class="lineno">  659</span>     <span class="keywordflow">if</span>(offset_opt.size()>1)</div>
+<div class="line"><a name="l00660"></a><span class="lineno">  660</span>       imgReader2.setOffset(offset_opt[1],band_opt[1]);</div>
+<div class="line"><a name="l00661"></a><span class="lineno">  661</span>     <span class="keywordflow">if</span>(scale_opt.size()>1)</div>
+<div class="line"><a name="l00662"></a><span class="lineno">  662</span>       imgReader2.setScale(scale_opt[1],band_opt[1]);</div>
+<div class="line"><a name="l00663"></a><span class="lineno">  663</span> </div>
+<div class="line"><a name="l00664"></a><span class="lineno">  664</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> inodata=0;inodata<nodata_opt.size();++inodata){</div>
+<div class="line"><a name="l00665"></a><span class="lineno">  665</span>       <span class="keywordflow">if</span>(!inodata){</div>
+<div class="line"><a name="l00666"></a><span class="lineno">  666</span>         imgReader1.GDALSetNoDataValue(nodata_opt[0],band_opt[0]);<span class="comment">//only single no data can be set in GDALRasterBand (used for ComputeStatistics)</span></div>
+<div class="line"><a name="l00667"></a><span class="lineno">  667</span>         imgReader2.GDALSetNoDataValue(nodata_opt[0]),band_opt[1];<span class="comment">//only single no data can be set in GDALRasterBand (used for ComputeStatistics)</span></div>
+<div class="line"><a name="l00668"></a><span class="lineno">  668</span>       }</div>
+<div class="line"><a name="l00669"></a><span class="lineno">  669</span>       imgReader1.pushNoDataValue(nodata_opt[inodata]);</div>
+<div class="line"><a name="l00670"></a><span class="lineno">  670</span>       imgReader2.pushNoDataValue(nodata_opt[inodata]);</div>
+<div class="line"><a name="l00671"></a><span class="lineno">  671</span>     }</div>
+<div class="line"><a name="l00672"></a><span class="lineno">  672</span> </div>
+<div class="line"><a name="l00673"></a><span class="lineno">  673</span>     <span class="keywordtype">double</span> err=imgreg.getRMSE(imgReader1,imgReader2,c0,c1,band_opt[0],band_opt[1],verbose_opt[0]);</div>
+<div class="line"><a name="l00674"></a><span class="lineno">  674</span>     std::cout << <span class="stringliteral">"-c0 "</span> << c0 << <span class="stringliteral">" -c1 "</span> << c1 << <span class="stringliteral">" -rmse "</span> << err << std::endl;</div>
+<div class="line"><a name="l00675"></a><span class="lineno">  675</span>     imgReader1.close();</div>
+<div class="line"><a name="l00676"></a><span class="lineno">  676</span>     imgReader2.close();</div>
+<div class="line"><a name="l00677"></a><span class="lineno">  677</span>   }</div>
+<div class="line"><a name="l00678"></a><span class="lineno">  678</span>   <span class="keywordflow">if</span>(rmse_opt[0]&&(input_opt.size()>1)){</div>
+<div class="line"><a name="l00679"></a><span class="lineno">  679</span>     imgreg.setDown(down_opt[0]);</div>
+<div class="line"><a name="l00680"></a><span class="lineno">  680</span>     imgreg.setThreshold(random_opt[0]);</div>
+<div class="line"><a name="l00681"></a><span class="lineno">  681</span>     <span class="keywordtype">double</span> c0=0;<span class="comment">//offset</span></div>
+<div class="line"><a name="l00682"></a><span class="lineno">  682</span>     <span class="keywordtype">double</span> c1=1;<span class="comment">//scale</span></div>
+<div class="line"><a name="l00683"></a><span class="lineno">  683</span>     <span class="keywordflow">while</span>(band_opt.size()<input_opt.size())</div>
+<div class="line"><a name="l00684"></a><span class="lineno">  684</span>       band_opt.push_back(band_opt[0]);</div>
+<div class="line"><a name="l00685"></a><span class="lineno">  685</span>     <span class="keywordflow">if</span>(src_min_opt.size()){</div>
+<div class="line"><a name="l00686"></a><span class="lineno">  686</span>       <span class="keywordflow">while</span>(src_min_opt.size()<input_opt.size())</div>
+<div class="line"><a name="l00687"></a><span class="lineno">  687</span>     src_min_opt.push_back(src_min_opt[0]);</div>
+<div class="line"><a name="l00688"></a><span class="lineno">  688</span>     }</div>
+<div class="line"><a name="l00689"></a><span class="lineno">  689</span>     <span class="keywordflow">if</span>(src_max_opt.size()){</div>
+<div class="line"><a name="l00690"></a><span class="lineno">  690</span>       <span class="keywordflow">while</span>(src_max_opt.size()<input_opt.size())</div>
+<div class="line"><a name="l00691"></a><span class="lineno">  691</span>     src_max_opt.push_back(src_max_opt[0]);</div>
+<div class="line"><a name="l00692"></a><span class="lineno">  692</span>     }</div>
+<div class="line"><a name="l00693"></a><span class="lineno">  693</span>     <a class="code" href="classImgReaderGdal.html">ImgReaderGdal</a> imgReader1(input_opt[0]);</div>
+<div class="line"><a name="l00694"></a><span class="lineno">  694</span>     <a class="code" href="classImgReaderGdal.html">ImgReaderGdal</a> imgReader2(input_opt[1]);</div>
+<div class="line"><a name="l00695"></a><span class="lineno">  695</span> </div>
+<div class="line"><a name="l00696"></a><span class="lineno">  696</span>     <span class="keywordflow">if</span>(offset_opt.size())</div>
+<div class="line"><a name="l00697"></a><span class="lineno">  697</span>       imgReader1.setOffset(offset_opt[0],band_opt[0]);</div>
+<div class="line"><a name="l00698"></a><span class="lineno">  698</span>     <span class="keywordflow">if</span>(scale_opt.size())</div>
+<div class="line"><a name="l00699"></a><span class="lineno">  699</span>       imgReader1.setScale(scale_opt[0],band_opt[0]);</div>
+<div class="line"><a name="l00700"></a><span class="lineno">  700</span>     <span class="keywordflow">if</span>(offset_opt.size()>1)</div>
+<div class="line"><a name="l00701"></a><span class="lineno">  701</span>       imgReader2.setOffset(offset_opt[1],band_opt[1]);</div>
+<div class="line"><a name="l00702"></a><span class="lineno">  702</span>     <span class="keywordflow">if</span>(scale_opt.size()>1)</div>
+<div class="line"><a name="l00703"></a><span class="lineno">  703</span>       imgReader2.setScale(scale_opt[1],band_opt[1]);</div>
+<div class="line"><a name="l00704"></a><span class="lineno">  704</span> </div>
+<div class="line"><a name="l00705"></a><span class="lineno">  705</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> inodata=0;inodata<nodata_opt.size();++inodata){</div>
+<div class="line"><a name="l00706"></a><span class="lineno">  706</span>       <span class="keywordflow">if</span>(!inodata){</div>
+<div class="line"><a name="l00707"></a><span class="lineno">  707</span>         imgReader1.GDALSetNoDataValue(nodata_opt[0],band_opt[0]);<span class="comment">//only single no data can be set in GDALRasterBand (used for ComputeStatistics)</span></div>
+<div class="line"><a name="l00708"></a><span class="lineno">  708</span>         imgReader2.GDALSetNoDataValue(nodata_opt[0]),band_opt[1];<span class="comment">//only single no data can be set in GDALRasterBand (used for ComputeStatistics)</span></div>
+<div class="line"><a name="l00709"></a><span class="lineno">  709</span>       }</div>
+<div class="line"><a name="l00710"></a><span class="lineno">  710</span>       imgReader1.pushNoDataValue(nodata_opt[inodata]);</div>
+<div class="line"><a name="l00711"></a><span class="lineno">  711</span>       imgReader2.pushNoDataValue(nodata_opt[inodata]);</div>
+<div class="line"><a name="l00712"></a><span class="lineno">  712</span>     }</div>
+<div class="line"><a name="l00713"></a><span class="lineno">  713</span> </div>
+<div class="line"><a name="l00714"></a><span class="lineno">  714</span>     <span class="keywordtype">double</span> err=imgreg.getRMSE(imgReader1,imgReader2,c0,c1,band_opt[0],band_opt[1],verbose_opt[0]);</div>
+<div class="line"><a name="l00715"></a><span class="lineno">  715</span>     std::cout << <span class="stringliteral">"-rmse "</span> << err << std::endl;</div>
+<div class="line"><a name="l00716"></a><span class="lineno">  716</span>     imgReader1.close();</div>
+<div class="line"><a name="l00717"></a><span class="lineno">  717</span>     imgReader2.close();</div>
+<div class="line"><a name="l00718"></a><span class="lineno">  718</span>   }</div>
+<div class="line"><a name="l00719"></a><span class="lineno">  719</span>   <span class="keywordflow">if</span>(histogram2d_opt[0]&&(input_opt.size()>1)){</div>
+<div class="line"><a name="l00720"></a><span class="lineno">  720</span>     <span class="keywordflow">while</span>(band_opt.size()<input_opt.size())</div>
+<div class="line"><a name="l00721"></a><span class="lineno">  721</span>       band_opt.push_back(band_opt[0]);</div>
+<div class="line"><a name="l00722"></a><span class="lineno">  722</span>     <span class="keywordflow">if</span>(src_min_opt.size()){</div>
+<div class="line"><a name="l00723"></a><span class="lineno">  723</span>       <span class="keywordflow">while</span>(src_min_opt.size()<input_opt.size())</div>
+<div class="line"><a name="l00724"></a><span class="lineno">  724</span>     src_min_opt.push_back(src_min_opt[0]);</div>
+<div class="line"><a name="l00725"></a><span class="lineno">  725</span>     }</div>
+<div class="line"><a name="l00726"></a><span class="lineno">  726</span>     <span class="keywordflow">if</span>(src_max_opt.size()){</div>
+<div class="line"><a name="l00727"></a><span class="lineno">  727</span>       <span class="keywordflow">while</span>(src_max_opt.size()<input_opt.size())</div>
+<div class="line"><a name="l00728"></a><span class="lineno">  728</span>     src_max_opt.push_back(src_max_opt[0]);</div>
+<div class="line"><a name="l00729"></a><span class="lineno">  729</span>     }</div>
+<div class="line"><a name="l00730"></a><span class="lineno">  730</span>     <a class="code" href="classImgReaderGdal.html">ImgReaderGdal</a> imgReader1(input_opt[0]);</div>
+<div class="line"><a name="l00731"></a><span class="lineno">  731</span>     <a class="code" href="classImgReaderGdal.html">ImgReaderGdal</a> imgReader2(input_opt[1]);</div>
+<div class="line"><a name="l00732"></a><span class="lineno">  732</span> </div>
+<div class="line"><a name="l00733"></a><span class="lineno">  733</span>     <span class="keywordflow">if</span>(offset_opt.size())</div>
+<div class="line"><a name="l00734"></a><span class="lineno">  734</span>       imgReader1.setOffset(offset_opt[0],band_opt[0]);</div>
+<div class="line"><a name="l00735"></a><span class="lineno">  735</span>     <span class="keywordflow">if</span>(scale_opt.size())</div>
+<div class="line"><a name="l00736"></a><span class="lineno">  736</span>       imgReader1.setScale(scale_opt[0],band_opt[0]);</div>
+<div class="line"><a name="l00737"></a><span class="lineno">  737</span>     <span class="keywordflow">if</span>(offset_opt.size()>1)</div>
+<div class="line"><a name="l00738"></a><span class="lineno">  738</span>       imgReader2.setOffset(offset_opt[1],band_opt[1]);</div>
+<div class="line"><a name="l00739"></a><span class="lineno">  739</span>     <span class="keywordflow">if</span>(scale_opt.size()>1)</div>
+<div class="line"><a name="l00740"></a><span class="lineno">  740</span>       imgReader2.setScale(scale_opt[1],band_opt[1]);</div>
 <div class="line"><a name="l00741"></a><span class="lineno">  741</span> </div>
-<div class="line"><a name="l00742"></a><span class="lineno">  742</span>     <span class="keywordflow">if</span>(verbose_opt[0]){</div>
-<div class="line"><a name="l00743"></a><span class="lineno">  743</span>       cout << <span class="stringliteral">"minX: "</span> << minX << endl;</div>
-<div class="line"><a name="l00744"></a><span class="lineno">  744</span>       cout << <span class="stringliteral">"maxX: "</span> << maxX << endl;</div>
-<div class="line"><a name="l00745"></a><span class="lineno">  745</span>       cout << <span class="stringliteral">"minY: "</span> << minY << endl;</div>
-<div class="line"><a name="l00746"></a><span class="lineno">  746</span>       cout << <span class="stringliteral">"maxY: "</span> << maxY << endl;</div>
-<div class="line"><a name="l00747"></a><span class="lineno">  747</span>     }</div>
-<div class="line"><a name="l00748"></a><span class="lineno">  748</span>       </div>
-<div class="line"><a name="l00749"></a><span class="lineno">  749</span>     <span class="keywordflow">if</span>(src_min_opt.size()){</div>
-<div class="line"><a name="l00750"></a><span class="lineno">  750</span>       minX=src_min_opt[0];</div>
-<div class="line"><a name="l00751"></a><span class="lineno">  751</span>       minY=src_min_opt[1];</div>
-<div class="line"><a name="l00752"></a><span class="lineno">  752</span>     }</div>
-<div class="line"><a name="l00753"></a><span class="lineno">  753</span>     <span class="keywordflow">if</span>(src_max_opt.size()){</div>
-<div class="line"><a name="l00754"></a><span class="lineno">  754</span>       maxX=src_max_opt[0];</div>
-<div class="line"><a name="l00755"></a><span class="lineno">  755</span>       maxY=src_max_opt[1];</div>
-<div class="line"><a name="l00756"></a><span class="lineno">  756</span>     }</div>
-<div class="line"><a name="l00757"></a><span class="lineno">  757</span> </div>
-<div class="line"><a name="l00758"></a><span class="lineno">  758</span>     nbin=(nbin_opt.size())? nbin_opt[0]:0;</div>
-<div class="line"><a name="l00759"></a><span class="lineno">  759</span>     <span class="keywordflow">if</span>(nbin<=1){</div>
-<div class="line"><a name="l00760"></a><span class="lineno">  760</span>       std::cerr << <span class="stringliteral">"Warning: number of bins not defined, calculating bins from min and max value"</span> << std::endl;</div>
-<div class="line"><a name="l00761"></a><span class="lineno">  761</span>       <span class="comment">// imgReader1.getMinMax(minX,maxX,band_opt[0]);</span></div>
-<div class="line"><a name="l00762"></a><span class="lineno">  762</span>       <span class="comment">// imgReader2.getMinMax(minY,maxY,band_opt[0]);</span></div>
-<div class="line"><a name="l00763"></a><span class="lineno">  763</span>       <span class="keywordflow">if</span>(minX>=maxX)</div>
-<div class="line"><a name="l00764"></a><span class="lineno">  764</span>     imgReader1.getMinMax(minX,maxX,band_opt[0]);</div>
-<div class="line"><a name="l00765"></a><span class="lineno">  765</span>       <span class="keywordflow">if</span>(minY>=maxY)</div>
-<div class="line"><a name="l00766"></a><span class="lineno">  766</span>     imgReader2.getMinMax(minY,maxY,band_opt[1]);</div>
-<div class="line"><a name="l00767"></a><span class="lineno">  767</span>       </div>
-<div class="line"><a name="l00768"></a><span class="lineno">  768</span>       minValue=(minX<minY)? minX:minY;</div>
-<div class="line"><a name="l00769"></a><span class="lineno">  769</span>       maxValue=(maxX>maxY)? maxX:maxY;</div>
-<div class="line"><a name="l00770"></a><span class="lineno">  770</span>       <span class="keywordflow">if</span>(verbose_opt[0])</div>
-<div class="line"><a name="l00771"></a><span class="lineno">  771</span>         std::cout << <span class="stringliteral">"min and max values: "</span> << minValue << <span class="stringliteral">", "</span> << maxValue << std::endl;</div>
-<div class="line"><a name="l00772"></a><span class="lineno">  772</span>       nbin=maxValue-minValue+1;</div>
-<div class="line"><a name="l00773"></a><span class="lineno">  773</span>     }</div>
-<div class="line"><a name="l00774"></a><span class="lineno">  774</span>     assert(nbin>1);</div>
-<div class="line"><a name="l00775"></a><span class="lineno">  775</span>     <span class="keywordtype">double</span> sigma=0;</div>
-<div class="line"><a name="l00776"></a><span class="lineno">  776</span>     <span class="comment">//kernel density estimation as in http://en.wikipedia.org/wiki/Kernel_density_estimation</span></div>
-<div class="line"><a name="l00777"></a><span class="lineno">  777</span>     <span class="keywordflow">if</span>(kde_opt[0]){</div>
-<div class="line"><a name="l00778"></a><span class="lineno">  778</span>       GDALProgressFunc pfnProgress;</div>
-<div class="line"><a name="l00779"></a><span class="lineno">  779</span>       <span class="keywordtype">void</span>* pProgressData;</div>
-<div class="line"><a name="l00780"></a><span class="lineno">  780</span>       GDALRasterBand* rasterBand;</div>
-<div class="line"><a name="l00781"></a><span class="lineno">  781</span>       <span class="keywordtype">double</span> stdDev1=0;</div>
-<div class="line"><a name="l00782"></a><span class="lineno">  782</span>       <span class="keywordtype">double</span> stdDev2=0;</div>
-<div class="line"><a name="l00783"></a><span class="lineno">  783</span>       rasterBand=imgReader1.getRasterBand(band_opt[0]);</div>
-<div class="line"><a name="l00784"></a><span class="lineno">  784</span>       rasterBand->ComputeStatistics(0,&minValue,&maxValue,&meanValue,&stdDev1,pfnProgress,pProgressData);</div>
-<div class="line"><a name="l00785"></a><span class="lineno">  785</span>       rasterBand=imgReader2.getRasterBand(band_opt[0]);</div>
-<div class="line"><a name="l00786"></a><span class="lineno">  786</span>       rasterBand->ComputeStatistics(0,&minValue,&maxValue,&meanValue,&stdDev2,pfnProgress,pProgressData);</div>
-<div class="line"><a name="l00787"></a><span class="lineno">  787</span>       </div>
-<div class="line"><a name="l00788"></a><span class="lineno">  788</span>       <span class="comment">//todo: think of smarter way how to estimate size (nodata!)</span></div>
-<div class="line"><a name="l00789"></a><span class="lineno">  789</span>       <span class="keywordtype">double</span> estimatedSize=1.0*imgReader.getNvalid(band_opt[0])/down_opt[0]/down_opt[0];</div>
-<div class="line"><a name="l00790"></a><span class="lineno">  790</span>       <span class="keywordflow">if</span>(random_opt[0]>0)</div>
-<div class="line"><a name="l00791"></a><span class="lineno">  791</span>     estimatedSize*=random_opt[0]/100.0;</div>
-<div class="line"><a name="l00792"></a><span class="lineno">  792</span>       sigma=1.06*sqrt(stdDev1*stdDev2)*pow(estimatedSize,-0.2);</div>
-<div class="line"><a name="l00793"></a><span class="lineno">  793</span>     }</div>
-<div class="line"><a name="l00794"></a><span class="lineno">  794</span>     assert(nbin);</div>
-<div class="line"><a name="l00795"></a><span class="lineno">  795</span>     <span class="keywordflow">if</span>(verbose_opt[0]){</div>
-<div class="line"><a name="l00796"></a><span class="lineno">  796</span>       <span class="keywordflow">if</span>(sigma>0)</div>
-<div class="line"><a name="l00797"></a><span class="lineno">  797</span>     std::cout << <span class="stringliteral">"calculating 2d kernel density estimate with sigma "</span> << sigma << <span class="stringliteral">" for datasets "</span> << input_opt[0] << <span class="stringliteral">" and "</span> << input_opt[1] << std::endl;</div>
-<div class="line"><a name="l00798"></a><span class="lineno">  798</span>       <span class="keywordflow">else</span></div>
-<div class="line"><a name="l00799"></a><span class="lineno">  799</span>     std::cout << <span class="stringliteral">"calculating 2d histogram for datasets "</span> << input_opt[0] << <span class="stringliteral">" and "</span> << input_opt[1] << std::endl;</div>
-<div class="line"><a name="l00800"></a><span class="lineno">  800</span>       std::cout << <span class="stringliteral">"nbin: "</span> << nbin << std::endl;</div>
-<div class="line"><a name="l00801"></a><span class="lineno">  801</span>     }</div>
-<div class="line"><a name="l00802"></a><span class="lineno">  802</span> </div>
-<div class="line"><a name="l00803"></a><span class="lineno">  803</span>     vector< vector<double> > output;</div>
-<div class="line"><a name="l00804"></a><span class="lineno">  804</span> </div>
-<div class="line"><a name="l00805"></a><span class="lineno">  805</span>     <span class="keywordflow">if</span>(maxX<=minX)</div>
-<div class="line"><a name="l00806"></a><span class="lineno">  806</span>       imgReader1.getMinMax(minX,maxX,band_opt[0]);</div>
-<div class="line"><a name="l00807"></a><span class="lineno">  807</span>     <span class="keywordflow">if</span>(maxY<=minY)</div>
-<div class="line"><a name="l00808"></a><span class="lineno">  808</span>       imgReader2.getMinMax(minY,maxY,band_opt[1]);</div>
-<div class="line"><a name="l00809"></a><span class="lineno">  809</span> </div>
-<div class="line"><a name="l00810"></a><span class="lineno">  810</span>     <span class="keywordflow">if</span>(maxX<=minX){</div>
-<div class="line"><a name="l00811"></a><span class="lineno">  811</span>       std::ostringstream s;</div>
-<div class="line"><a name="l00812"></a><span class="lineno">  812</span>       s<<<span class="stringliteral">"Error: could not calculate distribution (minX>=maxX)"</span>;</div>
-<div class="line"><a name="l00813"></a><span class="lineno">  813</span>       <span class="keywordflow">throw</span>(s.str());</div>
-<div class="line"><a name="l00814"></a><span class="lineno">  814</span>     }</div>
-<div class="line"><a name="l00815"></a><span class="lineno">  815</span>     <span class="keywordflow">if</span>(maxY<=minY){</div>
-<div class="line"><a name="l00816"></a><span class="lineno">  816</span>       std::ostringstream s;</div>
-<div class="line"><a name="l00817"></a><span class="lineno">  817</span>       s<<<span class="stringliteral">"Error: could not calculate distribution (minY>=maxY)"</span>;</div>
-<div class="line"><a name="l00818"></a><span class="lineno">  818</span>       <span class="keywordflow">throw</span>(s.str());</div>
-<div class="line"><a name="l00819"></a><span class="lineno">  819</span>     }</div>
-<div class="line"><a name="l00820"></a><span class="lineno">  820</span>     <span class="keywordflow">if</span>(verbose_opt[0]){</div>
-<div class="line"><a name="l00821"></a><span class="lineno">  821</span>       cout << <span class="stringliteral">"minX: "</span> << minX << endl;</div>
-<div class="line"><a name="l00822"></a><span class="lineno">  822</span>       cout << <span class="stringliteral">"maxX: "</span> << maxX << endl;</div>
-<div class="line"><a name="l00823"></a><span class="lineno">  823</span>       cout << <span class="stringliteral">"minY: "</span> << minY << endl;</div>
-<div class="line"><a name="l00824"></a><span class="lineno">  824</span>       cout << <span class="stringliteral">"maxY: "</span> << maxY << endl;</div>
-<div class="line"><a name="l00825"></a><span class="lineno">  825</span>     }</div>
-<div class="line"><a name="l00826"></a><span class="lineno">  826</span>     output.resize(nbin);</div>
-<div class="line"><a name="l00827"></a><span class="lineno">  827</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> i=0;i<nbin;++i){</div>
-<div class="line"><a name="l00828"></a><span class="lineno">  828</span>       output[i].resize(nbin);</div>
-<div class="line"><a name="l00829"></a><span class="lineno">  829</span>       <span class="keywordflow">for</span>(<span class="keywordtype">int</span> j=0;j<nbin;++j)</div>
-<div class="line"><a name="l00830"></a><span class="lineno">  830</span>     output[i][j]=0;</div>
+<div class="line"><a name="l00742"></a><span class="lineno">  742</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> inodata=0;inodata<nodata_opt.size();++inodata){</div>
+<div class="line"><a name="l00743"></a><span class="lineno">  743</span>       <span class="keywordflow">if</span>(!inodata){</div>
+<div class="line"><a name="l00744"></a><span class="lineno">  744</span>         imgReader1.GDALSetNoDataValue(nodata_opt[0],band_opt[0]);<span class="comment">//only single no data can be set in GDALRasterBand (used for ComputeStatistics)</span></div>
+<div class="line"><a name="l00745"></a><span class="lineno">  745</span>         imgReader2.GDALSetNoDataValue(nodata_opt[0]),band_opt[1];<span class="comment">//only single no data can be set in GDALRasterBand (used for ComputeStatistics)</span></div>
+<div class="line"><a name="l00746"></a><span class="lineno">  746</span>       }</div>
+<div class="line"><a name="l00747"></a><span class="lineno">  747</span>       imgReader1.pushNoDataValue(nodata_opt[inodata]);</div>
+<div class="line"><a name="l00748"></a><span class="lineno">  748</span>       imgReader2.pushNoDataValue(nodata_opt[inodata]);</div>
+<div class="line"><a name="l00749"></a><span class="lineno">  749</span>     }</div>
+<div class="line"><a name="l00750"></a><span class="lineno">  750</span> </div>
+<div class="line"><a name="l00751"></a><span class="lineno">  751</span>     imgReader1.getMinMax(minX,maxX,band_opt[0]);</div>
+<div class="line"><a name="l00752"></a><span class="lineno">  752</span>     imgReader2.getMinMax(minY,maxY,band_opt[1]);</div>
+<div class="line"><a name="l00753"></a><span class="lineno">  753</span> </div>
+<div class="line"><a name="l00754"></a><span class="lineno">  754</span>     <span class="keywordflow">if</span>(verbose_opt[0]){</div>
+<div class="line"><a name="l00755"></a><span class="lineno">  755</span>       cout << <span class="stringliteral">"minX: "</span> << minX << endl;</div>
+<div class="line"><a name="l00756"></a><span class="lineno">  756</span>       cout << <span class="stringliteral">"maxX: "</span> << maxX << endl;</div>
+<div class="line"><a name="l00757"></a><span class="lineno">  757</span>       cout << <span class="stringliteral">"minY: "</span> << minY << endl;</div>
+<div class="line"><a name="l00758"></a><span class="lineno">  758</span>       cout << <span class="stringliteral">"maxY: "</span> << maxY << endl;</div>
+<div class="line"><a name="l00759"></a><span class="lineno">  759</span>     }</div>
+<div class="line"><a name="l00760"></a><span class="lineno">  760</span>       </div>
+<div class="line"><a name="l00761"></a><span class="lineno">  761</span>     <span class="keywordflow">if</span>(src_min_opt.size()){</div>
+<div class="line"><a name="l00762"></a><span class="lineno">  762</span>       minX=src_min_opt[0];</div>
+<div class="line"><a name="l00763"></a><span class="lineno">  763</span>       minY=src_min_opt[1];</div>
+<div class="line"><a name="l00764"></a><span class="lineno">  764</span>     }</div>
+<div class="line"><a name="l00765"></a><span class="lineno">  765</span>     <span class="keywordflow">if</span>(src_max_opt.size()){</div>
+<div class="line"><a name="l00766"></a><span class="lineno">  766</span>       maxX=src_max_opt[0];</div>
+<div class="line"><a name="l00767"></a><span class="lineno">  767</span>       maxY=src_max_opt[1];</div>
+<div class="line"><a name="l00768"></a><span class="lineno">  768</span>     }</div>
+<div class="line"><a name="l00769"></a><span class="lineno">  769</span> </div>
+<div class="line"><a name="l00770"></a><span class="lineno">  770</span>     nbin=(nbin_opt.size())? nbin_opt[0]:0;</div>
+<div class="line"><a name="l00771"></a><span class="lineno">  771</span>     <span class="keywordflow">if</span>(nbin<=1){</div>
+<div class="line"><a name="l00772"></a><span class="lineno">  772</span>       std::cerr << <span class="stringliteral">"Warning: number of bins not defined, calculating bins from min and max value"</span> << std::endl;</div>
+<div class="line"><a name="l00773"></a><span class="lineno">  773</span>       <span class="comment">// imgReader1.getMinMax(minX,maxX,band_opt[0]);</span></div>
+<div class="line"><a name="l00774"></a><span class="lineno">  774</span>       <span class="comment">// imgReader2.getMinMax(minY,maxY,band_opt[0]);</span></div>
+<div class="line"><a name="l00775"></a><span class="lineno">  775</span>       <span class="keywordflow">if</span>(minX>=maxX)</div>
+<div class="line"><a name="l00776"></a><span class="lineno">  776</span>     imgReader1.getMinMax(minX,maxX,band_opt[0]);</div>
+<div class="line"><a name="l00777"></a><span class="lineno">  777</span>       <span class="keywordflow">if</span>(minY>=maxY)</div>
+<div class="line"><a name="l00778"></a><span class="lineno">  778</span>     imgReader2.getMinMax(minY,maxY,band_opt[1]);</div>
+<div class="line"><a name="l00779"></a><span class="lineno">  779</span>       </div>
+<div class="line"><a name="l00780"></a><span class="lineno">  780</span>       minValue=(minX<minY)? minX:minY;</div>
+<div class="line"><a name="l00781"></a><span class="lineno">  781</span>       maxValue=(maxX>maxY)? maxX:maxY;</div>
+<div class="line"><a name="l00782"></a><span class="lineno">  782</span>       <span class="keywordflow">if</span>(verbose_opt[0])</div>
+<div class="line"><a name="l00783"></a><span class="lineno">  783</span>         std::cout << <span class="stringliteral">"min and max values: "</span> << minValue << <span class="stringliteral">", "</span> << maxValue << std::endl;</div>
+<div class="line"><a name="l00784"></a><span class="lineno">  784</span>       nbin=maxValue-minValue+1;</div>
+<div class="line"><a name="l00785"></a><span class="lineno">  785</span>     }</div>
+<div class="line"><a name="l00786"></a><span class="lineno">  786</span>     assert(nbin>1);</div>
+<div class="line"><a name="l00787"></a><span class="lineno">  787</span>     <span class="keywordtype">double</span> sigma=0;</div>
+<div class="line"><a name="l00788"></a><span class="lineno">  788</span>     <span class="comment">//kernel density estimation as in http://en.wikipedia.org/wiki/Kernel_density_estimation</span></div>
+<div class="line"><a name="l00789"></a><span class="lineno">  789</span>     <span class="keywordflow">if</span>(kde_opt[0]){</div>
+<div class="line"><a name="l00790"></a><span class="lineno">  790</span>       GDALProgressFunc pfnProgress;</div>
+<div class="line"><a name="l00791"></a><span class="lineno">  791</span>       <span class="keywordtype">void</span>* pProgressData;</div>
+<div class="line"><a name="l00792"></a><span class="lineno">  792</span>       GDALRasterBand* rasterBand;</div>
+<div class="line"><a name="l00793"></a><span class="lineno">  793</span>       <span class="keywordtype">double</span> stdDev1=0;</div>
+<div class="line"><a name="l00794"></a><span class="lineno">  794</span>       <span class="keywordtype">double</span> stdDev2=0;</div>
+<div class="line"><a name="l00795"></a><span class="lineno">  795</span>       rasterBand=imgReader1.getRasterBand(band_opt[0]);</div>
+<div class="line"><a name="l00796"></a><span class="lineno">  796</span>       rasterBand->ComputeStatistics(0,&minValue,&maxValue,&meanValue,&stdDev1,pfnProgress,pProgressData);</div>
+<div class="line"><a name="l00797"></a><span class="lineno">  797</span>       rasterBand=imgReader2.getRasterBand(band_opt[0]);</div>
+<div class="line"><a name="l00798"></a><span class="lineno">  798</span>       rasterBand->ComputeStatistics(0,&minValue,&maxValue,&meanValue,&stdDev2,pfnProgress,pProgressData);</div>
+<div class="line"><a name="l00799"></a><span class="lineno">  799</span>       </div>
+<div class="line"><a name="l00800"></a><span class="lineno">  800</span>       <span class="comment">//todo: think of smarter way how to estimate size (nodata!)</span></div>
+<div class="line"><a name="l00801"></a><span class="lineno">  801</span>       <span class="keywordtype">double</span> estimatedSize=1.0*imgReader.getNvalid(band_opt[0])/down_opt[0]/down_opt[0];</div>
+<div class="line"><a name="l00802"></a><span class="lineno">  802</span>       <span class="keywordflow">if</span>(random_opt[0]>0)</div>
+<div class="line"><a name="l00803"></a><span class="lineno">  803</span>     estimatedSize*=random_opt[0]/100.0;</div>
+<div class="line"><a name="l00804"></a><span class="lineno">  804</span>       sigma=1.06*sqrt(stdDev1*stdDev2)*pow(estimatedSize,-0.2);</div>
+<div class="line"><a name="l00805"></a><span class="lineno">  805</span>     }</div>
+<div class="line"><a name="l00806"></a><span class="lineno">  806</span>     assert(nbin);</div>
+<div class="line"><a name="l00807"></a><span class="lineno">  807</span>     <span class="keywordflow">if</span>(verbose_opt[0]){</div>
+<div class="line"><a name="l00808"></a><span class="lineno">  808</span>       <span class="keywordflow">if</span>(sigma>0)</div>
+<div class="line"><a name="l00809"></a><span class="lineno">  809</span>     std::cout << <span class="stringliteral">"calculating 2d kernel density estimate with sigma "</span> << sigma << <span class="stringliteral">" for datasets "</span> << input_opt[0] << <span class="stringliteral">" and "</span> << input_opt[1] << std::endl;</div>
+<div class="line"><a name="l00810"></a><span class="lineno">  810</span>       <span class="keywordflow">else</span></div>
+<div class="line"><a name="l00811"></a><span class="lineno">  811</span>     std::cout << <span class="stringliteral">"calculating 2d histogram for datasets "</span> << input_opt[0] << <span class="stringliteral">" and "</span> << input_opt[1] << std::endl;</div>
+<div class="line"><a name="l00812"></a><span class="lineno">  812</span>       std::cout << <span class="stringliteral">"nbin: "</span> << nbin << std::endl;</div>
+<div class="line"><a name="l00813"></a><span class="lineno">  813</span>     }</div>
+<div class="line"><a name="l00814"></a><span class="lineno">  814</span> </div>
+<div class="line"><a name="l00815"></a><span class="lineno">  815</span>     vector< vector<double> > output;</div>
+<div class="line"><a name="l00816"></a><span class="lineno">  816</span> </div>
+<div class="line"><a name="l00817"></a><span class="lineno">  817</span>     <span class="keywordflow">if</span>(maxX<=minX)</div>
+<div class="line"><a name="l00818"></a><span class="lineno">  818</span>       imgReader1.getMinMax(minX,maxX,band_opt[0]);</div>
+<div class="line"><a name="l00819"></a><span class="lineno">  819</span>     <span class="keywordflow">if</span>(maxY<=minY)</div>
+<div class="line"><a name="l00820"></a><span class="lineno">  820</span>       imgReader2.getMinMax(minY,maxY,band_opt[1]);</div>
+<div class="line"><a name="l00821"></a><span class="lineno">  821</span> </div>
+<div class="line"><a name="l00822"></a><span class="lineno">  822</span>     <span class="keywordflow">if</span>(maxX<=minX){</div>
+<div class="line"><a name="l00823"></a><span class="lineno">  823</span>       std::ostringstream s;</div>
+<div class="line"><a name="l00824"></a><span class="lineno">  824</span>       s<<<span class="stringliteral">"Error: could not calculate distribution (minX>=maxX)"</span>;</div>
+<div class="line"><a name="l00825"></a><span class="lineno">  825</span>       <span class="keywordflow">throw</span>(s.str());</div>
+<div class="line"><a name="l00826"></a><span class="lineno">  826</span>     }</div>
+<div class="line"><a name="l00827"></a><span class="lineno">  827</span>     <span class="keywordflow">if</span>(maxY<=minY){</div>
+<div class="line"><a name="l00828"></a><span class="lineno">  828</span>       std::ostringstream s;</div>
+<div class="line"><a name="l00829"></a><span class="lineno">  829</span>       s<<<span class="stringliteral">"Error: could not calculate distribution (minY>=maxY)"</span>;</div>
+<div class="line"><a name="l00830"></a><span class="lineno">  830</span>       <span class="keywordflow">throw</span>(s.str());</div>
 <div class="line"><a name="l00831"></a><span class="lineno">  831</span>     }</div>
-<div class="line"><a name="l00832"></a><span class="lineno">  832</span>     <span class="keywordtype">int</span> binX=0;</div>
-<div class="line"><a name="l00833"></a><span class="lineno">  833</span>     <span class="keywordtype">int</span> binY=0;</div>
-<div class="line"><a name="l00834"></a><span class="lineno">  834</span>     vector<double> inputX(imgReader1.nrOfCol());</div>
-<div class="line"><a name="l00835"></a><span class="lineno">  835</span>     vector<double> inputY(imgReader2.nrOfCol());</div>
-<div class="line"><a name="l00836"></a><span class="lineno">  836</span>     <span class="keywordtype">double</span> nvalid=0;</div>
-<div class="line"><a name="l00837"></a><span class="lineno">  837</span>     <span class="keywordtype">double</span> geoX=0;</div>
-<div class="line"><a name="l00838"></a><span class="lineno">  838</span>     <span class="keywordtype">double</span> geoY=0;</div>
-<div class="line"><a name="l00839"></a><span class="lineno">  839</span>     <span class="keywordtype">double</span> icol1=0;</div>
-<div class="line"><a name="l00840"></a><span class="lineno">  840</span>     <span class="keywordtype">double</span> irow1=0;</div>
-<div class="line"><a name="l00841"></a><span class="lineno">  841</span>     <span class="keywordtype">double</span> icol2=0;</div>
-<div class="line"><a name="l00842"></a><span class="lineno">  842</span>     <span class="keywordtype">double</span> irow2=0;</div>
-<div class="line"><a name="l00843"></a><span class="lineno">  843</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> irow=0;irow<imgReader1.nrOfRow();++irow){</div>
-<div class="line"><a name="l00844"></a><span class="lineno">  844</span>       <span class="keywordflow">if</span>(irow%down_opt[0])</div>
-<div class="line"><a name="l00845"></a><span class="lineno">  845</span>     <span class="keywordflow">continue</span>;</div>
-<div class="line"><a name="l00846"></a><span class="lineno">  846</span>       irow1=irow;</div>
-<div class="line"><a name="l00847"></a><span class="lineno">  847</span>       imgReader1.image2geo(icol1,irow1,geoX,geoY);</div>
-<div class="line"><a name="l00848"></a><span class="lineno">  848</span>       imgReader2.geo2image(geoX,geoY,icol2,irow2);</div>
-<div class="line"><a name="l00849"></a><span class="lineno">  849</span>       irow2=<span class="keyword">static_cast<</span><span class="keywordtype">int</span><span class="keyword">></span>(irow2);</div>
-<div class="line"><a name="l00850"></a><span class="lineno">  850</span>       imgReader1.readData(inputX,GDT_Float64,irow1,band_opt[0]);</div>
-<div class="line"><a name="l00851"></a><span class="lineno">  851</span>       imgReader2.readData(inputY,GDT_Float64,irow2,band_opt[1]);</div>
-<div class="line"><a name="l00852"></a><span class="lineno">  852</span>       <span class="keywordflow">for</span>(<span class="keywordtype">int</span> icol=0;icol<imgReader.nrOfCol();++icol){</div>
-<div class="line"><a name="l00853"></a><span class="lineno">  853</span>     <span class="keywordflow">if</span>(icol%down_opt[0])</div>
-<div class="line"><a name="l00854"></a><span class="lineno">  854</span>       <span class="keywordflow">continue</span>;</div>
-<div class="line"><a name="l00855"></a><span class="lineno">  855</span>     icol1=icol;</div>
-<div class="line"><a name="l00856"></a><span class="lineno">  856</span>     <span class="keywordflow">if</span>(random_opt[0]>0){</div>
-<div class="line"><a name="l00857"></a><span class="lineno">  857</span>       <span class="keywordtype">double</span> p=<span class="keyword">static_cast<</span><span class="keywordtype">double</span><span class="keyword">></span>(rand())/(RAND_MAX);</div>
-<div class="line"><a name="l00858"></a><span class="lineno">  858</span>       p*=100.0;</div>
-<div class="line"><a name="l00859"></a><span class="lineno">  859</span>       <span class="keywordflow">if</span>(p>random_opt[0])</div>
-<div class="line"><a name="l00860"></a><span class="lineno">  860</span>         <span class="keywordflow">continue</span>;<span class="comment">//do not select for now, go to next column</span></div>
-<div class="line"><a name="l00861"></a><span class="lineno">  861</span>     }</div>
-<div class="line"><a name="l00862"></a><span class="lineno">  862</span>     <span class="keywordflow">if</span>(imgReader1.isNoData(inputX[icol]))</div>
-<div class="line"><a name="l00863"></a><span class="lineno">  863</span>       <span class="keywordflow">continue</span>;</div>
-<div class="line"><a name="l00864"></a><span class="lineno">  864</span>     imgReader1.image2geo(icol1,irow1,geoX,geoY);</div>
-<div class="line"><a name="l00865"></a><span class="lineno">  865</span>     imgReader2.geo2image(geoX,geoY,icol2,irow2);</div>
-<div class="line"><a name="l00866"></a><span class="lineno">  866</span>     icol2=<span class="keyword">static_cast<</span><span class="keywordtype">int</span><span class="keyword">></span>(icol2);</div>
-<div class="line"><a name="l00867"></a><span class="lineno">  867</span>     <span class="keywordflow">if</span>(imgReader2.isNoData(inputY[icol2]))</div>
-<div class="line"><a name="l00868"></a><span class="lineno">  868</span>       <span class="keywordflow">continue</span>;</div>
-<div class="line"><a name="l00869"></a><span class="lineno">  869</span>     <span class="comment">// ++nvalid;</span></div>
-<div class="line"><a name="l00870"></a><span class="lineno">  870</span>     <span class="keywordflow">if</span>(inputX[icol1]>=maxX)</div>
-<div class="line"><a name="l00871"></a><span class="lineno">  871</span>       binX=nbin-1;</div>
-<div class="line"><a name="l00872"></a><span class="lineno">  872</span>     <span class="keywordflow">else</span> <span class="keywordflow">if</span>(inputX[icol]<=minX)</div>
-<div class="line"><a name="l00873"></a><span class="lineno">  873</span>       binX=0;</div>
-<div class="line"><a name="l00874"></a><span class="lineno">  874</span>     <span class="keywordflow">else</span></div>
-<div class="line"><a name="l00875"></a><span class="lineno">  875</span>       binX=<span class="keyword">static_cast<</span><span class="keywordtype">int</span><span class="keyword">></span>(<span class="keyword">static_cast<</span><span class="keywordtype">double</span><span class="keyword">></span>(inputX[icol1]-minX)/(maxX-minX)*nbin);</div>
-<div class="line"><a name="l00876"></a><span class="lineno">  876</span>     <span class="keywordflow">if</span>(inputY[icol2]>=maxY)</div>
-<div class="line"><a name="l00877"></a><span class="lineno">  877</span>       binY=nbin-1;</div>
-<div class="line"><a name="l00878"></a><span class="lineno">  878</span>     <span class="keywordflow">else</span> <span class="keywordflow">if</span>(inputY[icol2]<=minY)</div>
-<div class="line"><a name="l00879"></a><span class="lineno">  879</span>       binY=0;</div>
-<div class="line"><a name="l00880"></a><span class="lineno">  880</span>     <span class="keywordflow">else</span></div>
-<div class="line"><a name="l00881"></a><span class="lineno">  881</span>       binY=<span class="keyword">static_cast<</span><span class="keywordtype">int</span><span class="keyword">></span>(<span class="keyword">static_cast<</span><span class="keywordtype">double</span><span class="keyword">></span>(inputY[icol2]-minY)/(maxY-minY)*nbin);</div>
-<div class="line"><a name="l00882"></a><span class="lineno">  882</span>     assert(binX>=0);</div>
-<div class="line"><a name="l00883"></a><span class="lineno">  883</span>     assert(binX<output.size());</div>
-<div class="line"><a name="l00884"></a><span class="lineno">  884</span>     assert(binY>=0);</div>
-<div class="line"><a name="l00885"></a><span class="lineno">  885</span>     assert(binY<output[binX].size());</div>
-<div class="line"><a name="l00886"></a><span class="lineno">  886</span>     <span class="keywordflow">if</span>(sigma>0){</div>
-<div class="line"><a name="l00887"></a><span class="lineno">  887</span>       <span class="comment">//create kde for Gaussian basis function</span></div>
-<div class="line"><a name="l00888"></a><span class="lineno">  888</span>       <span class="comment">//todo: speed up by calculating first and last bin with non-zero contriubtion...</span></div>
-<div class="line"><a name="l00889"></a><span class="lineno">  889</span>       <span class="keywordflow">for</span>(<span class="keywordtype">int</span> ibinX=0;ibinX<nbin;++ibinX){</div>
-<div class="line"><a name="l00890"></a><span class="lineno">  890</span>         <span class="keywordtype">double</span> centerX=minX+<span class="keyword">static_cast<</span><span class="keywordtype">double</span><span class="keyword">></span>(maxX-minX)*ibinX/nbin;</div>
-<div class="line"><a name="l00891"></a><span class="lineno">  891</span>         <span class="keywordtype">double</span> pdfX=gsl_ran_gaussian_pdf(inputX[icol1]-centerX, sigma);</div>
-<div class="line"><a name="l00892"></a><span class="lineno">  892</span>         <span class="keywordflow">for</span>(<span class="keywordtype">int</span> ibinY=0;ibinY<nbin;++ibinY){</div>
-<div class="line"><a name="l00893"></a><span class="lineno">  893</span>           <span class="comment">//calculate  \integral_ibinX^(ibinX+1)</span></div>
-<div class="line"><a name="l00894"></a><span class="lineno">  894</span>           <span class="keywordtype">double</span> centerY=minY+<span class="keyword">static_cast<</span><span class="keywordtype">double</span><span class="keyword">></span>(maxY-minY)*ibinY/nbin;</div>
-<div class="line"><a name="l00895"></a><span class="lineno">  895</span>           <span class="keywordtype">double</span> pdfY=gsl_ran_gaussian_pdf(inputY[icol2]-centerY, sigma);</div>
-<div class="line"><a name="l00896"></a><span class="lineno">  896</span>           output[ibinX][binY]+=pdfX*pdfY;</div>
-<div class="line"><a name="l00897"></a><span class="lineno">  897</span>           nvalid+=pdfX*pdfY;</div>
-<div class="line"><a name="l00898"></a><span class="lineno">  898</span>         }</div>
-<div class="line"><a name="l00899"></a><span class="lineno">  899</span>       }</div>
-<div class="line"><a name="l00900"></a><span class="lineno">  900</span>     }</div>
-<div class="line"><a name="l00901"></a><span class="lineno">  901</span>     <span class="keywordflow">else</span>{</div>
-<div class="line"><a name="l00902"></a><span class="lineno">  902</span>       ++output[binX][binY];</div>
-<div class="line"><a name="l00903"></a><span class="lineno">  903</span>       ++nvalid;</div>
-<div class="line"><a name="l00904"></a><span class="lineno">  904</span>     }</div>
-<div class="line"><a name="l00905"></a><span class="lineno">  905</span>       }</div>
-<div class="line"><a name="l00906"></a><span class="lineno">  906</span>     }</div>
-<div class="line"><a name="l00907"></a><span class="lineno">  907</span>     <span class="keywordflow">if</span>(verbose_opt[0])</div>
-<div class="line"><a name="l00908"></a><span class="lineno">  908</span>       cout << <span class="stringliteral">"number of valid pixels: "</span> << nvalid << endl;</div>
-<div class="line"><a name="l00909"></a><span class="lineno">  909</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> binX=0;binX<nbin;++binX){</div>
-<div class="line"><a name="l00910"></a><span class="lineno">  910</span>       cout << endl;</div>
-<div class="line"><a name="l00911"></a><span class="lineno">  911</span>       <span class="keywordflow">for</span>(<span class="keywordtype">int</span> binY=0;binY<nbin;++binY){</div>
-<div class="line"><a name="l00912"></a><span class="lineno">  912</span>     <span class="keywordtype">double</span> binValueX=0;</div>
-<div class="line"><a name="l00913"></a><span class="lineno">  913</span>     <span class="keywordflow">if</span>(nbin==maxX-minX+1)</div>
-<div class="line"><a name="l00914"></a><span class="lineno">  914</span>       binValueX=minX+binX;</div>
-<div class="line"><a name="l00915"></a><span class="lineno">  915</span>     <span class="keywordflow">else</span></div>
-<div class="line"><a name="l00916"></a><span class="lineno">  916</span>       binValueX=minX+<span class="keyword">static_cast<</span><span class="keywordtype">double</span><span class="keyword">></span>(maxX-minX)*(binX+0.5)/nbin;</div>
-<div class="line"><a name="l00917"></a><span class="lineno">  917</span>     <span class="keywordtype">double</span> binValueY=0;</div>
-<div class="line"><a name="l00918"></a><span class="lineno">  918</span>     <span class="keywordflow">if</span>(nbin==maxY-minY+1)</div>
-<div class="line"><a name="l00919"></a><span class="lineno">  919</span>       binValueY=minY+binY;</div>
-<div class="line"><a name="l00920"></a><span class="lineno">  920</span>     <span class="keywordflow">else</span></div>
-<div class="line"><a name="l00921"></a><span class="lineno">  921</span>       binValueY=minY+<span class="keyword">static_cast<</span><span class="keywordtype">double</span><span class="keyword">></span>(maxY-minY)*(binY+0.5)/nbin;</div>
-<div class="line"><a name="l00922"></a><span class="lineno">  922</span>     <span class="keywordtype">double</span> value=<span class="keyword">static_cast<</span><span class="keywordtype">double</span><span class="keyword">></span>(output[binX][binY]);</div>
-<div class="line"><a name="l00923"></a><span class="lineno">  923</span>       </div>
-<div class="line"><a name="l00924"></a><span class="lineno">  924</span>     <span class="keywordflow">if</span>(relative_opt[0]||kde_opt[0])</div>
-<div class="line"><a name="l00925"></a><span class="lineno">  925</span>       value*=100.0/nvalid;</div>
-<div class="line"><a name="l00926"></a><span class="lineno">  926</span> </div>
-<div class="line"><a name="l00927"></a><span class="lineno">  927</span>     cout << binValueX << <span class="stringliteral">" "</span> << binValueY << <span class="stringliteral">" "</span> << value << std::endl;</div>
-<div class="line"><a name="l00928"></a><span class="lineno">  928</span>     <span class="comment">// double value=static_cast<double>(output[binX][binY])/nvalid;</span></div>
-<div class="line"><a name="l00929"></a><span class="lineno">  929</span>     <span class="comment">// cout << (maxX-minX)*bin/(nbin-1)+minX << " " << (maxY-minY)*bin/(nbin-1)+minY << " " << value << std::endl;</span></div>
-<div class="line"><a name="l00930"></a><span class="lineno">  930</span>       }</div>
-<div class="line"><a name="l00931"></a><span class="lineno">  931</span>     }</div>
-<div class="line"><a name="l00932"></a><span class="lineno">  932</span>     imgReader1.close();</div>
-<div class="line"><a name="l00933"></a><span class="lineno">  933</span>     imgReader2.close();</div>
-<div class="line"><a name="l00934"></a><span class="lineno">  934</span>   }</div>
-<div class="line"><a name="l00935"></a><span class="lineno">  935</span> </div>
-<div class="line"><a name="l00936"></a><span class="lineno">  936</span>   <span class="keywordflow">if</span>(!histogram_opt[0]||histogram2d_opt[0])</div>
-<div class="line"><a name="l00937"></a><span class="lineno">  937</span>     std::cout << std::endl;</div>
-<div class="line"><a name="l00938"></a><span class="lineno">  938</span> }</div>
-<div class="line"><a name="l00939"></a><span class="lineno">  939</span>   </div>
-<div class="line"><a name="l00940"></a><span class="lineno">  940</span> <span class="comment">// int nband=(band_opt.size()) ? band_opt.size() : imgReader.nrOfBand();</span></div>
-<div class="line"><a name="l00941"></a><span class="lineno">  941</span> </div>
-<div class="line"><a name="l00942"></a><span class="lineno">  942</span> <span class="comment">// const char* pszMessage;</span></div>
-<div class="line"><a name="l00943"></a><span class="lineno">  943</span> <span class="comment">// void* pProgressArg=NULL;</span></div>
-<div class="line"><a name="l00944"></a><span class="lineno">  944</span> <span class="comment">// GDALProgressFunc pfnProgress=GDALTermProgress;</span></div>
-<div class="line"><a name="l00945"></a><span class="lineno">  945</span> <span class="comment">// double progress=0;</span></div>
-<div class="line"><a name="l00946"></a><span class="lineno">  946</span> <span class="comment">// srand(time(NULL));</span></div>
+<div class="line"><a name="l00832"></a><span class="lineno">  832</span>     <span class="keywordflow">if</span>(verbose_opt[0]){</div>
+<div class="line"><a name="l00833"></a><span class="lineno">  833</span>       cout << <span class="stringliteral">"minX: "</span> << minX << endl;</div>
+<div class="line"><a name="l00834"></a><span class="lineno">  834</span>       cout << <span class="stringliteral">"maxX: "</span> << maxX << endl;</div>
+<div class="line"><a name="l00835"></a><span class="lineno">  835</span>       cout << <span class="stringliteral">"minY: "</span> << minY << endl;</div>
+<div class="line"><a name="l00836"></a><span class="lineno">  836</span>       cout << <span class="stringliteral">"maxY: "</span> << maxY << endl;</div>
+<div class="line"><a name="l00837"></a><span class="lineno">  837</span>     }</div>
+<div class="line"><a name="l00838"></a><span class="lineno">  838</span>     output.resize(nbin);</div>
+<div class="line"><a name="l00839"></a><span class="lineno">  839</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> i=0;i<nbin;++i){</div>
+<div class="line"><a name="l00840"></a><span class="lineno">  840</span>       output[i].resize(nbin);</div>
+<div class="line"><a name="l00841"></a><span class="lineno">  841</span>       <span class="keywordflow">for</span>(<span class="keywordtype">int</span> j=0;j<nbin;++j)</div>
+<div class="line"><a name="l00842"></a><span class="lineno">  842</span>     output[i][j]=0;</div>
+<div class="line"><a name="l00843"></a><span class="lineno">  843</span>     }</div>
+<div class="line"><a name="l00844"></a><span class="lineno">  844</span>     <span class="keywordtype">int</span> binX=0;</div>
+<div class="line"><a name="l00845"></a><span class="lineno">  845</span>     <span class="keywordtype">int</span> binY=0;</div>
+<div class="line"><a name="l00846"></a><span class="lineno">  846</span>     vector<double> inputX(imgReader1.nrOfCol());</div>
+<div class="line"><a name="l00847"></a><span class="lineno">  847</span>     vector<double> inputY(imgReader2.nrOfCol());</div>
+<div class="line"><a name="l00848"></a><span class="lineno">  848</span>     <span class="keywordtype">double</span> nvalid=0;</div>
+<div class="line"><a name="l00849"></a><span class="lineno">  849</span>     <span class="keywordtype">double</span> geoX=0;</div>
+<div class="line"><a name="l00850"></a><span class="lineno">  850</span>     <span class="keywordtype">double</span> geoY=0;</div>
+<div class="line"><a name="l00851"></a><span class="lineno">  851</span>     <span class="keywordtype">double</span> icol1=0;</div>
+<div class="line"><a name="l00852"></a><span class="lineno">  852</span>     <span class="keywordtype">double</span> irow1=0;</div>
+<div class="line"><a name="l00853"></a><span class="lineno">  853</span>     <span class="keywordtype">double</span> icol2=0;</div>
+<div class="line"><a name="l00854"></a><span class="lineno">  854</span>     <span class="keywordtype">double</span> irow2=0;</div>
+<div class="line"><a name="l00855"></a><span class="lineno">  855</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> irow=0;irow<imgReader1.nrOfRow();++irow){</div>
+<div class="line"><a name="l00856"></a><span class="lineno">  856</span>       <span class="keywordflow">if</span>(irow%down_opt[0])</div>
+<div class="line"><a name="l00857"></a><span class="lineno">  857</span>     <span class="keywordflow">continue</span>;</div>
+<div class="line"><a name="l00858"></a><span class="lineno">  858</span>       irow1=irow;</div>
+<div class="line"><a name="l00859"></a><span class="lineno">  859</span>       imgReader1.image2geo(icol1,irow1,geoX,geoY);</div>
+<div class="line"><a name="l00860"></a><span class="lineno">  860</span>       imgReader2.geo2image(geoX,geoY,icol2,irow2);</div>
+<div class="line"><a name="l00861"></a><span class="lineno">  861</span>       irow2=<span class="keyword">static_cast<</span><span class="keywordtype">int</span><span class="keyword">></span>(irow2);</div>
+<div class="line"><a name="l00862"></a><span class="lineno">  862</span>       imgReader1.readData(inputX,GDT_Float64,irow1,band_opt[0]);</div>
+<div class="line"><a name="l00863"></a><span class="lineno">  863</span>       imgReader2.readData(inputY,GDT_Float64,irow2,band_opt[1]);</div>
+<div class="line"><a name="l00864"></a><span class="lineno">  864</span>       <span class="keywordflow">for</span>(<span class="keywordtype">int</span> icol=0;icol<imgReader.nrOfCol();++icol){</div>
+<div class="line"><a name="l00865"></a><span class="lineno">  865</span>     <span class="keywordflow">if</span>(icol%down_opt[0])</div>
+<div class="line"><a name="l00866"></a><span class="lineno">  866</span>       <span class="keywordflow">continue</span>;</div>
+<div class="line"><a name="l00867"></a><span class="lineno">  867</span>     icol1=icol;</div>
+<div class="line"><a name="l00868"></a><span class="lineno">  868</span>     <span class="keywordflow">if</span>(random_opt[0]>0){</div>
+<div class="line"><a name="l00869"></a><span class="lineno">  869</span>       <span class="keywordtype">double</span> p=<span class="keyword">static_cast<</span><span class="keywordtype">double</span><span class="keyword">></span>(rand())/(RAND_MAX);</div>
+<div class="line"><a name="l00870"></a><span class="lineno">  870</span>       p*=100.0;</div>
+<div class="line"><a name="l00871"></a><span class="lineno">  871</span>       <span class="keywordflow">if</span>(p>random_opt[0])</div>
+<div class="line"><a name="l00872"></a><span class="lineno">  872</span>         <span class="keywordflow">continue</span>;<span class="comment">//do not select for now, go to next column</span></div>
+<div class="line"><a name="l00873"></a><span class="lineno">  873</span>     }</div>
+<div class="line"><a name="l00874"></a><span class="lineno">  874</span>     <span class="keywordflow">if</span>(imgReader1.isNoData(inputX[icol]))</div>
+<div class="line"><a name="l00875"></a><span class="lineno">  875</span>       <span class="keywordflow">continue</span>;</div>
+<div class="line"><a name="l00876"></a><span class="lineno">  876</span>     imgReader1.image2geo(icol1,irow1,geoX,geoY);</div>
+<div class="line"><a name="l00877"></a><span class="lineno">  877</span>     imgReader2.geo2image(geoX,geoY,icol2,irow2);</div>
+<div class="line"><a name="l00878"></a><span class="lineno">  878</span>     icol2=<span class="keyword">static_cast<</span><span class="keywordtype">int</span><span class="keyword">></span>(icol2);</div>
+<div class="line"><a name="l00879"></a><span class="lineno">  879</span>     <span class="keywordflow">if</span>(imgReader2.isNoData(inputY[icol2]))</div>
+<div class="line"><a name="l00880"></a><span class="lineno">  880</span>       <span class="keywordflow">continue</span>;</div>
+<div class="line"><a name="l00881"></a><span class="lineno">  881</span>     <span class="comment">// ++nvalid;</span></div>
+<div class="line"><a name="l00882"></a><span class="lineno">  882</span>     <span class="keywordflow">if</span>(inputX[icol1]>=maxX)</div>
+<div class="line"><a name="l00883"></a><span class="lineno">  883</span>       binX=nbin-1;</div>
+<div class="line"><a name="l00884"></a><span class="lineno">  884</span>     <span class="keywordflow">else</span> <span class="keywordflow">if</span>(inputX[icol]<=minX)</div>
+<div class="line"><a name="l00885"></a><span class="lineno">  885</span>       binX=0;</div>
+<div class="line"><a name="l00886"></a><span class="lineno">  886</span>     <span class="keywordflow">else</span></div>
+<div class="line"><a name="l00887"></a><span class="lineno">  887</span>       binX=<span class="keyword">static_cast<</span><span class="keywordtype">int</span><span class="keyword">></span>(<span class="keyword">static_cast<</span><span class="keywordtype">double</span><span class="keyword">></span>(inputX[icol1]-minX)/(maxX-minX)*nbin);</div>
+<div class="line"><a name="l00888"></a><span class="lineno">  888</span>     <span class="keywordflow">if</span>(inputY[icol2]>=maxY)</div>
+<div class="line"><a name="l00889"></a><span class="lineno">  889</span>       binY=nbin-1;</div>
+<div class="line"><a name="l00890"></a><span class="lineno">  890</span>     <span class="keywordflow">else</span> <span class="keywordflow">if</span>(inputY[icol2]<=minY)</div>
+<div class="line"><a name="l00891"></a><span class="lineno">  891</span>       binY=0;</div>
+<div class="line"><a name="l00892"></a><span class="lineno">  892</span>     <span class="keywordflow">else</span></div>
+<div class="line"><a name="l00893"></a><span class="lineno">  893</span>       binY=<span class="keyword">static_cast<</span><span class="keywordtype">int</span><span class="keyword">></span>(<span class="keyword">static_cast<</span><span class="keywordtype">double</span><span class="keyword">></span>(inputY[icol2]-minY)/(maxY-minY)*nbin);</div>
+<div class="line"><a name="l00894"></a><span class="lineno">  894</span>     assert(binX>=0);</div>
+<div class="line"><a name="l00895"></a><span class="lineno">  895</span>     assert(binX<output.size());</div>
+<div class="line"><a name="l00896"></a><span class="lineno">  896</span>     assert(binY>=0);</div>
+<div class="line"><a name="l00897"></a><span class="lineno">  897</span>     assert(binY<output[binX].size());</div>
+<div class="line"><a name="l00898"></a><span class="lineno">  898</span>     <span class="keywordflow">if</span>(sigma>0){</div>
+<div class="line"><a name="l00899"></a><span class="lineno">  899</span>       <span class="comment">//create kde for Gaussian basis function</span></div>
+<div class="line"><a name="l00900"></a><span class="lineno">  900</span>       <span class="comment">//todo: speed up by calculating first and last bin with non-zero contriubtion...</span></div>
+<div class="line"><a name="l00901"></a><span class="lineno">  901</span>       <span class="keywordflow">for</span>(<span class="keywordtype">int</span> ibinX=0;ibinX<nbin;++ibinX){</div>
+<div class="line"><a name="l00902"></a><span class="lineno">  902</span>         <span class="keywordtype">double</span> centerX=minX+<span class="keyword">static_cast<</span><span class="keywordtype">double</span><span class="keyword">></span>(maxX-minX)*ibinX/nbin;</div>
+<div class="line"><a name="l00903"></a><span class="lineno">  903</span>         <span class="keywordtype">double</span> pdfX=gsl_ran_gaussian_pdf(inputX[icol1]-centerX, sigma);</div>
+<div class="line"><a name="l00904"></a><span class="lineno">  904</span>         <span class="keywordflow">for</span>(<span class="keywordtype">int</span> ibinY=0;ibinY<nbin;++ibinY){</div>
+<div class="line"><a name="l00905"></a><span class="lineno">  905</span>           <span class="comment">//calculate  \integral_ibinX^(ibinX+1)</span></div>
+<div class="line"><a name="l00906"></a><span class="lineno">  906</span>           <span class="keywordtype">double</span> centerY=minY+<span class="keyword">static_cast<</span><span class="keywordtype">double</span><span class="keyword">></span>(maxY-minY)*ibinY/nbin;</div>
+<div class="line"><a name="l00907"></a><span class="lineno">  907</span>           <span class="keywordtype">double</span> pdfY=gsl_ran_gaussian_pdf(inputY[icol2]-centerY, sigma);</div>
+<div class="line"><a name="l00908"></a><span class="lineno">  908</span>           output[ibinX][binY]+=pdfX*pdfY;</div>
+<div class="line"><a name="l00909"></a><span class="lineno">  909</span>           nvalid+=pdfX*pdfY;</div>
+<div class="line"><a name="l00910"></a><span class="lineno">  910</span>         }</div>
+<div class="line"><a name="l00911"></a><span class="lineno">  911</span>       }</div>
+<div class="line"><a name="l00912"></a><span class="lineno">  912</span>     }</div>
+<div class="line"><a name="l00913"></a><span class="lineno">  913</span>     <span class="keywordflow">else</span>{</div>
+<div class="line"><a name="l00914"></a><span class="lineno">  914</span>       ++output[binX][binY];</div>
+<div class="line"><a name="l00915"></a><span class="lineno">  915</span>       ++nvalid;</div>
+<div class="line"><a name="l00916"></a><span class="lineno">  916</span>     }</div>
+<div class="line"><a name="l00917"></a><span class="lineno">  917</span>       }</div>
+<div class="line"><a name="l00918"></a><span class="lineno">  918</span>     }</div>
+<div class="line"><a name="l00919"></a><span class="lineno">  919</span>     <span class="keywordflow">if</span>(verbose_opt[0])</div>
+<div class="line"><a name="l00920"></a><span class="lineno">  920</span>       cout << <span class="stringliteral">"number of valid pixels: "</span> << nvalid << endl;</div>
+<div class="line"><a name="l00921"></a><span class="lineno">  921</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> binX=0;binX<nbin;++binX){</div>
+<div class="line"><a name="l00922"></a><span class="lineno">  922</span>       cout << endl;</div>
+<div class="line"><a name="l00923"></a><span class="lineno">  923</span>       <span class="keywordflow">for</span>(<span class="keywordtype">int</span> binY=0;binY<nbin;++binY){</div>
+<div class="line"><a name="l00924"></a><span class="lineno">  924</span>     <span class="keywordtype">double</span> binValueX=0;</div>
+<div class="line"><a name="l00925"></a><span class="lineno">  925</span>     <span class="keywordflow">if</span>(nbin==maxX-minX+1)</div>
+<div class="line"><a name="l00926"></a><span class="lineno">  926</span>       binValueX=minX+binX;</div>
+<div class="line"><a name="l00927"></a><span class="lineno">  927</span>     <span class="keywordflow">else</span></div>
+<div class="line"><a name="l00928"></a><span class="lineno">  928</span>       binValueX=minX+<span class="keyword">static_cast<</span><span class="keywordtype">double</span><span class="keyword">></span>(maxX-minX)*(binX+0.5)/nbin;</div>
+<div class="line"><a name="l00929"></a><span class="lineno">  929</span>     <span class="keywordtype">double</span> binValueY=0;</div>
+<div class="line"><a name="l00930"></a><span class="lineno">  930</span>     <span class="keywordflow">if</span>(nbin==maxY-minY+1)</div>
+<div class="line"><a name="l00931"></a><span class="lineno">  931</span>       binValueY=minY+binY;</div>
+<div class="line"><a name="l00932"></a><span class="lineno">  932</span>     <span class="keywordflow">else</span></div>
+<div class="line"><a name="l00933"></a><span class="lineno">  933</span>       binValueY=minY+<span class="keyword">static_cast<</span><span class="keywordtype">double</span><span class="keyword">></span>(maxY-minY)*(binY+0.5)/nbin;</div>
+<div class="line"><a name="l00934"></a><span class="lineno">  934</span>     <span class="keywordtype">double</span> value=<span class="keyword">static_cast<</span><span class="keywordtype">double</span><span class="keyword">></span>(output[binX][binY]);</div>
+<div class="line"><a name="l00935"></a><span class="lineno">  935</span>       </div>
+<div class="line"><a name="l00936"></a><span class="lineno">  936</span>     <span class="keywordflow">if</span>(relative_opt[0]||kde_opt[0])</div>
+<div class="line"><a name="l00937"></a><span class="lineno">  937</span>       value*=100.0/nvalid;</div>
+<div class="line"><a name="l00938"></a><span class="lineno">  938</span> </div>
+<div class="line"><a name="l00939"></a><span class="lineno">  939</span>     cout << binValueX << <span class="stringliteral">" "</span> << binValueY << <span class="stringliteral">" "</span> << value << std::endl;</div>
+<div class="line"><a name="l00940"></a><span class="lineno">  940</span>     <span class="comment">// double value=static_cast<double>(output[binX][binY])/nvalid;</span></div>
+<div class="line"><a name="l00941"></a><span class="lineno">  941</span>     <span class="comment">// cout << (maxX-minX)*bin/(nbin-1)+minX << " " << (maxY-minY)*bin/(nbin-1)+minY << " " << value << std::endl;</span></div>
+<div class="line"><a name="l00942"></a><span class="lineno">  942</span>       }</div>
+<div class="line"><a name="l00943"></a><span class="lineno">  943</span>     }</div>
+<div class="line"><a name="l00944"></a><span class="lineno">  944</span>     imgReader1.close();</div>
+<div class="line"><a name="l00945"></a><span class="lineno">  945</span>     imgReader2.close();</div>
+<div class="line"><a name="l00946"></a><span class="lineno">  946</span>   }</div>
 <div class="line"><a name="l00947"></a><span class="lineno">  947</span> </div>
-<div class="line"><a name="l00948"></a><span class="lineno">  948</span> </div>
-<div class="line"><a name="l00949"></a><span class="lineno">  949</span> <span class="comment">// statfactory::StatFactory stat;</span></div>
-<div class="line"><a name="l00950"></a><span class="lineno">  950</span> <span class="comment">// imgregression::ImgRegression imgreg;</span></div>
-<div class="line"><a name="l00951"></a><span class="lineno">  951</span> </div>
-<div class="line"><a name="l00952"></a><span class="lineno">  952</span> <span class="comment">// pfnProgress(progress,pszMessage,pProgressArg);</span></div>
-<div class="line"><a name="l00953"></a><span class="lineno">  953</span> <span class="comment">// for(irow=0;irow<classReader.nrOfRow();++irow){</span></div>
-<div class="line"><a name="l00954"></a><span class="lineno">  954</span> <span class="comment">//   if(irow%down_opt[0])</span></div>
-<div class="line"><a name="l00955"></a><span class="lineno">  955</span> <span class="comment">//     continue;</span></div>
-<div class="line"><a name="l00956"></a><span class="lineno">  956</span> <span class="comment">//   // classReader.readData(classBuffer,GDT_Int32,irow);</span></div>
-<div class="line"><a name="l00957"></a><span class="lineno">  957</span> <span class="comment">//   classReader.readData(classBuffer,GDT_Float64,irow);</span></div>
-<div class="line"><a name="l00958"></a><span class="lineno">  958</span> <span class="comment">//   double x,y;//geo coordinates</span></div>
-<div class="line"><a name="l00959"></a><span class="lineno">  959</span> <span class="comment">//   double iimg,jimg;//image coordinates in img image</span></div>
-<div class="line"><a name="l00960"></a><span class="lineno">  960</span> <span class="comment">//   for(icol=0;icol<classReader.nrOfCol();++icol){</span></div>
-<div class="line"><a name="l00961"></a><span class="lineno">  961</span> <span class="comment">//     if(icol%down_opt[0])</span></div>
-<div class="line"><a name="l00962"></a><span class="lineno">  962</span>   <span class="comment">//    continue;</span></div>
+<div class="line"><a name="l00948"></a><span class="lineno">  948</span>   <span class="keywordflow">if</span>(!histogram_opt[0]||histogram2d_opt[0])</div>
+<div class="line"><a name="l00949"></a><span class="lineno">  949</span>     std::cout << std::endl;</div>
+<div class="line"><a name="l00950"></a><span class="lineno">  950</span> }</div>
+<div class="line"><a name="l00951"></a><span class="lineno">  951</span>   </div>
+<div class="line"><a name="l00952"></a><span class="lineno">  952</span> <span class="comment">// int nband=(band_opt.size()) ? band_opt.size() : imgReader.nrOfBand();</span></div>
+<div class="line"><a name="l00953"></a><span class="lineno">  953</span> </div>
+<div class="line"><a name="l00954"></a><span class="lineno">  954</span> <span class="comment">// const char* pszMessage;</span></div>
+<div class="line"><a name="l00955"></a><span class="lineno">  955</span> <span class="comment">// void* pProgressArg=NULL;</span></div>
+<div class="line"><a name="l00956"></a><span class="lineno">  956</span> <span class="comment">// GDALProgressFunc pfnProgress=GDALTermProgress;</span></div>
+<div class="line"><a name="l00957"></a><span class="lineno">  957</span> <span class="comment">// double progress=0;</span></div>
+<div class="line"><a name="l00958"></a><span class="lineno">  958</span> <span class="comment">// srand(time(NULL));</span></div>
+<div class="line"><a name="l00959"></a><span class="lineno">  959</span> </div>
+<div class="line"><a name="l00960"></a><span class="lineno">  960</span> </div>
+<div class="line"><a name="l00961"></a><span class="lineno">  961</span> <span class="comment">// statfactory::StatFactory stat;</span></div>
+<div class="line"><a name="l00962"></a><span class="lineno">  962</span> <span class="comment">// imgregression::ImgRegression imgreg;</span></div>
 <div class="line"><a name="l00963"></a><span class="lineno">  963</span> </div>
-<div class="line"><a name="l00964"></a><span class="lineno">  964</span> </div>
-<div class="line"><a name="l00965"></a><span class="lineno">  965</span>   <span class="comment">// if(rand_opt[0]>0){</span></div>
-<div class="line"><a name="l00966"></a><span class="lineno">  966</span>   <span class="comment">//   gsl_rng* r=stat.getRandomGenerator(time(NULL));</span></div>
-<div class="line"><a name="l00967"></a><span class="lineno">  967</span>   <span class="comment">//   //todo: init random number generator using time...</span></div>
-<div class="line"><a name="l00968"></a><span class="lineno">  968</span>   <span class="comment">//   if(verbose_opt[0])</span></div>
-<div class="line"><a name="l00969"></a><span class="lineno">  969</span>   <span class="comment">//     std::cout << "generating " << rand_opt[0] << " random numbers: " << std::endl;</span></div>
-<div class="line"><a name="l00970"></a><span class="lineno">  970</span>   <span class="comment">//   for(unsigned int i=0;i<rand_opt[0];++i)</span></div>
-<div class="line"><a name="l00971"></a><span class="lineno">  971</span>   <span class="comment">//     std::cout << i << " " << stat.getRandomValue(r,randdist_opt[0],randa_opt[0],randb_opt[0]) << std::endl;</span></div>
-<div class="line"><a name="l00972"></a><span class="lineno">  972</span>   <span class="comment">// }</span></div>
-<div class="line"><a name="l00973"></a><span class="lineno">  973</span> </div>
-<div class="line"><a name="l00974"></a><span class="lineno">  974</span>   <span class="comment">// imgreg.setDown(down_opt[0]);</span></div>
-<div class="line"><a name="l00975"></a><span class="lineno">  975</span>   <span class="comment">// imgreg.setThreshold(threshold_opt[0]);</span></div>
-<div class="line"><a name="l00976"></a><span class="lineno">  976</span>   <span class="comment">// double c0=0;//offset</span></div>
-<div class="line"><a name="l00977"></a><span class="lineno">  977</span>   <span class="comment">// double c1=1;//scale</span></div>
-<div class="line"><a name="l00978"></a><span class="lineno">  978</span>   <span class="comment">// double err=uncertNodata_opt[0];//start with high initial value in case we do not have first ob err=imgreg.getRMSE(imgReaderModel1,imgReader,c0,c1,verbose_opt[0]);</span></div>
-<div class="line"><a name="l00979"></a><span class="lineno">  979</span> </div>
-<div class="line"><a name="l00980"></a><span class="lineno">  980</span>   <span class="comment">//   int nband=band_opt.size();</span></div>
-<div class="line"><a name="l00981"></a><span class="lineno">  981</span>   <span class="comment">//   if(band_opt[0]<0)</span></div>
-<div class="line"><a name="l00982"></a><span class="lineno">  982</span>   <span class="comment">//     nband=imgReader.nrOfBand();</span></div>
-<div class="line"><a name="l00983"></a><span class="lineno">  983</span>   <span class="comment">//   for(int iband=0;iband<nband;++iband){</span></div>
-<div class="line"><a name="l00984"></a><span class="lineno">  984</span>   <span class="comment">//     unsigned short band_opt[iband]=(band_opt[0]<0)? iband : band_opt[iband];</span></div>
+<div class="line"><a name="l00964"></a><span class="lineno">  964</span> <span class="comment">// pfnProgress(progress,pszMessage,pProgressArg);</span></div>
+<div class="line"><a name="l00965"></a><span class="lineno">  965</span> <span class="comment">// for(irow=0;irow<classReader.nrOfRow();++irow){</span></div>
+<div class="line"><a name="l00966"></a><span class="lineno">  966</span> <span class="comment">//   if(irow%down_opt[0])</span></div>
+<div class="line"><a name="l00967"></a><span class="lineno">  967</span> <span class="comment">//     continue;</span></div>
+<div class="line"><a name="l00968"></a><span class="lineno">  968</span> <span class="comment">//   // classReader.readData(classBuffer,GDT_Int32,irow);</span></div>
+<div class="line"><a name="l00969"></a><span class="lineno">  969</span> <span class="comment">//   classReader.readData(classBuffer,GDT_Float64,irow);</span></div>
+<div class="line"><a name="l00970"></a><span class="lineno">  970</span> <span class="comment">//   double x,y;//geo coordinates</span></div>
+<div class="line"><a name="l00971"></a><span class="lineno">  971</span> <span class="comment">//   double iimg,jimg;//image coordinates in img image</span></div>
+<div class="line"><a name="l00972"></a><span class="lineno">  972</span> <span class="comment">//   for(icol=0;icol<classReader.nrOfCol();++icol){</span></div>
+<div class="line"><a name="l00973"></a><span class="lineno">  973</span> <span class="comment">//     if(icol%down_opt[0])</span></div>
+<div class="line"><a name="l00974"></a><span class="lineno">  974</span>   <span class="comment">//    continue;</span></div>
+<div class="line"><a name="l00975"></a><span class="lineno">  975</span> </div>
+<div class="line"><a name="l00976"></a><span class="lineno">  976</span> </div>
+<div class="line"><a name="l00977"></a><span class="lineno">  977</span>   <span class="comment">// if(rand_opt[0]>0){</span></div>
+<div class="line"><a name="l00978"></a><span class="lineno">  978</span>   <span class="comment">//   gsl_rng* r=stat.getRandomGenerator(time(NULL));</span></div>
+<div class="line"><a name="l00979"></a><span class="lineno">  979</span>   <span class="comment">//   //todo: init random number generator using time...</span></div>
+<div class="line"><a name="l00980"></a><span class="lineno">  980</span>   <span class="comment">//   if(verbose_opt[0])</span></div>
+<div class="line"><a name="l00981"></a><span class="lineno">  981</span>   <span class="comment">//     std::cout << "generating " << rand_opt[0] << " random numbers: " << std::endl;</span></div>
+<div class="line"><a name="l00982"></a><span class="lineno">  982</span>   <span class="comment">//   for(unsigned int i=0;i<rand_opt[0];++i)</span></div>
+<div class="line"><a name="l00983"></a><span class="lineno">  983</span>   <span class="comment">//     std::cout << i << " " << stat.getRandomValue(r,randdist_opt[0],randa_opt[0],randb_opt[0]) << std::endl;</span></div>
+<div class="line"><a name="l00984"></a><span class="lineno">  984</span>   <span class="comment">// }</span></div>
 <div class="line"><a name="l00985"></a><span class="lineno">  985</span> </div>
-<div class="line"><a name="l00986"></a><span class="lineno">  986</span>   <span class="comment">//     if(minmax_opt[0]||min_opt[0]||max_opt[0]){</span></div>
-<div class="line"><a name="l00987"></a><span class="lineno">  987</span>   <span class="comment">//    assert(band_opt[iband]<imgReader.nrOfBand());</span></div>
-<div class="line"><a name="l00988"></a><span class="lineno">  988</span>   <span class="comment">//    if((ulx_opt.size()||uly_opt.size()||lrx_opt.size()||lry_opt.size())&&(imgReader.covers(ulx_opt[0],uly_opt[0],lrx_opt[0],lry_opt[0]))){</span></div>
-<div class="line"><a name="l00989"></a><span class="lineno">  989</span>   <span class="comment">//      double uli,ulj,lri,lrj;</span></div>
-<div class="line"><a name="l00990"></a><span class="lineno">  990</span>   <span class="comment">//      imgReader.geo2image(ulx_opt[0],uly_opt[0],uli,ulj);</span></div>
-<div class="line"><a name="l00991"></a><span class="lineno">  991</span>   <span class="comment">//      imgReader.geo2image(lrx_opt[0],lry_opt[0],lri,lrj);</span></div>
-<div class="line"><a name="l00992"></a><span class="lineno">  992</span>   <span class="comment">//      imgReader.getMinMax(static_cast<int>(uli),static_cast<int>(lri),static_cast<int>(ulj),static_cast<int>(lrj),band_opt[iband],minValue,maxValue);</span></div>
-<div class="line"><a name="l00993"></a><span class="lineno">  993</span>   <span class="comment">//    }</span></div>
-<div class="line"><a name="l00994"></a><span class="lineno">  994</span>   <span class="comment">//    else</span></div>
-<div class="line"><a name="l00995"></a><span class="lineno">  995</span>   <span class="comment">//      imgReader.getMinMax(minValue,maxValue,band_opt[iband],true);</span></div>
-<div class="line"><a name="l00996"></a><span class="lineno">  996</span>   <span class="comment">//    if(minmax_opt[0])</span></div>
-<div class="line"><a name="l00997"></a><span class="lineno">  997</span>   <span class="comment">//      std::cout << "-min " << minValue << " -max " << maxValue << " ";</span></div>
-<div class="line"><a name="l00998"></a><span class="lineno">  998</span>   <span class="comment">//    else{</span></div>
-<div class="line"><a name="l00999"></a><span class="lineno">  999</span>   <span class="comment">//      if(min_opt[0])</span></div>
-<div class="line"><a name="l01000"></a><span class="lineno"> 1000</span>   <span class="comment">//        std::cout << "-min " << minValue << " ";</span></div>
-<div class="line"><a name="l01001"></a><span class="lineno"> 1001</span>   <span class="comment">//      if(max_opt[0])</span></div>
-<div class="line"><a name="l01002"></a><span class="lineno"> 1002</span>   <span class="comment">//        std::cout << "-max " << maxValue << " ";</span></div>
-<div class="line"><a name="l01003"></a><span class="lineno"> 1003</span>   <span class="comment">//    }</span></div>
-<div class="line"><a name="l01004"></a><span class="lineno"> 1004</span>   <span class="comment">//     }</span></div>
-<div class="line"><a name="l01005"></a><span class="lineno"> 1005</span>   <span class="comment">//   }</span></div>
-<div class="line"><a name="l01006"></a><span class="lineno"> 1006</span>   <span class="comment">//   if(relative_opt[0])</span></div>
-<div class="line"><a name="l01007"></a><span class="lineno"> 1007</span>   <span class="comment">//     hist_opt[0]=true;</span></div>
-<div class="line"><a name="l01008"></a><span class="lineno"> 1008</span>   <span class="comment">//   if(hist_opt[0]){</span></div>
-<div class="line"><a name="l01009"></a><span class="lineno"> 1009</span>   <span class="comment">//     assert(band_opt[0]<imgReader.nrOfBand());</span></div>
-<div class="line"><a name="l01010"></a><span class="lineno"> 1010</span>   <span class="comment">//     unsigned int nbin=(nbin_opt.size())? nbin_opt[0]:0;</span></div>
-<div class="line"><a name="l01011"></a><span class="lineno"> 1011</span>   <span class="comment">//     std::vector<unsigned long int> output;</span></div>
-<div class="line"><a name="l01012"></a><span class="lineno"> 1012</span>   <span class="comment">//     minValue=0;</span></div>
-<div class="line"><a name="l01013"></a><span class="lineno"> 1013</span>   <span class="comment">//     maxValue=0;</span></div>
-<div class="line"><a name="l01014"></a><span class="lineno"> 1014</span>   <span class="comment">//     //todo: optimize such that getMinMax is only called once...</span></div>
-<div class="line"><a name="l01015"></a><span class="lineno"> 1015</span>   <span class="comment">//     imgReader.getMinMax(minValue,maxValue,band_opt[0]);</span></div>
-<div class="line"><a name="l01016"></a><span class="lineno"> 1016</span>       </div>
-<div class="line"><a name="l01017"></a><span class="lineno"> 1017</span>   <span class="comment">//     if(src_min_opt.size())</span></div>
-<div class="line"><a name="l01018"></a><span class="lineno"> 1018</span>   <span class="comment">//       minValue=src_min_opt[0];</span></div>
-<div class="line"><a name="l01019"></a><span class="lineno"> 1019</span>   <span class="comment">//     if(src_max_opt.size())</span></div>
-<div class="line"><a name="l01020"></a><span class="lineno"> 1020</span>   <span class="comment">//       maxValue=src_max_opt[0];</span></div>
-<div class="line"><a name="l01021"></a><span class="lineno"> 1021</span>   <span class="comment">//     unsigned long int nsample=imgReader.getHistogram(output,minValue,maxValue,nbin,band_opt[0]);</span></div>
-<div class="line"><a name="l01022"></a><span class="lineno"> 1022</span>   <span class="comment">//     std::cout.precision(10);</span></div>
-<div class="line"><a name="l01023"></a><span class="lineno"> 1023</span>   <span class="comment">//     for(int bin=0;bin<nbin;++bin){</span></div>
-<div class="line"><a name="l01024"></a><span class="lineno"> 1024</span>   <span class="comment">//    double binValue=0;</span></div>
-<div class="line"><a name="l01025"></a><span class="lineno"> 1025</span>   <span class="comment">//    if(nbin==maxValue-minValue+1)</span></div>
-<div class="line"><a name="l01026"></a><span class="lineno"> 1026</span>   <span class="comment">//      binValue=minValue+bin;</span></div>
-<div class="line"><a name="l01027"></a><span class="lineno"> 1027</span>   <span class="comment">//    else</span></div>
-<div class="line"><a name="l01028"></a><span class="lineno"> 1028</span>   <span class="comment">//      binValue=minValue+static_cast<double>(maxValue-minValue)*(bin+0.5)/nbin;</span></div>
-<div class="line"><a name="l01029"></a><span class="lineno"> 1029</span>   <span class="comment">//    std::cout << binValue << " ";</span></div>
-<div class="line"><a name="l01030"></a><span class="lineno"> 1030</span>   <span class="comment">//    if(relative_opt[0])</span></div>
-<div class="line"><a name="l01031"></a><span class="lineno"> 1031</span>   <span class="comment">//      std::cout << 100.0*static_cast<double>(output[bin])/static_cast<double>(nsample) << std::endl;</span></div>
-<div class="line"><a name="l01032"></a><span class="lineno"> 1032</span>   <span class="comment">//    else</span></div>
-<div class="line"><a name="l01033"></a><span class="lineno"> 1033</span>   <span class="comment">//      std::cout << static_cast<double>(output[bin]) << std::endl;</span></div>
-<div class="line"><a name="l01034"></a><span class="lineno"> 1034</span>   <span class="comment">//     }</span></div>
-<div class="line"><a name="l01035"></a><span class="lineno"> 1035</span>   <span class="comment">//   }</span></div>
+<div class="line"><a name="l00986"></a><span class="lineno">  986</span>   <span class="comment">// imgreg.setDown(down_opt[0]);</span></div>
+<div class="line"><a name="l00987"></a><span class="lineno">  987</span>   <span class="comment">// imgreg.setThreshold(threshold_opt[0]);</span></div>
+<div class="line"><a name="l00988"></a><span class="lineno">  988</span>   <span class="comment">// double c0=0;//offset</span></div>
+<div class="line"><a name="l00989"></a><span class="lineno">  989</span>   <span class="comment">// double c1=1;//scale</span></div>
+<div class="line"><a name="l00990"></a><span class="lineno">  990</span>   <span class="comment">// double err=uncertNodata_opt[0];//start with high initial value in case we do not have first ob err=imgreg.getRMSE(imgReaderModel1,imgReader,c0,c1,verbose_opt[0]);</span></div>
+<div class="line"><a name="l00991"></a><span class="lineno">  991</span> </div>
+<div class="line"><a name="l00992"></a><span class="lineno">  992</span>   <span class="comment">//   int nband=band_opt.size();</span></div>
+<div class="line"><a name="l00993"></a><span class="lineno">  993</span>   <span class="comment">//   if(band_opt[0]<0)</span></div>
+<div class="line"><a name="l00994"></a><span class="lineno">  994</span>   <span class="comment">//     nband=imgReader.nrOfBand();</span></div>
+<div class="line"><a name="l00995"></a><span class="lineno">  995</span>   <span class="comment">//   for(int iband=0;iband<nband;++iband){</span></div>
+<div class="line"><a name="l00996"></a><span class="lineno">  996</span>   <span class="comment">//     unsigned short band_opt[iband]=(band_opt[0]<0)? iband : band_opt[iband];</span></div>
+<div class="line"><a name="l00997"></a><span class="lineno">  997</span> </div>
+<div class="line"><a name="l00998"></a><span class="lineno">  998</span>   <span class="comment">//     if(minmax_opt[0]||min_opt[0]||max_opt[0]){</span></div>
+<div class="line"><a name="l00999"></a><span class="lineno">  999</span>   <span class="comment">//    assert(band_opt[iband]<imgReader.nrOfBand());</span></div>
+<div class="line"><a name="l01000"></a><span class="lineno"> 1000</span>   <span class="comment">//    if((ulx_opt.size()||uly_opt.size()||lrx_opt.size()||lry_opt.size())&&(imgReader.covers(ulx_opt[0],uly_opt[0],lrx_opt[0],lry_opt[0]))){</span></div>
+<div class="line"><a name="l01001"></a><span class="lineno"> 1001</span>   <span class="comment">//      double uli,ulj,lri,lrj;</span></div>
+<div class="line"><a name="l01002"></a><span class="lineno"> 1002</span>   <span class="comment">//      imgReader.geo2image(ulx_opt[0],uly_opt[0],uli,ulj);</span></div>
+<div class="line"><a name="l01003"></a><span class="lineno"> 1003</span>   <span class="comment">//      imgReader.geo2image(lrx_opt[0],lry_opt[0],lri,lrj);</span></div>
+<div class="line"><a name="l01004"></a><span class="lineno"> 1004</span>   <span class="comment">//      imgReader.getMinMax(static_cast<int>(uli),static_cast<int>(lri),static_cast<int>(ulj),static_cast<int>(lrj),band_opt[iband],minValue,maxValue);</span></div>
+<div class="line"><a name="l01005"></a><span class="lineno"> 1005</span>   <span class="comment">//    }</span></div>
+<div class="line"><a name="l01006"></a><span class="lineno"> 1006</span>   <span class="comment">//    else</span></div>
+<div class="line"><a name="l01007"></a><span class="lineno"> 1007</span>   <span class="comment">//      imgReader.getMinMax(minValue,maxValue,band_opt[iband],true);</span></div>
+<div class="line"><a name="l01008"></a><span class="lineno"> 1008</span>   <span class="comment">//    if(minmax_opt[0])</span></div>
+<div class="line"><a name="l01009"></a><span class="lineno"> 1009</span>   <span class="comment">//      std::cout << "-min " << minValue << " -max " << maxValue << " ";</span></div>
+<div class="line"><a name="l01010"></a><span class="lineno"> 1010</span>   <span class="comment">//    else{</span></div>
+<div class="line"><a name="l01011"></a><span class="lineno"> 1011</span>   <span class="comment">//      if(min_opt[0])</span></div>
+<div class="line"><a name="l01012"></a><span class="lineno"> 1012</span>   <span class="comment">//        std::cout << "-min " << minValue << " ";</span></div>
+<div class="line"><a name="l01013"></a><span class="lineno"> 1013</span>   <span class="comment">//      if(max_opt[0])</span></div>
+<div class="line"><a name="l01014"></a><span class="lineno"> 1014</span>   <span class="comment">//        std::cout << "-max " << maxValue << " ";</span></div>
+<div class="line"><a name="l01015"></a><span class="lineno"> 1015</span>   <span class="comment">//    }</span></div>
+<div class="line"><a name="l01016"></a><span class="lineno"> 1016</span>   <span class="comment">//     }</span></div>
+<div class="line"><a name="l01017"></a><span class="lineno"> 1017</span>   <span class="comment">//   }</span></div>
+<div class="line"><a name="l01018"></a><span class="lineno"> 1018</span>   <span class="comment">//   if(relative_opt[0])</span></div>
+<div class="line"><a name="l01019"></a><span class="lineno"> 1019</span>   <span class="comment">//     hist_opt[0]=true;</span></div>
+<div class="line"><a name="l01020"></a><span class="lineno"> 1020</span>   <span class="comment">//   if(hist_opt[0]){</span></div>
+<div class="line"><a name="l01021"></a><span class="lineno"> 1021</span>   <span class="comment">//     assert(band_opt[0]<imgReader.nrOfBand());</span></div>
+<div class="line"><a name="l01022"></a><span class="lineno"> 1022</span>   <span class="comment">//     unsigned int nbin=(nbin_opt.size())? nbin_opt[0]:0;</span></div>
+<div class="line"><a name="l01023"></a><span class="lineno"> 1023</span>   <span class="comment">//     std::vector<unsigned long int> output;</span></div>
+<div class="line"><a name="l01024"></a><span class="lineno"> 1024</span>   <span class="comment">//     minValue=0;</span></div>
+<div class="line"><a name="l01025"></a><span class="lineno"> 1025</span>   <span class="comment">//     maxValue=0;</span></div>
+<div class="line"><a name="l01026"></a><span class="lineno"> 1026</span>   <span class="comment">//     //todo: optimize such that getMinMax is only called once...</span></div>
+<div class="line"><a name="l01027"></a><span class="lineno"> 1027</span>   <span class="comment">//     imgReader.getMinMax(minValue,maxValue,band_opt[0]);</span></div>
+<div class="line"><a name="l01028"></a><span class="lineno"> 1028</span>       </div>
+<div class="line"><a name="l01029"></a><span class="lineno"> 1029</span>   <span class="comment">//     if(src_min_opt.size())</span></div>
+<div class="line"><a name="l01030"></a><span class="lineno"> 1030</span>   <span class="comment">//       minValue=src_min_opt[0];</span></div>
+<div class="line"><a name="l01031"></a><span class="lineno"> 1031</span>   <span class="comment">//     if(src_max_opt.size())</span></div>
+<div class="line"><a name="l01032"></a><span class="lineno"> 1032</span>   <span class="comment">//       maxValue=src_max_opt[0];</span></div>
+<div class="line"><a name="l01033"></a><span class="lineno"> 1033</span>   <span class="comment">//     unsigned long int nsample=imgReader.getHistogram(output,minValue,maxValue,nbin,band_opt[0]);</span></div>
+<div class="line"><a name="l01034"></a><span class="lineno"> 1034</span>   <span class="comment">//     std::cout.precision(10);</span></div>
+<div class="line"><a name="l01035"></a><span class="lineno"> 1035</span>   <span class="comment">//     for(int bin=0;bin<nbin;++bin){</span></div>
+<div class="line"><a name="l01036"></a><span class="lineno"> 1036</span>   <span class="comment">//    double binValue=0;</span></div>
+<div class="line"><a name="l01037"></a><span class="lineno"> 1037</span>   <span class="comment">//    if(nbin==maxValue-minValue+1)</span></div>
+<div class="line"><a name="l01038"></a><span class="lineno"> 1038</span>   <span class="comment">//      binValue=minValue+bin;</span></div>
+<div class="line"><a name="l01039"></a><span class="lineno"> 1039</span>   <span class="comment">//    else</span></div>
+<div class="line"><a name="l01040"></a><span class="lineno"> 1040</span>   <span class="comment">//      binValue=minValue+static_cast<double>(maxValue-minValue)*(bin+0.5)/nbin;</span></div>
+<div class="line"><a name="l01041"></a><span class="lineno"> 1041</span>   <span class="comment">//    std::cout << binValue << " ";</span></div>
+<div class="line"><a name="l01042"></a><span class="lineno"> 1042</span>   <span class="comment">//    if(relative_opt[0])</span></div>
+<div class="line"><a name="l01043"></a><span class="lineno"> 1043</span>   <span class="comment">//      std::cout << 100.0*static_cast<double>(output[bin])/static_cast<double>(nsample) << std::endl;</span></div>
+<div class="line"><a name="l01044"></a><span class="lineno"> 1044</span>   <span class="comment">//    else</span></div>
+<div class="line"><a name="l01045"></a><span class="lineno"> 1045</span>   <span class="comment">//      std::cout << static_cast<double>(output[bin]) << std::endl;</span></div>
+<div class="line"><a name="l01046"></a><span class="lineno"> 1046</span>   <span class="comment">//     }</span></div>
+<div class="line"><a name="l01047"></a><span class="lineno"> 1047</span>   <span class="comment">//   }</span></div>
 <div class="ttc" id="classimgregression_1_1ImgRegression_html"><div class="ttname"><a href="classimgregression_1_1ImgRegression.html">imgregression::ImgRegression</a></div><div class="ttdef"><b>Definition:</b> <a href="ImgRegression_8h_source.html#l00030">ImgRegression.h:30</a></div></div>
 <div class="ttc" id="classImgReaderGdal_html"><div class="ttname"><a href="classImgReaderGdal.html">ImgReaderGdal</a></div><div class="ttdef"><b>Definition:</b> <a href="ImgReaderGdal_8h_source.html#l00033">ImgReaderGdal.h:33</a></div></div>
 <div class="ttc" id="classstatfactory_1_1StatFactory_html"><div class="ttname"><a href="classstatfactory_1_1StatFactory.html">statfactory::StatFactory</a></div><div class="ttdef"><b>Definition:</b> <a href="StatFactory_8h_source.html#l00043">StatFactory.h:43</a></div></div>
@@ -1044,7 +1056,7 @@
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Jun 23 2015 17:09:36 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/pkstatascii.html b/doc/html/pkstatascii.html
index ee2f981..55d290d 100644
--- a/doc/html/pkstatascii.html
+++ b/doc/html/pkstatascii.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.3</span>
+    <span id="projectnumber">2.6.4</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -133,7 +133,7 @@ Usage: pkstatascii -i input [-c column]* </li>
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Jun 23 2015 17:09:37 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/pkstatascii_8cc_source.html b/doc/html/pkstatascii_8cc_source.html
index 290bd15..e8386dd 100644
--- a/doc/html/pkstatascii_8cc_source.html
+++ b/doc/html/pkstatascii_8cc_source.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.3</span>
+    <span id="projectnumber">2.6.4</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -472,7 +472,7 @@
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Jun 23 2015 17:09:36 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/pkstatogr.html b/doc/html/pkstatogr.html
index d203cec..e82a1b1 100644
--- a/doc/html/pkstatogr.html
+++ b/doc/html/pkstatogr.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.3</span>
+    <span id="projectnumber">2.6.4</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -101,7 +101,7 @@ Usage: pkstatogr -i input [-n attribute]*</li>
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Jun 23 2015 17:09:37 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/pkstatogr_8cc_source.html b/doc/html/pkstatogr_8cc_source.html
index 5ec4b24..25ae76b 100644
--- a/doc/html/pkstatogr_8cc_source.html
+++ b/doc/html/pkstatogr_8cc_source.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.3</span>
+    <span id="projectnumber">2.6.4</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -267,7 +267,7 @@
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Jun 23 2015 17:09:36 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/pksvm.html b/doc/html/pksvm.html
index f8ab3ec..a420e48 100644
--- a/doc/html/pksvm.html
+++ b/doc/html/pksvm.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.3</span>
+    <span id="projectnumber">2.6.4</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -48,7 +48,7 @@
 <p><code> Usage: pksvm -t training [-i input -o output] [-cv value] </code></p>
 <p><code></code></p>
 <p><code> Options: [-tln layer]* [-c name -r value]* [-of GDALformat|-f OGRformat] [-co NAME=VALUE]* [-ct filename] [-label attribute] [-prior value]* [-g gamma] [-cc cost] [-m filename [-msknodata value]*] [-nodata value]</code></p>
-<p><code> Advanced options: [-b band] [-s band] [-e band] [-bal size]* [-min] [-bag value] [-bs value] [-comb rule] [-cb filename] [-prob filename] [-pim priorimage] [–offset value] [–scale value] [-svmt type] [-kt type] [-kd value] [-c0 value] [-nu value] [-eloss value] [-cache value] [-etol value] [-shrink] [-extent vector] </code></p>
+<p><code> Advanced options: [-b band] [-sband band -eband band]* [-bal size]* [-min] [-bag value] [-bs value] [-comb rule] [-cb filename] [-prob filename] [-pim priorimage] [–offset value] [–scale value] [-svmt type] [-kt type] [-kd value] [-c0 value] [-nu value] [-eloss value] [-cache value] [-etol value] [-shrink] </code></p>
 <h1><a class="anchor" id="pksvm_description"></a>
 Description</h1>
 <p>The utility pksvm implements a support vector machine (SVM) to solve a supervised classification problem. The implementation is based on the open source C++ library libSVM (<a href="http://www.csie.ntu.edu.tw/~cjlin/libsvm">http://www.csie.ntu.edu.tw/~cjlin/libsvm</a>). Both raster and vector files are supported as input. The output will contain the classification result, either in raster or vector format, corresponding to the format of the input. A training sample must be provided as [...]
@@ -92,7 +92,7 @@ Options</h1>
 <tr>
 <td>cc </td><td>ccost </td><td>float </td><td>1000 </td><td>The parameter C of C_SVC, epsilon_SVR, and nu_SVR </td></tr>
 <tr>
-<td>m </td><td>mask </td><td>std::string </td><td></td><td>Use the first band of the specified file as a validity mask. Nodata values can be set with the option msknodata. </td></tr>
+<td>m </td><td>mask </td><td>std::string </td><td></td><td>Only classify within specified mask (vector or raster). For raster mask, set nodata values with the option msknodata. </td></tr>
 <tr>
 <td>msknodata </td><td>msknodata </td><td>short </td><td>0 </td><td>Mask value(s) not to consider for classification (use negative values if only these values should be taken into account). Values will be taken over in classification image. </td></tr>
 <tr>
@@ -100,9 +100,9 @@ Options</h1>
 <tr>
 <td>b </td><td>band </td><td>short </td><td></td><td>Band index (starting from 0, either use band option or use start to end) </td></tr>
 <tr>
-<td>s </td><td>start </td><td>double </td><td>0 </td><td>Start band sequence number </td></tr>
+<td>sband </td><td>startband </td><td>unsigned short </td><td></td><td>Start band sequence number </td></tr>
 <tr>
-<td>e </td><td>end </td><td>double </td><td>0 </td><td>End band sequence number (set to 0 to include all bands) </td></tr>
+<td>eband </td><td>endband </td><td>unsigned short </td><td></td><td>End band sequence number </td></tr>
 <tr>
 <td>bal </td><td>balance </td><td>unsigned int </td><td>0 </td><td>Balance the input data to this number of samples for each class </td></tr>
 <tr>
@@ -120,9 +120,9 @@ Options</h1>
 <tr>
 <td>pim </td><td>priorimg </td><td>std::string </td><td></td><td>Prior probability image (multi-band img with band for each class </td></tr>
 <tr>
-<td></td><td>offset </td><td>double </td><td>0 </td><td>Offset value for each spectral band input features: refl[band]=(DN[band]-offset[band])/scale[band] </td></tr>
+<td>offset </td><td>offset </td><td>double </td><td>0 </td><td>Offset value for each spectral band input features: refl[band]=(DN[band]-offset[band])/scale[band] </td></tr>
 <tr>
-<td></td><td>scale </td><td>double </td><td>0 </td><td>Scale value for each spectral band input features: refl=(DN[band]-offset[band])/scale<a href="use 0 if scale min and max in each band to -1.0 and 1.0">band</a> </td></tr>
+<td>scale </td><td>scale </td><td>double </td><td>0 </td><td>Scale value for each spectral band input features: refl=(DN[band]-offset[band])/scale<a href="use 0 if scale min and max in each band to -1.0 and 1.0">band</a> </td></tr>
 <tr>
 <td>svmt </td><td>svmtype </td><td>std::string </td><td>C_SVC </td><td>Type of SVM (C_SVC, nu_SVC,one_class, epsilon_SVR, nu_SVR) </td></tr>
 <tr>
@@ -151,8 +151,6 @@ Options</h1>
 <td>na </td><td>nactive </td><td>unsigned int </td><td>1 </td><td>Number of active training points </td></tr>
 <tr>
 <td>random </td><td>random </td><td>bool </td><td>true </td><td>Randomize training data for balancing and bagging </td></tr>
-<tr>
-<td>e </td><td>extent </td><td>std::string </td><td></td><td>get boundary to classify from extent from polygons in vector file </td></tr>
 </table>
 Usage: pksvm -t training [-i input -o output] [-cv value]</li>
 </ul>
@@ -162,7 +160,7 @@ Usage: pksvm -t training [-i input -o output] [-cv value]</li>
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Jun 23 2015 17:09:37 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/pksvm_8cc_source.html b/doc/html/pksvm_8cc_source.html
index 3469744..88848e2 100644
--- a/doc/html/pksvm_8cc_source.html
+++ b/doc/html/pksvm_8cc_source.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.3</span>
+    <span id="projectnumber">2.6.4</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -88,1285 +88,1295 @@
 <div class="line"><a name="l00034"></a><span class="lineno">   34</span> <span class="preprocessor"></span><span class="preprocessor">#include <config.h></span></div>
 <div class="line"><a name="l00035"></a><span class="lineno">   35</span> <span class="preprocessor">#endif</span></div>
 <div class="line"><a name="l00036"></a><span class="lineno">   36</span> <span class="preprocessor"></span><span class="comment">/******************************************************************************/</span></div>
-<div class="line"><a name="l00119"></a><span class="lineno">  119</span> <span class="keyword">namespace </span>svm{</div>
-<div class="line"><a name="l00120"></a><span class="lineno">  120</span>   <span class="keyword">enum</span> SVM_TYPE {C_SVC=0, nu_SVC=1,one_class=2, epsilon_SVR=3, nu_SVR=4};</div>
-<div class="line"><a name="l00121"></a><span class="lineno">  121</span>   <span class="keyword">enum</span> KERNEL_TYPE {linear=0,polynomial=1,radial=2,sigmoid=3};</div>
-<div class="line"><a name="l00122"></a><span class="lineno">  122</span> }</div>
-<div class="line"><a name="l00123"></a><span class="lineno">  123</span> </div>
-<div class="line"><a name="l00124"></a><span class="lineno">  124</span> <span class="preprocessor">#define Malloc(type,n) (type *)malloc((n)*sizeof(type))</span></div>
-<div class="line"><a name="l00125"></a><span class="lineno">  125</span> <span class="preprocessor"></span></div>
-<div class="line"><a name="l00126"></a><span class="lineno">  126</span> <span class="keyword">using namespace </span>std;</div>
-<div class="line"><a name="l00127"></a><span class="lineno">  127</span> </div>
-<div class="line"><a name="l00128"></a><span class="lineno">  128</span> <span class="keywordtype">int</span> main(<span class="keywordtype">int</span> argc, <span class="keywordtype">char</span> *argv[])</div>
-<div class="line"><a name="l00129"></a><span class="lineno">  129</span> {</div>
-<div class="line"><a name="l00130"></a><span class="lineno">  130</span>   vector<double> priors;</div>
-<div class="line"><a name="l00131"></a><span class="lineno">  131</span>   </div>
-<div class="line"><a name="l00132"></a><span class="lineno">  132</span>   <span class="comment">//--------------------------- command line options ------------------------------------</span></div>
-<div class="line"><a name="l00133"></a><span class="lineno">  133</span>   <a class="code" href="classOptionpk.html">Optionpk<string></a> input_opt(<span class="stringliteral">"i"</span>, <span class="stringliteral">"input"</span>, <span class="stringliteral">"input image"</span>); </div>
-<div class="line"><a name="l00134"></a><span class="lineno">  134</span>   <a class="code" href="classOptionpk.html">Optionpk<string></a> training_opt(<span class="stringliteral">"t"</span>, <span class="stringliteral">"training"</span>, <span class="stringliteral">"Training vector file. A single vector file contains all training features (must be set as: b0, b1, b2,...) for all classes (class numbers identified by label option). Use multiple training  [...]
-<div class="line"><a name="l00135"></a><span class="lineno">  135</span>   <a class="code" href="classOptionpk.html">Optionpk<string></a> tlayer_opt(<span class="stringliteral">"tln"</span>, <span class="stringliteral">"tln"</span>, <span class="stringliteral">"Training layer name(s)"</span>);</div>
-<div class="line"><a name="l00136"></a><span class="lineno">  136</span>   <a class="code" href="classOptionpk.html">Optionpk<string></a> label_opt(<span class="stringliteral">"label"</span>, <span class="stringliteral">"label"</span>, <span class="stringliteral">"Attribute name for class label in training vector file."</span>,<span class="stringliteral">"label"</span>); </div>
-<div class="line"><a name="l00137"></a><span class="lineno">  137</span>   <a class="code" href="classOptionpk.html">Optionpk<unsigned int></a> balance_opt(<span class="stringliteral">"bal"</span>, <span class="stringliteral">"balance"</span>, <span class="stringliteral">"Balance the input data to this number of samples for each class"</span>, 0);</div>
-<div class="line"><a name="l00138"></a><span class="lineno">  138</span>   <a class="code" href="classOptionpk.html">Optionpk<bool></a> random_opt(<span class="stringliteral">"random"</span>, <span class="stringliteral">"random"</span>, <span class="stringliteral">"Randomize training data for balancing and bagging"</span>, <span class="keyword">true</span>, 2);</div>
-<div class="line"><a name="l00139"></a><span class="lineno">  139</span>   <a class="code" href="classOptionpk.html">Optionpk<int></a> minSize_opt(<span class="stringliteral">"min"</span>, <span class="stringliteral">"min"</span>, <span class="stringliteral">"If number of training pixels is less then min, do not take this class into account (0: consider all classes)"</span>, 0);</div>
-<div class="line"><a name="l00140"></a><span class="lineno">  140</span>   <a class="code" href="classOptionpk.html">Optionpk<short></a> band_opt(<span class="stringliteral">"b"</span>, <span class="stringliteral">"band"</span>, <span class="stringliteral">"Band index (starting from 0, either use band option or use start to end)"</span>);</div>
-<div class="line"><a name="l00141"></a><span class="lineno">  141</span>   <a class="code" href="classOptionpk.html">Optionpk<double></a> bstart_opt(<span class="stringliteral">"s"</span>, <span class="stringliteral">"start"</span>, <span class="stringliteral">"Start band sequence number"</span>,0); </div>
-<div class="line"><a name="l00142"></a><span class="lineno">  142</span>   <a class="code" href="classOptionpk.html">Optionpk<double></a> bend_opt(<span class="stringliteral">"e"</span>, <span class="stringliteral">"end"</span>, <span class="stringliteral">"End band sequence number (set to 0 to include all bands)"</span>, 0); </div>
-<div class="line"><a name="l00143"></a><span class="lineno">  143</span>   <a class="code" href="classOptionpk.html">Optionpk<double></a> offset_opt(<span class="stringliteral">"\0"</span>, <span class="stringliteral">"offset"</span>, <span class="stringliteral">"Offset value for each spectral band input features: refl[band]=(DN[band]-offset[band])/scale[band]"</span>, 0.0);</div>
-<div class="line"><a name="l00144"></a><span class="lineno">  144</span>   <a class="code" href="classOptionpk.html">Optionpk<double></a> scale_opt(<span class="stringliteral">"\0"</span>, <span class="stringliteral">"scale"</span>, <span class="stringliteral">"Scale value for each spectral band input features: refl=(DN[band]-offset[band])/scale[band] (use 0 if scale min and max in each band to -1.0 and 1.0)"</span>, 0.0);</div>
-<div class="line"><a name="l00145"></a><span class="lineno">  145</span>   <a class="code" href="classOptionpk.html">Optionpk<double></a> priors_opt(<span class="stringliteral">"prior"</span>, <span class="stringliteral">"prior"</span>, <span class="stringliteral">"Prior probabilities for each class (e.g., -p 0.3 -p 0.3 -p 0.2 ). Used for input only (ignored for cross validation)"</span>, 0.0); </div>
-<div class="line"><a name="l00146"></a><span class="lineno">  146</span>   <a class="code" href="classOptionpk.html">Optionpk<string></a> priorimg_opt(<span class="stringliteral">"pim"</span>, <span class="stringliteral">"priorimg"</span>, <span class="stringliteral">"Prior probability image (multi-band img with band for each class"</span>,<span class="stringliteral">""</span>,2); </div>
-<div class="line"><a name="l00147"></a><span class="lineno">  147</span>   <a class="code" href="classOptionpk.html">Optionpk<unsigned short></a> cv_opt(<span class="stringliteral">"cv"</span>, <span class="stringliteral">"cv"</span>, <span class="stringliteral">"N-fold cross validation mode"</span>,0);</div>
-<div class="line"><a name="l00148"></a><span class="lineno">  148</span>   <a class="code" href="classOptionpk.html">Optionpk<string></a> cmformat_opt(<span class="stringliteral">"cmf"</span>,<span class="stringliteral">"cmf"</span>,<span class="stringliteral">"Format for confusion matrix (ascii or latex)"</span>,<span class="stringliteral">"ascii"</span>);</div>
-<div class="line"><a name="l00149"></a><span class="lineno">  149</span>   <a class="code" href="classOptionpk.html">Optionpk<std::string></a> svm_type_opt(<span class="stringliteral">"svmt"</span>, <span class="stringliteral">"svmtype"</span>, <span class="stringliteral">"Type of SVM (C_SVC, nu_SVC,one_class, epsilon_SVR, nu_SVR)"</span>,<span class="stringliteral">"C_SVC"</span>);</div>
-<div class="line"><a name="l00150"></a><span class="lineno">  150</span>   <a class="code" href="classOptionpk.html">Optionpk<std::string></a> kernel_type_opt(<span class="stringliteral">"kt"</span>, <span class="stringliteral">"kerneltype"</span>, <span class="stringliteral">"Type of kernel function (linear,polynomial,radial,sigmoid) "</span>,<span class="stringliteral">"radial"</span>);</div>
-<div class="line"><a name="l00151"></a><span class="lineno">  151</span>   <a class="code" href="classOptionpk.html">Optionpk<unsigned short></a> kernel_degree_opt(<span class="stringliteral">"kd"</span>, <span class="stringliteral">"kd"</span>, <span class="stringliteral">"Degree in kernel function"</span>,3);</div>
-<div class="line"><a name="l00152"></a><span class="lineno">  152</span>   <a class="code" href="classOptionpk.html">Optionpk<float></a> gamma_opt(<span class="stringliteral">"g"</span>, <span class="stringliteral">"gamma"</span>, <span class="stringliteral">"Gamma in kernel function"</span>,1.0);</div>
-<div class="line"><a name="l00153"></a><span class="lineno">  153</span>   <a class="code" href="classOptionpk.html">Optionpk<float></a> coef0_opt(<span class="stringliteral">"c0"</span>, <span class="stringliteral">"coef0"</span>, <span class="stringliteral">"Coef0 in kernel function"</span>,0);</div>
-<div class="line"><a name="l00154"></a><span class="lineno">  154</span>   <a class="code" href="classOptionpk.html">Optionpk<float></a> ccost_opt(<span class="stringliteral">"cc"</span>, <span class="stringliteral">"ccost"</span>, <span class="stringliteral">"The parameter C of C_SVC, epsilon_SVR, and nu_SVR"</span>,1000);</div>
-<div class="line"><a name="l00155"></a><span class="lineno">  155</span>   <a class="code" href="classOptionpk.html">Optionpk<float></a> nu_opt(<span class="stringliteral">"nu"</span>, <span class="stringliteral">"nu"</span>, <span class="stringliteral">"The parameter nu of nu_SVC, one_class SVM, and nu_SVR"</span>,0.5);</div>
-<div class="line"><a name="l00156"></a><span class="lineno">  156</span>   <a class="code" href="classOptionpk.html">Optionpk<float></a> epsilon_loss_opt(<span class="stringliteral">"eloss"</span>, <span class="stringliteral">"eloss"</span>, <span class="stringliteral">"The epsilon in loss function of epsilon_SVR"</span>,0.1);</div>
-<div class="line"><a name="l00157"></a><span class="lineno">  157</span>   <a class="code" href="classOptionpk.html">Optionpk<int></a> cache_opt(<span class="stringliteral">"cache"</span>, <span class="stringliteral">"cache"</span>, <span class="stringliteral">"Cache memory size in MB"</span>,100);</div>
-<div class="line"><a name="l00158"></a><span class="lineno">  158</span>   <a class="code" href="classOptionpk.html">Optionpk<float></a> epsilon_tol_opt(<span class="stringliteral">"etol"</span>, <span class="stringliteral">"etol"</span>, <span class="stringliteral">"The tolerance of termination criterion"</span>,0.001);</div>
-<div class="line"><a name="l00159"></a><span class="lineno">  159</span>   <a class="code" href="classOptionpk.html">Optionpk<bool></a> shrinking_opt(<span class="stringliteral">"shrink"</span>, <span class="stringliteral">"shrink"</span>, <span class="stringliteral">"Whether to use the shrinking heuristics"</span>,<span class="keyword">false</span>);</div>
-<div class="line"><a name="l00160"></a><span class="lineno">  160</span>   <a class="code" href="classOptionpk.html">Optionpk<bool></a> prob_est_opt(<span class="stringliteral">"pe"</span>, <span class="stringliteral">"probest"</span>, <span class="stringliteral">"Whether to train a SVC or SVR model for probability estimates"</span>,<span class="keyword">true</span>,2);</div>
-<div class="line"><a name="l00161"></a><span class="lineno">  161</span>   <span class="comment">// Optionpk<bool> weight_opt("wi", "wi", "Set the parameter C of class i to weight*C, for C_SVC",true);</span></div>
-<div class="line"><a name="l00162"></a><span class="lineno">  162</span>   <a class="code" href="classOptionpk.html">Optionpk<unsigned short></a> comb_opt(<span class="stringliteral">"comb"</span>, <span class="stringliteral">"comb"</span>, <span class="stringliteral">"How to combine bootstrap aggregation classifiers (0: sum rule, 1: product rule, 2: max rule). Also used to aggregate classes with rc option."</span>,0); </div>
-<div class="line"><a name="l00163"></a><span class="lineno">  163</span>   <a class="code" href="classOptionpk.html">Optionpk<unsigned short></a> bag_opt(<span class="stringliteral">"bag"</span>, <span class="stringliteral">"bag"</span>, <span class="stringliteral">"Number of bootstrap aggregations"</span>, 1);</div>
-<div class="line"><a name="l00164"></a><span class="lineno">  164</span>   <a class="code" href="classOptionpk.html">Optionpk<int></a> bagSize_opt(<span class="stringliteral">"bagsize"</span>, <span class="stringliteral">"bagsize"</span>, <span class="stringliteral">"Percentage of features used from available training features for each bootstrap aggregation (one size for all classes, or a different size for each class respectively"</span>, 100);</div>
-<div class="line"><a name="l00165"></a><span class="lineno">  165</span>   <a class="code" href="classOptionpk.html">Optionpk<string></a> classBag_opt(<span class="stringliteral">"cb"</span>, <span class="stringliteral">"classbag"</span>, <span class="stringliteral">"Output for each individual bootstrap aggregation"</span>);</div>
-<div class="line"><a name="l00166"></a><span class="lineno">  166</span>   <a class="code" href="classOptionpk.html">Optionpk<string></a> mask_opt(<span class="stringliteral">"m"</span>, <span class="stringliteral">"mask"</span>, <span class="stringliteral">"Use the first band of the specified file as a validity mask. Nodata values can be set with the option msknodata."</span>);</div>
-<div class="line"><a name="l00167"></a><span class="lineno">  167</span>   <a class="code" href="classOptionpk.html">Optionpk<short></a> msknodata_opt(<span class="stringliteral">"msknodata"</span>, <span class="stringliteral">"msknodata"</span>, <span class="stringliteral">"Mask value(s) not to consider for classification (use negative values if only these values should be taken into account). Values will be taken over in classification image."</ [...]
-<div class="line"><a name="l00168"></a><span class="lineno">  168</span>   <a class="code" href="classOptionpk.html">Optionpk<unsigned short></a> nodata_opt(<span class="stringliteral">"nodata"</span>, <span class="stringliteral">"nodata"</span>, <span class="stringliteral">"Nodata value to put where image is masked as nodata"</span>, 0);</div>
-<div class="line"><a name="l00169"></a><span class="lineno">  169</span>   <a class="code" href="classOptionpk.html">Optionpk<string></a> output_opt(<span class="stringliteral">"o"</span>, <span class="stringliteral">"output"</span>, <span class="stringliteral">"Output classification image"</span>); </div>
-<div class="line"><a name="l00170"></a><span class="lineno">  170</span>   <a class="code" href="classOptionpk.html">Optionpk<string></a>  oformat_opt(<span class="stringliteral">"of"</span>, <span class="stringliteral">"oformat"</span>, <span class="stringliteral">"Output image format (see also gdal_translate). Empty string: inherit from input image"</span>);</div>
-<div class="line"><a name="l00171"></a><span class="lineno">  171</span>   <a class="code" href="classOptionpk.html">Optionpk<string></a> option_opt(<span class="stringliteral">"co"</span>, <span class="stringliteral">"co"</span>, <span class="stringliteral">"Creation option for output file. Multiple options can be specified."</span>);</div>
-<div class="line"><a name="l00172"></a><span class="lineno">  172</span>   <a class="code" href="classOptionpk.html">Optionpk<string></a> colorTable_opt(<span class="stringliteral">"ct"</span>, <span class="stringliteral">"ct"</span>, <span class="stringliteral">"Color table in ASCII format having 5 columns: id R G B ALFA (0: transparent, 255: solid)"</span>); </div>
-<div class="line"><a name="l00173"></a><span class="lineno">  173</span>   <a class="code" href="classOptionpk.html">Optionpk<string></a> prob_opt(<span class="stringliteral">"prob"</span>, <span class="stringliteral">"prob"</span>, <span class="stringliteral">"Probability image."</span>); </div>
-<div class="line"><a name="l00174"></a><span class="lineno">  174</span>   <a class="code" href="classOptionpk.html">Optionpk<string></a> entropy_opt(<span class="stringliteral">"entropy"</span>, <span class="stringliteral">"entropy"</span>, <span class="stringliteral">"Entropy image (measure for uncertainty of classifier output"</span>,<span class="stringliteral">""</span>,2); </div>
-<div class="line"><a name="l00175"></a><span class="lineno">  175</span>   <a class="code" href="classOptionpk.html">Optionpk<string></a> active_opt(<span class="stringliteral">"active"</span>, <span class="stringliteral">"active"</span>, <span class="stringliteral">"Ogr output for active training sample."</span>,<span class="stringliteral">""</span>,2); </div>
-<div class="line"><a name="l00176"></a><span class="lineno">  176</span>   <a class="code" href="classOptionpk.html">Optionpk<string></a> ogrformat_opt(<span class="stringliteral">"f"</span>, <span class="stringliteral">"f"</span>, <span class="stringliteral">"Output ogr format for active training sample"</span>,<span class="stringliteral">"SQLite"</span>);</div>
-<div class="line"><a name="l00177"></a><span class="lineno">  177</span>   <a class="code" href="classOptionpk.html">Optionpk<unsigned int></a> nactive_opt(<span class="stringliteral">"na"</span>, <span class="stringliteral">"nactive"</span>, <span class="stringliteral">"Number of active training points"</span>,1);</div>
-<div class="line"><a name="l00178"></a><span class="lineno">  178</span>   <a class="code" href="classOptionpk.html">Optionpk<string></a> classname_opt(<span class="stringliteral">"c"</span>, <span class="stringliteral">"class"</span>, <span class="stringliteral">"List of class names."</span>); </div>
-<div class="line"><a name="l00179"></a><span class="lineno">  179</span>   <a class="code" href="classOptionpk.html">Optionpk<short></a> classvalue_opt(<span class="stringliteral">"r"</span>, <span class="stringliteral">"reclass"</span>, <span class="stringliteral">"List of class values (use same order as in class opt)."</span>); </div>
-<div class="line"><a name="l00180"></a><span class="lineno">  180</span>   <a class="code" href="classOptionpk.html">Optionpk<string></a>  extent_opt(<span class="stringliteral">"extent"</span>, <span class="stringliteral">"extent"</span>, <span class="stringliteral">"get boundary to classify from extent from polygons in vector file"</span>);</div>
-<div class="line"><a name="l00181"></a><span class="lineno">  181</span>   <a class="code" href="classOptionpk.html">Optionpk<short></a> verbose_opt(<span class="stringliteral">"v"</span>, <span class="stringliteral">"verbose"</span>, <span class="stringliteral">"Verbose level"</span>,0,2);</div>
-<div class="line"><a name="l00182"></a><span class="lineno">  182</span> </div>
-<div class="line"><a name="l00183"></a><span class="lineno">  183</span>   band_opt.setHide(1);</div>
-<div class="line"><a name="l00184"></a><span class="lineno">  184</span>   bstart_opt.setHide(1);</div>
-<div class="line"><a name="l00185"></a><span class="lineno">  185</span>   bend_opt.setHide(1);</div>
-<div class="line"><a name="l00186"></a><span class="lineno">  186</span>   balance_opt.setHide(1);</div>
-<div class="line"><a name="l00187"></a><span class="lineno">  187</span>   minSize_opt.setHide(1);</div>
-<div class="line"><a name="l00188"></a><span class="lineno">  188</span>   bag_opt.setHide(1);</div>
-<div class="line"><a name="l00189"></a><span class="lineno">  189</span>   bagSize_opt.setHide(1);</div>
-<div class="line"><a name="l00190"></a><span class="lineno">  190</span>   comb_opt.setHide(1);</div>
-<div class="line"><a name="l00191"></a><span class="lineno">  191</span>   classBag_opt.setHide(1);</div>
-<div class="line"><a name="l00192"></a><span class="lineno">  192</span>   prob_opt.setHide(1);</div>
-<div class="line"><a name="l00193"></a><span class="lineno">  193</span>   priorimg_opt.setHide(1);</div>
-<div class="line"><a name="l00194"></a><span class="lineno">  194</span>   offset_opt.setHide(1);</div>
-<div class="line"><a name="l00195"></a><span class="lineno">  195</span>   scale_opt.setHide(1);</div>
-<div class="line"><a name="l00196"></a><span class="lineno">  196</span>   svm_type_opt.setHide(1);</div>
-<div class="line"><a name="l00197"></a><span class="lineno">  197</span>   kernel_type_opt.setHide(1);</div>
-<div class="line"><a name="l00198"></a><span class="lineno">  198</span>   kernel_degree_opt.setHide(1);</div>
-<div class="line"><a name="l00199"></a><span class="lineno">  199</span>   coef0_opt.setHide(1);</div>
-<div class="line"><a name="l00200"></a><span class="lineno">  200</span>   nu_opt.setHide(1);</div>
-<div class="line"><a name="l00201"></a><span class="lineno">  201</span>   epsilon_loss_opt.setHide(1);</div>
-<div class="line"><a name="l00202"></a><span class="lineno">  202</span>   cache_opt.setHide(1);</div>
-<div class="line"><a name="l00203"></a><span class="lineno">  203</span>   epsilon_tol_opt.setHide(1);</div>
-<div class="line"><a name="l00204"></a><span class="lineno">  204</span>   shrinking_opt.setHide(1);</div>
-<div class="line"><a name="l00205"></a><span class="lineno">  205</span>   prob_est_opt.setHide(1);</div>
-<div class="line"><a name="l00206"></a><span class="lineno">  206</span>   entropy_opt.setHide(1);</div>
-<div class="line"><a name="l00207"></a><span class="lineno">  207</span>   active_opt.setHide(1);</div>
-<div class="line"><a name="l00208"></a><span class="lineno">  208</span>   nactive_opt.setHide(1);</div>
-<div class="line"><a name="l00209"></a><span class="lineno">  209</span>   random_opt.setHide(1);</div>
-<div class="line"><a name="l00210"></a><span class="lineno">  210</span>   extent_opt.setHide(1);</div>
-<div class="line"><a name="l00211"></a><span class="lineno">  211</span> </div>
-<div class="line"><a name="l00212"></a><span class="lineno">  212</span>   verbose_opt.setHide(2);</div>
-<div class="line"><a name="l00213"></a><span class="lineno">  213</span> </div>
-<div class="line"><a name="l00214"></a><span class="lineno">  214</span>   <span class="keywordtype">bool</span> doProcess;<span class="comment">//stop process when program was invoked with help option (-h --help)</span></div>
-<div class="line"><a name="l00215"></a><span class="lineno">  215</span>   <span class="keywordflow">try</span>{</div>
-<div class="line"><a name="l00216"></a><span class="lineno">  216</span>     doProcess=training_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00217"></a><span class="lineno">  217</span>     input_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00218"></a><span class="lineno">  218</span>     output_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00219"></a><span class="lineno">  219</span>     cv_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00220"></a><span class="lineno">  220</span>     cmformat_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00221"></a><span class="lineno">  221</span>     tlayer_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00222"></a><span class="lineno">  222</span>     classname_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00223"></a><span class="lineno">  223</span>     classvalue_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00224"></a><span class="lineno">  224</span>     oformat_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00225"></a><span class="lineno">  225</span>     ogrformat_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00226"></a><span class="lineno">  226</span>     option_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00227"></a><span class="lineno">  227</span>     colorTable_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00228"></a><span class="lineno">  228</span>     label_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00229"></a><span class="lineno">  229</span>     priors_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00230"></a><span class="lineno">  230</span>     gamma_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00231"></a><span class="lineno">  231</span>     ccost_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00232"></a><span class="lineno">  232</span>     mask_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00233"></a><span class="lineno">  233</span>     msknodata_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00234"></a><span class="lineno">  234</span>     nodata_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00235"></a><span class="lineno">  235</span>     <span class="comment">// Advanced options</span></div>
-<div class="line"><a name="l00236"></a><span class="lineno">  236</span>     band_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00237"></a><span class="lineno">  237</span>     bstart_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00238"></a><span class="lineno">  238</span>     bend_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00239"></a><span class="lineno">  239</span>     balance_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00240"></a><span class="lineno">  240</span>     minSize_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00241"></a><span class="lineno">  241</span>     bag_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00242"></a><span class="lineno">  242</span>     bagSize_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00243"></a><span class="lineno">  243</span>     comb_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00244"></a><span class="lineno">  244</span>     classBag_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00245"></a><span class="lineno">  245</span>     prob_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00246"></a><span class="lineno">  246</span>     priorimg_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00247"></a><span class="lineno">  247</span>     offset_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00248"></a><span class="lineno">  248</span>     scale_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00249"></a><span class="lineno">  249</span>     svm_type_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00250"></a><span class="lineno">  250</span>     kernel_type_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00251"></a><span class="lineno">  251</span>     kernel_degree_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00252"></a><span class="lineno">  252</span>     coef0_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00253"></a><span class="lineno">  253</span>     nu_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00254"></a><span class="lineno">  254</span>     epsilon_loss_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00255"></a><span class="lineno">  255</span>     cache_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00256"></a><span class="lineno">  256</span>     epsilon_tol_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00257"></a><span class="lineno">  257</span>     shrinking_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00258"></a><span class="lineno">  258</span>     prob_est_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00259"></a><span class="lineno">  259</span>     entropy_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00260"></a><span class="lineno">  260</span>     active_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00261"></a><span class="lineno">  261</span>     nactive_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00262"></a><span class="lineno">  262</span>     verbose_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00263"></a><span class="lineno">  263</span>     random_opt.retrieveOption(argc,argv);</div>
-<div class="line"><a name="l00264"></a><span class="lineno">  264</span>     extent_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00118"></a><span class="lineno">  118</span> <span class="keyword">namespace </span>svm{</div>
+<div class="line"><a name="l00119"></a><span class="lineno">  119</span>   <span class="keyword">enum</span> SVM_TYPE {C_SVC=0, nu_SVC=1,one_class=2, epsilon_SVR=3, nu_SVR=4};</div>
+<div class="line"><a name="l00120"></a><span class="lineno">  120</span>   <span class="keyword">enum</span> KERNEL_TYPE {linear=0,polynomial=1,radial=2,sigmoid=3};</div>
+<div class="line"><a name="l00121"></a><span class="lineno">  121</span> }</div>
+<div class="line"><a name="l00122"></a><span class="lineno">  122</span> </div>
+<div class="line"><a name="l00123"></a><span class="lineno">  123</span> <span class="preprocessor">#define Malloc(type,n) (type *)malloc((n)*sizeof(type))</span></div>
+<div class="line"><a name="l00124"></a><span class="lineno">  124</span> <span class="preprocessor"></span></div>
+<div class="line"><a name="l00125"></a><span class="lineno">  125</span> <span class="keyword">using namespace </span>std;</div>
+<div class="line"><a name="l00126"></a><span class="lineno">  126</span> </div>
+<div class="line"><a name="l00127"></a><span class="lineno">  127</span> <span class="keywordtype">int</span> main(<span class="keywordtype">int</span> argc, <span class="keywordtype">char</span> *argv[])</div>
+<div class="line"><a name="l00128"></a><span class="lineno">  128</span> {</div>
+<div class="line"><a name="l00129"></a><span class="lineno">  129</span>   vector<double> priors;</div>
+<div class="line"><a name="l00130"></a><span class="lineno">  130</span>   </div>
+<div class="line"><a name="l00131"></a><span class="lineno">  131</span>   <span class="comment">//--------------------------- command line options ------------------------------------</span></div>
+<div class="line"><a name="l00132"></a><span class="lineno">  132</span>   <a class="code" href="classOptionpk.html">Optionpk<string></a> input_opt(<span class="stringliteral">"i"</span>, <span class="stringliteral">"input"</span>, <span class="stringliteral">"input image"</span>); </div>
+<div class="line"><a name="l00133"></a><span class="lineno">  133</span>   <a class="code" href="classOptionpk.html">Optionpk<string></a> training_opt(<span class="stringliteral">"t"</span>, <span class="stringliteral">"training"</span>, <span class="stringliteral">"Training vector file. A single vector file contains all training features (must be set as: b0, b1, b2,...) for all classes (class numbers identified by label option). Use multiple training  [...]
+<div class="line"><a name="l00134"></a><span class="lineno">  134</span>   <a class="code" href="classOptionpk.html">Optionpk<string></a> tlayer_opt(<span class="stringliteral">"tln"</span>, <span class="stringliteral">"tln"</span>, <span class="stringliteral">"Training layer name(s)"</span>);</div>
+<div class="line"><a name="l00135"></a><span class="lineno">  135</span>   <a class="code" href="classOptionpk.html">Optionpk<string></a> label_opt(<span class="stringliteral">"label"</span>, <span class="stringliteral">"label"</span>, <span class="stringliteral">"Attribute name for class label in training vector file."</span>,<span class="stringliteral">"label"</span>); </div>
+<div class="line"><a name="l00136"></a><span class="lineno">  136</span>   <a class="code" href="classOptionpk.html">Optionpk<unsigned int></a> balance_opt(<span class="stringliteral">"bal"</span>, <span class="stringliteral">"balance"</span>, <span class="stringliteral">"Balance the input data to this number of samples for each class"</span>, 0);</div>
+<div class="line"><a name="l00137"></a><span class="lineno">  137</span>   <a class="code" href="classOptionpk.html">Optionpk<bool></a> random_opt(<span class="stringliteral">"random"</span>, <span class="stringliteral">"random"</span>, <span class="stringliteral">"Randomize training data for balancing and bagging"</span>, <span class="keyword">true</span>, 2);</div>
+<div class="line"><a name="l00138"></a><span class="lineno">  138</span>   <a class="code" href="classOptionpk.html">Optionpk<int></a> minSize_opt(<span class="stringliteral">"min"</span>, <span class="stringliteral">"min"</span>, <span class="stringliteral">"If number of training pixels is less then min, do not take this class into account (0: consider all classes)"</span>, 0);</div>
+<div class="line"><a name="l00139"></a><span class="lineno">  139</span>   <a class="code" href="classOptionpk.html">Optionpk<unsigned short></a> band_opt(<span class="stringliteral">"b"</span>, <span class="stringliteral">"band"</span>, <span class="stringliteral">"Band index (starting from 0, either use band option or use start to end)"</span>);</div>
+<div class="line"><a name="l00140"></a><span class="lineno">  140</span>   <a class="code" href="classOptionpk.html">Optionpk<unsigned short></a> bstart_opt(<span class="stringliteral">"sband"</span>, <span class="stringliteral">"startband"</span>, <span class="stringliteral">"Start band sequence number"</span>); </div>
+<div class="line"><a name="l00141"></a><span class="lineno">  141</span>   <a class="code" href="classOptionpk.html">Optionpk<unsigned short></a> bend_opt(<span class="stringliteral">"eband"</span>, <span class="stringliteral">"endband"</span>, <span class="stringliteral">"End band sequence number"</span>); </div>
+<div class="line"><a name="l00142"></a><span class="lineno">  142</span>   <a class="code" href="classOptionpk.html">Optionpk<double></a> offset_opt(<span class="stringliteral">"offset"</span>, <span class="stringliteral">"offset"</span>, <span class="stringliteral">"Offset value for each spectral band input features: refl[band]=(DN[band]-offset[band])/scale[band]"</span>, 0.0);</div>
+<div class="line"><a name="l00143"></a><span class="lineno">  143</span>   <a class="code" href="classOptionpk.html">Optionpk<double></a> scale_opt(<span class="stringliteral">"scale"</span>, <span class="stringliteral">"scale"</span>, <span class="stringliteral">"Scale value for each spectral band input features: refl=(DN[band]-offset[band])/scale[band] (use 0 if scale min and max in each band to -1.0 and 1.0)"</span>, 0.0);</div>
+<div class="line"><a name="l00144"></a><span class="lineno">  144</span>   <a class="code" href="classOptionpk.html">Optionpk<double></a> priors_opt(<span class="stringliteral">"prior"</span>, <span class="stringliteral">"prior"</span>, <span class="stringliteral">"Prior probabilities for each class (e.g., -p 0.3 -p 0.3 -p 0.2 ). Used for input only (ignored for cross validation)"</span>, 0.0); </div>
+<div class="line"><a name="l00145"></a><span class="lineno">  145</span>   <a class="code" href="classOptionpk.html">Optionpk<string></a> priorimg_opt(<span class="stringliteral">"pim"</span>, <span class="stringliteral">"priorimg"</span>, <span class="stringliteral">"Prior probability image (multi-band img with band for each class"</span>,<span class="stringliteral">""</span>,2); </div>
+<div class="line"><a name="l00146"></a><span class="lineno">  146</span>   <a class="code" href="classOptionpk.html">Optionpk<unsigned short></a> cv_opt(<span class="stringliteral">"cv"</span>, <span class="stringliteral">"cv"</span>, <span class="stringliteral">"N-fold cross validation mode"</span>,0);</div>
+<div class="line"><a name="l00147"></a><span class="lineno">  147</span>   <a class="code" href="classOptionpk.html">Optionpk<string></a> cmformat_opt(<span class="stringliteral">"cmf"</span>,<span class="stringliteral">"cmf"</span>,<span class="stringliteral">"Format for confusion matrix (ascii or latex)"</span>,<span class="stringliteral">"ascii"</span>);</div>
+<div class="line"><a name="l00148"></a><span class="lineno">  148</span>   <a class="code" href="classOptionpk.html">Optionpk<std::string></a> svm_type_opt(<span class="stringliteral">"svmt"</span>, <span class="stringliteral">"svmtype"</span>, <span class="stringliteral">"Type of SVM (C_SVC, nu_SVC,one_class, epsilon_SVR, nu_SVR)"</span>,<span class="stringliteral">"C_SVC"</span>);</div>
+<div class="line"><a name="l00149"></a><span class="lineno">  149</span>   <a class="code" href="classOptionpk.html">Optionpk<std::string></a> kernel_type_opt(<span class="stringliteral">"kt"</span>, <span class="stringliteral">"kerneltype"</span>, <span class="stringliteral">"Type of kernel function (linear,polynomial,radial,sigmoid) "</span>,<span class="stringliteral">"radial"</span>);</div>
+<div class="line"><a name="l00150"></a><span class="lineno">  150</span>   <a class="code" href="classOptionpk.html">Optionpk<unsigned short></a> kernel_degree_opt(<span class="stringliteral">"kd"</span>, <span class="stringliteral">"kd"</span>, <span class="stringliteral">"Degree in kernel function"</span>,3);</div>
+<div class="line"><a name="l00151"></a><span class="lineno">  151</span>   <a class="code" href="classOptionpk.html">Optionpk<float></a> gamma_opt(<span class="stringliteral">"g"</span>, <span class="stringliteral">"gamma"</span>, <span class="stringliteral">"Gamma in kernel function"</span>,1.0);</div>
+<div class="line"><a name="l00152"></a><span class="lineno">  152</span>   <a class="code" href="classOptionpk.html">Optionpk<float></a> coef0_opt(<span class="stringliteral">"c0"</span>, <span class="stringliteral">"coef0"</span>, <span class="stringliteral">"Coef0 in kernel function"</span>,0);</div>
+<div class="line"><a name="l00153"></a><span class="lineno">  153</span>   <a class="code" href="classOptionpk.html">Optionpk<float></a> ccost_opt(<span class="stringliteral">"cc"</span>, <span class="stringliteral">"ccost"</span>, <span class="stringliteral">"The parameter C of C_SVC, epsilon_SVR, and nu_SVR"</span>,1000);</div>
+<div class="line"><a name="l00154"></a><span class="lineno">  154</span>   <a class="code" href="classOptionpk.html">Optionpk<float></a> nu_opt(<span class="stringliteral">"nu"</span>, <span class="stringliteral">"nu"</span>, <span class="stringliteral">"The parameter nu of nu_SVC, one_class SVM, and nu_SVR"</span>,0.5);</div>
+<div class="line"><a name="l00155"></a><span class="lineno">  155</span>   <a class="code" href="classOptionpk.html">Optionpk<float></a> epsilon_loss_opt(<span class="stringliteral">"eloss"</span>, <span class="stringliteral">"eloss"</span>, <span class="stringliteral">"The epsilon in loss function of epsilon_SVR"</span>,0.1);</div>
+<div class="line"><a name="l00156"></a><span class="lineno">  156</span>   <a class="code" href="classOptionpk.html">Optionpk<int></a> cache_opt(<span class="stringliteral">"cache"</span>, <span class="stringliteral">"cache"</span>, <span class="stringliteral">"Cache memory size in MB"</span>,100);</div>
+<div class="line"><a name="l00157"></a><span class="lineno">  157</span>   <a class="code" href="classOptionpk.html">Optionpk<float></a> epsilon_tol_opt(<span class="stringliteral">"etol"</span>, <span class="stringliteral">"etol"</span>, <span class="stringliteral">"The tolerance of termination criterion"</span>,0.001);</div>
+<div class="line"><a name="l00158"></a><span class="lineno">  158</span>   <a class="code" href="classOptionpk.html">Optionpk<bool></a> shrinking_opt(<span class="stringliteral">"shrink"</span>, <span class="stringliteral">"shrink"</span>, <span class="stringliteral">"Whether to use the shrinking heuristics"</span>,<span class="keyword">false</span>);</div>
+<div class="line"><a name="l00159"></a><span class="lineno">  159</span>   <a class="code" href="classOptionpk.html">Optionpk<bool></a> prob_est_opt(<span class="stringliteral">"pe"</span>, <span class="stringliteral">"probest"</span>, <span class="stringliteral">"Whether to train a SVC or SVR model for probability estimates"</span>,<span class="keyword">true</span>,2);</div>
+<div class="line"><a name="l00160"></a><span class="lineno">  160</span>   <span class="comment">// Optionpk<bool> weight_opt("wi", "wi", "Set the parameter C of class i to weight*C, for C_SVC",true);</span></div>
+<div class="line"><a name="l00161"></a><span class="lineno">  161</span>   <a class="code" href="classOptionpk.html">Optionpk<unsigned short></a> comb_opt(<span class="stringliteral">"comb"</span>, <span class="stringliteral">"comb"</span>, <span class="stringliteral">"How to combine bootstrap aggregation classifiers (0: sum rule, 1: product rule, 2: max rule). Also used to aggregate classes with rc option."</span>,0); </div>
+<div class="line"><a name="l00162"></a><span class="lineno">  162</span>   <a class="code" href="classOptionpk.html">Optionpk<unsigned short></a> bag_opt(<span class="stringliteral">"bag"</span>, <span class="stringliteral">"bag"</span>, <span class="stringliteral">"Number of bootstrap aggregations"</span>, 1);</div>
+<div class="line"><a name="l00163"></a><span class="lineno">  163</span>   <a class="code" href="classOptionpk.html">Optionpk<int></a> bagSize_opt(<span class="stringliteral">"bagsize"</span>, <span class="stringliteral">"bagsize"</span>, <span class="stringliteral">"Percentage of features used from available training features for each bootstrap aggregation (one size for all classes, or a different size for each class respectively"</span>, 100);</div>
+<div class="line"><a name="l00164"></a><span class="lineno">  164</span>   <a class="code" href="classOptionpk.html">Optionpk<string></a> classBag_opt(<span class="stringliteral">"cb"</span>, <span class="stringliteral">"classbag"</span>, <span class="stringliteral">"Output for each individual bootstrap aggregation"</span>);</div>
+<div class="line"><a name="l00165"></a><span class="lineno">  165</span>   <a class="code" href="classOptionpk.html">Optionpk<string></a> mask_opt(<span class="stringliteral">"m"</span>, <span class="stringliteral">"mask"</span>, <span class="stringliteral">"Only classify within specified mask (vector or raster). For raster mask, set nodata values with the option msknodata."</span>);</div>
+<div class="line"><a name="l00166"></a><span class="lineno">  166</span>   <a class="code" href="classOptionpk.html">Optionpk<short></a> msknodata_opt(<span class="stringliteral">"msknodata"</span>, <span class="stringliteral">"msknodata"</span>, <span class="stringliteral">"Mask value(s) not to consider for classification (use negative values if only these values should be taken into account). Values will be taken over in classification image."</ [...]
+<div class="line"><a name="l00167"></a><span class="lineno">  167</span>   <a class="code" href="classOptionpk.html">Optionpk<unsigned short></a> nodata_opt(<span class="stringliteral">"nodata"</span>, <span class="stringliteral">"nodata"</span>, <span class="stringliteral">"Nodata value to put where image is masked as nodata"</span>, 0);</div>
+<div class="line"><a name="l00168"></a><span class="lineno">  168</span>   <a class="code" href="classOptionpk.html">Optionpk<string></a> output_opt(<span class="stringliteral">"o"</span>, <span class="stringliteral">"output"</span>, <span class="stringliteral">"Output classification image"</span>); </div>
+<div class="line"><a name="l00169"></a><span class="lineno">  169</span>   <a class="code" href="classOptionpk.html">Optionpk<string></a>  oformat_opt(<span class="stringliteral">"of"</span>, <span class="stringliteral">"oformat"</span>, <span class="stringliteral">"Output image format (see also gdal_translate). Empty string: inherit from input image"</span>);</div>
+<div class="line"><a name="l00170"></a><span class="lineno">  170</span>   <a class="code" href="classOptionpk.html">Optionpk<string></a> option_opt(<span class="stringliteral">"co"</span>, <span class="stringliteral">"co"</span>, <span class="stringliteral">"Creation option for output file. Multiple options can be specified."</span>);</div>
+<div class="line"><a name="l00171"></a><span class="lineno">  171</span>   <a class="code" href="classOptionpk.html">Optionpk<string></a> colorTable_opt(<span class="stringliteral">"ct"</span>, <span class="stringliteral">"ct"</span>, <span class="stringliteral">"Color table in ASCII format having 5 columns: id R G B ALFA (0: transparent, 255: solid)"</span>); </div>
+<div class="line"><a name="l00172"></a><span class="lineno">  172</span>   <a class="code" href="classOptionpk.html">Optionpk<string></a> prob_opt(<span class="stringliteral">"prob"</span>, <span class="stringliteral">"prob"</span>, <span class="stringliteral">"Probability image."</span>); </div>
+<div class="line"><a name="l00173"></a><span class="lineno">  173</span>   <a class="code" href="classOptionpk.html">Optionpk<string></a> entropy_opt(<span class="stringliteral">"entropy"</span>, <span class="stringliteral">"entropy"</span>, <span class="stringliteral">"Entropy image (measure for uncertainty of classifier output"</span>,<span class="stringliteral">""</span>,2); </div>
+<div class="line"><a name="l00174"></a><span class="lineno">  174</span>   <a class="code" href="classOptionpk.html">Optionpk<string></a> active_opt(<span class="stringliteral">"active"</span>, <span class="stringliteral">"active"</span>, <span class="stringliteral">"Ogr output for active training sample."</span>,<span class="stringliteral">""</span>,2); </div>
+<div class="line"><a name="l00175"></a><span class="lineno">  175</span>   <a class="code" href="classOptionpk.html">Optionpk<string></a> ogrformat_opt(<span class="stringliteral">"f"</span>, <span class="stringliteral">"f"</span>, <span class="stringliteral">"Output ogr format for active training sample"</span>,<span class="stringliteral">"SQLite"</span>);</div>
+<div class="line"><a name="l00176"></a><span class="lineno">  176</span>   <a class="code" href="classOptionpk.html">Optionpk<unsigned int></a> nactive_opt(<span class="stringliteral">"na"</span>, <span class="stringliteral">"nactive"</span>, <span class="stringliteral">"Number of active training points"</span>,1);</div>
+<div class="line"><a name="l00177"></a><span class="lineno">  177</span>   <a class="code" href="classOptionpk.html">Optionpk<string></a> classname_opt(<span class="stringliteral">"c"</span>, <span class="stringliteral">"class"</span>, <span class="stringliteral">"List of class names."</span>); </div>
+<div class="line"><a name="l00178"></a><span class="lineno">  178</span>   <a class="code" href="classOptionpk.html">Optionpk<short></a> classvalue_opt(<span class="stringliteral">"r"</span>, <span class="stringliteral">"reclass"</span>, <span class="stringliteral">"List of class values (use same order as in class opt)."</span>); </div>
+<div class="line"><a name="l00179"></a><span class="lineno">  179</span>   <a class="code" href="classOptionpk.html">Optionpk<short></a> verbose_opt(<span class="stringliteral">"v"</span>, <span class="stringliteral">"verbose"</span>, <span class="stringliteral">"Verbose level"</span>,0,2);</div>
+<div class="line"><a name="l00180"></a><span class="lineno">  180</span> </div>
+<div class="line"><a name="l00181"></a><span class="lineno">  181</span>   band_opt.setHide(1);</div>
+<div class="line"><a name="l00182"></a><span class="lineno">  182</span>   bstart_opt.setHide(1);</div>
+<div class="line"><a name="l00183"></a><span class="lineno">  183</span>   bend_opt.setHide(1);</div>
+<div class="line"><a name="l00184"></a><span class="lineno">  184</span>   balance_opt.setHide(1);</div>
+<div class="line"><a name="l00185"></a><span class="lineno">  185</span>   minSize_opt.setHide(1);</div>
+<div class="line"><a name="l00186"></a><span class="lineno">  186</span>   bag_opt.setHide(1);</div>
+<div class="line"><a name="l00187"></a><span class="lineno">  187</span>   bagSize_opt.setHide(1);</div>
+<div class="line"><a name="l00188"></a><span class="lineno">  188</span>   comb_opt.setHide(1);</div>
+<div class="line"><a name="l00189"></a><span class="lineno">  189</span>   classBag_opt.setHide(1);</div>
+<div class="line"><a name="l00190"></a><span class="lineno">  190</span>   prob_opt.setHide(1);</div>
+<div class="line"><a name="l00191"></a><span class="lineno">  191</span>   priorimg_opt.setHide(1);</div>
+<div class="line"><a name="l00192"></a><span class="lineno">  192</span>   offset_opt.setHide(1);</div>
+<div class="line"><a name="l00193"></a><span class="lineno">  193</span>   scale_opt.setHide(1);</div>
+<div class="line"><a name="l00194"></a><span class="lineno">  194</span>   svm_type_opt.setHide(1);</div>
+<div class="line"><a name="l00195"></a><span class="lineno">  195</span>   kernel_type_opt.setHide(1);</div>
+<div class="line"><a name="l00196"></a><span class="lineno">  196</span>   kernel_degree_opt.setHide(1);</div>
+<div class="line"><a name="l00197"></a><span class="lineno">  197</span>   coef0_opt.setHide(1);</div>
+<div class="line"><a name="l00198"></a><span class="lineno">  198</span>   nu_opt.setHide(1);</div>
+<div class="line"><a name="l00199"></a><span class="lineno">  199</span>   epsilon_loss_opt.setHide(1);</div>
+<div class="line"><a name="l00200"></a><span class="lineno">  200</span>   cache_opt.setHide(1);</div>
+<div class="line"><a name="l00201"></a><span class="lineno">  201</span>   epsilon_tol_opt.setHide(1);</div>
+<div class="line"><a name="l00202"></a><span class="lineno">  202</span>   shrinking_opt.setHide(1);</div>
+<div class="line"><a name="l00203"></a><span class="lineno">  203</span>   prob_est_opt.setHide(1);</div>
+<div class="line"><a name="l00204"></a><span class="lineno">  204</span>   entropy_opt.setHide(1);</div>
+<div class="line"><a name="l00205"></a><span class="lineno">  205</span>   active_opt.setHide(1);</div>
+<div class="line"><a name="l00206"></a><span class="lineno">  206</span>   nactive_opt.setHide(1);</div>
+<div class="line"><a name="l00207"></a><span class="lineno">  207</span>   random_opt.setHide(1);</div>
+<div class="line"><a name="l00208"></a><span class="lineno">  208</span> </div>
+<div class="line"><a name="l00209"></a><span class="lineno">  209</span>   verbose_opt.setHide(2);</div>
+<div class="line"><a name="l00210"></a><span class="lineno">  210</span> </div>
+<div class="line"><a name="l00211"></a><span class="lineno">  211</span>   <span class="keywordtype">bool</span> doProcess;<span class="comment">//stop process when program was invoked with help option (-h --help)</span></div>
+<div class="line"><a name="l00212"></a><span class="lineno">  212</span>   <span class="keywordflow">try</span>{</div>
+<div class="line"><a name="l00213"></a><span class="lineno">  213</span>     doProcess=training_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00214"></a><span class="lineno">  214</span>     input_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00215"></a><span class="lineno">  215</span>     output_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00216"></a><span class="lineno">  216</span>     cv_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00217"></a><span class="lineno">  217</span>     cmformat_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00218"></a><span class="lineno">  218</span>     tlayer_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00219"></a><span class="lineno">  219</span>     classname_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00220"></a><span class="lineno">  220</span>     classvalue_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00221"></a><span class="lineno">  221</span>     oformat_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00222"></a><span class="lineno">  222</span>     ogrformat_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00223"></a><span class="lineno">  223</span>     option_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00224"></a><span class="lineno">  224</span>     colorTable_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00225"></a><span class="lineno">  225</span>     label_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00226"></a><span class="lineno">  226</span>     priors_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00227"></a><span class="lineno">  227</span>     gamma_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00228"></a><span class="lineno">  228</span>     ccost_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00229"></a><span class="lineno">  229</span>     mask_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00230"></a><span class="lineno">  230</span>     msknodata_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00231"></a><span class="lineno">  231</span>     nodata_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00232"></a><span class="lineno">  232</span>     <span class="comment">// Advanced options</span></div>
+<div class="line"><a name="l00233"></a><span class="lineno">  233</span>     band_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00234"></a><span class="lineno">  234</span>     bstart_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00235"></a><span class="lineno">  235</span>     bend_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00236"></a><span class="lineno">  236</span>     balance_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00237"></a><span class="lineno">  237</span>     minSize_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00238"></a><span class="lineno">  238</span>     bag_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00239"></a><span class="lineno">  239</span>     bagSize_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00240"></a><span class="lineno">  240</span>     comb_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00241"></a><span class="lineno">  241</span>     classBag_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00242"></a><span class="lineno">  242</span>     prob_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00243"></a><span class="lineno">  243</span>     priorimg_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00244"></a><span class="lineno">  244</span>     offset_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00245"></a><span class="lineno">  245</span>     scale_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00246"></a><span class="lineno">  246</span>     svm_type_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00247"></a><span class="lineno">  247</span>     kernel_type_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00248"></a><span class="lineno">  248</span>     kernel_degree_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00249"></a><span class="lineno">  249</span>     coef0_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00250"></a><span class="lineno">  250</span>     nu_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00251"></a><span class="lineno">  251</span>     epsilon_loss_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00252"></a><span class="lineno">  252</span>     cache_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00253"></a><span class="lineno">  253</span>     epsilon_tol_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00254"></a><span class="lineno">  254</span>     shrinking_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00255"></a><span class="lineno">  255</span>     prob_est_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00256"></a><span class="lineno">  256</span>     entropy_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00257"></a><span class="lineno">  257</span>     active_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00258"></a><span class="lineno">  258</span>     nactive_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00259"></a><span class="lineno">  259</span>     verbose_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00260"></a><span class="lineno">  260</span>     random_opt.retrieveOption(argc,argv);</div>
+<div class="line"><a name="l00261"></a><span class="lineno">  261</span>   }</div>
+<div class="line"><a name="l00262"></a><span class="lineno">  262</span>   <span class="keywordflow">catch</span>(<span class="keywordtype">string</span> predefinedString){</div>
+<div class="line"><a name="l00263"></a><span class="lineno">  263</span>     std::cout << predefinedString << std::endl;</div>
+<div class="line"><a name="l00264"></a><span class="lineno">  264</span>     exit(0);</div>
 <div class="line"><a name="l00265"></a><span class="lineno">  265</span>   }</div>
-<div class="line"><a name="l00266"></a><span class="lineno">  266</span>   <span class="keywordflow">catch</span>(<span class="keywordtype">string</span> predefinedString){</div>
-<div class="line"><a name="l00267"></a><span class="lineno">  267</span>     std::cout << predefinedString << std::endl;</div>
-<div class="line"><a name="l00268"></a><span class="lineno">  268</span>     exit(0);</div>
-<div class="line"><a name="l00269"></a><span class="lineno">  269</span>   }</div>
-<div class="line"><a name="l00270"></a><span class="lineno">  270</span>   <span class="keywordflow">if</span>(!doProcess){</div>
-<div class="line"><a name="l00271"></a><span class="lineno">  271</span>     cout << endl;</div>
-<div class="line"><a name="l00272"></a><span class="lineno">  272</span>     cout << <span class="stringliteral">"Usage: pksvm -t training [-i input -o output] [-cv value]"</span> << endl;</div>
-<div class="line"><a name="l00273"></a><span class="lineno">  273</span>     cout << endl;</div>
-<div class="line"><a name="l00274"></a><span class="lineno">  274</span>     std::cout << <span class="stringliteral">"short option -h shows basic options only, use long option --help to show all options"</span> << std::endl;</div>
-<div class="line"><a name="l00275"></a><span class="lineno">  275</span>     exit(0);<span class="comment">//help was invoked, stop processing</span></div>
-<div class="line"><a name="l00276"></a><span class="lineno">  276</span>   }</div>
-<div class="line"><a name="l00277"></a><span class="lineno">  277</span> </div>
-<div class="line"><a name="l00278"></a><span class="lineno">  278</span>   <span class="keywordflow">if</span>(entropy_opt[0]==<span class="stringliteral">""</span>)</div>
-<div class="line"><a name="l00279"></a><span class="lineno">  279</span>     entropy_opt.clear();</div>
-<div class="line"><a name="l00280"></a><span class="lineno">  280</span>   <span class="keywordflow">if</span>(active_opt[0]==<span class="stringliteral">""</span>)</div>
-<div class="line"><a name="l00281"></a><span class="lineno">  281</span>     active_opt.clear();</div>
-<div class="line"><a name="l00282"></a><span class="lineno">  282</span>   <span class="keywordflow">if</span>(priorimg_opt[0]==<span class="stringliteral">""</span>)</div>
-<div class="line"><a name="l00283"></a><span class="lineno">  283</span>     priorimg_opt.clear();</div>
-<div class="line"><a name="l00284"></a><span class="lineno">  284</span> </div>
-<div class="line"><a name="l00285"></a><span class="lineno">  285</span> </div>
-<div class="line"><a name="l00286"></a><span class="lineno">  286</span>   std::map<std::string, svm::SVM_TYPE> svmMap;</div>
-<div class="line"><a name="l00287"></a><span class="lineno">  287</span> </div>
-<div class="line"><a name="l00288"></a><span class="lineno">  288</span>   svmMap[<span class="stringliteral">"C_SVC"</span>]=svm::C_SVC;</div>
-<div class="line"><a name="l00289"></a><span class="lineno">  289</span>   svmMap[<span class="stringliteral">"nu_SVC"</span>]=svm::nu_SVC;</div>
-<div class="line"><a name="l00290"></a><span class="lineno">  290</span>   svmMap[<span class="stringliteral">"one_class"</span>]=svm::one_class;</div>
-<div class="line"><a name="l00291"></a><span class="lineno">  291</span>   svmMap[<span class="stringliteral">"epsilon_SVR"</span>]=svm::epsilon_SVR;</div>
-<div class="line"><a name="l00292"></a><span class="lineno">  292</span>   svmMap[<span class="stringliteral">"nu_SVR"</span>]=svm::nu_SVR;</div>
-<div class="line"><a name="l00293"></a><span class="lineno">  293</span> </div>
-<div class="line"><a name="l00294"></a><span class="lineno">  294</span>   std::map<std::string, svm::KERNEL_TYPE> kernelMap;</div>
-<div class="line"><a name="l00295"></a><span class="lineno">  295</span> </div>
-<div class="line"><a name="l00296"></a><span class="lineno">  296</span>   kernelMap[<span class="stringliteral">"linear"</span>]=svm::linear;</div>
-<div class="line"><a name="l00297"></a><span class="lineno">  297</span>   kernelMap[<span class="stringliteral">"polynomial"</span>]=svm::polynomial;</div>
-<div class="line"><a name="l00298"></a><span class="lineno">  298</span>   kernelMap[<span class="stringliteral">"radial"</span>]=svm::radial;</div>
-<div class="line"><a name="l00299"></a><span class="lineno">  299</span>   kernelMap[<span class="stringliteral">"sigmoid;"</span>]=svm::sigmoid;</div>
-<div class="line"><a name="l00300"></a><span class="lineno">  300</span> </div>
-<div class="line"><a name="l00301"></a><span class="lineno">  301</span>   assert(training_opt.size());</div>
-<div class="line"><a name="l00302"></a><span class="lineno">  302</span> </div>
-<div class="line"><a name="l00303"></a><span class="lineno">  303</span>   <span class="keywordflow">if</span>(verbose_opt[0]>=1){</div>
-<div class="line"><a name="l00304"></a><span class="lineno">  304</span>     <span class="keywordflow">if</span>(input_opt.size())</div>
-<div class="line"><a name="l00305"></a><span class="lineno">  305</span>       std::cout << <span class="stringliteral">"input filename: "</span> << input_opt[0] << std::endl;</div>
-<div class="line"><a name="l00306"></a><span class="lineno">  306</span>     <span class="keywordflow">if</span>(mask_opt.size())</div>
-<div class="line"><a name="l00307"></a><span class="lineno">  307</span>       std::cout << <span class="stringliteral">"mask filename: "</span> << mask_opt[0] << std::endl;</div>
-<div class="line"><a name="l00308"></a><span class="lineno">  308</span>     std::cout << <span class="stringliteral">"training vector file: "</span> << std::endl;</div>
-<div class="line"><a name="l00309"></a><span class="lineno">  309</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> ifile=0;ifile<training_opt.size();++ifile)</div>
-<div class="line"><a name="l00310"></a><span class="lineno">  310</span>       std::cout << training_opt[ifile] << std::endl;</div>
-<div class="line"><a name="l00311"></a><span class="lineno">  311</span>     std::cout << <span class="stringliteral">"verbose: "</span> << verbose_opt[0] << std::endl;</div>
-<div class="line"><a name="l00312"></a><span class="lineno">  312</span>   }</div>
-<div class="line"><a name="l00313"></a><span class="lineno">  313</span>   <span class="keywordtype">unsigned</span> <span class="keywordtype">short</span> nbag=(training_opt.size()>1)?training_opt.size():bag_opt[0];</div>
-<div class="line"><a name="l00314"></a><span class="lineno">  314</span>   <span class="keywordflow">if</span>(verbose_opt[0]>=1)</div>
-<div class="line"><a name="l00315"></a><span class="lineno">  315</span>     std::cout << <span class="stringliteral">"number of bootstrap aggregations: "</span> << nbag << std::endl;</div>
-<div class="line"><a name="l00316"></a><span class="lineno">  316</span> </div>
-<div class="line"><a name="l00317"></a><span class="lineno">  317</span>   <a class="code" href="classImgReaderOgr.html">ImgReaderOgr</a> extentReader;</div>
-<div class="line"><a name="l00318"></a><span class="lineno">  318</span>   OGRLayer  *readLayer;</div>
-<div class="line"><a name="l00319"></a><span class="lineno">  319</span>   OGRFeature *readFeature;</div>
-<div class="line"><a name="l00320"></a><span class="lineno">  320</span>   OGRPoint thePoint;</div>
-<div class="line"><a name="l00321"></a><span class="lineno">  321</span> </div>
-<div class="line"><a name="l00322"></a><span class="lineno">  322</span>   <span class="keywordtype">double</span> ulx=0;</div>
-<div class="line"><a name="l00323"></a><span class="lineno">  323</span>   <span class="keywordtype">double</span> uly=0;</div>
-<div class="line"><a name="l00324"></a><span class="lineno">  324</span>   <span class="keywordtype">double</span> lrx=0;</div>
-<div class="line"><a name="l00325"></a><span class="lineno">  325</span>   <span class="keywordtype">double</span> lry=0;</div>
-<div class="line"><a name="l00326"></a><span class="lineno">  326</span>   <span class="keywordflow">if</span>(extent_opt.size()){</div>
-<div class="line"><a name="l00327"></a><span class="lineno">  327</span>     extentReader.open(extent_opt[0]);</div>
-<div class="line"><a name="l00328"></a><span class="lineno">  328</span>     readLayer = extentReader.getDataSource()->GetLayer(0);</div>
-<div class="line"><a name="l00329"></a><span class="lineno">  329</span>       <span class="keywordflow">if</span>(!(extentReader.getExtent(ulx,uly,lrx,lry))){</div>
-<div class="line"><a name="l00330"></a><span class="lineno">  330</span>       cerr << <span class="stringliteral">"Error: could not get extent from "</span> << extent_opt[0] << endl;</div>
-<div class="line"><a name="l00331"></a><span class="lineno">  331</span>       exit(1);</div>
-<div class="line"><a name="l00332"></a><span class="lineno">  332</span>     }</div>
-<div class="line"><a name="l00333"></a><span class="lineno">  333</span>   }</div>
-<div class="line"><a name="l00334"></a><span class="lineno">  334</span> </div>
-<div class="line"><a name="l00335"></a><span class="lineno">  335</span>   <a class="code" href="classImgWriterOgr.html">ImgWriterOgr</a> activeWriter;</div>
-<div class="line"><a name="l00336"></a><span class="lineno">  336</span>   <span class="keywordflow">if</span>(active_opt.size()){</div>
-<div class="line"><a name="l00337"></a><span class="lineno">  337</span>     prob_est_opt[0]=<span class="keyword">true</span>;</div>
-<div class="line"><a name="l00338"></a><span class="lineno">  338</span>     <a class="code" href="classImgReaderOgr.html">ImgReaderOgr</a> trainingReader(training_opt[0]);</div>
-<div class="line"><a name="l00339"></a><span class="lineno">  339</span>     activeWriter.open(active_opt[0],ogrformat_opt[0]);</div>
-<div class="line"><a name="l00340"></a><span class="lineno">  340</span>     activeWriter.createLayer(active_opt[0],trainingReader.getProjection(),wkbPoint,NULL);</div>
-<div class="line"><a name="l00341"></a><span class="lineno">  341</span>     activeWriter.copyFields(trainingReader);</div>
-<div class="line"><a name="l00342"></a><span class="lineno">  342</span>   }</div>
-<div class="line"><a name="l00343"></a><span class="lineno">  343</span>   vector<PosValue> activePoints(nactive_opt[0]);</div>
-<div class="line"><a name="l00344"></a><span class="lineno">  344</span>   <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iactive=0;iactive<activePoints.size();++iactive){</div>
-<div class="line"><a name="l00345"></a><span class="lineno">  345</span>     activePoints[iactive].value=1.0;</div>
-<div class="line"><a name="l00346"></a><span class="lineno">  346</span>     activePoints[iactive].posx=0.0;</div>
-<div class="line"><a name="l00347"></a><span class="lineno">  347</span>     activePoints[iactive].posy=0.0;</div>
-<div class="line"><a name="l00348"></a><span class="lineno">  348</span>   }</div>
-<div class="line"><a name="l00349"></a><span class="lineno">  349</span>   </div>
-<div class="line"><a name="l00350"></a><span class="lineno">  350</span>   <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> totalSamples=0;</div>
-<div class="line"><a name="l00351"></a><span class="lineno">  351</span>   <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> nactive=0;</div>
-<div class="line"><a name="l00352"></a><span class="lineno">  352</span>   vector<struct svm_model*> svm(nbag);</div>
-<div class="line"><a name="l00353"></a><span class="lineno">  353</span>   vector<struct svm_parameter> param(nbag);</div>
-<div class="line"><a name="l00354"></a><span class="lineno">  354</span> </div>
-<div class="line"><a name="l00355"></a><span class="lineno">  355</span>   <span class="keywordtype">short</span> nclass=0;</div>
-<div class="line"><a name="l00356"></a><span class="lineno">  356</span>   <span class="keywordtype">int</span> nband=0;</div>
-<div class="line"><a name="l00357"></a><span class="lineno">  357</span>   <span class="keywordtype">int</span> startBand=2;<span class="comment">//first two bands represent X and Y pos</span></div>
-<div class="line"><a name="l00358"></a><span class="lineno">  358</span> </div>
-<div class="line"><a name="l00359"></a><span class="lineno">  359</span>   <span class="comment">//normalize priors from command line</span></div>
-<div class="line"><a name="l00360"></a><span class="lineno">  360</span>   <span class="keywordflow">if</span>(priors_opt.size()>1){<span class="comment">//priors from argument list</span></div>
-<div class="line"><a name="l00361"></a><span class="lineno">  361</span>     priors.resize(priors_opt.size());</div>
-<div class="line"><a name="l00362"></a><span class="lineno">  362</span>     <span class="keywordtype">double</span> normPrior=0;</div>
-<div class="line"><a name="l00363"></a><span class="lineno">  363</span>     <span class="keywordflow">for</span>(<span class="keywordtype">short</span> iclass=0;iclass<priors_opt.size();++iclass){</div>
-<div class="line"><a name="l00364"></a><span class="lineno">  364</span>       priors[iclass]=priors_opt[iclass];</div>
-<div class="line"><a name="l00365"></a><span class="lineno">  365</span>       normPrior+=priors[iclass];</div>
-<div class="line"><a name="l00366"></a><span class="lineno">  366</span>     }</div>
-<div class="line"><a name="l00367"></a><span class="lineno">  367</span>     <span class="comment">//normalize</span></div>
-<div class="line"><a name="l00368"></a><span class="lineno">  368</span>     <span class="keywordflow">for</span>(<span class="keywordtype">short</span> iclass=0;iclass<priors_opt.size();++iclass)</div>
-<div class="line"><a name="l00369"></a><span class="lineno">  369</span>       priors[iclass]/=normPrior;</div>
-<div class="line"><a name="l00370"></a><span class="lineno">  370</span>   }</div>
-<div class="line"><a name="l00371"></a><span class="lineno">  371</span> </div>
-<div class="line"><a name="l00372"></a><span class="lineno">  372</span>   <span class="comment">//sort bands</span></div>
-<div class="line"><a name="l00373"></a><span class="lineno">  373</span>   <span class="keywordflow">if</span>(band_opt.size())</div>
-<div class="line"><a name="l00374"></a><span class="lineno">  374</span>     std::sort(band_opt.begin(),band_opt.end());</div>
-<div class="line"><a name="l00375"></a><span class="lineno">  375</span> </div>
-<div class="line"><a name="l00376"></a><span class="lineno">  376</span>   map<string,short> classValueMap;</div>
-<div class="line"><a name="l00377"></a><span class="lineno">  377</span>   vector<std::string> nameVector;</div>
-<div class="line"><a name="l00378"></a><span class="lineno">  378</span>   <span class="keywordflow">if</span>(classname_opt.size()){</div>
-<div class="line"><a name="l00379"></a><span class="lineno">  379</span>     assert(classname_opt.size()==classvalue_opt.size());</div>
-<div class="line"><a name="l00380"></a><span class="lineno">  380</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iclass=0;iclass<classname_opt.size();++iclass)</div>
-<div class="line"><a name="l00381"></a><span class="lineno">  381</span>       classValueMap[classname_opt[iclass]]=classvalue_opt[iclass];</div>
-<div class="line"><a name="l00382"></a><span class="lineno">  382</span>   }</div>
-<div class="line"><a name="l00383"></a><span class="lineno">  383</span> </div>
-<div class="line"><a name="l00384"></a><span class="lineno">  384</span>   <span class="comment">//----------------------------------- Training -------------------------------</span></div>
-<div class="line"><a name="l00385"></a><span class="lineno">  385</span>   <a class="code" href="classconfusionmatrix_1_1ConfusionMatrix.html">confusionmatrix::ConfusionMatrix</a> cm;</div>
-<div class="line"><a name="l00386"></a><span class="lineno">  386</span>   vector< vector<double> > offset(nbag);</div>
-<div class="line"><a name="l00387"></a><span class="lineno">  387</span>   vector< vector<double> > scale(nbag);</div>
-<div class="line"><a name="l00388"></a><span class="lineno">  388</span>   map<string,Vector2d<float> > trainingMap;</div>
-<div class="line"><a name="l00389"></a><span class="lineno">  389</span>   vector< Vector2d<float> > trainingPixels;<span class="comment">//[class][sample][band]</span></div>
-<div class="line"><a name="l00390"></a><span class="lineno">  390</span>   vector<string> fields;</div>
-<div class="line"><a name="l00391"></a><span class="lineno">  391</span> </div>
-<div class="line"><a name="l00392"></a><span class="lineno">  392</span>   vector<struct svm_problem> prob(nbag);</div>
-<div class="line"><a name="l00393"></a><span class="lineno">  393</span>   vector<struct svm_node *> x_space(nbag);</div>
-<div class="line"><a name="l00394"></a><span class="lineno">  394</span> </div>
-<div class="line"><a name="l00395"></a><span class="lineno">  395</span>   <span class="keywordflow">for</span>(<span class="keywordtype">int</span> ibag=0;ibag<nbag;++ibag){</div>
-<div class="line"><a name="l00396"></a><span class="lineno">  396</span>     <span class="comment">//organize training data</span></div>
-<div class="line"><a name="l00397"></a><span class="lineno">  397</span>     <span class="keywordflow">if</span>(ibag<training_opt.size()){<span class="comment">//if bag contains new training pixels</span></div>
-<div class="line"><a name="l00398"></a><span class="lineno">  398</span>       trainingMap.clear();</div>
-<div class="line"><a name="l00399"></a><span class="lineno">  399</span>       trainingPixels.clear();</div>
-<div class="line"><a name="l00400"></a><span class="lineno">  400</span>       <span class="keywordflow">if</span>(verbose_opt[0]>=1)</div>
-<div class="line"><a name="l00401"></a><span class="lineno">  401</span>         std::cout << <span class="stringliteral">"reading imageVector file "</span> << training_opt[0] << std::endl;</div>
-<div class="line"><a name="l00402"></a><span class="lineno">  402</span>       <span class="keywordflow">try</span>{</div>
-<div class="line"><a name="l00403"></a><span class="lineno">  403</span>     <a class="code" href="classImgReaderOgr.html">ImgReaderOgr</a> trainingReaderBag(training_opt[ibag]);</div>
-<div class="line"><a name="l00404"></a><span class="lineno">  404</span>         <span class="keywordflow">if</span>(band_opt.size())</div>
-<div class="line"><a name="l00405"></a><span class="lineno">  405</span>           totalSamples=trainingReaderBag.readDataImageOgr(trainingMap,fields,band_opt,label_opt[0],tlayer_opt,verbose_opt[0]);</div>
-<div class="line"><a name="l00406"></a><span class="lineno">  406</span>         <span class="keywordflow">else</span></div>
-<div class="line"><a name="l00407"></a><span class="lineno">  407</span>           totalSamples=trainingReaderBag.readDataImageOgr(trainingMap,fields,bstart_opt[0],bend_opt[0],label_opt[0],tlayer_opt,verbose_opt[0]);</div>
-<div class="line"><a name="l00408"></a><span class="lineno">  408</span>         <span class="keywordflow">if</span>(trainingMap.size()<2){</div>
-<div class="line"><a name="l00409"></a><span class="lineno">  409</span>           <span class="keywordtype">string</span> errorstring=<span class="stringliteral">"Error: could not read at least two classes from training file, did you provide class labels in training sample (see option label)?"</span>;</div>
-<div class="line"><a name="l00410"></a><span class="lineno">  410</span>           <span class="keywordflow">throw</span>(errorstring);</div>
-<div class="line"><a name="l00411"></a><span class="lineno">  411</span>         }</div>
-<div class="line"><a name="l00412"></a><span class="lineno">  412</span>     trainingReaderBag.close();</div>
-<div class="line"><a name="l00413"></a><span class="lineno">  413</span>       }</div>
-<div class="line"><a name="l00414"></a><span class="lineno">  414</span>       <span class="keywordflow">catch</span>(<span class="keywordtype">string</span> error){</div>
-<div class="line"><a name="l00415"></a><span class="lineno">  415</span>         cerr << error << std::endl;</div>
-<div class="line"><a name="l00416"></a><span class="lineno">  416</span>         exit(1);</div>
-<div class="line"><a name="l00417"></a><span class="lineno">  417</span>       }</div>
-<div class="line"><a name="l00418"></a><span class="lineno">  418</span>       <span class="keywordflow">catch</span>(std::exception& e){</div>
-<div class="line"><a name="l00419"></a><span class="lineno">  419</span>         std::cerr << <span class="stringliteral">"Error: "</span>;</div>
-<div class="line"><a name="l00420"></a><span class="lineno">  420</span>         std::cerr << e.what() << std::endl;</div>
-<div class="line"><a name="l00421"></a><span class="lineno">  421</span>         std::cerr << CPLGetLastErrorMsg() << std::endl; </div>
-<div class="line"><a name="l00422"></a><span class="lineno">  422</span>         exit(1);</div>
-<div class="line"><a name="l00423"></a><span class="lineno">  423</span>       }</div>
-<div class="line"><a name="l00424"></a><span class="lineno">  424</span>       <span class="keywordflow">catch</span>(...){</div>
-<div class="line"><a name="l00425"></a><span class="lineno">  425</span>         cerr << <span class="stringliteral">"error catched"</span> << std::endl;</div>
-<div class="line"><a name="l00426"></a><span class="lineno">  426</span>         exit(1);</div>
-<div class="line"><a name="l00427"></a><span class="lineno">  427</span>       }</div>
-<div class="line"><a name="l00428"></a><span class="lineno">  428</span> </div>
-<div class="line"><a name="l00429"></a><span class="lineno">  429</span>       <span class="comment">//convert map to vector</span></div>
-<div class="line"><a name="l00430"></a><span class="lineno">  430</span>       <span class="comment">// short iclass=0;</span></div>
-<div class="line"><a name="l00431"></a><span class="lineno">  431</span>       <span class="keywordflow">if</span>(verbose_opt[0]>1)</div>
-<div class="line"><a name="l00432"></a><span class="lineno">  432</span>         std::cout << <span class="stringliteral">"training pixels: "</span> << std::endl;</div>
-<div class="line"><a name="l00433"></a><span class="lineno">  433</span>       map<string,Vector2d<float> >::iterator mapit=trainingMap.begin();</div>
-<div class="line"><a name="l00434"></a><span class="lineno">  434</span>       <span class="keywordflow">while</span>(mapit!=trainingMap.end()){</div>
-<div class="line"><a name="l00435"></a><span class="lineno">  435</span>         <span class="comment">//delete small classes</span></div>
-<div class="line"><a name="l00436"></a><span class="lineno">  436</span>         <span class="keywordflow">if</span>((mapit->second).size()<minSize_opt[0]){</div>
-<div class="line"><a name="l00437"></a><span class="lineno">  437</span>           trainingMap.erase(mapit);</div>
-<div class="line"><a name="l00438"></a><span class="lineno">  438</span>           <span class="keywordflow">continue</span>;</div>
-<div class="line"><a name="l00439"></a><span class="lineno">  439</span>         }</div>
-<div class="line"><a name="l00440"></a><span class="lineno">  440</span>         trainingPixels.push_back(mapit->second);</div>
-<div class="line"><a name="l00441"></a><span class="lineno">  441</span>         <span class="keywordflow">if</span>(verbose_opt[0]>1)</div>
-<div class="line"><a name="l00442"></a><span class="lineno">  442</span>           std::cout << mapit->first << <span class="stringliteral">": "</span> << (mapit->second).size() << <span class="stringliteral">" samples"</span> << std::endl;</div>
-<div class="line"><a name="l00443"></a><span class="lineno">  443</span>         ++mapit;</div>
-<div class="line"><a name="l00444"></a><span class="lineno">  444</span>       }</div>
-<div class="line"><a name="l00445"></a><span class="lineno">  445</span>       <span class="keywordflow">if</span>(!ibag){</div>
-<div class="line"><a name="l00446"></a><span class="lineno">  446</span>         nclass=trainingPixels.size();</div>
-<div class="line"><a name="l00447"></a><span class="lineno">  447</span>     <span class="keywordflow">if</span>(classname_opt.size())</div>
-<div class="line"><a name="l00448"></a><span class="lineno">  448</span>       assert(nclass==classname_opt.size());</div>
-<div class="line"><a name="l00449"></a><span class="lineno">  449</span>         nband=trainingPixels[0][0].size()-2;<span class="comment">//X and Y//trainingPixels[0][0].size();</span></div>
-<div class="line"><a name="l00450"></a><span class="lineno">  450</span>       }</div>
-<div class="line"><a name="l00451"></a><span class="lineno">  451</span>       <span class="keywordflow">else</span>{</div>
-<div class="line"><a name="l00452"></a><span class="lineno">  452</span>         assert(nclass==trainingPixels.size());</div>
-<div class="line"><a name="l00453"></a><span class="lineno">  453</span>         assert(nband==trainingPixels[0][0].size()-2);</div>
-<div class="line"><a name="l00454"></a><span class="lineno">  454</span>       }</div>
-<div class="line"><a name="l00455"></a><span class="lineno">  455</span> </div>
-<div class="line"><a name="l00456"></a><span class="lineno">  456</span>       <span class="comment">//do not remove outliers here: could easily be obtained through ogr2ogr -where 'B2<110' output.shp input.shp</span></div>
-<div class="line"><a name="l00457"></a><span class="lineno">  457</span>       <span class="comment">//balance training data</span></div>
-<div class="line"><a name="l00458"></a><span class="lineno">  458</span>       <span class="keywordflow">if</span>(balance_opt[0]>0){</div>
-<div class="line"><a name="l00459"></a><span class="lineno">  459</span>         <span class="keywordflow">while</span>(balance_opt.size()<nclass)</div>
-<div class="line"><a name="l00460"></a><span class="lineno">  460</span>           balance_opt.push_back(balance_opt.back());</div>
-<div class="line"><a name="l00461"></a><span class="lineno">  461</span>         <span class="keywordflow">if</span>(random_opt[0])</div>
-<div class="line"><a name="l00462"></a><span class="lineno">  462</span>           srand(time(NULL));</div>
-<div class="line"><a name="l00463"></a><span class="lineno">  463</span>         totalSamples=0;</div>
-<div class="line"><a name="l00464"></a><span class="lineno">  464</span>         <span class="keywordflow">for</span>(<span class="keywordtype">short</span> iclass=0;iclass<nclass;++iclass){</div>
-<div class="line"><a name="l00465"></a><span class="lineno">  465</span>           <span class="keywordflow">if</span>(trainingPixels[iclass].size()>balance_opt[iclass]){</div>
-<div class="line"><a name="l00466"></a><span class="lineno">  466</span>             <span class="keywordflow">while</span>(trainingPixels[iclass].size()>balance_opt[iclass]){</div>
-<div class="line"><a name="l00467"></a><span class="lineno">  467</span>               <span class="keywordtype">int</span> index=rand()%trainingPixels[iclass].size();</div>
-<div class="line"><a name="l00468"></a><span class="lineno">  468</span>               trainingPixels[iclass].erase(trainingPixels[iclass].begin()+index);</div>
-<div class="line"><a name="l00469"></a><span class="lineno">  469</span>             }</div>
-<div class="line"><a name="l00470"></a><span class="lineno">  470</span>           }</div>
-<div class="line"><a name="l00471"></a><span class="lineno">  471</span>           <span class="keywordflow">else</span>{</div>
-<div class="line"><a name="l00472"></a><span class="lineno">  472</span>             <span class="keywordtype">int</span> oldsize=trainingPixels[iclass].size();</div>
-<div class="line"><a name="l00473"></a><span class="lineno">  473</span>             <span class="keywordflow">for</span>(<span class="keywordtype">int</span> isample=trainingPixels[iclass].size();isample<balance_opt[iclass];++isample){</div>
-<div class="line"><a name="l00474"></a><span class="lineno">  474</span>               <span class="keywordtype">int</span> index = rand()%oldsize;</div>
-<div class="line"><a name="l00475"></a><span class="lineno">  475</span>               trainingPixels[iclass].push_back(trainingPixels[iclass][index]);</div>
-<div class="line"><a name="l00476"></a><span class="lineno">  476</span>             }</div>
-<div class="line"><a name="l00477"></a><span class="lineno">  477</span>           }</div>
-<div class="line"><a name="l00478"></a><span class="lineno">  478</span>           totalSamples+=trainingPixels[iclass].size();</div>
-<div class="line"><a name="l00479"></a><span class="lineno">  479</span>         }</div>
-<div class="line"><a name="l00480"></a><span class="lineno">  480</span>       }</div>
-<div class="line"><a name="l00481"></a><span class="lineno">  481</span>     </div>
-<div class="line"><a name="l00482"></a><span class="lineno">  482</span>       <span class="comment">//set scale and offset</span></div>
-<div class="line"><a name="l00483"></a><span class="lineno">  483</span>       offset[ibag].resize(nband);</div>
-<div class="line"><a name="l00484"></a><span class="lineno">  484</span>       scale[ibag].resize(nband);</div>
-<div class="line"><a name="l00485"></a><span class="lineno">  485</span>       <span class="keywordflow">if</span>(offset_opt.size()>1)</div>
-<div class="line"><a name="l00486"></a><span class="lineno">  486</span>         assert(offset_opt.size()==nband);</div>
-<div class="line"><a name="l00487"></a><span class="lineno">  487</span>       <span class="keywordflow">if</span>(scale_opt.size()>1)</div>
-<div class="line"><a name="l00488"></a><span class="lineno">  488</span>         assert(scale_opt.size()==nband);</div>
-<div class="line"><a name="l00489"></a><span class="lineno">  489</span>       <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iband=0;iband<nband;++iband){</div>
-<div class="line"><a name="l00490"></a><span class="lineno">  490</span>         <span class="keywordflow">if</span>(verbose_opt[0]>=1)</div>
-<div class="line"><a name="l00491"></a><span class="lineno">  491</span>           std::cout << <span class="stringliteral">"scaling for band"</span> << iband << std::endl;</div>
-<div class="line"><a name="l00492"></a><span class="lineno">  492</span>         offset[ibag][iband]=(offset_opt.size()==1)?offset_opt[0]:offset_opt[iband];</div>
-<div class="line"><a name="l00493"></a><span class="lineno">  493</span>         scale[ibag][iband]=(scale_opt.size()==1)?scale_opt[0]:scale_opt[iband];</div>
-<div class="line"><a name="l00494"></a><span class="lineno">  494</span>         <span class="comment">//search for min and maximum</span></div>
-<div class="line"><a name="l00495"></a><span class="lineno">  495</span>         <span class="keywordflow">if</span>(scale[ibag][iband]<=0){</div>
-<div class="line"><a name="l00496"></a><span class="lineno">  496</span>           <span class="keywordtype">float</span> theMin=trainingPixels[0][0][iband+startBand];</div>
-<div class="line"><a name="l00497"></a><span class="lineno">  497</span>           <span class="keywordtype">float</span> theMax=trainingPixels[0][0][iband+startBand];</div>
-<div class="line"><a name="l00498"></a><span class="lineno">  498</span>           <span class="keywordflow">for</span>(<span class="keywordtype">short</span> iclass=0;iclass<nclass;++iclass){</div>
-<div class="line"><a name="l00499"></a><span class="lineno">  499</span>             <span class="keywordflow">for</span>(<span class="keywordtype">int</span> isample=0;isample<trainingPixels[iclass].size();++isample){</div>
-<div class="line"><a name="l00500"></a><span class="lineno">  500</span>               <span class="keywordflow">if</span>(theMin>trainingPixels[iclass][isample][iband+startBand])</div>
-<div class="line"><a name="l00501"></a><span class="lineno">  501</span>                 theMin=trainingPixels[iclass][isample][iband+startBand];</div>
-<div class="line"><a name="l00502"></a><span class="lineno">  502</span>               <span class="keywordflow">if</span>(theMax<trainingPixels[iclass][isample][iband+startBand])</div>
-<div class="line"><a name="l00503"></a><span class="lineno">  503</span>                 theMax=trainingPixels[iclass][isample][iband+startBand];</div>
-<div class="line"><a name="l00504"></a><span class="lineno">  504</span>             }</div>
-<div class="line"><a name="l00505"></a><span class="lineno">  505</span>           }</div>
-<div class="line"><a name="l00506"></a><span class="lineno">  506</span>           offset[ibag][iband]=theMin+(theMax-theMin)/2.0;</div>
-<div class="line"><a name="l00507"></a><span class="lineno">  507</span>           scale[ibag][iband]=(theMax-theMin)/2.0;</div>
-<div class="line"><a name="l00508"></a><span class="lineno">  508</span>           <span class="keywordflow">if</span>(verbose_opt[0]>=1){</div>
-<div class="line"><a name="l00509"></a><span class="lineno">  509</span>             std::cout << <span class="stringliteral">"Extreme image values for band "</span> << iband << <span class="stringliteral">": ["</span> << theMin << <span class="stringliteral">","</span> << theMax << <span class="stringliteral">"]"</span> << std::endl;</div>
-<div class="line"><a name="l00510"></a><span class="lineno">  510</span>             std::cout << <span class="stringliteral">"Using offset, scale: "</span> << offset[ibag][iband] << <span class="stringliteral">", "</span> << scale[ibag][iband] << std::endl;</div>
-<div class="line"><a name="l00511"></a><span class="lineno">  511</span>             std::cout << <span class="stringliteral">"scaled values for band "</span> << iband << <span class="stringliteral">": ["</span> << (theMin-offset[ibag][iband])/scale[ibag][iband] << <span class="stringliteral">","</span> << (theMax-offset[ibag][iband])/scale[ibag][iband] << <span class="stringliteral">"]"</span> <&lt [...]
-<div class="line"><a name="l00512"></a><span class="lineno">  512</span>           }</div>
-<div class="line"><a name="l00513"></a><span class="lineno">  513</span>         }</div>
-<div class="line"><a name="l00514"></a><span class="lineno">  514</span>       }</div>
-<div class="line"><a name="l00515"></a><span class="lineno">  515</span>     }</div>
-<div class="line"><a name="l00516"></a><span class="lineno">  516</span>     <span class="keywordflow">else</span>{<span class="comment">//use same offset and scale </span></div>
-<div class="line"><a name="l00517"></a><span class="lineno">  517</span>       offset[ibag].resize(nband);</div>
-<div class="line"><a name="l00518"></a><span class="lineno">  518</span>       scale[ibag].resize(nband);</div>
-<div class="line"><a name="l00519"></a><span class="lineno">  519</span>       <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iband=0;iband<nband;++iband){</div>
-<div class="line"><a name="l00520"></a><span class="lineno">  520</span>         offset[ibag][iband]=offset[0][iband];</div>
-<div class="line"><a name="l00521"></a><span class="lineno">  521</span>         scale[ibag][iband]=scale[0][iband];</div>
-<div class="line"><a name="l00522"></a><span class="lineno">  522</span>       }</div>
-<div class="line"><a name="l00523"></a><span class="lineno">  523</span>     }</div>
-<div class="line"><a name="l00524"></a><span class="lineno">  524</span>       </div>
-<div class="line"><a name="l00525"></a><span class="lineno">  525</span>     <span class="keywordflow">if</span>(!ibag){</div>
-<div class="line"><a name="l00526"></a><span class="lineno">  526</span>       <span class="keywordflow">if</span>(priors_opt.size()==1){<span class="comment">//default: equal priors for each class</span></div>
-<div class="line"><a name="l00527"></a><span class="lineno">  527</span>         priors.resize(nclass);</div>
-<div class="line"><a name="l00528"></a><span class="lineno">  528</span>         <span class="keywordflow">for</span>(<span class="keywordtype">short</span> iclass=0;iclass<nclass;++iclass)</div>
-<div class="line"><a name="l00529"></a><span class="lineno">  529</span>           priors[iclass]=1.0/nclass;</div>
-<div class="line"><a name="l00530"></a><span class="lineno">  530</span>       }</div>
-<div class="line"><a name="l00531"></a><span class="lineno">  531</span>       assert(priors_opt.size()==1||priors_opt.size()==nclass);</div>
-<div class="line"><a name="l00532"></a><span class="lineno">  532</span> </div>
-<div class="line"><a name="l00533"></a><span class="lineno">  533</span>       <span class="comment">//set bagsize for each class if not done already via command line</span></div>
-<div class="line"><a name="l00534"></a><span class="lineno">  534</span>       <span class="keywordflow">while</span>(bagSize_opt.size()<nclass)</div>
-<div class="line"><a name="l00535"></a><span class="lineno">  535</span>         bagSize_opt.push_back(bagSize_opt.back());</div>
-<div class="line"><a name="l00536"></a><span class="lineno">  536</span> </div>
-<div class="line"><a name="l00537"></a><span class="lineno">  537</span>       <span class="keywordflow">if</span>(verbose_opt[0]>=1){</div>
-<div class="line"><a name="l00538"></a><span class="lineno">  538</span>         std::cout << <span class="stringliteral">"number of bands: "</span> << nband << std::endl;</div>
-<div class="line"><a name="l00539"></a><span class="lineno">  539</span>         std::cout << <span class="stringliteral">"number of classes: "</span> << nclass << std::endl;</div>
-<div class="line"><a name="l00540"></a><span class="lineno">  540</span>     <span class="keywordflow">if</span>(priorimg_opt.empty()){</div>
-<div class="line"><a name="l00541"></a><span class="lineno">  541</span>       std::cout << <span class="stringliteral">"priors:"</span>;</div>
-<div class="line"><a name="l00542"></a><span class="lineno">  542</span>       <span class="keywordflow">for</span>(<span class="keywordtype">short</span> iclass=0;iclass<nclass;++iclass)</div>
-<div class="line"><a name="l00543"></a><span class="lineno">  543</span>         std::cout << <span class="stringliteral">" "</span> << priors[iclass];</div>
-<div class="line"><a name="l00544"></a><span class="lineno">  544</span>       std::cout << std::endl;</div>
-<div class="line"><a name="l00545"></a><span class="lineno">  545</span>     }</div>
+<div class="line"><a name="l00266"></a><span class="lineno">  266</span>   <span class="keywordflow">if</span>(!doProcess){</div>
+<div class="line"><a name="l00267"></a><span class="lineno">  267</span>     cout << endl;</div>
+<div class="line"><a name="l00268"></a><span class="lineno">  268</span>     cout << <span class="stringliteral">"Usage: pksvm -t training [-i input -o output] [-cv value]"</span> << endl;</div>
+<div class="line"><a name="l00269"></a><span class="lineno">  269</span>     cout << endl;</div>
+<div class="line"><a name="l00270"></a><span class="lineno">  270</span>     std::cout << <span class="stringliteral">"short option -h shows basic options only, use long option --help to show all options"</span> << std::endl;</div>
+<div class="line"><a name="l00271"></a><span class="lineno">  271</span>     exit(0);<span class="comment">//help was invoked, stop processing</span></div>
+<div class="line"><a name="l00272"></a><span class="lineno">  272</span>   }</div>
+<div class="line"><a name="l00273"></a><span class="lineno">  273</span> </div>
+<div class="line"><a name="l00274"></a><span class="lineno">  274</span>   <span class="keywordflow">if</span>(entropy_opt[0]==<span class="stringliteral">""</span>)</div>
+<div class="line"><a name="l00275"></a><span class="lineno">  275</span>     entropy_opt.clear();</div>
+<div class="line"><a name="l00276"></a><span class="lineno">  276</span>   <span class="keywordflow">if</span>(active_opt[0]==<span class="stringliteral">""</span>)</div>
+<div class="line"><a name="l00277"></a><span class="lineno">  277</span>     active_opt.clear();</div>
+<div class="line"><a name="l00278"></a><span class="lineno">  278</span>   <span class="keywordflow">if</span>(priorimg_opt[0]==<span class="stringliteral">""</span>)</div>
+<div class="line"><a name="l00279"></a><span class="lineno">  279</span>     priorimg_opt.clear();</div>
+<div class="line"><a name="l00280"></a><span class="lineno">  280</span> </div>
+<div class="line"><a name="l00281"></a><span class="lineno">  281</span> </div>
+<div class="line"><a name="l00282"></a><span class="lineno">  282</span>   std::map<std::string, svm::SVM_TYPE> svmMap;</div>
+<div class="line"><a name="l00283"></a><span class="lineno">  283</span> </div>
+<div class="line"><a name="l00284"></a><span class="lineno">  284</span>   svmMap[<span class="stringliteral">"C_SVC"</span>]=svm::C_SVC;</div>
+<div class="line"><a name="l00285"></a><span class="lineno">  285</span>   svmMap[<span class="stringliteral">"nu_SVC"</span>]=svm::nu_SVC;</div>
+<div class="line"><a name="l00286"></a><span class="lineno">  286</span>   svmMap[<span class="stringliteral">"one_class"</span>]=svm::one_class;</div>
+<div class="line"><a name="l00287"></a><span class="lineno">  287</span>   svmMap[<span class="stringliteral">"epsilon_SVR"</span>]=svm::epsilon_SVR;</div>
+<div class="line"><a name="l00288"></a><span class="lineno">  288</span>   svmMap[<span class="stringliteral">"nu_SVR"</span>]=svm::nu_SVR;</div>
+<div class="line"><a name="l00289"></a><span class="lineno">  289</span> </div>
+<div class="line"><a name="l00290"></a><span class="lineno">  290</span>   std::map<std::string, svm::KERNEL_TYPE> kernelMap;</div>
+<div class="line"><a name="l00291"></a><span class="lineno">  291</span> </div>
+<div class="line"><a name="l00292"></a><span class="lineno">  292</span>   kernelMap[<span class="stringliteral">"linear"</span>]=svm::linear;</div>
+<div class="line"><a name="l00293"></a><span class="lineno">  293</span>   kernelMap[<span class="stringliteral">"polynomial"</span>]=svm::polynomial;</div>
+<div class="line"><a name="l00294"></a><span class="lineno">  294</span>   kernelMap[<span class="stringliteral">"radial"</span>]=svm::radial;</div>
+<div class="line"><a name="l00295"></a><span class="lineno">  295</span>   kernelMap[<span class="stringliteral">"sigmoid;"</span>]=svm::sigmoid;</div>
+<div class="line"><a name="l00296"></a><span class="lineno">  296</span> </div>
+<div class="line"><a name="l00297"></a><span class="lineno">  297</span>   assert(training_opt.size());</div>
+<div class="line"><a name="l00298"></a><span class="lineno">  298</span> </div>
+<div class="line"><a name="l00299"></a><span class="lineno">  299</span>   <span class="keywordflow">if</span>(verbose_opt[0]>=1){</div>
+<div class="line"><a name="l00300"></a><span class="lineno">  300</span>     <span class="keywordflow">if</span>(input_opt.size())</div>
+<div class="line"><a name="l00301"></a><span class="lineno">  301</span>       std::cout << <span class="stringliteral">"input filename: "</span> << input_opt[0] << std::endl;</div>
+<div class="line"><a name="l00302"></a><span class="lineno">  302</span>     <span class="keywordflow">if</span>(mask_opt.size())</div>
+<div class="line"><a name="l00303"></a><span class="lineno">  303</span>       std::cout << <span class="stringliteral">"mask filename: "</span> << mask_opt[0] << std::endl;</div>
+<div class="line"><a name="l00304"></a><span class="lineno">  304</span>     std::cout << <span class="stringliteral">"training vector file: "</span> << std::endl;</div>
+<div class="line"><a name="l00305"></a><span class="lineno">  305</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> ifile=0;ifile<training_opt.size();++ifile)</div>
+<div class="line"><a name="l00306"></a><span class="lineno">  306</span>       std::cout << training_opt[ifile] << std::endl;</div>
+<div class="line"><a name="l00307"></a><span class="lineno">  307</span>     std::cout << <span class="stringliteral">"verbose: "</span> << verbose_opt[0] << std::endl;</div>
+<div class="line"><a name="l00308"></a><span class="lineno">  308</span>   }</div>
+<div class="line"><a name="l00309"></a><span class="lineno">  309</span>   <span class="keywordtype">unsigned</span> <span class="keywordtype">short</span> nbag=(training_opt.size()>1)?training_opt.size():bag_opt[0];</div>
+<div class="line"><a name="l00310"></a><span class="lineno">  310</span>   <span class="keywordflow">if</span>(verbose_opt[0]>=1)</div>
+<div class="line"><a name="l00311"></a><span class="lineno">  311</span>     std::cout << <span class="stringliteral">"number of bootstrap aggregations: "</span> << nbag << std::endl;</div>
+<div class="line"><a name="l00312"></a><span class="lineno">  312</span> </div>
+<div class="line"><a name="l00313"></a><span class="lineno">  313</span>   <a class="code" href="classImgReaderOgr.html">ImgReaderOgr</a> extentReader;</div>
+<div class="line"><a name="l00314"></a><span class="lineno">  314</span>   OGRLayer  *readLayer;</div>
+<div class="line"><a name="l00315"></a><span class="lineno">  315</span> </div>
+<div class="line"><a name="l00316"></a><span class="lineno">  316</span>   <span class="keywordtype">double</span> ulx=0;</div>
+<div class="line"><a name="l00317"></a><span class="lineno">  317</span>   <span class="keywordtype">double</span> uly=0;</div>
+<div class="line"><a name="l00318"></a><span class="lineno">  318</span>   <span class="keywordtype">double</span> lrx=0;</div>
+<div class="line"><a name="l00319"></a><span class="lineno">  319</span>   <span class="keywordtype">double</span> lry=0;</div>
+<div class="line"><a name="l00320"></a><span class="lineno">  320</span> </div>
+<div class="line"><a name="l00321"></a><span class="lineno">  321</span>   <span class="keywordtype">bool</span> maskIsVector=<span class="keyword">false</span>;</div>
+<div class="line"><a name="l00322"></a><span class="lineno">  322</span>   <span class="keywordflow">if</span>(mask_opt.size()){</div>
+<div class="line"><a name="l00323"></a><span class="lineno">  323</span>     <span class="keywordflow">try</span>{</div>
+<div class="line"><a name="l00324"></a><span class="lineno">  324</span>       extentReader.open(mask_opt[0]);</div>
+<div class="line"><a name="l00325"></a><span class="lineno">  325</span>       maskIsVector=<span class="keyword">true</span>;</div>
+<div class="line"><a name="l00326"></a><span class="lineno">  326</span>       readLayer = extentReader.getDataSource()->GetLayer(0);</div>
+<div class="line"><a name="l00327"></a><span class="lineno">  327</span>       <span class="keywordflow">if</span>(!(extentReader.getExtent(ulx,uly,lrx,lry))){</div>
+<div class="line"><a name="l00328"></a><span class="lineno">  328</span>     cerr << <span class="stringliteral">"Error: could not get extent from "</span> << mask_opt[0] << endl;</div>
+<div class="line"><a name="l00329"></a><span class="lineno">  329</span>     exit(1);</div>
+<div class="line"><a name="l00330"></a><span class="lineno">  330</span>       }</div>
+<div class="line"><a name="l00331"></a><span class="lineno">  331</span>     }</div>
+<div class="line"><a name="l00332"></a><span class="lineno">  332</span>     <span class="keywordflow">catch</span>(<span class="keywordtype">string</span> errorString){</div>
+<div class="line"><a name="l00333"></a><span class="lineno">  333</span>       maskIsVector=<span class="keyword">false</span>;</div>
+<div class="line"><a name="l00334"></a><span class="lineno">  334</span>     }</div>
+<div class="line"><a name="l00335"></a><span class="lineno">  335</span>   }</div>
+<div class="line"><a name="l00336"></a><span class="lineno">  336</span> </div>
+<div class="line"><a name="l00337"></a><span class="lineno">  337</span>   <a class="code" href="classImgWriterOgr.html">ImgWriterOgr</a> activeWriter;</div>
+<div class="line"><a name="l00338"></a><span class="lineno">  338</span>   <span class="keywordflow">if</span>(active_opt.size()){</div>
+<div class="line"><a name="l00339"></a><span class="lineno">  339</span>     prob_est_opt[0]=<span class="keyword">true</span>;</div>
+<div class="line"><a name="l00340"></a><span class="lineno">  340</span>     <a class="code" href="classImgReaderOgr.html">ImgReaderOgr</a> trainingReader(training_opt[0]);</div>
+<div class="line"><a name="l00341"></a><span class="lineno">  341</span>     activeWriter.open(active_opt[0],ogrformat_opt[0]);</div>
+<div class="line"><a name="l00342"></a><span class="lineno">  342</span>     activeWriter.createLayer(active_opt[0],trainingReader.getProjection(),wkbPoint,NULL);</div>
+<div class="line"><a name="l00343"></a><span class="lineno">  343</span>     activeWriter.copyFields(trainingReader);</div>
+<div class="line"><a name="l00344"></a><span class="lineno">  344</span>   }</div>
+<div class="line"><a name="l00345"></a><span class="lineno">  345</span>   vector<PosValue> activePoints(nactive_opt[0]);</div>
+<div class="line"><a name="l00346"></a><span class="lineno">  346</span>   <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iactive=0;iactive<activePoints.size();++iactive){</div>
+<div class="line"><a name="l00347"></a><span class="lineno">  347</span>     activePoints[iactive].value=1.0;</div>
+<div class="line"><a name="l00348"></a><span class="lineno">  348</span>     activePoints[iactive].posx=0.0;</div>
+<div class="line"><a name="l00349"></a><span class="lineno">  349</span>     activePoints[iactive].posy=0.0;</div>
+<div class="line"><a name="l00350"></a><span class="lineno">  350</span>   }</div>
+<div class="line"><a name="l00351"></a><span class="lineno">  351</span>   </div>
+<div class="line"><a name="l00352"></a><span class="lineno">  352</span>   <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> totalSamples=0;</div>
+<div class="line"><a name="l00353"></a><span class="lineno">  353</span>   <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> nactive=0;</div>
+<div class="line"><a name="l00354"></a><span class="lineno">  354</span>   vector<struct svm_model*> svm(nbag);</div>
+<div class="line"><a name="l00355"></a><span class="lineno">  355</span>   vector<struct svm_parameter> param(nbag);</div>
+<div class="line"><a name="l00356"></a><span class="lineno">  356</span> </div>
+<div class="line"><a name="l00357"></a><span class="lineno">  357</span>   <span class="keywordtype">short</span> nclass=0;</div>
+<div class="line"><a name="l00358"></a><span class="lineno">  358</span>   <span class="keywordtype">int</span> nband=0;</div>
+<div class="line"><a name="l00359"></a><span class="lineno">  359</span>   <span class="keywordtype">int</span> startBand=2;<span class="comment">//first two bands represent X and Y pos</span></div>
+<div class="line"><a name="l00360"></a><span class="lineno">  360</span> </div>
+<div class="line"><a name="l00361"></a><span class="lineno">  361</span>   <span class="comment">//normalize priors from command line</span></div>
+<div class="line"><a name="l00362"></a><span class="lineno">  362</span>   <span class="keywordflow">if</span>(priors_opt.size()>1){<span class="comment">//priors from argument list</span></div>
+<div class="line"><a name="l00363"></a><span class="lineno">  363</span>     priors.resize(priors_opt.size());</div>
+<div class="line"><a name="l00364"></a><span class="lineno">  364</span>     <span class="keywordtype">double</span> normPrior=0;</div>
+<div class="line"><a name="l00365"></a><span class="lineno">  365</span>     <span class="keywordflow">for</span>(<span class="keywordtype">short</span> iclass=0;iclass<priors_opt.size();++iclass){</div>
+<div class="line"><a name="l00366"></a><span class="lineno">  366</span>       priors[iclass]=priors_opt[iclass];</div>
+<div class="line"><a name="l00367"></a><span class="lineno">  367</span>       normPrior+=priors[iclass];</div>
+<div class="line"><a name="l00368"></a><span class="lineno">  368</span>     }</div>
+<div class="line"><a name="l00369"></a><span class="lineno">  369</span>     <span class="comment">//normalize</span></div>
+<div class="line"><a name="l00370"></a><span class="lineno">  370</span>     <span class="keywordflow">for</span>(<span class="keywordtype">short</span> iclass=0;iclass<priors_opt.size();++iclass)</div>
+<div class="line"><a name="l00371"></a><span class="lineno">  371</span>       priors[iclass]/=normPrior;</div>
+<div class="line"><a name="l00372"></a><span class="lineno">  372</span>   }</div>
+<div class="line"><a name="l00373"></a><span class="lineno">  373</span> </div>
+<div class="line"><a name="l00374"></a><span class="lineno">  374</span>   <span class="comment">//convert start and end band options to vector of band indexes</span></div>
+<div class="line"><a name="l00375"></a><span class="lineno">  375</span>   <span class="keywordflow">try</span>{</div>
+<div class="line"><a name="l00376"></a><span class="lineno">  376</span>     <span class="keywordflow">if</span>(bstart_opt.size()){</div>
+<div class="line"><a name="l00377"></a><span class="lineno">  377</span>       <span class="keywordflow">if</span>(bend_opt.size()!=bstart_opt.size()){</div>
+<div class="line"><a name="l00378"></a><span class="lineno">  378</span>     <span class="keywordtype">string</span> errorstring=<span class="stringliteral">"Error: options for start and end band indexes must be provided as pairs, missing end band"</span>;</div>
+<div class="line"><a name="l00379"></a><span class="lineno">  379</span>     <span class="keywordflow">throw</span>(errorstring);</div>
+<div class="line"><a name="l00380"></a><span class="lineno">  380</span>       }</div>
+<div class="line"><a name="l00381"></a><span class="lineno">  381</span>       band_opt.clear();</div>
+<div class="line"><a name="l00382"></a><span class="lineno">  382</span>       <span class="keywordflow">for</span>(<span class="keywordtype">int</span> ipair=0;ipair<bstart_opt.size();++ipair){</div>
+<div class="line"><a name="l00383"></a><span class="lineno">  383</span>     <span class="keywordflow">if</span>(bend_opt[ipair]<=bstart_opt[ipair]){</div>
+<div class="line"><a name="l00384"></a><span class="lineno">  384</span>       <span class="keywordtype">string</span> errorstring=<span class="stringliteral">"Error: index for end band must be smaller then start band"</span>;</div>
+<div class="line"><a name="l00385"></a><span class="lineno">  385</span>       <span class="keywordflow">throw</span>(errorstring);</div>
+<div class="line"><a name="l00386"></a><span class="lineno">  386</span>     }</div>
+<div class="line"><a name="l00387"></a><span class="lineno">  387</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iband=bstart_opt[ipair];iband<=bend_opt[ipair];++iband)</div>
+<div class="line"><a name="l00388"></a><span class="lineno">  388</span>       band_opt.push_back(iband);</div>
+<div class="line"><a name="l00389"></a><span class="lineno">  389</span>       }</div>
+<div class="line"><a name="l00390"></a><span class="lineno">  390</span>     }</div>
+<div class="line"><a name="l00391"></a><span class="lineno">  391</span>   }</div>
+<div class="line"><a name="l00392"></a><span class="lineno">  392</span>   <span class="keywordflow">catch</span>(<span class="keywordtype">string</span> error){</div>
+<div class="line"><a name="l00393"></a><span class="lineno">  393</span>     cerr << error << std::endl;</div>
+<div class="line"><a name="l00394"></a><span class="lineno">  394</span>     exit(1);</div>
+<div class="line"><a name="l00395"></a><span class="lineno">  395</span>   }</div>
+<div class="line"><a name="l00396"></a><span class="lineno">  396</span>   <span class="comment">//sort bands</span></div>
+<div class="line"><a name="l00397"></a><span class="lineno">  397</span>   <span class="keywordflow">if</span>(band_opt.size())</div>
+<div class="line"><a name="l00398"></a><span class="lineno">  398</span>     std::sort(band_opt.begin(),band_opt.end());</div>
+<div class="line"><a name="l00399"></a><span class="lineno">  399</span> </div>
+<div class="line"><a name="l00400"></a><span class="lineno">  400</span>   map<string,short> classValueMap;</div>
+<div class="line"><a name="l00401"></a><span class="lineno">  401</span>   vector<std::string> nameVector;</div>
+<div class="line"><a name="l00402"></a><span class="lineno">  402</span>   <span class="keywordflow">if</span>(classname_opt.size()){</div>
+<div class="line"><a name="l00403"></a><span class="lineno">  403</span>     assert(classname_opt.size()==classvalue_opt.size());</div>
+<div class="line"><a name="l00404"></a><span class="lineno">  404</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iclass=0;iclass<classname_opt.size();++iclass)</div>
+<div class="line"><a name="l00405"></a><span class="lineno">  405</span>       classValueMap[classname_opt[iclass]]=classvalue_opt[iclass];</div>
+<div class="line"><a name="l00406"></a><span class="lineno">  406</span>   }</div>
+<div class="line"><a name="l00407"></a><span class="lineno">  407</span> </div>
+<div class="line"><a name="l00408"></a><span class="lineno">  408</span>   <span class="comment">//----------------------------------- Training -------------------------------</span></div>
+<div class="line"><a name="l00409"></a><span class="lineno">  409</span>   <a class="code" href="classconfusionmatrix_1_1ConfusionMatrix.html">confusionmatrix::ConfusionMatrix</a> cm;</div>
+<div class="line"><a name="l00410"></a><span class="lineno">  410</span>   vector< vector<double> > offset(nbag);</div>
+<div class="line"><a name="l00411"></a><span class="lineno">  411</span>   vector< vector<double> > scale(nbag);</div>
+<div class="line"><a name="l00412"></a><span class="lineno">  412</span>   map<string,Vector2d<float> > trainingMap;</div>
+<div class="line"><a name="l00413"></a><span class="lineno">  413</span>   vector< Vector2d<float> > trainingPixels;<span class="comment">//[class][sample][band]</span></div>
+<div class="line"><a name="l00414"></a><span class="lineno">  414</span>   vector<string> fields;</div>
+<div class="line"><a name="l00415"></a><span class="lineno">  415</span> </div>
+<div class="line"><a name="l00416"></a><span class="lineno">  416</span>   vector<struct svm_problem> prob(nbag);</div>
+<div class="line"><a name="l00417"></a><span class="lineno">  417</span>   vector<struct svm_node *> x_space(nbag);</div>
+<div class="line"><a name="l00418"></a><span class="lineno">  418</span> </div>
+<div class="line"><a name="l00419"></a><span class="lineno">  419</span>   <span class="keywordflow">for</span>(<span class="keywordtype">int</span> ibag=0;ibag<nbag;++ibag){</div>
+<div class="line"><a name="l00420"></a><span class="lineno">  420</span>     <span class="comment">//organize training data</span></div>
+<div class="line"><a name="l00421"></a><span class="lineno">  421</span>     <span class="keywordflow">if</span>(ibag<training_opt.size()){<span class="comment">//if bag contains new training pixels</span></div>
+<div class="line"><a name="l00422"></a><span class="lineno">  422</span>       trainingMap.clear();</div>
+<div class="line"><a name="l00423"></a><span class="lineno">  423</span>       trainingPixels.clear();</div>
+<div class="line"><a name="l00424"></a><span class="lineno">  424</span>       <span class="keywordflow">if</span>(verbose_opt[0]>=1)</div>
+<div class="line"><a name="l00425"></a><span class="lineno">  425</span>         std::cout << <span class="stringliteral">"reading imageVector file "</span> << training_opt[0] << std::endl;</div>
+<div class="line"><a name="l00426"></a><span class="lineno">  426</span>       <span class="keywordflow">try</span>{</div>
+<div class="line"><a name="l00427"></a><span class="lineno">  427</span>     <a class="code" href="classImgReaderOgr.html">ImgReaderOgr</a> trainingReaderBag(training_opt[ibag]);</div>
+<div class="line"><a name="l00428"></a><span class="lineno">  428</span>         <span class="keywordflow">if</span>(band_opt.size())</div>
+<div class="line"><a name="l00429"></a><span class="lineno">  429</span>           totalSamples=trainingReaderBag.readDataImageOgr(trainingMap,fields,band_opt,label_opt[0],tlayer_opt,verbose_opt[0]);</div>
+<div class="line"><a name="l00430"></a><span class="lineno">  430</span>         <span class="keywordflow">else</span></div>
+<div class="line"><a name="l00431"></a><span class="lineno">  431</span>           totalSamples=trainingReaderBag.readDataImageOgr(trainingMap,fields,0,0,label_opt[0],tlayer_opt,verbose_opt[0]);</div>
+<div class="line"><a name="l00432"></a><span class="lineno">  432</span>         <span class="keywordflow">if</span>(trainingMap.size()<2){</div>
+<div class="line"><a name="l00433"></a><span class="lineno">  433</span>           <span class="keywordtype">string</span> errorstring=<span class="stringliteral">"Error: could not read at least two classes from training file, did you provide class labels in training sample (see option label)?"</span>;</div>
+<div class="line"><a name="l00434"></a><span class="lineno">  434</span>           <span class="keywordflow">throw</span>(errorstring);</div>
+<div class="line"><a name="l00435"></a><span class="lineno">  435</span>         }</div>
+<div class="line"><a name="l00436"></a><span class="lineno">  436</span>     trainingReaderBag.close();</div>
+<div class="line"><a name="l00437"></a><span class="lineno">  437</span>       }</div>
+<div class="line"><a name="l00438"></a><span class="lineno">  438</span>       <span class="keywordflow">catch</span>(<span class="keywordtype">string</span> error){</div>
+<div class="line"><a name="l00439"></a><span class="lineno">  439</span>         cerr << error << std::endl;</div>
+<div class="line"><a name="l00440"></a><span class="lineno">  440</span>         exit(1);</div>
+<div class="line"><a name="l00441"></a><span class="lineno">  441</span>       }</div>
+<div class="line"><a name="l00442"></a><span class="lineno">  442</span>       <span class="keywordflow">catch</span>(std::exception& e){</div>
+<div class="line"><a name="l00443"></a><span class="lineno">  443</span>         std::cerr << <span class="stringliteral">"Error: "</span>;</div>
+<div class="line"><a name="l00444"></a><span class="lineno">  444</span>         std::cerr << e.what() << std::endl;</div>
+<div class="line"><a name="l00445"></a><span class="lineno">  445</span>         std::cerr << CPLGetLastErrorMsg() << std::endl; </div>
+<div class="line"><a name="l00446"></a><span class="lineno">  446</span>         exit(1);</div>
+<div class="line"><a name="l00447"></a><span class="lineno">  447</span>       }</div>
+<div class="line"><a name="l00448"></a><span class="lineno">  448</span>       <span class="keywordflow">catch</span>(...){</div>
+<div class="line"><a name="l00449"></a><span class="lineno">  449</span>         cerr << <span class="stringliteral">"error catched"</span> << std::endl;</div>
+<div class="line"><a name="l00450"></a><span class="lineno">  450</span>         exit(1);</div>
+<div class="line"><a name="l00451"></a><span class="lineno">  451</span>       }</div>
+<div class="line"><a name="l00452"></a><span class="lineno">  452</span> </div>
+<div class="line"><a name="l00453"></a><span class="lineno">  453</span>       <span class="comment">//convert map to vector</span></div>
+<div class="line"><a name="l00454"></a><span class="lineno">  454</span>       <span class="comment">// short iclass=0;</span></div>
+<div class="line"><a name="l00455"></a><span class="lineno">  455</span>       <span class="keywordflow">if</span>(verbose_opt[0]>1)</div>
+<div class="line"><a name="l00456"></a><span class="lineno">  456</span>         std::cout << <span class="stringliteral">"training pixels: "</span> << std::endl;</div>
+<div class="line"><a name="l00457"></a><span class="lineno">  457</span>       map<string,Vector2d<float> >::iterator mapit=trainingMap.begin();</div>
+<div class="line"><a name="l00458"></a><span class="lineno">  458</span>       <span class="keywordflow">while</span>(mapit!=trainingMap.end()){</div>
+<div class="line"><a name="l00459"></a><span class="lineno">  459</span>         <span class="comment">//delete small classes</span></div>
+<div class="line"><a name="l00460"></a><span class="lineno">  460</span>         <span class="keywordflow">if</span>((mapit->second).size()<minSize_opt[0]){</div>
+<div class="line"><a name="l00461"></a><span class="lineno">  461</span>           trainingMap.erase(mapit);</div>
+<div class="line"><a name="l00462"></a><span class="lineno">  462</span>           <span class="keywordflow">continue</span>;</div>
+<div class="line"><a name="l00463"></a><span class="lineno">  463</span>         }</div>
+<div class="line"><a name="l00464"></a><span class="lineno">  464</span>         trainingPixels.push_back(mapit->second);</div>
+<div class="line"><a name="l00465"></a><span class="lineno">  465</span>         <span class="keywordflow">if</span>(verbose_opt[0]>1)</div>
+<div class="line"><a name="l00466"></a><span class="lineno">  466</span>           std::cout << mapit->first << <span class="stringliteral">": "</span> << (mapit->second).size() << <span class="stringliteral">" samples"</span> << std::endl;</div>
+<div class="line"><a name="l00467"></a><span class="lineno">  467</span>         ++mapit;</div>
+<div class="line"><a name="l00468"></a><span class="lineno">  468</span>       }</div>
+<div class="line"><a name="l00469"></a><span class="lineno">  469</span>       <span class="keywordflow">if</span>(!ibag){</div>
+<div class="line"><a name="l00470"></a><span class="lineno">  470</span>         nclass=trainingPixels.size();</div>
+<div class="line"><a name="l00471"></a><span class="lineno">  471</span>     <span class="keywordflow">if</span>(classname_opt.size())</div>
+<div class="line"><a name="l00472"></a><span class="lineno">  472</span>       assert(nclass==classname_opt.size());</div>
+<div class="line"><a name="l00473"></a><span class="lineno">  473</span>         nband=trainingPixels[0][0].size()-2;<span class="comment">//X and Y//trainingPixels[0][0].size();</span></div>
+<div class="line"><a name="l00474"></a><span class="lineno">  474</span>       }</div>
+<div class="line"><a name="l00475"></a><span class="lineno">  475</span>       <span class="keywordflow">else</span>{</div>
+<div class="line"><a name="l00476"></a><span class="lineno">  476</span>         assert(nclass==trainingPixels.size());</div>
+<div class="line"><a name="l00477"></a><span class="lineno">  477</span>         assert(nband==trainingPixels[0][0].size()-2);</div>
+<div class="line"><a name="l00478"></a><span class="lineno">  478</span>       }</div>
+<div class="line"><a name="l00479"></a><span class="lineno">  479</span> </div>
+<div class="line"><a name="l00480"></a><span class="lineno">  480</span>       <span class="comment">//do not remove outliers here: could easily be obtained through ogr2ogr -where 'B2<110' output.shp input.shp</span></div>
+<div class="line"><a name="l00481"></a><span class="lineno">  481</span>       <span class="comment">//balance training data</span></div>
+<div class="line"><a name="l00482"></a><span class="lineno">  482</span>       <span class="keywordflow">if</span>(balance_opt[0]>0){</div>
+<div class="line"><a name="l00483"></a><span class="lineno">  483</span>         <span class="keywordflow">while</span>(balance_opt.size()<nclass)</div>
+<div class="line"><a name="l00484"></a><span class="lineno">  484</span>           balance_opt.push_back(balance_opt.back());</div>
+<div class="line"><a name="l00485"></a><span class="lineno">  485</span>         <span class="keywordflow">if</span>(random_opt[0])</div>
+<div class="line"><a name="l00486"></a><span class="lineno">  486</span>           srand(time(NULL));</div>
+<div class="line"><a name="l00487"></a><span class="lineno">  487</span>         totalSamples=0;</div>
+<div class="line"><a name="l00488"></a><span class="lineno">  488</span>         <span class="keywordflow">for</span>(<span class="keywordtype">short</span> iclass=0;iclass<nclass;++iclass){</div>
+<div class="line"><a name="l00489"></a><span class="lineno">  489</span>           <span class="keywordflow">if</span>(trainingPixels[iclass].size()>balance_opt[iclass]){</div>
+<div class="line"><a name="l00490"></a><span class="lineno">  490</span>             <span class="keywordflow">while</span>(trainingPixels[iclass].size()>balance_opt[iclass]){</div>
+<div class="line"><a name="l00491"></a><span class="lineno">  491</span>               <span class="keywordtype">int</span> index=rand()%trainingPixels[iclass].size();</div>
+<div class="line"><a name="l00492"></a><span class="lineno">  492</span>               trainingPixels[iclass].erase(trainingPixels[iclass].begin()+index);</div>
+<div class="line"><a name="l00493"></a><span class="lineno">  493</span>             }</div>
+<div class="line"><a name="l00494"></a><span class="lineno">  494</span>           }</div>
+<div class="line"><a name="l00495"></a><span class="lineno">  495</span>           <span class="keywordflow">else</span>{</div>
+<div class="line"><a name="l00496"></a><span class="lineno">  496</span>             <span class="keywordtype">int</span> oldsize=trainingPixels[iclass].size();</div>
+<div class="line"><a name="l00497"></a><span class="lineno">  497</span>             <span class="keywordflow">for</span>(<span class="keywordtype">int</span> isample=trainingPixels[iclass].size();isample<balance_opt[iclass];++isample){</div>
+<div class="line"><a name="l00498"></a><span class="lineno">  498</span>               <span class="keywordtype">int</span> index = rand()%oldsize;</div>
+<div class="line"><a name="l00499"></a><span class="lineno">  499</span>               trainingPixels[iclass].push_back(trainingPixels[iclass][index]);</div>
+<div class="line"><a name="l00500"></a><span class="lineno">  500</span>             }</div>
+<div class="line"><a name="l00501"></a><span class="lineno">  501</span>           }</div>
+<div class="line"><a name="l00502"></a><span class="lineno">  502</span>           totalSamples+=trainingPixels[iclass].size();</div>
+<div class="line"><a name="l00503"></a><span class="lineno">  503</span>         }</div>
+<div class="line"><a name="l00504"></a><span class="lineno">  504</span>       }</div>
+<div class="line"><a name="l00505"></a><span class="lineno">  505</span>     </div>
+<div class="line"><a name="l00506"></a><span class="lineno">  506</span>       <span class="comment">//set scale and offset</span></div>
+<div class="line"><a name="l00507"></a><span class="lineno">  507</span>       offset[ibag].resize(nband);</div>
+<div class="line"><a name="l00508"></a><span class="lineno">  508</span>       scale[ibag].resize(nband);</div>
+<div class="line"><a name="l00509"></a><span class="lineno">  509</span>       <span class="keywordflow">if</span>(offset_opt.size()>1)</div>
+<div class="line"><a name="l00510"></a><span class="lineno">  510</span>         assert(offset_opt.size()==nband);</div>
+<div class="line"><a name="l00511"></a><span class="lineno">  511</span>       <span class="keywordflow">if</span>(scale_opt.size()>1)</div>
+<div class="line"><a name="l00512"></a><span class="lineno">  512</span>         assert(scale_opt.size()==nband);</div>
+<div class="line"><a name="l00513"></a><span class="lineno">  513</span>       <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iband=0;iband<nband;++iband){</div>
+<div class="line"><a name="l00514"></a><span class="lineno">  514</span>         <span class="keywordflow">if</span>(verbose_opt[0]>=1)</div>
+<div class="line"><a name="l00515"></a><span class="lineno">  515</span>           std::cout << <span class="stringliteral">"scaling for band"</span> << iband << std::endl;</div>
+<div class="line"><a name="l00516"></a><span class="lineno">  516</span>         offset[ibag][iband]=(offset_opt.size()==1)?offset_opt[0]:offset_opt[iband];</div>
+<div class="line"><a name="l00517"></a><span class="lineno">  517</span>         scale[ibag][iband]=(scale_opt.size()==1)?scale_opt[0]:scale_opt[iband];</div>
+<div class="line"><a name="l00518"></a><span class="lineno">  518</span>         <span class="comment">//search for min and maximum</span></div>
+<div class="line"><a name="l00519"></a><span class="lineno">  519</span>         <span class="keywordflow">if</span>(scale[ibag][iband]<=0){</div>
+<div class="line"><a name="l00520"></a><span class="lineno">  520</span>           <span class="keywordtype">float</span> theMin=trainingPixels[0][0][iband+startBand];</div>
+<div class="line"><a name="l00521"></a><span class="lineno">  521</span>           <span class="keywordtype">float</span> theMax=trainingPixels[0][0][iband+startBand];</div>
+<div class="line"><a name="l00522"></a><span class="lineno">  522</span>           <span class="keywordflow">for</span>(<span class="keywordtype">short</span> iclass=0;iclass<nclass;++iclass){</div>
+<div class="line"><a name="l00523"></a><span class="lineno">  523</span>             <span class="keywordflow">for</span>(<span class="keywordtype">int</span> isample=0;isample<trainingPixels[iclass].size();++isample){</div>
+<div class="line"><a name="l00524"></a><span class="lineno">  524</span>               <span class="keywordflow">if</span>(theMin>trainingPixels[iclass][isample][iband+startBand])</div>
+<div class="line"><a name="l00525"></a><span class="lineno">  525</span>                 theMin=trainingPixels[iclass][isample][iband+startBand];</div>
+<div class="line"><a name="l00526"></a><span class="lineno">  526</span>               <span class="keywordflow">if</span>(theMax<trainingPixels[iclass][isample][iband+startBand])</div>
+<div class="line"><a name="l00527"></a><span class="lineno">  527</span>                 theMax=trainingPixels[iclass][isample][iband+startBand];</div>
+<div class="line"><a name="l00528"></a><span class="lineno">  528</span>             }</div>
+<div class="line"><a name="l00529"></a><span class="lineno">  529</span>           }</div>
+<div class="line"><a name="l00530"></a><span class="lineno">  530</span>           offset[ibag][iband]=theMin+(theMax-theMin)/2.0;</div>
+<div class="line"><a name="l00531"></a><span class="lineno">  531</span>           scale[ibag][iband]=(theMax-theMin)/2.0;</div>
+<div class="line"><a name="l00532"></a><span class="lineno">  532</span>           <span class="keywordflow">if</span>(verbose_opt[0]>=1){</div>
+<div class="line"><a name="l00533"></a><span class="lineno">  533</span>             std::cout << <span class="stringliteral">"Extreme image values for band "</span> << iband << <span class="stringliteral">": ["</span> << theMin << <span class="stringliteral">","</span> << theMax << <span class="stringliteral">"]"</span> << std::endl;</div>
+<div class="line"><a name="l00534"></a><span class="lineno">  534</span>             std::cout << <span class="stringliteral">"Using offset, scale: "</span> << offset[ibag][iband] << <span class="stringliteral">", "</span> << scale[ibag][iband] << std::endl;</div>
+<div class="line"><a name="l00535"></a><span class="lineno">  535</span>             std::cout << <span class="stringliteral">"scaled values for band "</span> << iband << <span class="stringliteral">": ["</span> << (theMin-offset[ibag][iband])/scale[ibag][iband] << <span class="stringliteral">","</span> << (theMax-offset[ibag][iband])/scale[ibag][iband] << <span class="stringliteral">"]"</span> <&lt [...]
+<div class="line"><a name="l00536"></a><span class="lineno">  536</span>           }</div>
+<div class="line"><a name="l00537"></a><span class="lineno">  537</span>         }</div>
+<div class="line"><a name="l00538"></a><span class="lineno">  538</span>       }</div>
+<div class="line"><a name="l00539"></a><span class="lineno">  539</span>     }</div>
+<div class="line"><a name="l00540"></a><span class="lineno">  540</span>     <span class="keywordflow">else</span>{<span class="comment">//use same offset and scale </span></div>
+<div class="line"><a name="l00541"></a><span class="lineno">  541</span>       offset[ibag].resize(nband);</div>
+<div class="line"><a name="l00542"></a><span class="lineno">  542</span>       scale[ibag].resize(nband);</div>
+<div class="line"><a name="l00543"></a><span class="lineno">  543</span>       <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iband=0;iband<nband;++iband){</div>
+<div class="line"><a name="l00544"></a><span class="lineno">  544</span>         offset[ibag][iband]=offset[0][iband];</div>
+<div class="line"><a name="l00545"></a><span class="lineno">  545</span>         scale[ibag][iband]=scale[0][iband];</div>
 <div class="line"><a name="l00546"></a><span class="lineno">  546</span>       }</div>
-<div class="line"><a name="l00547"></a><span class="lineno">  547</span>       map<string,Vector2d<float> >::iterator mapit=trainingMap.begin();</div>
-<div class="line"><a name="l00548"></a><span class="lineno">  548</span>       <span class="keywordtype">bool</span> doSort=<span class="keyword">true</span>;</div>
-<div class="line"><a name="l00549"></a><span class="lineno">  549</span>       <span class="keywordflow">try</span>{</div>
-<div class="line"><a name="l00550"></a><span class="lineno">  550</span>     <span class="keywordflow">while</span>(mapit!=trainingMap.end()){</div>
-<div class="line"><a name="l00551"></a><span class="lineno">  551</span>       nameVector.push_back(mapit->first);</div>
-<div class="line"><a name="l00552"></a><span class="lineno">  552</span>       <span class="keywordflow">if</span>(classValueMap.size()){</div>
-<div class="line"><a name="l00553"></a><span class="lineno">  553</span>         <span class="comment">//check if name in training is covered by classname_opt (values can not be 0)</span></div>
-<div class="line"><a name="l00554"></a><span class="lineno">  554</span>         <span class="keywordflow">if</span>(classValueMap[mapit->first]>0){</div>
-<div class="line"><a name="l00555"></a><span class="lineno">  555</span>           <span class="keywordflow">if</span>(cm.getClassIndex(type2string<short>(classValueMap[mapit->first]))<0){</div>
-<div class="line"><a name="l00556"></a><span class="lineno">  556</span>         cm.pushBackClassName(type2string<short>(classValueMap[mapit->first]),doSort);</div>
-<div class="line"><a name="l00557"></a><span class="lineno">  557</span>           }</div>
-<div class="line"><a name="l00558"></a><span class="lineno">  558</span>         }</div>
-<div class="line"><a name="l00559"></a><span class="lineno">  559</span>         <span class="keywordflow">else</span>{</div>
-<div class="line"><a name="l00560"></a><span class="lineno">  560</span>           std::cerr << <span class="stringliteral">"Error: names in classname option are not complete, please check names in training vector and make sure classvalue is > 0"</span> << std::endl;</div>
-<div class="line"><a name="l00561"></a><span class="lineno">  561</span>           exit(1);</div>
-<div class="line"><a name="l00562"></a><span class="lineno">  562</span>         }</div>
-<div class="line"><a name="l00563"></a><span class="lineno">  563</span>       }</div>
-<div class="line"><a name="l00564"></a><span class="lineno">  564</span>       <span class="keywordflow">else</span></div>
-<div class="line"><a name="l00565"></a><span class="lineno">  565</span>         cm.pushBackClassName(mapit->first,doSort);</div>
-<div class="line"><a name="l00566"></a><span class="lineno">  566</span>       ++mapit;</div>
-<div class="line"><a name="l00567"></a><span class="lineno">  567</span>     }</div>
-<div class="line"><a name="l00568"></a><span class="lineno">  568</span>       }</div>
-<div class="line"><a name="l00569"></a><span class="lineno">  569</span>       <span class="keywordflow">catch</span>(<a class="code" href="classBadConversion.html">BadConversion</a> conversionString){</div>
-<div class="line"><a name="l00570"></a><span class="lineno">  570</span>     std::cerr << <span class="stringliteral">"Error: did you provide class pairs names (-c) and integer values (-r) for each class in training vector?"</span> << std::endl;</div>
-<div class="line"><a name="l00571"></a><span class="lineno">  571</span>     exit(1);</div>
-<div class="line"><a name="l00572"></a><span class="lineno">  572</span>       }</div>
-<div class="line"><a name="l00573"></a><span class="lineno">  573</span>       <span class="keywordflow">if</span>(classname_opt.empty()){</div>
-<div class="line"><a name="l00574"></a><span class="lineno">  574</span>         <span class="comment">//std::cerr << "Warning: no class name and value pair provided for all " << nclass << " classes, using string2type<int> instead!" << std::endl;</span></div>
-<div class="line"><a name="l00575"></a><span class="lineno">  575</span>         <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iclass=0;iclass<nclass;++iclass){</div>
-<div class="line"><a name="l00576"></a><span class="lineno">  576</span>           <span class="keywordflow">if</span>(verbose_opt[0])</div>
-<div class="line"><a name="l00577"></a><span class="lineno">  577</span>             std::cout << iclass << <span class="stringliteral">" "</span> << cm.getClass(iclass) << <span class="stringliteral">" -> "</span> << string2type<short>(cm.getClass(iclass)) << std::endl;</div>
-<div class="line"><a name="l00578"></a><span class="lineno">  578</span>           classValueMap[cm.getClass(iclass)]=string2type<short>(cm.getClass(iclass));</div>
-<div class="line"><a name="l00579"></a><span class="lineno">  579</span>         }</div>
-<div class="line"><a name="l00580"></a><span class="lineno">  580</span>       }</div>
-<div class="line"><a name="l00581"></a><span class="lineno">  581</span> </div>
-<div class="line"><a name="l00582"></a><span class="lineno">  582</span>       <span class="comment">// if(priors_opt.size()==nameVector.size()){</span></div>
-<div class="line"><a name="l00583"></a><span class="lineno">  583</span>       <span class="comment">//    std::cerr << "Warning: please check if priors are provided in correct order!!!" << std::endl;</span></div>
-<div class="line"><a name="l00584"></a><span class="lineno">  584</span>       <span class="comment">//    for(int iclass=0;iclass<nameVector.size();++iclass)</span></div>
-<div class="line"><a name="l00585"></a><span class="lineno">  585</span>       <span class="comment">//      std::cerr << nameVector[iclass] << " " << priors_opt[iclass] << std::endl;</span></div>
-<div class="line"><a name="l00586"></a><span class="lineno">  586</span>       <span class="comment">// }</span></div>
-<div class="line"><a name="l00587"></a><span class="lineno">  587</span>     }<span class="comment">//if(!ibag)</span></div>
-<div class="line"><a name="l00588"></a><span class="lineno">  588</span> </div>
-<div class="line"><a name="l00589"></a><span class="lineno">  589</span>     <span class="comment">//Calculate features of training set</span></div>
-<div class="line"><a name="l00590"></a><span class="lineno">  590</span>     vector< Vector2d<float> > trainingFeatures(nclass);</div>
-<div class="line"><a name="l00591"></a><span class="lineno">  591</span>     <span class="keywordflow">for</span>(<span class="keywordtype">short</span> iclass=0;iclass<nclass;++iclass){</div>
-<div class="line"><a name="l00592"></a><span class="lineno">  592</span>       <span class="keywordtype">int</span> nctraining=0;</div>
-<div class="line"><a name="l00593"></a><span class="lineno">  593</span>       <span class="keywordflow">if</span>(verbose_opt[0]>=1)</div>
-<div class="line"><a name="l00594"></a><span class="lineno">  594</span>         std::cout << <span class="stringliteral">"calculating features for class "</span> << iclass << std::endl;</div>
-<div class="line"><a name="l00595"></a><span class="lineno">  595</span>       <span class="keywordflow">if</span>(random_opt[0])</div>
-<div class="line"><a name="l00596"></a><span class="lineno">  596</span>         srand(time(NULL));</div>
-<div class="line"><a name="l00597"></a><span class="lineno">  597</span>       nctraining=(bagSize_opt[iclass]<100)? trainingPixels[iclass].size()/100.0*bagSize_opt[iclass] : trainingPixels[iclass].size();<span class="comment">//bagSize_opt[iclass] given in % of training size</span></div>
-<div class="line"><a name="l00598"></a><span class="lineno">  598</span>       <span class="keywordflow">if</span>(nctraining<=0)</div>
-<div class="line"><a name="l00599"></a><span class="lineno">  599</span>         nctraining=1;</div>
-<div class="line"><a name="l00600"></a><span class="lineno">  600</span>       assert(nctraining<=trainingPixels[iclass].size());</div>
-<div class="line"><a name="l00601"></a><span class="lineno">  601</span>       <span class="keywordtype">int</span> index=0;</div>
-<div class="line"><a name="l00602"></a><span class="lineno">  602</span>       <span class="keywordflow">if</span>(bagSize_opt[iclass]<100)</div>
-<div class="line"><a name="l00603"></a><span class="lineno">  603</span>         random_shuffle(trainingPixels[iclass].begin(),trainingPixels[iclass].end());</div>
-<div class="line"><a name="l00604"></a><span class="lineno">  604</span>       <span class="keywordflow">if</span>(verbose_opt[0]>1)</div>
-<div class="line"><a name="l00605"></a><span class="lineno">  605</span>     std::cout << <span class="stringliteral">"nctraining (class "</span> << iclass << <span class="stringliteral">"): "</span> << nctraining << std::endl;</div>
-<div class="line"><a name="l00606"></a><span class="lineno">  606</span>       trainingFeatures[iclass].resize(nctraining);</div>
-<div class="line"><a name="l00607"></a><span class="lineno">  607</span>       <span class="keywordflow">for</span>(<span class="keywordtype">int</span> isample=0;isample<nctraining;++isample){</div>
-<div class="line"><a name="l00608"></a><span class="lineno">  608</span>         <span class="comment">//scale pixel values according to scale and offset!!!</span></div>
-<div class="line"><a name="l00609"></a><span class="lineno">  609</span>         <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iband=0;iband<nband;++iband){</div>
-<div class="line"><a name="l00610"></a><span class="lineno">  610</span>           <span class="keywordtype">float</span> value=trainingPixels[iclass][isample][iband+startBand];</div>
-<div class="line"><a name="l00611"></a><span class="lineno">  611</span>           trainingFeatures[iclass][isample].push_back((value-offset[ibag][iband])/scale[ibag][iband]);</div>
-<div class="line"><a name="l00612"></a><span class="lineno">  612</span>         }</div>
-<div class="line"><a name="l00613"></a><span class="lineno">  613</span>       }</div>
-<div class="line"><a name="l00614"></a><span class="lineno">  614</span>       assert(trainingFeatures[iclass].size()==nctraining);</div>
-<div class="line"><a name="l00615"></a><span class="lineno">  615</span>     }</div>
-<div class="line"><a name="l00616"></a><span class="lineno">  616</span>     </div>
-<div class="line"><a name="l00617"></a><span class="lineno">  617</span>     <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> nFeatures=trainingFeatures[0][0].size();</div>
-<div class="line"><a name="l00618"></a><span class="lineno">  618</span>     <span class="keywordflow">if</span>(verbose_opt[0]>=1)</div>
-<div class="line"><a name="l00619"></a><span class="lineno">  619</span>       std::cout << <span class="stringliteral">"number of features: "</span> << nFeatures << std::endl;</div>
-<div class="line"><a name="l00620"></a><span class="lineno">  620</span>     <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> ntraining=0;</div>
-<div class="line"><a name="l00621"></a><span class="lineno">  621</span>     <span class="keywordflow">for</span>(<span class="keywordtype">short</span> iclass=0;iclass<nclass;++iclass)</div>
-<div class="line"><a name="l00622"></a><span class="lineno">  622</span>       ntraining+=trainingFeatures[iclass].size();</div>
-<div class="line"><a name="l00623"></a><span class="lineno">  623</span>     <span class="keywordflow">if</span>(verbose_opt[0]>=1)</div>
-<div class="line"><a name="l00624"></a><span class="lineno">  624</span>       std::cout << <span class="stringliteral">"training size over all classes: "</span> << ntraining << std::endl;</div>
-<div class="line"><a name="l00625"></a><span class="lineno">  625</span> </div>
-<div class="line"><a name="l00626"></a><span class="lineno">  626</span>     prob[ibag].l=ntraining;</div>
-<div class="line"><a name="l00627"></a><span class="lineno">  627</span>     prob[ibag].y = Malloc(<span class="keywordtype">double</span>,prob[ibag].l);</div>
-<div class="line"><a name="l00628"></a><span class="lineno">  628</span>     prob[ibag].x = Malloc(<span class="keyword">struct</span> <a class="code" href="structsvm__node.html">svm_node</a> *,prob[ibag].l);</div>
-<div class="line"><a name="l00629"></a><span class="lineno">  629</span>     x_space[ibag] = Malloc(<span class="keyword">struct</span> <a class="code" href="structsvm__node.html">svm_node</a>,(nFeatures+1)*ntraining);</div>
-<div class="line"><a name="l00630"></a><span class="lineno">  630</span>     <span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> spaceIndex=0;</div>
-<div class="line"><a name="l00631"></a><span class="lineno">  631</span>     <span class="keywordtype">int</span> lIndex=0;</div>
-<div class="line"><a name="l00632"></a><span class="lineno">  632</span>     <span class="keywordflow">for</span>(<span class="keywordtype">short</span> iclass=0;iclass<nclass;++iclass){</div>
-<div class="line"><a name="l00633"></a><span class="lineno">  633</span>       <span class="keywordflow">for</span>(<span class="keywordtype">int</span> isample=0;isample<trainingFeatures[iclass].size();++isample){</div>
-<div class="line"><a name="l00634"></a><span class="lineno">  634</span>         prob[ibag].x[lIndex]=&(x_space[ibag][spaceIndex]);</div>
-<div class="line"><a name="l00635"></a><span class="lineno">  635</span>         <span class="keywordflow">for</span>(<span class="keywordtype">int</span> ifeature=0;ifeature<nFeatures;++ifeature){</div>
-<div class="line"><a name="l00636"></a><span class="lineno">  636</span>           x_space[ibag][spaceIndex].index=ifeature+1;</div>
-<div class="line"><a name="l00637"></a><span class="lineno">  637</span>           x_space[ibag][spaceIndex].value=trainingFeatures[iclass][isample][ifeature];</div>
-<div class="line"><a name="l00638"></a><span class="lineno">  638</span>           ++spaceIndex;</div>
-<div class="line"><a name="l00639"></a><span class="lineno">  639</span>         }</div>
-<div class="line"><a name="l00640"></a><span class="lineno">  640</span>         x_space[ibag][spaceIndex++].index=-1;</div>
-<div class="line"><a name="l00641"></a><span class="lineno">  641</span>         prob[ibag].y[lIndex]=iclass;</div>
-<div class="line"><a name="l00642"></a><span class="lineno">  642</span>         ++lIndex;</div>
-<div class="line"><a name="l00643"></a><span class="lineno">  643</span>       }</div>
-<div class="line"><a name="l00644"></a><span class="lineno">  644</span>     }</div>
-<div class="line"><a name="l00645"></a><span class="lineno">  645</span>     assert(lIndex==prob[ibag].l);</div>
-<div class="line"><a name="l00646"></a><span class="lineno">  646</span> </div>
-<div class="line"><a name="l00647"></a><span class="lineno">  647</span>     <span class="comment">//set SVM parameters through command line options</span></div>
-<div class="line"><a name="l00648"></a><span class="lineno">  648</span>     param[ibag].svm_type = svmMap[svm_type_opt[0]];</div>
-<div class="line"><a name="l00649"></a><span class="lineno">  649</span>     param[ibag].kernel_type = kernelMap[kernel_type_opt[0]];</div>
-<div class="line"><a name="l00650"></a><span class="lineno">  650</span>     param[ibag].degree = kernel_degree_opt[0];</div>
-<div class="line"><a name="l00651"></a><span class="lineno">  651</span>     param[ibag].gamma = (gamma_opt[0]>0)? gamma_opt[0] : 1.0/nFeatures;</div>
-<div class="line"><a name="l00652"></a><span class="lineno">  652</span>     param[ibag].coef0 = coef0_opt[0];</div>
-<div class="line"><a name="l00653"></a><span class="lineno">  653</span>     param[ibag].nu = nu_opt[0];</div>
-<div class="line"><a name="l00654"></a><span class="lineno">  654</span>     param[ibag].cache_size = cache_opt[0];</div>
-<div class="line"><a name="l00655"></a><span class="lineno">  655</span>     param[ibag].C = ccost_opt[0];</div>
-<div class="line"><a name="l00656"></a><span class="lineno">  656</span>     param[ibag].eps = epsilon_tol_opt[0];</div>
-<div class="line"><a name="l00657"></a><span class="lineno">  657</span>     param[ibag].p = epsilon_loss_opt[0];</div>
-<div class="line"><a name="l00658"></a><span class="lineno">  658</span>     param[ibag].shrinking = (shrinking_opt[0])? 1 : 0;</div>
-<div class="line"><a name="l00659"></a><span class="lineno">  659</span>     param[ibag].probability = (prob_est_opt[0])? 1 : 0;</div>
-<div class="line"><a name="l00660"></a><span class="lineno">  660</span>     param[ibag].nr_weight = 0;<span class="comment">//not used: I use priors and balancing</span></div>
-<div class="line"><a name="l00661"></a><span class="lineno">  661</span>     param[ibag].weight_label = NULL;</div>
-<div class="line"><a name="l00662"></a><span class="lineno">  662</span>     param[ibag].weight = NULL;</div>
-<div class="line"><a name="l00663"></a><span class="lineno">  663</span>     param[ibag].verbose=(verbose_opt[0]>1)? <span class="keyword">true</span>:<span class="keyword">false</span>;</div>
-<div class="line"><a name="l00664"></a><span class="lineno">  664</span> </div>
-<div class="line"><a name="l00665"></a><span class="lineno">  665</span>     <span class="keywordflow">if</span>(verbose_opt[0]>1)</div>
-<div class="line"><a name="l00666"></a><span class="lineno">  666</span>       std::cout << <span class="stringliteral">"checking parameters"</span> << std::endl;</div>
-<div class="line"><a name="l00667"></a><span class="lineno">  667</span>     svm_check_parameter(&prob[ibag],&param[ibag]);</div>
-<div class="line"><a name="l00668"></a><span class="lineno">  668</span>     <span class="keywordflow">if</span>(verbose_opt[0])</div>
-<div class="line"><a name="l00669"></a><span class="lineno">  669</span>       std::cout << <span class="stringliteral">"parameters ok, training"</span> << std::endl;</div>
-<div class="line"><a name="l00670"></a><span class="lineno">  670</span>     svm[ibag]=svm_train(&prob[ibag],&param[ibag]);</div>
-<div class="line"><a name="l00671"></a><span class="lineno">  671</span>     <span class="keywordflow">if</span>(verbose_opt[0]>1)</div>
-<div class="line"><a name="l00672"></a><span class="lineno">  672</span>       std::cout << <span class="stringliteral">"SVM is now trained"</span> << std::endl;</div>
-<div class="line"><a name="l00673"></a><span class="lineno">  673</span>     <span class="keywordflow">if</span>(cv_opt[0]>1){</div>
-<div class="line"><a name="l00674"></a><span class="lineno">  674</span>       <span class="keywordflow">if</span>(verbose_opt[0]>1)</div>
-<div class="line"><a name="l00675"></a><span class="lineno">  675</span>     std::cout << <span class="stringliteral">"Cross validating"</span> << std::endl;</div>
-<div class="line"><a name="l00676"></a><span class="lineno">  676</span>       <span class="keywordtype">double</span> *target = Malloc(<span class="keywordtype">double</span>,prob[ibag].l);</div>
-<div class="line"><a name="l00677"></a><span class="lineno">  677</span>       svm_cross_validation(&prob[ibag],&param[ibag],cv_opt[0],target);</div>
-<div class="line"><a name="l00678"></a><span class="lineno">  678</span>       assert(param[ibag].svm_type != EPSILON_SVR&&param[ibag].svm_type != NU_SVR);<span class="comment">//only for regression</span></div>
-<div class="line"><a name="l00679"></a><span class="lineno">  679</span> </div>
-<div class="line"><a name="l00680"></a><span class="lineno">  680</span>       <span class="keywordflow">for</span>(<span class="keywordtype">int</span> i=0;i<prob[ibag].l;i++){</div>
-<div class="line"><a name="l00681"></a><span class="lineno">  681</span>     <span class="keywordtype">string</span> refClassName=nameVector[prob[ibag].y[i]];</div>
-<div class="line"><a name="l00682"></a><span class="lineno">  682</span>     <span class="keywordtype">string</span> className=nameVector[target[i]];</div>
-<div class="line"><a name="l00683"></a><span class="lineno">  683</span>     <span class="keywordflow">if</span>(classValueMap.size())</div>
-<div class="line"><a name="l00684"></a><span class="lineno">  684</span>       cm.incrementResult(type2string<short>(classValueMap[refClassName]),type2string<short>(classValueMap[className]),1.0/nbag);</div>
-<div class="line"><a name="l00685"></a><span class="lineno">  685</span>     <span class="keywordflow">else</span></div>
-<div class="line"><a name="l00686"></a><span class="lineno">  686</span>       cm.incrementResult(cm.getClass(prob[ibag].y[i]),cm.getClass(target[i]),1.0/nbag);</div>
-<div class="line"><a name="l00687"></a><span class="lineno">  687</span>       }</div>
-<div class="line"><a name="l00688"></a><span class="lineno">  688</span>       free(target);</div>
-<div class="line"><a name="l00689"></a><span class="lineno">  689</span>     }</div>
-<div class="line"><a name="l00690"></a><span class="lineno">  690</span>     <span class="comment">// *NOTE* Because svm_model contains pointers to svm_problem, you can</span></div>
-<div class="line"><a name="l00691"></a><span class="lineno">  691</span>     <span class="comment">// not free the memory used by svm_problem if you are still using the</span></div>
-<div class="line"><a name="l00692"></a><span class="lineno">  692</span>     <span class="comment">// svm_model produced by svm_train(). </span></div>
-<div class="line"><a name="l00693"></a><span class="lineno">  693</span>   }<span class="comment">//for ibag</span></div>
-<div class="line"><a name="l00694"></a><span class="lineno">  694</span>   <span class="keywordflow">if</span>(cv_opt[0]>1){</div>
-<div class="line"><a name="l00695"></a><span class="lineno">  695</span>     assert(cm.nReference());</div>
-<div class="line"><a name="l00696"></a><span class="lineno">  696</span>     cm.setFormat(cmformat_opt[0]);</div>
-<div class="line"><a name="l00697"></a><span class="lineno">  697</span>     cm.reportSE95(<span class="keyword">false</span>);</div>
-<div class="line"><a name="l00698"></a><span class="lineno">  698</span>     std::cout << cm << std::endl;</div>
-<div class="line"><a name="l00699"></a><span class="lineno">  699</span>     <span class="comment">// cout << "class #samples userAcc prodAcc" << endl;</span></div>
-<div class="line"><a name="l00700"></a><span class="lineno">  700</span>     <span class="comment">// double se95_ua=0;</span></div>
-<div class="line"><a name="l00701"></a><span class="lineno">  701</span>     <span class="comment">// double se95_pa=0;</span></div>
-<div class="line"><a name="l00702"></a><span class="lineno">  702</span>     <span class="comment">// double se95_oa=0;</span></div>
-<div class="line"><a name="l00703"></a><span class="lineno">  703</span>     <span class="comment">// double dua=0;</span></div>
-<div class="line"><a name="l00704"></a><span class="lineno">  704</span>     <span class="comment">// double dpa=0;</span></div>
-<div class="line"><a name="l00705"></a><span class="lineno">  705</span>     <span class="comment">// double doa=0;</span></div>
-<div class="line"><a name="l00706"></a><span class="lineno">  706</span>     <span class="comment">// for(short iclass=0;iclass<cm.nClasses();++iclass){</span></div>
-<div class="line"><a name="l00707"></a><span class="lineno">  707</span>     <span class="comment">//   dua=cm.ua(cm.getClass(iclass),&se95_ua);</span></div>
-<div class="line"><a name="l00708"></a><span class="lineno">  708</span>     <span class="comment">//   dpa=cm.pa(cm.getClass(iclass),&se95_pa);</span></div>
-<div class="line"><a name="l00709"></a><span class="lineno">  709</span>     <span class="comment">//   cout << cm.getClass(iclass) << " " << cm.nReference(cm.getClass(iclass)) << " " << dua << " (" << se95_ua << ")" << " " << dpa << " (" << se95_pa << ")" << endl;</span></div>
-<div class="line"><a name="l00710"></a><span class="lineno">  710</span>     <span class="comment">// }</span></div>
-<div class="line"><a name="l00711"></a><span class="lineno">  711</span>     <span class="comment">// std::cout << "Kappa: " << cm.kappa() << std::endl;</span></div>
-<div class="line"><a name="l00712"></a><span class="lineno">  712</span>     <span class="comment">// doa=cm.oa(&se95_oa);</span></div>
-<div class="line"><a name="l00713"></a><span class="lineno">  713</span>     <span class="comment">// std::cout << "Overall Accuracy: " << 100*doa << " (" << 100*se95_oa << ")"  << std::endl;</span></div>
-<div class="line"><a name="l00714"></a><span class="lineno">  714</span>   }</div>
-<div class="line"><a name="l00715"></a><span class="lineno">  715</span> </div>
-<div class="line"><a name="l00716"></a><span class="lineno">  716</span>   <span class="comment">//--------------------------------- end of training -----------------------------------</span></div>
-<div class="line"><a name="l00717"></a><span class="lineno">  717</span>   <span class="keywordflow">if</span>(input_opt.empty())</div>
-<div class="line"><a name="l00718"></a><span class="lineno">  718</span>     exit(0);</div>
-<div class="line"><a name="l00719"></a><span class="lineno">  719</span> </div>
-<div class="line"><a name="l00720"></a><span class="lineno">  720</span>   <span class="keyword">const</span> <span class="keywordtype">char</span>* pszMessage;</div>
-<div class="line"><a name="l00721"></a><span class="lineno">  721</span>   <span class="keywordtype">void</span>* pProgressArg=NULL;</div>
-<div class="line"><a name="l00722"></a><span class="lineno">  722</span>   GDALProgressFunc pfnProgress=GDALTermProgress;</div>
-<div class="line"><a name="l00723"></a><span class="lineno">  723</span>   <span class="keywordtype">float</span> progress=0;</div>
-<div class="line"><a name="l00724"></a><span class="lineno">  724</span>   <span class="keywordflow">if</span>(!verbose_opt[0])</div>
-<div class="line"><a name="l00725"></a><span class="lineno">  725</span>     pfnProgress(progress,pszMessage,pProgressArg);</div>
-<div class="line"><a name="l00726"></a><span class="lineno">  726</span>   <span class="comment">//-------------------------------- open image file ------------------------------------</span></div>
-<div class="line"><a name="l00727"></a><span class="lineno">  727</span>   <span class="keywordtype">bool</span> inputIsRaster=<span class="keyword">false</span>;</div>
-<div class="line"><a name="l00728"></a><span class="lineno">  728</span>   <a class="code" href="classImgReaderOgr.html">ImgReaderOgr</a> imgReaderOgr;</div>
-<div class="line"><a name="l00729"></a><span class="lineno">  729</span>   <span class="keywordflow">try</span>{</div>
-<div class="line"><a name="l00730"></a><span class="lineno">  730</span>     imgReaderOgr.open(input_opt[0]);</div>
-<div class="line"><a name="l00731"></a><span class="lineno">  731</span>     imgReaderOgr.close();</div>
-<div class="line"><a name="l00732"></a><span class="lineno">  732</span>   }</div>
-<div class="line"><a name="l00733"></a><span class="lineno">  733</span>   <span class="keywordflow">catch</span>(<span class="keywordtype">string</span> errorString){</div>
-<div class="line"><a name="l00734"></a><span class="lineno">  734</span>     inputIsRaster=<span class="keyword">true</span>;</div>
-<div class="line"><a name="l00735"></a><span class="lineno">  735</span>   }</div>
-<div class="line"><a name="l00736"></a><span class="lineno">  736</span>   <span class="keywordflow">if</span>(inputIsRaster){</div>
-<div class="line"><a name="l00737"></a><span class="lineno">  737</span>     <a class="code" href="classImgReaderGdal.html">ImgReaderGdal</a> testImage;</div>
-<div class="line"><a name="l00738"></a><span class="lineno">  738</span>     <span class="keywordflow">try</span>{</div>
-<div class="line"><a name="l00739"></a><span class="lineno">  739</span>       <span class="keywordflow">if</span>(verbose_opt[0]>=1)</div>
-<div class="line"><a name="l00740"></a><span class="lineno">  740</span>         std::cout << <span class="stringliteral">"opening image "</span> << input_opt[0] << std::endl; </div>
-<div class="line"><a name="l00741"></a><span class="lineno">  741</span>       testImage.open(input_opt[0]);</div>
-<div class="line"><a name="l00742"></a><span class="lineno">  742</span>     }</div>
-<div class="line"><a name="l00743"></a><span class="lineno">  743</span>     <span class="keywordflow">catch</span>(<span class="keywordtype">string</span> error){</div>
-<div class="line"><a name="l00744"></a><span class="lineno">  744</span>       cerr << error << std::endl;</div>
-<div class="line"><a name="l00745"></a><span class="lineno">  745</span>       exit(2);</div>
-<div class="line"><a name="l00746"></a><span class="lineno">  746</span>     }</div>
-<div class="line"><a name="l00747"></a><span class="lineno">  747</span>     <a class="code" href="classImgReaderGdal.html">ImgReaderGdal</a> priorReader;</div>
-<div class="line"><a name="l00748"></a><span class="lineno">  748</span>     <span class="keywordflow">if</span>(priorimg_opt.size()){</div>
-<div class="line"><a name="l00749"></a><span class="lineno">  749</span>       <span class="keywordflow">try</span>{</div>
-<div class="line"><a name="l00750"></a><span class="lineno">  750</span>     <span class="keywordflow">if</span>(verbose_opt[0]>=1)</div>
-<div class="line"><a name="l00751"></a><span class="lineno">  751</span>           std::cout << <span class="stringliteral">"opening prior image "</span> << priorimg_opt[0] << std::endl;</div>
-<div class="line"><a name="l00752"></a><span class="lineno">  752</span>         priorReader.open(priorimg_opt[0]);</div>
-<div class="line"><a name="l00753"></a><span class="lineno">  753</span>         assert(priorReader.nrOfCol()==testImage.nrOfCol());</div>
-<div class="line"><a name="l00754"></a><span class="lineno">  754</span>         assert(priorReader.nrOfRow()==testImage.nrOfRow());</div>
-<div class="line"><a name="l00755"></a><span class="lineno">  755</span>       }</div>
-<div class="line"><a name="l00756"></a><span class="lineno">  756</span>       <span class="keywordflow">catch</span>(<span class="keywordtype">string</span> error){</div>
-<div class="line"><a name="l00757"></a><span class="lineno">  757</span>         cerr << error << std::endl;</div>
-<div class="line"><a name="l00758"></a><span class="lineno">  758</span>         exit(2);</div>
-<div class="line"><a name="l00759"></a><span class="lineno">  759</span>       }</div>
-<div class="line"><a name="l00760"></a><span class="lineno">  760</span>       <span class="keywordflow">catch</span>(...){</div>
-<div class="line"><a name="l00761"></a><span class="lineno">  761</span>         cerr << <span class="stringliteral">"error catched"</span> << std::endl;</div>
-<div class="line"><a name="l00762"></a><span class="lineno">  762</span>         exit(1);</div>
-<div class="line"><a name="l00763"></a><span class="lineno">  763</span>       }</div>
-<div class="line"><a name="l00764"></a><span class="lineno">  764</span>     }</div>
-<div class="line"><a name="l00765"></a><span class="lineno">  765</span> </div>
-<div class="line"><a name="l00766"></a><span class="lineno">  766</span>     <span class="keywordtype">int</span> nrow=testImage.nrOfRow();</div>
-<div class="line"><a name="l00767"></a><span class="lineno">  767</span>     <span class="keywordtype">int</span> ncol=testImage.nrOfCol();</div>
-<div class="line"><a name="l00768"></a><span class="lineno">  768</span>     <span class="keywordflow">if</span>(option_opt.findSubstring(<span class="stringliteral">"INTERLEAVE="</span>)==option_opt.end()){</div>
-<div class="line"><a name="l00769"></a><span class="lineno">  769</span>       <span class="keywordtype">string</span> theInterleave=<span class="stringliteral">"INTERLEAVE="</span>;</div>
-<div class="line"><a name="l00770"></a><span class="lineno">  770</span>       theInterleave+=testImage.getInterleave();</div>
-<div class="line"><a name="l00771"></a><span class="lineno">  771</span>       option_opt.push_back(theInterleave);</div>
-<div class="line"><a name="l00772"></a><span class="lineno">  772</span>     }</div>
-<div class="line"><a name="l00773"></a><span class="lineno">  773</span>     vector<char> classOut(ncol);<span class="comment">//classified line for writing to image file</span></div>
-<div class="line"><a name="l00774"></a><span class="lineno">  774</span> </div>
-<div class="line"><a name="l00775"></a><span class="lineno">  775</span>     <span class="comment">//   assert(nband==testImage.nrOfBand());</span></div>
-<div class="line"><a name="l00776"></a><span class="lineno">  776</span>     <a class="code" href="classImgWriterGdal.html">ImgWriterGdal</a> classImageBag;</div>
-<div class="line"><a name="l00777"></a><span class="lineno">  777</span>     <a class="code" href="classImgWriterGdal.html">ImgWriterGdal</a> classImageOut;</div>
-<div class="line"><a name="l00778"></a><span class="lineno">  778</span>     <a class="code" href="classImgWriterGdal.html">ImgWriterGdal</a> probImage;</div>
-<div class="line"><a name="l00779"></a><span class="lineno">  779</span>     <a class="code" href="classImgWriterGdal.html">ImgWriterGdal</a> entropyImage;</div>
-<div class="line"><a name="l00780"></a><span class="lineno">  780</span> </div>
-<div class="line"><a name="l00781"></a><span class="lineno">  781</span>     <span class="keywordtype">string</span> imageType=testImage.getImageType();</div>
-<div class="line"><a name="l00782"></a><span class="lineno">  782</span>     <span class="keywordflow">if</span>(oformat_opt.size())<span class="comment">//default</span></div>
-<div class="line"><a name="l00783"></a><span class="lineno">  783</span>       imageType=oformat_opt[0];</div>
-<div class="line"><a name="l00784"></a><span class="lineno">  784</span>     <span class="keywordflow">try</span>{</div>
-<div class="line"><a name="l00785"></a><span class="lineno">  785</span>       assert(output_opt.size());</div>
-<div class="line"><a name="l00786"></a><span class="lineno">  786</span>       <span class="keywordflow">if</span>(verbose_opt[0]>=1)</div>
-<div class="line"><a name="l00787"></a><span class="lineno">  787</span>         std::cout << <span class="stringliteral">"opening class image for writing output "</span> << output_opt[0] << std::endl;</div>
-<div class="line"><a name="l00788"></a><span class="lineno">  788</span>       <span class="keywordflow">if</span>(classBag_opt.size()){</div>
-<div class="line"><a name="l00789"></a><span class="lineno">  789</span>         classImageBag.open(classBag_opt[0],ncol,nrow,nbag,GDT_Byte,imageType,option_opt);</div>
-<div class="line"><a name="l00790"></a><span class="lineno">  790</span>     classImageBag.GDALSetNoDataValue(nodata_opt[0]);</div>
-<div class="line"><a name="l00791"></a><span class="lineno">  791</span>         classImageBag.copyGeoTransform(testImage);</div>
-<div class="line"><a name="l00792"></a><span class="lineno">  792</span>         classImageBag.setProjection(testImage.getProjection());</div>
-<div class="line"><a name="l00793"></a><span class="lineno">  793</span>       }</div>
-<div class="line"><a name="l00794"></a><span class="lineno">  794</span>       classImageOut.open(output_opt[0],ncol,nrow,1,GDT_Byte,imageType,option_opt);</div>
-<div class="line"><a name="l00795"></a><span class="lineno">  795</span>       classImageOut.GDALSetNoDataValue(nodata_opt[0]);</div>
-<div class="line"><a name="l00796"></a><span class="lineno">  796</span>       classImageOut.copyGeoTransform(testImage);</div>
-<div class="line"><a name="l00797"></a><span class="lineno">  797</span>       classImageOut.setProjection(testImage.getProjection());</div>
-<div class="line"><a name="l00798"></a><span class="lineno">  798</span>       <span class="keywordflow">if</span>(colorTable_opt.size())</div>
-<div class="line"><a name="l00799"></a><span class="lineno">  799</span>         classImageOut.setColorTable(colorTable_opt[0],0);</div>
-<div class="line"><a name="l00800"></a><span class="lineno">  800</span>       <span class="keywordflow">if</span>(prob_opt.size()){</div>
-<div class="line"><a name="l00801"></a><span class="lineno">  801</span>         probImage.open(prob_opt[0],ncol,nrow,nclass,GDT_Byte,imageType,option_opt);</div>
-<div class="line"><a name="l00802"></a><span class="lineno">  802</span>     probImage.GDALSetNoDataValue(nodata_opt[0]);</div>
-<div class="line"><a name="l00803"></a><span class="lineno">  803</span>         probImage.copyGeoTransform(testImage);</div>
-<div class="line"><a name="l00804"></a><span class="lineno">  804</span>         probImage.setProjection(testImage.getProjection());</div>
-<div class="line"><a name="l00805"></a><span class="lineno">  805</span>       }</div>
-<div class="line"><a name="l00806"></a><span class="lineno">  806</span>       <span class="keywordflow">if</span>(entropy_opt.size()){</div>
-<div class="line"><a name="l00807"></a><span class="lineno">  807</span>         entropyImage.open(entropy_opt[0],ncol,nrow,1,GDT_Byte,imageType,option_opt);</div>
-<div class="line"><a name="l00808"></a><span class="lineno">  808</span>     entropyImage.GDALSetNoDataValue(nodata_opt[0]);</div>
-<div class="line"><a name="l00809"></a><span class="lineno">  809</span>         entropyImage.copyGeoTransform(testImage);</div>
-<div class="line"><a name="l00810"></a><span class="lineno">  810</span>         entropyImage.setProjection(testImage.getProjection());</div>
-<div class="line"><a name="l00811"></a><span class="lineno">  811</span>       }</div>
-<div class="line"><a name="l00812"></a><span class="lineno">  812</span>     }</div>
-<div class="line"><a name="l00813"></a><span class="lineno">  813</span>     <span class="keywordflow">catch</span>(<span class="keywordtype">string</span> error){</div>
-<div class="line"><a name="l00814"></a><span class="lineno">  814</span>       cerr << error << std::endl;</div>
-<div class="line"><a name="l00815"></a><span class="lineno">  815</span>     }</div>
-<div class="line"><a name="l00816"></a><span class="lineno">  816</span>   </div>
-<div class="line"><a name="l00817"></a><span class="lineno">  817</span>     <a class="code" href="classImgWriterGdal.html">ImgWriterGdal</a> maskWriter;</div>
-<div class="line"><a name="l00818"></a><span class="lineno">  818</span>     <span class="keywordflow">if</span>(extent_opt.size()){</div>
-<div class="line"><a name="l00819"></a><span class="lineno">  819</span>       <span class="keywordflow">try</span>{</div>
-<div class="line"><a name="l00820"></a><span class="lineno">  820</span>     maskWriter.open(<span class="stringliteral">"/vsimem/mask.tif"</span>,ncol,nrow,1,GDT_Float32,imageType,option_opt);</div>
-<div class="line"><a name="l00821"></a><span class="lineno">  821</span>     maskWriter.GDALSetNoDataValue(nodata_opt[0]);</div>
-<div class="line"><a name="l00822"></a><span class="lineno">  822</span>         maskWriter.copyGeoTransform(testImage);</div>
-<div class="line"><a name="l00823"></a><span class="lineno">  823</span>         maskWriter.setProjection(testImage.getProjection());</div>
-<div class="line"><a name="l00824"></a><span class="lineno">  824</span>     vector<double> burnValues(1,1);<span class="comment">//burn value is 1 (single band)</span></div>
-<div class="line"><a name="l00825"></a><span class="lineno">  825</span>     maskWriter.rasterizeOgr(extentReader,burnValues);</div>
-<div class="line"><a name="l00826"></a><span class="lineno">  826</span>     maskWriter.close();</div>
-<div class="line"><a name="l00827"></a><span class="lineno">  827</span>       }</div>
-<div class="line"><a name="l00828"></a><span class="lineno">  828</span>       <span class="keywordflow">catch</span>(<span class="keywordtype">string</span> error){</div>
-<div class="line"><a name="l00829"></a><span class="lineno">  829</span>         cerr << error << std::endl;</div>
-<div class="line"><a name="l00830"></a><span class="lineno">  830</span>         exit(2);</div>
-<div class="line"><a name="l00831"></a><span class="lineno">  831</span>       }</div>
-<div class="line"><a name="l00832"></a><span class="lineno">  832</span>       <span class="keywordflow">catch</span>(...){</div>
-<div class="line"><a name="l00833"></a><span class="lineno">  833</span>         cerr << <span class="stringliteral">"error catched"</span> << std::endl;</div>
-<div class="line"><a name="l00834"></a><span class="lineno">  834</span>         exit(1);</div>
+<div class="line"><a name="l00547"></a><span class="lineno">  547</span>     }</div>
+<div class="line"><a name="l00548"></a><span class="lineno">  548</span>       </div>
+<div class="line"><a name="l00549"></a><span class="lineno">  549</span>     <span class="keywordflow">if</span>(!ibag){</div>
+<div class="line"><a name="l00550"></a><span class="lineno">  550</span>       <span class="keywordflow">if</span>(priors_opt.size()==1){<span class="comment">//default: equal priors for each class</span></div>
+<div class="line"><a name="l00551"></a><span class="lineno">  551</span>         priors.resize(nclass);</div>
+<div class="line"><a name="l00552"></a><span class="lineno">  552</span>         <span class="keywordflow">for</span>(<span class="keywordtype">short</span> iclass=0;iclass<nclass;++iclass)</div>
+<div class="line"><a name="l00553"></a><span class="lineno">  553</span>           priors[iclass]=1.0/nclass;</div>
+<div class="line"><a name="l00554"></a><span class="lineno">  554</span>       }</div>
+<div class="line"><a name="l00555"></a><span class="lineno">  555</span>       assert(priors_opt.size()==1||priors_opt.size()==nclass);</div>
+<div class="line"><a name="l00556"></a><span class="lineno">  556</span> </div>
+<div class="line"><a name="l00557"></a><span class="lineno">  557</span>       <span class="comment">//set bagsize for each class if not done already via command line</span></div>
+<div class="line"><a name="l00558"></a><span class="lineno">  558</span>       <span class="keywordflow">while</span>(bagSize_opt.size()<nclass)</div>
+<div class="line"><a name="l00559"></a><span class="lineno">  559</span>         bagSize_opt.push_back(bagSize_opt.back());</div>
+<div class="line"><a name="l00560"></a><span class="lineno">  560</span> </div>
+<div class="line"><a name="l00561"></a><span class="lineno">  561</span>       <span class="keywordflow">if</span>(verbose_opt[0]>=1){</div>
+<div class="line"><a name="l00562"></a><span class="lineno">  562</span>         std::cout << <span class="stringliteral">"number of bands: "</span> << nband << std::endl;</div>
+<div class="line"><a name="l00563"></a><span class="lineno">  563</span>         std::cout << <span class="stringliteral">"number of classes: "</span> << nclass << std::endl;</div>
+<div class="line"><a name="l00564"></a><span class="lineno">  564</span>     <span class="keywordflow">if</span>(priorimg_opt.empty()){</div>
+<div class="line"><a name="l00565"></a><span class="lineno">  565</span>       std::cout << <span class="stringliteral">"priors:"</span>;</div>
+<div class="line"><a name="l00566"></a><span class="lineno">  566</span>       <span class="keywordflow">for</span>(<span class="keywordtype">short</span> iclass=0;iclass<nclass;++iclass)</div>
+<div class="line"><a name="l00567"></a><span class="lineno">  567</span>         std::cout << <span class="stringliteral">" "</span> << priors[iclass];</div>
+<div class="line"><a name="l00568"></a><span class="lineno">  568</span>       std::cout << std::endl;</div>
+<div class="line"><a name="l00569"></a><span class="lineno">  569</span>     }</div>
+<div class="line"><a name="l00570"></a><span class="lineno">  570</span>       }</div>
+<div class="line"><a name="l00571"></a><span class="lineno">  571</span>       map<string,Vector2d<float> >::iterator mapit=trainingMap.begin();</div>
+<div class="line"><a name="l00572"></a><span class="lineno">  572</span>       <span class="keywordtype">bool</span> doSort=<span class="keyword">true</span>;</div>
+<div class="line"><a name="l00573"></a><span class="lineno">  573</span>       <span class="keywordflow">try</span>{</div>
+<div class="line"><a name="l00574"></a><span class="lineno">  574</span>     <span class="keywordflow">while</span>(mapit!=trainingMap.end()){</div>
+<div class="line"><a name="l00575"></a><span class="lineno">  575</span>       nameVector.push_back(mapit->first);</div>
+<div class="line"><a name="l00576"></a><span class="lineno">  576</span>       <span class="keywordflow">if</span>(classValueMap.size()){</div>
+<div class="line"><a name="l00577"></a><span class="lineno">  577</span>         <span class="comment">//check if name in training is covered by classname_opt (values can not be 0)</span></div>
+<div class="line"><a name="l00578"></a><span class="lineno">  578</span>         <span class="keywordflow">if</span>(classValueMap[mapit->first]>0){</div>
+<div class="line"><a name="l00579"></a><span class="lineno">  579</span>           <span class="keywordflow">if</span>(cm.getClassIndex(type2string<short>(classValueMap[mapit->first]))<0){</div>
+<div class="line"><a name="l00580"></a><span class="lineno">  580</span>         cm.pushBackClassName(type2string<short>(classValueMap[mapit->first]),doSort);</div>
+<div class="line"><a name="l00581"></a><span class="lineno">  581</span>           }</div>
+<div class="line"><a name="l00582"></a><span class="lineno">  582</span>         }</div>
+<div class="line"><a name="l00583"></a><span class="lineno">  583</span>         <span class="keywordflow">else</span>{</div>
+<div class="line"><a name="l00584"></a><span class="lineno">  584</span>           std::cerr << <span class="stringliteral">"Error: names in classname option are not complete, please check names in training vector and make sure classvalue is > 0"</span> << std::endl;</div>
+<div class="line"><a name="l00585"></a><span class="lineno">  585</span>           exit(1);</div>
+<div class="line"><a name="l00586"></a><span class="lineno">  586</span>         }</div>
+<div class="line"><a name="l00587"></a><span class="lineno">  587</span>       }</div>
+<div class="line"><a name="l00588"></a><span class="lineno">  588</span>       <span class="keywordflow">else</span></div>
+<div class="line"><a name="l00589"></a><span class="lineno">  589</span>         cm.pushBackClassName(mapit->first,doSort);</div>
+<div class="line"><a name="l00590"></a><span class="lineno">  590</span>       ++mapit;</div>
+<div class="line"><a name="l00591"></a><span class="lineno">  591</span>     }</div>
+<div class="line"><a name="l00592"></a><span class="lineno">  592</span>       }</div>
+<div class="line"><a name="l00593"></a><span class="lineno">  593</span>       <span class="keywordflow">catch</span>(<a class="code" href="classBadConversion.html">BadConversion</a> conversionString){</div>
+<div class="line"><a name="l00594"></a><span class="lineno">  594</span>     std::cerr << <span class="stringliteral">"Error: did you provide class pairs names (-c) and integer values (-r) for each class in training vector?"</span> << std::endl;</div>
+<div class="line"><a name="l00595"></a><span class="lineno">  595</span>     exit(1);</div>
+<div class="line"><a name="l00596"></a><span class="lineno">  596</span>       }</div>
+<div class="line"><a name="l00597"></a><span class="lineno">  597</span>       <span class="keywordflow">if</span>(classname_opt.empty()){</div>
+<div class="line"><a name="l00598"></a><span class="lineno">  598</span>         <span class="comment">//std::cerr << "Warning: no class name and value pair provided for all " << nclass << " classes, using string2type<int> instead!" << std::endl;</span></div>
+<div class="line"><a name="l00599"></a><span class="lineno">  599</span>         <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iclass=0;iclass<nclass;++iclass){</div>
+<div class="line"><a name="l00600"></a><span class="lineno">  600</span>           <span class="keywordflow">if</span>(verbose_opt[0])</div>
+<div class="line"><a name="l00601"></a><span class="lineno">  601</span>             std::cout << iclass << <span class="stringliteral">" "</span> << cm.getClass(iclass) << <span class="stringliteral">" -> "</span> << string2type<short>(cm.getClass(iclass)) << std::endl;</div>
+<div class="line"><a name="l00602"></a><span class="lineno">  602</span>           classValueMap[cm.getClass(iclass)]=string2type<short>(cm.getClass(iclass));</div>
+<div class="line"><a name="l00603"></a><span class="lineno">  603</span>         }</div>
+<div class="line"><a name="l00604"></a><span class="lineno">  604</span>       }</div>
+<div class="line"><a name="l00605"></a><span class="lineno">  605</span> </div>
+<div class="line"><a name="l00606"></a><span class="lineno">  606</span>       <span class="comment">// if(priors_opt.size()==nameVector.size()){</span></div>
+<div class="line"><a name="l00607"></a><span class="lineno">  607</span>       <span class="comment">//    std::cerr << "Warning: please check if priors are provided in correct order!!!" << std::endl;</span></div>
+<div class="line"><a name="l00608"></a><span class="lineno">  608</span>       <span class="comment">//    for(int iclass=0;iclass<nameVector.size();++iclass)</span></div>
+<div class="line"><a name="l00609"></a><span class="lineno">  609</span>       <span class="comment">//      std::cerr << nameVector[iclass] << " " << priors_opt[iclass] << std::endl;</span></div>
+<div class="line"><a name="l00610"></a><span class="lineno">  610</span>       <span class="comment">// }</span></div>
+<div class="line"><a name="l00611"></a><span class="lineno">  611</span>     }<span class="comment">//if(!ibag)</span></div>
+<div class="line"><a name="l00612"></a><span class="lineno">  612</span> </div>
+<div class="line"><a name="l00613"></a><span class="lineno">  613</span>     <span class="comment">//Calculate features of training set</span></div>
+<div class="line"><a name="l00614"></a><span class="lineno">  614</span>     vector< Vector2d<float> > trainingFeatures(nclass);</div>
+<div class="line"><a name="l00615"></a><span class="lineno">  615</span>     <span class="keywordflow">for</span>(<span class="keywordtype">short</span> iclass=0;iclass<nclass;++iclass){</div>
+<div class="line"><a name="l00616"></a><span class="lineno">  616</span>       <span class="keywordtype">int</span> nctraining=0;</div>
+<div class="line"><a name="l00617"></a><span class="lineno">  617</span>       <span class="keywordflow">if</span>(verbose_opt[0]>=1)</div>
+<div class="line"><a name="l00618"></a><span class="lineno">  618</span>         std::cout << <span class="stringliteral">"calculating features for class "</span> << iclass << std::endl;</div>
+<div class="line"><a name="l00619"></a><span class="lineno">  619</span>       <span class="keywordflow">if</span>(random_opt[0])</div>
+<div class="line"><a name="l00620"></a><span class="lineno">  620</span>         srand(time(NULL));</div>
+<div class="line"><a name="l00621"></a><span class="lineno">  621</span>       nctraining=(bagSize_opt[iclass]<100)? trainingPixels[iclass].size()/100.0*bagSize_opt[iclass] : trainingPixels[iclass].size();<span class="comment">//bagSize_opt[iclass] given in % of training size</span></div>
+<div class="line"><a name="l00622"></a><span class="lineno">  622</span>       <span class="keywordflow">if</span>(nctraining<=0)</div>
+<div class="line"><a name="l00623"></a><span class="lineno">  623</span>         nctraining=1;</div>
+<div class="line"><a name="l00624"></a><span class="lineno">  624</span>       assert(nctraining<=trainingPixels[iclass].size());</div>
+<div class="line"><a name="l00625"></a><span class="lineno">  625</span>       <span class="keywordtype">int</span> index=0;</div>
+<div class="line"><a name="l00626"></a><span class="lineno">  626</span>       <span class="keywordflow">if</span>(bagSize_opt[iclass]<100)</div>
+<div class="line"><a name="l00627"></a><span class="lineno">  627</span>         random_shuffle(trainingPixels[iclass].begin(),trainingPixels[iclass].end());</div>
+<div class="line"><a name="l00628"></a><span class="lineno">  628</span>       <span class="keywordflow">if</span>(verbose_opt[0]>1)</div>
+<div class="line"><a name="l00629"></a><span class="lineno">  629</span>     std::cout << <span class="stringliteral">"nctraining (class "</span> << iclass << <span class="stringliteral">"): "</span> << nctraining << std::endl;</div>
+<div class="line"><a name="l00630"></a><span class="lineno">  630</span>       trainingFeatures[iclass].resize(nctraining);</div>
+<div class="line"><a name="l00631"></a><span class="lineno">  631</span>       <span class="keywordflow">for</span>(<span class="keywordtype">int</span> isample=0;isample<nctraining;++isample){</div>
+<div class="line"><a name="l00632"></a><span class="lineno">  632</span>         <span class="comment">//scale pixel values according to scale and offset!!!</span></div>
+<div class="line"><a name="l00633"></a><span class="lineno">  633</span>         <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iband=0;iband<nband;++iband){</div>
+<div class="line"><a name="l00634"></a><span class="lineno">  634</span>           <span class="keywordtype">float</span> value=trainingPixels[iclass][isample][iband+startBand];</div>
+<div class="line"><a name="l00635"></a><span class="lineno">  635</span>           trainingFeatures[iclass][isample].push_back((value-offset[ibag][iband])/scale[ibag][iband]);</div>
+<div class="line"><a name="l00636"></a><span class="lineno">  636</span>         }</div>
+<div class="line"><a name="l00637"></a><span class="lineno">  637</span>       }</div>
+<div class="line"><a name="l00638"></a><span class="lineno">  638</span>       assert(trainingFeatures[iclass].size()==nctraining);</div>
+<div class="line"><a name="l00639"></a><span class="lineno">  639</span>     }</div>
+<div class="line"><a name="l00640"></a><span class="lineno">  640</span>     </div>
+<div class="line"><a name="l00641"></a><span class="lineno">  641</span>     <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> nFeatures=trainingFeatures[0][0].size();</div>
+<div class="line"><a name="l00642"></a><span class="lineno">  642</span>     <span class="keywordflow">if</span>(verbose_opt[0]>=1)</div>
+<div class="line"><a name="l00643"></a><span class="lineno">  643</span>       std::cout << <span class="stringliteral">"number of features: "</span> << nFeatures << std::endl;</div>
+<div class="line"><a name="l00644"></a><span class="lineno">  644</span>     <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> ntraining=0;</div>
+<div class="line"><a name="l00645"></a><span class="lineno">  645</span>     <span class="keywordflow">for</span>(<span class="keywordtype">short</span> iclass=0;iclass<nclass;++iclass)</div>
+<div class="line"><a name="l00646"></a><span class="lineno">  646</span>       ntraining+=trainingFeatures[iclass].size();</div>
+<div class="line"><a name="l00647"></a><span class="lineno">  647</span>     <span class="keywordflow">if</span>(verbose_opt[0]>=1)</div>
+<div class="line"><a name="l00648"></a><span class="lineno">  648</span>       std::cout << <span class="stringliteral">"training size over all classes: "</span> << ntraining << std::endl;</div>
+<div class="line"><a name="l00649"></a><span class="lineno">  649</span> </div>
+<div class="line"><a name="l00650"></a><span class="lineno">  650</span>     prob[ibag].l=ntraining;</div>
+<div class="line"><a name="l00651"></a><span class="lineno">  651</span>     prob[ibag].y = Malloc(<span class="keywordtype">double</span>,prob[ibag].l);</div>
+<div class="line"><a name="l00652"></a><span class="lineno">  652</span>     prob[ibag].x = Malloc(<span class="keyword">struct</span> <a class="code" href="structsvm__node.html">svm_node</a> *,prob[ibag].l);</div>
+<div class="line"><a name="l00653"></a><span class="lineno">  653</span>     x_space[ibag] = Malloc(<span class="keyword">struct</span> <a class="code" href="structsvm__node.html">svm_node</a>,(nFeatures+1)*ntraining);</div>
+<div class="line"><a name="l00654"></a><span class="lineno">  654</span>     <span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> spaceIndex=0;</div>
+<div class="line"><a name="l00655"></a><span class="lineno">  655</span>     <span class="keywordtype">int</span> lIndex=0;</div>
+<div class="line"><a name="l00656"></a><span class="lineno">  656</span>     <span class="keywordflow">for</span>(<span class="keywordtype">short</span> iclass=0;iclass<nclass;++iclass){</div>
+<div class="line"><a name="l00657"></a><span class="lineno">  657</span>       <span class="keywordflow">for</span>(<span class="keywordtype">int</span> isample=0;isample<trainingFeatures[iclass].size();++isample){</div>
+<div class="line"><a name="l00658"></a><span class="lineno">  658</span>         prob[ibag].x[lIndex]=&(x_space[ibag][spaceIndex]);</div>
+<div class="line"><a name="l00659"></a><span class="lineno">  659</span>         <span class="keywordflow">for</span>(<span class="keywordtype">int</span> ifeature=0;ifeature<nFeatures;++ifeature){</div>
+<div class="line"><a name="l00660"></a><span class="lineno">  660</span>           x_space[ibag][spaceIndex].index=ifeature+1;</div>
+<div class="line"><a name="l00661"></a><span class="lineno">  661</span>           x_space[ibag][spaceIndex].value=trainingFeatures[iclass][isample][ifeature];</div>
+<div class="line"><a name="l00662"></a><span class="lineno">  662</span>           ++spaceIndex;</div>
+<div class="line"><a name="l00663"></a><span class="lineno">  663</span>         }</div>
+<div class="line"><a name="l00664"></a><span class="lineno">  664</span>         x_space[ibag][spaceIndex++].index=-1;</div>
+<div class="line"><a name="l00665"></a><span class="lineno">  665</span>         prob[ibag].y[lIndex]=iclass;</div>
+<div class="line"><a name="l00666"></a><span class="lineno">  666</span>         ++lIndex;</div>
+<div class="line"><a name="l00667"></a><span class="lineno">  667</span>       }</div>
+<div class="line"><a name="l00668"></a><span class="lineno">  668</span>     }</div>
+<div class="line"><a name="l00669"></a><span class="lineno">  669</span>     assert(lIndex==prob[ibag].l);</div>
+<div class="line"><a name="l00670"></a><span class="lineno">  670</span> </div>
+<div class="line"><a name="l00671"></a><span class="lineno">  671</span>     <span class="comment">//set SVM parameters through command line options</span></div>
+<div class="line"><a name="l00672"></a><span class="lineno">  672</span>     param[ibag].svm_type = svmMap[svm_type_opt[0]];</div>
+<div class="line"><a name="l00673"></a><span class="lineno">  673</span>     param[ibag].kernel_type = kernelMap[kernel_type_opt[0]];</div>
+<div class="line"><a name="l00674"></a><span class="lineno">  674</span>     param[ibag].degree = kernel_degree_opt[0];</div>
+<div class="line"><a name="l00675"></a><span class="lineno">  675</span>     param[ibag].gamma = (gamma_opt[0]>0)? gamma_opt[0] : 1.0/nFeatures;</div>
+<div class="line"><a name="l00676"></a><span class="lineno">  676</span>     param[ibag].coef0 = coef0_opt[0];</div>
+<div class="line"><a name="l00677"></a><span class="lineno">  677</span>     param[ibag].nu = nu_opt[0];</div>
+<div class="line"><a name="l00678"></a><span class="lineno">  678</span>     param[ibag].cache_size = cache_opt[0];</div>
+<div class="line"><a name="l00679"></a><span class="lineno">  679</span>     param[ibag].C = ccost_opt[0];</div>
+<div class="line"><a name="l00680"></a><span class="lineno">  680</span>     param[ibag].eps = epsilon_tol_opt[0];</div>
+<div class="line"><a name="l00681"></a><span class="lineno">  681</span>     param[ibag].p = epsilon_loss_opt[0];</div>
+<div class="line"><a name="l00682"></a><span class="lineno">  682</span>     param[ibag].shrinking = (shrinking_opt[0])? 1 : 0;</div>
+<div class="line"><a name="l00683"></a><span class="lineno">  683</span>     param[ibag].probability = (prob_est_opt[0])? 1 : 0;</div>
+<div class="line"><a name="l00684"></a><span class="lineno">  684</span>     param[ibag].nr_weight = 0;<span class="comment">//not used: I use priors and balancing</span></div>
+<div class="line"><a name="l00685"></a><span class="lineno">  685</span>     param[ibag].weight_label = NULL;</div>
+<div class="line"><a name="l00686"></a><span class="lineno">  686</span>     param[ibag].weight = NULL;</div>
+<div class="line"><a name="l00687"></a><span class="lineno">  687</span>     param[ibag].verbose=(verbose_opt[0]>1)? <span class="keyword">true</span>:<span class="keyword">false</span>;</div>
+<div class="line"><a name="l00688"></a><span class="lineno">  688</span> </div>
+<div class="line"><a name="l00689"></a><span class="lineno">  689</span>     <span class="keywordflow">if</span>(verbose_opt[0]>1)</div>
+<div class="line"><a name="l00690"></a><span class="lineno">  690</span>       std::cout << <span class="stringliteral">"checking parameters"</span> << std::endl;</div>
+<div class="line"><a name="l00691"></a><span class="lineno">  691</span>     svm_check_parameter(&prob[ibag],&param[ibag]);</div>
+<div class="line"><a name="l00692"></a><span class="lineno">  692</span>     <span class="keywordflow">if</span>(verbose_opt[0])</div>
+<div class="line"><a name="l00693"></a><span class="lineno">  693</span>       std::cout << <span class="stringliteral">"parameters ok, training"</span> << std::endl;</div>
+<div class="line"><a name="l00694"></a><span class="lineno">  694</span>     svm[ibag]=svm_train(&prob[ibag],&param[ibag]);</div>
+<div class="line"><a name="l00695"></a><span class="lineno">  695</span>     <span class="keywordflow">if</span>(verbose_opt[0]>1)</div>
+<div class="line"><a name="l00696"></a><span class="lineno">  696</span>       std::cout << <span class="stringliteral">"SVM is now trained"</span> << std::endl;</div>
+<div class="line"><a name="l00697"></a><span class="lineno">  697</span>     <span class="keywordflow">if</span>(cv_opt[0]>1){</div>
+<div class="line"><a name="l00698"></a><span class="lineno">  698</span>       <span class="keywordflow">if</span>(verbose_opt[0]>1)</div>
+<div class="line"><a name="l00699"></a><span class="lineno">  699</span>     std::cout << <span class="stringliteral">"Cross validating"</span> << std::endl;</div>
+<div class="line"><a name="l00700"></a><span class="lineno">  700</span>       <span class="keywordtype">double</span> *target = Malloc(<span class="keywordtype">double</span>,prob[ibag].l);</div>
+<div class="line"><a name="l00701"></a><span class="lineno">  701</span>       svm_cross_validation(&prob[ibag],&param[ibag],cv_opt[0],target);</div>
+<div class="line"><a name="l00702"></a><span class="lineno">  702</span>       assert(param[ibag].svm_type != EPSILON_SVR&&param[ibag].svm_type != NU_SVR);<span class="comment">//only for regression</span></div>
+<div class="line"><a name="l00703"></a><span class="lineno">  703</span> </div>
+<div class="line"><a name="l00704"></a><span class="lineno">  704</span>       <span class="keywordflow">for</span>(<span class="keywordtype">int</span> i=0;i<prob[ibag].l;i++){</div>
+<div class="line"><a name="l00705"></a><span class="lineno">  705</span>     <span class="keywordtype">string</span> refClassName=nameVector[prob[ibag].y[i]];</div>
+<div class="line"><a name="l00706"></a><span class="lineno">  706</span>     <span class="keywordtype">string</span> className=nameVector[target[i]];</div>
+<div class="line"><a name="l00707"></a><span class="lineno">  707</span>     <span class="keywordflow">if</span>(classValueMap.size())</div>
+<div class="line"><a name="l00708"></a><span class="lineno">  708</span>       cm.incrementResult(type2string<short>(classValueMap[refClassName]),type2string<short>(classValueMap[className]),1.0/nbag);</div>
+<div class="line"><a name="l00709"></a><span class="lineno">  709</span>     <span class="keywordflow">else</span></div>
+<div class="line"><a name="l00710"></a><span class="lineno">  710</span>       cm.incrementResult(cm.getClass(prob[ibag].y[i]),cm.getClass(target[i]),1.0/nbag);</div>
+<div class="line"><a name="l00711"></a><span class="lineno">  711</span>       }</div>
+<div class="line"><a name="l00712"></a><span class="lineno">  712</span>       free(target);</div>
+<div class="line"><a name="l00713"></a><span class="lineno">  713</span>     }</div>
+<div class="line"><a name="l00714"></a><span class="lineno">  714</span>     <span class="comment">// *NOTE* Because svm_model contains pointers to svm_problem, you can</span></div>
+<div class="line"><a name="l00715"></a><span class="lineno">  715</span>     <span class="comment">// not free the memory used by svm_problem if you are still using the</span></div>
+<div class="line"><a name="l00716"></a><span class="lineno">  716</span>     <span class="comment">// svm_model produced by svm_train(). </span></div>
+<div class="line"><a name="l00717"></a><span class="lineno">  717</span>   }<span class="comment">//for ibag</span></div>
+<div class="line"><a name="l00718"></a><span class="lineno">  718</span>   <span class="keywordflow">if</span>(cv_opt[0]>1){</div>
+<div class="line"><a name="l00719"></a><span class="lineno">  719</span>     assert(cm.nReference());</div>
+<div class="line"><a name="l00720"></a><span class="lineno">  720</span>     cm.setFormat(cmformat_opt[0]);</div>
+<div class="line"><a name="l00721"></a><span class="lineno">  721</span>     cm.reportSE95(<span class="keyword">false</span>);</div>
+<div class="line"><a name="l00722"></a><span class="lineno">  722</span>     std::cout << cm << std::endl;</div>
+<div class="line"><a name="l00723"></a><span class="lineno">  723</span>     <span class="comment">// cout << "class #samples userAcc prodAcc" << endl;</span></div>
+<div class="line"><a name="l00724"></a><span class="lineno">  724</span>     <span class="comment">// double se95_ua=0;</span></div>
+<div class="line"><a name="l00725"></a><span class="lineno">  725</span>     <span class="comment">// double se95_pa=0;</span></div>
+<div class="line"><a name="l00726"></a><span class="lineno">  726</span>     <span class="comment">// double se95_oa=0;</span></div>
+<div class="line"><a name="l00727"></a><span class="lineno">  727</span>     <span class="comment">// double dua=0;</span></div>
+<div class="line"><a name="l00728"></a><span class="lineno">  728</span>     <span class="comment">// double dpa=0;</span></div>
+<div class="line"><a name="l00729"></a><span class="lineno">  729</span>     <span class="comment">// double doa=0;</span></div>
+<div class="line"><a name="l00730"></a><span class="lineno">  730</span>     <span class="comment">// for(short iclass=0;iclass<cm.nClasses();++iclass){</span></div>
+<div class="line"><a name="l00731"></a><span class="lineno">  731</span>     <span class="comment">//   dua=cm.ua(cm.getClass(iclass),&se95_ua);</span></div>
+<div class="line"><a name="l00732"></a><span class="lineno">  732</span>     <span class="comment">//   dpa=cm.pa(cm.getClass(iclass),&se95_pa);</span></div>
+<div class="line"><a name="l00733"></a><span class="lineno">  733</span>     <span class="comment">//   cout << cm.getClass(iclass) << " " << cm.nReference(cm.getClass(iclass)) << " " << dua << " (" << se95_ua << ")" << " " << dpa << " (" << se95_pa << ")" << endl;</span></div>
+<div class="line"><a name="l00734"></a><span class="lineno">  734</span>     <span class="comment">// }</span></div>
+<div class="line"><a name="l00735"></a><span class="lineno">  735</span>     <span class="comment">// std::cout << "Kappa: " << cm.kappa() << std::endl;</span></div>
+<div class="line"><a name="l00736"></a><span class="lineno">  736</span>     <span class="comment">// doa=cm.oa(&se95_oa);</span></div>
+<div class="line"><a name="l00737"></a><span class="lineno">  737</span>     <span class="comment">// std::cout << "Overall Accuracy: " << 100*doa << " (" << 100*se95_oa << ")"  << std::endl;</span></div>
+<div class="line"><a name="l00738"></a><span class="lineno">  738</span>   }</div>
+<div class="line"><a name="l00739"></a><span class="lineno">  739</span> </div>
+<div class="line"><a name="l00740"></a><span class="lineno">  740</span>   <span class="comment">//--------------------------------- end of training -----------------------------------</span></div>
+<div class="line"><a name="l00741"></a><span class="lineno">  741</span>   <span class="keywordflow">if</span>(input_opt.empty())</div>
+<div class="line"><a name="l00742"></a><span class="lineno">  742</span>     exit(0);</div>
+<div class="line"><a name="l00743"></a><span class="lineno">  743</span> </div>
+<div class="line"><a name="l00744"></a><span class="lineno">  744</span>   <span class="keyword">const</span> <span class="keywordtype">char</span>* pszMessage;</div>
+<div class="line"><a name="l00745"></a><span class="lineno">  745</span>   <span class="keywordtype">void</span>* pProgressArg=NULL;</div>
+<div class="line"><a name="l00746"></a><span class="lineno">  746</span>   GDALProgressFunc pfnProgress=GDALTermProgress;</div>
+<div class="line"><a name="l00747"></a><span class="lineno">  747</span>   <span class="keywordtype">float</span> progress=0;</div>
+<div class="line"><a name="l00748"></a><span class="lineno">  748</span>   <span class="keywordflow">if</span>(!verbose_opt[0])</div>
+<div class="line"><a name="l00749"></a><span class="lineno">  749</span>     pfnProgress(progress,pszMessage,pProgressArg);</div>
+<div class="line"><a name="l00750"></a><span class="lineno">  750</span>   <span class="comment">//-------------------------------- open image file ------------------------------------</span></div>
+<div class="line"><a name="l00751"></a><span class="lineno">  751</span>   <span class="keywordtype">bool</span> inputIsRaster=<span class="keyword">false</span>;</div>
+<div class="line"><a name="l00752"></a><span class="lineno">  752</span>   <a class="code" href="classImgReaderOgr.html">ImgReaderOgr</a> imgReaderOgr;</div>
+<div class="line"><a name="l00753"></a><span class="lineno">  753</span>   <span class="keywordflow">try</span>{</div>
+<div class="line"><a name="l00754"></a><span class="lineno">  754</span>     imgReaderOgr.open(input_opt[0]);</div>
+<div class="line"><a name="l00755"></a><span class="lineno">  755</span>     imgReaderOgr.close();</div>
+<div class="line"><a name="l00756"></a><span class="lineno">  756</span>   }</div>
+<div class="line"><a name="l00757"></a><span class="lineno">  757</span>   <span class="keywordflow">catch</span>(<span class="keywordtype">string</span> errorString){</div>
+<div class="line"><a name="l00758"></a><span class="lineno">  758</span>     inputIsRaster=<span class="keyword">true</span>;</div>
+<div class="line"><a name="l00759"></a><span class="lineno">  759</span>   }</div>
+<div class="line"><a name="l00760"></a><span class="lineno">  760</span>   <span class="keywordflow">if</span>(inputIsRaster){</div>
+<div class="line"><a name="l00761"></a><span class="lineno">  761</span>     <a class="code" href="classImgReaderGdal.html">ImgReaderGdal</a> testImage;</div>
+<div class="line"><a name="l00762"></a><span class="lineno">  762</span>     <span class="keywordflow">try</span>{</div>
+<div class="line"><a name="l00763"></a><span class="lineno">  763</span>       <span class="keywordflow">if</span>(verbose_opt[0]>=1)</div>
+<div class="line"><a name="l00764"></a><span class="lineno">  764</span>         std::cout << <span class="stringliteral">"opening image "</span> << input_opt[0] << std::endl; </div>
+<div class="line"><a name="l00765"></a><span class="lineno">  765</span>       testImage.open(input_opt[0]);</div>
+<div class="line"><a name="l00766"></a><span class="lineno">  766</span>     }</div>
+<div class="line"><a name="l00767"></a><span class="lineno">  767</span>     <span class="keywordflow">catch</span>(<span class="keywordtype">string</span> error){</div>
+<div class="line"><a name="l00768"></a><span class="lineno">  768</span>       cerr << error << std::endl;</div>
+<div class="line"><a name="l00769"></a><span class="lineno">  769</span>       exit(2);</div>
+<div class="line"><a name="l00770"></a><span class="lineno">  770</span>     }</div>
+<div class="line"><a name="l00771"></a><span class="lineno">  771</span>     <a class="code" href="classImgReaderGdal.html">ImgReaderGdal</a> priorReader;</div>
+<div class="line"><a name="l00772"></a><span class="lineno">  772</span>     <span class="keywordflow">if</span>(priorimg_opt.size()){</div>
+<div class="line"><a name="l00773"></a><span class="lineno">  773</span>       <span class="keywordflow">try</span>{</div>
+<div class="line"><a name="l00774"></a><span class="lineno">  774</span>     <span class="keywordflow">if</span>(verbose_opt[0]>=1)</div>
+<div class="line"><a name="l00775"></a><span class="lineno">  775</span>           std::cout << <span class="stringliteral">"opening prior image "</span> << priorimg_opt[0] << std::endl;</div>
+<div class="line"><a name="l00776"></a><span class="lineno">  776</span>         priorReader.open(priorimg_opt[0]);</div>
+<div class="line"><a name="l00777"></a><span class="lineno">  777</span>         assert(priorReader.nrOfCol()==testImage.nrOfCol());</div>
+<div class="line"><a name="l00778"></a><span class="lineno">  778</span>         assert(priorReader.nrOfRow()==testImage.nrOfRow());</div>
+<div class="line"><a name="l00779"></a><span class="lineno">  779</span>       }</div>
+<div class="line"><a name="l00780"></a><span class="lineno">  780</span>       <span class="keywordflow">catch</span>(<span class="keywordtype">string</span> error){</div>
+<div class="line"><a name="l00781"></a><span class="lineno">  781</span>         cerr << error << std::endl;</div>
+<div class="line"><a name="l00782"></a><span class="lineno">  782</span>         exit(2);</div>
+<div class="line"><a name="l00783"></a><span class="lineno">  783</span>       }</div>
+<div class="line"><a name="l00784"></a><span class="lineno">  784</span>       <span class="keywordflow">catch</span>(...){</div>
+<div class="line"><a name="l00785"></a><span class="lineno">  785</span>         cerr << <span class="stringliteral">"error catched"</span> << std::endl;</div>
+<div class="line"><a name="l00786"></a><span class="lineno">  786</span>         exit(1);</div>
+<div class="line"><a name="l00787"></a><span class="lineno">  787</span>       }</div>
+<div class="line"><a name="l00788"></a><span class="lineno">  788</span>     }</div>
+<div class="line"><a name="l00789"></a><span class="lineno">  789</span> </div>
+<div class="line"><a name="l00790"></a><span class="lineno">  790</span>     <span class="keywordtype">int</span> nrow=testImage.nrOfRow();</div>
+<div class="line"><a name="l00791"></a><span class="lineno">  791</span>     <span class="keywordtype">int</span> ncol=testImage.nrOfCol();</div>
+<div class="line"><a name="l00792"></a><span class="lineno">  792</span>     <span class="keywordflow">if</span>(option_opt.findSubstring(<span class="stringliteral">"INTERLEAVE="</span>)==option_opt.end()){</div>
+<div class="line"><a name="l00793"></a><span class="lineno">  793</span>       <span class="keywordtype">string</span> theInterleave=<span class="stringliteral">"INTERLEAVE="</span>;</div>
+<div class="line"><a name="l00794"></a><span class="lineno">  794</span>       theInterleave+=testImage.getInterleave();</div>
+<div class="line"><a name="l00795"></a><span class="lineno">  795</span>       option_opt.push_back(theInterleave);</div>
+<div class="line"><a name="l00796"></a><span class="lineno">  796</span>     }</div>
+<div class="line"><a name="l00797"></a><span class="lineno">  797</span>     vector<char> classOut(ncol);<span class="comment">//classified line for writing to image file</span></div>
+<div class="line"><a name="l00798"></a><span class="lineno">  798</span> </div>
+<div class="line"><a name="l00799"></a><span class="lineno">  799</span>     <span class="comment">//   assert(nband==testImage.nrOfBand());</span></div>
+<div class="line"><a name="l00800"></a><span class="lineno">  800</span>     <a class="code" href="classImgWriterGdal.html">ImgWriterGdal</a> classImageBag;</div>
+<div class="line"><a name="l00801"></a><span class="lineno">  801</span>     <a class="code" href="classImgWriterGdal.html">ImgWriterGdal</a> classImageOut;</div>
+<div class="line"><a name="l00802"></a><span class="lineno">  802</span>     <a class="code" href="classImgWriterGdal.html">ImgWriterGdal</a> probImage;</div>
+<div class="line"><a name="l00803"></a><span class="lineno">  803</span>     <a class="code" href="classImgWriterGdal.html">ImgWriterGdal</a> entropyImage;</div>
+<div class="line"><a name="l00804"></a><span class="lineno">  804</span> </div>
+<div class="line"><a name="l00805"></a><span class="lineno">  805</span>     <span class="keywordtype">string</span> imageType=testImage.getImageType();</div>
+<div class="line"><a name="l00806"></a><span class="lineno">  806</span>     <span class="keywordflow">if</span>(oformat_opt.size())<span class="comment">//default</span></div>
+<div class="line"><a name="l00807"></a><span class="lineno">  807</span>       imageType=oformat_opt[0];</div>
+<div class="line"><a name="l00808"></a><span class="lineno">  808</span>     <span class="keywordflow">try</span>{</div>
+<div class="line"><a name="l00809"></a><span class="lineno">  809</span>       assert(output_opt.size());</div>
+<div class="line"><a name="l00810"></a><span class="lineno">  810</span>       <span class="keywordflow">if</span>(verbose_opt[0]>=1)</div>
+<div class="line"><a name="l00811"></a><span class="lineno">  811</span>         std::cout << <span class="stringliteral">"opening class image for writing output "</span> << output_opt[0] << std::endl;</div>
+<div class="line"><a name="l00812"></a><span class="lineno">  812</span>       <span class="keywordflow">if</span>(classBag_opt.size()){</div>
+<div class="line"><a name="l00813"></a><span class="lineno">  813</span>         classImageBag.open(classBag_opt[0],ncol,nrow,nbag,GDT_Byte,imageType,option_opt);</div>
+<div class="line"><a name="l00814"></a><span class="lineno">  814</span>     classImageBag.GDALSetNoDataValue(nodata_opt[0]);</div>
+<div class="line"><a name="l00815"></a><span class="lineno">  815</span>         classImageBag.copyGeoTransform(testImage);</div>
+<div class="line"><a name="l00816"></a><span class="lineno">  816</span>         classImageBag.setProjection(testImage.getProjection());</div>
+<div class="line"><a name="l00817"></a><span class="lineno">  817</span>       }</div>
+<div class="line"><a name="l00818"></a><span class="lineno">  818</span>       classImageOut.open(output_opt[0],ncol,nrow,1,GDT_Byte,imageType,option_opt);</div>
+<div class="line"><a name="l00819"></a><span class="lineno">  819</span>       classImageOut.GDALSetNoDataValue(nodata_opt[0]);</div>
+<div class="line"><a name="l00820"></a><span class="lineno">  820</span>       classImageOut.copyGeoTransform(testImage);</div>
+<div class="line"><a name="l00821"></a><span class="lineno">  821</span>       classImageOut.setProjection(testImage.getProjection());</div>
+<div class="line"><a name="l00822"></a><span class="lineno">  822</span>       <span class="keywordflow">if</span>(colorTable_opt.size())</div>
+<div class="line"><a name="l00823"></a><span class="lineno">  823</span>         classImageOut.setColorTable(colorTable_opt[0],0);</div>
+<div class="line"><a name="l00824"></a><span class="lineno">  824</span>       <span class="keywordflow">if</span>(prob_opt.size()){</div>
+<div class="line"><a name="l00825"></a><span class="lineno">  825</span>         probImage.open(prob_opt[0],ncol,nrow,nclass,GDT_Byte,imageType,option_opt);</div>
+<div class="line"><a name="l00826"></a><span class="lineno">  826</span>     probImage.GDALSetNoDataValue(nodata_opt[0]);</div>
+<div class="line"><a name="l00827"></a><span class="lineno">  827</span>         probImage.copyGeoTransform(testImage);</div>
+<div class="line"><a name="l00828"></a><span class="lineno">  828</span>         probImage.setProjection(testImage.getProjection());</div>
+<div class="line"><a name="l00829"></a><span class="lineno">  829</span>       }</div>
+<div class="line"><a name="l00830"></a><span class="lineno">  830</span>       <span class="keywordflow">if</span>(entropy_opt.size()){</div>
+<div class="line"><a name="l00831"></a><span class="lineno">  831</span>         entropyImage.open(entropy_opt[0],ncol,nrow,1,GDT_Byte,imageType,option_opt);</div>
+<div class="line"><a name="l00832"></a><span class="lineno">  832</span>     entropyImage.GDALSetNoDataValue(nodata_opt[0]);</div>
+<div class="line"><a name="l00833"></a><span class="lineno">  833</span>         entropyImage.copyGeoTransform(testImage);</div>
+<div class="line"><a name="l00834"></a><span class="lineno">  834</span>         entropyImage.setProjection(testImage.getProjection());</div>
 <div class="line"><a name="l00835"></a><span class="lineno">  835</span>       }</div>
-<div class="line"><a name="l00836"></a><span class="lineno">  836</span>       mask_opt.clear();</div>
-<div class="line"><a name="l00837"></a><span class="lineno">  837</span>       mask_opt.push_back(<span class="stringliteral">"/vsimem/mask.tif"</span>);</div>
-<div class="line"><a name="l00838"></a><span class="lineno">  838</span>     }</div>
-<div class="line"><a name="l00839"></a><span class="lineno">  839</span>     <a class="code" href="classImgReaderGdal.html">ImgReaderGdal</a> maskReader;</div>
-<div class="line"><a name="l00840"></a><span class="lineno">  840</span>     <span class="keywordflow">if</span>(mask_opt.size()){</div>
-<div class="line"><a name="l00841"></a><span class="lineno">  841</span>       <span class="keywordflow">try</span>{</div>
-<div class="line"><a name="l00842"></a><span class="lineno">  842</span>         <span class="keywordflow">if</span>(verbose_opt[0]>=1)</div>
-<div class="line"><a name="l00843"></a><span class="lineno">  843</span>           std::cout << <span class="stringliteral">"opening mask image file "</span> << mask_opt[0] << std::endl;</div>
-<div class="line"><a name="l00844"></a><span class="lineno">  844</span>         maskReader.open(mask_opt[0]);</div>
-<div class="line"><a name="l00845"></a><span class="lineno">  845</span>       }</div>
-<div class="line"><a name="l00846"></a><span class="lineno">  846</span>       <span class="keywordflow">catch</span>(<span class="keywordtype">string</span> error){</div>
-<div class="line"><a name="l00847"></a><span class="lineno">  847</span>         cerr << error << std::endl;</div>
-<div class="line"><a name="l00848"></a><span class="lineno">  848</span>         exit(2);</div>
-<div class="line"><a name="l00849"></a><span class="lineno">  849</span>       }</div>
-<div class="line"><a name="l00850"></a><span class="lineno">  850</span>       <span class="keywordflow">catch</span>(...){</div>
-<div class="line"><a name="l00851"></a><span class="lineno">  851</span>         cerr << <span class="stringliteral">"error catched"</span> << std::endl;</div>
-<div class="line"><a name="l00852"></a><span class="lineno">  852</span>         exit(1);</div>
+<div class="line"><a name="l00836"></a><span class="lineno">  836</span>     }</div>
+<div class="line"><a name="l00837"></a><span class="lineno">  837</span>     <span class="keywordflow">catch</span>(<span class="keywordtype">string</span> error){</div>
+<div class="line"><a name="l00838"></a><span class="lineno">  838</span>       cerr << error << std::endl;</div>
+<div class="line"><a name="l00839"></a><span class="lineno">  839</span>     }</div>
+<div class="line"><a name="l00840"></a><span class="lineno">  840</span>   </div>
+<div class="line"><a name="l00841"></a><span class="lineno">  841</span>     <a class="code" href="classImgWriterGdal.html">ImgWriterGdal</a> maskWriter;</div>
+<div class="line"><a name="l00842"></a><span class="lineno">  842</span> </div>
+<div class="line"><a name="l00843"></a><span class="lineno">  843</span>     <span class="keywordflow">if</span>(maskIsVector){</div>
+<div class="line"><a name="l00844"></a><span class="lineno">  844</span>       <span class="keywordflow">try</span>{</div>
+<div class="line"><a name="l00845"></a><span class="lineno">  845</span>     maskWriter.open(<span class="stringliteral">"/vsimem/mask.tif"</span>,ncol,nrow,1,GDT_Float32,imageType,option_opt);</div>
+<div class="line"><a name="l00846"></a><span class="lineno">  846</span>     maskWriter.GDALSetNoDataValue(nodata_opt[0]);</div>
+<div class="line"><a name="l00847"></a><span class="lineno">  847</span>         maskWriter.copyGeoTransform(testImage);</div>
+<div class="line"><a name="l00848"></a><span class="lineno">  848</span>         maskWriter.setProjection(testImage.getProjection());</div>
+<div class="line"><a name="l00849"></a><span class="lineno">  849</span>     vector<double> burnValues(1,1);<span class="comment">//burn value is 1 (single band)</span></div>
+<div class="line"><a name="l00850"></a><span class="lineno">  850</span>     maskWriter.rasterizeOgr(extentReader,burnValues);</div>
+<div class="line"><a name="l00851"></a><span class="lineno">  851</span>     extentReader.close();</div>
+<div class="line"><a name="l00852"></a><span class="lineno">  852</span>     maskWriter.close();</div>
 <div class="line"><a name="l00853"></a><span class="lineno">  853</span>       }</div>
-<div class="line"><a name="l00854"></a><span class="lineno">  854</span>     }</div>
-<div class="line"><a name="l00855"></a><span class="lineno">  855</span> </div>
-<div class="line"><a name="l00856"></a><span class="lineno">  856</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iline=0;iline<nrow;++iline){</div>
-<div class="line"><a name="l00857"></a><span class="lineno">  857</span>       vector<float> buffer(ncol);</div>
-<div class="line"><a name="l00858"></a><span class="lineno">  858</span>       vector<short> lineMask;</div>
-<div class="line"><a name="l00859"></a><span class="lineno">  859</span>       <a class="code" href="classVector2d.html">Vector2d<float></a> linePrior;</div>
-<div class="line"><a name="l00860"></a><span class="lineno">  860</span>       <span class="keywordflow">if</span>(priorimg_opt.size())</div>
-<div class="line"><a name="l00861"></a><span class="lineno">  861</span>      linePrior.resize(nclass,ncol);<span class="comment">//prior prob for each class</span></div>
-<div class="line"><a name="l00862"></a><span class="lineno">  862</span>       <a class="code" href="classVector2d.html">Vector2d<float></a> hpixel(ncol);</div>
-<div class="line"><a name="l00863"></a><span class="lineno">  863</span>       <a class="code" href="classVector2d.html">Vector2d<float></a> probOut(nclass,ncol);<span class="comment">//posterior prob for each (internal) class</span></div>
-<div class="line"><a name="l00864"></a><span class="lineno">  864</span>       vector<float> entropy(ncol);</div>
-<div class="line"><a name="l00865"></a><span class="lineno">  865</span>       <a class="code" href="classVector2d.html">Vector2d<char></a> classBag;<span class="comment">//classified line for writing to image file</span></div>
-<div class="line"><a name="l00866"></a><span class="lineno">  866</span>       <span class="keywordflow">if</span>(classBag_opt.size())</div>
-<div class="line"><a name="l00867"></a><span class="lineno">  867</span>         classBag.resize(nbag,ncol);</div>
-<div class="line"><a name="l00868"></a><span class="lineno">  868</span>       <span class="keywordflow">try</span>{</div>
-<div class="line"><a name="l00869"></a><span class="lineno">  869</span>         <span class="keywordflow">if</span>(band_opt.size()){</div>
-<div class="line"><a name="l00870"></a><span class="lineno">  870</span>           <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iband=0;iband<band_opt.size();++iband){</div>
-<div class="line"><a name="l00871"></a><span class="lineno">  871</span>             <span class="keywordflow">if</span>(verbose_opt[0]==2)</div>
-<div class="line"><a name="l00872"></a><span class="lineno">  872</span>               std::cout << <span class="stringliteral">"reading band "</span> << band_opt[iband] << std::endl;</div>
-<div class="line"><a name="l00873"></a><span class="lineno">  873</span>             assert(band_opt[iband]>=0);</div>
-<div class="line"><a name="l00874"></a><span class="lineno">  874</span>             assert(band_opt[iband]<testImage.nrOfBand());</div>
-<div class="line"><a name="l00875"></a><span class="lineno">  875</span>             testImage.readData(buffer,GDT_Float32,iline,band_opt[iband]);</div>
-<div class="line"><a name="l00876"></a><span class="lineno">  876</span>             <span class="keywordflow">for</span>(<span class="keywordtype">int</span> icol=0;icol<ncol;++icol)</div>
-<div class="line"><a name="l00877"></a><span class="lineno">  877</span>               hpixel[icol].push_back(buffer[icol]);</div>
-<div class="line"><a name="l00878"></a><span class="lineno">  878</span>           }</div>
-<div class="line"><a name="l00879"></a><span class="lineno">  879</span>         }</div>
-<div class="line"><a name="l00880"></a><span class="lineno">  880</span>         <span class="keywordflow">else</span>{</div>
-<div class="line"><a name="l00881"></a><span class="lineno">  881</span>           <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iband=bstart_opt[0];iband<bstart_opt[0]+nband;++iband){</div>
-<div class="line"><a name="l00882"></a><span class="lineno">  882</span>             <span class="keywordflow">if</span>(verbose_opt[0]==2)</div>
-<div class="line"><a name="l00883"></a><span class="lineno">  883</span>               std::cout << <span class="stringliteral">"reading band "</span> << iband << std::endl;</div>
-<div class="line"><a name="l00884"></a><span class="lineno">  884</span>             assert(iband>=0);</div>
-<div class="line"><a name="l00885"></a><span class="lineno">  885</span>             assert(iband<testImage.nrOfBand());</div>
-<div class="line"><a name="l00886"></a><span class="lineno">  886</span>             testImage.readData(buffer,GDT_Float32,iline,iband);</div>
-<div class="line"><a name="l00887"></a><span class="lineno">  887</span>             <span class="keywordflow">for</span>(<span class="keywordtype">int</span> icol=0;icol<ncol;++icol)</div>
-<div class="line"><a name="l00888"></a><span class="lineno">  888</span>               hpixel[icol].push_back(buffer[icol]);</div>
-<div class="line"><a name="l00889"></a><span class="lineno">  889</span>           }</div>
-<div class="line"><a name="l00890"></a><span class="lineno">  890</span>         }</div>
-<div class="line"><a name="l00891"></a><span class="lineno">  891</span>       }</div>
-<div class="line"><a name="l00892"></a><span class="lineno">  892</span>       <span class="keywordflow">catch</span>(<span class="keywordtype">string</span> theError){</div>
-<div class="line"><a name="l00893"></a><span class="lineno">  893</span>         cerr << <span class="stringliteral">"Error reading "</span> << input_opt[0] << <span class="stringliteral">": "</span> << theError << std::endl;</div>
-<div class="line"><a name="l00894"></a><span class="lineno">  894</span>         exit(3);</div>
-<div class="line"><a name="l00895"></a><span class="lineno">  895</span>       }</div>
-<div class="line"><a name="l00896"></a><span class="lineno">  896</span>       <span class="keywordflow">catch</span>(...){</div>
-<div class="line"><a name="l00897"></a><span class="lineno">  897</span>         cerr << <span class="stringliteral">"error catched"</span> << std::endl;</div>
-<div class="line"><a name="l00898"></a><span class="lineno">  898</span>         exit(3);</div>
-<div class="line"><a name="l00899"></a><span class="lineno">  899</span>       }</div>
-<div class="line"><a name="l00900"></a><span class="lineno">  900</span>       assert(nband==hpixel[0].size());</div>
-<div class="line"><a name="l00901"></a><span class="lineno">  901</span>       <span class="keywordflow">if</span>(verbose_opt[0]>1)</div>
-<div class="line"><a name="l00902"></a><span class="lineno">  902</span>         std::cout << <span class="stringliteral">"used bands: "</span> << nband << std::endl;</div>
-<div class="line"><a name="l00903"></a><span class="lineno">  903</span>       <span class="comment">//read prior</span></div>
-<div class="line"><a name="l00904"></a><span class="lineno">  904</span>       <span class="keywordflow">if</span>(priorimg_opt.size()){</div>
-<div class="line"><a name="l00905"></a><span class="lineno">  905</span>         <span class="keywordflow">try</span>{</div>
-<div class="line"><a name="l00906"></a><span class="lineno">  906</span>       <span class="keywordflow">for</span>(<span class="keywordtype">short</span> iclass=0;iclass<nclass;++iclass){</div>
-<div class="line"><a name="l00907"></a><span class="lineno">  907</span>         <span class="keywordflow">if</span>(verbose_opt.size()>1)</div>
-<div class="line"><a name="l00908"></a><span class="lineno">  908</span>           std::cout << <span class="stringliteral">"Reading "</span> << priorimg_opt[0] << <span class="stringliteral">" band "</span> << iclass << <span class="stringliteral">" line "</span> << iline << std::endl;</div>
-<div class="line"><a name="l00909"></a><span class="lineno">  909</span>         priorReader.readData(linePrior[iclass],GDT_Float32,iline,iclass);</div>
-<div class="line"><a name="l00910"></a><span class="lineno">  910</span>       }</div>
-<div class="line"><a name="l00911"></a><span class="lineno">  911</span>         }</div>
-<div class="line"><a name="l00912"></a><span class="lineno">  912</span>         <span class="keywordflow">catch</span>(<span class="keywordtype">string</span> theError){</div>
-<div class="line"><a name="l00913"></a><span class="lineno">  913</span>       std::cerr << <span class="stringliteral">"Error reading "</span> << priorimg_opt[0] << <span class="stringliteral">": "</span> << theError << std::endl;</div>
-<div class="line"><a name="l00914"></a><span class="lineno">  914</span>           exit(3);</div>
-<div class="line"><a name="l00915"></a><span class="lineno">  915</span>         }</div>
-<div class="line"><a name="l00916"></a><span class="lineno">  916</span>         <span class="keywordflow">catch</span>(...){</div>
-<div class="line"><a name="l00917"></a><span class="lineno">  917</span>           cerr << <span class="stringliteral">"error catched"</span> << std::endl;</div>
-<div class="line"><a name="l00918"></a><span class="lineno">  918</span>           exit(3);</div>
-<div class="line"><a name="l00919"></a><span class="lineno">  919</span>         }</div>
-<div class="line"><a name="l00920"></a><span class="lineno">  920</span>       }</div>
-<div class="line"><a name="l00921"></a><span class="lineno">  921</span>       <span class="keywordtype">double</span> oldRowMask=-1;<span class="comment">//keep track of row mask to optimize number of line readings</span></div>
-<div class="line"><a name="l00922"></a><span class="lineno">  922</span>       <span class="comment">//process per pixel</span></div>
-<div class="line"><a name="l00923"></a><span class="lineno">  923</span>       <span class="keywordflow">for</span>(<span class="keywordtype">int</span> icol=0;icol<ncol;++icol){</div>
-<div class="line"><a name="l00924"></a><span class="lineno">  924</span>         assert(hpixel[icol].size()==nband);</div>
-<div class="line"><a name="l00925"></a><span class="lineno">  925</span>     <span class="keywordtype">bool</span> doClassify=<span class="keyword">true</span>;</div>
-<div class="line"><a name="l00926"></a><span class="lineno">  926</span>         <span class="keywordtype">bool</span> masked=<span class="keyword">false</span>;</div>
-<div class="line"><a name="l00927"></a><span class="lineno">  927</span>     <span class="keywordtype">double</span> geox=0;</div>
-<div class="line"><a name="l00928"></a><span class="lineno">  928</span>     <span class="keywordtype">double</span> geoy=0;</div>
-<div class="line"><a name="l00929"></a><span class="lineno">  929</span>         <span class="keywordflow">if</span>(extent_opt.size()){</div>
-<div class="line"><a name="l00930"></a><span class="lineno">  930</span>       doClassify=<span class="keyword">false</span>;</div>
-<div class="line"><a name="l00931"></a><span class="lineno">  931</span>       testImage.image2geo(icol,iline,geox,geoy);</div>
-<div class="line"><a name="l00932"></a><span class="lineno">  932</span>       <span class="comment">//check enveloppe first</span></div>
-<div class="line"><a name="l00933"></a><span class="lineno">  933</span>       <span class="keywordflow">if</span>(uly>=geoy&&lry<=geoy&&ulx<=geox&&lrx>=geox){</div>
-<div class="line"><a name="l00934"></a><span class="lineno">  934</span>         doClassify=<span class="keyword">true</span>;</div>
-<div class="line"><a name="l00935"></a><span class="lineno">  935</span>       }</div>
-<div class="line"><a name="l00936"></a><span class="lineno">  936</span>       <span class="comment">// if(doClassify){</span></div>
-<div class="line"><a name="l00937"></a><span class="lineno">  937</span>       <span class="comment">//   thePoint.setX(geox);</span></div>
-<div class="line"><a name="l00938"></a><span class="lineno">  938</span>       <span class="comment">//   thePoint.setY(geoy);</span></div>
-<div class="line"><a name="l00939"></a><span class="lineno">  939</span>       <span class="comment">//   readLayer->ResetReading();</span></div>
-<div class="line"><a name="l00940"></a><span class="lineno">  940</span>       <span class="comment">//   while( (readFeature = readLayer->GetNextFeature()) != NULL ){</span></div>
-<div class="line"><a name="l00941"></a><span class="lineno">  941</span>       <span class="comment">//     OGRGeometry *poGeometry;</span></div>
-<div class="line"><a name="l00942"></a><span class="lineno">  942</span>       <span class="comment">//     poGeometry = readFeature->GetGeometryRef();</span></div>
-<div class="line"><a name="l00943"></a><span class="lineno">  943</span>       <span class="comment">//     assert(poGeometry!=NULL);</span></div>
-<div class="line"><a name="l00944"></a><span class="lineno">  944</span>       <span class="comment">//     //check if point is on surface</span></div>
-<div class="line"><a name="l00945"></a><span class="lineno">  945</span>       <span class="comment">//     if(thePoint.Within(poGeometry)){</span></div>
-<div class="line"><a name="l00946"></a><span class="lineno">  946</span>       <span class="comment">//     doClassify=true;</span></div>
-<div class="line"><a name="l00947"></a><span class="lineno">  947</span>       <span class="comment">//     break;</span></div>
-<div class="line"><a name="l00948"></a><span class="lineno">  948</span>       <span class="comment">//     }</span></div>
-<div class="line"><a name="l00949"></a><span class="lineno">  949</span>       <span class="comment">//   }</span></div>
-<div class="line"><a name="l00950"></a><span class="lineno">  950</span>       <span class="comment">// }</span></div>
-<div class="line"><a name="l00951"></a><span class="lineno">  951</span>     }</div>
-<div class="line"><a name="l00952"></a><span class="lineno">  952</span>         <span class="keywordflow">if</span>(mask_opt.size()){</div>
-<div class="line"><a name="l00953"></a><span class="lineno">  953</span>       <span class="comment">//read mask</span></div>
-<div class="line"><a name="l00954"></a><span class="lineno">  954</span>       <span class="keywordtype">double</span> colMask=0;</div>
-<div class="line"><a name="l00955"></a><span class="lineno">  955</span>       <span class="keywordtype">double</span> rowMask=0;</div>
-<div class="line"><a name="l00956"></a><span class="lineno">  956</span> </div>
+<div class="line"><a name="l00854"></a><span class="lineno">  854</span>       <span class="keywordflow">catch</span>(<span class="keywordtype">string</span> error){</div>
+<div class="line"><a name="l00855"></a><span class="lineno">  855</span>         cerr << error << std::endl;</div>
+<div class="line"><a name="l00856"></a><span class="lineno">  856</span>         exit(2);</div>
+<div class="line"><a name="l00857"></a><span class="lineno">  857</span>       }</div>
+<div class="line"><a name="l00858"></a><span class="lineno">  858</span>       <span class="keywordflow">catch</span>(...){</div>
+<div class="line"><a name="l00859"></a><span class="lineno">  859</span>         cerr << <span class="stringliteral">"error catched"</span> << std::endl;</div>
+<div class="line"><a name="l00860"></a><span class="lineno">  860</span>         exit(1);</div>
+<div class="line"><a name="l00861"></a><span class="lineno">  861</span>       }</div>
+<div class="line"><a name="l00862"></a><span class="lineno">  862</span>       mask_opt.clear();</div>
+<div class="line"><a name="l00863"></a><span class="lineno">  863</span>       mask_opt.push_back(<span class="stringliteral">"/vsimem/mask.tif"</span>);</div>
+<div class="line"><a name="l00864"></a><span class="lineno">  864</span>     }</div>
+<div class="line"><a name="l00865"></a><span class="lineno">  865</span>     <a class="code" href="classImgReaderGdal.html">ImgReaderGdal</a> maskReader;</div>
+<div class="line"><a name="l00866"></a><span class="lineno">  866</span>     <span class="keywordflow">if</span>(mask_opt.size()){</div>
+<div class="line"><a name="l00867"></a><span class="lineno">  867</span>       <span class="keywordflow">try</span>{</div>
+<div class="line"><a name="l00868"></a><span class="lineno">  868</span>         <span class="keywordflow">if</span>(verbose_opt[0]>=1)</div>
+<div class="line"><a name="l00869"></a><span class="lineno">  869</span>           std::cout << <span class="stringliteral">"opening mask image file "</span> << mask_opt[0] << std::endl;</div>
+<div class="line"><a name="l00870"></a><span class="lineno">  870</span>         maskReader.open(mask_opt[0]);</div>
+<div class="line"><a name="l00871"></a><span class="lineno">  871</span>       }</div>
+<div class="line"><a name="l00872"></a><span class="lineno">  872</span>       <span class="keywordflow">catch</span>(<span class="keywordtype">string</span> error){</div>
+<div class="line"><a name="l00873"></a><span class="lineno">  873</span>         cerr << error << std::endl;</div>
+<div class="line"><a name="l00874"></a><span class="lineno">  874</span>         exit(2);</div>
+<div class="line"><a name="l00875"></a><span class="lineno">  875</span>       }</div>
+<div class="line"><a name="l00876"></a><span class="lineno">  876</span>       <span class="keywordflow">catch</span>(...){</div>
+<div class="line"><a name="l00877"></a><span class="lineno">  877</span>         cerr << <span class="stringliteral">"error catched"</span> << std::endl;</div>
+<div class="line"><a name="l00878"></a><span class="lineno">  878</span>         exit(1);</div>
+<div class="line"><a name="l00879"></a><span class="lineno">  879</span>       }</div>
+<div class="line"><a name="l00880"></a><span class="lineno">  880</span>     }</div>
+<div class="line"><a name="l00881"></a><span class="lineno">  881</span> </div>
+<div class="line"><a name="l00882"></a><span class="lineno">  882</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iline=0;iline<nrow;++iline){</div>
+<div class="line"><a name="l00883"></a><span class="lineno">  883</span>       vector<float> buffer(ncol);</div>
+<div class="line"><a name="l00884"></a><span class="lineno">  884</span>       vector<short> lineMask;</div>
+<div class="line"><a name="l00885"></a><span class="lineno">  885</span>       <a class="code" href="classVector2d.html">Vector2d<float></a> linePrior;</div>
+<div class="line"><a name="l00886"></a><span class="lineno">  886</span>       <span class="keywordflow">if</span>(priorimg_opt.size())</div>
+<div class="line"><a name="l00887"></a><span class="lineno">  887</span>      linePrior.resize(nclass,ncol);<span class="comment">//prior prob for each class</span></div>
+<div class="line"><a name="l00888"></a><span class="lineno">  888</span>       <a class="code" href="classVector2d.html">Vector2d<float></a> hpixel(ncol);</div>
+<div class="line"><a name="l00889"></a><span class="lineno">  889</span>       <a class="code" href="classVector2d.html">Vector2d<float></a> probOut(nclass,ncol);<span class="comment">//posterior prob for each (internal) class</span></div>
+<div class="line"><a name="l00890"></a><span class="lineno">  890</span>       vector<float> entropy(ncol);</div>
+<div class="line"><a name="l00891"></a><span class="lineno">  891</span>       <a class="code" href="classVector2d.html">Vector2d<char></a> classBag;<span class="comment">//classified line for writing to image file</span></div>
+<div class="line"><a name="l00892"></a><span class="lineno">  892</span>       <span class="keywordflow">if</span>(classBag_opt.size())</div>
+<div class="line"><a name="l00893"></a><span class="lineno">  893</span>         classBag.resize(nbag,ncol);</div>
+<div class="line"><a name="l00894"></a><span class="lineno">  894</span>       <span class="keywordflow">try</span>{</div>
+<div class="line"><a name="l00895"></a><span class="lineno">  895</span>         <span class="keywordflow">if</span>(band_opt.size()){</div>
+<div class="line"><a name="l00896"></a><span class="lineno">  896</span>           <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iband=0;iband<band_opt.size();++iband){</div>
+<div class="line"><a name="l00897"></a><span class="lineno">  897</span>             <span class="keywordflow">if</span>(verbose_opt[0]==2)</div>
+<div class="line"><a name="l00898"></a><span class="lineno">  898</span>               std::cout << <span class="stringliteral">"reading band "</span> << band_opt[iband] << std::endl;</div>
+<div class="line"><a name="l00899"></a><span class="lineno">  899</span>             assert(band_opt[iband]>=0);</div>
+<div class="line"><a name="l00900"></a><span class="lineno">  900</span>             assert(band_opt[iband]<testImage.nrOfBand());</div>
+<div class="line"><a name="l00901"></a><span class="lineno">  901</span>             testImage.readData(buffer,GDT_Float32,iline,band_opt[iband]);</div>
+<div class="line"><a name="l00902"></a><span class="lineno">  902</span>             <span class="keywordflow">for</span>(<span class="keywordtype">int</span> icol=0;icol<ncol;++icol)</div>
+<div class="line"><a name="l00903"></a><span class="lineno">  903</span>               hpixel[icol].push_back(buffer[icol]);</div>
+<div class="line"><a name="l00904"></a><span class="lineno">  904</span>           }</div>
+<div class="line"><a name="l00905"></a><span class="lineno">  905</span>         }</div>
+<div class="line"><a name="l00906"></a><span class="lineno">  906</span>         <span class="keywordflow">else</span>{</div>
+<div class="line"><a name="l00907"></a><span class="lineno">  907</span>           <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iband=0;iband<nband;++iband){</div>
+<div class="line"><a name="l00908"></a><span class="lineno">  908</span>             <span class="keywordflow">if</span>(verbose_opt[0]==2)</div>
+<div class="line"><a name="l00909"></a><span class="lineno">  909</span>               std::cout << <span class="stringliteral">"reading band "</span> << iband << std::endl;</div>
+<div class="line"><a name="l00910"></a><span class="lineno">  910</span>             assert(iband>=0);</div>
+<div class="line"><a name="l00911"></a><span class="lineno">  911</span>             assert(iband<testImage.nrOfBand());</div>
+<div class="line"><a name="l00912"></a><span class="lineno">  912</span>             testImage.readData(buffer,GDT_Float32,iline,iband);</div>
+<div class="line"><a name="l00913"></a><span class="lineno">  913</span>             <span class="keywordflow">for</span>(<span class="keywordtype">int</span> icol=0;icol<ncol;++icol)</div>
+<div class="line"><a name="l00914"></a><span class="lineno">  914</span>               hpixel[icol].push_back(buffer[icol]);</div>
+<div class="line"><a name="l00915"></a><span class="lineno">  915</span>           }</div>
+<div class="line"><a name="l00916"></a><span class="lineno">  916</span>         }</div>
+<div class="line"><a name="l00917"></a><span class="lineno">  917</span>       }</div>
+<div class="line"><a name="l00918"></a><span class="lineno">  918</span>       <span class="keywordflow">catch</span>(<span class="keywordtype">string</span> theError){</div>
+<div class="line"><a name="l00919"></a><span class="lineno">  919</span>         cerr << <span class="stringliteral">"Error reading "</span> << input_opt[0] << <span class="stringliteral">": "</span> << theError << std::endl;</div>
+<div class="line"><a name="l00920"></a><span class="lineno">  920</span>         exit(3);</div>
+<div class="line"><a name="l00921"></a><span class="lineno">  921</span>       }</div>
+<div class="line"><a name="l00922"></a><span class="lineno">  922</span>       <span class="keywordflow">catch</span>(...){</div>
+<div class="line"><a name="l00923"></a><span class="lineno">  923</span>         cerr << <span class="stringliteral">"error catched"</span> << std::endl;</div>
+<div class="line"><a name="l00924"></a><span class="lineno">  924</span>         exit(3);</div>
+<div class="line"><a name="l00925"></a><span class="lineno">  925</span>       }</div>
+<div class="line"><a name="l00926"></a><span class="lineno">  926</span>       assert(nband==hpixel[0].size());</div>
+<div class="line"><a name="l00927"></a><span class="lineno">  927</span>       <span class="keywordflow">if</span>(verbose_opt[0]>1)</div>
+<div class="line"><a name="l00928"></a><span class="lineno">  928</span>         std::cout << <span class="stringliteral">"used bands: "</span> << nband << std::endl;</div>
+<div class="line"><a name="l00929"></a><span class="lineno">  929</span>       <span class="comment">//read prior</span></div>
+<div class="line"><a name="l00930"></a><span class="lineno">  930</span>       <span class="keywordflow">if</span>(priorimg_opt.size()){</div>
+<div class="line"><a name="l00931"></a><span class="lineno">  931</span>         <span class="keywordflow">try</span>{</div>
+<div class="line"><a name="l00932"></a><span class="lineno">  932</span>       <span class="keywordflow">for</span>(<span class="keywordtype">short</span> iclass=0;iclass<nclass;++iclass){</div>
+<div class="line"><a name="l00933"></a><span class="lineno">  933</span>         <span class="keywordflow">if</span>(verbose_opt.size()>1)</div>
+<div class="line"><a name="l00934"></a><span class="lineno">  934</span>           std::cout << <span class="stringliteral">"Reading "</span> << priorimg_opt[0] << <span class="stringliteral">" band "</span> << iclass << <span class="stringliteral">" line "</span> << iline << std::endl;</div>
+<div class="line"><a name="l00935"></a><span class="lineno">  935</span>         priorReader.readData(linePrior[iclass],GDT_Float32,iline,iclass);</div>
+<div class="line"><a name="l00936"></a><span class="lineno">  936</span>       }</div>
+<div class="line"><a name="l00937"></a><span class="lineno">  937</span>         }</div>
+<div class="line"><a name="l00938"></a><span class="lineno">  938</span>         <span class="keywordflow">catch</span>(<span class="keywordtype">string</span> theError){</div>
+<div class="line"><a name="l00939"></a><span class="lineno">  939</span>       std::cerr << <span class="stringliteral">"Error reading "</span> << priorimg_opt[0] << <span class="stringliteral">": "</span> << theError << std::endl;</div>
+<div class="line"><a name="l00940"></a><span class="lineno">  940</span>           exit(3);</div>
+<div class="line"><a name="l00941"></a><span class="lineno">  941</span>         }</div>
+<div class="line"><a name="l00942"></a><span class="lineno">  942</span>         <span class="keywordflow">catch</span>(...){</div>
+<div class="line"><a name="l00943"></a><span class="lineno">  943</span>           cerr << <span class="stringliteral">"error catched"</span> << std::endl;</div>
+<div class="line"><a name="l00944"></a><span class="lineno">  944</span>           exit(3);</div>
+<div class="line"><a name="l00945"></a><span class="lineno">  945</span>         }</div>
+<div class="line"><a name="l00946"></a><span class="lineno">  946</span>       }</div>
+<div class="line"><a name="l00947"></a><span class="lineno">  947</span>       <span class="keywordtype">double</span> oldRowMask=-1;<span class="comment">//keep track of row mask to optimize number of line readings</span></div>
+<div class="line"><a name="l00948"></a><span class="lineno">  948</span>       <span class="comment">//process per pixel</span></div>
+<div class="line"><a name="l00949"></a><span class="lineno">  949</span>       <span class="keywordflow">for</span>(<span class="keywordtype">int</span> icol=0;icol<ncol;++icol){</div>
+<div class="line"><a name="l00950"></a><span class="lineno">  950</span>         assert(hpixel[icol].size()==nband);</div>
+<div class="line"><a name="l00951"></a><span class="lineno">  951</span>     <span class="keywordtype">bool</span> doClassify=<span class="keyword">true</span>;</div>
+<div class="line"><a name="l00952"></a><span class="lineno">  952</span>         <span class="keywordtype">bool</span> masked=<span class="keyword">false</span>;</div>
+<div class="line"><a name="l00953"></a><span class="lineno">  953</span>     <span class="keywordtype">double</span> geox=0;</div>
+<div class="line"><a name="l00954"></a><span class="lineno">  954</span>     <span class="keywordtype">double</span> geoy=0;</div>
+<div class="line"><a name="l00955"></a><span class="lineno">  955</span>         <span class="keywordflow">if</span>(maskIsVector){</div>
+<div class="line"><a name="l00956"></a><span class="lineno">  956</span>       doClassify=<span class="keyword">false</span>;</div>
 <div class="line"><a name="l00957"></a><span class="lineno">  957</span>       testImage.image2geo(icol,iline,geox,geoy);</div>
-<div class="line"><a name="l00958"></a><span class="lineno">  958</span>       maskReader.geo2image(geox,geoy,colMask,rowMask);</div>
-<div class="line"><a name="l00959"></a><span class="lineno">  959</span>       colMask=<span class="keyword">static_cast<</span><span class="keywordtype">int</span><span class="keyword">></span>(colMask);</div>
-<div class="line"><a name="l00960"></a><span class="lineno">  960</span>       rowMask=<span class="keyword">static_cast<</span><span class="keywordtype">int</span><span class="keyword">></span>(rowMask);</div>
-<div class="line"><a name="l00961"></a><span class="lineno">  961</span>       <span class="keywordflow">if</span>(rowMask>=0&&rowMask<maskReader.nrOfRow()&&colMask>=0&&colMask<maskReader.nrOfCol()){</div>
-<div class="line"><a name="l00962"></a><span class="lineno">  962</span>         <span class="keywordflow">if</span>(static_cast<int>(rowMask)!=<span class="keyword">static_cast<</span><span class="keywordtype">int</span><span class="keyword">></span>(oldRowMask)){</div>
-<div class="line"><a name="l00963"></a><span class="lineno">  963</span>           assert(rowMask>=0&&rowMask<maskReader.nrOfRow());</div>
-<div class="line"><a name="l00964"></a><span class="lineno">  964</span>           <span class="keywordflow">try</span>{</div>
-<div class="line"><a name="l00965"></a><span class="lineno">  965</span>         <span class="comment">// maskReader.readData(lineMask[imask],GDT_Int32,static_cast<int>(rowMask));</span></div>
-<div class="line"><a name="l00966"></a><span class="lineno">  966</span>         maskReader.readData(lineMask,GDT_Int16,static_cast<int>(rowMask));</div>
-<div class="line"><a name="l00967"></a><span class="lineno">  967</span>           }</div>
-<div class="line"><a name="l00968"></a><span class="lineno">  968</span>           <span class="keywordflow">catch</span>(<span class="keywordtype">string</span> errorstring){</div>
-<div class="line"><a name="l00969"></a><span class="lineno">  969</span>         cerr << errorstring << endl;</div>
-<div class="line"><a name="l00970"></a><span class="lineno">  970</span>         exit(1);</div>
-<div class="line"><a name="l00971"></a><span class="lineno">  971</span>           }</div>
-<div class="line"><a name="l00972"></a><span class="lineno">  972</span>           <span class="keywordflow">catch</span>(...){</div>
-<div class="line"><a name="l00973"></a><span class="lineno">  973</span>         cerr << <span class="stringliteral">"error catched"</span> << std::endl;</div>
-<div class="line"><a name="l00974"></a><span class="lineno">  974</span>         exit(3);</div>
-<div class="line"><a name="l00975"></a><span class="lineno">  975</span>           }</div>
-<div class="line"><a name="l00976"></a><span class="lineno">  976</span>           oldRowMask=rowMask;</div>
-<div class="line"><a name="l00977"></a><span class="lineno">  977</span>         }</div>
-<div class="line"><a name="l00978"></a><span class="lineno">  978</span>         <span class="keywordtype">short</span> theMask=0;</div>
-<div class="line"><a name="l00979"></a><span class="lineno">  979</span>         <span class="keywordflow">for</span>(<span class="keywordtype">short</span> ivalue=0;ivalue<msknodata_opt.size();++ivalue){</div>
-<div class="line"><a name="l00980"></a><span class="lineno">  980</span>           <span class="keywordflow">if</span>(msknodata_opt[ivalue]>=0){<span class="comment">//values set in msknodata_opt are invalid</span></div>
-<div class="line"><a name="l00981"></a><span class="lineno">  981</span>         <span class="keywordflow">if</span>(lineMask[colMask]==msknodata_opt[ivalue]){</div>
-<div class="line"><a name="l00982"></a><span class="lineno">  982</span>           theMask=lineMask[colMask];</div>
-<div class="line"><a name="l00983"></a><span class="lineno">  983</span>           masked=<span class="keyword">true</span>;</div>
-<div class="line"><a name="l00984"></a><span class="lineno">  984</span>           <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l00985"></a><span class="lineno">  985</span>         }</div>
+<div class="line"><a name="l00958"></a><span class="lineno">  958</span>       <span class="comment">//check enveloppe first</span></div>
+<div class="line"><a name="l00959"></a><span class="lineno">  959</span>       <span class="keywordflow">if</span>(uly>=geoy&&lry<=geoy&&ulx<=geox&&lrx>=geox){</div>
+<div class="line"><a name="l00960"></a><span class="lineno">  960</span>         doClassify=<span class="keyword">true</span>;</div>
+<div class="line"><a name="l00961"></a><span class="lineno">  961</span>       }</div>
+<div class="line"><a name="l00962"></a><span class="lineno">  962</span>     }</div>
+<div class="line"><a name="l00963"></a><span class="lineno">  963</span>         <span class="keywordflow">if</span>(mask_opt.size()){</div>
+<div class="line"><a name="l00964"></a><span class="lineno">  964</span>       <span class="comment">//read mask</span></div>
+<div class="line"><a name="l00965"></a><span class="lineno">  965</span>       <span class="keywordtype">double</span> colMask=0;</div>
+<div class="line"><a name="l00966"></a><span class="lineno">  966</span>       <span class="keywordtype">double</span> rowMask=0;</div>
+<div class="line"><a name="l00967"></a><span class="lineno">  967</span> </div>
+<div class="line"><a name="l00968"></a><span class="lineno">  968</span>       testImage.image2geo(icol,iline,geox,geoy);</div>
+<div class="line"><a name="l00969"></a><span class="lineno">  969</span>       maskReader.geo2image(geox,geoy,colMask,rowMask);</div>
+<div class="line"><a name="l00970"></a><span class="lineno">  970</span>       colMask=<span class="keyword">static_cast<</span><span class="keywordtype">int</span><span class="keyword">></span>(colMask);</div>
+<div class="line"><a name="l00971"></a><span class="lineno">  971</span>       rowMask=<span class="keyword">static_cast<</span><span class="keywordtype">int</span><span class="keyword">></span>(rowMask);</div>
+<div class="line"><a name="l00972"></a><span class="lineno">  972</span>       <span class="keywordflow">if</span>(rowMask>=0&&rowMask<maskReader.nrOfRow()&&colMask>=0&&colMask<maskReader.nrOfCol()){</div>
+<div class="line"><a name="l00973"></a><span class="lineno">  973</span>         <span class="keywordflow">if</span>(static_cast<int>(rowMask)!=<span class="keyword">static_cast<</span><span class="keywordtype">int</span><span class="keyword">></span>(oldRowMask)){</div>
+<div class="line"><a name="l00974"></a><span class="lineno">  974</span>           assert(rowMask>=0&&rowMask<maskReader.nrOfRow());</div>
+<div class="line"><a name="l00975"></a><span class="lineno">  975</span>           <span class="keywordflow">try</span>{</div>
+<div class="line"><a name="l00976"></a><span class="lineno">  976</span>         <span class="comment">// maskReader.readData(lineMask[imask],GDT_Int32,static_cast<int>(rowMask));</span></div>
+<div class="line"><a name="l00977"></a><span class="lineno">  977</span>         maskReader.readData(lineMask,GDT_Int16,static_cast<int>(rowMask));</div>
+<div class="line"><a name="l00978"></a><span class="lineno">  978</span>           }</div>
+<div class="line"><a name="l00979"></a><span class="lineno">  979</span>           <span class="keywordflow">catch</span>(<span class="keywordtype">string</span> errorstring){</div>
+<div class="line"><a name="l00980"></a><span class="lineno">  980</span>         cerr << errorstring << endl;</div>
+<div class="line"><a name="l00981"></a><span class="lineno">  981</span>         exit(1);</div>
+<div class="line"><a name="l00982"></a><span class="lineno">  982</span>           }</div>
+<div class="line"><a name="l00983"></a><span class="lineno">  983</span>           <span class="keywordflow">catch</span>(...){</div>
+<div class="line"><a name="l00984"></a><span class="lineno">  984</span>         cerr << <span class="stringliteral">"error catched"</span> << std::endl;</div>
+<div class="line"><a name="l00985"></a><span class="lineno">  985</span>         exit(3);</div>
 <div class="line"><a name="l00986"></a><span class="lineno">  986</span>           }</div>
-<div class="line"><a name="l00987"></a><span class="lineno">  987</span>           <span class="keywordflow">else</span>{<span class="comment">//only values set in msknodata_opt are valid</span></div>
-<div class="line"><a name="l00988"></a><span class="lineno">  988</span>         <span class="keywordflow">if</span>(lineMask[colMask]!=-msknodata_opt[ivalue]){</div>
-<div class="line"><a name="l00989"></a><span class="lineno">  989</span>           theMask=lineMask[colMask];</div>
-<div class="line"><a name="l00990"></a><span class="lineno">  990</span>           masked=<span class="keyword">true</span>;</div>
-<div class="line"><a name="l00991"></a><span class="lineno">  991</span>         }</div>
-<div class="line"><a name="l00992"></a><span class="lineno">  992</span>         <span class="keywordflow">else</span>{</div>
-<div class="line"><a name="l00993"></a><span class="lineno">  993</span>           masked=<span class="keyword">false</span>;</div>
-<div class="line"><a name="l00994"></a><span class="lineno">  994</span>           <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l00995"></a><span class="lineno">  995</span>         }</div>
-<div class="line"><a name="l00996"></a><span class="lineno">  996</span>           }</div>
-<div class="line"><a name="l00997"></a><span class="lineno">  997</span>         }</div>
-<div class="line"><a name="l00998"></a><span class="lineno">  998</span>         <span class="keywordflow">if</span>(masked){</div>
-<div class="line"><a name="l00999"></a><span class="lineno">  999</span>           <span class="keywordflow">if</span>(classBag_opt.size())</div>
-<div class="line"><a name="l01000"></a><span class="lineno"> 1000</span>         <span class="keywordflow">for</span>(<span class="keywordtype">int</span> ibag=0;ibag<nbag;++ibag)</div>
-<div class="line"><a name="l01001"></a><span class="lineno"> 1001</span>           classBag[ibag][icol]=theMask;</div>
-<div class="line"><a name="l01002"></a><span class="lineno"> 1002</span>           classOut[icol]=theMask;</div>
-<div class="line"><a name="l01003"></a><span class="lineno"> 1003</span>           <span class="keywordflow">continue</span>;</div>
-<div class="line"><a name="l01004"></a><span class="lineno"> 1004</span>         }</div>
-<div class="line"><a name="l01005"></a><span class="lineno"> 1005</span>       }</div>
-<div class="line"><a name="l01006"></a><span class="lineno"> 1006</span>       <span class="keywordtype">bool</span> valid=<span class="keyword">false</span>;</div>
-<div class="line"><a name="l01007"></a><span class="lineno"> 1007</span>       <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iband=0;iband<hpixel[icol].size();++iband){</div>
-<div class="line"><a name="l01008"></a><span class="lineno"> 1008</span>         <span class="keywordflow">if</span>(hpixel[icol][iband]){</div>
-<div class="line"><a name="l01009"></a><span class="lineno"> 1009</span>           valid=<span class="keyword">true</span>;</div>
-<div class="line"><a name="l01010"></a><span class="lineno"> 1010</span>           <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l01011"></a><span class="lineno"> 1011</span>         }</div>
-<div class="line"><a name="l01012"></a><span class="lineno"> 1012</span>       }</div>
-<div class="line"><a name="l01013"></a><span class="lineno"> 1013</span>       <span class="keywordflow">if</span>(!valid)</div>
-<div class="line"><a name="l01014"></a><span class="lineno"> 1014</span>         doClassify=<span class="keyword">false</span>;</div>
-<div class="line"><a name="l01015"></a><span class="lineno"> 1015</span>     }</div>
-<div class="line"><a name="l01016"></a><span class="lineno"> 1016</span>         <span class="keywordflow">for</span>(<span class="keywordtype">short</span> iclass=0;iclass<nclass;++iclass)</div>
-<div class="line"><a name="l01017"></a><span class="lineno"> 1017</span>           probOut[iclass][icol]=0;</div>
-<div class="line"><a name="l01018"></a><span class="lineno"> 1018</span>     <span class="keywordflow">if</span>(!doClassify){</div>
-<div class="line"><a name="l01019"></a><span class="lineno"> 1019</span>       <span class="keywordflow">if</span>(classBag_opt.size())</div>
-<div class="line"><a name="l01020"></a><span class="lineno"> 1020</span>         <span class="keywordflow">for</span>(<span class="keywordtype">int</span> ibag=0;ibag<nbag;++ibag)</div>
-<div class="line"><a name="l01021"></a><span class="lineno"> 1021</span>           classBag[ibag][icol]=nodata_opt[0];</div>
-<div class="line"><a name="l01022"></a><span class="lineno"> 1022</span>       classOut[icol]=nodata_opt[0];</div>
-<div class="line"><a name="l01023"></a><span class="lineno"> 1023</span>       <span class="keywordflow">continue</span>;<span class="comment">//next column</span></div>
-<div class="line"><a name="l01024"></a><span class="lineno"> 1024</span>     }</div>
-<div class="line"><a name="l01025"></a><span class="lineno"> 1025</span>     <span class="keywordflow">if</span>(verbose_opt[0]>1)</div>
-<div class="line"><a name="l01026"></a><span class="lineno"> 1026</span>       std::cout << <span class="stringliteral">"begin classification "</span> << std::endl;</div>
-<div class="line"><a name="l01027"></a><span class="lineno"> 1027</span>         <span class="comment">//----------------------------------- classification -------------------</span></div>
-<div class="line"><a name="l01028"></a><span class="lineno"> 1028</span>         <span class="keywordflow">for</span>(<span class="keywordtype">int</span> ibag=0;ibag<nbag;++ibag){</div>
-<div class="line"><a name="l01029"></a><span class="lineno"> 1029</span>           vector<double> result(nclass);</div>
-<div class="line"><a name="l01030"></a><span class="lineno"> 1030</span>           <span class="keyword">struct </span><a class="code" href="structsvm__node.html">svm_node</a> *x;</div>
-<div class="line"><a name="l01031"></a><span class="lineno"> 1031</span>           x = (<span class="keyword">struct </span><a class="code" href="structsvm__node.html">svm_node</a> *) malloc((nband+1)*<span class="keyword">sizeof</span>(<span class="keyword">struct </span><a class="code" href="structsvm__node.html">svm_node</a>));</div>
-<div class="line"><a name="l01032"></a><span class="lineno"> 1032</span>           <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iband=0;iband<nband;++iband){</div>
-<div class="line"><a name="l01033"></a><span class="lineno"> 1033</span>             x[iband].index=iband+1;</div>
-<div class="line"><a name="l01034"></a><span class="lineno"> 1034</span>             x[iband].value=(hpixel[icol][iband]-offset[ibag][iband])/scale[ibag][iband];</div>
-<div class="line"><a name="l01035"></a><span class="lineno"> 1035</span>           }</div>
-<div class="line"><a name="l01036"></a><span class="lineno"> 1036</span>           x[nband].index=-1;<span class="comment">//to end svm feature vector</span></div>
-<div class="line"><a name="l01037"></a><span class="lineno"> 1037</span>           <span class="keywordtype">double</span> predict_label=0;</div>
-<div class="line"><a name="l01038"></a><span class="lineno"> 1038</span>           vector<float> prValues(nclass);</div>
-<div class="line"><a name="l01039"></a><span class="lineno"> 1039</span>           <span class="keywordtype">float</span> maxP=0;</div>
-<div class="line"><a name="l01040"></a><span class="lineno"> 1040</span>           <span class="keywordflow">if</span>(!prob_est_opt[0]){</div>
-<div class="line"><a name="l01041"></a><span class="lineno"> 1041</span>             predict_label = svm_predict(svm[ibag],x);</div>
-<div class="line"><a name="l01042"></a><span class="lineno"> 1042</span>             <span class="keywordflow">for</span>(<span class="keywordtype">short</span> iclass=0;iclass<nclass;++iclass){</div>
-<div class="line"><a name="l01043"></a><span class="lineno"> 1043</span>               <span class="keywordflow">if</span>(iclass==static_cast<short>(predict_label))</div>
-<div class="line"><a name="l01044"></a><span class="lineno"> 1044</span>                 result[iclass]=1;</div>
-<div class="line"><a name="l01045"></a><span class="lineno"> 1045</span>               <span class="keywordflow">else</span></div>
-<div class="line"><a name="l01046"></a><span class="lineno"> 1046</span>                 result[iclass]=0;</div>
-<div class="line"><a name="l01047"></a><span class="lineno"> 1047</span>             }</div>
-<div class="line"><a name="l01048"></a><span class="lineno"> 1048</span>           }</div>
-<div class="line"><a name="l01049"></a><span class="lineno"> 1049</span>           <span class="keywordflow">else</span>{</div>
-<div class="line"><a name="l01050"></a><span class="lineno"> 1050</span>             assert(svm_check_probability_model(svm[ibag]));</div>
-<div class="line"><a name="l01051"></a><span class="lineno"> 1051</span>             predict_label = svm_predict_probability(svm[ibag],x,&(result[0]));</div>
-<div class="line"><a name="l01052"></a><span class="lineno"> 1052</span>           }</div>
-<div class="line"><a name="l01053"></a><span class="lineno"> 1053</span>           <span class="comment">//calculate posterior prob of bag </span></div>
-<div class="line"><a name="l01054"></a><span class="lineno"> 1054</span>           <span class="keywordflow">if</span>(classBag_opt.size()){</div>
-<div class="line"><a name="l01055"></a><span class="lineno"> 1055</span>             <span class="comment">//search for max prob within bag</span></div>
-<div class="line"><a name="l01056"></a><span class="lineno"> 1056</span>             maxP=0;</div>
-<div class="line"><a name="l01057"></a><span class="lineno"> 1057</span>             classBag[ibag][icol]=0;</div>
-<div class="line"><a name="l01058"></a><span class="lineno"> 1058</span>           }</div>
-<div class="line"><a name="l01059"></a><span class="lineno"> 1059</span>       <span class="keywordtype">double</span> normPrior=0;</div>
-<div class="line"><a name="l01060"></a><span class="lineno"> 1060</span>       <span class="keywordflow">if</span>(priorimg_opt.size()){</div>
-<div class="line"><a name="l01061"></a><span class="lineno"> 1061</span>         <span class="keywordflow">for</span>(<span class="keywordtype">short</span> iclass=0;iclass<nclass;++iclass)</div>
-<div class="line"><a name="l01062"></a><span class="lineno"> 1062</span>           normPrior+=linePrior[iclass][icol];</div>
-<div class="line"><a name="l01063"></a><span class="lineno"> 1063</span>       }</div>
-<div class="line"><a name="l01064"></a><span class="lineno"> 1064</span>           <span class="keywordflow">for</span>(<span class="keywordtype">short</span> iclass=0;iclass<nclass;++iclass){</div>
-<div class="line"><a name="l01065"></a><span class="lineno"> 1065</span>         <span class="keywordflow">if</span>(priorimg_opt.size())</div>
-<div class="line"><a name="l01066"></a><span class="lineno"> 1066</span>           priors[iclass]=linePrior[iclass][icol]/normPrior;<span class="comment">//todo: check if correct for all cases... (automatic classValueMap and manual input for names and values)</span></div>
-<div class="line"><a name="l01067"></a><span class="lineno"> 1067</span>             <span class="keywordflow">switch</span>(comb_opt[0]){</div>
-<div class="line"><a name="l01068"></a><span class="lineno"> 1068</span>             <span class="keywordflow">default</span>:</div>
-<div class="line"><a name="l01069"></a><span class="lineno"> 1069</span>             <span class="keywordflow">case</span>(0):<span class="comment">//sum rule</span></div>
-<div class="line"><a name="l01070"></a><span class="lineno"> 1070</span>               probOut[iclass][icol]+=result[iclass]*priors[iclass];<span class="comment">//add probabilities for each bag</span></div>
-<div class="line"><a name="l01071"></a><span class="lineno"> 1071</span>                <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l01072"></a><span class="lineno"> 1072</span>             <span class="keywordflow">case</span>(1):<span class="comment">//product rule</span></div>
-<div class="line"><a name="l01073"></a><span class="lineno"> 1073</span>               probOut[iclass][icol]*=pow(static_cast<float>(priors[iclass]),static_cast<float>(1.0-nbag)/nbag)*result[iclass];<span class="comment">//multiply probabilities for each bag</span></div>
-<div class="line"><a name="l01074"></a><span class="lineno"> 1074</span>               <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l01075"></a><span class="lineno"> 1075</span>             <span class="keywordflow">case</span>(2):<span class="comment">//max rule</span></div>
-<div class="line"><a name="l01076"></a><span class="lineno"> 1076</span>               <span class="keywordflow">if</span>(priors[iclass]*result[iclass]>probOut[iclass][icol])</div>
-<div class="line"><a name="l01077"></a><span class="lineno"> 1077</span>                 probOut[iclass][icol]=priors[iclass]*result[iclass];</div>
-<div class="line"><a name="l01078"></a><span class="lineno"> 1078</span>               <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l01079"></a><span class="lineno"> 1079</span>             }</div>
-<div class="line"><a name="l01080"></a><span class="lineno"> 1080</span>             <span class="keywordflow">if</span>(classBag_opt.size()){</div>
-<div class="line"><a name="l01081"></a><span class="lineno"> 1081</span>               <span class="comment">//search for max prob within bag</span></div>
-<div class="line"><a name="l01082"></a><span class="lineno"> 1082</span>               <span class="comment">// if(prValues[iclass]>maxP){</span></div>
-<div class="line"><a name="l01083"></a><span class="lineno"> 1083</span>               <span class="comment">//   maxP=prValues[iclass];</span></div>
-<div class="line"><a name="l01084"></a><span class="lineno"> 1084</span>               <span class="comment">//   classBag[ibag][icol]=iclass;</span></div>
-<div class="line"><a name="l01085"></a><span class="lineno"> 1085</span>               <span class="comment">// }</span></div>
-<div class="line"><a name="l01086"></a><span class="lineno"> 1086</span>               <span class="keywordflow">if</span>(result[iclass]>maxP){</div>
-<div class="line"><a name="l01087"></a><span class="lineno"> 1087</span>                 maxP=result[iclass];</div>
-<div class="line"><a name="l01088"></a><span class="lineno"> 1088</span>                 classBag[ibag][icol]=iclass;</div>
-<div class="line"><a name="l01089"></a><span class="lineno"> 1089</span>               }</div>
+<div class="line"><a name="l00987"></a><span class="lineno">  987</span>           oldRowMask=rowMask;</div>
+<div class="line"><a name="l00988"></a><span class="lineno">  988</span>         }</div>
+<div class="line"><a name="l00989"></a><span class="lineno">  989</span>         <span class="keywordtype">short</span> theMask=0;</div>
+<div class="line"><a name="l00990"></a><span class="lineno">  990</span>         <span class="keywordflow">for</span>(<span class="keywordtype">short</span> ivalue=0;ivalue<msknodata_opt.size();++ivalue){</div>
+<div class="line"><a name="l00991"></a><span class="lineno">  991</span>           <span class="keywordflow">if</span>(msknodata_opt[ivalue]>=0){<span class="comment">//values set in msknodata_opt are invalid</span></div>
+<div class="line"><a name="l00992"></a><span class="lineno">  992</span>         <span class="keywordflow">if</span>(lineMask[colMask]==msknodata_opt[ivalue]){</div>
+<div class="line"><a name="l00993"></a><span class="lineno">  993</span>           theMask=lineMask[colMask];</div>
+<div class="line"><a name="l00994"></a><span class="lineno">  994</span>           masked=<span class="keyword">true</span>;</div>
+<div class="line"><a name="l00995"></a><span class="lineno">  995</span>           <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l00996"></a><span class="lineno">  996</span>         }</div>
+<div class="line"><a name="l00997"></a><span class="lineno">  997</span>           }</div>
+<div class="line"><a name="l00998"></a><span class="lineno">  998</span>           <span class="keywordflow">else</span>{<span class="comment">//only values set in msknodata_opt are valid</span></div>
+<div class="line"><a name="l00999"></a><span class="lineno">  999</span>         <span class="keywordflow">if</span>(lineMask[colMask]!=-msknodata_opt[ivalue]){</div>
+<div class="line"><a name="l01000"></a><span class="lineno"> 1000</span>           theMask=lineMask[colMask];</div>
+<div class="line"><a name="l01001"></a><span class="lineno"> 1001</span>           masked=<span class="keyword">true</span>;</div>
+<div class="line"><a name="l01002"></a><span class="lineno"> 1002</span>         }</div>
+<div class="line"><a name="l01003"></a><span class="lineno"> 1003</span>         <span class="keywordflow">else</span>{</div>
+<div class="line"><a name="l01004"></a><span class="lineno"> 1004</span>           masked=<span class="keyword">false</span>;</div>
+<div class="line"><a name="l01005"></a><span class="lineno"> 1005</span>           <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l01006"></a><span class="lineno"> 1006</span>         }</div>
+<div class="line"><a name="l01007"></a><span class="lineno"> 1007</span>           }</div>
+<div class="line"><a name="l01008"></a><span class="lineno"> 1008</span>         }</div>
+<div class="line"><a name="l01009"></a><span class="lineno"> 1009</span>         <span class="keywordflow">if</span>(masked){</div>
+<div class="line"><a name="l01010"></a><span class="lineno"> 1010</span>           <span class="keywordflow">if</span>(classBag_opt.size())</div>
+<div class="line"><a name="l01011"></a><span class="lineno"> 1011</span>         <span class="keywordflow">for</span>(<span class="keywordtype">int</span> ibag=0;ibag<nbag;++ibag)</div>
+<div class="line"><a name="l01012"></a><span class="lineno"> 1012</span>           classBag[ibag][icol]=theMask;</div>
+<div class="line"><a name="l01013"></a><span class="lineno"> 1013</span>           classOut[icol]=theMask;</div>
+<div class="line"><a name="l01014"></a><span class="lineno"> 1014</span>           <span class="keywordflow">continue</span>;</div>
+<div class="line"><a name="l01015"></a><span class="lineno"> 1015</span>         }</div>
+<div class="line"><a name="l01016"></a><span class="lineno"> 1016</span>       }</div>
+<div class="line"><a name="l01017"></a><span class="lineno"> 1017</span>       <span class="keywordtype">bool</span> valid=<span class="keyword">false</span>;</div>
+<div class="line"><a name="l01018"></a><span class="lineno"> 1018</span>       <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iband=0;iband<hpixel[icol].size();++iband){</div>
+<div class="line"><a name="l01019"></a><span class="lineno"> 1019</span>         <span class="keywordflow">if</span>(hpixel[icol][iband]){</div>
+<div class="line"><a name="l01020"></a><span class="lineno"> 1020</span>           valid=<span class="keyword">true</span>;</div>
+<div class="line"><a name="l01021"></a><span class="lineno"> 1021</span>           <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l01022"></a><span class="lineno"> 1022</span>         }</div>
+<div class="line"><a name="l01023"></a><span class="lineno"> 1023</span>       }</div>
+<div class="line"><a name="l01024"></a><span class="lineno"> 1024</span>       <span class="keywordflow">if</span>(!valid)</div>
+<div class="line"><a name="l01025"></a><span class="lineno"> 1025</span>         doClassify=<span class="keyword">false</span>;</div>
+<div class="line"><a name="l01026"></a><span class="lineno"> 1026</span>     }</div>
+<div class="line"><a name="l01027"></a><span class="lineno"> 1027</span>         <span class="keywordflow">for</span>(<span class="keywordtype">short</span> iclass=0;iclass<nclass;++iclass)</div>
+<div class="line"><a name="l01028"></a><span class="lineno"> 1028</span>           probOut[iclass][icol]=0;</div>
+<div class="line"><a name="l01029"></a><span class="lineno"> 1029</span>     <span class="keywordflow">if</span>(!doClassify){</div>
+<div class="line"><a name="l01030"></a><span class="lineno"> 1030</span>       <span class="keywordflow">if</span>(classBag_opt.size())</div>
+<div class="line"><a name="l01031"></a><span class="lineno"> 1031</span>         <span class="keywordflow">for</span>(<span class="keywordtype">int</span> ibag=0;ibag<nbag;++ibag)</div>
+<div class="line"><a name="l01032"></a><span class="lineno"> 1032</span>           classBag[ibag][icol]=nodata_opt[0];</div>
+<div class="line"><a name="l01033"></a><span class="lineno"> 1033</span>       classOut[icol]=nodata_opt[0];</div>
+<div class="line"><a name="l01034"></a><span class="lineno"> 1034</span>       <span class="keywordflow">continue</span>;<span class="comment">//next column</span></div>
+<div class="line"><a name="l01035"></a><span class="lineno"> 1035</span>     }</div>
+<div class="line"><a name="l01036"></a><span class="lineno"> 1036</span>     <span class="keywordflow">if</span>(verbose_opt[0]>1)</div>
+<div class="line"><a name="l01037"></a><span class="lineno"> 1037</span>       std::cout << <span class="stringliteral">"begin classification "</span> << std::endl;</div>
+<div class="line"><a name="l01038"></a><span class="lineno"> 1038</span>         <span class="comment">//----------------------------------- classification -------------------</span></div>
+<div class="line"><a name="l01039"></a><span class="lineno"> 1039</span>         <span class="keywordflow">for</span>(<span class="keywordtype">int</span> ibag=0;ibag<nbag;++ibag){</div>
+<div class="line"><a name="l01040"></a><span class="lineno"> 1040</span>           vector<double> result(nclass);</div>
+<div class="line"><a name="l01041"></a><span class="lineno"> 1041</span>           <span class="keyword">struct </span><a class="code" href="structsvm__node.html">svm_node</a> *x;</div>
+<div class="line"><a name="l01042"></a><span class="lineno"> 1042</span>           x = (<span class="keyword">struct </span><a class="code" href="structsvm__node.html">svm_node</a> *) malloc((nband+1)*<span class="keyword">sizeof</span>(<span class="keyword">struct </span><a class="code" href="structsvm__node.html">svm_node</a>));</div>
+<div class="line"><a name="l01043"></a><span class="lineno"> 1043</span>           <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iband=0;iband<nband;++iband){</div>
+<div class="line"><a name="l01044"></a><span class="lineno"> 1044</span>             x[iband].index=iband+1;</div>
+<div class="line"><a name="l01045"></a><span class="lineno"> 1045</span>             x[iband].value=(hpixel[icol][iband]-offset[ibag][iband])/scale[ibag][iband];</div>
+<div class="line"><a name="l01046"></a><span class="lineno"> 1046</span>           }</div>
+<div class="line"><a name="l01047"></a><span class="lineno"> 1047</span>           x[nband].index=-1;<span class="comment">//to end svm feature vector</span></div>
+<div class="line"><a name="l01048"></a><span class="lineno"> 1048</span>           <span class="keywordtype">double</span> predict_label=0;</div>
+<div class="line"><a name="l01049"></a><span class="lineno"> 1049</span>           vector<float> prValues(nclass);</div>
+<div class="line"><a name="l01050"></a><span class="lineno"> 1050</span>           <span class="keywordtype">float</span> maxP=0;</div>
+<div class="line"><a name="l01051"></a><span class="lineno"> 1051</span>           <span class="keywordflow">if</span>(!prob_est_opt[0]){</div>
+<div class="line"><a name="l01052"></a><span class="lineno"> 1052</span>             predict_label = svm_predict(svm[ibag],x);</div>
+<div class="line"><a name="l01053"></a><span class="lineno"> 1053</span>             <span class="keywordflow">for</span>(<span class="keywordtype">short</span> iclass=0;iclass<nclass;++iclass){</div>
+<div class="line"><a name="l01054"></a><span class="lineno"> 1054</span>               <span class="keywordflow">if</span>(iclass==static_cast<short>(predict_label))</div>
+<div class="line"><a name="l01055"></a><span class="lineno"> 1055</span>                 result[iclass]=1;</div>
+<div class="line"><a name="l01056"></a><span class="lineno"> 1056</span>               <span class="keywordflow">else</span></div>
+<div class="line"><a name="l01057"></a><span class="lineno"> 1057</span>                 result[iclass]=0;</div>
+<div class="line"><a name="l01058"></a><span class="lineno"> 1058</span>             }</div>
+<div class="line"><a name="l01059"></a><span class="lineno"> 1059</span>           }</div>
+<div class="line"><a name="l01060"></a><span class="lineno"> 1060</span>           <span class="keywordflow">else</span>{</div>
+<div class="line"><a name="l01061"></a><span class="lineno"> 1061</span>             assert(svm_check_probability_model(svm[ibag]));</div>
+<div class="line"><a name="l01062"></a><span class="lineno"> 1062</span>             predict_label = svm_predict_probability(svm[ibag],x,&(result[0]));</div>
+<div class="line"><a name="l01063"></a><span class="lineno"> 1063</span>           }</div>
+<div class="line"><a name="l01064"></a><span class="lineno"> 1064</span>           <span class="comment">//calculate posterior prob of bag </span></div>
+<div class="line"><a name="l01065"></a><span class="lineno"> 1065</span>           <span class="keywordflow">if</span>(classBag_opt.size()){</div>
+<div class="line"><a name="l01066"></a><span class="lineno"> 1066</span>             <span class="comment">//search for max prob within bag</span></div>
+<div class="line"><a name="l01067"></a><span class="lineno"> 1067</span>             maxP=0;</div>
+<div class="line"><a name="l01068"></a><span class="lineno"> 1068</span>             classBag[ibag][icol]=0;</div>
+<div class="line"><a name="l01069"></a><span class="lineno"> 1069</span>           }</div>
+<div class="line"><a name="l01070"></a><span class="lineno"> 1070</span>       <span class="keywordtype">double</span> normPrior=0;</div>
+<div class="line"><a name="l01071"></a><span class="lineno"> 1071</span>       <span class="keywordflow">if</span>(priorimg_opt.size()){</div>
+<div class="line"><a name="l01072"></a><span class="lineno"> 1072</span>         <span class="keywordflow">for</span>(<span class="keywordtype">short</span> iclass=0;iclass<nclass;++iclass)</div>
+<div class="line"><a name="l01073"></a><span class="lineno"> 1073</span>           normPrior+=linePrior[iclass][icol];</div>
+<div class="line"><a name="l01074"></a><span class="lineno"> 1074</span>       }</div>
+<div class="line"><a name="l01075"></a><span class="lineno"> 1075</span>           <span class="keywordflow">for</span>(<span class="keywordtype">short</span> iclass=0;iclass<nclass;++iclass){</div>
+<div class="line"><a name="l01076"></a><span class="lineno"> 1076</span>         <span class="keywordflow">if</span>(priorimg_opt.size())</div>
+<div class="line"><a name="l01077"></a><span class="lineno"> 1077</span>           priors[iclass]=linePrior[iclass][icol]/normPrior;<span class="comment">//todo: check if correct for all cases... (automatic classValueMap and manual input for names and values)</span></div>
+<div class="line"><a name="l01078"></a><span class="lineno"> 1078</span>             <span class="keywordflow">switch</span>(comb_opt[0]){</div>
+<div class="line"><a name="l01079"></a><span class="lineno"> 1079</span>             <span class="keywordflow">default</span>:</div>
+<div class="line"><a name="l01080"></a><span class="lineno"> 1080</span>             <span class="keywordflow">case</span>(0):<span class="comment">//sum rule</span></div>
+<div class="line"><a name="l01081"></a><span class="lineno"> 1081</span>               probOut[iclass][icol]+=result[iclass]*priors[iclass];<span class="comment">//add probabilities for each bag</span></div>
+<div class="line"><a name="l01082"></a><span class="lineno"> 1082</span>                <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l01083"></a><span class="lineno"> 1083</span>             <span class="keywordflow">case</span>(1):<span class="comment">//product rule</span></div>
+<div class="line"><a name="l01084"></a><span class="lineno"> 1084</span>               probOut[iclass][icol]*=pow(static_cast<float>(priors[iclass]),static_cast<float>(1.0-nbag)/nbag)*result[iclass];<span class="comment">//multiply probabilities for each bag</span></div>
+<div class="line"><a name="l01085"></a><span class="lineno"> 1085</span>               <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l01086"></a><span class="lineno"> 1086</span>             <span class="keywordflow">case</span>(2):<span class="comment">//max rule</span></div>
+<div class="line"><a name="l01087"></a><span class="lineno"> 1087</span>               <span class="keywordflow">if</span>(priors[iclass]*result[iclass]>probOut[iclass][icol])</div>
+<div class="line"><a name="l01088"></a><span class="lineno"> 1088</span>                 probOut[iclass][icol]=priors[iclass]*result[iclass];</div>
+<div class="line"><a name="l01089"></a><span class="lineno"> 1089</span>               <span class="keywordflow">break</span>;</div>
 <div class="line"><a name="l01090"></a><span class="lineno"> 1090</span>             }</div>
-<div class="line"><a name="l01091"></a><span class="lineno"> 1091</span>           }</div>
-<div class="line"><a name="l01092"></a><span class="lineno"> 1092</span>           free(x);</div>
-<div class="line"><a name="l01093"></a><span class="lineno"> 1093</span>         }<span class="comment">//ibag</span></div>
-<div class="line"><a name="l01094"></a><span class="lineno"> 1094</span> </div>
-<div class="line"><a name="l01095"></a><span class="lineno"> 1095</span>         <span class="comment">//search for max class prob</span></div>
-<div class="line"><a name="l01096"></a><span class="lineno"> 1096</span>         <span class="keywordtype">float</span> maxBag1=0;<span class="comment">//max probability</span></div>
-<div class="line"><a name="l01097"></a><span class="lineno"> 1097</span>         <span class="keywordtype">float</span> maxBag2=0;<span class="comment">//second max probability</span></div>
-<div class="line"><a name="l01098"></a><span class="lineno"> 1098</span>         <span class="keywordtype">float</span> normBag=0;</div>
-<div class="line"><a name="l01099"></a><span class="lineno"> 1099</span>         <span class="keywordflow">for</span>(<span class="keywordtype">short</span> iclass=0;iclass<nclass;++iclass){</div>
-<div class="line"><a name="l01100"></a><span class="lineno"> 1100</span>           <span class="keywordflow">if</span>(probOut[iclass][icol]>maxBag1){</div>
-<div class="line"><a name="l01101"></a><span class="lineno"> 1101</span>             maxBag1=probOut[iclass][icol];</div>
-<div class="line"><a name="l01102"></a><span class="lineno"> 1102</span>             classOut[icol]=classValueMap[nameVector[iclass]];</div>
-<div class="line"><a name="l01103"></a><span class="lineno"> 1103</span>           }</div>
-<div class="line"><a name="l01104"></a><span class="lineno"> 1104</span>       <span class="keywordflow">else</span> <span class="keywordflow">if</span>(probOut[iclass][icol]>maxBag2)</div>
-<div class="line"><a name="l01105"></a><span class="lineno"> 1105</span>             maxBag2=probOut[iclass][icol];</div>
-<div class="line"><a name="l01106"></a><span class="lineno"> 1106</span>           normBag+=probOut[iclass][icol];</div>
-<div class="line"><a name="l01107"></a><span class="lineno"> 1107</span>         }</div>
-<div class="line"><a name="l01108"></a><span class="lineno"> 1108</span>         <span class="comment">//normalize probOut and convert to percentage</span></div>
-<div class="line"><a name="l01109"></a><span class="lineno"> 1109</span>         entropy[icol]=0;</div>
+<div class="line"><a name="l01091"></a><span class="lineno"> 1091</span>             <span class="keywordflow">if</span>(classBag_opt.size()){</div>
+<div class="line"><a name="l01092"></a><span class="lineno"> 1092</span>               <span class="comment">//search for max prob within bag</span></div>
+<div class="line"><a name="l01093"></a><span class="lineno"> 1093</span>               <span class="comment">// if(prValues[iclass]>maxP){</span></div>
+<div class="line"><a name="l01094"></a><span class="lineno"> 1094</span>               <span class="comment">//   maxP=prValues[iclass];</span></div>
+<div class="line"><a name="l01095"></a><span class="lineno"> 1095</span>               <span class="comment">//   classBag[ibag][icol]=iclass;</span></div>
+<div class="line"><a name="l01096"></a><span class="lineno"> 1096</span>               <span class="comment">// }</span></div>
+<div class="line"><a name="l01097"></a><span class="lineno"> 1097</span>               <span class="keywordflow">if</span>(result[iclass]>maxP){</div>
+<div class="line"><a name="l01098"></a><span class="lineno"> 1098</span>                 maxP=result[iclass];</div>
+<div class="line"><a name="l01099"></a><span class="lineno"> 1099</span>                 classBag[ibag][icol]=iclass;</div>
+<div class="line"><a name="l01100"></a><span class="lineno"> 1100</span>               }</div>
+<div class="line"><a name="l01101"></a><span class="lineno"> 1101</span>             }</div>
+<div class="line"><a name="l01102"></a><span class="lineno"> 1102</span>           }</div>
+<div class="line"><a name="l01103"></a><span class="lineno"> 1103</span>           free(x);</div>
+<div class="line"><a name="l01104"></a><span class="lineno"> 1104</span>         }<span class="comment">//ibag</span></div>
+<div class="line"><a name="l01105"></a><span class="lineno"> 1105</span> </div>
+<div class="line"><a name="l01106"></a><span class="lineno"> 1106</span>         <span class="comment">//search for max class prob</span></div>
+<div class="line"><a name="l01107"></a><span class="lineno"> 1107</span>         <span class="keywordtype">float</span> maxBag1=0;<span class="comment">//max probability</span></div>
+<div class="line"><a name="l01108"></a><span class="lineno"> 1108</span>         <span class="keywordtype">float</span> maxBag2=0;<span class="comment">//second max probability</span></div>
+<div class="line"><a name="l01109"></a><span class="lineno"> 1109</span>         <span class="keywordtype">float</span> normBag=0;</div>
 <div class="line"><a name="l01110"></a><span class="lineno"> 1110</span>         <span class="keywordflow">for</span>(<span class="keywordtype">short</span> iclass=0;iclass<nclass;++iclass){</div>
-<div class="line"><a name="l01111"></a><span class="lineno"> 1111</span>           <span class="keywordtype">float</span> prv=probOut[iclass][icol];</div>
-<div class="line"><a name="l01112"></a><span class="lineno"> 1112</span>           prv/=normBag;</div>
-<div class="line"><a name="l01113"></a><span class="lineno"> 1113</span>           entropy[icol]-=prv*log(prv)/log(2.0);</div>
-<div class="line"><a name="l01114"></a><span class="lineno"> 1114</span>           prv*=100.0;</div>
-<div class="line"><a name="l01115"></a><span class="lineno"> 1115</span>             </div>
-<div class="line"><a name="l01116"></a><span class="lineno"> 1116</span>           probOut[iclass][icol]=<span class="keyword">static_cast<</span><span class="keywordtype">short</span><span class="keyword">></span>(prv+0.5);</div>
-<div class="line"><a name="l01117"></a><span class="lineno"> 1117</span>           <span class="comment">// assert(classValueMap[nameVector[iclass]]<probOut.size());</span></div>
-<div class="line"><a name="l01118"></a><span class="lineno"> 1118</span>           <span class="comment">// assert(classValueMap[nameVector[iclass]]>=0);</span></div>
-<div class="line"><a name="l01119"></a><span class="lineno"> 1119</span>           <span class="comment">// probOut[classValueMap[nameVector[iclass]]][icol]=static_cast<short>(prv+0.5);</span></div>
-<div class="line"><a name="l01120"></a><span class="lineno"> 1120</span>         }</div>
-<div class="line"><a name="l01121"></a><span class="lineno"> 1121</span>         entropy[icol]/=log(static_cast<double>(nclass))/log(2.0);</div>
-<div class="line"><a name="l01122"></a><span class="lineno"> 1122</span>         entropy[icol]=<span class="keyword">static_cast<</span><span class="keywordtype">short</span><span class="keyword">></span>(100*entropy[icol]+0.5);</div>
-<div class="line"><a name="l01123"></a><span class="lineno"> 1123</span>     <span class="keywordflow">if</span>(active_opt.size()){</div>
-<div class="line"><a name="l01124"></a><span class="lineno"> 1124</span>       <span class="keywordflow">if</span>(entropy[icol]>activePoints.back().value){</div>
-<div class="line"><a name="l01125"></a><span class="lineno"> 1125</span>         activePoints.back().value=entropy[icol];<span class="comment">//replace largest value (last)</span></div>
-<div class="line"><a name="l01126"></a><span class="lineno"> 1126</span>         activePoints.back().posx=icol;</div>
-<div class="line"><a name="l01127"></a><span class="lineno"> 1127</span>         activePoints.back().posy=iline;</div>
-<div class="line"><a name="l01128"></a><span class="lineno"> 1128</span>         std::sort(activePoints.begin(),activePoints.end(),<a class="code" href="classDecrease__PosValue.html">Decrease_PosValue</a>());<span class="comment">//sort in descending order (largest first, smallest last)</span></div>
-<div class="line"><a name="l01129"></a><span class="lineno"> 1129</span>         <span class="keywordflow">if</span>(verbose_opt[0])</div>
-<div class="line"><a name="l01130"></a><span class="lineno"> 1130</span>           std::cout << activePoints.back().posx << <span class="stringliteral">" "</span> << activePoints.back().posy << <span class="stringliteral">" "</span> << activePoints.back().value << std::endl;</div>
-<div class="line"><a name="l01131"></a><span class="lineno"> 1131</span>       }</div>
-<div class="line"><a name="l01132"></a><span class="lineno"> 1132</span>     }</div>
-<div class="line"><a name="l01133"></a><span class="lineno"> 1133</span>       }<span class="comment">//icol</span></div>
-<div class="line"><a name="l01134"></a><span class="lineno"> 1134</span>       <span class="comment">//----------------------------------- write output ------------------------------------------</span></div>
-<div class="line"><a name="l01135"></a><span class="lineno"> 1135</span>       <span class="keywordflow">if</span>(classBag_opt.size())</div>
-<div class="line"><a name="l01136"></a><span class="lineno"> 1136</span>         <span class="keywordflow">for</span>(<span class="keywordtype">int</span> ibag=0;ibag<nbag;++ibag)</div>
-<div class="line"><a name="l01137"></a><span class="lineno"> 1137</span>           classImageBag.writeData(classBag[ibag],GDT_Byte,iline,ibag);</div>
-<div class="line"><a name="l01138"></a><span class="lineno"> 1138</span>       <span class="keywordflow">if</span>(prob_opt.size()){</div>
-<div class="line"><a name="l01139"></a><span class="lineno"> 1139</span>         <span class="keywordflow">for</span>(<span class="keywordtype">short</span> iclass=0;iclass<nclass;++iclass)</div>
-<div class="line"><a name="l01140"></a><span class="lineno"> 1140</span>           probImage.writeData(probOut[iclass],GDT_Float32,iline,iclass);</div>
-<div class="line"><a name="l01141"></a><span class="lineno"> 1141</span>       }</div>
-<div class="line"><a name="l01142"></a><span class="lineno"> 1142</span>       <span class="keywordflow">if</span>(entropy_opt.size()){</div>
-<div class="line"><a name="l01143"></a><span class="lineno"> 1143</span>         entropyImage.writeData(entropy,GDT_Float32,iline);</div>
-<div class="line"><a name="l01144"></a><span class="lineno"> 1144</span>       }</div>
-<div class="line"><a name="l01145"></a><span class="lineno"> 1145</span>       classImageOut.writeData(classOut,GDT_Byte,iline);</div>
-<div class="line"><a name="l01146"></a><span class="lineno"> 1146</span>       <span class="keywordflow">if</span>(!verbose_opt[0]){</div>
-<div class="line"><a name="l01147"></a><span class="lineno"> 1147</span>         progress=<span class="keyword">static_cast<</span><span class="keywordtype">float</span><span class="keyword">></span>(iline+1.0)/classImageOut.nrOfRow();</div>
-<div class="line"><a name="l01148"></a><span class="lineno"> 1148</span>         pfnProgress(progress,pszMessage,pProgressArg);</div>
-<div class="line"><a name="l01149"></a><span class="lineno"> 1149</span>       }</div>
-<div class="line"><a name="l01150"></a><span class="lineno"> 1150</span>     }</div>
-<div class="line"><a name="l01151"></a><span class="lineno"> 1151</span>     <span class="comment">//write active learning points</span></div>
-<div class="line"><a name="l01152"></a><span class="lineno"> 1152</span>     <span class="keywordflow">if</span>(active_opt.size()){</div>
-<div class="line"><a name="l01153"></a><span class="lineno"> 1153</span>       <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iactive=0;iactive<activePoints.size();++iactive){</div>
-<div class="line"><a name="l01154"></a><span class="lineno"> 1154</span>     std::map<string,double> pointMap;</div>
-<div class="line"><a name="l01155"></a><span class="lineno"> 1155</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iband=0;iband<testImage.nrOfBand();++iband){</div>
-<div class="line"><a name="l01156"></a><span class="lineno"> 1156</span>       <span class="keywordtype">double</span> value;</div>
-<div class="line"><a name="l01157"></a><span class="lineno"> 1157</span>       testImage.readData(value,GDT_Float64,static_cast<int>(activePoints[iactive].posx),static_cast<int>(activePoints[iactive].posy),iband);</div>
-<div class="line"><a name="l01158"></a><span class="lineno"> 1158</span>       ostringstream fs;</div>
-<div class="line"><a name="l01159"></a><span class="lineno"> 1159</span>       fs << <span class="stringliteral">"B"</span> << iband;</div>
-<div class="line"><a name="l01160"></a><span class="lineno"> 1160</span>       pointMap[fs.str()]=value;</div>
+<div class="line"><a name="l01111"></a><span class="lineno"> 1111</span>           <span class="keywordflow">if</span>(probOut[iclass][icol]>maxBag1){</div>
+<div class="line"><a name="l01112"></a><span class="lineno"> 1112</span>             maxBag1=probOut[iclass][icol];</div>
+<div class="line"><a name="l01113"></a><span class="lineno"> 1113</span>             classOut[icol]=classValueMap[nameVector[iclass]];</div>
+<div class="line"><a name="l01114"></a><span class="lineno"> 1114</span>           }</div>
+<div class="line"><a name="l01115"></a><span class="lineno"> 1115</span>       <span class="keywordflow">else</span> <span class="keywordflow">if</span>(probOut[iclass][icol]>maxBag2)</div>
+<div class="line"><a name="l01116"></a><span class="lineno"> 1116</span>             maxBag2=probOut[iclass][icol];</div>
+<div class="line"><a name="l01117"></a><span class="lineno"> 1117</span>           normBag+=probOut[iclass][icol];</div>
+<div class="line"><a name="l01118"></a><span class="lineno"> 1118</span>         }</div>
+<div class="line"><a name="l01119"></a><span class="lineno"> 1119</span>         <span class="comment">//normalize probOut and convert to percentage</span></div>
+<div class="line"><a name="l01120"></a><span class="lineno"> 1120</span>         entropy[icol]=0;</div>
+<div class="line"><a name="l01121"></a><span class="lineno"> 1121</span>         <span class="keywordflow">for</span>(<span class="keywordtype">short</span> iclass=0;iclass<nclass;++iclass){</div>
+<div class="line"><a name="l01122"></a><span class="lineno"> 1122</span>           <span class="keywordtype">float</span> prv=probOut[iclass][icol];</div>
+<div class="line"><a name="l01123"></a><span class="lineno"> 1123</span>           prv/=normBag;</div>
+<div class="line"><a name="l01124"></a><span class="lineno"> 1124</span>           entropy[icol]-=prv*log(prv)/log(2.0);</div>
+<div class="line"><a name="l01125"></a><span class="lineno"> 1125</span>           prv*=100.0;</div>
+<div class="line"><a name="l01126"></a><span class="lineno"> 1126</span>             </div>
+<div class="line"><a name="l01127"></a><span class="lineno"> 1127</span>           probOut[iclass][icol]=<span class="keyword">static_cast<</span><span class="keywordtype">short</span><span class="keyword">></span>(prv+0.5);</div>
+<div class="line"><a name="l01128"></a><span class="lineno"> 1128</span>           <span class="comment">// assert(classValueMap[nameVector[iclass]]<probOut.size());</span></div>
+<div class="line"><a name="l01129"></a><span class="lineno"> 1129</span>           <span class="comment">// assert(classValueMap[nameVector[iclass]]>=0);</span></div>
+<div class="line"><a name="l01130"></a><span class="lineno"> 1130</span>           <span class="comment">// probOut[classValueMap[nameVector[iclass]]][icol]=static_cast<short>(prv+0.5);</span></div>
+<div class="line"><a name="l01131"></a><span class="lineno"> 1131</span>         }</div>
+<div class="line"><a name="l01132"></a><span class="lineno"> 1132</span>         entropy[icol]/=log(static_cast<double>(nclass))/log(2.0);</div>
+<div class="line"><a name="l01133"></a><span class="lineno"> 1133</span>         entropy[icol]=<span class="keyword">static_cast<</span><span class="keywordtype">short</span><span class="keyword">></span>(100*entropy[icol]+0.5);</div>
+<div class="line"><a name="l01134"></a><span class="lineno"> 1134</span>     <span class="keywordflow">if</span>(active_opt.size()){</div>
+<div class="line"><a name="l01135"></a><span class="lineno"> 1135</span>       <span class="keywordflow">if</span>(entropy[icol]>activePoints.back().value){</div>
+<div class="line"><a name="l01136"></a><span class="lineno"> 1136</span>         activePoints.back().value=entropy[icol];<span class="comment">//replace largest value (last)</span></div>
+<div class="line"><a name="l01137"></a><span class="lineno"> 1137</span>         activePoints.back().posx=icol;</div>
+<div class="line"><a name="l01138"></a><span class="lineno"> 1138</span>         activePoints.back().posy=iline;</div>
+<div class="line"><a name="l01139"></a><span class="lineno"> 1139</span>         std::sort(activePoints.begin(),activePoints.end(),<a class="code" href="classDecrease__PosValue.html">Decrease_PosValue</a>());<span class="comment">//sort in descending order (largest first, smallest last)</span></div>
+<div class="line"><a name="l01140"></a><span class="lineno"> 1140</span>         <span class="keywordflow">if</span>(verbose_opt[0])</div>
+<div class="line"><a name="l01141"></a><span class="lineno"> 1141</span>           std::cout << activePoints.back().posx << <span class="stringliteral">" "</span> << activePoints.back().posy << <span class="stringliteral">" "</span> << activePoints.back().value << std::endl;</div>
+<div class="line"><a name="l01142"></a><span class="lineno"> 1142</span>       }</div>
+<div class="line"><a name="l01143"></a><span class="lineno"> 1143</span>     }</div>
+<div class="line"><a name="l01144"></a><span class="lineno"> 1144</span>       }<span class="comment">//icol</span></div>
+<div class="line"><a name="l01145"></a><span class="lineno"> 1145</span>       <span class="comment">//----------------------------------- write output ------------------------------------------</span></div>
+<div class="line"><a name="l01146"></a><span class="lineno"> 1146</span>       <span class="keywordflow">if</span>(classBag_opt.size())</div>
+<div class="line"><a name="l01147"></a><span class="lineno"> 1147</span>         <span class="keywordflow">for</span>(<span class="keywordtype">int</span> ibag=0;ibag<nbag;++ibag)</div>
+<div class="line"><a name="l01148"></a><span class="lineno"> 1148</span>           classImageBag.writeData(classBag[ibag],GDT_Byte,iline,ibag);</div>
+<div class="line"><a name="l01149"></a><span class="lineno"> 1149</span>       <span class="keywordflow">if</span>(prob_opt.size()){</div>
+<div class="line"><a name="l01150"></a><span class="lineno"> 1150</span>         <span class="keywordflow">for</span>(<span class="keywordtype">short</span> iclass=0;iclass<nclass;++iclass)</div>
+<div class="line"><a name="l01151"></a><span class="lineno"> 1151</span>           probImage.writeData(probOut[iclass],GDT_Float32,iline,iclass);</div>
+<div class="line"><a name="l01152"></a><span class="lineno"> 1152</span>       }</div>
+<div class="line"><a name="l01153"></a><span class="lineno"> 1153</span>       <span class="keywordflow">if</span>(entropy_opt.size()){</div>
+<div class="line"><a name="l01154"></a><span class="lineno"> 1154</span>         entropyImage.writeData(entropy,GDT_Float32,iline);</div>
+<div class="line"><a name="l01155"></a><span class="lineno"> 1155</span>       }</div>
+<div class="line"><a name="l01156"></a><span class="lineno"> 1156</span>       classImageOut.writeData(classOut,GDT_Byte,iline);</div>
+<div class="line"><a name="l01157"></a><span class="lineno"> 1157</span>       <span class="keywordflow">if</span>(!verbose_opt[0]){</div>
+<div class="line"><a name="l01158"></a><span class="lineno"> 1158</span>         progress=<span class="keyword">static_cast<</span><span class="keywordtype">float</span><span class="keyword">></span>(iline+1.0)/classImageOut.nrOfRow();</div>
+<div class="line"><a name="l01159"></a><span class="lineno"> 1159</span>         pfnProgress(progress,pszMessage,pProgressArg);</div>
+<div class="line"><a name="l01160"></a><span class="lineno"> 1160</span>       }</div>
 <div class="line"><a name="l01161"></a><span class="lineno"> 1161</span>     }</div>
-<div class="line"><a name="l01162"></a><span class="lineno"> 1162</span>     pointMap[label_opt[0]]=0;</div>
-<div class="line"><a name="l01163"></a><span class="lineno"> 1163</span>     <span class="keywordtype">double</span> x, y;</div>
-<div class="line"><a name="l01164"></a><span class="lineno"> 1164</span>     testImage.image2geo(activePoints[iactive].posx,activePoints[iactive].posy,x,y);</div>
-<div class="line"><a name="l01165"></a><span class="lineno"> 1165</span>         std::string fieldname=<span class="stringliteral">"id"</span>;<span class="comment">//number of the point</span></div>
-<div class="line"><a name="l01166"></a><span class="lineno"> 1166</span>     activeWriter.addPoint(x,y,pointMap,fieldname,++nactive);</div>
-<div class="line"><a name="l01167"></a><span class="lineno"> 1167</span>       }</div>
-<div class="line"><a name="l01168"></a><span class="lineno"> 1168</span>     }</div>
-<div class="line"><a name="l01169"></a><span class="lineno"> 1169</span> </div>
-<div class="line"><a name="l01170"></a><span class="lineno"> 1170</span>     testImage.close();</div>
-<div class="line"><a name="l01171"></a><span class="lineno"> 1171</span>     <span class="keywordflow">if</span>(mask_opt.size())</div>
-<div class="line"><a name="l01172"></a><span class="lineno"> 1172</span>       maskReader.close();</div>
-<div class="line"><a name="l01173"></a><span class="lineno"> 1173</span>     <span class="keywordflow">if</span>(priorimg_opt.size())</div>
-<div class="line"><a name="l01174"></a><span class="lineno"> 1174</span>       priorReader.close();</div>
-<div class="line"><a name="l01175"></a><span class="lineno"> 1175</span>     <span class="keywordflow">if</span>(prob_opt.size())</div>
-<div class="line"><a name="l01176"></a><span class="lineno"> 1176</span>       probImage.close();</div>
-<div class="line"><a name="l01177"></a><span class="lineno"> 1177</span>     <span class="keywordflow">if</span>(entropy_opt.size())</div>
-<div class="line"><a name="l01178"></a><span class="lineno"> 1178</span>       entropyImage.close();</div>
-<div class="line"><a name="l01179"></a><span class="lineno"> 1179</span>     <span class="keywordflow">if</span>(classBag_opt.size())</div>
-<div class="line"><a name="l01180"></a><span class="lineno"> 1180</span>       classImageBag.close();</div>
-<div class="line"><a name="l01181"></a><span class="lineno"> 1181</span>     classImageOut.close();</div>
-<div class="line"><a name="l01182"></a><span class="lineno"> 1182</span>   }</div>
-<div class="line"><a name="l01183"></a><span class="lineno"> 1183</span>   <span class="keywordflow">else</span>{<span class="comment">//classify vector file</span></div>
-<div class="line"><a name="l01184"></a><span class="lineno"> 1184</span>     cm.clearResults();</div>
-<div class="line"><a name="l01185"></a><span class="lineno"> 1185</span>     <span class="comment">//notice that fields have already been set by readDataImageOgr (taking into account appropriate bands)</span></div>
-<div class="line"><a name="l01186"></a><span class="lineno"> 1186</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> ivalidation=0;ivalidation<input_opt.size();++ivalidation){</div>
-<div class="line"><a name="l01187"></a><span class="lineno"> 1187</span>       <span class="keywordflow">if</span>(output_opt.size())</div>
-<div class="line"><a name="l01188"></a><span class="lineno"> 1188</span>     assert(output_opt.size()==input_opt.size());</div>
-<div class="line"><a name="l01189"></a><span class="lineno"> 1189</span>       <span class="keywordflow">if</span>(verbose_opt[0])</div>
-<div class="line"><a name="l01190"></a><span class="lineno"> 1190</span>         std::cout << <span class="stringliteral">"opening img reader "</span> << input_opt[ivalidation] << std::endl;</div>
-<div class="line"><a name="l01191"></a><span class="lineno"> 1191</span>       imgReaderOgr.open(input_opt[ivalidation]);</div>
-<div class="line"><a name="l01192"></a><span class="lineno"> 1192</span>       <a class="code" href="classImgWriterOgr.html">ImgWriterOgr</a> imgWriterOgr;</div>
-<div class="line"><a name="l01193"></a><span class="lineno"> 1193</span> </div>
-<div class="line"><a name="l01194"></a><span class="lineno"> 1194</span>       <span class="keywordflow">if</span>(output_opt.size()){</div>
-<div class="line"><a name="l01195"></a><span class="lineno"> 1195</span>     <span class="keywordflow">if</span>(verbose_opt[0])</div>
-<div class="line"><a name="l01196"></a><span class="lineno"> 1196</span>       std::cout << <span class="stringliteral">"opening img writer and copying fields from img reader"</span> << output_opt[ivalidation] << std::endl;</div>
-<div class="line"><a name="l01197"></a><span class="lineno"> 1197</span>     imgWriterOgr.open(output_opt[ivalidation],imgReaderOgr);</div>
-<div class="line"><a name="l01198"></a><span class="lineno"> 1198</span>       }</div>
-<div class="line"><a name="l01199"></a><span class="lineno"> 1199</span>       <span class="keywordflow">if</span>(verbose_opt[0])</div>
-<div class="line"><a name="l01200"></a><span class="lineno"> 1200</span>     cout << <span class="stringliteral">"number of layers in input ogr file: "</span> << imgReaderOgr.getLayerCount() << endl;</div>
-<div class="line"><a name="l01201"></a><span class="lineno"> 1201</span>       <span class="keywordflow">for</span>(<span class="keywordtype">int</span> ilayer=0;ilayer<imgReaderOgr.getLayerCount();++ilayer){</div>
-<div class="line"><a name="l01202"></a><span class="lineno"> 1202</span>     <span class="keywordflow">if</span>(verbose_opt[0])</div>
-<div class="line"><a name="l01203"></a><span class="lineno"> 1203</span>       cout << <span class="stringliteral">"processing input layer "</span> << ilayer << endl;</div>
-<div class="line"><a name="l01204"></a><span class="lineno"> 1204</span>     <span class="keywordflow">if</span>(output_opt.size()){</div>
-<div class="line"><a name="l01205"></a><span class="lineno"> 1205</span>       <span class="keywordflow">if</span>(verbose_opt[0])</div>
-<div class="line"><a name="l01206"></a><span class="lineno"> 1206</span>         std::cout << <span class="stringliteral">"creating field class"</span> << std::endl;</div>
-<div class="line"><a name="l01207"></a><span class="lineno"> 1207</span>       <span class="keywordflow">if</span>(classValueMap.size())</div>
-<div class="line"><a name="l01208"></a><span class="lineno"> 1208</span>         imgWriterOgr.createField(<span class="stringliteral">"class"</span>,OFTInteger,ilayer);</div>
-<div class="line"><a name="l01209"></a><span class="lineno"> 1209</span>       <span class="keywordflow">else</span></div>
-<div class="line"><a name="l01210"></a><span class="lineno"> 1210</span>         imgWriterOgr.createField(<span class="stringliteral">"class"</span>,OFTString,ilayer);</div>
-<div class="line"><a name="l01211"></a><span class="lineno"> 1211</span>     }</div>
-<div class="line"><a name="l01212"></a><span class="lineno"> 1212</span>     <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> nFeatures=imgReaderOgr.getFeatureCount(ilayer);</div>
-<div class="line"><a name="l01213"></a><span class="lineno"> 1213</span>     <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> ifeature=0;</div>
-<div class="line"><a name="l01214"></a><span class="lineno"> 1214</span>     progress=0;</div>
-<div class="line"><a name="l01215"></a><span class="lineno"> 1215</span>     pfnProgress(progress,pszMessage,pProgressArg);</div>
-<div class="line"><a name="l01216"></a><span class="lineno"> 1216</span>     OGRFeature *poFeature;</div>
-<div class="line"><a name="l01217"></a><span class="lineno"> 1217</span>     <span class="keywordflow">while</span>( (poFeature = imgReaderOgr.getLayer(ilayer)->GetNextFeature()) != NULL ){</div>
-<div class="line"><a name="l01218"></a><span class="lineno"> 1218</span>       <span class="keywordflow">if</span>(verbose_opt[0]>1)</div>
-<div class="line"><a name="l01219"></a><span class="lineno"> 1219</span>         std::cout << <span class="stringliteral">"feature "</span> << ifeature << std::endl;</div>
-<div class="line"><a name="l01220"></a><span class="lineno"> 1220</span>       <span class="keywordflow">if</span>( poFeature == NULL ){</div>
-<div class="line"><a name="l01221"></a><span class="lineno"> 1221</span>           cout << <span class="stringliteral">"Warning: could not read feature "</span> << ifeature << <span class="stringliteral">" in layer "</span> << imgReaderOgr.getLayerName(ilayer) << endl;</div>
-<div class="line"><a name="l01222"></a><span class="lineno"> 1222</span>           <span class="keywordflow">continue</span>;</div>
-<div class="line"><a name="l01223"></a><span class="lineno"> 1223</span>       }</div>
-<div class="line"><a name="l01224"></a><span class="lineno"> 1224</span>       OGRFeature *poDstFeature = NULL;</div>
-<div class="line"><a name="l01225"></a><span class="lineno"> 1225</span>       <span class="keywordflow">if</span>(output_opt.size()){</div>
-<div class="line"><a name="l01226"></a><span class="lineno"> 1226</span>         poDstFeature=imgWriterOgr.createFeature(ilayer);</div>
-<div class="line"><a name="l01227"></a><span class="lineno"> 1227</span>         <span class="keywordflow">if</span>( poDstFeature->SetFrom( poFeature, TRUE ) != OGRERR_NONE ){</div>
-<div class="line"><a name="l01228"></a><span class="lineno"> 1228</span>           CPLError( CE_Failure, CPLE_AppDefined,</div>
-<div class="line"><a name="l01229"></a><span class="lineno"> 1229</span>             <span class="stringliteral">"Unable to translate feature %d from layer %s.\n"</span>,</div>
-<div class="line"><a name="l01230"></a><span class="lineno"> 1230</span>             poFeature->GetFID(), imgWriterOgr.getLayerName(ilayer).c_str() );</div>
-<div class="line"><a name="l01231"></a><span class="lineno"> 1231</span>           OGRFeature::DestroyFeature( poFeature );</div>
-<div class="line"><a name="l01232"></a><span class="lineno"> 1232</span>           OGRFeature::DestroyFeature( poDstFeature );</div>
-<div class="line"><a name="l01233"></a><span class="lineno"> 1233</span>         }</div>
+<div class="line"><a name="l01162"></a><span class="lineno"> 1162</span>     <span class="comment">//write active learning points</span></div>
+<div class="line"><a name="l01163"></a><span class="lineno"> 1163</span>     <span class="keywordflow">if</span>(active_opt.size()){</div>
+<div class="line"><a name="l01164"></a><span class="lineno"> 1164</span>       <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iactive=0;iactive<activePoints.size();++iactive){</div>
+<div class="line"><a name="l01165"></a><span class="lineno"> 1165</span>     std::map<string,double> pointMap;</div>
+<div class="line"><a name="l01166"></a><span class="lineno"> 1166</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iband=0;iband<testImage.nrOfBand();++iband){</div>
+<div class="line"><a name="l01167"></a><span class="lineno"> 1167</span>       <span class="keywordtype">double</span> value;</div>
+<div class="line"><a name="l01168"></a><span class="lineno"> 1168</span>       testImage.readData(value,GDT_Float64,static_cast<int>(activePoints[iactive].posx),static_cast<int>(activePoints[iactive].posy),iband);</div>
+<div class="line"><a name="l01169"></a><span class="lineno"> 1169</span>       ostringstream fs;</div>
+<div class="line"><a name="l01170"></a><span class="lineno"> 1170</span>       fs << <span class="stringliteral">"B"</span> << iband;</div>
+<div class="line"><a name="l01171"></a><span class="lineno"> 1171</span>       pointMap[fs.str()]=value;</div>
+<div class="line"><a name="l01172"></a><span class="lineno"> 1172</span>     }</div>
+<div class="line"><a name="l01173"></a><span class="lineno"> 1173</span>     pointMap[label_opt[0]]=0;</div>
+<div class="line"><a name="l01174"></a><span class="lineno"> 1174</span>     <span class="keywordtype">double</span> x, y;</div>
+<div class="line"><a name="l01175"></a><span class="lineno"> 1175</span>     testImage.image2geo(activePoints[iactive].posx,activePoints[iactive].posy,x,y);</div>
+<div class="line"><a name="l01176"></a><span class="lineno"> 1176</span>         std::string fieldname=<span class="stringliteral">"id"</span>;<span class="comment">//number of the point</span></div>
+<div class="line"><a name="l01177"></a><span class="lineno"> 1177</span>     activeWriter.addPoint(x,y,pointMap,fieldname,++nactive);</div>
+<div class="line"><a name="l01178"></a><span class="lineno"> 1178</span>       }</div>
+<div class="line"><a name="l01179"></a><span class="lineno"> 1179</span>     }</div>
+<div class="line"><a name="l01180"></a><span class="lineno"> 1180</span> </div>
+<div class="line"><a name="l01181"></a><span class="lineno"> 1181</span>     testImage.close();</div>
+<div class="line"><a name="l01182"></a><span class="lineno"> 1182</span>     <span class="keywordflow">if</span>(mask_opt.size())</div>
+<div class="line"><a name="l01183"></a><span class="lineno"> 1183</span>       maskReader.close();</div>
+<div class="line"><a name="l01184"></a><span class="lineno"> 1184</span>     <span class="keywordflow">if</span>(priorimg_opt.size())</div>
+<div class="line"><a name="l01185"></a><span class="lineno"> 1185</span>       priorReader.close();</div>
+<div class="line"><a name="l01186"></a><span class="lineno"> 1186</span>     <span class="keywordflow">if</span>(prob_opt.size())</div>
+<div class="line"><a name="l01187"></a><span class="lineno"> 1187</span>       probImage.close();</div>
+<div class="line"><a name="l01188"></a><span class="lineno"> 1188</span>     <span class="keywordflow">if</span>(entropy_opt.size())</div>
+<div class="line"><a name="l01189"></a><span class="lineno"> 1189</span>       entropyImage.close();</div>
+<div class="line"><a name="l01190"></a><span class="lineno"> 1190</span>     <span class="keywordflow">if</span>(classBag_opt.size())</div>
+<div class="line"><a name="l01191"></a><span class="lineno"> 1191</span>       classImageBag.close();</div>
+<div class="line"><a name="l01192"></a><span class="lineno"> 1192</span>     classImageOut.close();</div>
+<div class="line"><a name="l01193"></a><span class="lineno"> 1193</span>   }</div>
+<div class="line"><a name="l01194"></a><span class="lineno"> 1194</span>   <span class="keywordflow">else</span>{<span class="comment">//classify vector file</span></div>
+<div class="line"><a name="l01195"></a><span class="lineno"> 1195</span>     cm.clearResults();</div>
+<div class="line"><a name="l01196"></a><span class="lineno"> 1196</span>     <span class="comment">//notice that fields have already been set by readDataImageOgr (taking into account appropriate bands)</span></div>
+<div class="line"><a name="l01197"></a><span class="lineno"> 1197</span>     <span class="keywordflow">for</span>(<span class="keywordtype">int</span> ivalidation=0;ivalidation<input_opt.size();++ivalidation){</div>
+<div class="line"><a name="l01198"></a><span class="lineno"> 1198</span>       <span class="keywordflow">if</span>(output_opt.size())</div>
+<div class="line"><a name="l01199"></a><span class="lineno"> 1199</span>     assert(output_opt.size()==input_opt.size());</div>
+<div class="line"><a name="l01200"></a><span class="lineno"> 1200</span>       <span class="keywordflow">if</span>(verbose_opt[0])</div>
+<div class="line"><a name="l01201"></a><span class="lineno"> 1201</span>         std::cout << <span class="stringliteral">"opening img reader "</span> << input_opt[ivalidation] << std::endl;</div>
+<div class="line"><a name="l01202"></a><span class="lineno"> 1202</span>       imgReaderOgr.open(input_opt[ivalidation]);</div>
+<div class="line"><a name="l01203"></a><span class="lineno"> 1203</span>       <a class="code" href="classImgWriterOgr.html">ImgWriterOgr</a> imgWriterOgr;</div>
+<div class="line"><a name="l01204"></a><span class="lineno"> 1204</span> </div>
+<div class="line"><a name="l01205"></a><span class="lineno"> 1205</span>       <span class="keywordflow">if</span>(output_opt.size()){</div>
+<div class="line"><a name="l01206"></a><span class="lineno"> 1206</span>     <span class="keywordflow">if</span>(verbose_opt[0])</div>
+<div class="line"><a name="l01207"></a><span class="lineno"> 1207</span>       std::cout << <span class="stringliteral">"opening img writer and copying fields from img reader"</span> << output_opt[ivalidation] << std::endl;</div>
+<div class="line"><a name="l01208"></a><span class="lineno"> 1208</span>     imgWriterOgr.open(output_opt[ivalidation],imgReaderOgr);</div>
+<div class="line"><a name="l01209"></a><span class="lineno"> 1209</span>       }</div>
+<div class="line"><a name="l01210"></a><span class="lineno"> 1210</span>       <span class="keywordflow">if</span>(verbose_opt[0])</div>
+<div class="line"><a name="l01211"></a><span class="lineno"> 1211</span>     cout << <span class="stringliteral">"number of layers in input ogr file: "</span> << imgReaderOgr.getLayerCount() << endl;</div>
+<div class="line"><a name="l01212"></a><span class="lineno"> 1212</span>       <span class="keywordflow">for</span>(<span class="keywordtype">int</span> ilayer=0;ilayer<imgReaderOgr.getLayerCount();++ilayer){</div>
+<div class="line"><a name="l01213"></a><span class="lineno"> 1213</span>     <span class="keywordflow">if</span>(verbose_opt[0])</div>
+<div class="line"><a name="l01214"></a><span class="lineno"> 1214</span>       cout << <span class="stringliteral">"processing input layer "</span> << ilayer << endl;</div>
+<div class="line"><a name="l01215"></a><span class="lineno"> 1215</span>     <span class="keywordflow">if</span>(output_opt.size()){</div>
+<div class="line"><a name="l01216"></a><span class="lineno"> 1216</span>       <span class="keywordflow">if</span>(verbose_opt[0])</div>
+<div class="line"><a name="l01217"></a><span class="lineno"> 1217</span>         std::cout << <span class="stringliteral">"creating field class"</span> << std::endl;</div>
+<div class="line"><a name="l01218"></a><span class="lineno"> 1218</span>       <span class="keywordflow">if</span>(classValueMap.size())</div>
+<div class="line"><a name="l01219"></a><span class="lineno"> 1219</span>         imgWriterOgr.createField(<span class="stringliteral">"class"</span>,OFTInteger,ilayer);</div>
+<div class="line"><a name="l01220"></a><span class="lineno"> 1220</span>       <span class="keywordflow">else</span></div>
+<div class="line"><a name="l01221"></a><span class="lineno"> 1221</span>         imgWriterOgr.createField(<span class="stringliteral">"class"</span>,OFTString,ilayer);</div>
+<div class="line"><a name="l01222"></a><span class="lineno"> 1222</span>     }</div>
+<div class="line"><a name="l01223"></a><span class="lineno"> 1223</span>     <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> nFeatures=imgReaderOgr.getFeatureCount(ilayer);</div>
+<div class="line"><a name="l01224"></a><span class="lineno"> 1224</span>     <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> ifeature=0;</div>
+<div class="line"><a name="l01225"></a><span class="lineno"> 1225</span>     progress=0;</div>
+<div class="line"><a name="l01226"></a><span class="lineno"> 1226</span>     pfnProgress(progress,pszMessage,pProgressArg);</div>
+<div class="line"><a name="l01227"></a><span class="lineno"> 1227</span>     OGRFeature *poFeature;</div>
+<div class="line"><a name="l01228"></a><span class="lineno"> 1228</span>     <span class="keywordflow">while</span>( (poFeature = imgReaderOgr.getLayer(ilayer)->GetNextFeature()) != NULL ){</div>
+<div class="line"><a name="l01229"></a><span class="lineno"> 1229</span>       <span class="keywordflow">if</span>(verbose_opt[0]>1)</div>
+<div class="line"><a name="l01230"></a><span class="lineno"> 1230</span>         std::cout << <span class="stringliteral">"feature "</span> << ifeature << std::endl;</div>
+<div class="line"><a name="l01231"></a><span class="lineno"> 1231</span>       <span class="keywordflow">if</span>( poFeature == NULL ){</div>
+<div class="line"><a name="l01232"></a><span class="lineno"> 1232</span>           cout << <span class="stringliteral">"Warning: could not read feature "</span> << ifeature << <span class="stringliteral">" in layer "</span> << imgReaderOgr.getLayerName(ilayer) << endl;</div>
+<div class="line"><a name="l01233"></a><span class="lineno"> 1233</span>           <span class="keywordflow">continue</span>;</div>
 <div class="line"><a name="l01234"></a><span class="lineno"> 1234</span>       }</div>
-<div class="line"><a name="l01235"></a><span class="lineno"> 1235</span>       vector<float> validationPixel;</div>
-<div class="line"><a name="l01236"></a><span class="lineno"> 1236</span>       vector<float> validationFeature;</div>
-<div class="line"><a name="l01237"></a><span class="lineno"> 1237</span>         </div>
-<div class="line"><a name="l01238"></a><span class="lineno"> 1238</span>       imgReaderOgr.readData(validationPixel,OFTReal,fields,poFeature,ilayer);</div>
-<div class="line"><a name="l01239"></a><span class="lineno"> 1239</span>       assert(validationPixel.size()==nband);</div>
-<div class="line"><a name="l01240"></a><span class="lineno"> 1240</span>       vector<float> probOut(nclass);<span class="comment">//posterior prob for each class</span></div>
-<div class="line"><a name="l01241"></a><span class="lineno"> 1241</span>       <span class="keywordflow">for</span>(<span class="keywordtype">short</span> iclass=0;iclass<nclass;++iclass)</div>
-<div class="line"><a name="l01242"></a><span class="lineno"> 1242</span>         probOut[iclass]=0;</div>
-<div class="line"><a name="l01243"></a><span class="lineno"> 1243</span>       <span class="keywordflow">for</span>(<span class="keywordtype">int</span> ibag=0;ibag<nbag;++ibag){</div>
-<div class="line"><a name="l01244"></a><span class="lineno"> 1244</span>         <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iband=0;iband<nband;++iband){</div>
-<div class="line"><a name="l01245"></a><span class="lineno"> 1245</span>           validationFeature.push_back((validationPixel[iband]-offset[ibag][iband])/scale[ibag][iband]);</div>
-<div class="line"><a name="l01246"></a><span class="lineno"> 1246</span>           <span class="keywordflow">if</span>(verbose_opt[0]==2)</div>
-<div class="line"><a name="l01247"></a><span class="lineno"> 1247</span>         std::cout << <span class="stringliteral">" "</span> << validationFeature.back();</div>
-<div class="line"><a name="l01248"></a><span class="lineno"> 1248</span>         }</div>
-<div class="line"><a name="l01249"></a><span class="lineno"> 1249</span>         <span class="keywordflow">if</span>(verbose_opt[0]==2)</div>
-<div class="line"><a name="l01250"></a><span class="lineno"> 1250</span>           std::cout << std::endl;</div>
-<div class="line"><a name="l01251"></a><span class="lineno"> 1251</span>         vector<double> result(nclass);</div>
-<div class="line"><a name="l01252"></a><span class="lineno"> 1252</span>         <span class="keyword">struct </span><a class="code" href="structsvm__node.html">svm_node</a> *x;</div>
-<div class="line"><a name="l01253"></a><span class="lineno"> 1253</span>         x = (<span class="keyword">struct </span><a class="code" href="structsvm__node.html">svm_node</a> *) malloc((validationFeature.size()+1)*<span class="keyword">sizeof</span>(<span class="keyword">struct</span> <a class="code" href="structsvm__node.html">svm_node</a>));</div>
-<div class="line"><a name="l01254"></a><span class="lineno"> 1254</span>         <span class="keywordflow">for</span>(<span class="keywordtype">int</span> i=0;i<validationFeature.size();++i){</div>
-<div class="line"><a name="l01255"></a><span class="lineno"> 1255</span>           x[i].index=i+1;</div>
-<div class="line"><a name="l01256"></a><span class="lineno"> 1256</span>           x[i].value=validationFeature[i];</div>
-<div class="line"><a name="l01257"></a><span class="lineno"> 1257</span>         }</div>
-<div class="line"><a name="l01258"></a><span class="lineno"> 1258</span> </div>
-<div class="line"><a name="l01259"></a><span class="lineno"> 1259</span>         x[validationFeature.size()].index=-1;<span class="comment">//to end svm feature vector</span></div>
-<div class="line"><a name="l01260"></a><span class="lineno"> 1260</span>         <span class="keywordtype">double</span> predict_label=0;</div>
-<div class="line"><a name="l01261"></a><span class="lineno"> 1261</span>         <span class="keywordflow">if</span>(!prob_est_opt[0]){</div>
-<div class="line"><a name="l01262"></a><span class="lineno"> 1262</span>           predict_label = svm_predict(svm[ibag],x);</div>
-<div class="line"><a name="l01263"></a><span class="lineno"> 1263</span>           <span class="keywordflow">for</span>(<span class="keywordtype">short</span> iclass=0;iclass<nclass;++iclass){</div>
-<div class="line"><a name="l01264"></a><span class="lineno"> 1264</span>         <span class="keywordflow">if</span>(iclass==static_cast<short>(predict_label))</div>
-<div class="line"><a name="l01265"></a><span class="lineno"> 1265</span>           result[iclass]=1;</div>
-<div class="line"><a name="l01266"></a><span class="lineno"> 1266</span>         <span class="keywordflow">else</span></div>
-<div class="line"><a name="l01267"></a><span class="lineno"> 1267</span>           result[iclass]=0;</div>
-<div class="line"><a name="l01268"></a><span class="lineno"> 1268</span>           }</div>
-<div class="line"><a name="l01269"></a><span class="lineno"> 1269</span>         }</div>
-<div class="line"><a name="l01270"></a><span class="lineno"> 1270</span>         <span class="keywordflow">else</span>{</div>
-<div class="line"><a name="l01271"></a><span class="lineno"> 1271</span>           assert(svm_check_probability_model(svm[ibag]));</div>
-<div class="line"><a name="l01272"></a><span class="lineno"> 1272</span>           predict_label = svm_predict_probability(svm[ibag],x,&(result[0]));</div>
-<div class="line"><a name="l01273"></a><span class="lineno"> 1273</span>         }</div>
-<div class="line"><a name="l01274"></a><span class="lineno"> 1274</span>         <span class="keywordflow">if</span>(verbose_opt[0]>1){</div>
-<div class="line"><a name="l01275"></a><span class="lineno"> 1275</span>           std::cout << <span class="stringliteral">"predict_label: "</span> << predict_label << std::endl;</div>
-<div class="line"><a name="l01276"></a><span class="lineno"> 1276</span>           <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iclass=0;iclass<result.size();++iclass)</div>
-<div class="line"><a name="l01277"></a><span class="lineno"> 1277</span>         std::cout << result[iclass] << <span class="stringliteral">" "</span>;</div>
-<div class="line"><a name="l01278"></a><span class="lineno"> 1278</span>           std::cout << std::endl;</div>
-<div class="line"><a name="l01279"></a><span class="lineno"> 1279</span>         }</div>
-<div class="line"><a name="l01280"></a><span class="lineno"> 1280</span> </div>
-<div class="line"><a name="l01281"></a><span class="lineno"> 1281</span>         <span class="comment">//calculate posterior prob of bag </span></div>
-<div class="line"><a name="l01282"></a><span class="lineno"> 1282</span>         <span class="keywordflow">for</span>(<span class="keywordtype">short</span> iclass=0;iclass<nclass;++iclass){</div>
-<div class="line"><a name="l01283"></a><span class="lineno"> 1283</span>           <span class="keywordflow">switch</span>(comb_opt[0]){</div>
-<div class="line"><a name="l01284"></a><span class="lineno"> 1284</span>           <span class="keywordflow">default</span>:</div>
-<div class="line"><a name="l01285"></a><span class="lineno"> 1285</span>           <span class="keywordflow">case</span>(0):<span class="comment">//sum rule</span></div>
-<div class="line"><a name="l01286"></a><span class="lineno"> 1286</span>         probOut[iclass]+=result[iclass]*priors[iclass];<span class="comment">//add probabilities for each bag</span></div>
-<div class="line"><a name="l01287"></a><span class="lineno"> 1287</span>           <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l01288"></a><span class="lineno"> 1288</span>           <span class="keywordflow">case</span>(1):<span class="comment">//product rule</span></div>
-<div class="line"><a name="l01289"></a><span class="lineno"> 1289</span>         probOut[iclass]*=pow(static_cast<float>(priors[iclass]),static_cast<float>(1.0-nbag)/nbag)*result[iclass];<span class="comment">//multiply probabilities for each bag</span></div>
-<div class="line"><a name="l01290"></a><span class="lineno"> 1290</span>         <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l01291"></a><span class="lineno"> 1291</span>           <span class="keywordflow">case</span>(2):<span class="comment">//max rule</span></div>
-<div class="line"><a name="l01292"></a><span class="lineno"> 1292</span>         <span class="keywordflow">if</span>(priors[iclass]*result[iclass]>probOut[iclass])</div>
-<div class="line"><a name="l01293"></a><span class="lineno"> 1293</span>           probOut[iclass]=priors[iclass]*result[iclass];</div>
-<div class="line"><a name="l01294"></a><span class="lineno"> 1294</span>         <span class="keywordflow">break</span>;</div>
-<div class="line"><a name="l01295"></a><span class="lineno"> 1295</span>           }</div>
-<div class="line"><a name="l01296"></a><span class="lineno"> 1296</span>         }</div>
-<div class="line"><a name="l01297"></a><span class="lineno"> 1297</span>         free(x);</div>
-<div class="line"><a name="l01298"></a><span class="lineno"> 1298</span>       }<span class="comment">//for ibag</span></div>
-<div class="line"><a name="l01299"></a><span class="lineno"> 1299</span> </div>
-<div class="line"><a name="l01300"></a><span class="lineno"> 1300</span>       <span class="comment">//search for max class prob</span></div>
-<div class="line"><a name="l01301"></a><span class="lineno"> 1301</span>       <span class="keywordtype">float</span> maxBag=0;</div>
-<div class="line"><a name="l01302"></a><span class="lineno"> 1302</span>       <span class="keywordtype">float</span> normBag=0;</div>
-<div class="line"><a name="l01303"></a><span class="lineno"> 1303</span>       <span class="keywordtype">string</span> classOut=<span class="stringliteral">"Unclassified"</span>;</div>
-<div class="line"><a name="l01304"></a><span class="lineno"> 1304</span>       <span class="keywordflow">for</span>(<span class="keywordtype">short</span> iclass=0;iclass<nclass;++iclass){</div>
-<div class="line"><a name="l01305"></a><span class="lineno"> 1305</span>         <span class="keywordflow">if</span>(verbose_opt[0]>1)</div>
-<div class="line"><a name="l01306"></a><span class="lineno"> 1306</span>           std::cout << probOut[iclass] << <span class="stringliteral">" "</span>;</div>
-<div class="line"><a name="l01307"></a><span class="lineno"> 1307</span>         <span class="keywordflow">if</span>(probOut[iclass]>maxBag){</div>
-<div class="line"><a name="l01308"></a><span class="lineno"> 1308</span>           maxBag=probOut[iclass];</div>
-<div class="line"><a name="l01309"></a><span class="lineno"> 1309</span>           classOut=nameVector[iclass];</div>
-<div class="line"><a name="l01310"></a><span class="lineno"> 1310</span>         }</div>
-<div class="line"><a name="l01311"></a><span class="lineno"> 1311</span>       }</div>
-<div class="line"><a name="l01312"></a><span class="lineno"> 1312</span>       <span class="comment">//look for class name</span></div>
-<div class="line"><a name="l01313"></a><span class="lineno"> 1313</span>       <span class="keywordflow">if</span>(verbose_opt[0]>1){</div>
-<div class="line"><a name="l01314"></a><span class="lineno"> 1314</span>         <span class="keywordflow">if</span>(classValueMap.size())</div>
-<div class="line"><a name="l01315"></a><span class="lineno"> 1315</span>           std::cout << <span class="stringliteral">"->"</span> << classValueMap[classOut] << std::endl;</div>
-<div class="line"><a name="l01316"></a><span class="lineno"> 1316</span>         <span class="keywordflow">else</span>        </div>
-<div class="line"><a name="l01317"></a><span class="lineno"> 1317</span>           std::cout << <span class="stringliteral">"->"</span> << classOut << std::endl;</div>
-<div class="line"><a name="l01318"></a><span class="lineno"> 1318</span>       }</div>
-<div class="line"><a name="l01319"></a><span class="lineno"> 1319</span>       <span class="keywordflow">if</span>(output_opt.size()){</div>
-<div class="line"><a name="l01320"></a><span class="lineno"> 1320</span>         <span class="keywordflow">if</span>(classValueMap.size())</div>
-<div class="line"><a name="l01321"></a><span class="lineno"> 1321</span>           poDstFeature->SetField(<span class="stringliteral">"class"</span>,classValueMap[classOut]);</div>
-<div class="line"><a name="l01322"></a><span class="lineno"> 1322</span>         <span class="keywordflow">else</span>        </div>
-<div class="line"><a name="l01323"></a><span class="lineno"> 1323</span>           poDstFeature->SetField(<span class="stringliteral">"class"</span>,classOut.c_str());</div>
-<div class="line"><a name="l01324"></a><span class="lineno"> 1324</span>         poDstFeature->SetFID( poFeature->GetFID() );</div>
-<div class="line"><a name="l01325"></a><span class="lineno"> 1325</span>       }</div>
-<div class="line"><a name="l01326"></a><span class="lineno"> 1326</span>       <span class="keywordtype">int</span> labelIndex=poFeature->GetFieldIndex(label_opt[0].c_str());</div>
-<div class="line"><a name="l01327"></a><span class="lineno"> 1327</span>       <span class="keywordflow">if</span>(labelIndex>=0){</div>
-<div class="line"><a name="l01328"></a><span class="lineno"> 1328</span>         <span class="keywordtype">string</span> classRef=poFeature->GetFieldAsString(labelIndex);</div>
-<div class="line"><a name="l01329"></a><span class="lineno"> 1329</span>         <span class="keywordflow">if</span>(classRef!=<span class="stringliteral">"0"</span>){</div>
-<div class="line"><a name="l01330"></a><span class="lineno"> 1330</span>           <span class="keywordflow">if</span>(classValueMap.size())</div>
-<div class="line"><a name="l01331"></a><span class="lineno"> 1331</span>         cm.incrementResult(type2string<short>(classValueMap[classRef]),type2string<short>(classValueMap[classOut]),1);</div>
-<div class="line"><a name="l01332"></a><span class="lineno"> 1332</span>           <span class="keywordflow">else</span></div>
-<div class="line"><a name="l01333"></a><span class="lineno"> 1333</span>         cm.incrementResult(classRef,classOut,1);</div>
-<div class="line"><a name="l01334"></a><span class="lineno"> 1334</span>         }</div>
-<div class="line"><a name="l01335"></a><span class="lineno"> 1335</span>       }</div>
-<div class="line"><a name="l01336"></a><span class="lineno"> 1336</span>       CPLErrorReset();</div>
-<div class="line"><a name="l01337"></a><span class="lineno"> 1337</span>       <span class="keywordflow">if</span>(output_opt.size()){</div>
-<div class="line"><a name="l01338"></a><span class="lineno"> 1338</span>         <span class="keywordflow">if</span>(imgWriterOgr.createFeature(poDstFeature,ilayer) != OGRERR_NONE){</div>
-<div class="line"><a name="l01339"></a><span class="lineno"> 1339</span>           CPLError( CE_Failure, CPLE_AppDefined,</div>
-<div class="line"><a name="l01340"></a><span class="lineno"> 1340</span>             <span class="stringliteral">"Unable to translate feature %d from layer %s.\n"</span>,</div>
-<div class="line"><a name="l01341"></a><span class="lineno"> 1341</span>             poFeature->GetFID(), imgWriterOgr.getLayerName(ilayer).c_str() );</div>
-<div class="line"><a name="l01342"></a><span class="lineno"> 1342</span>           OGRFeature::DestroyFeature( poDstFeature );</div>
-<div class="line"><a name="l01343"></a><span class="lineno"> 1343</span>           OGRFeature::DestroyFeature( poDstFeature );</div>
-<div class="line"><a name="l01344"></a><span class="lineno"> 1344</span>         }</div>
-<div class="line"><a name="l01345"></a><span class="lineno"> 1345</span>       }</div>
-<div class="line"><a name="l01346"></a><span class="lineno"> 1346</span>       ++ifeature;</div>
-<div class="line"><a name="l01347"></a><span class="lineno"> 1347</span>       <span class="keywordflow">if</span>(!verbose_opt[0]){</div>
-<div class="line"><a name="l01348"></a><span class="lineno"> 1348</span>         progress=<span class="keyword">static_cast<</span><span class="keywordtype">float</span><span class="keyword">></span>(ifeature+1.0)/nFeatures;</div>
-<div class="line"><a name="l01349"></a><span class="lineno"> 1349</span>         pfnProgress(progress,pszMessage,pProgressArg);</div>
-<div class="line"><a name="l01350"></a><span class="lineno"> 1350</span>       }</div>
-<div class="line"><a name="l01351"></a><span class="lineno"> 1351</span>       OGRFeature::DestroyFeature( poFeature );</div>
-<div class="line"><a name="l01352"></a><span class="lineno"> 1352</span>       OGRFeature::DestroyFeature( poDstFeature );</div>
-<div class="line"><a name="l01353"></a><span class="lineno"> 1353</span>     }<span class="comment">//get next feature</span></div>
-<div class="line"><a name="l01354"></a><span class="lineno"> 1354</span>       }<span class="comment">//next layer</span></div>
-<div class="line"><a name="l01355"></a><span class="lineno"> 1355</span>       imgReaderOgr.close();</div>
-<div class="line"><a name="l01356"></a><span class="lineno"> 1356</span>       <span class="keywordflow">if</span>(output_opt.size())</div>
-<div class="line"><a name="l01357"></a><span class="lineno"> 1357</span>     imgWriterOgr.close();</div>
-<div class="line"><a name="l01358"></a><span class="lineno"> 1358</span>     }</div>
-<div class="line"><a name="l01359"></a><span class="lineno"> 1359</span>     <span class="keywordflow">if</span>(cm.nReference()){</div>
-<div class="line"><a name="l01360"></a><span class="lineno"> 1360</span>       std::cout << cm << std::endl;</div>
-<div class="line"><a name="l01361"></a><span class="lineno"> 1361</span>       cout << <span class="stringliteral">"class #samples userAcc prodAcc"</span> << endl;</div>
-<div class="line"><a name="l01362"></a><span class="lineno"> 1362</span>       <span class="keywordtype">double</span> se95_ua=0;</div>
-<div class="line"><a name="l01363"></a><span class="lineno"> 1363</span>       <span class="keywordtype">double</span> se95_pa=0;</div>
-<div class="line"><a name="l01364"></a><span class="lineno"> 1364</span>       <span class="keywordtype">double</span> se95_oa=0;</div>
-<div class="line"><a name="l01365"></a><span class="lineno"> 1365</span>       <span class="keywordtype">double</span> dua=0;</div>
-<div class="line"><a name="l01366"></a><span class="lineno"> 1366</span>       <span class="keywordtype">double</span> dpa=0;</div>
-<div class="line"><a name="l01367"></a><span class="lineno"> 1367</span>       <span class="keywordtype">double</span> doa=0;</div>
-<div class="line"><a name="l01368"></a><span class="lineno"> 1368</span>       <span class="keywordflow">for</span>(<span class="keywordtype">short</span> iclass=0;iclass<cm.nClasses();++iclass){</div>
-<div class="line"><a name="l01369"></a><span class="lineno"> 1369</span>     dua=cm.ua_pct(cm.getClass(iclass),&se95_ua);</div>
-<div class="line"><a name="l01370"></a><span class="lineno"> 1370</span>     dpa=cm.pa_pct(cm.getClass(iclass),&se95_pa);</div>
-<div class="line"><a name="l01371"></a><span class="lineno"> 1371</span>     cout << cm.getClass(iclass) << <span class="stringliteral">" "</span> << cm.nReference(cm.getClass(iclass)) << <span class="stringliteral">" "</span> << dua << <span class="stringliteral">" ("</span> << se95_ua << <span class="stringliteral">")"</span> << <span class="stringliteral">" "</span> << dp [...]
-<div class="line"><a name="l01372"></a><span class="lineno"> 1372</span>       }</div>
-<div class="line"><a name="l01373"></a><span class="lineno"> 1373</span>       std::cout << <span class="stringliteral">"Kappa: "</span> << cm.kappa() << std::endl;</div>
-<div class="line"><a name="l01374"></a><span class="lineno"> 1374</span>       doa=cm.oa(&se95_oa);</div>
-<div class="line"><a name="l01375"></a><span class="lineno"> 1375</span>       std::cout << <span class="stringliteral">"Overall Accuracy: "</span> << 100*doa << <span class="stringliteral">" ("</span> << 100*se95_oa << <span class="stringliteral">")"</span>  << std::endl;</div>
-<div class="line"><a name="l01376"></a><span class="lineno"> 1376</span>     }</div>
-<div class="line"><a name="l01377"></a><span class="lineno"> 1377</span>   }</div>
-<div class="line"><a name="l01378"></a><span class="lineno"> 1378</span>   <span class="keywordflow">try</span>{</div>
-<div class="line"><a name="l01379"></a><span class="lineno"> 1379</span>     <span class="keywordflow">if</span>(active_opt.size())</div>
-<div class="line"><a name="l01380"></a><span class="lineno"> 1380</span>       activeWriter.close();</div>
-<div class="line"><a name="l01381"></a><span class="lineno"> 1381</span>     <span class="keywordflow">if</span>(extent_opt.size())</div>
-<div class="line"><a name="l01382"></a><span class="lineno"> 1382</span>       extentReader.close();</div>
-<div class="line"><a name="l01383"></a><span class="lineno"> 1383</span>   }</div>
-<div class="line"><a name="l01384"></a><span class="lineno"> 1384</span>   <span class="keywordflow">catch</span>(<span class="keywordtype">string</span> errorString){</div>
-<div class="line"><a name="l01385"></a><span class="lineno"> 1385</span>     std::cerr << <span class="stringliteral">"Error: errorString"</span> << std::endl;</div>
-<div class="line"><a name="l01386"></a><span class="lineno"> 1386</span>   }</div>
-<div class="line"><a name="l01387"></a><span class="lineno"> 1387</span> </div>
-<div class="line"><a name="l01388"></a><span class="lineno"> 1388</span>   <span class="keywordflow">for</span>(<span class="keywordtype">int</span> ibag=0;ibag<nbag;++ibag){</div>
-<div class="line"><a name="l01389"></a><span class="lineno"> 1389</span>     <span class="comment">// svm_destroy_param[ibag](&param[ibag]);</span></div>
-<div class="line"><a name="l01390"></a><span class="lineno"> 1390</span>     svm_destroy_param(&param[ibag]);</div>
-<div class="line"><a name="l01391"></a><span class="lineno"> 1391</span>     free(prob[ibag].y);</div>
-<div class="line"><a name="l01392"></a><span class="lineno"> 1392</span>     free(prob[ibag].x);</div>
-<div class="line"><a name="l01393"></a><span class="lineno"> 1393</span>     free(x_space[ibag]);</div>
-<div class="line"><a name="l01394"></a><span class="lineno"> 1394</span>     svm_free_and_destroy_model(&(svm[ibag]));</div>
+<div class="line"><a name="l01235"></a><span class="lineno"> 1235</span>       OGRFeature *poDstFeature = NULL;</div>
+<div class="line"><a name="l01236"></a><span class="lineno"> 1236</span>       <span class="keywordflow">if</span>(output_opt.size()){</div>
+<div class="line"><a name="l01237"></a><span class="lineno"> 1237</span>         poDstFeature=imgWriterOgr.createFeature(ilayer);</div>
+<div class="line"><a name="l01238"></a><span class="lineno"> 1238</span>         <span class="keywordflow">if</span>( poDstFeature->SetFrom( poFeature, TRUE ) != OGRERR_NONE ){</div>
+<div class="line"><a name="l01239"></a><span class="lineno"> 1239</span>           CPLError( CE_Failure, CPLE_AppDefined,</div>
+<div class="line"><a name="l01240"></a><span class="lineno"> 1240</span>             <span class="stringliteral">"Unable to translate feature %d from layer %s.\n"</span>,</div>
+<div class="line"><a name="l01241"></a><span class="lineno"> 1241</span>             poFeature->GetFID(), imgWriterOgr.getLayerName(ilayer).c_str() );</div>
+<div class="line"><a name="l01242"></a><span class="lineno"> 1242</span>           OGRFeature::DestroyFeature( poFeature );</div>
+<div class="line"><a name="l01243"></a><span class="lineno"> 1243</span>           OGRFeature::DestroyFeature( poDstFeature );</div>
+<div class="line"><a name="l01244"></a><span class="lineno"> 1244</span>         }</div>
+<div class="line"><a name="l01245"></a><span class="lineno"> 1245</span>       }</div>
+<div class="line"><a name="l01246"></a><span class="lineno"> 1246</span>       vector<float> validationPixel;</div>
+<div class="line"><a name="l01247"></a><span class="lineno"> 1247</span>       vector<float> validationFeature;</div>
+<div class="line"><a name="l01248"></a><span class="lineno"> 1248</span>         </div>
+<div class="line"><a name="l01249"></a><span class="lineno"> 1249</span>       imgReaderOgr.readData(validationPixel,OFTReal,fields,poFeature,ilayer);</div>
+<div class="line"><a name="l01250"></a><span class="lineno"> 1250</span>       assert(validationPixel.size()==nband);</div>
+<div class="line"><a name="l01251"></a><span class="lineno"> 1251</span>       vector<float> probOut(nclass);<span class="comment">//posterior prob for each class</span></div>
+<div class="line"><a name="l01252"></a><span class="lineno"> 1252</span>       <span class="keywordflow">for</span>(<span class="keywordtype">short</span> iclass=0;iclass<nclass;++iclass)</div>
+<div class="line"><a name="l01253"></a><span class="lineno"> 1253</span>         probOut[iclass]=0;</div>
+<div class="line"><a name="l01254"></a><span class="lineno"> 1254</span>       <span class="keywordflow">for</span>(<span class="keywordtype">int</span> ibag=0;ibag<nbag;++ibag){</div>
+<div class="line"><a name="l01255"></a><span class="lineno"> 1255</span>         <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iband=0;iband<nband;++iband){</div>
+<div class="line"><a name="l01256"></a><span class="lineno"> 1256</span>           validationFeature.push_back((validationPixel[iband]-offset[ibag][iband])/scale[ibag][iband]);</div>
+<div class="line"><a name="l01257"></a><span class="lineno"> 1257</span>           <span class="keywordflow">if</span>(verbose_opt[0]==2)</div>
+<div class="line"><a name="l01258"></a><span class="lineno"> 1258</span>         std::cout << <span class="stringliteral">" "</span> << validationFeature.back();</div>
+<div class="line"><a name="l01259"></a><span class="lineno"> 1259</span>         }</div>
+<div class="line"><a name="l01260"></a><span class="lineno"> 1260</span>         <span class="keywordflow">if</span>(verbose_opt[0]==2)</div>
+<div class="line"><a name="l01261"></a><span class="lineno"> 1261</span>           std::cout << std::endl;</div>
+<div class="line"><a name="l01262"></a><span class="lineno"> 1262</span>         vector<double> result(nclass);</div>
+<div class="line"><a name="l01263"></a><span class="lineno"> 1263</span>         <span class="keyword">struct </span><a class="code" href="structsvm__node.html">svm_node</a> *x;</div>
+<div class="line"><a name="l01264"></a><span class="lineno"> 1264</span>         x = (<span class="keyword">struct </span><a class="code" href="structsvm__node.html">svm_node</a> *) malloc((validationFeature.size()+1)*<span class="keyword">sizeof</span>(<span class="keyword">struct</span> <a class="code" href="structsvm__node.html">svm_node</a>));</div>
+<div class="line"><a name="l01265"></a><span class="lineno"> 1265</span>         <span class="keywordflow">for</span>(<span class="keywordtype">int</span> i=0;i<validationFeature.size();++i){</div>
+<div class="line"><a name="l01266"></a><span class="lineno"> 1266</span>           x[i].index=i+1;</div>
+<div class="line"><a name="l01267"></a><span class="lineno"> 1267</span>           x[i].value=validationFeature[i];</div>
+<div class="line"><a name="l01268"></a><span class="lineno"> 1268</span>         }</div>
+<div class="line"><a name="l01269"></a><span class="lineno"> 1269</span> </div>
+<div class="line"><a name="l01270"></a><span class="lineno"> 1270</span>         x[validationFeature.size()].index=-1;<span class="comment">//to end svm feature vector</span></div>
+<div class="line"><a name="l01271"></a><span class="lineno"> 1271</span>         <span class="keywordtype">double</span> predict_label=0;</div>
+<div class="line"><a name="l01272"></a><span class="lineno"> 1272</span>         <span class="keywordflow">if</span>(!prob_est_opt[0]){</div>
+<div class="line"><a name="l01273"></a><span class="lineno"> 1273</span>           predict_label = svm_predict(svm[ibag],x);</div>
+<div class="line"><a name="l01274"></a><span class="lineno"> 1274</span>           <span class="keywordflow">for</span>(<span class="keywordtype">short</span> iclass=0;iclass<nclass;++iclass){</div>
+<div class="line"><a name="l01275"></a><span class="lineno"> 1275</span>         <span class="keywordflow">if</span>(iclass==static_cast<short>(predict_label))</div>
+<div class="line"><a name="l01276"></a><span class="lineno"> 1276</span>           result[iclass]=1;</div>
+<div class="line"><a name="l01277"></a><span class="lineno"> 1277</span>         <span class="keywordflow">else</span></div>
+<div class="line"><a name="l01278"></a><span class="lineno"> 1278</span>           result[iclass]=0;</div>
+<div class="line"><a name="l01279"></a><span class="lineno"> 1279</span>           }</div>
+<div class="line"><a name="l01280"></a><span class="lineno"> 1280</span>         }</div>
+<div class="line"><a name="l01281"></a><span class="lineno"> 1281</span>         <span class="keywordflow">else</span>{</div>
+<div class="line"><a name="l01282"></a><span class="lineno"> 1282</span>           assert(svm_check_probability_model(svm[ibag]));</div>
+<div class="line"><a name="l01283"></a><span class="lineno"> 1283</span>           predict_label = svm_predict_probability(svm[ibag],x,&(result[0]));</div>
+<div class="line"><a name="l01284"></a><span class="lineno"> 1284</span>         }</div>
+<div class="line"><a name="l01285"></a><span class="lineno"> 1285</span>         <span class="keywordflow">if</span>(verbose_opt[0]>1){</div>
+<div class="line"><a name="l01286"></a><span class="lineno"> 1286</span>           std::cout << <span class="stringliteral">"predict_label: "</span> << predict_label << std::endl;</div>
+<div class="line"><a name="l01287"></a><span class="lineno"> 1287</span>           <span class="keywordflow">for</span>(<span class="keywordtype">int</span> iclass=0;iclass<result.size();++iclass)</div>
+<div class="line"><a name="l01288"></a><span class="lineno"> 1288</span>         std::cout << result[iclass] << <span class="stringliteral">" "</span>;</div>
+<div class="line"><a name="l01289"></a><span class="lineno"> 1289</span>           std::cout << std::endl;</div>
+<div class="line"><a name="l01290"></a><span class="lineno"> 1290</span>         }</div>
+<div class="line"><a name="l01291"></a><span class="lineno"> 1291</span> </div>
+<div class="line"><a name="l01292"></a><span class="lineno"> 1292</span>         <span class="comment">//calculate posterior prob of bag </span></div>
+<div class="line"><a name="l01293"></a><span class="lineno"> 1293</span>         <span class="keywordflow">for</span>(<span class="keywordtype">short</span> iclass=0;iclass<nclass;++iclass){</div>
+<div class="line"><a name="l01294"></a><span class="lineno"> 1294</span>           <span class="keywordflow">switch</span>(comb_opt[0]){</div>
+<div class="line"><a name="l01295"></a><span class="lineno"> 1295</span>           <span class="keywordflow">default</span>:</div>
+<div class="line"><a name="l01296"></a><span class="lineno"> 1296</span>           <span class="keywordflow">case</span>(0):<span class="comment">//sum rule</span></div>
+<div class="line"><a name="l01297"></a><span class="lineno"> 1297</span>         probOut[iclass]+=result[iclass]*priors[iclass];<span class="comment">//add probabilities for each bag</span></div>
+<div class="line"><a name="l01298"></a><span class="lineno"> 1298</span>           <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l01299"></a><span class="lineno"> 1299</span>           <span class="keywordflow">case</span>(1):<span class="comment">//product rule</span></div>
+<div class="line"><a name="l01300"></a><span class="lineno"> 1300</span>         probOut[iclass]*=pow(static_cast<float>(priors[iclass]),static_cast<float>(1.0-nbag)/nbag)*result[iclass];<span class="comment">//multiply probabilities for each bag</span></div>
+<div class="line"><a name="l01301"></a><span class="lineno"> 1301</span>         <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l01302"></a><span class="lineno"> 1302</span>           <span class="keywordflow">case</span>(2):<span class="comment">//max rule</span></div>
+<div class="line"><a name="l01303"></a><span class="lineno"> 1303</span>         <span class="keywordflow">if</span>(priors[iclass]*result[iclass]>probOut[iclass])</div>
+<div class="line"><a name="l01304"></a><span class="lineno"> 1304</span>           probOut[iclass]=priors[iclass]*result[iclass];</div>
+<div class="line"><a name="l01305"></a><span class="lineno"> 1305</span>         <span class="keywordflow">break</span>;</div>
+<div class="line"><a name="l01306"></a><span class="lineno"> 1306</span>           }</div>
+<div class="line"><a name="l01307"></a><span class="lineno"> 1307</span>         }</div>
+<div class="line"><a name="l01308"></a><span class="lineno"> 1308</span>         free(x);</div>
+<div class="line"><a name="l01309"></a><span class="lineno"> 1309</span>       }<span class="comment">//for ibag</span></div>
+<div class="line"><a name="l01310"></a><span class="lineno"> 1310</span> </div>
+<div class="line"><a name="l01311"></a><span class="lineno"> 1311</span>       <span class="comment">//search for max class prob</span></div>
+<div class="line"><a name="l01312"></a><span class="lineno"> 1312</span>       <span class="keywordtype">float</span> maxBag=0;</div>
+<div class="line"><a name="l01313"></a><span class="lineno"> 1313</span>       <span class="keywordtype">float</span> normBag=0;</div>
+<div class="line"><a name="l01314"></a><span class="lineno"> 1314</span>       <span class="keywordtype">string</span> classOut=<span class="stringliteral">"Unclassified"</span>;</div>
+<div class="line"><a name="l01315"></a><span class="lineno"> 1315</span>       <span class="keywordflow">for</span>(<span class="keywordtype">short</span> iclass=0;iclass<nclass;++iclass){</div>
+<div class="line"><a name="l01316"></a><span class="lineno"> 1316</span>         <span class="keywordflow">if</span>(verbose_opt[0]>1)</div>
+<div class="line"><a name="l01317"></a><span class="lineno"> 1317</span>           std::cout << probOut[iclass] << <span class="stringliteral">" "</span>;</div>
+<div class="line"><a name="l01318"></a><span class="lineno"> 1318</span>         <span class="keywordflow">if</span>(probOut[iclass]>maxBag){</div>
+<div class="line"><a name="l01319"></a><span class="lineno"> 1319</span>           maxBag=probOut[iclass];</div>
+<div class="line"><a name="l01320"></a><span class="lineno"> 1320</span>           classOut=nameVector[iclass];</div>
+<div class="line"><a name="l01321"></a><span class="lineno"> 1321</span>         }</div>
+<div class="line"><a name="l01322"></a><span class="lineno"> 1322</span>       }</div>
+<div class="line"><a name="l01323"></a><span class="lineno"> 1323</span>       <span class="comment">//look for class name</span></div>
+<div class="line"><a name="l01324"></a><span class="lineno"> 1324</span>       <span class="keywordflow">if</span>(verbose_opt[0]>1){</div>
+<div class="line"><a name="l01325"></a><span class="lineno"> 1325</span>         <span class="keywordflow">if</span>(classValueMap.size())</div>
+<div class="line"><a name="l01326"></a><span class="lineno"> 1326</span>           std::cout << <span class="stringliteral">"->"</span> << classValueMap[classOut] << std::endl;</div>
+<div class="line"><a name="l01327"></a><span class="lineno"> 1327</span>         <span class="keywordflow">else</span>        </div>
+<div class="line"><a name="l01328"></a><span class="lineno"> 1328</span>           std::cout << <span class="stringliteral">"->"</span> << classOut << std::endl;</div>
+<div class="line"><a name="l01329"></a><span class="lineno"> 1329</span>       }</div>
+<div class="line"><a name="l01330"></a><span class="lineno"> 1330</span>       <span class="keywordflow">if</span>(output_opt.size()){</div>
+<div class="line"><a name="l01331"></a><span class="lineno"> 1331</span>         <span class="keywordflow">if</span>(classValueMap.size())</div>
+<div class="line"><a name="l01332"></a><span class="lineno"> 1332</span>           poDstFeature->SetField(<span class="stringliteral">"class"</span>,classValueMap[classOut]);</div>
+<div class="line"><a name="l01333"></a><span class="lineno"> 1333</span>         <span class="keywordflow">else</span>        </div>
+<div class="line"><a name="l01334"></a><span class="lineno"> 1334</span>           poDstFeature->SetField(<span class="stringliteral">"class"</span>,classOut.c_str());</div>
+<div class="line"><a name="l01335"></a><span class="lineno"> 1335</span>         poDstFeature->SetFID( poFeature->GetFID() );</div>
+<div class="line"><a name="l01336"></a><span class="lineno"> 1336</span>       }</div>
+<div class="line"><a name="l01337"></a><span class="lineno"> 1337</span>       <span class="keywordtype">int</span> labelIndex=poFeature->GetFieldIndex(label_opt[0].c_str());</div>
+<div class="line"><a name="l01338"></a><span class="lineno"> 1338</span>       <span class="keywordflow">if</span>(labelIndex>=0){</div>
+<div class="line"><a name="l01339"></a><span class="lineno"> 1339</span>         <span class="keywordtype">string</span> classRef=poFeature->GetFieldAsString(labelIndex);</div>
+<div class="line"><a name="l01340"></a><span class="lineno"> 1340</span>         <span class="keywordflow">if</span>(classRef!=<span class="stringliteral">"0"</span>){</div>
+<div class="line"><a name="l01341"></a><span class="lineno"> 1341</span>           <span class="keywordflow">if</span>(classValueMap.size())</div>
+<div class="line"><a name="l01342"></a><span class="lineno"> 1342</span>         cm.incrementResult(type2string<short>(classValueMap[classRef]),type2string<short>(classValueMap[classOut]),1);</div>
+<div class="line"><a name="l01343"></a><span class="lineno"> 1343</span>           <span class="keywordflow">else</span></div>
+<div class="line"><a name="l01344"></a><span class="lineno"> 1344</span>         cm.incrementResult(classRef,classOut,1);</div>
+<div class="line"><a name="l01345"></a><span class="lineno"> 1345</span>         }</div>
+<div class="line"><a name="l01346"></a><span class="lineno"> 1346</span>       }</div>
+<div class="line"><a name="l01347"></a><span class="lineno"> 1347</span>       CPLErrorReset();</div>
+<div class="line"><a name="l01348"></a><span class="lineno"> 1348</span>       <span class="keywordflow">if</span>(output_opt.size()){</div>
+<div class="line"><a name="l01349"></a><span class="lineno"> 1349</span>         <span class="keywordflow">if</span>(imgWriterOgr.createFeature(poDstFeature,ilayer) != OGRERR_NONE){</div>
+<div class="line"><a name="l01350"></a><span class="lineno"> 1350</span>           CPLError( CE_Failure, CPLE_AppDefined,</div>
+<div class="line"><a name="l01351"></a><span class="lineno"> 1351</span>             <span class="stringliteral">"Unable to translate feature %d from layer %s.\n"</span>,</div>
+<div class="line"><a name="l01352"></a><span class="lineno"> 1352</span>             poFeature->GetFID(), imgWriterOgr.getLayerName(ilayer).c_str() );</div>
+<div class="line"><a name="l01353"></a><span class="lineno"> 1353</span>           OGRFeature::DestroyFeature( poDstFeature );</div>
+<div class="line"><a name="l01354"></a><span class="lineno"> 1354</span>           OGRFeature::DestroyFeature( poDstFeature );</div>
+<div class="line"><a name="l01355"></a><span class="lineno"> 1355</span>         }</div>
+<div class="line"><a name="l01356"></a><span class="lineno"> 1356</span>       }</div>
+<div class="line"><a name="l01357"></a><span class="lineno"> 1357</span>       ++ifeature;</div>
+<div class="line"><a name="l01358"></a><span class="lineno"> 1358</span>       <span class="keywordflow">if</span>(!verbose_opt[0]){</div>
+<div class="line"><a name="l01359"></a><span class="lineno"> 1359</span>         progress=<span class="keyword">static_cast<</span><span class="keywordtype">float</span><span class="keyword">></span>(ifeature+1.0)/nFeatures;</div>
+<div class="line"><a name="l01360"></a><span class="lineno"> 1360</span>         pfnProgress(progress,pszMessage,pProgressArg);</div>
+<div class="line"><a name="l01361"></a><span class="lineno"> 1361</span>       }</div>
+<div class="line"><a name="l01362"></a><span class="lineno"> 1362</span>       OGRFeature::DestroyFeature( poFeature );</div>
+<div class="line"><a name="l01363"></a><span class="lineno"> 1363</span>       OGRFeature::DestroyFeature( poDstFeature );</div>
+<div class="line"><a name="l01364"></a><span class="lineno"> 1364</span>     }<span class="comment">//get next feature</span></div>
+<div class="line"><a name="l01365"></a><span class="lineno"> 1365</span>       }<span class="comment">//next layer</span></div>
+<div class="line"><a name="l01366"></a><span class="lineno"> 1366</span>       imgReaderOgr.close();</div>
+<div class="line"><a name="l01367"></a><span class="lineno"> 1367</span>       <span class="keywordflow">if</span>(output_opt.size())</div>
+<div class="line"><a name="l01368"></a><span class="lineno"> 1368</span>     imgWriterOgr.close();</div>
+<div class="line"><a name="l01369"></a><span class="lineno"> 1369</span>     }</div>
+<div class="line"><a name="l01370"></a><span class="lineno"> 1370</span>     <span class="keywordflow">if</span>(cm.nReference()){</div>
+<div class="line"><a name="l01371"></a><span class="lineno"> 1371</span>       std::cout << cm << std::endl;</div>
+<div class="line"><a name="l01372"></a><span class="lineno"> 1372</span>       cout << <span class="stringliteral">"class #samples userAcc prodAcc"</span> << endl;</div>
+<div class="line"><a name="l01373"></a><span class="lineno"> 1373</span>       <span class="keywordtype">double</span> se95_ua=0;</div>
+<div class="line"><a name="l01374"></a><span class="lineno"> 1374</span>       <span class="keywordtype">double</span> se95_pa=0;</div>
+<div class="line"><a name="l01375"></a><span class="lineno"> 1375</span>       <span class="keywordtype">double</span> se95_oa=0;</div>
+<div class="line"><a name="l01376"></a><span class="lineno"> 1376</span>       <span class="keywordtype">double</span> dua=0;</div>
+<div class="line"><a name="l01377"></a><span class="lineno"> 1377</span>       <span class="keywordtype">double</span> dpa=0;</div>
+<div class="line"><a name="l01378"></a><span class="lineno"> 1378</span>       <span class="keywordtype">double</span> doa=0;</div>
+<div class="line"><a name="l01379"></a><span class="lineno"> 1379</span>       <span class="keywordflow">for</span>(<span class="keywordtype">short</span> iclass=0;iclass<cm.nClasses();++iclass){</div>
+<div class="line"><a name="l01380"></a><span class="lineno"> 1380</span>     dua=cm.ua_pct(cm.getClass(iclass),&se95_ua);</div>
+<div class="line"><a name="l01381"></a><span class="lineno"> 1381</span>     dpa=cm.pa_pct(cm.getClass(iclass),&se95_pa);</div>
+<div class="line"><a name="l01382"></a><span class="lineno"> 1382</span>     cout << cm.getClass(iclass) << <span class="stringliteral">" "</span> << cm.nReference(cm.getClass(iclass)) << <span class="stringliteral">" "</span> << dua << <span class="stringliteral">" ("</span> << se95_ua << <span class="stringliteral">")"</span> << <span class="stringliteral">" "</span> << dp [...]
+<div class="line"><a name="l01383"></a><span class="lineno"> 1383</span>       }</div>
+<div class="line"><a name="l01384"></a><span class="lineno"> 1384</span>       std::cout << <span class="stringliteral">"Kappa: "</span> << cm.kappa() << std::endl;</div>
+<div class="line"><a name="l01385"></a><span class="lineno"> 1385</span>       doa=cm.oa(&se95_oa);</div>
+<div class="line"><a name="l01386"></a><span class="lineno"> 1386</span>       std::cout << <span class="stringliteral">"Overall Accuracy: "</span> << 100*doa << <span class="stringliteral">" ("</span> << 100*se95_oa << <span class="stringliteral">")"</span>  << std::endl;</div>
+<div class="line"><a name="l01387"></a><span class="lineno"> 1387</span>     }</div>
+<div class="line"><a name="l01388"></a><span class="lineno"> 1388</span>   }</div>
+<div class="line"><a name="l01389"></a><span class="lineno"> 1389</span>   <span class="keywordflow">try</span>{</div>
+<div class="line"><a name="l01390"></a><span class="lineno"> 1390</span>     <span class="keywordflow">if</span>(active_opt.size())</div>
+<div class="line"><a name="l01391"></a><span class="lineno"> 1391</span>       activeWriter.close();</div>
+<div class="line"><a name="l01392"></a><span class="lineno"> 1392</span>   }</div>
+<div class="line"><a name="l01393"></a><span class="lineno"> 1393</span>   <span class="keywordflow">catch</span>(<span class="keywordtype">string</span> errorString){</div>
+<div class="line"><a name="l01394"></a><span class="lineno"> 1394</span>     std::cerr << <span class="stringliteral">"Error: errorString"</span> << std::endl;</div>
 <div class="line"><a name="l01395"></a><span class="lineno"> 1395</span>   }</div>
-<div class="line"><a name="l01396"></a><span class="lineno"> 1396</span>   <span class="keywordflow">return</span> 0;</div>
-<div class="line"><a name="l01397"></a><span class="lineno"> 1397</span> }</div>
+<div class="line"><a name="l01396"></a><span class="lineno"> 1396</span> </div>
+<div class="line"><a name="l01397"></a><span class="lineno"> 1397</span>   <span class="keywordflow">for</span>(<span class="keywordtype">int</span> ibag=0;ibag<nbag;++ibag){</div>
+<div class="line"><a name="l01398"></a><span class="lineno"> 1398</span>     <span class="comment">// svm_destroy_param[ibag](&param[ibag]);</span></div>
+<div class="line"><a name="l01399"></a><span class="lineno"> 1399</span>     svm_destroy_param(&param[ibag]);</div>
+<div class="line"><a name="l01400"></a><span class="lineno"> 1400</span>     free(prob[ibag].y);</div>
+<div class="line"><a name="l01401"></a><span class="lineno"> 1401</span>     free(prob[ibag].x);</div>
+<div class="line"><a name="l01402"></a><span class="lineno"> 1402</span>     free(x_space[ibag]);</div>
+<div class="line"><a name="l01403"></a><span class="lineno"> 1403</span>     svm_free_and_destroy_model(&(svm[ibag]));</div>
+<div class="line"><a name="l01404"></a><span class="lineno"> 1404</span>   }</div>
+<div class="line"><a name="l01405"></a><span class="lineno"> 1405</span>   <span class="keywordflow">return</span> 0;</div>
+<div class="line"><a name="l01406"></a><span class="lineno"> 1406</span> }</div>
 <div class="ttc" id="classImgReaderGdal_html"><div class="ttname"><a href="classImgReaderGdal.html">ImgReaderGdal</a></div><div class="ttdef"><b>Definition:</b> <a href="ImgReaderGdal_8h_source.html#l00033">ImgReaderGdal.h:33</a></div></div>
 <div class="ttc" id="classImgWriterGdal_html"><div class="ttname"><a href="classImgWriterGdal.html">ImgWriterGdal</a></div><div class="ttdef"><b>Definition:</b> <a href="ImgWriterGdal_8h_source.html#l00032">ImgWriterGdal.h:32</a></div></div>
 <div class="ttc" id="classBadConversion_html"><div class="ttname"><a href="classBadConversion.html">BadConversion</a></div><div class="ttdoc">throw this class when syntax error in command line option </div><div class="ttdef"><b>Definition:</b> <a href="Optionpk_8h_source.html#l00045">Optionpk.h:45</a></div></div>
@@ -1381,7 +1391,7 @@
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Jun 23 2015 17:09:36 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/pksvm_8py_source.html b/doc/html/pksvm_8py_source.html
index 97ffab4..4bcc6a7 100644
--- a/doc/html/pksvm_8py_source.html
+++ b/doc/html/pksvm_8py_source.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.3</span>
+    <span id="projectnumber">2.6.4</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -85,120 +85,121 @@
 <div class="line"><a name="l00031"></a><span class="lineno">   31</span> <span class="keyword">from</span> processing.core.parameters <span class="keyword">import</span> ParameterRaster</div>
 <div class="line"><a name="l00032"></a><span class="lineno">   32</span> <span class="keyword">from</span> processing.core.outputs <span class="keyword">import</span> OutputRaster</div>
 <div class="line"><a name="l00033"></a><span class="lineno">   33</span> <span class="keyword">from</span> processing.core.parameters <span class="keyword">import</span> ParameterSelection</div>
-<div class="line"><a name="l00034"></a><span class="lineno">   34</span> <span class="keyword">from</span> processing.core.parameters <span class="keyword">import</span> ParameterNumber</div>
-<div class="line"><a name="l00035"></a><span class="lineno">   35</span> <span class="keyword">from</span> processing.core.parameters <span class="keyword">import</span> ParameterString</div>
-<div class="line"><a name="l00036"></a><span class="lineno">   36</span> <span class="keyword">from</span> processing.core.parameters <span class="keyword">import</span> ParameterBoolean</div>
-<div class="line"><a name="l00037"></a><span class="lineno">   37</span> <span class="keyword">from</span> processing.core.parameters <span class="keyword">import</span> ParameterExtent</div>
-<div class="line"><a name="l00038"></a><span class="lineno">   38</span> </div>
-<div class="line"><a name="l00039"></a><span class="lineno"><a class="line" href="classqgis_1_1pksvm_1_1pksvm.html">   39</a></span> <span class="keyword">class </span><a class="code" href="classqgis_1_1pksvm_1_1pksvm.html">pksvm</a>(pktoolsAlgorithm):</div>
-<div class="line"><a name="l00040"></a><span class="lineno">   40</span> </div>
-<div class="line"><a name="l00041"></a><span class="lineno">   41</span>     INPUT = <span class="stringliteral">"INPUT"</span></div>
-<div class="line"><a name="l00042"></a><span class="lineno">   42</span>     TRAINING = <span class="stringliteral">"TRAINING"</span></div>
-<div class="line"><a name="l00043"></a><span class="lineno">   43</span>     ITERATE = <span class="stringliteral">"ITERATE"</span></div>
-<div class="line"><a name="l00044"></a><span class="lineno">   44</span>     LABEL = <span class="stringliteral">"LABEL"</span></div>
-<div class="line"><a name="l00045"></a><span class="lineno">   45</span> <span class="comment">#    CV = "CV"</span></div>
-<div class="line"><a name="l00046"></a><span class="lineno">   46</span>     GAMMA = <span class="stringliteral">"GAMMA"</span></div>
-<div class="line"><a name="l00047"></a><span class="lineno">   47</span>     COST = <span class="stringliteral">"COST"</span></div>
-<div class="line"><a name="l00048"></a><span class="lineno">   48</span>     OUTPUT = <span class="stringliteral">"OUTPUT"</span></div>
-<div class="line"><a name="l00049"></a><span class="lineno">   49</span>     MASK = <span class="stringliteral">"MASK"</span></div>
-<div class="line"><a name="l00050"></a><span class="lineno">   50</span>     MSKNODATA = <span class="stringliteral">"MSKNODATA"</span></div>
-<div class="line"><a name="l00051"></a><span class="lineno">   51</span> <span class="comment">#    NODATA = "NODATA"</span></div>
-<div class="line"><a name="l00052"></a><span class="lineno">   52</span> </div>
-<div class="line"><a name="l00053"></a><span class="lineno">   53</span> <span class="comment">#    SVM_TYPE_OPTIONS = ["C_SVC", "nu_SVC,one_class", "epsilon_SVR", "nu_SVR"]</span></div>
-<div class="line"><a name="l00054"></a><span class="lineno">   54</span> <span class="comment">#    KERNEL_TYPE_OPTIONS = ["linear", "polynomial", "radial", "sigmoid"]</span></div>
-<div class="line"><a name="l00055"></a><span class="lineno">   55</span>     EXTRA = <span class="stringliteral">'EXTRA'</span></div>
-<div class="line"><a name="l00056"></a><span class="lineno">   56</span> </div>
-<div class="line"><a name="l00057"></a><span class="lineno">   57</span>     <span class="keyword">def </span>cliName(self):</div>
-<div class="line"><a name="l00058"></a><span class="lineno">   58</span>         <span class="keywordflow">return</span> <span class="stringliteral">"pksvm"</span></div>
-<div class="line"><a name="l00059"></a><span class="lineno">   59</span> </div>
-<div class="line"><a name="l00060"></a><span class="lineno">   60</span>     <span class="keyword">def </span>defineCharacteristics(self):</div>
-<div class="line"><a name="l00061"></a><span class="lineno">   61</span>         self.<a class="code" href="classqgis_1_1pksvm_1_1pksvm.html#aa5c7d4dda4c1b0316e26dfb3c8f4cf8f">name</a> = <span class="stringliteral">"Support vector machine"</span></div>
-<div class="line"><a name="l00062"></a><span class="lineno">   62</span>         self.<a class="code" href="classqgis_1_1pksvm_1_1pksvm.html#a33cc5cc741eadc78c3fa6687592cd810">group</a> = <span class="stringliteral">"[pktools] supervised classification"</span></div>
-<div class="line"><a name="l00063"></a><span class="lineno">   63</span>         self.addParameter(ParameterRaster(self.<a class="code" href="classqgis_1_1pksvm_1_1pksvm.html#a70980660386dbf0e5a4abbaee81b20b7">INPUT</a>, <span class="stringliteral">'Input layer raster data set'</span>,ParameterRaster))</div>
-<div class="line"><a name="l00064"></a><span class="lineno">   64</span>         self.addParameter(ParameterVector(self.<a class="code" href="classqgis_1_1pksvm_1_1pksvm.html#a52e9137080458d2fa51683e03d046418">TRAINING</a>, <span class="stringliteral">'Training vector file.'</span>))</div>
-<div class="line"><a name="l00065"></a><span class="lineno">   65</span>         self.addParameter(ParameterBoolean(self.<a class="code" href="classqgis_1_1pksvm_1_1pksvm.html#a655f6139a543113d1dd2ad8b11f773b9">ITERATE</a>, <span class="stringliteral">"Iterate over all layers"</span>,<span class="keyword">True</span>))</div>
-<div class="line"><a name="l00066"></a><span class="lineno">   66</span>         self.addParameter(ParameterString(self.<a class="code" href="classqgis_1_1pksvm_1_1pksvm.html#a426fe91136cb5f3e7ebbeba2c4199501">LABEL</a>, <span class="stringliteral">"Attribute name for class label in training vector file"</span>,<span class="stringliteral">"label"</span>))</div>
-<div class="line"><a name="l00067"></a><span class="lineno">   67</span>         self.addParameter(ParameterNumber(self.<a class="code" href="classqgis_1_1pksvm_1_1pksvm.html#ab6c3b8cccb265ca1cfadeaa79fed04a1">GAMMA</a>, <span class="stringliteral">"Gamma in kernel function"</span>,0,100,1.0))</div>
-<div class="line"><a name="l00068"></a><span class="lineno">   68</span>         self.addParameter(ParameterNumber(self.<a class="code" href="classqgis_1_1pksvm_1_1pksvm.html#ab3ec104ab7505d3115c8aa868b4f8cba">COST</a>, <span class="stringliteral">"The parameter C of C_SVC"</span>,0,100000,1000.0))</div>
-<div class="line"><a name="l00069"></a><span class="lineno">   69</span>         self.addParameter(ParameterRaster(self.<a class="code" href="classqgis_1_1pksvm_1_1pksvm.html#a614bbc0b875b73667749b0e58d89fc54">MASK</a>, <span class="stringliteral">"Mask raster dataset"</span>,optional=<span class="keyword">True</span>))</div>
-<div class="line"><a name="l00070"></a><span class="lineno">   70</span>         self.addParameter(ParameterString(self.<a class="code" href="classqgis_1_1pksvm_1_1pksvm.html#a63e8acd9ffce30910af0eed869439190">MSKNODATA</a>, <span class="stringliteral">"Mask value(s) not to consider for classification (e.g., 0;255)"</span>,<span class="stringliteral">"0"</span>))</div>
-<div class="line"><a name="l00071"></a><span class="lineno">   71</span>         self.addOutput(OutputRaster(self.<a class="code" href="classqgis_1_1pksvm_1_1pksvm.html#aeb7332c0838e46bfe82b647cb5085700">OUTPUT</a>, <span class="stringliteral">"Output raster data set"</span>))</div>
-<div class="line"><a name="l00072"></a><span class="lineno">   72</span>         self.addParameter(ParameterString(self.<a class="code" href="classqgis_1_1pksvm_1_1pksvm.html#aead41106feadc1f8d3078aa839df4f79">EXTRA</a>,</div>
-<div class="line"><a name="l00073"></a><span class="lineno">   73</span>                           <span class="stringliteral">'Additional parameters'</span>, <span class="stringliteral">'-of GTiff'</span>, optional=<span class="keyword">True</span>))</div>
-<div class="line"><a name="l00074"></a><span class="lineno">   74</span> </div>
-<div class="line"><a name="l00075"></a><span class="lineno">   75</span> <span class="comment">#        self.addParameter(ParameterSelection(self.KERNEL_TYPE,"Type of kernel function (linear,polynomial,radial,sigmoid)",self.KERNEL_TYPE_OPTIONS, 2))</span></div>
-<div class="line"><a name="l00076"></a><span class="lineno">   76</span> <span class="comment">#        self.addParameter(ParameterSelection(self.SVM_TYPE,"Type of SVM (C_SVC, nu_SVC,one_class, epsilon_SVR, nu_SVR)",self.SVM_TYPE_OPTIONS, 0))</span></div>
-<div class="line"><a name="l00077"></a><span class="lineno">   77</span> </div>
-<div class="line"><a name="l00078"></a><span class="lineno">   78</span>     <span class="keyword">def </span>processAlgorithm(self, progress):</div>
-<div class="line"><a name="l00079"></a><span class="lineno">   79</span>         cliPath = <span class="stringliteral">'"'</span> + os.path.join(pktoolsUtils.pktoolsPath(), self.<a class="code" href="classqgis_1_1pksvm_1_1pksvm.html#ac0504ade82ce87e0d386db1a50812bf9">cliName</a>()) + <span class="stringliteral">'"'</span></div>
-<div class="line"><a name="l00080"></a><span class="lineno">   80</span>         commands = [cliPath]</div>
-<div class="line"><a name="l00081"></a><span class="lineno">   81</span> </div>
-<div class="line"><a name="l00082"></a><span class="lineno">   82</span>         input=self.getParameterValue(self.<a class="code" href="classqgis_1_1pksvm_1_1pksvm.html#a70980660386dbf0e5a4abbaee81b20b7">INPUT</a>)</div>
-<div class="line"><a name="l00083"></a><span class="lineno">   83</span>         <span class="keywordflow">if</span> input != <span class="stringliteral">""</span>:</div>
-<div class="line"><a name="l00084"></a><span class="lineno">   84</span>             commands.append(<span class="stringliteral">'-i'</span>)</div>
-<div class="line"><a name="l00085"></a><span class="lineno">   85</span>             commands.append(<span class="stringliteral">'"'</span> + input + <span class="stringliteral">'"'</span>)</div>
-<div class="line"><a name="l00086"></a><span class="lineno">   86</span> </div>
-<div class="line"><a name="l00087"></a><span class="lineno">   87</span>         commands.append(<span class="stringliteral">'-t'</span>)</div>
-<div class="line"><a name="l00088"></a><span class="lineno">   88</span>         training=self.getParameterValue(self.<a class="code" href="classqgis_1_1pksvm_1_1pksvm.html#a52e9137080458d2fa51683e03d046418">TRAINING</a>)</div>
-<div class="line"><a name="l00089"></a><span class="lineno">   89</span> </div>
-<div class="line"><a name="l00090"></a><span class="lineno">   90</span>         if(str(training).find(<span class="stringliteral">'|'</span>)>0):</div>
-<div class="line"><a name="l00091"></a><span class="lineno">   91</span>             <span class="keywordflow">if</span> self.getParameterValue(self.<a class="code" href="classqgis_1_1pksvm_1_1pksvm.html#a655f6139a543113d1dd2ad8b11f773b9">ITERATE</a>):</div>
-<div class="line"><a name="l00092"></a><span class="lineno">   92</span>                 trainingname=str(training)</div>
-<div class="line"><a name="l00093"></a><span class="lineno">   93</span>                 commands.append(trainingname[:trainingname.find(<span class="stringliteral">'|'</span>)])</div>
-<div class="line"><a name="l00094"></a><span class="lineno">   94</span>             <span class="keywordflow">else</span>:</div>
-<div class="line"><a name="l00095"></a><span class="lineno">   95</span>                 trainingname=str(training).replace(<span class="stringliteral">"|layername"</span>,<span class="stringliteral">" -ln"</span>)</div>
-<div class="line"><a name="l00096"></a><span class="lineno">   96</span>                 commands.append(trainingname)</div>
-<div class="line"><a name="l00097"></a><span class="lineno">   97</span>         <span class="keywordflow">else</span>:</div>
-<div class="line"><a name="l00098"></a><span class="lineno">   98</span>             commands.append(training)</div>
-<div class="line"><a name="l00099"></a><span class="lineno">   99</span> </div>
-<div class="line"><a name="l00100"></a><span class="lineno">  100</span>         commands.append(<span class="stringliteral">'-label'</span>)</div>
-<div class="line"><a name="l00101"></a><span class="lineno">  101</span>         commands.append(str(self.getParameterValue(self.<a class="code" href="classqgis_1_1pksvm_1_1pksvm.html#a426fe91136cb5f3e7ebbeba2c4199501">LABEL</a>)))</div>
-<div class="line"><a name="l00102"></a><span class="lineno">  102</span>         <span class="comment"># if self.getParameterValue(self.CV):</span></div>
-<div class="line"><a name="l00103"></a><span class="lineno">  103</span>         <span class="comment">#     commands.append("-cv 2")</span></div>
-<div class="line"><a name="l00104"></a><span class="lineno">  104</span>         commands.append(<span class="stringliteral">'-g'</span>)</div>
-<div class="line"><a name="l00105"></a><span class="lineno">  105</span>         commands.append(str(self.getParameterValue(self.<a class="code" href="classqgis_1_1pksvm_1_1pksvm.html#ab6c3b8cccb265ca1cfadeaa79fed04a1">GAMMA</a>)))</div>
-<div class="line"><a name="l00106"></a><span class="lineno">  106</span>         commands.append(<span class="stringliteral">'-cc'</span>)</div>
-<div class="line"><a name="l00107"></a><span class="lineno">  107</span>         commands.append(str(self.getParameterValue(self.<a class="code" href="classqgis_1_1pksvm_1_1pksvm.html#ab3ec104ab7505d3115c8aa868b4f8cba">COST</a>)))</div>
-<div class="line"><a name="l00108"></a><span class="lineno">  108</span> </div>
-<div class="line"><a name="l00109"></a><span class="lineno">  109</span>         mask = str(self.getParameterValue(self.<a class="code" href="classqgis_1_1pksvm_1_1pksvm.html#a614bbc0b875b73667749b0e58d89fc54">MASK</a>))</div>
-<div class="line"><a name="l00110"></a><span class="lineno">  110</span>         <span class="keywordflow">if</span> mask != <span class="stringliteral">"None"</span>:</div>
-<div class="line"><a name="l00111"></a><span class="lineno">  111</span>             commands.append(<span class="stringliteral">'-m'</span>)</div>
-<div class="line"><a name="l00112"></a><span class="lineno">  112</span>             commands.append(mask)</div>
-<div class="line"><a name="l00113"></a><span class="lineno">  113</span>             msknodata=str(self.getParameterValue(self.<a class="code" href="classqgis_1_1pksvm_1_1pksvm.html#a63e8acd9ffce30910af0eed869439190">MSKNODATA</a>))</div>
-<div class="line"><a name="l00114"></a><span class="lineno">  114</span>             msknodataValues = msknodata.split(<span class="stringliteral">';'</span>)</div>
-<div class="line"><a name="l00115"></a><span class="lineno">  115</span>             <span class="keywordflow">for</span> msknodataValue <span class="keywordflow">in</span> msknodataValues:</div>
-<div class="line"><a name="l00116"></a><span class="lineno">  116</span>                 commands.append(<span class="stringliteral">'-msknodata'</span>)</div>
-<div class="line"><a name="l00117"></a><span class="lineno">  117</span>                 commands.append(msknodataValue)</div>
-<div class="line"><a name="l00118"></a><span class="lineno">  118</span>                 </div>
-<div class="line"><a name="l00119"></a><span class="lineno">  119</span>         extra = str(self.getParameterValue(self.<a class="code" href="classqgis_1_1pksvm_1_1pksvm.html#aead41106feadc1f8d3078aa839df4f79">EXTRA</a>))</div>
-<div class="line"><a name="l00120"></a><span class="lineno">  120</span>         <span class="keywordflow">if</span> len(extra) > 0:</div>
-<div class="line"><a name="l00121"></a><span class="lineno">  121</span>             commands.append(extra)</div>
-<div class="line"><a name="l00122"></a><span class="lineno">  122</span> </div>
-<div class="line"><a name="l00123"></a><span class="lineno">  123</span>         output=self.getOutputValue(self.<a class="code" href="classqgis_1_1pksvm_1_1pksvm.html#aeb7332c0838e46bfe82b647cb5085700">OUTPUT</a>)</div>
-<div class="line"><a name="l00124"></a><span class="lineno">  124</span>         <span class="keywordflow">if</span> output != <span class="stringliteral">""</span>:</div>
-<div class="line"><a name="l00125"></a><span class="lineno">  125</span>             commands.append(<span class="stringliteral">'-o'</span>)</div>
-<div class="line"><a name="l00126"></a><span class="lineno">  126</span>             commands.append(<span class="stringliteral">'"'</span> + output + <span class="stringliteral">'"'</span>)</div>
-<div class="line"><a name="l00127"></a><span class="lineno">  127</span> </div>
-<div class="line"><a name="l00128"></a><span class="lineno">  128</span>         pktoolsUtils.runpktools(commands, progress)</div>
-<div class="ttc" id="classqgis_1_1pksvm_1_1pksvm_html_a52e9137080458d2fa51683e03d046418"><div class="ttname"><a href="classqgis_1_1pksvm_1_1pksvm.html#a52e9137080458d2fa51683e03d046418">qgis.pksvm.pksvm.TRAINING</a></div><div class="ttdeci">string TRAINING</div><div class="ttdef"><b>Definition:</b> <a href="pksvm_8py_source.html#l00042">pksvm.py:42</a></div></div>
-<div class="ttc" id="classqgis_1_1pksvm_1_1pksvm_html_aead41106feadc1f8d3078aa839df4f79"><div class="ttname"><a href="classqgis_1_1pksvm_1_1pksvm.html#aead41106feadc1f8d3078aa839df4f79">qgis.pksvm.pksvm.EXTRA</a></div><div class="ttdeci">string EXTRA</div><div class="ttdef"><b>Definition:</b> <a href="pksvm_8py_source.html#l00055">pksvm.py:55</a></div></div>
-<div class="ttc" id="classqgis_1_1pksvm_1_1pksvm_html_a614bbc0b875b73667749b0e58d89fc54"><div class="ttname"><a href="classqgis_1_1pksvm_1_1pksvm.html#a614bbc0b875b73667749b0e58d89fc54">qgis.pksvm.pksvm.MASK</a></div><div class="ttdeci">string MASK</div><div class="ttdef"><b>Definition:</b> <a href="pksvm_8py_source.html#l00049">pksvm.py:49</a></div></div>
-<div class="ttc" id="classqgis_1_1pksvm_1_1pksvm_html_ab6c3b8cccb265ca1cfadeaa79fed04a1"><div class="ttname"><a href="classqgis_1_1pksvm_1_1pksvm.html#ab6c3b8cccb265ca1cfadeaa79fed04a1">qgis.pksvm.pksvm.GAMMA</a></div><div class="ttdeci">string GAMMA</div><div class="ttdef"><b>Definition:</b> <a href="pksvm_8py_source.html#l00046">pksvm.py:46</a></div></div>
-<div class="ttc" id="classqgis_1_1pksvm_1_1pksvm_html_a655f6139a543113d1dd2ad8b11f773b9"><div class="ttname"><a href="classqgis_1_1pksvm_1_1pksvm.html#a655f6139a543113d1dd2ad8b11f773b9">qgis.pksvm.pksvm.ITERATE</a></div><div class="ttdeci">string ITERATE</div><div class="ttdef"><b>Definition:</b> <a href="pksvm_8py_source.html#l00043">pksvm.py:43</a></div></div>
-<div class="ttc" id="classqgis_1_1pksvm_1_1pksvm_html_a63e8acd9ffce30910af0eed869439190"><div class="ttname"><a href="classqgis_1_1pksvm_1_1pksvm.html#a63e8acd9ffce30910af0eed869439190">qgis.pksvm.pksvm.MSKNODATA</a></div><div class="ttdeci">string MSKNODATA</div><div class="ttdef"><b>Definition:</b> <a href="pksvm_8py_source.html#l00050">pksvm.py:50</a></div></div>
-<div class="ttc" id="classqgis_1_1pksvm_1_1pksvm_html_a33cc5cc741eadc78c3fa6687592cd810"><div class="ttname"><a href="classqgis_1_1pksvm_1_1pksvm.html#a33cc5cc741eadc78c3fa6687592cd810">qgis.pksvm.pksvm.group</a></div><div class="ttdeci">group</div><div class="ttdef"><b>Definition:</b> <a href="pksvm_8py_source.html#l00062">pksvm.py:62</a></div></div>
-<div class="ttc" id="classqgis_1_1pksvm_1_1pksvm_html_ab3ec104ab7505d3115c8aa868b4f8cba"><div class="ttname"><a href="classqgis_1_1pksvm_1_1pksvm.html#ab3ec104ab7505d3115c8aa868b4f8cba">qgis.pksvm.pksvm.COST</a></div><div class="ttdeci">string COST</div><div class="ttdef"><b>Definition:</b> <a href="pksvm_8py_source.html#l00047">pksvm.py:47</a></div></div>
-<div class="ttc" id="classqgis_1_1pksvm_1_1pksvm_html_aa5c7d4dda4c1b0316e26dfb3c8f4cf8f"><div class="ttname"><a href="classqgis_1_1pksvm_1_1pksvm.html#aa5c7d4dda4c1b0316e26dfb3c8f4cf8f">qgis.pksvm.pksvm.name</a></div><div class="ttdeci">name</div><div class="ttdef"><b>Definition:</b> <a href="pksvm_8py_source.html#l00061">pksvm.py:61</a></div></div>
-<div class="ttc" id="classqgis_1_1pksvm_1_1pksvm_html_a426fe91136cb5f3e7ebbeba2c4199501"><div class="ttname"><a href="classqgis_1_1pksvm_1_1pksvm.html#a426fe91136cb5f3e7ebbeba2c4199501">qgis.pksvm.pksvm.LABEL</a></div><div class="ttdeci">string LABEL</div><div class="ttdef"><b>Definition:</b> <a href="pksvm_8py_source.html#l00044">pksvm.py:44</a></div></div>
-<div class="ttc" id="classqgis_1_1pksvm_1_1pksvm_html"><div class="ttname"><a href="classqgis_1_1pksvm_1_1pksvm.html">qgis.pksvm.pksvm</a></div><div class="ttdef"><b>Definition:</b> <a href="pksvm_8py_source.html#l00039">pksvm.py:39</a></div></div>
-<div class="ttc" id="classqgis_1_1pksvm_1_1pksvm_html_a70980660386dbf0e5a4abbaee81b20b7"><div class="ttname"><a href="classqgis_1_1pksvm_1_1pksvm.html#a70980660386dbf0e5a4abbaee81b20b7">qgis.pksvm.pksvm.INPUT</a></div><div class="ttdeci">string INPUT</div><div class="ttdef"><b>Definition:</b> <a href="pksvm_8py_source.html#l00041">pksvm.py:41</a></div></div>
-<div class="ttc" id="classqgis_1_1pksvm_1_1pksvm_html_aeb7332c0838e46bfe82b647cb5085700"><div class="ttname"><a href="classqgis_1_1pksvm_1_1pksvm.html#aeb7332c0838e46bfe82b647cb5085700">qgis.pksvm.pksvm.OUTPUT</a></div><div class="ttdeci">string OUTPUT</div><div class="ttdef"><b>Definition:</b> <a href="pksvm_8py_source.html#l00048">pksvm.py:48</a></div></div>
-<div class="ttc" id="classqgis_1_1pksvm_1_1pksvm_html_ac0504ade82ce87e0d386db1a50812bf9"><div class="ttname"><a href="classqgis_1_1pksvm_1_1pksvm.html#ac0504ade82ce87e0d386db1a50812bf9">qgis.pksvm.pksvm.cliName</a></div><div class="ttdeci">def cliName</div><div class="ttdef"><b>Definition:</b> <a href="pksvm_8py_source.html#l00057">pksvm.py:57</a></div></div>
+<div class="line"><a name="l00034"></a><span class="lineno">   34</span> <span class="keyword">from</span> processing.core.parameters <span class="keyword">import</span> ParameterFile</div>
+<div class="line"><a name="l00035"></a><span class="lineno">   35</span> <span class="keyword">from</span> processing.core.parameters <span class="keyword">import</span> ParameterNumber</div>
+<div class="line"><a name="l00036"></a><span class="lineno">   36</span> <span class="keyword">from</span> processing.core.parameters <span class="keyword">import</span> ParameterString</div>
+<div class="line"><a name="l00037"></a><span class="lineno">   37</span> <span class="keyword">from</span> processing.core.parameters <span class="keyword">import</span> ParameterBoolean</div>
+<div class="line"><a name="l00038"></a><span class="lineno">   38</span> <span class="keyword">from</span> processing.core.parameters <span class="keyword">import</span> ParameterExtent</div>
+<div class="line"><a name="l00039"></a><span class="lineno">   39</span> </div>
+<div class="line"><a name="l00040"></a><span class="lineno"><a class="line" href="classqgis_1_1pksvm_1_1pksvm.html">   40</a></span> <span class="keyword">class </span><a class="code" href="classqgis_1_1pksvm_1_1pksvm.html">pksvm</a>(pktoolsAlgorithm):</div>
+<div class="line"><a name="l00041"></a><span class="lineno">   41</span> </div>
+<div class="line"><a name="l00042"></a><span class="lineno">   42</span>     INPUT = <span class="stringliteral">"INPUT"</span></div>
+<div class="line"><a name="l00043"></a><span class="lineno">   43</span>     TRAINING = <span class="stringliteral">"TRAINING"</span></div>
+<div class="line"><a name="l00044"></a><span class="lineno">   44</span>     ITERATE = <span class="stringliteral">"ITERATE"</span></div>
+<div class="line"><a name="l00045"></a><span class="lineno">   45</span>     LABEL = <span class="stringliteral">"LABEL"</span></div>
+<div class="line"><a name="l00046"></a><span class="lineno">   46</span> <span class="comment">#    CV = "CV"</span></div>
+<div class="line"><a name="l00047"></a><span class="lineno">   47</span>     GAMMA = <span class="stringliteral">"GAMMA"</span></div>
+<div class="line"><a name="l00048"></a><span class="lineno">   48</span>     COST = <span class="stringliteral">"COST"</span></div>
+<div class="line"><a name="l00049"></a><span class="lineno">   49</span>     OUTPUT = <span class="stringliteral">"OUTPUT"</span></div>
+<div class="line"><a name="l00050"></a><span class="lineno">   50</span>     MASK = <span class="stringliteral">"MASK"</span></div>
+<div class="line"><a name="l00051"></a><span class="lineno">   51</span>     MSKNODATA = <span class="stringliteral">"MSKNODATA"</span></div>
+<div class="line"><a name="l00052"></a><span class="lineno">   52</span> <span class="comment">#    NODATA = "NODATA"</span></div>
+<div class="line"><a name="l00053"></a><span class="lineno">   53</span> </div>
+<div class="line"><a name="l00054"></a><span class="lineno">   54</span> <span class="comment">#    SVM_TYPE_OPTIONS = ["C_SVC", "nu_SVC,one_class", "epsilon_SVR", "nu_SVR"]</span></div>
+<div class="line"><a name="l00055"></a><span class="lineno">   55</span> <span class="comment">#    KERNEL_TYPE_OPTIONS = ["linear", "polynomial", "radial", "sigmoid"]</span></div>
+<div class="line"><a name="l00056"></a><span class="lineno">   56</span>     EXTRA = <span class="stringliteral">'EXTRA'</span></div>
+<div class="line"><a name="l00057"></a><span class="lineno">   57</span> </div>
+<div class="line"><a name="l00058"></a><span class="lineno">   58</span>     <span class="keyword">def </span>cliName(self):</div>
+<div class="line"><a name="l00059"></a><span class="lineno">   59</span>         <span class="keywordflow">return</span> <span class="stringliteral">"pksvm"</span></div>
+<div class="line"><a name="l00060"></a><span class="lineno">   60</span> </div>
+<div class="line"><a name="l00061"></a><span class="lineno">   61</span>     <span class="keyword">def </span>defineCharacteristics(self):</div>
+<div class="line"><a name="l00062"></a><span class="lineno">   62</span>         self.<a class="code" href="classqgis_1_1pksvm_1_1pksvm.html#aa5c7d4dda4c1b0316e26dfb3c8f4cf8f">name</a> = <span class="stringliteral">"Support vector machine"</span></div>
+<div class="line"><a name="l00063"></a><span class="lineno">   63</span>         self.<a class="code" href="classqgis_1_1pksvm_1_1pksvm.html#a33cc5cc741eadc78c3fa6687592cd810">group</a> = <span class="stringliteral">"[pktools] supervised classification"</span></div>
+<div class="line"><a name="l00064"></a><span class="lineno">   64</span>         self.addParameter(ParameterRaster(self.<a class="code" href="classqgis_1_1pksvm_1_1pksvm.html#a70980660386dbf0e5a4abbaee81b20b7">INPUT</a>, <span class="stringliteral">'Input layer raster data set'</span>,ParameterRaster))</div>
+<div class="line"><a name="l00065"></a><span class="lineno">   65</span>         self.addParameter(ParameterVector(self.<a class="code" href="classqgis_1_1pksvm_1_1pksvm.html#a52e9137080458d2fa51683e03d046418">TRAINING</a>, <span class="stringliteral">'Training vector file.'</span>))</div>
+<div class="line"><a name="l00066"></a><span class="lineno">   66</span>         self.addParameter(ParameterBoolean(self.<a class="code" href="classqgis_1_1pksvm_1_1pksvm.html#a655f6139a543113d1dd2ad8b11f773b9">ITERATE</a>, <span class="stringliteral">"Iterate over all layers"</span>,<span class="keyword">True</span>))</div>
+<div class="line"><a name="l00067"></a><span class="lineno">   67</span>         self.addParameter(ParameterString(self.<a class="code" href="classqgis_1_1pksvm_1_1pksvm.html#a426fe91136cb5f3e7ebbeba2c4199501">LABEL</a>, <span class="stringliteral">"Attribute name for class label in training vector file"</span>,<span class="stringliteral">"label"</span>))</div>
+<div class="line"><a name="l00068"></a><span class="lineno">   68</span>         self.addParameter(ParameterNumber(self.<a class="code" href="classqgis_1_1pksvm_1_1pksvm.html#ab6c3b8cccb265ca1cfadeaa79fed04a1">GAMMA</a>, <span class="stringliteral">"Gamma in kernel function"</span>,0,100,1.0))</div>
+<div class="line"><a name="l00069"></a><span class="lineno">   69</span>         self.addParameter(ParameterNumber(self.<a class="code" href="classqgis_1_1pksvm_1_1pksvm.html#ab3ec104ab7505d3115c8aa868b4f8cba">COST</a>, <span class="stringliteral">"The parameter C of C_SVC"</span>,0,100000,1000.0))</div>
+<div class="line"><a name="l00070"></a><span class="lineno">   70</span>         self.addParameter(ParameterFile(self.<a class="code" href="classqgis_1_1pksvm_1_1pksvm.html#a614bbc0b875b73667749b0e58d89fc54">MASK</a>, <span class="stringliteral">"Mask vector/raster dataset used for classification"</span>,<span class="stringliteral">"None"</span>,optional=<span class="keyword">True</span>))</div>
+<div class="line"><a name="l00071"></a><span class="lineno">   71</span>         self.addParameter(ParameterString(self.<a class="code" href="classqgis_1_1pksvm_1_1pksvm.html#a63e8acd9ffce30910af0eed869439190">MSKNODATA</a>, <span class="stringliteral">"Mask value(s) not to consider for classification (in case of raster mask, e.g., 0;255)"</span>,<span class="stringliteral">"0"</span>))</div>
+<div class="line"><a name="l00072"></a><span class="lineno">   72</span>         self.addOutput(OutputRaster(self.<a class="code" href="classqgis_1_1pksvm_1_1pksvm.html#aeb7332c0838e46bfe82b647cb5085700">OUTPUT</a>, <span class="stringliteral">"Output raster data set"</span>))</div>
+<div class="line"><a name="l00073"></a><span class="lineno">   73</span>         self.addParameter(ParameterString(self.<a class="code" href="classqgis_1_1pksvm_1_1pksvm.html#aead41106feadc1f8d3078aa839df4f79">EXTRA</a>,</div>
+<div class="line"><a name="l00074"></a><span class="lineno">   74</span>                           <span class="stringliteral">'Additional parameters'</span>, <span class="stringliteral">'-of GTiff'</span>, optional=<span class="keyword">True</span>))</div>
+<div class="line"><a name="l00075"></a><span class="lineno">   75</span> </div>
+<div class="line"><a name="l00076"></a><span class="lineno">   76</span> <span class="comment">#        self.addParameter(ParameterSelection(self.KERNEL_TYPE,"Type of kernel function (linear,polynomial,radial,sigmoid)",self.KERNEL_TYPE_OPTIONS, 2))</span></div>
+<div class="line"><a name="l00077"></a><span class="lineno">   77</span> <span class="comment">#        self.addParameter(ParameterSelection(self.SVM_TYPE,"Type of SVM (C_SVC, nu_SVC,one_class, epsilon_SVR, nu_SVR)",self.SVM_TYPE_OPTIONS, 0))</span></div>
+<div class="line"><a name="l00078"></a><span class="lineno">   78</span> </div>
+<div class="line"><a name="l00079"></a><span class="lineno">   79</span>     <span class="keyword">def </span>processAlgorithm(self, progress):</div>
+<div class="line"><a name="l00080"></a><span class="lineno">   80</span>         cliPath = <span class="stringliteral">'"'</span> + os.path.join(pktoolsUtils.pktoolsPath(), self.<a class="code" href="classqgis_1_1pksvm_1_1pksvm.html#ac0504ade82ce87e0d386db1a50812bf9">cliName</a>()) + <span class="stringliteral">'"'</span></div>
+<div class="line"><a name="l00081"></a><span class="lineno">   81</span>         commands = [cliPath]</div>
+<div class="line"><a name="l00082"></a><span class="lineno">   82</span> </div>
+<div class="line"><a name="l00083"></a><span class="lineno">   83</span>         input=self.getParameterValue(self.<a class="code" href="classqgis_1_1pksvm_1_1pksvm.html#a70980660386dbf0e5a4abbaee81b20b7">INPUT</a>)</div>
+<div class="line"><a name="l00084"></a><span class="lineno">   84</span>         <span class="keywordflow">if</span> input != <span class="stringliteral">""</span>:</div>
+<div class="line"><a name="l00085"></a><span class="lineno">   85</span>             commands.append(<span class="stringliteral">'-i'</span>)</div>
+<div class="line"><a name="l00086"></a><span class="lineno">   86</span>             commands.append(<span class="stringliteral">'"'</span> + input + <span class="stringliteral">'"'</span>)</div>
+<div class="line"><a name="l00087"></a><span class="lineno">   87</span> </div>
+<div class="line"><a name="l00088"></a><span class="lineno">   88</span>         commands.append(<span class="stringliteral">'-t'</span>)</div>
+<div class="line"><a name="l00089"></a><span class="lineno">   89</span>         training=self.getParameterValue(self.<a class="code" href="classqgis_1_1pksvm_1_1pksvm.html#a52e9137080458d2fa51683e03d046418">TRAINING</a>)</div>
+<div class="line"><a name="l00090"></a><span class="lineno">   90</span> </div>
+<div class="line"><a name="l00091"></a><span class="lineno">   91</span>         if(str(training).find(<span class="stringliteral">'|'</span>)>0):</div>
+<div class="line"><a name="l00092"></a><span class="lineno">   92</span>             <span class="keywordflow">if</span> self.getParameterValue(self.<a class="code" href="classqgis_1_1pksvm_1_1pksvm.html#a655f6139a543113d1dd2ad8b11f773b9">ITERATE</a>):</div>
+<div class="line"><a name="l00093"></a><span class="lineno">   93</span>                 trainingname=str(training)</div>
+<div class="line"><a name="l00094"></a><span class="lineno">   94</span>                 commands.append(trainingname[:trainingname.find(<span class="stringliteral">'|'</span>)])</div>
+<div class="line"><a name="l00095"></a><span class="lineno">   95</span>             <span class="keywordflow">else</span>:</div>
+<div class="line"><a name="l00096"></a><span class="lineno">   96</span>                 trainingname=str(training).replace(<span class="stringliteral">"|layername"</span>,<span class="stringliteral">" -ln"</span>)</div>
+<div class="line"><a name="l00097"></a><span class="lineno">   97</span>                 commands.append(trainingname)</div>
+<div class="line"><a name="l00098"></a><span class="lineno">   98</span>         <span class="keywordflow">else</span>:</div>
+<div class="line"><a name="l00099"></a><span class="lineno">   99</span>             commands.append(training)</div>
+<div class="line"><a name="l00100"></a><span class="lineno">  100</span> </div>
+<div class="line"><a name="l00101"></a><span class="lineno">  101</span>         commands.append(<span class="stringliteral">'-label'</span>)</div>
+<div class="line"><a name="l00102"></a><span class="lineno">  102</span>         commands.append(str(self.getParameterValue(self.<a class="code" href="classqgis_1_1pksvm_1_1pksvm.html#a426fe91136cb5f3e7ebbeba2c4199501">LABEL</a>)))</div>
+<div class="line"><a name="l00103"></a><span class="lineno">  103</span>         <span class="comment"># if self.getParameterValue(self.CV):</span></div>
+<div class="line"><a name="l00104"></a><span class="lineno">  104</span>         <span class="comment">#     commands.append("-cv 2")</span></div>
+<div class="line"><a name="l00105"></a><span class="lineno">  105</span>         commands.append(<span class="stringliteral">'-g'</span>)</div>
+<div class="line"><a name="l00106"></a><span class="lineno">  106</span>         commands.append(str(self.getParameterValue(self.<a class="code" href="classqgis_1_1pksvm_1_1pksvm.html#ab6c3b8cccb265ca1cfadeaa79fed04a1">GAMMA</a>)))</div>
+<div class="line"><a name="l00107"></a><span class="lineno">  107</span>         commands.append(<span class="stringliteral">'-cc'</span>)</div>
+<div class="line"><a name="l00108"></a><span class="lineno">  108</span>         commands.append(str(self.getParameterValue(self.<a class="code" href="classqgis_1_1pksvm_1_1pksvm.html#ab3ec104ab7505d3115c8aa868b4f8cba">COST</a>)))</div>
+<div class="line"><a name="l00109"></a><span class="lineno">  109</span> </div>
+<div class="line"><a name="l00110"></a><span class="lineno">  110</span>         mask = str(self.getParameterValue(self.<a class="code" href="classqgis_1_1pksvm_1_1pksvm.html#a614bbc0b875b73667749b0e58d89fc54">MASK</a>))</div>
+<div class="line"><a name="l00111"></a><span class="lineno">  111</span>         <span class="keywordflow">if</span> mask != <span class="stringliteral">""</span>:</div>
+<div class="line"><a name="l00112"></a><span class="lineno">  112</span>             commands.append(<span class="stringliteral">'-m'</span>)</div>
+<div class="line"><a name="l00113"></a><span class="lineno">  113</span>             commands.append(mask)</div>
+<div class="line"><a name="l00114"></a><span class="lineno">  114</span>             msknodata=str(self.getParameterValue(self.<a class="code" href="classqgis_1_1pksvm_1_1pksvm.html#a63e8acd9ffce30910af0eed869439190">MSKNODATA</a>))</div>
+<div class="line"><a name="l00115"></a><span class="lineno">  115</span>             msknodataValues = msknodata.split(<span class="stringliteral">';'</span>)</div>
+<div class="line"><a name="l00116"></a><span class="lineno">  116</span>             <span class="keywordflow">for</span> msknodataValue <span class="keywordflow">in</span> msknodataValues:</div>
+<div class="line"><a name="l00117"></a><span class="lineno">  117</span>                 commands.append(<span class="stringliteral">'-msknodata'</span>)</div>
+<div class="line"><a name="l00118"></a><span class="lineno">  118</span>                 commands.append(msknodataValue)</div>
+<div class="line"><a name="l00119"></a><span class="lineno">  119</span>                 </div>
+<div class="line"><a name="l00120"></a><span class="lineno">  120</span>         extra = str(self.getParameterValue(self.<a class="code" href="classqgis_1_1pksvm_1_1pksvm.html#aead41106feadc1f8d3078aa839df4f79">EXTRA</a>))</div>
+<div class="line"><a name="l00121"></a><span class="lineno">  121</span>         <span class="keywordflow">if</span> len(extra) > 0:</div>
+<div class="line"><a name="l00122"></a><span class="lineno">  122</span>             commands.append(extra)</div>
+<div class="line"><a name="l00123"></a><span class="lineno">  123</span> </div>
+<div class="line"><a name="l00124"></a><span class="lineno">  124</span>         output=self.getOutputValue(self.<a class="code" href="classqgis_1_1pksvm_1_1pksvm.html#aeb7332c0838e46bfe82b647cb5085700">OUTPUT</a>)</div>
+<div class="line"><a name="l00125"></a><span class="lineno">  125</span>         <span class="keywordflow">if</span> output != <span class="stringliteral">""</span>:</div>
+<div class="line"><a name="l00126"></a><span class="lineno">  126</span>             commands.append(<span class="stringliteral">'-o'</span>)</div>
+<div class="line"><a name="l00127"></a><span class="lineno">  127</span>             commands.append(<span class="stringliteral">'"'</span> + output + <span class="stringliteral">'"'</span>)</div>
+<div class="line"><a name="l00128"></a><span class="lineno">  128</span> </div>
+<div class="line"><a name="l00129"></a><span class="lineno">  129</span>         pktoolsUtils.runpktools(commands, progress)</div>
+<div class="ttc" id="classqgis_1_1pksvm_1_1pksvm_html_a52e9137080458d2fa51683e03d046418"><div class="ttname"><a href="classqgis_1_1pksvm_1_1pksvm.html#a52e9137080458d2fa51683e03d046418">qgis.pksvm.pksvm.TRAINING</a></div><div class="ttdeci">string TRAINING</div><div class="ttdef"><b>Definition:</b> <a href="pksvm_8py_source.html#l00043">pksvm.py:43</a></div></div>
+<div class="ttc" id="classqgis_1_1pksvm_1_1pksvm_html_aead41106feadc1f8d3078aa839df4f79"><div class="ttname"><a href="classqgis_1_1pksvm_1_1pksvm.html#aead41106feadc1f8d3078aa839df4f79">qgis.pksvm.pksvm.EXTRA</a></div><div class="ttdeci">string EXTRA</div><div class="ttdef"><b>Definition:</b> <a href="pksvm_8py_source.html#l00056">pksvm.py:56</a></div></div>
+<div class="ttc" id="classqgis_1_1pksvm_1_1pksvm_html_a614bbc0b875b73667749b0e58d89fc54"><div class="ttname"><a href="classqgis_1_1pksvm_1_1pksvm.html#a614bbc0b875b73667749b0e58d89fc54">qgis.pksvm.pksvm.MASK</a></div><div class="ttdeci">string MASK</div><div class="ttdef"><b>Definition:</b> <a href="pksvm_8py_source.html#l00050">pksvm.py:50</a></div></div>
+<div class="ttc" id="classqgis_1_1pksvm_1_1pksvm_html_ab6c3b8cccb265ca1cfadeaa79fed04a1"><div class="ttname"><a href="classqgis_1_1pksvm_1_1pksvm.html#ab6c3b8cccb265ca1cfadeaa79fed04a1">qgis.pksvm.pksvm.GAMMA</a></div><div class="ttdeci">string GAMMA</div><div class="ttdef"><b>Definition:</b> <a href="pksvm_8py_source.html#l00047">pksvm.py:47</a></div></div>
+<div class="ttc" id="classqgis_1_1pksvm_1_1pksvm_html_a655f6139a543113d1dd2ad8b11f773b9"><div class="ttname"><a href="classqgis_1_1pksvm_1_1pksvm.html#a655f6139a543113d1dd2ad8b11f773b9">qgis.pksvm.pksvm.ITERATE</a></div><div class="ttdeci">string ITERATE</div><div class="ttdef"><b>Definition:</b> <a href="pksvm_8py_source.html#l00044">pksvm.py:44</a></div></div>
+<div class="ttc" id="classqgis_1_1pksvm_1_1pksvm_html_a63e8acd9ffce30910af0eed869439190"><div class="ttname"><a href="classqgis_1_1pksvm_1_1pksvm.html#a63e8acd9ffce30910af0eed869439190">qgis.pksvm.pksvm.MSKNODATA</a></div><div class="ttdeci">string MSKNODATA</div><div class="ttdef"><b>Definition:</b> <a href="pksvm_8py_source.html#l00051">pksvm.py:51</a></div></div>
+<div class="ttc" id="classqgis_1_1pksvm_1_1pksvm_html_a33cc5cc741eadc78c3fa6687592cd810"><div class="ttname"><a href="classqgis_1_1pksvm_1_1pksvm.html#a33cc5cc741eadc78c3fa6687592cd810">qgis.pksvm.pksvm.group</a></div><div class="ttdeci">group</div><div class="ttdef"><b>Definition:</b> <a href="pksvm_8py_source.html#l00063">pksvm.py:63</a></div></div>
+<div class="ttc" id="classqgis_1_1pksvm_1_1pksvm_html_ab3ec104ab7505d3115c8aa868b4f8cba"><div class="ttname"><a href="classqgis_1_1pksvm_1_1pksvm.html#ab3ec104ab7505d3115c8aa868b4f8cba">qgis.pksvm.pksvm.COST</a></div><div class="ttdeci">string COST</div><div class="ttdef"><b>Definition:</b> <a href="pksvm_8py_source.html#l00048">pksvm.py:48</a></div></div>
+<div class="ttc" id="classqgis_1_1pksvm_1_1pksvm_html_aa5c7d4dda4c1b0316e26dfb3c8f4cf8f"><div class="ttname"><a href="classqgis_1_1pksvm_1_1pksvm.html#aa5c7d4dda4c1b0316e26dfb3c8f4cf8f">qgis.pksvm.pksvm.name</a></div><div class="ttdeci">name</div><div class="ttdef"><b>Definition:</b> <a href="pksvm_8py_source.html#l00062">pksvm.py:62</a></div></div>
+<div class="ttc" id="classqgis_1_1pksvm_1_1pksvm_html_a426fe91136cb5f3e7ebbeba2c4199501"><div class="ttname"><a href="classqgis_1_1pksvm_1_1pksvm.html#a426fe91136cb5f3e7ebbeba2c4199501">qgis.pksvm.pksvm.LABEL</a></div><div class="ttdeci">string LABEL</div><div class="ttdef"><b>Definition:</b> <a href="pksvm_8py_source.html#l00045">pksvm.py:45</a></div></div>
+<div class="ttc" id="classqgis_1_1pksvm_1_1pksvm_html"><div class="ttname"><a href="classqgis_1_1pksvm_1_1pksvm.html">qgis.pksvm.pksvm</a></div><div class="ttdef"><b>Definition:</b> <a href="pksvm_8py_source.html#l00040">pksvm.py:40</a></div></div>
+<div class="ttc" id="classqgis_1_1pksvm_1_1pksvm_html_a70980660386dbf0e5a4abbaee81b20b7"><div class="ttname"><a href="classqgis_1_1pksvm_1_1pksvm.html#a70980660386dbf0e5a4abbaee81b20b7">qgis.pksvm.pksvm.INPUT</a></div><div class="ttdeci">string INPUT</div><div class="ttdef"><b>Definition:</b> <a href="pksvm_8py_source.html#l00042">pksvm.py:42</a></div></div>
+<div class="ttc" id="classqgis_1_1pksvm_1_1pksvm_html_aeb7332c0838e46bfe82b647cb5085700"><div class="ttname"><a href="classqgis_1_1pksvm_1_1pksvm.html#aeb7332c0838e46bfe82b647cb5085700">qgis.pksvm.pksvm.OUTPUT</a></div><div class="ttdeci">string OUTPUT</div><div class="ttdef"><b>Definition:</b> <a href="pksvm_8py_source.html#l00049">pksvm.py:49</a></div></div>
+<div class="ttc" id="classqgis_1_1pksvm_1_1pksvm_html_ac0504ade82ce87e0d386db1a50812bf9"><div class="ttname"><a href="classqgis_1_1pksvm_1_1pksvm.html#ac0504ade82ce87e0d386db1a50812bf9">qgis.pksvm.pksvm.cliName</a></div><div class="ttdeci">def cliName</div><div class="ttdef"><b>Definition:</b> <a href="pksvm_8py_source.html#l00058">pksvm.py:58</a></div></div>
 </div><!-- fragment --></div><!-- contents -->
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Jun 23 2015 17:09:36 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Tue Nov 3 2015 15:58:26 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/pksvm__gui_2main_8cpp_source.html b/doc/html/pksvm__gui_2main_8cpp_source.html
index 919427a..048ddf9 100644
--- a/doc/html/pksvm__gui_2main_8cpp_source.html
+++ b/doc/html/pksvm__gui_2main_8cpp_source.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.3</span>
+    <span id="projectnumber">2.6.4</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -87,7 +87,7 @@
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Jun 23 2015 17:09:36 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Tue Nov 3 2015 15:58:26 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/pksvm__gui_2mainwindow_8cpp_source.html b/doc/html/pksvm__gui_2mainwindow_8cpp_source.html
index 5010894..f1c879e 100644
--- a/doc/html/pksvm__gui_2mainwindow_8cpp_source.html
+++ b/doc/html/pksvm__gui_2mainwindow_8cpp_source.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.3</span>
+    <span id="projectnumber">2.6.4</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -337,7 +337,7 @@
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Jun 23 2015 17:09:36 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Tue Nov 3 2015 15:58:26 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/pksvm__gui_2mainwindow_8h_source.html b/doc/html/pksvm__gui_2mainwindow_8h_source.html
index ba8ad48..d59235e 100644
--- a/doc/html/pksvm__gui_2mainwindow_8h_source.html
+++ b/doc/html/pksvm__gui_2mainwindow_8h_source.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.3</span>
+    <span id="projectnumber">2.6.4</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -135,7 +135,7 @@
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Jun 23 2015 17:09:36 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Tue Nov 3 2015 15:58:26 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/pktestOption_8cc_source.html b/doc/html/pktestOption_8cc_source.html
index e487722..548d296 100644
--- a/doc/html/pktestOption_8cc_source.html
+++ b/doc/html/pktestOption_8cc_source.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.3</span>
+    <span id="projectnumber">2.6.4</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -113,7 +113,7 @@
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Jun 23 2015 17:09:36 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/pktoolsAlgorithmProvider_8py_source.html b/doc/html/pktoolsAlgorithmProvider_8py_source.html
index 33dff5e..b7bb6a0 100644
--- a/doc/html/pktoolsAlgorithmProvider_8py_source.html
+++ b/doc/html/pktoolsAlgorithmProvider_8py_source.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.3</span>
+    <span id="projectnumber">2.6.4</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -184,7 +184,7 @@
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Jun 23 2015 17:09:36 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Tue Nov 3 2015 15:58:26 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/pktoolsAlgorithm_8py_source.html b/doc/html/pktoolsAlgorithm_8py_source.html
index 80f57d2..c2b7fe2 100644
--- a/doc/html/pktoolsAlgorithm_8py_source.html
+++ b/doc/html/pktoolsAlgorithm_8py_source.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.3</span>
+    <span id="projectnumber">2.6.4</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -106,15 +106,14 @@
 <div class="line"><a name="l00052"></a><span class="lineno">   52</span>     <span class="keyword">def </span>help(self):</div>
 <div class="line"><a name="l00053"></a><span class="lineno">   53</span> </div>
 <div class="line"><a name="l00054"></a><span class="lineno">   54</span>         <span class="comment">#utilityName=self.__class__.__name__</span></div>
-<div class="line"><a name="l00055"></a><span class="lineno">   55</span> </div>
-<div class="line"><a name="l00056"></a><span class="lineno">   56</span>         helpUrl = <span class="stringliteral">'http://pktools.nongnu.org/html/md_{}.html'</span>.format(self.cliName())</div>
-<div class="line"><a name="l00057"></a><span class="lineno">   57</span>         <span class="keywordflow">return</span> <span class="keyword">False</span>, helpUrl        </div>
+<div class="line"><a name="l00055"></a><span class="lineno">   55</span>         helpUrl = <span class="stringliteral">'http://pktools.nongnu.org/html/{}.html'</span>.format(self.cliName())</div>
+<div class="line"><a name="l00056"></a><span class="lineno">   56</span>         <span class="keywordflow">return</span> <span class="keyword">False</span>, helpUrl        </div>
 <div class="ttc" id="classqgis_1_1pktoolsAlgorithm_1_1pktoolsAlgorithm_html"><div class="ttname"><a href="classqgis_1_1pktoolsAlgorithm_1_1pktoolsAlgorithm.html">qgis.pktoolsAlgorithm.pktoolsAlgorithm</a></div><div class="ttdef"><b>Definition:</b> <a href="pktoolsAlgorithm_8py_source.html#l00041">pktoolsAlgorithm.py:41</a></div></div>
 </div><!-- fragment --></div><!-- contents -->
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Jun 23 2015 17:09:36 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Tue Nov 3 2015 15:58:26 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/pktoolsUtils_8py_source.html b/doc/html/pktoolsUtils_8py_source.html
index 8bcc521..96c86a5 100644
--- a/doc/html/pktoolsUtils_8py_source.html
+++ b/doc/html/pktoolsUtils_8py_source.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.3</span>
+    <span id="projectnumber">2.6.4</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -150,7 +150,7 @@
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Jun 23 2015 17:09:36 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Tue Nov 3 2015 15:58:26 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/ProcessingPktoolsPlugin_8py_source.html b/doc/html/pktools_2ProcessingPktoolsPlugin_8py_source.html
similarity index 81%
copy from doc/html/ProcessingPktoolsPlugin_8py_source.html
copy to doc/html/pktools_2ProcessingPktoolsPlugin_8py_source.html
index 1f855d7..84cdfaf 100644
--- a/doc/html/ProcessingPktoolsPlugin_8py_source.html
+++ b/doc/html/pktools_2ProcessingPktoolsPlugin_8py_source.html
@@ -4,7 +4,7 @@
 <meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
 <meta http-equiv="X-UA-Compatible" content="IE=9"/>
 <meta name="generator" content="Doxygen 1.8.6"/>
-<title>pktools: /home/kempenep/pktools/qgis/ProcessingPktoolsPlugin.py Source File</title>
+<title>pktools: /home/kempenep/pktools/qgis/pktools/ProcessingPktoolsPlugin.py Source File</title>
 <link href="tabs.css" rel="stylesheet" type="text/css"/>
 <script type="text/javascript" src="jquery.js"></script>
 <script type="text/javascript" src="dynsections.js"></script>
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.3</span>
+    <span id="projectnumber">2.6.4</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -44,7 +44,7 @@
   </div>
 <div id="nav-path" class="navpath">
   <ul>
-<li class="navelem"><a class="el" href="dir_5785acc8d2e42f8795bdbe936856f26d.html">qgis</a></li>  </ul>
+<li class="navelem"><a class="el" href="dir_5785acc8d2e42f8795bdbe936856f26d.html">qgis</a></li><li class="navelem"><a class="el" href="dir_b7cc22b4453454f1e686d9a2e78d988d.html">pktools</a></li>  </ul>
 </div>
 </div><!-- top -->
 <div class="header">
@@ -91,23 +91,23 @@
 <div class="line"><a name="l00037"></a><span class="lineno">   37</span>     sys.path.insert(0, cmd_folder)</div>
 <div class="line"><a name="l00038"></a><span class="lineno">   38</span> </div>
 <div class="line"><a name="l00039"></a><span class="lineno">   39</span> </div>
-<div class="line"><a name="l00040"></a><span class="lineno"><a class="line" href="classqgis_1_1ProcessingPktoolsPlugin_1_1ProcessingPktoolsPlugin.html">   40</a></span> <span class="keyword">class </span><a class="code" href="classqgis_1_1ProcessingPktoolsPlugin_1_1ProcessingPktoolsPlugin.html">ProcessingPktoolsPlugin</a>:</div>
+<div class="line"><a name="l00040"></a><span class="lineno"><a class="line" href="classqgis_1_1pktools_1_1ProcessingPktoolsPlugin_1_1ProcessingPktoolsPlugin.html">   40</a></span> <span class="keyword">class </span><a class="code" href="classqgis_1_1pktools_1_1ProcessingPktoolsPlugin_1_1ProcessingPktoolsPlugin.html">ProcessingPktoolsPlugin</a>:</div>
 <div class="line"><a name="l00041"></a><span class="lineno">   41</span>     <span class="keyword">def </span>__init__(self):</div>
-<div class="line"><a name="l00042"></a><span class="lineno">   42</span>         self.<a class="code" href="classqgis_1_1ProcessingPktoolsPlugin_1_1ProcessingPktoolsPlugin.html#a5de532d34abad9efe561b48f8e7fdf32">provider</a> = pktoolsAlgorithmProvider()</div>
+<div class="line"><a name="l00042"></a><span class="lineno">   42</span>         self.<a class="code" href="classqgis_1_1pktools_1_1ProcessingPktoolsPlugin_1_1ProcessingPktoolsPlugin.html#a6bde09ef68ae5df5d481923313f6318e">provider</a> = pktoolsAlgorithmProvider()</div>
 <div class="line"><a name="l00043"></a><span class="lineno">   43</span> </div>
 <div class="line"><a name="l00044"></a><span class="lineno">   44</span>     <span class="keyword">def </span>initGui(self):</div>
-<div class="line"><a name="l00045"></a><span class="lineno">   45</span>         Processing.addProvider(self.<a class="code" href="classqgis_1_1ProcessingPktoolsPlugin_1_1ProcessingPktoolsPlugin.html#a5de532d34abad9efe561b48f8e7fdf32">provider</a>)</div>
+<div class="line"><a name="l00045"></a><span class="lineno">   45</span>         Processing.addProvider(self.<a class="code" href="classqgis_1_1pktools_1_1ProcessingPktoolsPlugin_1_1ProcessingPktoolsPlugin.html#a6bde09ef68ae5df5d481923313f6318e">provider</a>)</div>
 <div class="line"><a name="l00046"></a><span class="lineno">   46</span> </div>
 <div class="line"><a name="l00047"></a><span class="lineno">   47</span>     <span class="keyword">def </span>unload(self):</div>
-<div class="line"><a name="l00048"></a><span class="lineno">   48</span>         Processing.removeProvider(self.<a class="code" href="classqgis_1_1ProcessingPktoolsPlugin_1_1ProcessingPktoolsPlugin.html#a5de532d34abad9efe561b48f8e7fdf32">provider</a>)</div>
-<div class="ttc" id="classqgis_1_1ProcessingPktoolsPlugin_1_1ProcessingPktoolsPlugin_html_a5de532d34abad9efe561b48f8e7fdf32"><div class="ttname"><a href="classqgis_1_1ProcessingPktoolsPlugin_1_1ProcessingPktoolsPlugin.html#a5de532d34abad9efe561b48f8e7fdf32">qgis.ProcessingPktoolsPlugin.ProcessingPktoolsPlugin.provider</a></div><div class="ttdeci">provider</div><div class="ttdef"><b>Definition:</b> <a href="ProcessingPktoolsPlugin_8py_source.html#l00042">ProcessingPktoolsPlugin.py:42</a>< [...]
+<div class="line"><a name="l00048"></a><span class="lineno">   48</span>         Processing.removeProvider(self.<a class="code" href="classqgis_1_1pktools_1_1ProcessingPktoolsPlugin_1_1ProcessingPktoolsPlugin.html#a6bde09ef68ae5df5d481923313f6318e">provider</a>)</div>
+<div class="ttc" id="classqgis_1_1pktools_1_1ProcessingPktoolsPlugin_1_1ProcessingPktoolsPlugin_html"><div class="ttname"><a href="classqgis_1_1pktools_1_1ProcessingPktoolsPlugin_1_1ProcessingPktoolsPlugin.html">qgis.pktools.ProcessingPktoolsPlugin.ProcessingPktoolsPlugin</a></div><div class="ttdef"><b>Definition:</b> <a href="pktools_2ProcessingPktoolsPlugin_8py_source.html#l00040">ProcessingPktoolsPlugin.py:40</a></div></div>
 <div class="ttc" id="namespaceqgis_1_1core_html"><div class="ttname"><a href="namespaceqgis_1_1core.html">core</a></div></div>
-<div class="ttc" id="classqgis_1_1ProcessingPktoolsPlugin_1_1ProcessingPktoolsPlugin_html"><div class="ttname"><a href="classqgis_1_1ProcessingPktoolsPlugin_1_1ProcessingPktoolsPlugin.html">qgis.ProcessingPktoolsPlugin.ProcessingPktoolsPlugin</a></div><div class="ttdef"><b>Definition:</b> <a href="ProcessingPktoolsPlugin_8py_source.html#l00040">ProcessingPktoolsPlugin.py:40</a></div></div>
+<div class="ttc" id="classqgis_1_1pktools_1_1ProcessingPktoolsPlugin_1_1ProcessingPktoolsPlugin_html_a6bde09ef68ae5df5d481923313f6318e"><div class="ttname"><a href="classqgis_1_1pktools_1_1ProcessingPktoolsPlugin_1_1ProcessingPktoolsPlugin.html#a6bde09ef68ae5df5d481923313f6318e">qgis.pktools.ProcessingPktoolsPlugin.ProcessingPktoolsPlugin.provider</a></div><div class="ttdeci">provider</div><div class="ttdef"><b>Definition:</b> <a href="pktools_2ProcessingPktoolsPlugin_8py_source.html#l00 [...]
 </div><!-- fragment --></div><!-- contents -->
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Jun 23 2015 17:09:36 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Tue Nov 3 2015 15:58:26 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/____init_____8py_source.html b/doc/html/pktools_2____init_____8py_source.html
similarity index 95%
copy from doc/html/____init_____8py_source.html
copy to doc/html/pktools_2____init_____8py_source.html
index 0d9f795..b1ce6cc 100644
--- a/doc/html/____init_____8py_source.html
+++ b/doc/html/pktools_2____init_____8py_source.html
@@ -4,7 +4,7 @@
 <meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
 <meta http-equiv="X-UA-Compatible" content="IE=9"/>
 <meta name="generator" content="Doxygen 1.8.6"/>
-<title>pktools: /home/kempenep/pktools/qgis/__init__.py Source File</title>
+<title>pktools: /home/kempenep/pktools/qgis/pktools/__init__.py Source File</title>
 <link href="tabs.css" rel="stylesheet" type="text/css"/>
 <script type="text/javascript" src="jquery.js"></script>
 <script type="text/javascript" src="dynsections.js"></script>
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.3</span>
+    <span id="projectnumber">2.6.4</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -44,7 +44,7 @@
   </div>
 <div id="nav-path" class="navpath">
   <ul>
-<li class="navelem"><a class="el" href="dir_5785acc8d2e42f8795bdbe936856f26d.html">qgis</a></li>  </ul>
+<li class="navelem"><a class="el" href="dir_5785acc8d2e42f8795bdbe936856f26d.html">qgis</a></li><li class="navelem"><a class="el" href="dir_b7cc22b4453454f1e686d9a2e78d988d.html">pktools</a></li>  </ul>
 </div>
 </div><!-- top -->
 <div class="header">
@@ -87,7 +87,7 @@
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Jun 23 2015 17:09:36 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Tue Nov 3 2015 15:58:26 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/pkcomposite_8py_source.html b/doc/html/pktools_2pkcomposite_8py_source.html
similarity index 60%
copy from doc/html/pkcomposite_8py_source.html
copy to doc/html/pktools_2pkcomposite_8py_source.html
index 4301673..4252759 100644
--- a/doc/html/pkcomposite_8py_source.html
+++ b/doc/html/pktools_2pkcomposite_8py_source.html
@@ -4,7 +4,7 @@
 <meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
 <meta http-equiv="X-UA-Compatible" content="IE=9"/>
 <meta name="generator" content="Doxygen 1.8.6"/>
-<title>pktools: /home/kempenep/pktools/qgis/pkcomposite.py Source File</title>
+<title>pktools: /home/kempenep/pktools/qgis/pktools/pkcomposite.py Source File</title>
 <link href="tabs.css" rel="stylesheet" type="text/css"/>
 <script type="text/javascript" src="jquery.js"></script>
 <script type="text/javascript" src="dynsections.js"></script>
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.3</span>
+    <span id="projectnumber">2.6.4</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -44,7 +44,7 @@
   </div>
 <div id="nav-path" class="navpath">
   <ul>
-<li class="navelem"><a class="el" href="dir_5785acc8d2e42f8795bdbe936856f26d.html">qgis</a></li>  </ul>
+<li class="navelem"><a class="el" href="dir_5785acc8d2e42f8795bdbe936856f26d.html">qgis</a></li><li class="navelem"><a class="el" href="dir_b7cc22b4453454f1e686d9a2e78d988d.html">pktools</a></li>  </ul>
 </div>
 </div><!-- top -->
 <div class="header">
@@ -89,7 +89,7 @@
 <div class="line"><a name="l00035"></a><span class="lineno">   35</span> <span class="keyword">from</span> processing.core.parameters <span class="keyword">import</span> ParameterBoolean</div>
 <div class="line"><a name="l00036"></a><span class="lineno">   36</span> <span class="keyword">from</span> processing.core.parameters <span class="keyword">import</span> ParameterExtent</div>
 <div class="line"><a name="l00037"></a><span class="lineno">   37</span> </div>
-<div class="line"><a name="l00038"></a><span class="lineno"><a class="line" href="classqgis_1_1pkcomposite_1_1pkcomposite.html">   38</a></span> <span class="keyword">class </span><a class="code" href="classqgis_1_1pkcomposite_1_1pkcomposite.html">pkcomposite</a>(pktoolsAlgorithm):</div>
+<div class="line"><a name="l00038"></a><span class="lineno"><a class="line" href="classqgis_1_1pktools_1_1pkcomposite_1_1pkcomposite.html">   38</a></span> <span class="keyword">class </span><a class="code" href="classqgis_1_1pktools_1_1pkcomposite_1_1pkcomposite.html">pkcomposite</a>(pktoolsAlgorithm):</div>
 <div class="line"><a name="l00039"></a><span class="lineno">   39</span> </div>
 <div class="line"><a name="l00040"></a><span class="lineno">   40</span>     INPUT = <span class="stringliteral">"INPUT"</span></div>
 <div class="line"><a name="l00041"></a><span class="lineno">   41</span>     OUTPUT = <span class="stringliteral">"OUTPUT"</span></div>
@@ -114,52 +114,52 @@
 <div class="line"><a name="l00060"></a><span class="lineno">   60</span>         <span class="keywordflow">return</span> <span class="stringliteral">"pkcomposite"</span></div>
 <div class="line"><a name="l00061"></a><span class="lineno">   61</span> </div>
 <div class="line"><a name="l00062"></a><span class="lineno">   62</span>     <span class="keyword">def </span>defineCharacteristics(self):</div>
-<div class="line"><a name="l00063"></a><span class="lineno">   63</span>         self.<a class="code" href="classqgis_1_1pkcomposite_1_1pkcomposite.html#af9ff4b9a274bc1edb87048da555c78c5">name</a> = <span class="stringliteral">"composite/mosaic raster datasets"</span></div>
-<div class="line"><a name="l00064"></a><span class="lineno">   64</span>         self.<a class="code" href="classqgis_1_1pkcomposite_1_1pkcomposite.html#a93043eb33d26bf02e375323ca06ece59">group</a> = <span class="stringliteral">"[pktools] raster"</span></div>
-<div class="line"><a name="l00065"></a><span class="lineno">   65</span>         self.addParameter(ParameterMultipleInput(self.<a class="code" href="classqgis_1_1pkcomposite_1_1pkcomposite.html#aebe799f44d6edf989b3d82412c02809a">INPUT</a>, <span class="stringliteral">'Input layer raster data set'</span>,ParameterMultipleInput.TYPE_RASTER))</div>
-<div class="line"><a name="l00066"></a><span class="lineno">   66</span>         self.addParameter(ParameterSelection(self.<a class="code" href="classqgis_1_1pkcomposite_1_1pkcomposite.html#aa82de884f201e7c964fd97e55faa3df3">CRULE</a>,<span class="stringliteral">"composite rule"</span>,self.<a class="code" href="classqgis_1_1pkcomposite_1_1pkcomposite.html#a17e19984fe0607f36ee4cee78b9e5d06">CRULE_OPTIONS</a>, 0))</div>
-<div class="line"><a name="l00067"></a><span class="lineno">   67</span>         self.addOutput(OutputRaster(self.<a class="code" href="classqgis_1_1pkcomposite_1_1pkcomposite.html#a74b1ad0686d3e17322917be01eff6ac1">OUTPUT</a>, <span class="stringliteral">"Output raster data set"</span>))</div>
-<div class="line"><a name="l00068"></a><span class="lineno">   68</span>         self.addParameter(ParameterSelection(self.<a class="code" href="classqgis_1_1pkcomposite_1_1pkcomposite.html#aa65064fbe6e45aff10bd5e803026d12a">RTYPE</a>, <span class="stringliteral">'Output raster type (leave as none to keep original type)'</span>, self.<a class="code" href="classqgis_1_1pkcomposite_1_1pkcomposite.html#a71098b4079244d80eb821653a6e32f00">TYPE</a>, 0))</div>
-<div class="line"><a name="l00069"></a><span class="lineno">   69</span>         self.addParameter(ParameterNumber(self.<a class="code" href="classqgis_1_1pkcomposite_1_1pkcomposite.html#ae54bec0854b09e103e5dbe2146589997">DX</a>, <span class="stringliteral">"Output resolution in x (leave 0 for no change)"</span>,0.0,<span class="keywordtype">None</span>,0.0))</div>
-<div class="line"><a name="l00070"></a><span class="lineno">   70</span>         self.addParameter(ParameterNumber(self.<a class="code" href="classqgis_1_1pkcomposite_1_1pkcomposite.html#a9b797d46ca05fd41a88d0400351bd828">DY</a>, <span class="stringliteral">"Output resolution in y (leave 0 for no change)"</span>,0.0,<span class="keywordtype">None</span>,0.0))</div>
-<div class="line"><a name="l00071"></a><span class="lineno">   71</span>         self.addParameter(ParameterExtent(self.<a class="code" href="classqgis_1_1pkcomposite_1_1pkcomposite.html#ad003c6db03be187acded3c0890568c61">PROJWIN</a>,</div>
+<div class="line"><a name="l00063"></a><span class="lineno">   63</span>         self.<a class="code" href="classqgis_1_1pktools_1_1pkcomposite_1_1pkcomposite.html#ae5c19770832f35898b752105d828721b">name</a> = <span class="stringliteral">"composite/mosaic raster datasets"</span></div>
+<div class="line"><a name="l00064"></a><span class="lineno">   64</span>         self.<a class="code" href="classqgis_1_1pktools_1_1pkcomposite_1_1pkcomposite.html#ae880cea72e765e6339ad058eee48338b">group</a> = <span class="stringliteral">"[pktools] raster"</span></div>
+<div class="line"><a name="l00065"></a><span class="lineno">   65</span>         self.addParameter(ParameterMultipleInput(self.<a class="code" href="classqgis_1_1pktools_1_1pkcomposite_1_1pkcomposite.html#afb22832137b08d855bea38be798f09ea">INPUT</a>, <span class="stringliteral">'Input layer raster data set'</span>,ParameterMultipleInput.TYPE_RASTER))</div>
+<div class="line"><a name="l00066"></a><span class="lineno">   66</span>         self.addParameter(ParameterSelection(self.<a class="code" href="classqgis_1_1pktools_1_1pkcomposite_1_1pkcomposite.html#a47345a51323bb1691ca35ece877efb1d">CRULE</a>,<span class="stringliteral">"composite rule"</span>,self.<a class="code" href="classqgis_1_1pktools_1_1pkcomposite_1_1pkcomposite.html#a73b416e6ed08b45bd7efcfdfdaba4ab6">CRULE_OPTIONS</a>, 0))</div>
+<div class="line"><a name="l00067"></a><span class="lineno">   67</span>         self.addOutput(OutputRaster(self.<a class="code" href="classqgis_1_1pktools_1_1pkcomposite_1_1pkcomposite.html#ad095de90efcd6d1da7bc2590ce9a0ee9">OUTPUT</a>, <span class="stringliteral">"Output raster data set"</span>))</div>
+<div class="line"><a name="l00068"></a><span class="lineno">   68</span>         self.addParameter(ParameterSelection(self.<a class="code" href="classqgis_1_1pktools_1_1pkcomposite_1_1pkcomposite.html#a28599f5565263acdfe7ed1eadc976bde">RTYPE</a>, <span class="stringliteral">'Output raster type (leave as none to keep original type)'</span>, self.<a class="code" href="classqgis_1_1pktools_1_1pkcomposite_1_1pkcomposite.html#a5c1caab4d9c94ad9d0648348a364f133">TYPE</a>, 0))</div>
+<div class="line"><a name="l00069"></a><span class="lineno">   69</span>         self.addParameter(ParameterNumber(self.<a class="code" href="classqgis_1_1pktools_1_1pkcomposite_1_1pkcomposite.html#a7792dd836e222b13caadc31417e90a6b">DX</a>, <span class="stringliteral">"Output resolution in x (leave 0 for no change)"</span>,0.0,<span class="keywordtype">None</span>,0.0))</div>
+<div class="line"><a name="l00070"></a><span class="lineno">   70</span>         self.addParameter(ParameterNumber(self.<a class="code" href="classqgis_1_1pktools_1_1pkcomposite_1_1pkcomposite.html#aa940dd19d5252f4fef53d8257cd7811d">DY</a>, <span class="stringliteral">"Output resolution in y (leave 0 for no change)"</span>,0.0,<span class="keywordtype">None</span>,0.0))</div>
+<div class="line"><a name="l00071"></a><span class="lineno">   71</span>         self.addParameter(ParameterExtent(self.<a class="code" href="classqgis_1_1pktools_1_1pkcomposite_1_1pkcomposite.html#a48b92a1335d66add3766103500c24a4d">PROJWIN</a>,</div>
 <div class="line"><a name="l00072"></a><span class="lineno">   72</span>                           <span class="stringliteral">'Georeferenced boundingbox'</span>))</div>
-<div class="line"><a name="l00073"></a><span class="lineno">   73</span>         self.addParameter(ParameterString(self.<a class="code" href="classqgis_1_1pkcomposite_1_1pkcomposite.html#a75b586bb10dce1cb66553e222d3a214c">CB</a>, <span class="stringliteral">"band index(es) used for the composite rule (0 based), e.g., 0;1 in case of maxndvi"</span>,<span class="stringliteral">"0"</span>))</div>
-<div class="line"><a name="l00074"></a><span class="lineno">   74</span>         self.addParameter(ParameterString(self.<a class="code" href="classqgis_1_1pkcomposite_1_1pkcomposite.html#a3c056445acdf3afd1cd26acd12c3c8f0">SRCNODATA</a>, <span class="stringliteral">"invalid value(s) for input raster dataset (e.g., 0;255)"</span>,<span class="stringliteral">"none"</span>))</div>
-<div class="line"><a name="l00075"></a><span class="lineno">   75</span>         self.addParameter(ParameterString(self.<a class="code" href="classqgis_1_1pkcomposite_1_1pkcomposite.html#a65825f1ecd8b707d842cdc9b6bef2722">BNDNODATA</a>, <span class="stringliteral">"Band(s) in input image to check if pixel is valid (e.g., 0;1)"</span>,<span class="stringliteral">"0"</span>))</div>
-<div class="line"><a name="l00076"></a><span class="lineno">   76</span>         self.addParameter(ParameterString(self.<a class="code" href="classqgis_1_1pkcomposite_1_1pkcomposite.html#a243d2bbaac6c49959b2117a4042fa219">DSTNODATA</a>, <span class="stringliteral">"nodata value to put in output raster dataset if not valid or out of bounds"</span>,<span class="stringliteral">"0"</span>))</div>
-<div class="line"><a name="l00077"></a><span class="lineno">   77</span>         self.addParameter(ParameterString(self.<a class="code" href="classqgis_1_1pkcomposite_1_1pkcomposite.html#a3e62273f4e72fcf528d3c2a2bf2f407d">MINGUI</a>, <span class="stringliteral">"flag values smaller or equal to this value as invalid"</span>,<span class="stringliteral">"none"</span>))</div>
-<div class="line"><a name="l00078"></a><span class="lineno">   78</span>         self.addParameter(ParameterString(self.<a class="code" href="classqgis_1_1pkcomposite_1_1pkcomposite.html#a3bc122ffa6ff04ac4da3c486387bf7cc">MAXGUI</a>, <span class="stringliteral">"flag values smaller or equal to this value as invalid"</span>,<span class="stringliteral">"none"</span>))</div>
-<div class="line"><a name="l00079"></a><span class="lineno">   79</span>         self.addParameter(ParameterSelection(self.<a class="code" href="classqgis_1_1pkcomposite_1_1pkcomposite.html#a54b2d965b3a847cc1975fd62c9c4dce1">RESAMPLE</a>,<span class="stringliteral">"resampling method"</span>,self.<a class="code" href="classqgis_1_1pkcomposite_1_1pkcomposite.html#a08c3a8025fa0f42847033e6c7bfd6585">RESAMPLE_OPTIONS</a>, 0))</div>
-<div class="line"><a name="l00080"></a><span class="lineno">   80</span>         self.addParameter(ParameterString(self.<a class="code" href="classqgis_1_1pkcomposite_1_1pkcomposite.html#a2a6835752fccf49eb80614d762310c49">EXTRA</a>,</div>
+<div class="line"><a name="l00073"></a><span class="lineno">   73</span>         self.addParameter(ParameterString(self.<a class="code" href="classqgis_1_1pktools_1_1pkcomposite_1_1pkcomposite.html#a450395c11852e1f005bffe466925c42d">CB</a>, <span class="stringliteral">"band index(es) used for the composite rule (0 based), e.g., 0;1 in case of maxndvi"</span>,<span class="stringliteral">"0"</span>))</div>
+<div class="line"><a name="l00074"></a><span class="lineno">   74</span>         self.addParameter(ParameterString(self.<a class="code" href="classqgis_1_1pktools_1_1pkcomposite_1_1pkcomposite.html#a2e5828b6eb4912e7fd035d9e885b54c4">SRCNODATA</a>, <span class="stringliteral">"invalid value(s) for input raster dataset (e.g., 0;255)"</span>,<span class="stringliteral">"none"</span>))</div>
+<div class="line"><a name="l00075"></a><span class="lineno">   75</span>         self.addParameter(ParameterString(self.<a class="code" href="classqgis_1_1pktools_1_1pkcomposite_1_1pkcomposite.html#a3eeab89eabe7294252f9610977f10c09">BNDNODATA</a>, <span class="stringliteral">"Band(s) in input image to check if pixel is valid (e.g., 0;1)"</span>,<span class="stringliteral">"0"</span>))</div>
+<div class="line"><a name="l00076"></a><span class="lineno">   76</span>         self.addParameter(ParameterString(self.<a class="code" href="classqgis_1_1pktools_1_1pkcomposite_1_1pkcomposite.html#ae80eeebbec867494eb799574a2a22346">DSTNODATA</a>, <span class="stringliteral">"nodata value to put in output raster dataset if not valid or out of bounds"</span>,<span class="stringliteral">"0"</span>))</div>
+<div class="line"><a name="l00077"></a><span class="lineno">   77</span>         self.addParameter(ParameterString(self.<a class="code" href="classqgis_1_1pktools_1_1pkcomposite_1_1pkcomposite.html#a1523a0a2abdd0cf84c1c794e8d2eed89">MINGUI</a>, <span class="stringliteral">"flag values smaller or equal to this value as invalid"</span>,<span class="stringliteral">"none"</span>))</div>
+<div class="line"><a name="l00078"></a><span class="lineno">   78</span>         self.addParameter(ParameterString(self.<a class="code" href="classqgis_1_1pktools_1_1pkcomposite_1_1pkcomposite.html#aaeab6fdf6429c284df503d0ee29eee24">MAXGUI</a>, <span class="stringliteral">"flag values smaller or equal to this value as invalid"</span>,<span class="stringliteral">"none"</span>))</div>
+<div class="line"><a name="l00079"></a><span class="lineno">   79</span>         self.addParameter(ParameterSelection(self.<a class="code" href="classqgis_1_1pktools_1_1pkcomposite_1_1pkcomposite.html#af1a5711589eb0837bf2f500508a6373e">RESAMPLE</a>,<span class="stringliteral">"resampling method"</span>,self.<a class="code" href="classqgis_1_1pktools_1_1pkcomposite_1_1pkcomposite.html#aff4540989ad400292a4bb23fba35a598">RESAMPLE_OPTIONS</a>, 0))</div>
+<div class="line"><a name="l00080"></a><span class="lineno">   80</span>         self.addParameter(ParameterString(self.<a class="code" href="classqgis_1_1pktools_1_1pkcomposite_1_1pkcomposite.html#ac2d1f35938c4fc3a99039e06384df9a7">EXTRA</a>,</div>
 <div class="line"><a name="l00081"></a><span class="lineno">   81</span>                           <span class="stringliteral">'Additional parameters'</span>, <span class="stringliteral">'-of GTiff'</span>, optional=<span class="keyword">True</span>))</div>
 <div class="line"><a name="l00082"></a><span class="lineno">   82</span> </div>
 <div class="line"><a name="l00083"></a><span class="lineno">   83</span>     <span class="keyword">def </span>processAlgorithm(self, progress):</div>
-<div class="line"><a name="l00084"></a><span class="lineno">   84</span>         cliPath = <span class="stringliteral">'"'</span> + os.path.join(pktoolsUtils.pktoolsPath(), self.<a class="code" href="classqgis_1_1pkcomposite_1_1pkcomposite.html#a50e046d7f4d00ac95080ec2b2f281bb6">cliName</a>()) + <span class="stringliteral">'"'</span></div>
+<div class="line"><a name="l00084"></a><span class="lineno">   84</span>         cliPath = <span class="stringliteral">'"'</span> + os.path.join(pktoolsUtils.pktoolsPath(), self.<a class="code" href="classqgis_1_1pktools_1_1pkcomposite_1_1pkcomposite.html#a3965eb26c90ee1566a43a333540654fb">cliName</a>()) + <span class="stringliteral">'"'</span></div>
 <div class="line"><a name="l00085"></a><span class="lineno">   85</span>         commands = [cliPath]</div>
 <div class="line"><a name="l00086"></a><span class="lineno">   86</span> </div>
-<div class="line"><a name="l00087"></a><span class="lineno">   87</span>         input=self.getParameterValue(self.<a class="code" href="classqgis_1_1pkcomposite_1_1pkcomposite.html#aebe799f44d6edf989b3d82412c02809a">INPUT</a>)</div>
+<div class="line"><a name="l00087"></a><span class="lineno">   87</span>         input=self.getParameterValue(self.<a class="code" href="classqgis_1_1pktools_1_1pkcomposite_1_1pkcomposite.html#afb22832137b08d855bea38be798f09ea">INPUT</a>)</div>
 <div class="line"><a name="l00088"></a><span class="lineno">   88</span>         inputFiles = input.split(<span class="stringliteral">';'</span>)</div>
 <div class="line"><a name="l00089"></a><span class="lineno">   89</span>         <span class="keywordflow">for</span> inputFile <span class="keywordflow">in</span> inputFiles:</div>
 <div class="line"><a name="l00090"></a><span class="lineno">   90</span>             commands.append(<span class="stringliteral">'-i'</span>)</div>
 <div class="line"><a name="l00091"></a><span class="lineno">   91</span>             commands.append(<span class="stringliteral">'"'</span> + inputFile + <span class="stringliteral">'"'</span>)</div>
 <div class="line"><a name="l00092"></a><span class="lineno">   92</span> </div>
-<div class="line"><a name="l00093"></a><span class="lineno">   93</span>         <span class="keywordflow">if</span> self.<a class="code" href="classqgis_1_1pkcomposite_1_1pkcomposite.html#a71098b4079244d80eb821653a6e32f00">TYPE</a>[self.getParameterValue(self.<a class="code" href="classqgis_1_1pkcomposite_1_1pkcomposite.html#aa65064fbe6e45aff10bd5e803026d12a">RTYPE</a>)] != <span class="stringliteral">"none"</span>:</div>
+<div class="line"><a name="l00093"></a><span class="lineno">   93</span>         <span class="keywordflow">if</span> self.<a class="code" href="classqgis_1_1pktools_1_1pkcomposite_1_1pkcomposite.html#a5c1caab4d9c94ad9d0648348a364f133">TYPE</a>[self.getParameterValue(self.<a class="code" href="classqgis_1_1pktools_1_1pkcomposite_1_1pkcomposite.html#a28599f5565263acdfe7ed1eadc976bde">RTYPE</a>)] != <span class="stringliteral">"none"</span>:</div>
 <div class="line"><a name="l00094"></a><span class="lineno">   94</span>             commands.append(<span class="stringliteral">'-ot'</span>)</div>
-<div class="line"><a name="l00095"></a><span class="lineno">   95</span>             commands.append(self.<a class="code" href="classqgis_1_1pkcomposite_1_1pkcomposite.html#a71098b4079244d80eb821653a6e32f00">TYPE</a>[self.getParameterValue(self.<a class="code" href="classqgis_1_1pkcomposite_1_1pkcomposite.html#aa65064fbe6e45aff10bd5e803026d12a">RTYPE</a>)])</div>
-<div class="line"><a name="l00096"></a><span class="lineno">   96</span>         output=self.getOutputValue(self.<a class="code" href="classqgis_1_1pkcomposite_1_1pkcomposite.html#a74b1ad0686d3e17322917be01eff6ac1">OUTPUT</a>)</div>
+<div class="line"><a name="l00095"></a><span class="lineno">   95</span>             commands.append(self.<a class="code" href="classqgis_1_1pktools_1_1pkcomposite_1_1pkcomposite.html#a5c1caab4d9c94ad9d0648348a364f133">TYPE</a>[self.getParameterValue(self.<a class="code" href="classqgis_1_1pktools_1_1pkcomposite_1_1pkcomposite.html#a28599f5565263acdfe7ed1eadc976bde">RTYPE</a>)])</div>
+<div class="line"><a name="l00096"></a><span class="lineno">   96</span>         output=self.getOutputValue(self.<a class="code" href="classqgis_1_1pktools_1_1pkcomposite_1_1pkcomposite.html#ad095de90efcd6d1da7bc2590ce9a0ee9">OUTPUT</a>)</div>
 <div class="line"><a name="l00097"></a><span class="lineno">   97</span>         <span class="keywordflow">if</span> output != <span class="stringliteral">""</span>:</div>
 <div class="line"><a name="l00098"></a><span class="lineno">   98</span>             commands.append(<span class="stringliteral">"-o"</span>)</div>
 <div class="line"><a name="l00099"></a><span class="lineno">   99</span>             commands.append(<span class="stringliteral">'"'</span> + output + <span class="stringliteral">'"'</span>)</div>
 <div class="line"><a name="l00100"></a><span class="lineno">  100</span>         commands.append(<span class="stringliteral">"-cr"</span>)</div>
-<div class="line"><a name="l00101"></a><span class="lineno">  101</span>         commands.append(self.<a class="code" href="classqgis_1_1pkcomposite_1_1pkcomposite.html#a17e19984fe0607f36ee4cee78b9e5d06">CRULE_OPTIONS</a>[self.getParameterValue(self.<a class="code" href="classqgis_1_1pkcomposite_1_1pkcomposite.html#aa82de884f201e7c964fd97e55faa3df3">CRULE</a>)])</div>
-<div class="line"><a name="l00102"></a><span class="lineno">  102</span>         <span class="keywordflow">if</span> self.getParameterValue(self.<a class="code" href="classqgis_1_1pkcomposite_1_1pkcomposite.html#ae54bec0854b09e103e5dbe2146589997">DX</a>) != 0:</div>
+<div class="line"><a name="l00101"></a><span class="lineno">  101</span>         commands.append(self.<a class="code" href="classqgis_1_1pktools_1_1pkcomposite_1_1pkcomposite.html#a73b416e6ed08b45bd7efcfdfdaba4ab6">CRULE_OPTIONS</a>[self.getParameterValue(self.<a class="code" href="classqgis_1_1pktools_1_1pkcomposite_1_1pkcomposite.html#a47345a51323bb1691ca35ece877efb1d">CRULE</a>)])</div>
+<div class="line"><a name="l00102"></a><span class="lineno">  102</span>         <span class="keywordflow">if</span> self.getParameterValue(self.<a class="code" href="classqgis_1_1pktools_1_1pkcomposite_1_1pkcomposite.html#a7792dd836e222b13caadc31417e90a6b">DX</a>) != 0:</div>
 <div class="line"><a name="l00103"></a><span class="lineno">  103</span>             commands.append(<span class="stringliteral">"-dx"</span>)</div>
-<div class="line"><a name="l00104"></a><span class="lineno">  104</span>             commands.append(str(self.getParameterValue(self.<a class="code" href="classqgis_1_1pkcomposite_1_1pkcomposite.html#ae54bec0854b09e103e5dbe2146589997">DX</a>)))</div>
-<div class="line"><a name="l00105"></a><span class="lineno">  105</span>         <span class="keywordflow">if</span> self.getParameterValue(self.<a class="code" href="classqgis_1_1pkcomposite_1_1pkcomposite.html#a9b797d46ca05fd41a88d0400351bd828">DY</a>) != 0:</div>
+<div class="line"><a name="l00104"></a><span class="lineno">  104</span>             commands.append(str(self.getParameterValue(self.<a class="code" href="classqgis_1_1pktools_1_1pkcomposite_1_1pkcomposite.html#a7792dd836e222b13caadc31417e90a6b">DX</a>)))</div>
+<div class="line"><a name="l00105"></a><span class="lineno">  105</span>         <span class="keywordflow">if</span> self.getParameterValue(self.<a class="code" href="classqgis_1_1pktools_1_1pkcomposite_1_1pkcomposite.html#aa940dd19d5252f4fef53d8257cd7811d">DY</a>) != 0:</div>
 <div class="line"><a name="l00106"></a><span class="lineno">  106</span>             commands.append(<span class="stringliteral">"-dy"</span>)</div>
-<div class="line"><a name="l00107"></a><span class="lineno">  107</span>             commands.append(str(self.getParameterValue(self.<a class="code" href="classqgis_1_1pkcomposite_1_1pkcomposite.html#a9b797d46ca05fd41a88d0400351bd828">DY</a>)))</div>
-<div class="line"><a name="l00108"></a><span class="lineno">  108</span>         projwin = str(self.getParameterValue(self.<a class="code" href="classqgis_1_1pkcomposite_1_1pkcomposite.html#ad003c6db03be187acded3c0890568c61">PROJWIN</a>))</div>
+<div class="line"><a name="l00107"></a><span class="lineno">  107</span>             commands.append(str(self.getParameterValue(self.<a class="code" href="classqgis_1_1pktools_1_1pkcomposite_1_1pkcomposite.html#aa940dd19d5252f4fef53d8257cd7811d">DY</a>)))</div>
+<div class="line"><a name="l00108"></a><span class="lineno">  108</span>         projwin = str(self.getParameterValue(self.<a class="code" href="classqgis_1_1pktools_1_1pkcomposite_1_1pkcomposite.html#a48b92a1335d66add3766103500c24a4d">PROJWIN</a>))</div>
 <div class="line"><a name="l00109"></a><span class="lineno">  109</span>         regionCoords = projwin.split(<span class="stringliteral">','</span>)</div>
 <div class="line"><a name="l00110"></a><span class="lineno">  110</span>         commands.append(<span class="stringliteral">'-ulx'</span>)</div>
 <div class="line"><a name="l00111"></a><span class="lineno">  111</span>         commands.append(regionCoords[0])</div>
@@ -169,71 +169,71 @@
 <div class="line"><a name="l00115"></a><span class="lineno">  115</span>         commands.append(regionCoords[1])</div>
 <div class="line"><a name="l00116"></a><span class="lineno">  116</span>         commands.append(<span class="stringliteral">'-lry'</span>)</div>
 <div class="line"><a name="l00117"></a><span class="lineno">  117</span>         commands.append(regionCoords[2])</div>
-<div class="line"><a name="l00118"></a><span class="lineno">  118</span>         cb=self.getParameterValue(self.<a class="code" href="classqgis_1_1pkcomposite_1_1pkcomposite.html#a75b586bb10dce1cb66553e222d3a214c">CB</a>)</div>
+<div class="line"><a name="l00118"></a><span class="lineno">  118</span>         cb=self.getParameterValue(self.<a class="code" href="classqgis_1_1pktools_1_1pkcomposite_1_1pkcomposite.html#a450395c11852e1f005bffe466925c42d">CB</a>)</div>
 <div class="line"><a name="l00119"></a><span class="lineno">  119</span>         cbValues = cb.split(<span class="stringliteral">';'</span>)</div>
 <div class="line"><a name="l00120"></a><span class="lineno">  120</span>         <span class="keywordflow">for</span> cbValue <span class="keywordflow">in</span> cbValues:</div>
 <div class="line"><a name="l00121"></a><span class="lineno">  121</span>                 commands.append(<span class="stringliteral">'-cb'</span>)</div>
 <div class="line"><a name="l00122"></a><span class="lineno">  122</span>                 commands.append(cbValue)</div>
-<div class="line"><a name="l00123"></a><span class="lineno">  123</span>         srcnodata=self.getParameterValue(self.<a class="code" href="classqgis_1_1pkcomposite_1_1pkcomposite.html#a3c056445acdf3afd1cd26acd12c3c8f0">SRCNODATA</a>)</div>
+<div class="line"><a name="l00123"></a><span class="lineno">  123</span>         srcnodata=self.getParameterValue(self.<a class="code" href="classqgis_1_1pktools_1_1pkcomposite_1_1pkcomposite.html#a2e5828b6eb4912e7fd035d9e885b54c4">SRCNODATA</a>)</div>
 <div class="line"><a name="l00124"></a><span class="lineno">  124</span>         <span class="keywordflow">if</span> srcnodata != <span class="stringliteral">"none"</span>:</div>
 <div class="line"><a name="l00125"></a><span class="lineno">  125</span>             srcnodataValues = srcnodata.split(<span class="stringliteral">';'</span>)</div>
 <div class="line"><a name="l00126"></a><span class="lineno">  126</span>             <span class="keywordflow">for</span> srcnodataValue <span class="keywordflow">in</span> srcnodataValues:</div>
 <div class="line"><a name="l00127"></a><span class="lineno">  127</span>                 commands.append(<span class="stringliteral">'-srcnodata'</span>)</div>
 <div class="line"><a name="l00128"></a><span class="lineno">  128</span>                 commands.append(srcnodataValue)</div>
-<div class="line"><a name="l00129"></a><span class="lineno">  129</span>         bndnodata=self.getParameterValue(self.<a class="code" href="classqgis_1_1pkcomposite_1_1pkcomposite.html#a65825f1ecd8b707d842cdc9b6bef2722">BNDNODATA</a>)</div>
+<div class="line"><a name="l00129"></a><span class="lineno">  129</span>         bndnodata=self.getParameterValue(self.<a class="code" href="classqgis_1_1pktools_1_1pkcomposite_1_1pkcomposite.html#a3eeab89eabe7294252f9610977f10c09">BNDNODATA</a>)</div>
 <div class="line"><a name="l00130"></a><span class="lineno">  130</span>         bndnodataValues = bndnodata.split(<span class="stringliteral">';'</span>)</div>
 <div class="line"><a name="l00131"></a><span class="lineno">  131</span>         <span class="keywordflow">for</span> bndnodataValue <span class="keywordflow">in</span> bndnodataValues:</div>
 <div class="line"><a name="l00132"></a><span class="lineno">  132</span>             commands.append(<span class="stringliteral">'-bndnodata'</span>)</div>
 <div class="line"><a name="l00133"></a><span class="lineno">  133</span>             commands.append(bndnodataValue)</div>
 <div class="line"><a name="l00134"></a><span class="lineno">  134</span>         commands.append(<span class="stringliteral">'-dstnodata'</span>)</div>
-<div class="line"><a name="l00135"></a><span class="lineno">  135</span>         commands.append(self.getParameterValue(self.<a class="code" href="classqgis_1_1pkcomposite_1_1pkcomposite.html#a243d2bbaac6c49959b2117a4042fa219">DSTNODATA</a>))</div>
+<div class="line"><a name="l00135"></a><span class="lineno">  135</span>         commands.append(self.getParameterValue(self.<a class="code" href="classqgis_1_1pktools_1_1pkcomposite_1_1pkcomposite.html#ae80eeebbec867494eb799574a2a22346">DSTNODATA</a>))</div>
 <div class="line"><a name="l00136"></a><span class="lineno">  136</span> </div>
-<div class="line"><a name="l00137"></a><span class="lineno">  137</span>         minGUI=self.getParameterValue(self.<a class="code" href="classqgis_1_1pkcomposite_1_1pkcomposite.html#a3e62273f4e72fcf528d3c2a2bf2f407d">MINGUI</a>)</div>
+<div class="line"><a name="l00137"></a><span class="lineno">  137</span>         minGUI=self.getParameterValue(self.<a class="code" href="classqgis_1_1pktools_1_1pkcomposite_1_1pkcomposite.html#a1523a0a2abdd0cf84c1c794e8d2eed89">MINGUI</a>)</div>
 <div class="line"><a name="l00138"></a><span class="lineno">  138</span>         <span class="keywordflow">if</span> minGUI != <span class="stringliteral">"none"</span>:</div>
 <div class="line"><a name="l00139"></a><span class="lineno">  139</span>             minValues = minGUI.split(<span class="stringliteral">';'</span>)</div>
 <div class="line"><a name="l00140"></a><span class="lineno">  140</span>             <span class="keywordflow">for</span> minValue <span class="keywordflow">in</span> minValues:</div>
 <div class="line"><a name="l00141"></a><span class="lineno">  141</span>                 commands.append(<span class="stringliteral">'-min'</span>)</div>
 <div class="line"><a name="l00142"></a><span class="lineno">  142</span>                 commands.append(minValue)</div>
-<div class="line"><a name="l00143"></a><span class="lineno">  143</span>         maxGUI=self.getParameterValue(self.<a class="code" href="classqgis_1_1pkcomposite_1_1pkcomposite.html#a3bc122ffa6ff04ac4da3c486387bf7cc">MAXGUI</a>)</div>
+<div class="line"><a name="l00143"></a><span class="lineno">  143</span>         maxGUI=self.getParameterValue(self.<a class="code" href="classqgis_1_1pktools_1_1pkcomposite_1_1pkcomposite.html#aaeab6fdf6429c284df503d0ee29eee24">MAXGUI</a>)</div>
 <div class="line"><a name="l00144"></a><span class="lineno">  144</span>         <span class="keywordflow">if</span> maxGUI != <span class="stringliteral">"none"</span>:</div>
 <div class="line"><a name="l00145"></a><span class="lineno">  145</span>             maxValues = maxGUI.split(<span class="stringliteral">';'</span>)</div>
 <div class="line"><a name="l00146"></a><span class="lineno">  146</span>             <span class="keywordflow">for</span> maxValue <span class="keywordflow">in</span> maxValues:</div>
 <div class="line"><a name="l00147"></a><span class="lineno">  147</span>                 commands.append(<span class="stringliteral">'-max'</span>)</div>
 <div class="line"><a name="l00148"></a><span class="lineno">  148</span>                 commands.append(maxValue)</div>
 <div class="line"><a name="l00149"></a><span class="lineno">  149</span>         commands.append(<span class="stringliteral">"-r"</span>)</div>
-<div class="line"><a name="l00150"></a><span class="lineno">  150</span>         commands.append(self.<a class="code" href="classqgis_1_1pkcomposite_1_1pkcomposite.html#a08c3a8025fa0f42847033e6c7bfd6585">RESAMPLE_OPTIONS</a>[self.getParameterValue(self.<a class="code" href="classqgis_1_1pkcomposite_1_1pkcomposite.html#a54b2d965b3a847cc1975fd62c9c4dce1">RESAMPLE</a>)])</div>
-<div class="line"><a name="l00151"></a><span class="lineno">  151</span>         extra = str(self.getParameterValue(self.<a class="code" href="classqgis_1_1pkcomposite_1_1pkcomposite.html#a2a6835752fccf49eb80614d762310c49">EXTRA</a>))</div>
+<div class="line"><a name="l00150"></a><span class="lineno">  150</span>         commands.append(self.<a class="code" href="classqgis_1_1pktools_1_1pkcomposite_1_1pkcomposite.html#aff4540989ad400292a4bb23fba35a598">RESAMPLE_OPTIONS</a>[self.getParameterValue(self.<a class="code" href="classqgis_1_1pktools_1_1pkcomposite_1_1pkcomposite.html#af1a5711589eb0837bf2f500508a6373e">RESAMPLE</a>)])</div>
+<div class="line"><a name="l00151"></a><span class="lineno">  151</span>         extra = str(self.getParameterValue(self.<a class="code" href="classqgis_1_1pktools_1_1pkcomposite_1_1pkcomposite.html#ac2d1f35938c4fc3a99039e06384df9a7">EXTRA</a>))</div>
 <div class="line"><a name="l00152"></a><span class="lineno">  152</span>         <span class="keywordflow">if</span> len(extra) > 0:</div>
 <div class="line"><a name="l00153"></a><span class="lineno">  153</span>             commands.append(extra)</div>
 <div class="line"><a name="l00154"></a><span class="lineno">  154</span> </div>
 <div class="line"><a name="l00155"></a><span class="lineno">  155</span>         pktoolsUtils.runpktools(commands, progress)</div>
-<div class="ttc" id="classqgis_1_1pkcomposite_1_1pkcomposite_html_a08c3a8025fa0f42847033e6c7bfd6585"><div class="ttname"><a href="classqgis_1_1pkcomposite_1_1pkcomposite.html#a08c3a8025fa0f42847033e6c7bfd6585">qgis.pkcomposite.pkcomposite.RESAMPLE_OPTIONS</a></div><div class="ttdeci">list RESAMPLE_OPTIONS</div><div class="ttdef"><b>Definition:</b> <a href="pkcomposite_8py_source.html#l00053">pkcomposite.py:53</a></div></div>
-<div class="ttc" id="classqgis_1_1pkcomposite_1_1pkcomposite_html_aebe799f44d6edf989b3d82412c02809a"><div class="ttname"><a href="classqgis_1_1pkcomposite_1_1pkcomposite.html#aebe799f44d6edf989b3d82412c02809a">qgis.pkcomposite.pkcomposite.INPUT</a></div><div class="ttdeci">string INPUT</div><div class="ttdef"><b>Definition:</b> <a href="pkcomposite_8py_source.html#l00040">pkcomposite.py:40</a></div></div>
-<div class="ttc" id="classqgis_1_1pkcomposite_1_1pkcomposite_html"><div class="ttname"><a href="classqgis_1_1pkcomposite_1_1pkcomposite.html">qgis.pkcomposite.pkcomposite</a></div><div class="ttdef"><b>Definition:</b> <a href="pkcomposite_8py_source.html#l00038">pkcomposite.py:38</a></div></div>
-<div class="ttc" id="classqgis_1_1pkcomposite_1_1pkcomposite_html_a3c056445acdf3afd1cd26acd12c3c8f0"><div class="ttname"><a href="classqgis_1_1pkcomposite_1_1pkcomposite.html#a3c056445acdf3afd1cd26acd12c3c8f0">qgis.pkcomposite.pkcomposite.SRCNODATA</a></div><div class="ttdeci">string SRCNODATA</div><div class="ttdef"><b>Definition:</b> <a href="pkcomposite_8py_source.html#l00048">pkcomposite.py:48</a></div></div>
-<div class="ttc" id="classqgis_1_1pkcomposite_1_1pkcomposite_html_a75b586bb10dce1cb66553e222d3a214c"><div class="ttname"><a href="classqgis_1_1pkcomposite_1_1pkcomposite.html#a75b586bb10dce1cb66553e222d3a214c">qgis.pkcomposite.pkcomposite.CB</a></div><div class="ttdeci">string CB</div><div class="ttdef"><b>Definition:</b> <a href="pkcomposite_8py_source.html#l00047">pkcomposite.py:47</a></div></div>
-<div class="ttc" id="classqgis_1_1pkcomposite_1_1pkcomposite_html_a243d2bbaac6c49959b2117a4042fa219"><div class="ttname"><a href="classqgis_1_1pkcomposite_1_1pkcomposite.html#a243d2bbaac6c49959b2117a4042fa219">qgis.pkcomposite.pkcomposite.DSTNODATA</a></div><div class="ttdeci">string DSTNODATA</div><div class="ttdef"><b>Definition:</b> <a href="pkcomposite_8py_source.html#l00050">pkcomposite.py:50</a></div></div>
-<div class="ttc" id="classqgis_1_1pkcomposite_1_1pkcomposite_html_a17e19984fe0607f36ee4cee78b9e5d06"><div class="ttname"><a href="classqgis_1_1pkcomposite_1_1pkcomposite.html#a17e19984fe0607f36ee4cee78b9e5d06">qgis.pkcomposite.pkcomposite.CRULE_OPTIONS</a></div><div class="ttdeci">list CRULE_OPTIONS</div><div class="ttdef"><b>Definition:</b> <a href="pkcomposite_8py_source.html#l00042">pkcomposite.py:42</a></div></div>
-<div class="ttc" id="classqgis_1_1pkcomposite_1_1pkcomposite_html_a54b2d965b3a847cc1975fd62c9c4dce1"><div class="ttname"><a href="classqgis_1_1pkcomposite_1_1pkcomposite.html#a54b2d965b3a847cc1975fd62c9c4dce1">qgis.pkcomposite.pkcomposite.RESAMPLE</a></div><div class="ttdeci">string RESAMPLE</div><div class="ttdef"><b>Definition:</b> <a href="pkcomposite_8py_source.html#l00054">pkcomposite.py:54</a></div></div>
-<div class="ttc" id="classqgis_1_1pkcomposite_1_1pkcomposite_html_a71098b4079244d80eb821653a6e32f00"><div class="ttname"><a href="classqgis_1_1pkcomposite_1_1pkcomposite.html#a71098b4079244d80eb821653a6e32f00">qgis.pkcomposite.pkcomposite.TYPE</a></div><div class="ttdeci">list TYPE</div><div class="ttdef"><b>Definition:</b> <a href="pkcomposite_8py_source.html#l00056">pkcomposite.py:56</a></div></div>
-<div class="ttc" id="classqgis_1_1pkcomposite_1_1pkcomposite_html_aa65064fbe6e45aff10bd5e803026d12a"><div class="ttname"><a href="classqgis_1_1pkcomposite_1_1pkcomposite.html#aa65064fbe6e45aff10bd5e803026d12a">qgis.pkcomposite.pkcomposite.RTYPE</a></div><div class="ttdeci">string RTYPE</div><div class="ttdef"><b>Definition:</b> <a href="pkcomposite_8py_source.html#l00055">pkcomposite.py:55</a></div></div>
-<div class="ttc" id="classqgis_1_1pkcomposite_1_1pkcomposite_html_a50e046d7f4d00ac95080ec2b2f281bb6"><div class="ttname"><a href="classqgis_1_1pkcomposite_1_1pkcomposite.html#a50e046d7f4d00ac95080ec2b2f281bb6">qgis.pkcomposite.pkcomposite.cliName</a></div><div class="ttdeci">def cliName</div><div class="ttdef"><b>Definition:</b> <a href="pkcomposite_8py_source.html#l00059">pkcomposite.py:59</a></div></div>
-<div class="ttc" id="classqgis_1_1pkcomposite_1_1pkcomposite_html_a3bc122ffa6ff04ac4da3c486387bf7cc"><div class="ttname"><a href="classqgis_1_1pkcomposite_1_1pkcomposite.html#a3bc122ffa6ff04ac4da3c486387bf7cc">qgis.pkcomposite.pkcomposite.MAXGUI</a></div><div class="ttdeci">string MAXGUI</div><div class="ttdef"><b>Definition:</b> <a href="pkcomposite_8py_source.html#l00052">pkcomposite.py:52</a></div></div>
-<div class="ttc" id="classqgis_1_1pkcomposite_1_1pkcomposite_html_a93043eb33d26bf02e375323ca06ece59"><div class="ttname"><a href="classqgis_1_1pkcomposite_1_1pkcomposite.html#a93043eb33d26bf02e375323ca06ece59">qgis.pkcomposite.pkcomposite.group</a></div><div class="ttdeci">group</div><div class="ttdef"><b>Definition:</b> <a href="pkcomposite_8py_source.html#l00064">pkcomposite.py:64</a></div></div>
-<div class="ttc" id="classqgis_1_1pkcomposite_1_1pkcomposite_html_a74b1ad0686d3e17322917be01eff6ac1"><div class="ttname"><a href="classqgis_1_1pkcomposite_1_1pkcomposite.html#a74b1ad0686d3e17322917be01eff6ac1">qgis.pkcomposite.pkcomposite.OUTPUT</a></div><div class="ttdeci">string OUTPUT</div><div class="ttdef"><b>Definition:</b> <a href="pkcomposite_8py_source.html#l00041">pkcomposite.py:41</a></div></div>
-<div class="ttc" id="classqgis_1_1pkcomposite_1_1pkcomposite_html_a9b797d46ca05fd41a88d0400351bd828"><div class="ttname"><a href="classqgis_1_1pkcomposite_1_1pkcomposite.html#a9b797d46ca05fd41a88d0400351bd828">qgis.pkcomposite.pkcomposite.DY</a></div><div class="ttdeci">string DY</div><div class="ttdef"><b>Definition:</b> <a href="pkcomposite_8py_source.html#l00045">pkcomposite.py:45</a></div></div>
-<div class="ttc" id="classqgis_1_1pkcomposite_1_1pkcomposite_html_ad003c6db03be187acded3c0890568c61"><div class="ttname"><a href="classqgis_1_1pkcomposite_1_1pkcomposite.html#ad003c6db03be187acded3c0890568c61">qgis.pkcomposite.pkcomposite.PROJWIN</a></div><div class="ttdeci">string PROJWIN</div><div class="ttdef"><b>Definition:</b> <a href="pkcomposite_8py_source.html#l00046">pkcomposite.py:46</a></div></div>
-<div class="ttc" id="classqgis_1_1pkcomposite_1_1pkcomposite_html_a65825f1ecd8b707d842cdc9b6bef2722"><div class="ttname"><a href="classqgis_1_1pkcomposite_1_1pkcomposite.html#a65825f1ecd8b707d842cdc9b6bef2722">qgis.pkcomposite.pkcomposite.BNDNODATA</a></div><div class="ttdeci">string BNDNODATA</div><div class="ttdef"><b>Definition:</b> <a href="pkcomposite_8py_source.html#l00049">pkcomposite.py:49</a></div></div>
-<div class="ttc" id="classqgis_1_1pkcomposite_1_1pkcomposite_html_ae54bec0854b09e103e5dbe2146589997"><div class="ttname"><a href="classqgis_1_1pkcomposite_1_1pkcomposite.html#ae54bec0854b09e103e5dbe2146589997">qgis.pkcomposite.pkcomposite.DX</a></div><div class="ttdeci">string DX</div><div class="ttdef"><b>Definition:</b> <a href="pkcomposite_8py_source.html#l00044">pkcomposite.py:44</a></div></div>
-<div class="ttc" id="classqgis_1_1pkcomposite_1_1pkcomposite_html_a2a6835752fccf49eb80614d762310c49"><div class="ttname"><a href="classqgis_1_1pkcomposite_1_1pkcomposite.html#a2a6835752fccf49eb80614d762310c49">qgis.pkcomposite.pkcomposite.EXTRA</a></div><div class="ttdeci">string EXTRA</div><div class="ttdef"><b>Definition:</b> <a href="pkcomposite_8py_source.html#l00057">pkcomposite.py:57</a></div></div>
-<div class="ttc" id="classqgis_1_1pkcomposite_1_1pkcomposite_html_af9ff4b9a274bc1edb87048da555c78c5"><div class="ttname"><a href="classqgis_1_1pkcomposite_1_1pkcomposite.html#af9ff4b9a274bc1edb87048da555c78c5">qgis.pkcomposite.pkcomposite.name</a></div><div class="ttdeci">name</div><div class="ttdef"><b>Definition:</b> <a href="pkcomposite_8py_source.html#l00063">pkcomposite.py:63</a></div></div>
-<div class="ttc" id="classqgis_1_1pkcomposite_1_1pkcomposite_html_a3e62273f4e72fcf528d3c2a2bf2f407d"><div class="ttname"><a href="classqgis_1_1pkcomposite_1_1pkcomposite.html#a3e62273f4e72fcf528d3c2a2bf2f407d">qgis.pkcomposite.pkcomposite.MINGUI</a></div><div class="ttdeci">string MINGUI</div><div class="ttdef"><b>Definition:</b> <a href="pkcomposite_8py_source.html#l00051">pkcomposite.py:51</a></div></div>
-<div class="ttc" id="classqgis_1_1pkcomposite_1_1pkcomposite_html_aa82de884f201e7c964fd97e55faa3df3"><div class="ttname"><a href="classqgis_1_1pkcomposite_1_1pkcomposite.html#aa82de884f201e7c964fd97e55faa3df3">qgis.pkcomposite.pkcomposite.CRULE</a></div><div class="ttdeci">string CRULE</div><div class="ttdef"><b>Definition:</b> <a href="pkcomposite_8py_source.html#l00043">pkcomposite.py:43</a></div></div>
+<div class="ttc" id="classqgis_1_1pktools_1_1pkcomposite_1_1pkcomposite_html_a28599f5565263acdfe7ed1eadc976bde"><div class="ttname"><a href="classqgis_1_1pktools_1_1pkcomposite_1_1pkcomposite.html#a28599f5565263acdfe7ed1eadc976bde">qgis.pktools.pkcomposite.pkcomposite.RTYPE</a></div><div class="ttdeci">string RTYPE</div><div class="ttdef"><b>Definition:</b> <a href="pktools_2pkcomposite_8py_source.html#l00055">pkcomposite.py:55</a></div></div>
+<div class="ttc" id="classqgis_1_1pktools_1_1pkcomposite_1_1pkcomposite_html_af1a5711589eb0837bf2f500508a6373e"><div class="ttname"><a href="classqgis_1_1pktools_1_1pkcomposite_1_1pkcomposite.html#af1a5711589eb0837bf2f500508a6373e">qgis.pktools.pkcomposite.pkcomposite.RESAMPLE</a></div><div class="ttdeci">string RESAMPLE</div><div class="ttdef"><b>Definition:</b> <a href="pktools_2pkcomposite_8py_source.html#l00054">pkcomposite.py:54</a></div></div>
+<div class="ttc" id="classqgis_1_1pktools_1_1pkcomposite_1_1pkcomposite_html_ac2d1f35938c4fc3a99039e06384df9a7"><div class="ttname"><a href="classqgis_1_1pktools_1_1pkcomposite_1_1pkcomposite.html#ac2d1f35938c4fc3a99039e06384df9a7">qgis.pktools.pkcomposite.pkcomposite.EXTRA</a></div><div class="ttdeci">string EXTRA</div><div class="ttdef"><b>Definition:</b> <a href="pktools_2pkcomposite_8py_source.html#l00057">pkcomposite.py:57</a></div></div>
+<div class="ttc" id="classqgis_1_1pktools_1_1pkcomposite_1_1pkcomposite_html_a5c1caab4d9c94ad9d0648348a364f133"><div class="ttname"><a href="classqgis_1_1pktools_1_1pkcomposite_1_1pkcomposite.html#a5c1caab4d9c94ad9d0648348a364f133">qgis.pktools.pkcomposite.pkcomposite.TYPE</a></div><div class="ttdeci">list TYPE</div><div class="ttdef"><b>Definition:</b> <a href="pktools_2pkcomposite_8py_source.html#l00056">pkcomposite.py:56</a></div></div>
+<div class="ttc" id="classqgis_1_1pktools_1_1pkcomposite_1_1pkcomposite_html_a3965eb26c90ee1566a43a333540654fb"><div class="ttname"><a href="classqgis_1_1pktools_1_1pkcomposite_1_1pkcomposite.html#a3965eb26c90ee1566a43a333540654fb">qgis.pktools.pkcomposite.pkcomposite.cliName</a></div><div class="ttdeci">def cliName</div><div class="ttdef"><b>Definition:</b> <a href="pktools_2pkcomposite_8py_source.html#l00059">pkcomposite.py:59</a></div></div>
+<div class="ttc" id="classqgis_1_1pktools_1_1pkcomposite_1_1pkcomposite_html_ae880cea72e765e6339ad058eee48338b"><div class="ttname"><a href="classqgis_1_1pktools_1_1pkcomposite_1_1pkcomposite.html#ae880cea72e765e6339ad058eee48338b">qgis.pktools.pkcomposite.pkcomposite.group</a></div><div class="ttdeci">group</div><div class="ttdef"><b>Definition:</b> <a href="pktools_2pkcomposite_8py_source.html#l00064">pkcomposite.py:64</a></div></div>
+<div class="ttc" id="classqgis_1_1pktools_1_1pkcomposite_1_1pkcomposite_html_ae5c19770832f35898b752105d828721b"><div class="ttname"><a href="classqgis_1_1pktools_1_1pkcomposite_1_1pkcomposite.html#ae5c19770832f35898b752105d828721b">qgis.pktools.pkcomposite.pkcomposite.name</a></div><div class="ttdeci">name</div><div class="ttdef"><b>Definition:</b> <a href="pktools_2pkcomposite_8py_source.html#l00063">pkcomposite.py:63</a></div></div>
+<div class="ttc" id="classqgis_1_1pktools_1_1pkcomposite_1_1pkcomposite_html_a1523a0a2abdd0cf84c1c794e8d2eed89"><div class="ttname"><a href="classqgis_1_1pktools_1_1pkcomposite_1_1pkcomposite.html#a1523a0a2abdd0cf84c1c794e8d2eed89">qgis.pktools.pkcomposite.pkcomposite.MINGUI</a></div><div class="ttdeci">string MINGUI</div><div class="ttdef"><b>Definition:</b> <a href="pktools_2pkcomposite_8py_source.html#l00051">pkcomposite.py:51</a></div></div>
+<div class="ttc" id="classqgis_1_1pktools_1_1pkcomposite_1_1pkcomposite_html_afb22832137b08d855bea38be798f09ea"><div class="ttname"><a href="classqgis_1_1pktools_1_1pkcomposite_1_1pkcomposite.html#afb22832137b08d855bea38be798f09ea">qgis.pktools.pkcomposite.pkcomposite.INPUT</a></div><div class="ttdeci">string INPUT</div><div class="ttdef"><b>Definition:</b> <a href="pktools_2pkcomposite_8py_source.html#l00040">pkcomposite.py:40</a></div></div>
+<div class="ttc" id="classqgis_1_1pktools_1_1pkcomposite_1_1pkcomposite_html_a48b92a1335d66add3766103500c24a4d"><div class="ttname"><a href="classqgis_1_1pktools_1_1pkcomposite_1_1pkcomposite.html#a48b92a1335d66add3766103500c24a4d">qgis.pktools.pkcomposite.pkcomposite.PROJWIN</a></div><div class="ttdeci">string PROJWIN</div><div class="ttdef"><b>Definition:</b> <a href="pktools_2pkcomposite_8py_source.html#l00046">pkcomposite.py:46</a></div></div>
+<div class="ttc" id="classqgis_1_1pktools_1_1pkcomposite_1_1pkcomposite_html_aa940dd19d5252f4fef53d8257cd7811d"><div class="ttname"><a href="classqgis_1_1pktools_1_1pkcomposite_1_1pkcomposite.html#aa940dd19d5252f4fef53d8257cd7811d">qgis.pktools.pkcomposite.pkcomposite.DY</a></div><div class="ttdeci">string DY</div><div class="ttdef"><b>Definition:</b> <a href="pktools_2pkcomposite_8py_source.html#l00045">pkcomposite.py:45</a></div></div>
+<div class="ttc" id="classqgis_1_1pktools_1_1pkcomposite_1_1pkcomposite_html"><div class="ttname"><a href="classqgis_1_1pktools_1_1pkcomposite_1_1pkcomposite.html">qgis.pktools.pkcomposite.pkcomposite</a></div><div class="ttdef"><b>Definition:</b> <a href="pktools_2pkcomposite_8py_source.html#l00038">pkcomposite.py:38</a></div></div>
+<div class="ttc" id="classqgis_1_1pktools_1_1pkcomposite_1_1pkcomposite_html_a2e5828b6eb4912e7fd035d9e885b54c4"><div class="ttname"><a href="classqgis_1_1pktools_1_1pkcomposite_1_1pkcomposite.html#a2e5828b6eb4912e7fd035d9e885b54c4">qgis.pktools.pkcomposite.pkcomposite.SRCNODATA</a></div><div class="ttdeci">string SRCNODATA</div><div class="ttdef"><b>Definition:</b> <a href="pktools_2pkcomposite_8py_source.html#l00048">pkcomposite.py:48</a></div></div>
+<div class="ttc" id="classqgis_1_1pktools_1_1pkcomposite_1_1pkcomposite_html_a3eeab89eabe7294252f9610977f10c09"><div class="ttname"><a href="classqgis_1_1pktools_1_1pkcomposite_1_1pkcomposite.html#a3eeab89eabe7294252f9610977f10c09">qgis.pktools.pkcomposite.pkcomposite.BNDNODATA</a></div><div class="ttdeci">string BNDNODATA</div><div class="ttdef"><b>Definition:</b> <a href="pktools_2pkcomposite_8py_source.html#l00049">pkcomposite.py:49</a></div></div>
+<div class="ttc" id="classqgis_1_1pktools_1_1pkcomposite_1_1pkcomposite_html_aaeab6fdf6429c284df503d0ee29eee24"><div class="ttname"><a href="classqgis_1_1pktools_1_1pkcomposite_1_1pkcomposite.html#aaeab6fdf6429c284df503d0ee29eee24">qgis.pktools.pkcomposite.pkcomposite.MAXGUI</a></div><div class="ttdeci">string MAXGUI</div><div class="ttdef"><b>Definition:</b> <a href="pktools_2pkcomposite_8py_source.html#l00052">pkcomposite.py:52</a></div></div>
+<div class="ttc" id="classqgis_1_1pktools_1_1pkcomposite_1_1pkcomposite_html_a47345a51323bb1691ca35ece877efb1d"><div class="ttname"><a href="classqgis_1_1pktools_1_1pkcomposite_1_1pkcomposite.html#a47345a51323bb1691ca35ece877efb1d">qgis.pktools.pkcomposite.pkcomposite.CRULE</a></div><div class="ttdeci">string CRULE</div><div class="ttdef"><b>Definition:</b> <a href="pktools_2pkcomposite_8py_source.html#l00043">pkcomposite.py:43</a></div></div>
+<div class="ttc" id="classqgis_1_1pktools_1_1pkcomposite_1_1pkcomposite_html_a450395c11852e1f005bffe466925c42d"><div class="ttname"><a href="classqgis_1_1pktools_1_1pkcomposite_1_1pkcomposite.html#a450395c11852e1f005bffe466925c42d">qgis.pktools.pkcomposite.pkcomposite.CB</a></div><div class="ttdeci">string CB</div><div class="ttdef"><b>Definition:</b> <a href="pktools_2pkcomposite_8py_source.html#l00047">pkcomposite.py:47</a></div></div>
+<div class="ttc" id="classqgis_1_1pktools_1_1pkcomposite_1_1pkcomposite_html_a7792dd836e222b13caadc31417e90a6b"><div class="ttname"><a href="classqgis_1_1pktools_1_1pkcomposite_1_1pkcomposite.html#a7792dd836e222b13caadc31417e90a6b">qgis.pktools.pkcomposite.pkcomposite.DX</a></div><div class="ttdeci">string DX</div><div class="ttdef"><b>Definition:</b> <a href="pktools_2pkcomposite_8py_source.html#l00044">pkcomposite.py:44</a></div></div>
+<div class="ttc" id="classqgis_1_1pktools_1_1pkcomposite_1_1pkcomposite_html_a73b416e6ed08b45bd7efcfdfdaba4ab6"><div class="ttname"><a href="classqgis_1_1pktools_1_1pkcomposite_1_1pkcomposite.html#a73b416e6ed08b45bd7efcfdfdaba4ab6">qgis.pktools.pkcomposite.pkcomposite.CRULE_OPTIONS</a></div><div class="ttdeci">list CRULE_OPTIONS</div><div class="ttdef"><b>Definition:</b> <a href="pktools_2pkcomposite_8py_source.html#l00042">pkcomposite.py:42</a></div></div>
+<div class="ttc" id="classqgis_1_1pktools_1_1pkcomposite_1_1pkcomposite_html_ae80eeebbec867494eb799574a2a22346"><div class="ttname"><a href="classqgis_1_1pktools_1_1pkcomposite_1_1pkcomposite.html#ae80eeebbec867494eb799574a2a22346">qgis.pktools.pkcomposite.pkcomposite.DSTNODATA</a></div><div class="ttdeci">string DSTNODATA</div><div class="ttdef"><b>Definition:</b> <a href="pktools_2pkcomposite_8py_source.html#l00050">pkcomposite.py:50</a></div></div>
+<div class="ttc" id="classqgis_1_1pktools_1_1pkcomposite_1_1pkcomposite_html_aff4540989ad400292a4bb23fba35a598"><div class="ttname"><a href="classqgis_1_1pktools_1_1pkcomposite_1_1pkcomposite.html#aff4540989ad400292a4bb23fba35a598">qgis.pktools.pkcomposite.pkcomposite.RESAMPLE_OPTIONS</a></div><div class="ttdeci">list RESAMPLE_OPTIONS</div><div class="ttdef"><b>Definition:</b> <a href="pktools_2pkcomposite_8py_source.html#l00053">pkcomposite.py:53</a></div></div>
+<div class="ttc" id="classqgis_1_1pktools_1_1pkcomposite_1_1pkcomposite_html_ad095de90efcd6d1da7bc2590ce9a0ee9"><div class="ttname"><a href="classqgis_1_1pktools_1_1pkcomposite_1_1pkcomposite.html#ad095de90efcd6d1da7bc2590ce9a0ee9">qgis.pktools.pkcomposite.pkcomposite.OUTPUT</a></div><div class="ttdeci">string OUTPUT</div><div class="ttdef"><b>Definition:</b> <a href="pktools_2pkcomposite_8py_source.html#l00041">pkcomposite.py:41</a></div></div>
 </div><!-- fragment --></div><!-- contents -->
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Jun 23 2015 17:09:36 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Tue Nov 3 2015 15:58:26 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/pkcrop_8py_source.html b/doc/html/pktools_2pkcrop_8py_source.html
similarity index 65%
copy from doc/html/pkcrop_8py_source.html
copy to doc/html/pktools_2pkcrop_8py_source.html
index 73ff915..d90b13d 100644
--- a/doc/html/pkcrop_8py_source.html
+++ b/doc/html/pktools_2pkcrop_8py_source.html
@@ -4,7 +4,7 @@
 <meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
 <meta http-equiv="X-UA-Compatible" content="IE=9"/>
 <meta name="generator" content="Doxygen 1.8.6"/>
-<title>pktools: /home/kempenep/pktools/qgis/pkcrop.py Source File</title>
+<title>pktools: /home/kempenep/pktools/qgis/pktools/pkcrop.py Source File</title>
 <link href="tabs.css" rel="stylesheet" type="text/css"/>
 <script type="text/javascript" src="jquery.js"></script>
 <script type="text/javascript" src="dynsections.js"></script>
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.3</span>
+    <span id="projectnumber">2.6.4</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -44,7 +44,7 @@
   </div>
 <div id="nav-path" class="navpath">
   <ul>
-<li class="navelem"><a class="el" href="dir_5785acc8d2e42f8795bdbe936856f26d.html">qgis</a></li>  </ul>
+<li class="navelem"><a class="el" href="dir_5785acc8d2e42f8795bdbe936856f26d.html">qgis</a></li><li class="navelem"><a class="el" href="dir_b7cc22b4453454f1e686d9a2e78d988d.html">pktools</a></li>  </ul>
 </div>
 </div><!-- top -->
 <div class="header">
@@ -89,7 +89,7 @@
 <div class="line"><a name="l00035"></a><span class="lineno">   35</span> <span class="keyword">from</span> processing.core.parameters <span class="keyword">import</span> ParameterBoolean</div>
 <div class="line"><a name="l00036"></a><span class="lineno">   36</span> <span class="keyword">from</span> processing.core.parameters <span class="keyword">import</span> ParameterExtent</div>
 <div class="line"><a name="l00037"></a><span class="lineno">   37</span> </div>
-<div class="line"><a name="l00038"></a><span class="lineno"><a class="line" href="classqgis_1_1pkcrop_1_1pkcrop.html">   38</a></span> <span class="keyword">class </span><a class="code" href="classqgis_1_1pkcrop_1_1pkcrop.html">pkcrop</a>(pktoolsAlgorithm):</div>
+<div class="line"><a name="l00038"></a><span class="lineno"><a class="line" href="classqgis_1_1pktools_1_1pkcrop_1_1pkcrop.html">   38</a></span> <span class="keyword">class </span><a class="code" href="classqgis_1_1pktools_1_1pkcrop_1_1pkcrop.html">pkcrop</a>(pktoolsAlgorithm):</div>
 <div class="line"><a name="l00039"></a><span class="lineno">   39</span> </div>
 <div class="line"><a name="l00040"></a><span class="lineno">   40</span>     INPUT = <span class="stringliteral">"INPUT"</span></div>
 <div class="line"><a name="l00041"></a><span class="lineno">   41</span>     OUTPUT = <span class="stringliteral">"OUTPUT"</span></div>
@@ -108,46 +108,46 @@
 <div class="line"><a name="l00054"></a><span class="lineno">   54</span>         <span class="keywordflow">return</span> <span class="stringliteral">"pkcrop"</span></div>
 <div class="line"><a name="l00055"></a><span class="lineno">   55</span> </div>
 <div class="line"><a name="l00056"></a><span class="lineno">   56</span>     <span class="keyword">def </span>defineCharacteristics(self):</div>
-<div class="line"><a name="l00057"></a><span class="lineno">   57</span>         self.<a class="code" href="classqgis_1_1pkcrop_1_1pkcrop.html#a21c98defb19a723cbdbcae90e5c414b9">name</a> = <span class="stringliteral">"crop raster datasets"</span></div>
-<div class="line"><a name="l00058"></a><span class="lineno">   58</span>         self.<a class="code" href="classqgis_1_1pkcrop_1_1pkcrop.html#a15a208344b67a578ed7592105617762f">group</a> = <span class="stringliteral">"[pktools] raster"</span></div>
-<div class="line"><a name="l00059"></a><span class="lineno">   59</span>         self.addParameter(ParameterMultipleInput(self.<a class="code" href="classqgis_1_1pkcrop_1_1pkcrop.html#a660abf1b5edd9b7c39f49a48748e73b5">INPUT</a>, <span class="stringliteral">'Input layer raster data set'</span>,ParameterMultipleInput.TYPE_RASTER))</div>
-<div class="line"><a name="l00060"></a><span class="lineno">   60</span>         self.addOutput(OutputRaster(self.<a class="code" href="classqgis_1_1pkcrop_1_1pkcrop.html#afab963f14ed687777ea04b6b03a44708">OUTPUT</a>, <span class="stringliteral">"Output raster data set"</span>))</div>
-<div class="line"><a name="l00061"></a><span class="lineno">   61</span>         self.addParameter(ParameterSelection(self.<a class="code" href="classqgis_1_1pkcrop_1_1pkcrop.html#a67d94ff9e997ceda91ff39334e1e668a">RTYPE</a>, <span class="stringliteral">'Output raster type (leave as none to keep original type)'</span>, self.<a class="code" href="classqgis_1_1pkcrop_1_1pkcrop.html#aa901690d584f08efbc4a4225985fde89">TYPE</a>, 0))</div>
-<div class="line"><a name="l00062"></a><span class="lineno">   62</span>         self.addParameter(ParameterNumber(self.<a class="code" href="classqgis_1_1pkcrop_1_1pkcrop.html#aa64c23657fe96444fe2d03717be4b5c5">DX</a>, <span class="stringliteral">"Output resolution in x (leave 0 for no change)"</span>,0.0,<span class="keywordtype">None</span>,0.0))</div>
-<div class="line"><a name="l00063"></a><span class="lineno">   63</span>         self.addParameter(ParameterNumber(self.<a class="code" href="classqgis_1_1pkcrop_1_1pkcrop.html#ac5779beb227252f20da289d505f4deee">DY</a>, <span class="stringliteral">"Output resolution in y (leave 0 for no change)"</span>,0.0,<span class="keywordtype">None</span>,0.0))</div>
-<div class="line"><a name="l00064"></a><span class="lineno">   64</span>         self.addParameter(ParameterExtent(self.<a class="code" href="classqgis_1_1pkcrop_1_1pkcrop.html#a6f6f27285700550bb52391c36d130328">PROJWIN</a>,</div>
+<div class="line"><a name="l00057"></a><span class="lineno">   57</span>         self.<a class="code" href="classqgis_1_1pktools_1_1pkcrop_1_1pkcrop.html#ae937210a61feb138b0abc2cb67d6ad5b">name</a> = <span class="stringliteral">"crop raster datasets"</span></div>
+<div class="line"><a name="l00058"></a><span class="lineno">   58</span>         self.<a class="code" href="classqgis_1_1pktools_1_1pkcrop_1_1pkcrop.html#ae2c4e89f56b83d8cab9b6d99c9645e80">group</a> = <span class="stringliteral">"[pktools] raster"</span></div>
+<div class="line"><a name="l00059"></a><span class="lineno">   59</span>         self.addParameter(ParameterMultipleInput(self.<a class="code" href="classqgis_1_1pktools_1_1pkcrop_1_1pkcrop.html#a7309fd72361327278b1fefabfa7f03ad">INPUT</a>, <span class="stringliteral">'Input layer raster data set'</span>,ParameterMultipleInput.TYPE_RASTER))</div>
+<div class="line"><a name="l00060"></a><span class="lineno">   60</span>         self.addOutput(OutputRaster(self.<a class="code" href="classqgis_1_1pktools_1_1pkcrop_1_1pkcrop.html#ac3c7e447a20304d204e1cb9d956a9eed">OUTPUT</a>, <span class="stringliteral">"Output raster data set"</span>))</div>
+<div class="line"><a name="l00061"></a><span class="lineno">   61</span>         self.addParameter(ParameterSelection(self.<a class="code" href="classqgis_1_1pktools_1_1pkcrop_1_1pkcrop.html#a909bbe623577b51ae6427d73aa703c28">RTYPE</a>, <span class="stringliteral">'Output raster type (leave as none to keep original type)'</span>, self.<a class="code" href="classqgis_1_1pktools_1_1pkcrop_1_1pkcrop.html#a8135eba7dc27f89fef11c8cc226b77ca">TYPE</a>, 0))</div>
+<div class="line"><a name="l00062"></a><span class="lineno">   62</span>         self.addParameter(ParameterNumber(self.<a class="code" href="classqgis_1_1pktools_1_1pkcrop_1_1pkcrop.html#ac728a472b77be42ab2b4de231c21fe79">DX</a>, <span class="stringliteral">"Output resolution in x (leave 0 for no change)"</span>,0.0,<span class="keywordtype">None</span>,0.0))</div>
+<div class="line"><a name="l00063"></a><span class="lineno">   63</span>         self.addParameter(ParameterNumber(self.<a class="code" href="classqgis_1_1pktools_1_1pkcrop_1_1pkcrop.html#a89711319003fc990e2dedb83eb5405a3">DY</a>, <span class="stringliteral">"Output resolution in y (leave 0 for no change)"</span>,0.0,<span class="keywordtype">None</span>,0.0))</div>
+<div class="line"><a name="l00064"></a><span class="lineno">   64</span>         self.addParameter(ParameterExtent(self.<a class="code" href="classqgis_1_1pktools_1_1pkcrop_1_1pkcrop.html#a1beaf0244ed19ce9af19072399c95f47">PROJWIN</a>,</div>
 <div class="line"><a name="l00065"></a><span class="lineno">   65</span>                           <span class="stringliteral">'Georeferenced boundingbox'</span>))</div>
-<div class="line"><a name="l00066"></a><span class="lineno">   66</span>         self.addParameter(ParameterString(self.<a class="code" href="classqgis_1_1pkcrop_1_1pkcrop.html#a9d01bfa7ad85384abf071d59c0f5f69e">NODATA</a>, <span class="stringliteral">"invalid value(s) for input raster dataset (e.g., 0;255)"</span>,<span class="stringliteral">"none"</span>))</div>
-<div class="line"><a name="l00067"></a><span class="lineno">   67</span>         self.addParameter(ParameterString(self.<a class="code" href="classqgis_1_1pkcrop_1_1pkcrop.html#a5993a8cc5d573cf0bc3a0d97a1811cd7">BAND</a>, <span class="stringliteral">"Band(s) in input image to crop, e.g., 0;1;2 (leave empty to retain all bands)"</span>,<span class="stringliteral">''</span>, optional=<span class="keyword">True</span>))</div>
-<div class="line"><a name="l00068"></a><span class="lineno">   68</span>         self.addParameter(ParameterSelection(self.<a class="code" href="classqgis_1_1pkcrop_1_1pkcrop.html#a000a9bda4206edf6ef542590140e43e8">RESAMPLE</a>,<span class="stringliteral">"resampling method"</span>,self.<a class="code" href="classqgis_1_1pkcrop_1_1pkcrop.html#a4ca284fa3cb6e48275aa399f6547d4f2">RESAMPLE_OPTIONS</a>, 0))</div>
-<div class="line"><a name="l00069"></a><span class="lineno">   69</span>         self.addParameter(ParameterString(self.<a class="code" href="classqgis_1_1pkcrop_1_1pkcrop.html#a7c99a0e343473c7cfc94623c115590db">EXTRA</a>,</div>
+<div class="line"><a name="l00066"></a><span class="lineno">   66</span>         self.addParameter(ParameterString(self.<a class="code" href="classqgis_1_1pktools_1_1pkcrop_1_1pkcrop.html#a19fb0d5c68f226f6a9e7a939581b0970">NODATA</a>, <span class="stringliteral">"invalid value(s) for input raster dataset (e.g., 0;255)"</span>,<span class="stringliteral">"none"</span>))</div>
+<div class="line"><a name="l00067"></a><span class="lineno">   67</span>         self.addParameter(ParameterString(self.<a class="code" href="classqgis_1_1pktools_1_1pkcrop_1_1pkcrop.html#a356b1c519f594aa18f0b8f7dbb83abf3">BAND</a>, <span class="stringliteral">"Band(s) in input image to crop, e.g., 0;1;2 (leave empty to retain all bands)"</span>,<span class="stringliteral">''</span>, optional=<span class="keyword">True</span>))</div>
+<div class="line"><a name="l00068"></a><span class="lineno">   68</span>         self.addParameter(ParameterSelection(self.<a class="code" href="classqgis_1_1pktools_1_1pkcrop_1_1pkcrop.html#ab207608ada15c93982967e03b10b7524">RESAMPLE</a>,<span class="stringliteral">"resampling method"</span>,self.<a class="code" href="classqgis_1_1pktools_1_1pkcrop_1_1pkcrop.html#a1b0888761b96112483aecfa774a9b8ab">RESAMPLE_OPTIONS</a>, 0))</div>
+<div class="line"><a name="l00069"></a><span class="lineno">   69</span>         self.addParameter(ParameterString(self.<a class="code" href="classqgis_1_1pktools_1_1pkcrop_1_1pkcrop.html#a3076c24eb1c309b6f5091545d7bd78c9">EXTRA</a>,</div>
 <div class="line"><a name="l00070"></a><span class="lineno">   70</span>                           <span class="stringliteral">'Additional parameters'</span>, <span class="stringliteral">'-of GTiff'</span>, optional=<span class="keyword">True</span>))</div>
 <div class="line"><a name="l00071"></a><span class="lineno">   71</span> </div>
 <div class="line"><a name="l00072"></a><span class="lineno">   72</span>     <span class="keyword">def </span>processAlgorithm(self, progress):</div>
-<div class="line"><a name="l00073"></a><span class="lineno">   73</span>         cliPath = <span class="stringliteral">'"'</span> + os.path.join(pktoolsUtils.pktoolsPath(), self.<a class="code" href="classqgis_1_1pkcrop_1_1pkcrop.html#a0a169418d9b1c0e55c1c09c711b920b1">cliName</a>()) + <span class="stringliteral">'"'</span></div>
+<div class="line"><a name="l00073"></a><span class="lineno">   73</span>         cliPath = <span class="stringliteral">'"'</span> + os.path.join(pktoolsUtils.pktoolsPath(), self.<a class="code" href="classqgis_1_1pktools_1_1pkcrop_1_1pkcrop.html#a6caffb1e09eec28b29ce9996e20b6cf9">cliName</a>()) + <span class="stringliteral">'"'</span></div>
 <div class="line"><a name="l00074"></a><span class="lineno">   74</span>         commands = [cliPath]</div>
 <div class="line"><a name="l00075"></a><span class="lineno">   75</span> </div>
-<div class="line"><a name="l00076"></a><span class="lineno">   76</span>         input=self.getParameterValue(self.<a class="code" href="classqgis_1_1pkcrop_1_1pkcrop.html#a660abf1b5edd9b7c39f49a48748e73b5">INPUT</a>)</div>
+<div class="line"><a name="l00076"></a><span class="lineno">   76</span>         input=self.getParameterValue(self.<a class="code" href="classqgis_1_1pktools_1_1pkcrop_1_1pkcrop.html#a7309fd72361327278b1fefabfa7f03ad">INPUT</a>)</div>
 <div class="line"><a name="l00077"></a><span class="lineno">   77</span>         inputFiles = input.split(<span class="stringliteral">';'</span>)</div>
 <div class="line"><a name="l00078"></a><span class="lineno">   78</span>         <span class="keywordflow">for</span> inputFile <span class="keywordflow">in</span> inputFiles:</div>
 <div class="line"><a name="l00079"></a><span class="lineno">   79</span>             commands.append(<span class="stringliteral">'-i'</span>)</div>
 <div class="line"><a name="l00080"></a><span class="lineno">   80</span>             commands.append(<span class="stringliteral">'"'</span> + inputFile + <span class="stringliteral">'"'</span>)</div>
 <div class="line"><a name="l00081"></a><span class="lineno">   81</span> </div>
-<div class="line"><a name="l00082"></a><span class="lineno">   82</span>         <span class="keywordflow">if</span> self.<a class="code" href="classqgis_1_1pkcrop_1_1pkcrop.html#aa901690d584f08efbc4a4225985fde89">TYPE</a>[self.getParameterValue(self.<a class="code" href="classqgis_1_1pkcrop_1_1pkcrop.html#a67d94ff9e997ceda91ff39334e1e668a">RTYPE</a>)] != <span class="stringliteral">"none"</span>:</div>
+<div class="line"><a name="l00082"></a><span class="lineno">   82</span>         <span class="keywordflow">if</span> self.<a class="code" href="classqgis_1_1pktools_1_1pkcrop_1_1pkcrop.html#a8135eba7dc27f89fef11c8cc226b77ca">TYPE</a>[self.getParameterValue(self.<a class="code" href="classqgis_1_1pktools_1_1pkcrop_1_1pkcrop.html#a909bbe623577b51ae6427d73aa703c28">RTYPE</a>)] != <span class="stringliteral">"none"</span>:</div>
 <div class="line"><a name="l00083"></a><span class="lineno">   83</span>             commands.append(<span class="stringliteral">'-ot'</span>)</div>
-<div class="line"><a name="l00084"></a><span class="lineno">   84</span>             commands.append(self.<a class="code" href="classqgis_1_1pkcrop_1_1pkcrop.html#aa901690d584f08efbc4a4225985fde89">TYPE</a>[self.getParameterValue(self.<a class="code" href="classqgis_1_1pkcrop_1_1pkcrop.html#a67d94ff9e997ceda91ff39334e1e668a">RTYPE</a>)])</div>
-<div class="line"><a name="l00085"></a><span class="lineno">   85</span>         output=self.getOutputValue(self.<a class="code" href="classqgis_1_1pkcrop_1_1pkcrop.html#afab963f14ed687777ea04b6b03a44708">OUTPUT</a>)</div>
+<div class="line"><a name="l00084"></a><span class="lineno">   84</span>             commands.append(self.<a class="code" href="classqgis_1_1pktools_1_1pkcrop_1_1pkcrop.html#a8135eba7dc27f89fef11c8cc226b77ca">TYPE</a>[self.getParameterValue(self.<a class="code" href="classqgis_1_1pktools_1_1pkcrop_1_1pkcrop.html#a909bbe623577b51ae6427d73aa703c28">RTYPE</a>)])</div>
+<div class="line"><a name="l00085"></a><span class="lineno">   85</span>         output=self.getOutputValue(self.<a class="code" href="classqgis_1_1pktools_1_1pkcrop_1_1pkcrop.html#ac3c7e447a20304d204e1cb9d956a9eed">OUTPUT</a>)</div>
 <div class="line"><a name="l00086"></a><span class="lineno">   86</span>         <span class="keywordflow">if</span> output != <span class="stringliteral">""</span>:</div>
 <div class="line"><a name="l00087"></a><span class="lineno">   87</span>             commands.append(<span class="stringliteral">"-o"</span>)</div>
 <div class="line"><a name="l00088"></a><span class="lineno">   88</span>             commands.append(<span class="stringliteral">'"'</span> + output + <span class="stringliteral">'"'</span>)</div>
-<div class="line"><a name="l00089"></a><span class="lineno">   89</span>         <span class="keywordflow">if</span> self.getParameterValue(self.<a class="code" href="classqgis_1_1pkcrop_1_1pkcrop.html#aa64c23657fe96444fe2d03717be4b5c5">DX</a>) != 0:</div>
+<div class="line"><a name="l00089"></a><span class="lineno">   89</span>         <span class="keywordflow">if</span> self.getParameterValue(self.<a class="code" href="classqgis_1_1pktools_1_1pkcrop_1_1pkcrop.html#ac728a472b77be42ab2b4de231c21fe79">DX</a>) != 0:</div>
 <div class="line"><a name="l00090"></a><span class="lineno">   90</span>             commands.append(<span class="stringliteral">"-dx"</span>)</div>
-<div class="line"><a name="l00091"></a><span class="lineno">   91</span>             commands.append(str(self.getParameterValue(self.<a class="code" href="classqgis_1_1pkcrop_1_1pkcrop.html#aa64c23657fe96444fe2d03717be4b5c5">DX</a>)))</div>
-<div class="line"><a name="l00092"></a><span class="lineno">   92</span>         <span class="keywordflow">if</span> self.getParameterValue(self.<a class="code" href="classqgis_1_1pkcrop_1_1pkcrop.html#ac5779beb227252f20da289d505f4deee">DY</a>) != 0:</div>
+<div class="line"><a name="l00091"></a><span class="lineno">   91</span>             commands.append(str(self.getParameterValue(self.<a class="code" href="classqgis_1_1pktools_1_1pkcrop_1_1pkcrop.html#ac728a472b77be42ab2b4de231c21fe79">DX</a>)))</div>
+<div class="line"><a name="l00092"></a><span class="lineno">   92</span>         <span class="keywordflow">if</span> self.getParameterValue(self.<a class="code" href="classqgis_1_1pktools_1_1pkcrop_1_1pkcrop.html#a89711319003fc990e2dedb83eb5405a3">DY</a>) != 0:</div>
 <div class="line"><a name="l00093"></a><span class="lineno">   93</span>             commands.append(<span class="stringliteral">"-dy"</span>)</div>
-<div class="line"><a name="l00094"></a><span class="lineno">   94</span>             commands.append(str(self.getParameterValue(self.<a class="code" href="classqgis_1_1pkcrop_1_1pkcrop.html#ac5779beb227252f20da289d505f4deee">DY</a>)))</div>
+<div class="line"><a name="l00094"></a><span class="lineno">   94</span>             commands.append(str(self.getParameterValue(self.<a class="code" href="classqgis_1_1pktools_1_1pkcrop_1_1pkcrop.html#a89711319003fc990e2dedb83eb5405a3">DY</a>)))</div>
 <div class="line"><a name="l00095"></a><span class="lineno">   95</span> </div>
-<div class="line"><a name="l00096"></a><span class="lineno">   96</span>         projwin = str(self.getParameterValue(self.<a class="code" href="classqgis_1_1pkcrop_1_1pkcrop.html#a6f6f27285700550bb52391c36d130328">PROJWIN</a>))</div>
+<div class="line"><a name="l00096"></a><span class="lineno">   96</span>         projwin = str(self.getParameterValue(self.<a class="code" href="classqgis_1_1pktools_1_1pkcrop_1_1pkcrop.html#a1beaf0244ed19ce9af19072399c95f47">PROJWIN</a>))</div>
 <div class="line"><a name="l00097"></a><span class="lineno">   97</span>         if(str(projwin).find(<span class="stringliteral">','</span>)>0):</div>
 <div class="line"><a name="l00098"></a><span class="lineno">   98</span>            regionCoords = projwin.split(<span class="stringliteral">','</span>)</div>
 <div class="line"><a name="l00099"></a><span class="lineno">   99</span>            commands.append(<span class="stringliteral">'-ulx'</span>)</div>
@@ -159,48 +159,48 @@
 <div class="line"><a name="l00105"></a><span class="lineno">  105</span>            commands.append(<span class="stringliteral">'-lry'</span>)</div>
 <div class="line"><a name="l00106"></a><span class="lineno">  106</span>            commands.append(regionCoords[2])</div>
 <div class="line"><a name="l00107"></a><span class="lineno">  107</span> </div>
-<div class="line"><a name="l00108"></a><span class="lineno">  108</span>         nodata=self.getParameterValue(self.<a class="code" href="classqgis_1_1pkcrop_1_1pkcrop.html#a9d01bfa7ad85384abf071d59c0f5f69e">NODATA</a>)</div>
+<div class="line"><a name="l00108"></a><span class="lineno">  108</span>         nodata=self.getParameterValue(self.<a class="code" href="classqgis_1_1pktools_1_1pkcrop_1_1pkcrop.html#a19fb0d5c68f226f6a9e7a939581b0970">NODATA</a>)</div>
 <div class="line"><a name="l00109"></a><span class="lineno">  109</span>         <span class="keywordflow">if</span> nodata != <span class="stringliteral">"none"</span>:</div>
 <div class="line"><a name="l00110"></a><span class="lineno">  110</span>             nodataValues = nodata.split(<span class="stringliteral">';'</span>)</div>
 <div class="line"><a name="l00111"></a><span class="lineno">  111</span>             <span class="keywordflow">for</span> nodataValue <span class="keywordflow">in</span> nodataValues:</div>
 <div class="line"><a name="l00112"></a><span class="lineno">  112</span>                 commands.append(<span class="stringliteral">'-nodata'</span>)</div>
 <div class="line"><a name="l00113"></a><span class="lineno">  113</span>                 commands.append(nodataValue)</div>
 <div class="line"><a name="l00114"></a><span class="lineno">  114</span>         </div>
-<div class="line"><a name="l00115"></a><span class="lineno">  115</span>         band=self.getParameterValue(self.<a class="code" href="classqgis_1_1pkcrop_1_1pkcrop.html#a5993a8cc5d573cf0bc3a0d97a1811cd7">BAND</a>)</div>
+<div class="line"><a name="l00115"></a><span class="lineno">  115</span>         band=self.getParameterValue(self.<a class="code" href="classqgis_1_1pktools_1_1pkcrop_1_1pkcrop.html#a356b1c519f594aa18f0b8f7dbb83abf3">BAND</a>)</div>
 <div class="line"><a name="l00116"></a><span class="lineno">  116</span>         <span class="keywordflow">if</span> band != <span class="stringliteral">''</span>:</div>
 <div class="line"><a name="l00117"></a><span class="lineno">  117</span>             bandValues = band.split(<span class="stringliteral">';'</span>)</div>
 <div class="line"><a name="l00118"></a><span class="lineno">  118</span>             <span class="keywordflow">for</span> bandValue <span class="keywordflow">in</span> bandValues:</div>
 <div class="line"><a name="l00119"></a><span class="lineno">  119</span>                 commands.append(<span class="stringliteral">'-b'</span>)</div>
 <div class="line"><a name="l00120"></a><span class="lineno">  120</span>                 commands.append(bandValue)</div>
 <div class="line"><a name="l00121"></a><span class="lineno">  121</span>         commands.append(<span class="stringliteral">"-r"</span>)</div>
-<div class="line"><a name="l00122"></a><span class="lineno">  122</span>         commands.append(self.<a class="code" href="classqgis_1_1pkcrop_1_1pkcrop.html#a4ca284fa3cb6e48275aa399f6547d4f2">RESAMPLE_OPTIONS</a>[self.getParameterValue(self.<a class="code" href="classqgis_1_1pkcrop_1_1pkcrop.html#a000a9bda4206edf6ef542590140e43e8">RESAMPLE</a>)])</div>
+<div class="line"><a name="l00122"></a><span class="lineno">  122</span>         commands.append(self.<a class="code" href="classqgis_1_1pktools_1_1pkcrop_1_1pkcrop.html#a1b0888761b96112483aecfa774a9b8ab">RESAMPLE_OPTIONS</a>[self.getParameterValue(self.<a class="code" href="classqgis_1_1pktools_1_1pkcrop_1_1pkcrop.html#ab207608ada15c93982967e03b10b7524">RESAMPLE</a>)])</div>
 <div class="line"><a name="l00123"></a><span class="lineno">  123</span> </div>
-<div class="line"><a name="l00124"></a><span class="lineno">  124</span>         extra = str(self.getParameterValue(self.<a class="code" href="classqgis_1_1pkcrop_1_1pkcrop.html#a7c99a0e343473c7cfc94623c115590db">EXTRA</a>))</div>
+<div class="line"><a name="l00124"></a><span class="lineno">  124</span>         extra = str(self.getParameterValue(self.<a class="code" href="classqgis_1_1pktools_1_1pkcrop_1_1pkcrop.html#a3076c24eb1c309b6f5091545d7bd78c9">EXTRA</a>))</div>
 <div class="line"><a name="l00125"></a><span class="lineno">  125</span>         <span class="keywordflow">if</span> len(extra) > 0:</div>
 <div class="line"><a name="l00126"></a><span class="lineno">  126</span>             commands.append(extra)</div>
 <div class="line"><a name="l00127"></a><span class="lineno">  127</span> </div>
 <div class="line"><a name="l00128"></a><span class="lineno">  128</span>         pktoolsUtils.runpktools(commands, progress)</div>
-<div class="ttc" id="classqgis_1_1pkcrop_1_1pkcrop_html_a6f6f27285700550bb52391c36d130328"><div class="ttname"><a href="classqgis_1_1pkcrop_1_1pkcrop.html#a6f6f27285700550bb52391c36d130328">qgis.pkcrop.pkcrop.PROJWIN</a></div><div class="ttdeci">string PROJWIN</div><div class="ttdef"><b>Definition:</b> <a href="pkcrop_8py_source.html#l00044">pkcrop.py:44</a></div></div>
-<div class="ttc" id="classqgis_1_1pkcrop_1_1pkcrop_html_a000a9bda4206edf6ef542590140e43e8"><div class="ttname"><a href="classqgis_1_1pkcrop_1_1pkcrop.html#a000a9bda4206edf6ef542590140e43e8">qgis.pkcrop.pkcrop.RESAMPLE</a></div><div class="ttdeci">string RESAMPLE</div><div class="ttdef"><b>Definition:</b> <a href="pkcrop_8py_source.html#l00048">pkcrop.py:48</a></div></div>
-<div class="ttc" id="classqgis_1_1pkcrop_1_1pkcrop_html_a15a208344b67a578ed7592105617762f"><div class="ttname"><a href="classqgis_1_1pkcrop_1_1pkcrop.html#a15a208344b67a578ed7592105617762f">qgis.pkcrop.pkcrop.group</a></div><div class="ttdeci">group</div><div class="ttdef"><b>Definition:</b> <a href="pkcrop_8py_source.html#l00058">pkcrop.py:58</a></div></div>
-<div class="ttc" id="classqgis_1_1pkcrop_1_1pkcrop_html_aa901690d584f08efbc4a4225985fde89"><div class="ttname"><a href="classqgis_1_1pkcrop_1_1pkcrop.html#aa901690d584f08efbc4a4225985fde89">qgis.pkcrop.pkcrop.TYPE</a></div><div class="ttdeci">list TYPE</div><div class="ttdef"><b>Definition:</b> <a href="pkcrop_8py_source.html#l00050">pkcrop.py:50</a></div></div>
-<div class="ttc" id="classqgis_1_1pkcrop_1_1pkcrop_html_a4ca284fa3cb6e48275aa399f6547d4f2"><div class="ttname"><a href="classqgis_1_1pkcrop_1_1pkcrop.html#a4ca284fa3cb6e48275aa399f6547d4f2">qgis.pkcrop.pkcrop.RESAMPLE_OPTIONS</a></div><div class="ttdeci">list RESAMPLE_OPTIONS</div><div class="ttdef"><b>Definition:</b> <a href="pkcrop_8py_source.html#l00047">pkcrop.py:47</a></div></div>
-<div class="ttc" id="classqgis_1_1pkcrop_1_1pkcrop_html_afab963f14ed687777ea04b6b03a44708"><div class="ttname"><a href="classqgis_1_1pkcrop_1_1pkcrop.html#afab963f14ed687777ea04b6b03a44708">qgis.pkcrop.pkcrop.OUTPUT</a></div><div class="ttdeci">string OUTPUT</div><div class="ttdef"><b>Definition:</b> <a href="pkcrop_8py_source.html#l00041">pkcrop.py:41</a></div></div>
-<div class="ttc" id="classqgis_1_1pkcrop_1_1pkcrop_html_a660abf1b5edd9b7c39f49a48748e73b5"><div class="ttname"><a href="classqgis_1_1pkcrop_1_1pkcrop.html#a660abf1b5edd9b7c39f49a48748e73b5">qgis.pkcrop.pkcrop.INPUT</a></div><div class="ttdeci">string INPUT</div><div class="ttdef"><b>Definition:</b> <a href="pkcrop_8py_source.html#l00040">pkcrop.py:40</a></div></div>
-<div class="ttc" id="classqgis_1_1pkcrop_1_1pkcrop_html_ac5779beb227252f20da289d505f4deee"><div class="ttname"><a href="classqgis_1_1pkcrop_1_1pkcrop.html#ac5779beb227252f20da289d505f4deee">qgis.pkcrop.pkcrop.DY</a></div><div class="ttdeci">string DY</div><div class="ttdef"><b>Definition:</b> <a href="pkcrop_8py_source.html#l00043">pkcrop.py:43</a></div></div>
-<div class="ttc" id="classqgis_1_1pkcrop_1_1pkcrop_html_a21c98defb19a723cbdbcae90e5c414b9"><div class="ttname"><a href="classqgis_1_1pkcrop_1_1pkcrop.html#a21c98defb19a723cbdbcae90e5c414b9">qgis.pkcrop.pkcrop.name</a></div><div class="ttdeci">name</div><div class="ttdef"><b>Definition:</b> <a href="pkcrop_8py_source.html#l00057">pkcrop.py:57</a></div></div>
-<div class="ttc" id="classqgis_1_1pkcrop_1_1pkcrop_html"><div class="ttname"><a href="classqgis_1_1pkcrop_1_1pkcrop.html">qgis.pkcrop.pkcrop</a></div><div class="ttdef"><b>Definition:</b> <a href="pkcrop_8py_source.html#l00038">pkcrop.py:38</a></div></div>
-<div class="ttc" id="classqgis_1_1pkcrop_1_1pkcrop_html_aa64c23657fe96444fe2d03717be4b5c5"><div class="ttname"><a href="classqgis_1_1pkcrop_1_1pkcrop.html#aa64c23657fe96444fe2d03717be4b5c5">qgis.pkcrop.pkcrop.DX</a></div><div class="ttdeci">string DX</div><div class="ttdef"><b>Definition:</b> <a href="pkcrop_8py_source.html#l00042">pkcrop.py:42</a></div></div>
-<div class="ttc" id="classqgis_1_1pkcrop_1_1pkcrop_html_a7c99a0e343473c7cfc94623c115590db"><div class="ttname"><a href="classqgis_1_1pkcrop_1_1pkcrop.html#a7c99a0e343473c7cfc94623c115590db">qgis.pkcrop.pkcrop.EXTRA</a></div><div class="ttdeci">string EXTRA</div><div class="ttdef"><b>Definition:</b> <a href="pkcrop_8py_source.html#l00051">pkcrop.py:51</a></div></div>
-<div class="ttc" id="classqgis_1_1pkcrop_1_1pkcrop_html_a67d94ff9e997ceda91ff39334e1e668a"><div class="ttname"><a href="classqgis_1_1pkcrop_1_1pkcrop.html#a67d94ff9e997ceda91ff39334e1e668a">qgis.pkcrop.pkcrop.RTYPE</a></div><div class="ttdeci">string RTYPE</div><div class="ttdef"><b>Definition:</b> <a href="pkcrop_8py_source.html#l00049">pkcrop.py:49</a></div></div>
-<div class="ttc" id="classqgis_1_1pkcrop_1_1pkcrop_html_a9d01bfa7ad85384abf071d59c0f5f69e"><div class="ttname"><a href="classqgis_1_1pkcrop_1_1pkcrop.html#a9d01bfa7ad85384abf071d59c0f5f69e">qgis.pkcrop.pkcrop.NODATA</a></div><div class="ttdeci">string NODATA</div><div class="ttdef"><b>Definition:</b> <a href="pkcrop_8py_source.html#l00046">pkcrop.py:46</a></div></div>
-<div class="ttc" id="classqgis_1_1pkcrop_1_1pkcrop_html_a0a169418d9b1c0e55c1c09c711b920b1"><div class="ttname"><a href="classqgis_1_1pkcrop_1_1pkcrop.html#a0a169418d9b1c0e55c1c09c711b920b1">qgis.pkcrop.pkcrop.cliName</a></div><div class="ttdeci">def cliName</div><div class="ttdef"><b>Definition:</b> <a href="pkcrop_8py_source.html#l00053">pkcrop.py:53</a></div></div>
-<div class="ttc" id="classqgis_1_1pkcrop_1_1pkcrop_html_a5993a8cc5d573cf0bc3a0d97a1811cd7"><div class="ttname"><a href="classqgis_1_1pkcrop_1_1pkcrop.html#a5993a8cc5d573cf0bc3a0d97a1811cd7">qgis.pkcrop.pkcrop.BAND</a></div><div class="ttdeci">string BAND</div><div class="ttdef"><b>Definition:</b> <a href="pkcrop_8py_source.html#l00045">pkcrop.py:45</a></div></div>
+<div class="ttc" id="classqgis_1_1pktools_1_1pkcrop_1_1pkcrop_html_a8135eba7dc27f89fef11c8cc226b77ca"><div class="ttname"><a href="classqgis_1_1pktools_1_1pkcrop_1_1pkcrop.html#a8135eba7dc27f89fef11c8cc226b77ca">qgis.pktools.pkcrop.pkcrop.TYPE</a></div><div class="ttdeci">list TYPE</div><div class="ttdef"><b>Definition:</b> <a href="pktools_2pkcrop_8py_source.html#l00050">pkcrop.py:50</a></div></div>
+<div class="ttc" id="classqgis_1_1pktools_1_1pkcrop_1_1pkcrop_html_a1b0888761b96112483aecfa774a9b8ab"><div class="ttname"><a href="classqgis_1_1pktools_1_1pkcrop_1_1pkcrop.html#a1b0888761b96112483aecfa774a9b8ab">qgis.pktools.pkcrop.pkcrop.RESAMPLE_OPTIONS</a></div><div class="ttdeci">list RESAMPLE_OPTIONS</div><div class="ttdef"><b>Definition:</b> <a href="pktools_2pkcrop_8py_source.html#l00047">pkcrop.py:47</a></div></div>
+<div class="ttc" id="classqgis_1_1pktools_1_1pkcrop_1_1pkcrop_html_a19fb0d5c68f226f6a9e7a939581b0970"><div class="ttname"><a href="classqgis_1_1pktools_1_1pkcrop_1_1pkcrop.html#a19fb0d5c68f226f6a9e7a939581b0970">qgis.pktools.pkcrop.pkcrop.NODATA</a></div><div class="ttdeci">string NODATA</div><div class="ttdef"><b>Definition:</b> <a href="pktools_2pkcrop_8py_source.html#l00046">pkcrop.py:46</a></div></div>
+<div class="ttc" id="classqgis_1_1pktools_1_1pkcrop_1_1pkcrop_html_a6caffb1e09eec28b29ce9996e20b6cf9"><div class="ttname"><a href="classqgis_1_1pktools_1_1pkcrop_1_1pkcrop.html#a6caffb1e09eec28b29ce9996e20b6cf9">qgis.pktools.pkcrop.pkcrop.cliName</a></div><div class="ttdeci">def cliName</div><div class="ttdef"><b>Definition:</b> <a href="pktools_2pkcrop_8py_source.html#l00053">pkcrop.py:53</a></div></div>
+<div class="ttc" id="classqgis_1_1pktools_1_1pkcrop_1_1pkcrop_html_ac728a472b77be42ab2b4de231c21fe79"><div class="ttname"><a href="classqgis_1_1pktools_1_1pkcrop_1_1pkcrop.html#ac728a472b77be42ab2b4de231c21fe79">qgis.pktools.pkcrop.pkcrop.DX</a></div><div class="ttdeci">string DX</div><div class="ttdef"><b>Definition:</b> <a href="pktools_2pkcrop_8py_source.html#l00042">pkcrop.py:42</a></div></div>
+<div class="ttc" id="classqgis_1_1pktools_1_1pkcrop_1_1pkcrop_html_a1beaf0244ed19ce9af19072399c95f47"><div class="ttname"><a href="classqgis_1_1pktools_1_1pkcrop_1_1pkcrop.html#a1beaf0244ed19ce9af19072399c95f47">qgis.pktools.pkcrop.pkcrop.PROJWIN</a></div><div class="ttdeci">string PROJWIN</div><div class="ttdef"><b>Definition:</b> <a href="pktools_2pkcrop_8py_source.html#l00044">pkcrop.py:44</a></div></div>
+<div class="ttc" id="classqgis_1_1pktools_1_1pkcrop_1_1pkcrop_html_ae2c4e89f56b83d8cab9b6d99c9645e80"><div class="ttname"><a href="classqgis_1_1pktools_1_1pkcrop_1_1pkcrop.html#ae2c4e89f56b83d8cab9b6d99c9645e80">qgis.pktools.pkcrop.pkcrop.group</a></div><div class="ttdeci">group</div><div class="ttdef"><b>Definition:</b> <a href="pktools_2pkcrop_8py_source.html#l00058">pkcrop.py:58</a></div></div>
+<div class="ttc" id="classqgis_1_1pktools_1_1pkcrop_1_1pkcrop_html_a356b1c519f594aa18f0b8f7dbb83abf3"><div class="ttname"><a href="classqgis_1_1pktools_1_1pkcrop_1_1pkcrop.html#a356b1c519f594aa18f0b8f7dbb83abf3">qgis.pktools.pkcrop.pkcrop.BAND</a></div><div class="ttdeci">string BAND</div><div class="ttdef"><b>Definition:</b> <a href="pktools_2pkcrop_8py_source.html#l00045">pkcrop.py:45</a></div></div>
+<div class="ttc" id="classqgis_1_1pktools_1_1pkcrop_1_1pkcrop_html_ac3c7e447a20304d204e1cb9d956a9eed"><div class="ttname"><a href="classqgis_1_1pktools_1_1pkcrop_1_1pkcrop.html#ac3c7e447a20304d204e1cb9d956a9eed">qgis.pktools.pkcrop.pkcrop.OUTPUT</a></div><div class="ttdeci">string OUTPUT</div><div class="ttdef"><b>Definition:</b> <a href="pktools_2pkcrop_8py_source.html#l00041">pkcrop.py:41</a></div></div>
+<div class="ttc" id="classqgis_1_1pktools_1_1pkcrop_1_1pkcrop_html"><div class="ttname"><a href="classqgis_1_1pktools_1_1pkcrop_1_1pkcrop.html">qgis.pktools.pkcrop.pkcrop</a></div><div class="ttdef"><b>Definition:</b> <a href="pktools_2pkcrop_8py_source.html#l00038">pkcrop.py:38</a></div></div>
+<div class="ttc" id="classqgis_1_1pktools_1_1pkcrop_1_1pkcrop_html_ae937210a61feb138b0abc2cb67d6ad5b"><div class="ttname"><a href="classqgis_1_1pktools_1_1pkcrop_1_1pkcrop.html#ae937210a61feb138b0abc2cb67d6ad5b">qgis.pktools.pkcrop.pkcrop.name</a></div><div class="ttdeci">name</div><div class="ttdef"><b>Definition:</b> <a href="pktools_2pkcrop_8py_source.html#l00057">pkcrop.py:57</a></div></div>
+<div class="ttc" id="classqgis_1_1pktools_1_1pkcrop_1_1pkcrop_html_a7309fd72361327278b1fefabfa7f03ad"><div class="ttname"><a href="classqgis_1_1pktools_1_1pkcrop_1_1pkcrop.html#a7309fd72361327278b1fefabfa7f03ad">qgis.pktools.pkcrop.pkcrop.INPUT</a></div><div class="ttdeci">string INPUT</div><div class="ttdef"><b>Definition:</b> <a href="pktools_2pkcrop_8py_source.html#l00040">pkcrop.py:40</a></div></div>
+<div class="ttc" id="classqgis_1_1pktools_1_1pkcrop_1_1pkcrop_html_a909bbe623577b51ae6427d73aa703c28"><div class="ttname"><a href="classqgis_1_1pktools_1_1pkcrop_1_1pkcrop.html#a909bbe623577b51ae6427d73aa703c28">qgis.pktools.pkcrop.pkcrop.RTYPE</a></div><div class="ttdeci">string RTYPE</div><div class="ttdef"><b>Definition:</b> <a href="pktools_2pkcrop_8py_source.html#l00049">pkcrop.py:49</a></div></div>
+<div class="ttc" id="classqgis_1_1pktools_1_1pkcrop_1_1pkcrop_html_a3076c24eb1c309b6f5091545d7bd78c9"><div class="ttname"><a href="classqgis_1_1pktools_1_1pkcrop_1_1pkcrop.html#a3076c24eb1c309b6f5091545d7bd78c9">qgis.pktools.pkcrop.pkcrop.EXTRA</a></div><div class="ttdeci">string EXTRA</div><div class="ttdef"><b>Definition:</b> <a href="pktools_2pkcrop_8py_source.html#l00051">pkcrop.py:51</a></div></div>
+<div class="ttc" id="classqgis_1_1pktools_1_1pkcrop_1_1pkcrop_html_ab207608ada15c93982967e03b10b7524"><div class="ttname"><a href="classqgis_1_1pktools_1_1pkcrop_1_1pkcrop.html#ab207608ada15c93982967e03b10b7524">qgis.pktools.pkcrop.pkcrop.RESAMPLE</a></div><div class="ttdeci">string RESAMPLE</div><div class="ttdef"><b>Definition:</b> <a href="pktools_2pkcrop_8py_source.html#l00048">pkcrop.py:48</a></div></div>
+<div class="ttc" id="classqgis_1_1pktools_1_1pkcrop_1_1pkcrop_html_a89711319003fc990e2dedb83eb5405a3"><div class="ttname"><a href="classqgis_1_1pktools_1_1pkcrop_1_1pkcrop.html#a89711319003fc990e2dedb83eb5405a3">qgis.pktools.pkcrop.pkcrop.DY</a></div><div class="ttdeci">string DY</div><div class="ttdef"><b>Definition:</b> <a href="pktools_2pkcrop_8py_source.html#l00043">pkcrop.py:43</a></div></div>
 </div><!-- fragment --></div><!-- contents -->
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Jun 23 2015 17:09:36 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Tue Nov 3 2015 15:58:26 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/pkdiff__accuracy_8py_source.html b/doc/html/pktools_2pkdiff__accuracy_8py_source.html
similarity index 69%
copy from doc/html/pkdiff__accuracy_8py_source.html
copy to doc/html/pktools_2pkdiff__accuracy_8py_source.html
index 3c06236..aa12708 100644
--- a/doc/html/pkdiff__accuracy_8py_source.html
+++ b/doc/html/pktools_2pkdiff__accuracy_8py_source.html
@@ -4,7 +4,7 @@
 <meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
 <meta http-equiv="X-UA-Compatible" content="IE=9"/>
 <meta name="generator" content="Doxygen 1.8.6"/>
-<title>pktools: /home/kempenep/pktools/qgis/pkdiff_accuracy.py Source File</title>
+<title>pktools: /home/kempenep/pktools/qgis/pktools/pkdiff_accuracy.py Source File</title>
 <link href="tabs.css" rel="stylesheet" type="text/css"/>
 <script type="text/javascript" src="jquery.js"></script>
 <script type="text/javascript" src="dynsections.js"></script>
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.3</span>
+    <span id="projectnumber">2.6.4</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -44,7 +44,7 @@
   </div>
 <div id="nav-path" class="navpath">
   <ul>
-<li class="navelem"><a class="el" href="dir_5785acc8d2e42f8795bdbe936856f26d.html">qgis</a></li>  </ul>
+<li class="navelem"><a class="el" href="dir_5785acc8d2e42f8795bdbe936856f26d.html">qgis</a></li><li class="navelem"><a class="el" href="dir_b7cc22b4453454f1e686d9a2e78d988d.html">pktools</a></li>  </ul>
 </div>
 </div><!-- top -->
 <div class="header">
@@ -144,7 +144,7 @@
 <div class="line"><a name="l00090"></a><span class="lineno">   90</span>     <span class="stringliteral">'.pdf'</span>,</div>
 <div class="line"><a name="l00091"></a><span class="lineno">   91</span> ]</div>
 <div class="line"><a name="l00092"></a><span class="lineno">   92</span> </div>
-<div class="line"><a name="l00093"></a><span class="lineno"><a class="line" href="classqgis_1_1pkdiff__accuracy_1_1pkdiff__accuracy.html">   93</a></span> <span class="keyword">class </span><a class="code" href="classqgis_1_1pkdiff__accuracy_1_1pkdiff__accuracy.html">pkdiff_accuracy</a>(pktoolsAlgorithm):</div>
+<div class="line"><a name="l00093"></a><span class="lineno"><a class="line" href="classqgis_1_1pktools_1_1pkdiff__accuracy_1_1pkdiff__accuracy.html">   93</a></span> <span class="keyword">class </span><a class="code" href="classqgis_1_1pktools_1_1pkdiff__accuracy_1_1pkdiff__accuracy.html">pkdiff_accuracy</a>(pktoolsAlgorithm):</div>
 <div class="line"><a name="l00094"></a><span class="lineno">   94</span> </div>
 <div class="line"><a name="l00095"></a><span class="lineno">   95</span>     INPUT = <span class="stringliteral">"INPUT"</span></div>
 <div class="line"><a name="l00096"></a><span class="lineno">   96</span>     REFERENCE = <span class="stringliteral">"REFERENCE"</span></div>
@@ -165,35 +165,35 @@
 <div class="line"><a name="l00111"></a><span class="lineno">  111</span>         <span class="keywordflow">return</span> <span class="stringliteral">"pkdiff"</span></div>
 <div class="line"><a name="l00112"></a><span class="lineno">  112</span> </div>
 <div class="line"><a name="l00113"></a><span class="lineno">  113</span>     <span class="keyword">def </span>defineCharacteristics(self):</div>
-<div class="line"><a name="l00114"></a><span class="lineno">  114</span>         self.<a class="code" href="classqgis_1_1pkdiff__accuracy_1_1pkdiff__accuracy.html#aa1a0571329dbfd38e21385392bab8de1">name</a> = <span class="stringliteral">"Accuracy assessment with ground reference"</span></div>
-<div class="line"><a name="l00115"></a><span class="lineno">  115</span>         self.<a class="code" href="classqgis_1_1pkdiff__accuracy_1_1pkdiff__accuracy.html#a724b6dc67c93a4392de92dcfca91f701">group</a> = <span class="stringliteral">"[pktools] supervised classification"</span></div>
-<div class="line"><a name="l00116"></a><span class="lineno">  116</span>         self.addParameter(ParameterRaster(self.<a class="code" href="classqgis_1_1pkdiff__accuracy_1_1pkdiff__accuracy.html#a6cabc221036f66d975847866eaf14dd9">INPUT</a>, <span class="stringliteral">'Classification result (raster map)'</span>))</div>
-<div class="line"><a name="l00117"></a><span class="lineno">  117</span>         self.addParameter(ParameterVector(self.<a class="code" href="classqgis_1_1pkdiff__accuracy_1_1pkdiff__accuracy.html#afdaa56e3a00e8ad32fffd8600b998b92">REFERENCE</a>, <span class="stringliteral">'Labeled reference vector data set'</span>))</div>
-<div class="line"><a name="l00118"></a><span class="lineno">  118</span>         self.addParameter(ParameterBoolean(self.<a class="code" href="classqgis_1_1pkdiff__accuracy_1_1pkdiff__accuracy.html#a2a294e32e185d1f58bbde4ae40f62c55">ITERATE</a>, <span class="stringliteral">"Iterate over all layers"</span>,<span class="keyword">True</span>))</div>
-<div class="line"><a name="l00119"></a><span class="lineno">  119</span>         self.addParameter(ParameterString(self.<a class="code" href="classqgis_1_1pkdiff__accuracy_1_1pkdiff__accuracy.html#a99f5e02f16130f80143086252a38ee93">LABELREF</a>, <span class="stringliteral">"Attribute name of the reference label"</span>,<span class="stringliteral">"label"</span>))</div>
-<div class="line"><a name="l00120"></a><span class="lineno">  120</span>         self.addParameter(ParameterString(self.<a class="code" href="classqgis_1_1pkdiff__accuracy_1_1pkdiff__accuracy.html#a02de7992fb58aea0f628f8f3c1c937ac">NODATA</a>, <span class="stringliteral">"No data value(s) in input or reference dataset to ignore (e.g., 0;255)"</span>,<span class="stringliteral">"0"</span>))</div>
-<div class="line"><a name="l00121"></a><span class="lineno">  121</span>         self.addOutput(OutputFile(self.<a class="code" href="classqgis_1_1pkdiff__accuracy_1_1pkdiff__accuracy.html#a792f4cf29ee2f6034149c0233b32f4ff">CMOUTPUT</a>, self.tr(<span class="stringliteral">"Confusion matrix output file "</span>)))</div>
-<div class="line"><a name="l00122"></a><span class="lineno">  122</span>         self.addParameter(ParameterSelection(self.<a class="code" href="classqgis_1_1pkdiff__accuracy_1_1pkdiff__accuracy.html#a21c954c78e110bb1c93de64075afe182">CMFORMAT</a>,<span class="stringliteral">"Format for confusion matrix output"</span>,self.<a class="code" href="classqgis_1_1pkdiff__accuracy_1_1pkdiff__accuracy.html#a2ed757ec7259c4b56bee1acc8bbe1a61">CMFORMAT_OPTIONS</a>, 0))</div>
+<div class="line"><a name="l00114"></a><span class="lineno">  114</span>         self.<a class="code" href="classqgis_1_1pktools_1_1pkdiff__accuracy_1_1pkdiff__accuracy.html#adde47dc64982051137c51b2b9c45d686">name</a> = <span class="stringliteral">"Accuracy assessment with ground reference"</span></div>
+<div class="line"><a name="l00115"></a><span class="lineno">  115</span>         self.<a class="code" href="classqgis_1_1pktools_1_1pkdiff__accuracy_1_1pkdiff__accuracy.html#a25a018181afee40dea3e4d5275747bb7">group</a> = <span class="stringliteral">"[pktools] supervised classification"</span></div>
+<div class="line"><a name="l00116"></a><span class="lineno">  116</span>         self.addParameter(ParameterRaster(self.<a class="code" href="classqgis_1_1pktools_1_1pkdiff__accuracy_1_1pkdiff__accuracy.html#ab4e343f53122cd27e365391daa149b8e">INPUT</a>, <span class="stringliteral">'Classification result (raster map)'</span>))</div>
+<div class="line"><a name="l00117"></a><span class="lineno">  117</span>         self.addParameter(ParameterVector(self.<a class="code" href="classqgis_1_1pktools_1_1pkdiff__accuracy_1_1pkdiff__accuracy.html#ab721f3d9ae2c876ef39abc3b07a12530">REFERENCE</a>, <span class="stringliteral">'Labeled reference vector data set'</span>))</div>
+<div class="line"><a name="l00118"></a><span class="lineno">  118</span>         self.addParameter(ParameterBoolean(self.<a class="code" href="classqgis_1_1pktools_1_1pkdiff__accuracy_1_1pkdiff__accuracy.html#a04cec215fc970c27c9cbbe0ddcd7a2b5">ITERATE</a>, <span class="stringliteral">"Iterate over all layers"</span>,<span class="keyword">True</span>))</div>
+<div class="line"><a name="l00119"></a><span class="lineno">  119</span>         self.addParameter(ParameterString(self.<a class="code" href="classqgis_1_1pktools_1_1pkdiff__accuracy_1_1pkdiff__accuracy.html#a392cc9957b286d74ad2515c0dba4a695">LABELREF</a>, <span class="stringliteral">"Attribute name of the reference label"</span>,<span class="stringliteral">"label"</span>))</div>
+<div class="line"><a name="l00120"></a><span class="lineno">  120</span>         self.addParameter(ParameterString(self.<a class="code" href="classqgis_1_1pktools_1_1pkdiff__accuracy_1_1pkdiff__accuracy.html#ae62e0e32e5c75f22f5a8ef0f521f5cce">NODATA</a>, <span class="stringliteral">"No data value(s) in input or reference dataset to ignore (e.g., 0;255)"</span>,<span class="stringliteral">"0"</span>))</div>
+<div class="line"><a name="l00121"></a><span class="lineno">  121</span>         self.addOutput(OutputFile(self.<a class="code" href="classqgis_1_1pktools_1_1pkdiff__accuracy_1_1pkdiff__accuracy.html#a53f02145c4734a0655c70a3d7b4950f6">CMOUTPUT</a>, self.tr(<span class="stringliteral">"Confusion matrix output file "</span>)))</div>
+<div class="line"><a name="l00122"></a><span class="lineno">  122</span>         self.addParameter(ParameterSelection(self.<a class="code" href="classqgis_1_1pktools_1_1pkdiff__accuracy_1_1pkdiff__accuracy.html#a4b776ec91fa5d020d7680eca874427e2">CMFORMAT</a>,<span class="stringliteral">"Format for confusion matrix output"</span>,self.<a class="code" href="classqgis_1_1pktools_1_1pkdiff__accuracy_1_1pkdiff__accuracy.html#ad1221f675d9b9d779d83abbf9b437146">CMFORMAT_OPTIONS</ [...]
 <div class="line"><a name="l00123"></a><span class="lineno">  123</span> </div>
 <div class="line"><a name="l00124"></a><span class="lineno">  124</span> <span class="comment">#        self.addOutput(OutputTable(self.TABLE, self.tr('Confusion matrix table')))</span></div>
-<div class="line"><a name="l00125"></a><span class="lineno">  125</span>         self.addOutput(OutputVector(self.<a class="code" href="classqgis_1_1pkdiff__accuracy_1_1pkdiff__accuracy.html#a22d37343b09f74019a836f1489d24c02">OUTPUT</a>, <span class="stringliteral">'Assessment output vector data set'</span>))</div>
-<div class="line"><a name="l00126"></a><span class="lineno">  126</span>         self.addParameter(ParameterSelection(self.<a class="code" href="classqgis_1_1pkdiff__accuracy_1_1pkdiff__accuracy.html#ab922ac43189488cb53e46bccd0d02b6a">FORMAT</a>,</div>
+<div class="line"><a name="l00125"></a><span class="lineno">  125</span>         self.addOutput(OutputVector(self.<a class="code" href="classqgis_1_1pktools_1_1pkdiff__accuracy_1_1pkdiff__accuracy.html#ae64041efab08dd8fa6c19b625e168761">OUTPUT</a>, <span class="stringliteral">'Assessment output vector data set'</span>))</div>
+<div class="line"><a name="l00126"></a><span class="lineno">  126</span>         self.addParameter(ParameterSelection(self.<a class="code" href="classqgis_1_1pktools_1_1pkdiff__accuracy_1_1pkdiff__accuracy.html#a1fbcff81b3676249f0408de6319950d9">FORMAT</a>,</div>
 <div class="line"><a name="l00127"></a><span class="lineno">  127</span>                           <span class="stringliteral">'Assessment output vector Format'</span>, FORMATS))</div>
-<div class="line"><a name="l00128"></a><span class="lineno">  128</span>         self.addParameter(ParameterString(self.<a class="code" href="classqgis_1_1pkdiff__accuracy_1_1pkdiff__accuracy.html#a7580c2442f384fcc956e14d936a3a305">LABELCLASS</a>, <span class="stringliteral">"Attribute name of classified (map) label"</span>,<span class="stringliteral">"class"</span>))</div>
-<div class="line"><a name="l00129"></a><span class="lineno">  129</span>         self.addParameter(ParameterString(self.<a class="code" href="classqgis_1_1pkdiff__accuracy_1_1pkdiff__accuracy.html#a83684b7d1751c3e507df1b2a61c06e7d">EXTRA</a>,</div>
+<div class="line"><a name="l00128"></a><span class="lineno">  128</span>         self.addParameter(ParameterString(self.<a class="code" href="classqgis_1_1pktools_1_1pkdiff__accuracy_1_1pkdiff__accuracy.html#a2d4f21a8f0057584931a3a696a5d1b75">LABELCLASS</a>, <span class="stringliteral">"Attribute name of classified (map) label"</span>,<span class="stringliteral">"class"</span>))</div>
+<div class="line"><a name="l00129"></a><span class="lineno">  129</span>         self.addParameter(ParameterString(self.<a class="code" href="classqgis_1_1pktools_1_1pkdiff__accuracy_1_1pkdiff__accuracy.html#a5779733ceff946ac04ec1f6d0e494452">EXTRA</a>,</div>
 <div class="line"><a name="l00130"></a><span class="lineno">  130</span>                           <span class="stringliteral">'Additional parameters'</span>, <span class="stringliteral">''</span>, optional=<span class="keyword">True</span>))</div>
 <div class="line"><a name="l00131"></a><span class="lineno">  131</span> </div>
 <div class="line"><a name="l00132"></a><span class="lineno">  132</span>     <span class="keyword">def </span>processAlgorithm(self, progress):</div>
-<div class="line"><a name="l00133"></a><span class="lineno">  133</span>         cliPath = <span class="stringliteral">'"'</span> + os.path.join(pktoolsUtils.pktoolsPath(), self.<a class="code" href="classqgis_1_1pkdiff__accuracy_1_1pkdiff__accuracy.html#a176e2f67f3be853c9197d99f4cd16a1c">cliName</a>()) + <span class="stringliteral">'"'</span></div>
+<div class="line"><a name="l00133"></a><span class="lineno">  133</span>         cliPath = <span class="stringliteral">'"'</span> + os.path.join(pktoolsUtils.pktoolsPath(), self.<a class="code" href="classqgis_1_1pktools_1_1pkdiff__accuracy_1_1pkdiff__accuracy.html#a55056565ea9f8f166997ca32bcf92d68">cliName</a>()) + <span class="stringliteral">'"'</span></div>
 <div class="line"><a name="l00134"></a><span class="lineno">  134</span>         commands = [cliPath]</div>
 <div class="line"><a name="l00135"></a><span class="lineno">  135</span>         <span class="comment">#outputtable = self.getOutputFromName(self.TABLE)</span></div>
 <div class="line"><a name="l00136"></a><span class="lineno">  136</span> </div>
-<div class="line"><a name="l00137"></a><span class="lineno">  137</span>         input=self.getParameterValue(self.<a class="code" href="classqgis_1_1pkdiff__accuracy_1_1pkdiff__accuracy.html#a6cabc221036f66d975847866eaf14dd9">INPUT</a>)</div>
+<div class="line"><a name="l00137"></a><span class="lineno">  137</span>         input=self.getParameterValue(self.<a class="code" href="classqgis_1_1pktools_1_1pkdiff__accuracy_1_1pkdiff__accuracy.html#ab4e343f53122cd27e365391daa149b8e">INPUT</a>)</div>
 <div class="line"><a name="l00138"></a><span class="lineno">  138</span>         commands.append(<span class="stringliteral">'-i'</span>)</div>
 <div class="line"><a name="l00139"></a><span class="lineno">  139</span>         commands.append(<span class="stringliteral">'"'</span> + input + <span class="stringliteral">'"'</span>)</div>
 <div class="line"><a name="l00140"></a><span class="lineno">  140</span> </div>
-<div class="line"><a name="l00141"></a><span class="lineno">  141</span>         reference=self.getParameterValue(self.<a class="code" href="classqgis_1_1pkdiff__accuracy_1_1pkdiff__accuracy.html#afdaa56e3a00e8ad32fffd8600b998b92">REFERENCE</a>)</div>
-<div class="line"><a name="l00142"></a><span class="lineno">  142</span>         <span class="keywordflow">if</span> self.getParameterValue(self.<a class="code" href="classqgis_1_1pkdiff__accuracy_1_1pkdiff__accuracy.html#a2a294e32e185d1f58bbde4ae40f62c55">ITERATE</a>):</div>
+<div class="line"><a name="l00141"></a><span class="lineno">  141</span>         reference=self.getParameterValue(self.<a class="code" href="classqgis_1_1pktools_1_1pkdiff__accuracy_1_1pkdiff__accuracy.html#ab721f3d9ae2c876ef39abc3b07a12530">REFERENCE</a>)</div>
+<div class="line"><a name="l00142"></a><span class="lineno">  142</span>         <span class="keywordflow">if</span> self.getParameterValue(self.<a class="code" href="classqgis_1_1pktools_1_1pkdiff__accuracy_1_1pkdiff__accuracy.html#a04cec215fc970c27c9cbbe0ddcd7a2b5">ITERATE</a>):</div>
 <div class="line"><a name="l00143"></a><span class="lineno">  143</span>             <span class="keywordflow">if</span> str(reference).find(<span class="stringliteral">'|'</span>)>0:</div>
 <div class="line"><a name="l00144"></a><span class="lineno">  144</span>                 referencename=str(reference)[:str(reference).find(<span class="stringliteral">'|'</span>)]</div>
 <div class="line"><a name="l00145"></a><span class="lineno">  145</span>             <span class="keywordflow">else</span>:</div>
@@ -204,9 +204,9 @@
 <div class="line"><a name="l00150"></a><span class="lineno">  150</span>         commands.append(referencename)</div>
 <div class="line"><a name="l00151"></a><span class="lineno">  151</span> </div>
 <div class="line"><a name="l00152"></a><span class="lineno">  152</span>         commands.append(<span class="stringliteral">'-lr'</span>);</div>
-<div class="line"><a name="l00153"></a><span class="lineno">  153</span>         commands.append(self.getParameterValue(self.<a class="code" href="classqgis_1_1pkdiff__accuracy_1_1pkdiff__accuracy.html#a99f5e02f16130f80143086252a38ee93">LABELREF</a>))</div>
+<div class="line"><a name="l00153"></a><span class="lineno">  153</span>         commands.append(self.getParameterValue(self.<a class="code" href="classqgis_1_1pktools_1_1pkdiff__accuracy_1_1pkdiff__accuracy.html#a392cc9957b286d74ad2515c0dba4a695">LABELREF</a>))</div>
 <div class="line"><a name="l00154"></a><span class="lineno">  154</span> </div>
-<div class="line"><a name="l00155"></a><span class="lineno">  155</span>         nodata=self.getParameterValue(self.<a class="code" href="classqgis_1_1pkdiff__accuracy_1_1pkdiff__accuracy.html#a02de7992fb58aea0f628f8f3c1c937ac">NODATA</a>)</div>
+<div class="line"><a name="l00155"></a><span class="lineno">  155</span>         nodata=self.getParameterValue(self.<a class="code" href="classqgis_1_1pktools_1_1pkdiff__accuracy_1_1pkdiff__accuracy.html#ae62e0e32e5c75f22f5a8ef0f521f5cce">NODATA</a>)</div>
 <div class="line"><a name="l00156"></a><span class="lineno">  156</span>         <span class="keywordflow">if</span> nodata != <span class="stringliteral">"none"</span>:</div>
 <div class="line"><a name="l00157"></a><span class="lineno">  157</span>             nodataValues = nodata.split(<span class="stringliteral">';'</span>)</div>
 <div class="line"><a name="l00158"></a><span class="lineno">  158</span>             <span class="keywordflow">for</span> nodataValue <span class="keywordflow">in</span> nodataValues:</div>
@@ -215,13 +215,13 @@
 <div class="line"><a name="l00161"></a><span class="lineno">  161</span> </div>
 <div class="line"><a name="l00162"></a><span class="lineno">  162</span>         commands.append(<span class="stringliteral">"-cm"</span>)</div>
 <div class="line"><a name="l00163"></a><span class="lineno">  163</span>         commands.append(<span class="stringliteral">"-cmf"</span>)</div>
-<div class="line"><a name="l00164"></a><span class="lineno">  164</span>         commands.append(self.<a class="code" href="classqgis_1_1pkdiff__accuracy_1_1pkdiff__accuracy.html#a2ed757ec7259c4b56bee1acc8bbe1a61">CMFORMAT_OPTIONS</a>[self.getParameterValue(self.<a class="code" href="classqgis_1_1pkdiff__accuracy_1_1pkdiff__accuracy.html#a21c954c78e110bb1c93de64075afe182">CMFORMAT</a>)])</div>
+<div class="line"><a name="l00164"></a><span class="lineno">  164</span>         commands.append(self.<a class="code" href="classqgis_1_1pktools_1_1pkdiff__accuracy_1_1pkdiff__accuracy.html#ad1221f675d9b9d779d83abbf9b437146">CMFORMAT_OPTIONS</a>[self.getParameterValue(self.<a class="code" href="classqgis_1_1pktools_1_1pkdiff__accuracy_1_1pkdiff__accuracy.html#a4b776ec91fa5d020d7680eca874427e2">CMFORMAT</a>)])</div>
 <div class="line"><a name="l00165"></a><span class="lineno">  165</span>         commands.append(<span class="stringliteral">"-cmo"</span>)</div>
-<div class="line"><a name="l00166"></a><span class="lineno">  166</span>         commands.append(self.getOutputValue(self.<a class="code" href="classqgis_1_1pkdiff__accuracy_1_1pkdiff__accuracy.html#a792f4cf29ee2f6034149c0233b32f4ff">CMOUTPUT</a>))</div>
+<div class="line"><a name="l00166"></a><span class="lineno">  166</span>         commands.append(self.getOutputValue(self.<a class="code" href="classqgis_1_1pktools_1_1pkdiff__accuracy_1_1pkdiff__accuracy.html#a53f02145c4734a0655c70a3d7b4950f6">CMOUTPUT</a>))</div>
 <div class="line"><a name="l00167"></a><span class="lineno">  167</span> </div>
-<div class="line"><a name="l00168"></a><span class="lineno">  168</span>         output = self.getOutputFromName(self.<a class="code" href="classqgis_1_1pkdiff__accuracy_1_1pkdiff__accuracy.html#a22d37343b09f74019a836f1489d24c02">OUTPUT</a>)</div>
+<div class="line"><a name="l00168"></a><span class="lineno">  168</span>         output = self.getOutputFromName(self.<a class="code" href="classqgis_1_1pktools_1_1pkdiff__accuracy_1_1pkdiff__accuracy.html#ae64041efab08dd8fa6c19b625e168761">OUTPUT</a>)</div>
 <div class="line"><a name="l00169"></a><span class="lineno">  169</span>         outFile = output.value</div>
-<div class="line"><a name="l00170"></a><span class="lineno">  170</span>         formatIdx = self.getParameterValue(self.<a class="code" href="classqgis_1_1pkdiff__accuracy_1_1pkdiff__accuracy.html#ab922ac43189488cb53e46bccd0d02b6a">FORMAT</a>)</div>
+<div class="line"><a name="l00170"></a><span class="lineno">  170</span>         formatIdx = self.getParameterValue(self.<a class="code" href="classqgis_1_1pktools_1_1pkdiff__accuracy_1_1pkdiff__accuracy.html#a1fbcff81b3676249f0408de6319950d9">FORMAT</a>)</div>
 <div class="line"><a name="l00171"></a><span class="lineno">  171</span>         outFormat = <span class="stringliteral">'"'</span> + FORMATS[formatIdx] + <span class="stringliteral">'"'</span></div>
 <div class="line"><a name="l00172"></a><span class="lineno">  172</span>         commands.append(<span class="stringliteral">'-f'</span>)</div>
 <div class="line"><a name="l00173"></a><span class="lineno">  173</span>         commands.append(outFormat)</div>
@@ -232,36 +232,36 @@
 <div class="line"><a name="l00178"></a><span class="lineno">  178</span>         commands.append(<span class="stringliteral">'-o'</span>)</div>
 <div class="line"><a name="l00179"></a><span class="lineno">  179</span>         commands.append(<span class="stringliteral">'"'</span> + outFile + <span class="stringliteral">'"'</span>)</div>
 <div class="line"><a name="l00180"></a><span class="lineno">  180</span>         commands.append(<span class="stringliteral">'-lc'</span>);</div>
-<div class="line"><a name="l00181"></a><span class="lineno">  181</span>         commands.append(self.getParameterValue(self.<a class="code" href="classqgis_1_1pkdiff__accuracy_1_1pkdiff__accuracy.html#a7580c2442f384fcc956e14d936a3a305">LABELCLASS</a>))</div>
+<div class="line"><a name="l00181"></a><span class="lineno">  181</span>         commands.append(self.getParameterValue(self.<a class="code" href="classqgis_1_1pktools_1_1pkdiff__accuracy_1_1pkdiff__accuracy.html#a2d4f21a8f0057584931a3a696a5d1b75">LABELCLASS</a>))</div>
 <div class="line"><a name="l00182"></a><span class="lineno">  182</span> </div>
-<div class="line"><a name="l00183"></a><span class="lineno">  183</span>         extra = str(self.getParameterValue(self.<a class="code" href="classqgis_1_1pkdiff__accuracy_1_1pkdiff__accuracy.html#a83684b7d1751c3e507df1b2a61c06e7d">EXTRA</a>))</div>
+<div class="line"><a name="l00183"></a><span class="lineno">  183</span>         extra = str(self.getParameterValue(self.<a class="code" href="classqgis_1_1pktools_1_1pkdiff__accuracy_1_1pkdiff__accuracy.html#a5779733ceff946ac04ec1f6d0e494452">EXTRA</a>))</div>
 <div class="line"><a name="l00184"></a><span class="lineno">  184</span>         <span class="keywordflow">if</span> len(extra) > 0:</div>
 <div class="line"><a name="l00185"></a><span class="lineno">  185</span>             commands.append(extra)</div>
 <div class="line"><a name="l00186"></a><span class="lineno">  186</span> </div>
 <div class="line"><a name="l00187"></a><span class="lineno">  187</span>         pktoolsUtils.runpktools(commands, progress)</div>
-<div class="ttc" id="classqgis_1_1pkdiff__accuracy_1_1pkdiff__accuracy_html_a6cabc221036f66d975847866eaf14dd9"><div class="ttname"><a href="classqgis_1_1pkdiff__accuracy_1_1pkdiff__accuracy.html#a6cabc221036f66d975847866eaf14dd9">qgis.pkdiff_accuracy.pkdiff_accuracy.INPUT</a></div><div class="ttdeci">string INPUT</div><div class="ttdef"><b>Definition:</b> <a href="pkdiff__accuracy_8py_source.html#l00095">pkdiff_accuracy.py:95</a></div></div>
-<div class="ttc" id="classqgis_1_1pkdiff__accuracy_1_1pkdiff__accuracy_html_a99f5e02f16130f80143086252a38ee93"><div class="ttname"><a href="classqgis_1_1pkdiff__accuracy_1_1pkdiff__accuracy.html#a99f5e02f16130f80143086252a38ee93">qgis.pkdiff_accuracy.pkdiff_accuracy.LABELREF</a></div><div class="ttdeci">string LABELREF</div><div class="ttdef"><b>Definition:</b> <a href="pkdiff__accuracy_8py_source.html#l00098">pkdiff_accuracy.py:98</a></div></div>
-<div class="ttc" id="classqgis_1_1pkdiff__accuracy_1_1pkdiff__accuracy_html_a02de7992fb58aea0f628f8f3c1c937ac"><div class="ttname"><a href="classqgis_1_1pkdiff__accuracy_1_1pkdiff__accuracy.html#a02de7992fb58aea0f628f8f3c1c937ac">qgis.pkdiff_accuracy.pkdiff_accuracy.NODATA</a></div><div class="ttdeci">string NODATA</div><div class="ttdef"><b>Definition:</b> <a href="pkdiff__accuracy_8py_source.html#l00099">pkdiff_accuracy.py:99</a></div></div>
-<div class="ttc" id="classqgis_1_1pkdiff__accuracy_1_1pkdiff__accuracy_html_a792f4cf29ee2f6034149c0233b32f4ff"><div class="ttname"><a href="classqgis_1_1pkdiff__accuracy_1_1pkdiff__accuracy.html#a792f4cf29ee2f6034149c0233b32f4ff">qgis.pkdiff_accuracy.pkdiff_accuracy.CMOUTPUT</a></div><div class="ttdeci">string CMOUTPUT</div><div class="ttdef"><b>Definition:</b> <a href="pkdiff__accuracy_8py_source.html#l00102">pkdiff_accuracy.py:102</a></div></div>
+<div class="ttc" id="classqgis_1_1pktools_1_1pkdiff__accuracy_1_1pkdiff__accuracy_html_ab4e343f53122cd27e365391daa149b8e"><div class="ttname"><a href="classqgis_1_1pktools_1_1pkdiff__accuracy_1_1pkdiff__accuracy.html#ab4e343f53122cd27e365391daa149b8e">qgis.pktools.pkdiff_accuracy.pkdiff_accuracy.INPUT</a></div><div class="ttdeci">string INPUT</div><div class="ttdef"><b>Definition:</b> <a href="pktools_2pkdiff__accuracy_8py_source.html#l00095">pkdiff_accuracy.py:95</a></div></div>
+<div class="ttc" id="classqgis_1_1pktools_1_1pkdiff__accuracy_1_1pkdiff__accuracy_html_a2d4f21a8f0057584931a3a696a5d1b75"><div class="ttname"><a href="classqgis_1_1pktools_1_1pkdiff__accuracy_1_1pkdiff__accuracy.html#a2d4f21a8f0057584931a3a696a5d1b75">qgis.pktools.pkdiff_accuracy.pkdiff_accuracy.LABELCLASS</a></div><div class="ttdeci">string LABELCLASS</div><div class="ttdef"><b>Definition:</b> <a href="pktools_2pkdiff__accuracy_8py_source.html#l00107">pkdiff_accuracy.py:107</a></div></div>
+<div class="ttc" id="classqgis_1_1pktools_1_1pkdiff__accuracy_1_1pkdiff__accuracy_html_ab721f3d9ae2c876ef39abc3b07a12530"><div class="ttname"><a href="classqgis_1_1pktools_1_1pkdiff__accuracy_1_1pkdiff__accuracy.html#ab721f3d9ae2c876ef39abc3b07a12530">qgis.pktools.pkdiff_accuracy.pkdiff_accuracy.REFERENCE</a></div><div class="ttdeci">string REFERENCE</div><div class="ttdef"><b>Definition:</b> <a href="pktools_2pkdiff__accuracy_8py_source.html#l00096">pkdiff_accuracy.py:96</a></div></div>
+<div class="ttc" id="classqgis_1_1pktools_1_1pkdiff__accuracy_1_1pkdiff__accuracy_html_adde47dc64982051137c51b2b9c45d686"><div class="ttname"><a href="classqgis_1_1pktools_1_1pkdiff__accuracy_1_1pkdiff__accuracy.html#adde47dc64982051137c51b2b9c45d686">qgis.pktools.pkdiff_accuracy.pkdiff_accuracy.name</a></div><div class="ttdeci">name</div><div class="ttdef"><b>Definition:</b> <a href="pktools_2pkdiff__accuracy_8py_source.html#l00114">pkdiff_accuracy.py:114</a></div></div>
+<div class="ttc" id="classqgis_1_1pktools_1_1pkdiff__accuracy_1_1pkdiff__accuracy_html_ad1221f675d9b9d779d83abbf9b437146"><div class="ttname"><a href="classqgis_1_1pktools_1_1pkdiff__accuracy_1_1pkdiff__accuracy.html#ad1221f675d9b9d779d83abbf9b437146">qgis.pktools.pkdiff_accuracy.pkdiff_accuracy.CMFORMAT_OPTIONS</a></div><div class="ttdeci">list CMFORMAT_OPTIONS</div><div class="ttdef"><b>Definition:</b> <a href="pktools_2pkdiff__accuracy_8py_source.html#l00103">pkdiff_accuracy.py:103</a [...]
+<div class="ttc" id="classqgis_1_1pktools_1_1pkdiff__accuracy_1_1pkdiff__accuracy_html_a04cec215fc970c27c9cbbe0ddcd7a2b5"><div class="ttname"><a href="classqgis_1_1pktools_1_1pkdiff__accuracy_1_1pkdiff__accuracy.html#a04cec215fc970c27c9cbbe0ddcd7a2b5">qgis.pktools.pkdiff_accuracy.pkdiff_accuracy.ITERATE</a></div><div class="ttdeci">string ITERATE</div><div class="ttdef"><b>Definition:</b> <a href="pktools_2pkdiff__accuracy_8py_source.html#l00097">pkdiff_accuracy.py:97</a></div></div>
 <div class="ttc" id="namespacePyQt4_1_1QtCore_html"><div class="ttname"><a href="namespacePyQt4_1_1QtCore.html">QtCore</a></div></div>
-<div class="ttc" id="classqgis_1_1pkdiff__accuracy_1_1pkdiff__accuracy_html_a176e2f67f3be853c9197d99f4cd16a1c"><div class="ttname"><a href="classqgis_1_1pkdiff__accuracy_1_1pkdiff__accuracy.html#a176e2f67f3be853c9197d99f4cd16a1c">qgis.pkdiff_accuracy.pkdiff_accuracy.cliName</a></div><div class="ttdeci">def cliName</div><div class="ttdef"><b>Definition:</b> <a href="pkdiff__accuracy_8py_source.html#l00110">pkdiff_accuracy.py:110</a></div></div>
-<div class="ttc" id="classqgis_1_1pkdiff__accuracy_1_1pkdiff__accuracy_html_a7580c2442f384fcc956e14d936a3a305"><div class="ttname"><a href="classqgis_1_1pkdiff__accuracy_1_1pkdiff__accuracy.html#a7580c2442f384fcc956e14d936a3a305">qgis.pkdiff_accuracy.pkdiff_accuracy.LABELCLASS</a></div><div class="ttdeci">string LABELCLASS</div><div class="ttdef"><b>Definition:</b> <a href="pkdiff__accuracy_8py_source.html#l00107">pkdiff_accuracy.py:107</a></div></div>
-<div class="ttc" id="classqgis_1_1pkdiff__accuracy_1_1pkdiff__accuracy_html"><div class="ttname"><a href="classqgis_1_1pkdiff__accuracy_1_1pkdiff__accuracy.html">qgis.pkdiff_accuracy.pkdiff_accuracy</a></div><div class="ttdef"><b>Definition:</b> <a href="pkdiff__accuracy_8py_source.html#l00093">pkdiff_accuracy.py:93</a></div></div>
-<div class="ttc" id="classqgis_1_1pkdiff__accuracy_1_1pkdiff__accuracy_html_afdaa56e3a00e8ad32fffd8600b998b92"><div class="ttname"><a href="classqgis_1_1pkdiff__accuracy_1_1pkdiff__accuracy.html#afdaa56e3a00e8ad32fffd8600b998b92">qgis.pkdiff_accuracy.pkdiff_accuracy.REFERENCE</a></div><div class="ttdeci">string REFERENCE</div><div class="ttdef"><b>Definition:</b> <a href="pkdiff__accuracy_8py_source.html#l00096">pkdiff_accuracy.py:96</a></div></div>
+<div class="ttc" id="classqgis_1_1pktools_1_1pkdiff__accuracy_1_1pkdiff__accuracy_html"><div class="ttname"><a href="classqgis_1_1pktools_1_1pkdiff__accuracy_1_1pkdiff__accuracy.html">qgis.pktools.pkdiff_accuracy.pkdiff_accuracy</a></div><div class="ttdef"><b>Definition:</b> <a href="pktools_2pkdiff__accuracy_8py_source.html#l00093">pkdiff_accuracy.py:93</a></div></div>
 <div class="ttc" id="namespaceqgis_1_1core_html"><div class="ttname"><a href="namespaceqgis_1_1core.html">core</a></div></div>
-<div class="ttc" id="classqgis_1_1pkdiff__accuracy_1_1pkdiff__accuracy_html_a21c954c78e110bb1c93de64075afe182"><div class="ttname"><a href="classqgis_1_1pkdiff__accuracy_1_1pkdiff__accuracy.html#a21c954c78e110bb1c93de64075afe182">qgis.pkdiff_accuracy.pkdiff_accuracy.CMFORMAT</a></div><div class="ttdeci">string CMFORMAT</div><div class="ttdef"><b>Definition:</b> <a href="pkdiff__accuracy_8py_source.html#l00104">pkdiff_accuracy.py:104</a></div></div>
-<div class="ttc" id="classqgis_1_1pkdiff__accuracy_1_1pkdiff__accuracy_html_aa1a0571329dbfd38e21385392bab8de1"><div class="ttname"><a href="classqgis_1_1pkdiff__accuracy_1_1pkdiff__accuracy.html#aa1a0571329dbfd38e21385392bab8de1">qgis.pkdiff_accuracy.pkdiff_accuracy.name</a></div><div class="ttdeci">name</div><div class="ttdef"><b>Definition:</b> <a href="pkdiff__accuracy_8py_source.html#l00114">pkdiff_accuracy.py:114</a></div></div>
-<div class="ttc" id="classqgis_1_1pkdiff__accuracy_1_1pkdiff__accuracy_html_a724b6dc67c93a4392de92dcfca91f701"><div class="ttname"><a href="classqgis_1_1pkdiff__accuracy_1_1pkdiff__accuracy.html#a724b6dc67c93a4392de92dcfca91f701">qgis.pkdiff_accuracy.pkdiff_accuracy.group</a></div><div class="ttdeci">group</div><div class="ttdef"><b>Definition:</b> <a href="pkdiff__accuracy_8py_source.html#l00115">pkdiff_accuracy.py:115</a></div></div>
-<div class="ttc" id="classqgis_1_1pkdiff__accuracy_1_1pkdiff__accuracy_html_a83684b7d1751c3e507df1b2a61c06e7d"><div class="ttname"><a href="classqgis_1_1pkdiff__accuracy_1_1pkdiff__accuracy.html#a83684b7d1751c3e507df1b2a61c06e7d">qgis.pkdiff_accuracy.pkdiff_accuracy.EXTRA</a></div><div class="ttdeci">string EXTRA</div><div class="ttdef"><b>Definition:</b> <a href="pkdiff__accuracy_8py_source.html#l00108">pkdiff_accuracy.py:108</a></div></div>
-<div class="ttc" id="classqgis_1_1pkdiff__accuracy_1_1pkdiff__accuracy_html_ab922ac43189488cb53e46bccd0d02b6a"><div class="ttname"><a href="classqgis_1_1pkdiff__accuracy_1_1pkdiff__accuracy.html#ab922ac43189488cb53e46bccd0d02b6a">qgis.pkdiff_accuracy.pkdiff_accuracy.FORMAT</a></div><div class="ttdeci">string FORMAT</div><div class="ttdef"><b>Definition:</b> <a href="pkdiff__accuracy_8py_source.html#l00106">pkdiff_accuracy.py:106</a></div></div>
-<div class="ttc" id="classqgis_1_1pkdiff__accuracy_1_1pkdiff__accuracy_html_a22d37343b09f74019a836f1489d24c02"><div class="ttname"><a href="classqgis_1_1pkdiff__accuracy_1_1pkdiff__accuracy.html#a22d37343b09f74019a836f1489d24c02">qgis.pkdiff_accuracy.pkdiff_accuracy.OUTPUT</a></div><div class="ttdeci">string OUTPUT</div><div class="ttdef"><b>Definition:</b> <a href="pkdiff__accuracy_8py_source.html#l00101">pkdiff_accuracy.py:101</a></div></div>
-<div class="ttc" id="classqgis_1_1pkdiff__accuracy_1_1pkdiff__accuracy_html_a2a294e32e185d1f58bbde4ae40f62c55"><div class="ttname"><a href="classqgis_1_1pkdiff__accuracy_1_1pkdiff__accuracy.html#a2a294e32e185d1f58bbde4ae40f62c55">qgis.pkdiff_accuracy.pkdiff_accuracy.ITERATE</a></div><div class="ttdeci">string ITERATE</div><div class="ttdef"><b>Definition:</b> <a href="pkdiff__accuracy_8py_source.html#l00097">pkdiff_accuracy.py:97</a></div></div>
-<div class="ttc" id="classqgis_1_1pkdiff__accuracy_1_1pkdiff__accuracy_html_a2ed757ec7259c4b56bee1acc8bbe1a61"><div class="ttname"><a href="classqgis_1_1pkdiff__accuracy_1_1pkdiff__accuracy.html#a2ed757ec7259c4b56bee1acc8bbe1a61">qgis.pkdiff_accuracy.pkdiff_accuracy.CMFORMAT_OPTIONS</a></div><div class="ttdeci">list CMFORMAT_OPTIONS</div><div class="ttdef"><b>Definition:</b> <a href="pkdiff__accuracy_8py_source.html#l00103">pkdiff_accuracy.py:103</a></div></div>
+<div class="ttc" id="classqgis_1_1pktools_1_1pkdiff__accuracy_1_1pkdiff__accuracy_html_a55056565ea9f8f166997ca32bcf92d68"><div class="ttname"><a href="classqgis_1_1pktools_1_1pkdiff__accuracy_1_1pkdiff__accuracy.html#a55056565ea9f8f166997ca32bcf92d68">qgis.pktools.pkdiff_accuracy.pkdiff_accuracy.cliName</a></div><div class="ttdeci">def cliName</div><div class="ttdef"><b>Definition:</b> <a href="pktools_2pkdiff__accuracy_8py_source.html#l00110">pkdiff_accuracy.py:110</a></div></div>
+<div class="ttc" id="classqgis_1_1pktools_1_1pkdiff__accuracy_1_1pkdiff__accuracy_html_a5779733ceff946ac04ec1f6d0e494452"><div class="ttname"><a href="classqgis_1_1pktools_1_1pkdiff__accuracy_1_1pkdiff__accuracy.html#a5779733ceff946ac04ec1f6d0e494452">qgis.pktools.pkdiff_accuracy.pkdiff_accuracy.EXTRA</a></div><div class="ttdeci">string EXTRA</div><div class="ttdef"><b>Definition:</b> <a href="pktools_2pkdiff__accuracy_8py_source.html#l00108">pkdiff_accuracy.py:108</a></div></div>
+<div class="ttc" id="classqgis_1_1pktools_1_1pkdiff__accuracy_1_1pkdiff__accuracy_html_a392cc9957b286d74ad2515c0dba4a695"><div class="ttname"><a href="classqgis_1_1pktools_1_1pkdiff__accuracy_1_1pkdiff__accuracy.html#a392cc9957b286d74ad2515c0dba4a695">qgis.pktools.pkdiff_accuracy.pkdiff_accuracy.LABELREF</a></div><div class="ttdeci">string LABELREF</div><div class="ttdef"><b>Definition:</b> <a href="pktools_2pkdiff__accuracy_8py_source.html#l00098">pkdiff_accuracy.py:98</a></div></div>
+<div class="ttc" id="classqgis_1_1pktools_1_1pkdiff__accuracy_1_1pkdiff__accuracy_html_a1fbcff81b3676249f0408de6319950d9"><div class="ttname"><a href="classqgis_1_1pktools_1_1pkdiff__accuracy_1_1pkdiff__accuracy.html#a1fbcff81b3676249f0408de6319950d9">qgis.pktools.pkdiff_accuracy.pkdiff_accuracy.FORMAT</a></div><div class="ttdeci">string FORMAT</div><div class="ttdef"><b>Definition:</b> <a href="pktools_2pkdiff__accuracy_8py_source.html#l00106">pkdiff_accuracy.py:106</a></div></div>
+<div class="ttc" id="classqgis_1_1pktools_1_1pkdiff__accuracy_1_1pkdiff__accuracy_html_a25a018181afee40dea3e4d5275747bb7"><div class="ttname"><a href="classqgis_1_1pktools_1_1pkdiff__accuracy_1_1pkdiff__accuracy.html#a25a018181afee40dea3e4d5275747bb7">qgis.pktools.pkdiff_accuracy.pkdiff_accuracy.group</a></div><div class="ttdeci">group</div><div class="ttdef"><b>Definition:</b> <a href="pktools_2pkdiff__accuracy_8py_source.html#l00115">pkdiff_accuracy.py:115</a></div></div>
+<div class="ttc" id="classqgis_1_1pktools_1_1pkdiff__accuracy_1_1pkdiff__accuracy_html_a4b776ec91fa5d020d7680eca874427e2"><div class="ttname"><a href="classqgis_1_1pktools_1_1pkdiff__accuracy_1_1pkdiff__accuracy.html#a4b776ec91fa5d020d7680eca874427e2">qgis.pktools.pkdiff_accuracy.pkdiff_accuracy.CMFORMAT</a></div><div class="ttdeci">string CMFORMAT</div><div class="ttdef"><b>Definition:</b> <a href="pktools_2pkdiff__accuracy_8py_source.html#l00104">pkdiff_accuracy.py:104</a></div></div>
+<div class="ttc" id="classqgis_1_1pktools_1_1pkdiff__accuracy_1_1pkdiff__accuracy_html_ae64041efab08dd8fa6c19b625e168761"><div class="ttname"><a href="classqgis_1_1pktools_1_1pkdiff__accuracy_1_1pkdiff__accuracy.html#ae64041efab08dd8fa6c19b625e168761">qgis.pktools.pkdiff_accuracy.pkdiff_accuracy.OUTPUT</a></div><div class="ttdeci">string OUTPUT</div><div class="ttdef"><b>Definition:</b> <a href="pktools_2pkdiff__accuracy_8py_source.html#l00101">pkdiff_accuracy.py:101</a></div></div>
+<div class="ttc" id="classqgis_1_1pktools_1_1pkdiff__accuracy_1_1pkdiff__accuracy_html_a53f02145c4734a0655c70a3d7b4950f6"><div class="ttname"><a href="classqgis_1_1pktools_1_1pkdiff__accuracy_1_1pkdiff__accuracy.html#a53f02145c4734a0655c70a3d7b4950f6">qgis.pktools.pkdiff_accuracy.pkdiff_accuracy.CMOUTPUT</a></div><div class="ttdeci">string CMOUTPUT</div><div class="ttdef"><b>Definition:</b> <a href="pktools_2pkdiff__accuracy_8py_source.html#l00102">pkdiff_accuracy.py:102</a></div></div>
+<div class="ttc" id="classqgis_1_1pktools_1_1pkdiff__accuracy_1_1pkdiff__accuracy_html_ae62e0e32e5c75f22f5a8ef0f521f5cce"><div class="ttname"><a href="classqgis_1_1pktools_1_1pkdiff__accuracy_1_1pkdiff__accuracy.html#ae62e0e32e5c75f22f5a8ef0f521f5cce">qgis.pktools.pkdiff_accuracy.pkdiff_accuracy.NODATA</a></div><div class="ttdeci">string NODATA</div><div class="ttdef"><b>Definition:</b> <a href="pktools_2pkdiff__accuracy_8py_source.html#l00099">pkdiff_accuracy.py:99</a></div></div>
 </div><!-- fragment --></div><!-- contents -->
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Jun 23 2015 17:09:36 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Tue Nov 3 2015 15:58:26 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/pkextract_8py_source.html b/doc/html/pktools_2pkextract_8py_source.html
similarity index 71%
copy from doc/html/pkextract_8py_source.html
copy to doc/html/pktools_2pkextract_8py_source.html
index 1827b12..5cf2e77 100644
--- a/doc/html/pkextract_8py_source.html
+++ b/doc/html/pktools_2pkextract_8py_source.html
@@ -4,7 +4,7 @@
 <meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
 <meta http-equiv="X-UA-Compatible" content="IE=9"/>
 <meta name="generator" content="Doxygen 1.8.6"/>
-<title>pktools: /home/kempenep/pktools/qgis/pkextract.py Source File</title>
+<title>pktools: /home/kempenep/pktools/qgis/pktools/pkextract.py Source File</title>
 <link href="tabs.css" rel="stylesheet" type="text/css"/>
 <script type="text/javascript" src="jquery.js"></script>
 <script type="text/javascript" src="dynsections.js"></script>
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.3</span>
+    <span id="projectnumber">2.6.4</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -44,7 +44,7 @@
   </div>
 <div id="nav-path" class="navpath">
   <ul>
-<li class="navelem"><a class="el" href="dir_5785acc8d2e42f8795bdbe936856f26d.html">qgis</a></li>  </ul>
+<li class="navelem"><a class="el" href="dir_5785acc8d2e42f8795bdbe936856f26d.html">qgis</a></li><li class="navelem"><a class="el" href="dir_b7cc22b4453454f1e686d9a2e78d988d.html">pktools</a></li>  </ul>
 </div>
 </div><!-- top -->
 <div class="header">
@@ -138,7 +138,7 @@
 <div class="line"><a name="l00084"></a><span class="lineno">   84</span>     <span class="stringliteral">'.pdf'</span>,</div>
 <div class="line"><a name="l00085"></a><span class="lineno">   85</span> ]</div>
 <div class="line"><a name="l00086"></a><span class="lineno">   86</span> </div>
-<div class="line"><a name="l00087"></a><span class="lineno"><a class="line" href="classqgis_1_1pkextract_1_1pkextract.html">   87</a></span> <span class="keyword">class </span><a class="code" href="classqgis_1_1pkextract_1_1pkextract.html">pkextract</a>(pktoolsAlgorithm):</div>
+<div class="line"><a name="l00087"></a><span class="lineno"><a class="line" href="classqgis_1_1pktools_1_1pkextract_1_1pkextract.html">   87</a></span> <span class="keyword">class </span><a class="code" href="classqgis_1_1pktools_1_1pkextract_1_1pkextract.html">pkextract</a>(pktoolsAlgorithm):</div>
 <div class="line"><a name="l00088"></a><span class="lineno">   88</span> </div>
 <div class="line"><a name="l00089"></a><span class="lineno">   89</span>     INPUT = <span class="stringliteral">"INPUT"</span></div>
 <div class="line"><a name="l00090"></a><span class="lineno">   90</span>     SAMPLE = <span class="stringliteral">"SAMPLE"</span></div>
@@ -161,35 +161,35 @@
 <div class="line"><a name="l00107"></a><span class="lineno">  107</span>         <span class="keywordflow">return</span> <span class="stringliteral">"pkextract"</span></div>
 <div class="line"><a name="l00108"></a><span class="lineno">  108</span> </div>
 <div class="line"><a name="l00109"></a><span class="lineno">  109</span>     <span class="keyword">def </span>defineCharacteristics(self):</div>
-<div class="line"><a name="l00110"></a><span class="lineno">  110</span>         self.<a class="code" href="classqgis_1_1pkextract_1_1pkextract.html#a682fac32a3bbc98fe364fc9d2a46a9ed">name</a> = <span class="stringliteral">"extract vector sample from raster"</span></div>
-<div class="line"><a name="l00111"></a><span class="lineno">  111</span>         self.<a class="code" href="classqgis_1_1pkextract_1_1pkextract.html#ab9995a84ad157685b2d27025cdad22b0">group</a> = <span class="stringliteral">"[pktools] raster/vector"</span></div>
-<div class="line"><a name="l00112"></a><span class="lineno">  112</span>         self.addParameter(ParameterRaster(self.<a class="code" href="classqgis_1_1pkextract_1_1pkextract.html#a95e1c0317ddcaeda681980e70494a638">INPUT</a>, <span class="stringliteral">'Input raster data set'</span>))</div>
-<div class="line"><a name="l00113"></a><span class="lineno">  113</span>         self.addParameter(ParameterVector(self.<a class="code" href="classqgis_1_1pkextract_1_1pkextract.html#a152b797f760ae98e27adbad95c3a8729">SAMPLE</a>, <span class="stringliteral">'Sample vector data set'</span>))</div>
-<div class="line"><a name="l00114"></a><span class="lineno">  114</span>         self.addParameter(ParameterBoolean(self.<a class="code" href="classqgis_1_1pkextract_1_1pkextract.html#a7a00b2c269b8968376d90b0bf893df9f">ITERATE</a>, <span class="stringliteral">"Iterate over all layers"</span>,<span class="keyword">True</span>))</div>
-<div class="line"><a name="l00115"></a><span class="lineno">  115</span>         self.addParameter(ParameterSelection(self.<a class="code" href="classqgis_1_1pkextract_1_1pkextract.html#af877cda3a19feb1f37d368d54680fd59">RULE</a>,<span class="stringliteral">"extraction rule"</span>,self.<a class="code" href="classqgis_1_1pkextract_1_1pkextract.html#a78b93513da9f4173cd4218204a77d20a">RULE_OPTIONS</a>, 0))</div>
+<div class="line"><a name="l00110"></a><span class="lineno">  110</span>         self.<a class="code" href="classqgis_1_1pktools_1_1pkextract_1_1pkextract.html#ab9efcad6e33e229054cd88a80d2e31ff">name</a> = <span class="stringliteral">"extract vector sample from raster"</span></div>
+<div class="line"><a name="l00111"></a><span class="lineno">  111</span>         self.<a class="code" href="classqgis_1_1pktools_1_1pkextract_1_1pkextract.html#ae279e3125dc30a09e1430c5e76b473cb">group</a> = <span class="stringliteral">"[pktools] raster/vector"</span></div>
+<div class="line"><a name="l00112"></a><span class="lineno">  112</span>         self.addParameter(ParameterRaster(self.<a class="code" href="classqgis_1_1pktools_1_1pkextract_1_1pkextract.html#a257192faedfabf32e503d72a2f34f459">INPUT</a>, <span class="stringliteral">'Input raster data set'</span>))</div>
+<div class="line"><a name="l00113"></a><span class="lineno">  113</span>         self.addParameter(ParameterVector(self.<a class="code" href="classqgis_1_1pktools_1_1pkextract_1_1pkextract.html#a7e6d595c2e44bf7b9634f917bca79c61">SAMPLE</a>, <span class="stringliteral">'Sample vector data set'</span>))</div>
+<div class="line"><a name="l00114"></a><span class="lineno">  114</span>         self.addParameter(ParameterBoolean(self.<a class="code" href="classqgis_1_1pktools_1_1pkextract_1_1pkextract.html#a5797ede6cc9265a846e09a4f5ff31292">ITERATE</a>, <span class="stringliteral">"Iterate over all layers"</span>,<span class="keyword">True</span>))</div>
+<div class="line"><a name="l00115"></a><span class="lineno">  115</span>         self.addParameter(ParameterSelection(self.<a class="code" href="classqgis_1_1pktools_1_1pkextract_1_1pkextract.html#a6997d33d8c4528dc3e278af16188ac1d">RULE</a>,<span class="stringliteral">"extraction rule"</span>,self.<a class="code" href="classqgis_1_1pktools_1_1pkextract_1_1pkextract.html#a3e61a3b83a4917429eb54cdbe69bf84f">RULE_OPTIONS</a>, 0))</div>
 <div class="line"><a name="l00116"></a><span class="lineno">  116</span> </div>
-<div class="line"><a name="l00117"></a><span class="lineno">  117</span>         self.addOutput(OutputVector(self.<a class="code" href="classqgis_1_1pkextract_1_1pkextract.html#aebb093e7f23d360f6657f8833f5c73f3">OUTPUT</a>, <span class="stringliteral">'Output vector data set'</span>))</div>
-<div class="line"><a name="l00118"></a><span class="lineno">  118</span>         self.addParameter(ParameterSelection(self.<a class="code" href="classqgis_1_1pkextract_1_1pkextract.html#aec905ae5cbf25bc9d1a4a592bff30311">FORMAT</a>,</div>
+<div class="line"><a name="l00117"></a><span class="lineno">  117</span>         self.addOutput(OutputVector(self.<a class="code" href="classqgis_1_1pktools_1_1pkextract_1_1pkextract.html#a481ae866b7a60d1f8ec47f0caa8d3d6b">OUTPUT</a>, <span class="stringliteral">'Output vector data set'</span>))</div>
+<div class="line"><a name="l00118"></a><span class="lineno">  118</span>         self.addParameter(ParameterSelection(self.<a class="code" href="classqgis_1_1pktools_1_1pkextract_1_1pkextract.html#a3242dae21dccbdc5f1805b566fe4bc28">FORMAT</a>,</div>
 <div class="line"><a name="l00119"></a><span class="lineno">  119</span>                           <span class="stringliteral">'Destination Format'</span>, FORMATS))</div>
 <div class="line"><a name="l00120"></a><span class="lineno">  120</span> </div>
-<div class="line"><a name="l00121"></a><span class="lineno">  121</span>         self.addParameter(ParameterBoolean(self.<a class="code" href="classqgis_1_1pkextract_1_1pkextract.html#ac120a3debadb9cbd38552fcdefba2fb0">POLYGON</a>, <span class="stringliteral">"Create OGRPolygon as geometry instead of OGRPoint"</span>,<span class="keyword">False</span>))</div>
-<div class="line"><a name="l00122"></a><span class="lineno">  122</span>         self.addParameter(ParameterNumber(self.<a class="code" href="classqgis_1_1pkextract_1_1pkextract.html#a0052109b006ae33bb2014a05ffd9226f">BUFFER</a>, <span class="stringliteral">"Buffer for calculating statistics for point features"</span>,1,25,1))</div>
-<div class="line"><a name="l00123"></a><span class="lineno">  123</span>         self.addParameter(ParameterString(self.<a class="code" href="classqgis_1_1pkextract_1_1pkextract.html#ab4431ebf4ce448655fcc25366f15abd3">SRCNODATA</a>, <span class="stringliteral">"invalid value(s) for input raster dataset (e.g., 0;255)"</span>,<span class="stringliteral">"none"</span>))</div>
-<div class="line"><a name="l00124"></a><span class="lineno">  124</span>         self.addParameter(ParameterString(self.<a class="code" href="classqgis_1_1pkextract_1_1pkextract.html#a1cb12c6b9a06225999395afa50b17987">BNDNODATA</a>, <span class="stringliteral">"Band(s) in input image to check if pixel is valid (e.g., 0;1)"</span>,<span class="stringliteral">"0"</span>))</div>
+<div class="line"><a name="l00121"></a><span class="lineno">  121</span>         self.addParameter(ParameterBoolean(self.<a class="code" href="classqgis_1_1pktools_1_1pkextract_1_1pkextract.html#aac5a26b050718715b4adfcdd5e10c6c2">POLYGON</a>, <span class="stringliteral">"Create OGRPolygon as geometry instead of OGRPoint"</span>,<span class="keyword">False</span>))</div>
+<div class="line"><a name="l00122"></a><span class="lineno">  122</span>         self.addParameter(ParameterNumber(self.<a class="code" href="classqgis_1_1pktools_1_1pkextract_1_1pkextract.html#a21c89f90489c9cc008332981c12868e2">BUFFER</a>, <span class="stringliteral">"Buffer for calculating statistics for point features"</span>,1,25,1))</div>
+<div class="line"><a name="l00123"></a><span class="lineno">  123</span>         self.addParameter(ParameterString(self.<a class="code" href="classqgis_1_1pktools_1_1pkextract_1_1pkextract.html#adc9fa45630da5c63f41f4542bc82244f">SRCNODATA</a>, <span class="stringliteral">"invalid value(s) for input raster dataset (e.g., 0;255)"</span>,<span class="stringliteral">"none"</span>))</div>
+<div class="line"><a name="l00124"></a><span class="lineno">  124</span>         self.addParameter(ParameterString(self.<a class="code" href="classqgis_1_1pktools_1_1pkextract_1_1pkextract.html#a222f15dc4f8abcf5ccdb34e909da8ec8">BNDNODATA</a>, <span class="stringliteral">"Band(s) in input image to check if pixel is valid (e.g., 0;1)"</span>,<span class="stringliteral">"0"</span>))</div>
 <div class="line"><a name="l00125"></a><span class="lineno">  125</span> </div>
-<div class="line"><a name="l00126"></a><span class="lineno">  126</span>         self.addParameter(ParameterString(self.<a class="code" href="classqgis_1_1pkextract_1_1pkextract.html#a741cc5d777e44ecde629f16a2499ae6c">EXTRA</a>,</div>
+<div class="line"><a name="l00126"></a><span class="lineno">  126</span>         self.addParameter(ParameterString(self.<a class="code" href="classqgis_1_1pktools_1_1pkextract_1_1pkextract.html#afd7a165c5f77f4ad99a6f664576852dd">EXTRA</a>,</div>
 <div class="line"><a name="l00127"></a><span class="lineno">  127</span>                           <span class="stringliteral">'Additional parameters'</span>, <span class="stringliteral">''</span>, optional=<span class="keyword">True</span>))</div>
 <div class="line"><a name="l00128"></a><span class="lineno">  128</span> </div>
 <div class="line"><a name="l00129"></a><span class="lineno">  129</span>     <span class="keyword">def </span>processAlgorithm(self, progress):</div>
-<div class="line"><a name="l00130"></a><span class="lineno">  130</span>         cliPath = <span class="stringliteral">'"'</span> + os.path.join(pktoolsUtils.pktoolsPath(), self.<a class="code" href="classqgis_1_1pkextract_1_1pkextract.html#af5bc2523851ece32499990c6b9bd64f7">cliName</a>()) + <span class="stringliteral">'"'</span></div>
+<div class="line"><a name="l00130"></a><span class="lineno">  130</span>         cliPath = <span class="stringliteral">'"'</span> + os.path.join(pktoolsUtils.pktoolsPath(), self.<a class="code" href="classqgis_1_1pktools_1_1pkextract_1_1pkextract.html#ae049566d661a688af829c9a068df729e">cliName</a>()) + <span class="stringliteral">'"'</span></div>
 <div class="line"><a name="l00131"></a><span class="lineno">  131</span>         commands = [cliPath]</div>
 <div class="line"><a name="l00132"></a><span class="lineno">  132</span> </div>
-<div class="line"><a name="l00133"></a><span class="lineno">  133</span>         input=self.getParameterValue(self.<a class="code" href="classqgis_1_1pkextract_1_1pkextract.html#a95e1c0317ddcaeda681980e70494a638">INPUT</a>)</div>
+<div class="line"><a name="l00133"></a><span class="lineno">  133</span>         input=self.getParameterValue(self.<a class="code" href="classqgis_1_1pktools_1_1pkextract_1_1pkextract.html#a257192faedfabf32e503d72a2f34f459">INPUT</a>)</div>
 <div class="line"><a name="l00134"></a><span class="lineno">  134</span>         commands.append(<span class="stringliteral">'-i'</span>)</div>
 <div class="line"><a name="l00135"></a><span class="lineno">  135</span>         commands.append(<span class="stringliteral">'"'</span> + input + <span class="stringliteral">'"'</span>)</div>
 <div class="line"><a name="l00136"></a><span class="lineno">  136</span> </div>
-<div class="line"><a name="l00137"></a><span class="lineno">  137</span>         sample=self.getParameterValue(self.<a class="code" href="classqgis_1_1pkextract_1_1pkextract.html#a152b797f760ae98e27adbad95c3a8729">SAMPLE</a>)</div>
-<div class="line"><a name="l00138"></a><span class="lineno">  138</span>         <span class="keywordflow">if</span> self.getParameterValue(self.<a class="code" href="classqgis_1_1pkextract_1_1pkextract.html#a7a00b2c269b8968376d90b0bf893df9f">ITERATE</a>):</div>
+<div class="line"><a name="l00137"></a><span class="lineno">  137</span>         sample=self.getParameterValue(self.<a class="code" href="classqgis_1_1pktools_1_1pkextract_1_1pkextract.html#a7e6d595c2e44bf7b9634f917bca79c61">SAMPLE</a>)</div>
+<div class="line"><a name="l00138"></a><span class="lineno">  138</span>         <span class="keywordflow">if</span> self.getParameterValue(self.<a class="code" href="classqgis_1_1pktools_1_1pkextract_1_1pkextract.html#a5797ede6cc9265a846e09a4f5ff31292">ITERATE</a>):</div>
 <div class="line"><a name="l00139"></a><span class="lineno">  139</span>             <span class="keywordflow">if</span> str(sample).find(<span class="stringliteral">'|'</span>)>0:</div>
 <div class="line"><a name="l00140"></a><span class="lineno">  140</span>                 samplename=str(sample)[:str(sample).find(<span class="stringliteral">'|'</span>)]</div>
 <div class="line"><a name="l00141"></a><span class="lineno">  141</span>             <span class="keywordflow">else</span>:</div>
@@ -199,15 +199,15 @@
 <div class="line"><a name="l00145"></a><span class="lineno">  145</span>         commands.append(<span class="stringliteral">'-s'</span>)</div>
 <div class="line"><a name="l00146"></a><span class="lineno">  146</span>         commands.append(samplename)</div>
 <div class="line"><a name="l00147"></a><span class="lineno">  147</span> </div>
-<div class="line"><a name="l00148"></a><span class="lineno">  148</span>         <span class="keywordflow">if</span> self.getParameterValue(self.<a class="code" href="classqgis_1_1pkextract_1_1pkextract.html#ac120a3debadb9cbd38552fcdefba2fb0">POLYGON</a>):</div>
+<div class="line"><a name="l00148"></a><span class="lineno">  148</span>         <span class="keywordflow">if</span> self.getParameterValue(self.<a class="code" href="classqgis_1_1pktools_1_1pkextract_1_1pkextract.html#aac5a26b050718715b4adfcdd5e10c6c2">POLYGON</a>):</div>
 <div class="line"><a name="l00149"></a><span class="lineno">  149</span>             commands.append(<span class="stringliteral">"-polygon"</span>)</div>
 <div class="line"><a name="l00150"></a><span class="lineno">  150</span> </div>
 <div class="line"><a name="l00151"></a><span class="lineno">  151</span>         commands.append(<span class="stringliteral">"-r"</span>)</div>
-<div class="line"><a name="l00152"></a><span class="lineno">  152</span>         commands.append(self.<a class="code" href="classqgis_1_1pkextract_1_1pkextract.html#a78b93513da9f4173cd4218204a77d20a">RULE_OPTIONS</a>[self.getParameterValue(self.<a class="code" href="classqgis_1_1pkextract_1_1pkextract.html#af877cda3a19feb1f37d368d54680fd59">RULE</a>)])</div>
+<div class="line"><a name="l00152"></a><span class="lineno">  152</span>         commands.append(self.<a class="code" href="classqgis_1_1pktools_1_1pkextract_1_1pkextract.html#a3e61a3b83a4917429eb54cdbe69bf84f">RULE_OPTIONS</a>[self.getParameterValue(self.<a class="code" href="classqgis_1_1pktools_1_1pkextract_1_1pkextract.html#a6997d33d8c4528dc3e278af16188ac1d">RULE</a>)])</div>
 <div class="line"><a name="l00153"></a><span class="lineno">  153</span> </div>
-<div class="line"><a name="l00154"></a><span class="lineno">  154</span>         output = self.getOutputFromName(self.<a class="code" href="classqgis_1_1pkextract_1_1pkextract.html#aebb093e7f23d360f6657f8833f5c73f3">OUTPUT</a>)</div>
+<div class="line"><a name="l00154"></a><span class="lineno">  154</span>         output = self.getOutputFromName(self.<a class="code" href="classqgis_1_1pktools_1_1pkextract_1_1pkextract.html#a481ae866b7a60d1f8ec47f0caa8d3d6b">OUTPUT</a>)</div>
 <div class="line"><a name="l00155"></a><span class="lineno">  155</span>         outFile = output.value</div>
-<div class="line"><a name="l00156"></a><span class="lineno">  156</span>         formatIdx = self.getParameterValue(self.<a class="code" href="classqgis_1_1pkextract_1_1pkextract.html#aec905ae5cbf25bc9d1a4a592bff30311">FORMAT</a>)</div>
+<div class="line"><a name="l00156"></a><span class="lineno">  156</span>         formatIdx = self.getParameterValue(self.<a class="code" href="classqgis_1_1pktools_1_1pkextract_1_1pkextract.html#a3242dae21dccbdc5f1805b566fe4bc28">FORMAT</a>)</div>
 <div class="line"><a name="l00157"></a><span class="lineno">  157</span>         outFormat = <span class="stringliteral">'"'</span> + FORMATS[formatIdx] + <span class="stringliteral">'"'</span></div>
 <div class="line"><a name="l00158"></a><span class="lineno">  158</span>         commands.append(<span class="stringliteral">'-f'</span>)</div>
 <div class="line"><a name="l00159"></a><span class="lineno">  159</span>         commands.append(outFormat)</div>
@@ -218,51 +218,51 @@
 <div class="line"><a name="l00164"></a><span class="lineno">  164</span>         commands.append(<span class="stringliteral">'-o'</span>)</div>
 <div class="line"><a name="l00165"></a><span class="lineno">  165</span>         commands.append(<span class="stringliteral">'"'</span> + outFile + <span class="stringliteral">'"'</span>)</div>
 <div class="line"><a name="l00166"></a><span class="lineno">  166</span> </div>
-<div class="line"><a name="l00167"></a><span class="lineno">  167</span>         <span class="keywordflow">if</span> self.getParameterValue(self.<a class="code" href="classqgis_1_1pkextract_1_1pkextract.html#ac120a3debadb9cbd38552fcdefba2fb0">POLYGON</a>):</div>
+<div class="line"><a name="l00167"></a><span class="lineno">  167</span>         <span class="keywordflow">if</span> self.getParameterValue(self.<a class="code" href="classqgis_1_1pktools_1_1pkextract_1_1pkextract.html#aac5a26b050718715b4adfcdd5e10c6c2">POLYGON</a>):</div>
 <div class="line"><a name="l00168"></a><span class="lineno">  168</span>             commands.append(<span class="stringliteral">"-polygon"</span>)</div>
-<div class="line"><a name="l00169"></a><span class="lineno">  169</span>         buffer=self.getParameterValue(self.<a class="code" href="classqgis_1_1pkextract_1_1pkextract.html#a0052109b006ae33bb2014a05ffd9226f">BUFFER</a>)</div>
+<div class="line"><a name="l00169"></a><span class="lineno">  169</span>         buffer=self.getParameterValue(self.<a class="code" href="classqgis_1_1pktools_1_1pkextract_1_1pkextract.html#a21c89f90489c9cc008332981c12868e2">BUFFER</a>)</div>
 <div class="line"><a name="l00170"></a><span class="lineno">  170</span>         <span class="keywordflow">if</span> buffer > 1:</div>
 <div class="line"><a name="l00171"></a><span class="lineno">  171</span>             commands.append(<span class="stringliteral">"-buf"</span>)</div>
 <div class="line"><a name="l00172"></a><span class="lineno">  172</span>             commands.append(str(buffer))</div>
 <div class="line"><a name="l00173"></a><span class="lineno">  173</span> </div>
-<div class="line"><a name="l00174"></a><span class="lineno">  174</span>         srcnodata=self.getParameterValue(self.<a class="code" href="classqgis_1_1pkextract_1_1pkextract.html#ab4431ebf4ce448655fcc25366f15abd3">SRCNODATA</a>)</div>
+<div class="line"><a name="l00174"></a><span class="lineno">  174</span>         srcnodata=self.getParameterValue(self.<a class="code" href="classqgis_1_1pktools_1_1pkextract_1_1pkextract.html#adc9fa45630da5c63f41f4542bc82244f">SRCNODATA</a>)</div>
 <div class="line"><a name="l00175"></a><span class="lineno">  175</span>         <span class="keywordflow">if</span> srcnodata != <span class="stringliteral">"none"</span>:</div>
 <div class="line"><a name="l00176"></a><span class="lineno">  176</span>             srcnodataValues = srcnodata.split(<span class="stringliteral">';'</span>)</div>
 <div class="line"><a name="l00177"></a><span class="lineno">  177</span>             <span class="keywordflow">for</span> srcnodataValue <span class="keywordflow">in</span> srcnodataValues:</div>
 <div class="line"><a name="l00178"></a><span class="lineno">  178</span>                 commands.append(<span class="stringliteral">'-srcnodata'</span>)</div>
 <div class="line"><a name="l00179"></a><span class="lineno">  179</span>                 commands.append(srcnodataValue)</div>
-<div class="line"><a name="l00180"></a><span class="lineno">  180</span>         bndnodata=self.getParameterValue(self.<a class="code" href="classqgis_1_1pkextract_1_1pkextract.html#a1cb12c6b9a06225999395afa50b17987">BNDNODATA</a>)</div>
+<div class="line"><a name="l00180"></a><span class="lineno">  180</span>         bndnodata=self.getParameterValue(self.<a class="code" href="classqgis_1_1pktools_1_1pkextract_1_1pkextract.html#a222f15dc4f8abcf5ccdb34e909da8ec8">BNDNODATA</a>)</div>
 <div class="line"><a name="l00181"></a><span class="lineno">  181</span>         bndnodataValues = bndnodata.split(<span class="stringliteral">';'</span>)</div>
 <div class="line"><a name="l00182"></a><span class="lineno">  182</span>         <span class="keywordflow">for</span> bndnodataValue <span class="keywordflow">in</span> bndnodataValues:</div>
 <div class="line"><a name="l00183"></a><span class="lineno">  183</span>             commands.append(<span class="stringliteral">'-bndnodata'</span>)</div>
 <div class="line"><a name="l00184"></a><span class="lineno">  184</span>             commands.append(bndnodataValue)</div>
 <div class="line"><a name="l00185"></a><span class="lineno">  185</span> </div>
-<div class="line"><a name="l00186"></a><span class="lineno">  186</span>         extra = str(self.getParameterValue(self.<a class="code" href="classqgis_1_1pkextract_1_1pkextract.html#a741cc5d777e44ecde629f16a2499ae6c">EXTRA</a>))</div>
+<div class="line"><a name="l00186"></a><span class="lineno">  186</span>         extra = str(self.getParameterValue(self.<a class="code" href="classqgis_1_1pktools_1_1pkextract_1_1pkextract.html#afd7a165c5f77f4ad99a6f664576852dd">EXTRA</a>))</div>
 <div class="line"><a name="l00187"></a><span class="lineno">  187</span>         <span class="keywordflow">if</span> len(extra) > 0:</div>
 <div class="line"><a name="l00188"></a><span class="lineno">  188</span>             commands.append(extra)</div>
 <div class="line"><a name="l00189"></a><span class="lineno">  189</span> </div>
 <div class="line"><a name="l00190"></a><span class="lineno">  190</span>         pktoolsUtils.runpktools(commands, progress)</div>
-<div class="ttc" id="classqgis_1_1pkextract_1_1pkextract_html_ac120a3debadb9cbd38552fcdefba2fb0"><div class="ttname"><a href="classqgis_1_1pkextract_1_1pkextract.html#ac120a3debadb9cbd38552fcdefba2fb0">qgis.pkextract.pkextract.POLYGON</a></div><div class="ttdeci">string POLYGON</div><div class="ttdef"><b>Definition:</b> <a href="pkextract_8py_source.html#l00097">pkextract.py:97</a></div></div>
-<div class="ttc" id="classqgis_1_1pkextract_1_1pkextract_html_a95e1c0317ddcaeda681980e70494a638"><div class="ttname"><a href="classqgis_1_1pkextract_1_1pkextract.html#a95e1c0317ddcaeda681980e70494a638">qgis.pkextract.pkextract.INPUT</a></div><div class="ttdeci">string INPUT</div><div class="ttdef"><b>Definition:</b> <a href="pkextract_8py_source.html#l00089">pkextract.py:89</a></div></div>
-<div class="ttc" id="classqgis_1_1pkextract_1_1pkextract_html_af5bc2523851ece32499990c6b9bd64f7"><div class="ttname"><a href="classqgis_1_1pkextract_1_1pkextract.html#af5bc2523851ece32499990c6b9bd64f7">qgis.pkextract.pkextract.cliName</a></div><div class="ttdeci">def cliName</div><div class="ttdef"><b>Definition:</b> <a href="pkextract_8py_source.html#l00106">pkextract.py:106</a></div></div>
-<div class="ttc" id="classqgis_1_1pkextract_1_1pkextract_html"><div class="ttname"><a href="classqgis_1_1pkextract_1_1pkextract.html">qgis.pkextract.pkextract</a></div><div class="ttdef"><b>Definition:</b> <a href="pkextract_8py_source.html#l00087">pkextract.py:87</a></div></div>
-<div class="ttc" id="classqgis_1_1pkextract_1_1pkextract_html_a682fac32a3bbc98fe364fc9d2a46a9ed"><div class="ttname"><a href="classqgis_1_1pkextract_1_1pkextract.html#a682fac32a3bbc98fe364fc9d2a46a9ed">qgis.pkextract.pkextract.name</a></div><div class="ttdeci">name</div><div class="ttdef"><b>Definition:</b> <a href="pkextract_8py_source.html#l00110">pkextract.py:110</a></div></div>
-<div class="ttc" id="classqgis_1_1pkextract_1_1pkextract_html_a78b93513da9f4173cd4218204a77d20a"><div class="ttname"><a href="classqgis_1_1pkextract_1_1pkextract.html#a78b93513da9f4173cd4218204a77d20a">qgis.pkextract.pkextract.RULE_OPTIONS</a></div><div class="ttdeci">list RULE_OPTIONS</div><div class="ttdef"><b>Definition:</b> <a href="pkextract_8py_source.html#l00094">pkextract.py:94</a></div></div>
-<div class="ttc" id="classqgis_1_1pkextract_1_1pkextract_html_a741cc5d777e44ecde629f16a2499ae6c"><div class="ttname"><a href="classqgis_1_1pkextract_1_1pkextract.html#a741cc5d777e44ecde629f16a2499ae6c">qgis.pkextract.pkextract.EXTRA</a></div><div class="ttdeci">string EXTRA</div><div class="ttdef"><b>Definition:</b> <a href="pkextract_8py_source.html#l00102">pkextract.py:102</a></div></div>
-<div class="ttc" id="classqgis_1_1pkextract_1_1pkextract_html_a152b797f760ae98e27adbad95c3a8729"><div class="ttname"><a href="classqgis_1_1pkextract_1_1pkextract.html#a152b797f760ae98e27adbad95c3a8729">qgis.pkextract.pkextract.SAMPLE</a></div><div class="ttdeci">string SAMPLE</div><div class="ttdef"><b>Definition:</b> <a href="pkextract_8py_source.html#l00090">pkextract.py:90</a></div></div>
-<div class="ttc" id="classqgis_1_1pkextract_1_1pkextract_html_ab4431ebf4ce448655fcc25366f15abd3"><div class="ttname"><a href="classqgis_1_1pkextract_1_1pkextract.html#ab4431ebf4ce448655fcc25366f15abd3">qgis.pkextract.pkextract.SRCNODATA</a></div><div class="ttdeci">string SRCNODATA</div><div class="ttdef"><b>Definition:</b> <a href="pkextract_8py_source.html#l00099">pkextract.py:99</a></div></div>
-<div class="ttc" id="classqgis_1_1pkextract_1_1pkextract_html_a1cb12c6b9a06225999395afa50b17987"><div class="ttname"><a href="classqgis_1_1pkextract_1_1pkextract.html#a1cb12c6b9a06225999395afa50b17987">qgis.pkextract.pkextract.BNDNODATA</a></div><div class="ttdeci">string BNDNODATA</div><div class="ttdef"><b>Definition:</b> <a href="pkextract_8py_source.html#l00100">pkextract.py:100</a></div></div>
-<div class="ttc" id="classqgis_1_1pkextract_1_1pkextract_html_a0052109b006ae33bb2014a05ffd9226f"><div class="ttname"><a href="classqgis_1_1pkextract_1_1pkextract.html#a0052109b006ae33bb2014a05ffd9226f">qgis.pkextract.pkextract.BUFFER</a></div><div class="ttdeci">string BUFFER</div><div class="ttdef"><b>Definition:</b> <a href="pkextract_8py_source.html#l00098">pkextract.py:98</a></div></div>
-<div class="ttc" id="classqgis_1_1pkextract_1_1pkextract_html_ab9995a84ad157685b2d27025cdad22b0"><div class="ttname"><a href="classqgis_1_1pkextract_1_1pkextract.html#ab9995a84ad157685b2d27025cdad22b0">qgis.pkextract.pkextract.group</a></div><div class="ttdeci">group</div><div class="ttdef"><b>Definition:</b> <a href="pkextract_8py_source.html#l00111">pkextract.py:111</a></div></div>
-<div class="ttc" id="classqgis_1_1pkextract_1_1pkextract_html_aec905ae5cbf25bc9d1a4a592bff30311"><div class="ttname"><a href="classqgis_1_1pkextract_1_1pkextract.html#aec905ae5cbf25bc9d1a4a592bff30311">qgis.pkextract.pkextract.FORMAT</a></div><div class="ttdeci">string FORMAT</div><div class="ttdef"><b>Definition:</b> <a href="pkextract_8py_source.html#l00104">pkextract.py:104</a></div></div>
-<div class="ttc" id="classqgis_1_1pkextract_1_1pkextract_html_a7a00b2c269b8968376d90b0bf893df9f"><div class="ttname"><a href="classqgis_1_1pkextract_1_1pkextract.html#a7a00b2c269b8968376d90b0bf893df9f">qgis.pkextract.pkextract.ITERATE</a></div><div class="ttdeci">string ITERATE</div><div class="ttdef"><b>Definition:</b> <a href="pkextract_8py_source.html#l00091">pkextract.py:91</a></div></div>
-<div class="ttc" id="classqgis_1_1pkextract_1_1pkextract_html_af877cda3a19feb1f37d368d54680fd59"><div class="ttname"><a href="classqgis_1_1pkextract_1_1pkextract.html#af877cda3a19feb1f37d368d54680fd59">qgis.pkextract.pkextract.RULE</a></div><div class="ttdeci">string RULE</div><div class="ttdef"><b>Definition:</b> <a href="pkextract_8py_source.html#l00096">pkextract.py:96</a></div></div>
-<div class="ttc" id="classqgis_1_1pkextract_1_1pkextract_html_aebb093e7f23d360f6657f8833f5c73f3"><div class="ttname"><a href="classqgis_1_1pkextract_1_1pkextract.html#aebb093e7f23d360f6657f8833f5c73f3">qgis.pkextract.pkextract.OUTPUT</a></div><div class="ttdeci">string OUTPUT</div><div class="ttdef"><b>Definition:</b> <a href="pkextract_8py_source.html#l00092">pkextract.py:92</a></div></div>
+<div class="ttc" id="classqgis_1_1pktools_1_1pkextract_1_1pkextract_html_a3242dae21dccbdc5f1805b566fe4bc28"><div class="ttname"><a href="classqgis_1_1pktools_1_1pkextract_1_1pkextract.html#a3242dae21dccbdc5f1805b566fe4bc28">qgis.pktools.pkextract.pkextract.FORMAT</a></div><div class="ttdeci">string FORMAT</div><div class="ttdef"><b>Definition:</b> <a href="pktools_2pkextract_8py_source.html#l00104">pkextract.py:104</a></div></div>
+<div class="ttc" id="classqgis_1_1pktools_1_1pkextract_1_1pkextract_html_a3e61a3b83a4917429eb54cdbe69bf84f"><div class="ttname"><a href="classqgis_1_1pktools_1_1pkextract_1_1pkextract.html#a3e61a3b83a4917429eb54cdbe69bf84f">qgis.pktools.pkextract.pkextract.RULE_OPTIONS</a></div><div class="ttdeci">list RULE_OPTIONS</div><div class="ttdef"><b>Definition:</b> <a href="pktools_2pkextract_8py_source.html#l00094">pkextract.py:94</a></div></div>
+<div class="ttc" id="classqgis_1_1pktools_1_1pkextract_1_1pkextract_html_ae279e3125dc30a09e1430c5e76b473cb"><div class="ttname"><a href="classqgis_1_1pktools_1_1pkextract_1_1pkextract.html#ae279e3125dc30a09e1430c5e76b473cb">qgis.pktools.pkextract.pkextract.group</a></div><div class="ttdeci">group</div><div class="ttdef"><b>Definition:</b> <a href="pktools_2pkextract_8py_source.html#l00111">pkextract.py:111</a></div></div>
+<div class="ttc" id="classqgis_1_1pktools_1_1pkextract_1_1pkextract_html"><div class="ttname"><a href="classqgis_1_1pktools_1_1pkextract_1_1pkextract.html">qgis.pktools.pkextract.pkextract</a></div><div class="ttdef"><b>Definition:</b> <a href="pktools_2pkextract_8py_source.html#l00087">pkextract.py:87</a></div></div>
+<div class="ttc" id="classqgis_1_1pktools_1_1pkextract_1_1pkextract_html_adc9fa45630da5c63f41f4542bc82244f"><div class="ttname"><a href="classqgis_1_1pktools_1_1pkextract_1_1pkextract.html#adc9fa45630da5c63f41f4542bc82244f">qgis.pktools.pkextract.pkextract.SRCNODATA</a></div><div class="ttdeci">string SRCNODATA</div><div class="ttdef"><b>Definition:</b> <a href="pktools_2pkextract_8py_source.html#l00099">pkextract.py:99</a></div></div>
+<div class="ttc" id="classqgis_1_1pktools_1_1pkextract_1_1pkextract_html_afd7a165c5f77f4ad99a6f664576852dd"><div class="ttname"><a href="classqgis_1_1pktools_1_1pkextract_1_1pkextract.html#afd7a165c5f77f4ad99a6f664576852dd">qgis.pktools.pkextract.pkextract.EXTRA</a></div><div class="ttdeci">string EXTRA</div><div class="ttdef"><b>Definition:</b> <a href="pktools_2pkextract_8py_source.html#l00102">pkextract.py:102</a></div></div>
+<div class="ttc" id="classqgis_1_1pktools_1_1pkextract_1_1pkextract_html_ae049566d661a688af829c9a068df729e"><div class="ttname"><a href="classqgis_1_1pktools_1_1pkextract_1_1pkextract.html#ae049566d661a688af829c9a068df729e">qgis.pktools.pkextract.pkextract.cliName</a></div><div class="ttdeci">def cliName</div><div class="ttdef"><b>Definition:</b> <a href="pktools_2pkextract_8py_source.html#l00106">pkextract.py:106</a></div></div>
+<div class="ttc" id="classqgis_1_1pktools_1_1pkextract_1_1pkextract_html_aac5a26b050718715b4adfcdd5e10c6c2"><div class="ttname"><a href="classqgis_1_1pktools_1_1pkextract_1_1pkextract.html#aac5a26b050718715b4adfcdd5e10c6c2">qgis.pktools.pkextract.pkextract.POLYGON</a></div><div class="ttdeci">string POLYGON</div><div class="ttdef"><b>Definition:</b> <a href="pktools_2pkextract_8py_source.html#l00097">pkextract.py:97</a></div></div>
+<div class="ttc" id="classqgis_1_1pktools_1_1pkextract_1_1pkextract_html_a21c89f90489c9cc008332981c12868e2"><div class="ttname"><a href="classqgis_1_1pktools_1_1pkextract_1_1pkextract.html#a21c89f90489c9cc008332981c12868e2">qgis.pktools.pkextract.pkextract.BUFFER</a></div><div class="ttdeci">string BUFFER</div><div class="ttdef"><b>Definition:</b> <a href="pktools_2pkextract_8py_source.html#l00098">pkextract.py:98</a></div></div>
+<div class="ttc" id="classqgis_1_1pktools_1_1pkextract_1_1pkextract_html_a6997d33d8c4528dc3e278af16188ac1d"><div class="ttname"><a href="classqgis_1_1pktools_1_1pkextract_1_1pkextract.html#a6997d33d8c4528dc3e278af16188ac1d">qgis.pktools.pkextract.pkextract.RULE</a></div><div class="ttdeci">string RULE</div><div class="ttdef"><b>Definition:</b> <a href="pktools_2pkextract_8py_source.html#l00096">pkextract.py:96</a></div></div>
+<div class="ttc" id="classqgis_1_1pktools_1_1pkextract_1_1pkextract_html_a257192faedfabf32e503d72a2f34f459"><div class="ttname"><a href="classqgis_1_1pktools_1_1pkextract_1_1pkextract.html#a257192faedfabf32e503d72a2f34f459">qgis.pktools.pkextract.pkextract.INPUT</a></div><div class="ttdeci">string INPUT</div><div class="ttdef"><b>Definition:</b> <a href="pktools_2pkextract_8py_source.html#l00089">pkextract.py:89</a></div></div>
+<div class="ttc" id="classqgis_1_1pktools_1_1pkextract_1_1pkextract_html_a5797ede6cc9265a846e09a4f5ff31292"><div class="ttname"><a href="classqgis_1_1pktools_1_1pkextract_1_1pkextract.html#a5797ede6cc9265a846e09a4f5ff31292">qgis.pktools.pkextract.pkextract.ITERATE</a></div><div class="ttdeci">string ITERATE</div><div class="ttdef"><b>Definition:</b> <a href="pktools_2pkextract_8py_source.html#l00091">pkextract.py:91</a></div></div>
+<div class="ttc" id="classqgis_1_1pktools_1_1pkextract_1_1pkextract_html_a222f15dc4f8abcf5ccdb34e909da8ec8"><div class="ttname"><a href="classqgis_1_1pktools_1_1pkextract_1_1pkextract.html#a222f15dc4f8abcf5ccdb34e909da8ec8">qgis.pktools.pkextract.pkextract.BNDNODATA</a></div><div class="ttdeci">string BNDNODATA</div><div class="ttdef"><b>Definition:</b> <a href="pktools_2pkextract_8py_source.html#l00100">pkextract.py:100</a></div></div>
+<div class="ttc" id="classqgis_1_1pktools_1_1pkextract_1_1pkextract_html_a481ae866b7a60d1f8ec47f0caa8d3d6b"><div class="ttname"><a href="classqgis_1_1pktools_1_1pkextract_1_1pkextract.html#a481ae866b7a60d1f8ec47f0caa8d3d6b">qgis.pktools.pkextract.pkextract.OUTPUT</a></div><div class="ttdeci">string OUTPUT</div><div class="ttdef"><b>Definition:</b> <a href="pktools_2pkextract_8py_source.html#l00092">pkextract.py:92</a></div></div>
+<div class="ttc" id="classqgis_1_1pktools_1_1pkextract_1_1pkextract_html_ab9efcad6e33e229054cd88a80d2e31ff"><div class="ttname"><a href="classqgis_1_1pktools_1_1pkextract_1_1pkextract.html#ab9efcad6e33e229054cd88a80d2e31ff">qgis.pktools.pkextract.pkextract.name</a></div><div class="ttdeci">name</div><div class="ttdef"><b>Definition:</b> <a href="pktools_2pkextract_8py_source.html#l00110">pkextract.py:110</a></div></div>
+<div class="ttc" id="classqgis_1_1pktools_1_1pkextract_1_1pkextract_html_a7e6d595c2e44bf7b9634f917bca79c61"><div class="ttname"><a href="classqgis_1_1pktools_1_1pkextract_1_1pkextract.html#a7e6d595c2e44bf7b9634f917bca79c61">qgis.pktools.pkextract.pkextract.SAMPLE</a></div><div class="ttdeci">string SAMPLE</div><div class="ttdef"><b>Definition:</b> <a href="pktools_2pkextract_8py_source.html#l00090">pkextract.py:90</a></div></div>
 </div><!-- fragment --></div><!-- contents -->
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Jun 23 2015 17:09:36 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Tue Nov 3 2015 15:58:26 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/pkextract__grid_8py_source.html b/doc/html/pktools_2pkextract__grid_8py_source.html
similarity index 69%
copy from doc/html/pkextract__grid_8py_source.html
copy to doc/html/pktools_2pkextract__grid_8py_source.html
index 1b80f7a..3853894 100644
--- a/doc/html/pkextract__grid_8py_source.html
+++ b/doc/html/pktools_2pkextract__grid_8py_source.html
@@ -4,7 +4,7 @@
 <meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
 <meta http-equiv="X-UA-Compatible" content="IE=9"/>
 <meta name="generator" content="Doxygen 1.8.6"/>
-<title>pktools: /home/kempenep/pktools/qgis/pkextract_grid.py Source File</title>
+<title>pktools: /home/kempenep/pktools/qgis/pktools/pkextract_grid.py Source File</title>
 <link href="tabs.css" rel="stylesheet" type="text/css"/>
 <script type="text/javascript" src="jquery.js"></script>
 <script type="text/javascript" src="dynsections.js"></script>
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.3</span>
+    <span id="projectnumber">2.6.4</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -44,7 +44,7 @@
   </div>
 <div id="nav-path" class="navpath">
   <ul>
-<li class="navelem"><a class="el" href="dir_5785acc8d2e42f8795bdbe936856f26d.html">qgis</a></li>  </ul>
+<li class="navelem"><a class="el" href="dir_5785acc8d2e42f8795bdbe936856f26d.html">qgis</a></li><li class="navelem"><a class="el" href="dir_b7cc22b4453454f1e686d9a2e78d988d.html">pktools</a></li>  </ul>
 </div>
 </div><!-- top -->
 <div class="header">
@@ -138,7 +138,7 @@
 <div class="line"><a name="l00084"></a><span class="lineno">   84</span>     <span class="stringliteral">'.pdf'</span>,</div>
 <div class="line"><a name="l00085"></a><span class="lineno">   85</span> ]</div>
 <div class="line"><a name="l00086"></a><span class="lineno">   86</span> </div>
-<div class="line"><a name="l00087"></a><span class="lineno"><a class="line" href="classqgis_1_1pkextract__grid_1_1pkextract__grid.html">   87</a></span> <span class="keyword">class </span><a class="code" href="classqgis_1_1pkextract__grid_1_1pkextract__grid.html">pkextract_grid</a>(pktoolsAlgorithm):</div>
+<div class="line"><a name="l00087"></a><span class="lineno"><a class="line" href="classqgis_1_1pktools_1_1pkextract__grid_1_1pkextract__grid.html">   87</a></span> <span class="keyword">class </span><a class="code" href="classqgis_1_1pktools_1_1pkextract__grid_1_1pkextract__grid.html">pkextract_grid</a>(pktoolsAlgorithm):</div>
 <div class="line"><a name="l00088"></a><span class="lineno">   88</span> </div>
 <div class="line"><a name="l00089"></a><span class="lineno">   89</span>     INPUT = <span class="stringliteral">"INPUT"</span></div>
 <div class="line"><a name="l00090"></a><span class="lineno">   90</span>     OUTPUT = <span class="stringliteral">"OUTPUT"</span></div>
@@ -159,36 +159,36 @@
 <div class="line"><a name="l00105"></a><span class="lineno">  105</span>         <span class="keywordflow">return</span> <span class="stringliteral">"pkextract"</span></div>
 <div class="line"><a name="l00106"></a><span class="lineno">  106</span> </div>
 <div class="line"><a name="l00107"></a><span class="lineno">  107</span>     <span class="keyword">def </span>defineCharacteristics(self):</div>
-<div class="line"><a name="l00108"></a><span class="lineno">  108</span>         self.<a class="code" href="classqgis_1_1pkextract__grid_1_1pkextract__grid.html#aa9a3742d6a3703e840c7bc463740fb46">name</a> = <span class="stringliteral">"extract regular grid"</span></div>
-<div class="line"><a name="l00109"></a><span class="lineno">  109</span>         self.<a class="code" href="classqgis_1_1pkextract__grid_1_1pkextract__grid.html#a481d147d56925a1ab75e18b1c8f145fc">group</a> = <span class="stringliteral">"[pktools] raster/vector"</span></div>
-<div class="line"><a name="l00110"></a><span class="lineno">  110</span>         self.addParameter(ParameterRaster(self.<a class="code" href="classqgis_1_1pkextract__grid_1_1pkextract__grid.html#ad359b649a15e3dbd0795278b984c6b23">INPUT</a>, <span class="stringliteral">'Input raster data set'</span>))</div>
-<div class="line"><a name="l00111"></a><span class="lineno">  111</span>         self.addParameter(ParameterSelection(self.<a class="code" href="classqgis_1_1pkextract__grid_1_1pkextract__grid.html#a8b1c35d0229515eb8a9a4f74fbb27df2">RULE</a>,<span class="stringliteral">"extraction rule"</span>,self.<a class="code" href="classqgis_1_1pkextract__grid_1_1pkextract__grid.html#aff9ec53af87f8f28b82ea13707ed31a3">RULE_OPTIONS</a>, 0))</div>
+<div class="line"><a name="l00108"></a><span class="lineno">  108</span>         self.<a class="code" href="classqgis_1_1pktools_1_1pkextract__grid_1_1pkextract__grid.html#af13c9efdff741494bfb58c8b10d4b53e">name</a> = <span class="stringliteral">"extract regular grid"</span></div>
+<div class="line"><a name="l00109"></a><span class="lineno">  109</span>         self.<a class="code" href="classqgis_1_1pktools_1_1pkextract__grid_1_1pkextract__grid.html#a09ae45118a775983455e10ecc7959004">group</a> = <span class="stringliteral">"[pktools] raster/vector"</span></div>
+<div class="line"><a name="l00110"></a><span class="lineno">  110</span>         self.addParameter(ParameterRaster(self.<a class="code" href="classqgis_1_1pktools_1_1pkextract__grid_1_1pkextract__grid.html#a5412a66f1947ac26ccbd630b71428157">INPUT</a>, <span class="stringliteral">'Input raster data set'</span>))</div>
+<div class="line"><a name="l00111"></a><span class="lineno">  111</span>         self.addParameter(ParameterSelection(self.<a class="code" href="classqgis_1_1pktools_1_1pkextract__grid_1_1pkextract__grid.html#a694eeda5f32f8f58ec20b873a2c31333">RULE</a>,<span class="stringliteral">"extraction rule"</span>,self.<a class="code" href="classqgis_1_1pktools_1_1pkextract__grid_1_1pkextract__grid.html#a3fb178091872bc1872478de700caf1b4">RULE_OPTIONS</a>, 0))</div>
 <div class="line"><a name="l00112"></a><span class="lineno">  112</span> </div>
-<div class="line"><a name="l00113"></a><span class="lineno">  113</span>         self.addOutput(OutputVector(self.<a class="code" href="classqgis_1_1pkextract__grid_1_1pkextract__grid.html#a59fa1c64049fbed2cc81548cf5d0e3a8">OUTPUT</a>, <span class="stringliteral">'Output vector data set'</span>))</div>
-<div class="line"><a name="l00114"></a><span class="lineno">  114</span>         self.addParameter(ParameterSelection(self.<a class="code" href="classqgis_1_1pkextract__grid_1_1pkextract__grid.html#a4f170fcdea30859ad29048d61e90ce8b">FORMAT</a>,</div>
+<div class="line"><a name="l00113"></a><span class="lineno">  113</span>         self.addOutput(OutputVector(self.<a class="code" href="classqgis_1_1pktools_1_1pkextract__grid_1_1pkextract__grid.html#a6064a8e5b885a1bad7a28957e70e1cdc">OUTPUT</a>, <span class="stringliteral">'Output vector data set'</span>))</div>
+<div class="line"><a name="l00114"></a><span class="lineno">  114</span>         self.addParameter(ParameterSelection(self.<a class="code" href="classqgis_1_1pktools_1_1pkextract__grid_1_1pkextract__grid.html#a064ad85bca7f4be990fbb62d99a89ba1">FORMAT</a>,</div>
 <div class="line"><a name="l00115"></a><span class="lineno">  115</span>                           <span class="stringliteral">'Destination Format'</span>, FORMATS))</div>
-<div class="line"><a name="l00116"></a><span class="lineno">  116</span>         self.addParameter(ParameterBoolean(self.<a class="code" href="classqgis_1_1pkextract__grid_1_1pkextract__grid.html#adaea5d0be7bd0435fdd3f6a42dc4c80f">POLYGON</a>, <span class="stringliteral">"Create OGRPolygon as geometry instead of OGRPoint"</span>,<span class="keyword">False</span>))</div>
-<div class="line"><a name="l00117"></a><span class="lineno">  117</span>         self.addParameter(ParameterNumber(self.<a class="code" href="classqgis_1_1pkextract__grid_1_1pkextract__grid.html#a1c07170b9f1999083d925f16c78e5ab1">BUFFER</a>, <span class="stringliteral">"Buffer for calculating statistics for point features"</span>,1,25,1))</div>
-<div class="line"><a name="l00118"></a><span class="lineno">  118</span>         self.addParameter(ParameterNumber(self.<a class="code" href="classqgis_1_1pkextract__grid_1_1pkextract__grid.html#a914f319e7a3734966056b0e396e4b0a1">GRID</a>, <span class="stringliteral">"Cell grid size (in projected units, e.g,. m)"</span>,0,1000000,1))</div>
+<div class="line"><a name="l00116"></a><span class="lineno">  116</span>         self.addParameter(ParameterBoolean(self.<a class="code" href="classqgis_1_1pktools_1_1pkextract__grid_1_1pkextract__grid.html#a7834e2f6a8d96793e5d50c379d69495f">POLYGON</a>, <span class="stringliteral">"Create OGRPolygon as geometry instead of OGRPoint"</span>,<span class="keyword">False</span>))</div>
+<div class="line"><a name="l00117"></a><span class="lineno">  117</span>         self.addParameter(ParameterNumber(self.<a class="code" href="classqgis_1_1pktools_1_1pkextract__grid_1_1pkextract__grid.html#af200c24667122672e45fd9d6f5067efd">BUFFER</a>, <span class="stringliteral">"Buffer for calculating statistics for point features"</span>,1,25,1))</div>
+<div class="line"><a name="l00118"></a><span class="lineno">  118</span>         self.addParameter(ParameterNumber(self.<a class="code" href="classqgis_1_1pktools_1_1pkextract__grid_1_1pkextract__grid.html#a90b6bcee6161de183851f985a02be337">GRID</a>, <span class="stringliteral">"Cell grid size (in projected units, e.g,. m)"</span>,0,1000000,1))</div>
 <div class="line"><a name="l00119"></a><span class="lineno">  119</span> </div>
-<div class="line"><a name="l00120"></a><span class="lineno">  120</span>         self.addParameter(ParameterString(self.<a class="code" href="classqgis_1_1pkextract__grid_1_1pkextract__grid.html#a2b5e358b248cb62615584a90d651fea1">SRCNODATA</a>, <span class="stringliteral">"invalid value(s) for input raster dataset (e.g., 0;255)"</span>,<span class="stringliteral">"none"</span>))</div>
-<div class="line"><a name="l00121"></a><span class="lineno">  121</span>         self.addParameter(ParameterString(self.<a class="code" href="classqgis_1_1pkextract__grid_1_1pkextract__grid.html#a458c8ea888792f63f8000afe8b6a5c6e">BNDNODATA</a>, <span class="stringliteral">"Band(s) in input image to check if pixel is valid (e.g., 0;1)"</span>,<span class="stringliteral">"0"</span>))</div>
-<div class="line"><a name="l00122"></a><span class="lineno">  122</span>         self.addParameter(ParameterString(self.<a class="code" href="classqgis_1_1pkextract__grid_1_1pkextract__grid.html#a058e183281127755bd1d851b3788138c">EXTRA</a>, <span class="stringliteral">'Additional parameters'</span>, <span class="stringliteral">''</span>, optional=<span class="keyword">True</span>))</div>
+<div class="line"><a name="l00120"></a><span class="lineno">  120</span>         self.addParameter(ParameterString(self.<a class="code" href="classqgis_1_1pktools_1_1pkextract__grid_1_1pkextract__grid.html#a567185dde201a783080d4e480a3f658b">SRCNODATA</a>, <span class="stringliteral">"invalid value(s) for input raster dataset (e.g., 0;255)"</span>,<span class="stringliteral">"none"</span>))</div>
+<div class="line"><a name="l00121"></a><span class="lineno">  121</span>         self.addParameter(ParameterString(self.<a class="code" href="classqgis_1_1pktools_1_1pkextract__grid_1_1pkextract__grid.html#a67f2914362c1595ea342a4b3a7a4715f">BNDNODATA</a>, <span class="stringliteral">"Band(s) in input image to check if pixel is valid (e.g., 0;1)"</span>,<span class="stringliteral">"0"</span>))</div>
+<div class="line"><a name="l00122"></a><span class="lineno">  122</span>         self.addParameter(ParameterString(self.<a class="code" href="classqgis_1_1pktools_1_1pkextract__grid_1_1pkextract__grid.html#acb46e5b74179c65a686d0a6e5f49d226">EXTRA</a>, <span class="stringliteral">'Additional parameters'</span>, <span class="stringliteral">''</span>, optional=<span class="keyword">True</span>))</div>
 <div class="line"><a name="l00123"></a><span class="lineno">  123</span> </div>
 <div class="line"><a name="l00124"></a><span class="lineno">  124</span>     <span class="keyword">def </span>processAlgorithm(self, progress):</div>
-<div class="line"><a name="l00125"></a><span class="lineno">  125</span>         cliPath = <span class="stringliteral">'"'</span> + os.path.join(pktoolsUtils.pktoolsPath(), self.<a class="code" href="classqgis_1_1pkextract__grid_1_1pkextract__grid.html#aa939f27236fbd7a0919bcb66b214b8c9">cliName</a>()) + <span class="stringliteral">'"'</span></div>
+<div class="line"><a name="l00125"></a><span class="lineno">  125</span>         cliPath = <span class="stringliteral">'"'</span> + os.path.join(pktoolsUtils.pktoolsPath(), self.<a class="code" href="classqgis_1_1pktools_1_1pkextract__grid_1_1pkextract__grid.html#aa8f2f067f0a059b531c53a38b1a85308">cliName</a>()) + <span class="stringliteral">'"'</span></div>
 <div class="line"><a name="l00126"></a><span class="lineno">  126</span>         commands = [cliPath]</div>
 <div class="line"><a name="l00127"></a><span class="lineno">  127</span> </div>
-<div class="line"><a name="l00128"></a><span class="lineno">  128</span>         input=self.getParameterValue(self.<a class="code" href="classqgis_1_1pkextract__grid_1_1pkextract__grid.html#ad359b649a15e3dbd0795278b984c6b23">INPUT</a>)</div>
+<div class="line"><a name="l00128"></a><span class="lineno">  128</span>         input=self.getParameterValue(self.<a class="code" href="classqgis_1_1pktools_1_1pkextract__grid_1_1pkextract__grid.html#a5412a66f1947ac26ccbd630b71428157">INPUT</a>)</div>
 <div class="line"><a name="l00129"></a><span class="lineno">  129</span>         commands.append(<span class="stringliteral">'-i'</span>)</div>
 <div class="line"><a name="l00130"></a><span class="lineno">  130</span>         commands.append(<span class="stringliteral">'"'</span> + input + <span class="stringliteral">'"'</span>)</div>
 <div class="line"><a name="l00131"></a><span class="lineno">  131</span> </div>
 <div class="line"><a name="l00132"></a><span class="lineno">  132</span>         commands.append(<span class="stringliteral">"-r"</span>)</div>
-<div class="line"><a name="l00133"></a><span class="lineno">  133</span>         commands.append(self.<a class="code" href="classqgis_1_1pkextract__grid_1_1pkextract__grid.html#aff9ec53af87f8f28b82ea13707ed31a3">RULE_OPTIONS</a>[self.getParameterValue(self.<a class="code" href="classqgis_1_1pkextract__grid_1_1pkextract__grid.html#a8b1c35d0229515eb8a9a4f74fbb27df2">RULE</a>)])</div>
+<div class="line"><a name="l00133"></a><span class="lineno">  133</span>         commands.append(self.<a class="code" href="classqgis_1_1pktools_1_1pkextract__grid_1_1pkextract__grid.html#a3fb178091872bc1872478de700caf1b4">RULE_OPTIONS</a>[self.getParameterValue(self.<a class="code" href="classqgis_1_1pktools_1_1pkextract__grid_1_1pkextract__grid.html#a694eeda5f32f8f58ec20b873a2c31333">RULE</a>)])</div>
 <div class="line"><a name="l00134"></a><span class="lineno">  134</span> </div>
-<div class="line"><a name="l00135"></a><span class="lineno">  135</span>         output = self.getOutputFromName(self.<a class="code" href="classqgis_1_1pkextract__grid_1_1pkextract__grid.html#a59fa1c64049fbed2cc81548cf5d0e3a8">OUTPUT</a>)</div>
+<div class="line"><a name="l00135"></a><span class="lineno">  135</span>         output = self.getOutputFromName(self.<a class="code" href="classqgis_1_1pktools_1_1pkextract__grid_1_1pkextract__grid.html#a6064a8e5b885a1bad7a28957e70e1cdc">OUTPUT</a>)</div>
 <div class="line"><a name="l00136"></a><span class="lineno">  136</span>         outFile = output.value</div>
-<div class="line"><a name="l00137"></a><span class="lineno">  137</span>         formatIdx = self.getParameterValue(self.<a class="code" href="classqgis_1_1pkextract__grid_1_1pkextract__grid.html#a4f170fcdea30859ad29048d61e90ce8b">FORMAT</a>)</div>
+<div class="line"><a name="l00137"></a><span class="lineno">  137</span>         formatIdx = self.getParameterValue(self.<a class="code" href="classqgis_1_1pktools_1_1pkextract__grid_1_1pkextract__grid.html#a064ad85bca7f4be990fbb62d99a89ba1">FORMAT</a>)</div>
 <div class="line"><a name="l00138"></a><span class="lineno">  138</span>         outFormat = <span class="stringliteral">'"'</span> + FORMATS[formatIdx] + <span class="stringliteral">'"'</span></div>
 <div class="line"><a name="l00139"></a><span class="lineno">  139</span>         commands.append(<span class="stringliteral">'-f'</span>)</div>
 <div class="line"><a name="l00140"></a><span class="lineno">  140</span>         commands.append(outFormat)</div>
@@ -199,54 +199,54 @@
 <div class="line"><a name="l00145"></a><span class="lineno">  145</span>         commands.append(<span class="stringliteral">'-o'</span>)</div>
 <div class="line"><a name="l00146"></a><span class="lineno">  146</span>         commands.append(<span class="stringliteral">'"'</span> + outFile + <span class="stringliteral">'"'</span>)</div>
 <div class="line"><a name="l00147"></a><span class="lineno">  147</span> </div>
-<div class="line"><a name="l00148"></a><span class="lineno">  148</span>         <span class="keywordflow">if</span> self.getParameterValue(self.<a class="code" href="classqgis_1_1pkextract__grid_1_1pkextract__grid.html#adaea5d0be7bd0435fdd3f6a42dc4c80f">POLYGON</a>):</div>
+<div class="line"><a name="l00148"></a><span class="lineno">  148</span>         <span class="keywordflow">if</span> self.getParameterValue(self.<a class="code" href="classqgis_1_1pktools_1_1pkextract__grid_1_1pkextract__grid.html#a7834e2f6a8d96793e5d50c379d69495f">POLYGON</a>):</div>
 <div class="line"><a name="l00149"></a><span class="lineno">  149</span>             commands.append(<span class="stringliteral">"-polygon"</span>)</div>
-<div class="line"><a name="l00150"></a><span class="lineno">  150</span>         buffer=self.getParameterValue(self.<a class="code" href="classqgis_1_1pkextract__grid_1_1pkextract__grid.html#a1c07170b9f1999083d925f16c78e5ab1">BUFFER</a>)</div>
+<div class="line"><a name="l00150"></a><span class="lineno">  150</span>         buffer=self.getParameterValue(self.<a class="code" href="classqgis_1_1pktools_1_1pkextract__grid_1_1pkextract__grid.html#af200c24667122672e45fd9d6f5067efd">BUFFER</a>)</div>
 <div class="line"><a name="l00151"></a><span class="lineno">  151</span>         <span class="keywordflow">if</span> buffer > 1:</div>
 <div class="line"><a name="l00152"></a><span class="lineno">  152</span>             commands.append(<span class="stringliteral">"-buf"</span>)</div>
 <div class="line"><a name="l00153"></a><span class="lineno">  153</span>             commands.append(str(buffer))</div>
 <div class="line"><a name="l00154"></a><span class="lineno">  154</span> </div>
-<div class="line"><a name="l00155"></a><span class="lineno">  155</span>         <span class="keywordflow">if</span> self.getParameterValue(self.<a class="code" href="classqgis_1_1pkextract__grid_1_1pkextract__grid.html#a914f319e7a3734966056b0e396e4b0a1">GRID</a>) > 0:</div>
+<div class="line"><a name="l00155"></a><span class="lineno">  155</span>         <span class="keywordflow">if</span> self.getParameterValue(self.<a class="code" href="classqgis_1_1pktools_1_1pkextract__grid_1_1pkextract__grid.html#a90b6bcee6161de183851f985a02be337">GRID</a>) > 0:</div>
 <div class="line"><a name="l00156"></a><span class="lineno">  156</span>             commands.append(<span class="stringliteral">"-grid"</span>)</div>
-<div class="line"><a name="l00157"></a><span class="lineno">  157</span>             commands.append(str(self.getParameterValue(self.<a class="code" href="classqgis_1_1pkextract__grid_1_1pkextract__grid.html#a914f319e7a3734966056b0e396e4b0a1">GRID</a>)))</div>
+<div class="line"><a name="l00157"></a><span class="lineno">  157</span>             commands.append(str(self.getParameterValue(self.<a class="code" href="classqgis_1_1pktools_1_1pkextract__grid_1_1pkextract__grid.html#a90b6bcee6161de183851f985a02be337">GRID</a>)))</div>
 <div class="line"><a name="l00158"></a><span class="lineno">  158</span> </div>
-<div class="line"><a name="l00159"></a><span class="lineno">  159</span>         srcnodata=self.getParameterValue(self.<a class="code" href="classqgis_1_1pkextract__grid_1_1pkextract__grid.html#a2b5e358b248cb62615584a90d651fea1">SRCNODATA</a>)</div>
+<div class="line"><a name="l00159"></a><span class="lineno">  159</span>         srcnodata=self.getParameterValue(self.<a class="code" href="classqgis_1_1pktools_1_1pkextract__grid_1_1pkextract__grid.html#a567185dde201a783080d4e480a3f658b">SRCNODATA</a>)</div>
 <div class="line"><a name="l00160"></a><span class="lineno">  160</span>         <span class="keywordflow">if</span> srcnodata != <span class="stringliteral">"none"</span>:</div>
 <div class="line"><a name="l00161"></a><span class="lineno">  161</span>             srcnodataValues = srcnodata.split(<span class="stringliteral">';'</span>)</div>
 <div class="line"><a name="l00162"></a><span class="lineno">  162</span>             <span class="keywordflow">for</span> srcnodataValue <span class="keywordflow">in</span> srcnodataValues:</div>
 <div class="line"><a name="l00163"></a><span class="lineno">  163</span>                 commands.append(<span class="stringliteral">'-srcnodata'</span>)</div>
 <div class="line"><a name="l00164"></a><span class="lineno">  164</span>                 commands.append(srcnodataValue)</div>
-<div class="line"><a name="l00165"></a><span class="lineno">  165</span>         bndnodata=self.getParameterValue(self.<a class="code" href="classqgis_1_1pkextract__grid_1_1pkextract__grid.html#a458c8ea888792f63f8000afe8b6a5c6e">BNDNODATA</a>)</div>
+<div class="line"><a name="l00165"></a><span class="lineno">  165</span>         bndnodata=self.getParameterValue(self.<a class="code" href="classqgis_1_1pktools_1_1pkextract__grid_1_1pkextract__grid.html#a67f2914362c1595ea342a4b3a7a4715f">BNDNODATA</a>)</div>
 <div class="line"><a name="l00166"></a><span class="lineno">  166</span>         bndnodataValues = bndnodata.split(<span class="stringliteral">';'</span>)</div>
 <div class="line"><a name="l00167"></a><span class="lineno">  167</span>         <span class="keywordflow">for</span> bndnodataValue <span class="keywordflow">in</span> bndnodataValues:</div>
 <div class="line"><a name="l00168"></a><span class="lineno">  168</span>             commands.append(<span class="stringliteral">'-bndnodata'</span>)</div>
 <div class="line"><a name="l00169"></a><span class="lineno">  169</span>             commands.append(bndnodataValue)</div>
 <div class="line"><a name="l00170"></a><span class="lineno">  170</span> </div>
-<div class="line"><a name="l00171"></a><span class="lineno">  171</span>         extra = str(self.getParameterValue(self.<a class="code" href="classqgis_1_1pkextract__grid_1_1pkextract__grid.html#a058e183281127755bd1d851b3788138c">EXTRA</a>))</div>
+<div class="line"><a name="l00171"></a><span class="lineno">  171</span>         extra = str(self.getParameterValue(self.<a class="code" href="classqgis_1_1pktools_1_1pkextract__grid_1_1pkextract__grid.html#acb46e5b74179c65a686d0a6e5f49d226">EXTRA</a>))</div>
 <div class="line"><a name="l00172"></a><span class="lineno">  172</span>         <span class="keywordflow">if</span> len(extra) > 0:</div>
 <div class="line"><a name="l00173"></a><span class="lineno">  173</span>             commands.append(extra)</div>
 <div class="line"><a name="l00174"></a><span class="lineno">  174</span> </div>
 <div class="line"><a name="l00175"></a><span class="lineno">  175</span>         pktoolsUtils.runpktools(commands, progress)</div>
-<div class="ttc" id="classqgis_1_1pkextract__grid_1_1pkextract__grid_html_a458c8ea888792f63f8000afe8b6a5c6e"><div class="ttname"><a href="classqgis_1_1pkextract__grid_1_1pkextract__grid.html#a458c8ea888792f63f8000afe8b6a5c6e">qgis.pkextract_grid.pkextract_grid.BNDNODATA</a></div><div class="ttdeci">string BNDNODATA</div><div class="ttdef"><b>Definition:</b> <a href="pkextract__grid_8py_source.html#l00099">pkextract_grid.py:99</a></div></div>
-<div class="ttc" id="classqgis_1_1pkextract__grid_1_1pkextract__grid_html_a8b1c35d0229515eb8a9a4f74fbb27df2"><div class="ttname"><a href="classqgis_1_1pkextract__grid_1_1pkextract__grid.html#a8b1c35d0229515eb8a9a4f74fbb27df2">qgis.pkextract_grid.pkextract_grid.RULE</a></div><div class="ttdeci">string RULE</div><div class="ttdef"><b>Definition:</b> <a href="pkextract__grid_8py_source.html#l00094">pkextract_grid.py:94</a></div></div>
-<div class="ttc" id="classqgis_1_1pkextract__grid_1_1pkextract__grid_html_a4f170fcdea30859ad29048d61e90ce8b"><div class="ttname"><a href="classqgis_1_1pkextract__grid_1_1pkextract__grid.html#a4f170fcdea30859ad29048d61e90ce8b">qgis.pkextract_grid.pkextract_grid.FORMAT</a></div><div class="ttdeci">string FORMAT</div><div class="ttdef"><b>Definition:</b> <a href="pkextract__grid_8py_source.html#l00102">pkextract_grid.py:102</a></div></div>
-<div class="ttc" id="classqgis_1_1pkextract__grid_1_1pkextract__grid_html"><div class="ttname"><a href="classqgis_1_1pkextract__grid_1_1pkextract__grid.html">qgis.pkextract_grid.pkextract_grid</a></div><div class="ttdef"><b>Definition:</b> <a href="pkextract__grid_8py_source.html#l00087">pkextract_grid.py:87</a></div></div>
-<div class="ttc" id="classqgis_1_1pkextract__grid_1_1pkextract__grid_html_a058e183281127755bd1d851b3788138c"><div class="ttname"><a href="classqgis_1_1pkextract__grid_1_1pkextract__grid.html#a058e183281127755bd1d851b3788138c">qgis.pkextract_grid.pkextract_grid.EXTRA</a></div><div class="ttdeci">string EXTRA</div><div class="ttdef"><b>Definition:</b> <a href="pkextract__grid_8py_source.html#l00100">pkextract_grid.py:100</a></div></div>
-<div class="ttc" id="classqgis_1_1pkextract__grid_1_1pkextract__grid_html_aff9ec53af87f8f28b82ea13707ed31a3"><div class="ttname"><a href="classqgis_1_1pkextract__grid_1_1pkextract__grid.html#aff9ec53af87f8f28b82ea13707ed31a3">qgis.pkextract_grid.pkextract_grid.RULE_OPTIONS</a></div><div class="ttdeci">list RULE_OPTIONS</div><div class="ttdef"><b>Definition:</b> <a href="pkextract__grid_8py_source.html#l00092">pkextract_grid.py:92</a></div></div>
-<div class="ttc" id="classqgis_1_1pkextract__grid_1_1pkextract__grid_html_a59fa1c64049fbed2cc81548cf5d0e3a8"><div class="ttname"><a href="classqgis_1_1pkextract__grid_1_1pkextract__grid.html#a59fa1c64049fbed2cc81548cf5d0e3a8">qgis.pkextract_grid.pkextract_grid.OUTPUT</a></div><div class="ttdeci">string OUTPUT</div><div class="ttdef"><b>Definition:</b> <a href="pkextract__grid_8py_source.html#l00090">pkextract_grid.py:90</a></div></div>
-<div class="ttc" id="classqgis_1_1pkextract__grid_1_1pkextract__grid_html_aa939f27236fbd7a0919bcb66b214b8c9"><div class="ttname"><a href="classqgis_1_1pkextract__grid_1_1pkextract__grid.html#aa939f27236fbd7a0919bcb66b214b8c9">qgis.pkextract_grid.pkextract_grid.cliName</a></div><div class="ttdeci">def cliName</div><div class="ttdef"><b>Definition:</b> <a href="pkextract__grid_8py_source.html#l00104">pkextract_grid.py:104</a></div></div>
-<div class="ttc" id="classqgis_1_1pkextract__grid_1_1pkextract__grid_html_a2b5e358b248cb62615584a90d651fea1"><div class="ttname"><a href="classqgis_1_1pkextract__grid_1_1pkextract__grid.html#a2b5e358b248cb62615584a90d651fea1">qgis.pkextract_grid.pkextract_grid.SRCNODATA</a></div><div class="ttdeci">string SRCNODATA</div><div class="ttdef"><b>Definition:</b> <a href="pkextract__grid_8py_source.html#l00098">pkextract_grid.py:98</a></div></div>
-<div class="ttc" id="classqgis_1_1pkextract__grid_1_1pkextract__grid_html_a1c07170b9f1999083d925f16c78e5ab1"><div class="ttname"><a href="classqgis_1_1pkextract__grid_1_1pkextract__grid.html#a1c07170b9f1999083d925f16c78e5ab1">qgis.pkextract_grid.pkextract_grid.BUFFER</a></div><div class="ttdeci">string BUFFER</div><div class="ttdef"><b>Definition:</b> <a href="pkextract__grid_8py_source.html#l00096">pkextract_grid.py:96</a></div></div>
-<div class="ttc" id="classqgis_1_1pkextract__grid_1_1pkextract__grid_html_a914f319e7a3734966056b0e396e4b0a1"><div class="ttname"><a href="classqgis_1_1pkextract__grid_1_1pkextract__grid.html#a914f319e7a3734966056b0e396e4b0a1">qgis.pkextract_grid.pkextract_grid.GRID</a></div><div class="ttdeci">string GRID</div><div class="ttdef"><b>Definition:</b> <a href="pkextract__grid_8py_source.html#l00097">pkextract_grid.py:97</a></div></div>
-<div class="ttc" id="classqgis_1_1pkextract__grid_1_1pkextract__grid_html_a481d147d56925a1ab75e18b1c8f145fc"><div class="ttname"><a href="classqgis_1_1pkextract__grid_1_1pkextract__grid.html#a481d147d56925a1ab75e18b1c8f145fc">qgis.pkextract_grid.pkextract_grid.group</a></div><div class="ttdeci">group</div><div class="ttdef"><b>Definition:</b> <a href="pkextract__grid_8py_source.html#l00109">pkextract_grid.py:109</a></div></div>
-<div class="ttc" id="classqgis_1_1pkextract__grid_1_1pkextract__grid_html_ad359b649a15e3dbd0795278b984c6b23"><div class="ttname"><a href="classqgis_1_1pkextract__grid_1_1pkextract__grid.html#ad359b649a15e3dbd0795278b984c6b23">qgis.pkextract_grid.pkextract_grid.INPUT</a></div><div class="ttdeci">string INPUT</div><div class="ttdef"><b>Definition:</b> <a href="pkextract__grid_8py_source.html#l00089">pkextract_grid.py:89</a></div></div>
-<div class="ttc" id="classqgis_1_1pkextract__grid_1_1pkextract__grid_html_aa9a3742d6a3703e840c7bc463740fb46"><div class="ttname"><a href="classqgis_1_1pkextract__grid_1_1pkextract__grid.html#aa9a3742d6a3703e840c7bc463740fb46">qgis.pkextract_grid.pkextract_grid.name</a></div><div class="ttdeci">name</div><div class="ttdef"><b>Definition:</b> <a href="pkextract__grid_8py_source.html#l00108">pkextract_grid.py:108</a></div></div>
-<div class="ttc" id="classqgis_1_1pkextract__grid_1_1pkextract__grid_html_adaea5d0be7bd0435fdd3f6a42dc4c80f"><div class="ttname"><a href="classqgis_1_1pkextract__grid_1_1pkextract__grid.html#adaea5d0be7bd0435fdd3f6a42dc4c80f">qgis.pkextract_grid.pkextract_grid.POLYGON</a></div><div class="ttdeci">string POLYGON</div><div class="ttdef"><b>Definition:</b> <a href="pkextract__grid_8py_source.html#l00095">pkextract_grid.py:95</a></div></div>
+<div class="ttc" id="classqgis_1_1pktools_1_1pkextract__grid_1_1pkextract__grid_html_a567185dde201a783080d4e480a3f658b"><div class="ttname"><a href="classqgis_1_1pktools_1_1pkextract__grid_1_1pkextract__grid.html#a567185dde201a783080d4e480a3f658b">qgis.pktools.pkextract_grid.pkextract_grid.SRCNODATA</a></div><div class="ttdeci">string SRCNODATA</div><div class="ttdef"><b>Definition:</b> <a href="pktools_2pkextract__grid_8py_source.html#l00098">pkextract_grid.py:98</a></div></div>
+<div class="ttc" id="classqgis_1_1pktools_1_1pkextract__grid_1_1pkextract__grid_html_a6064a8e5b885a1bad7a28957e70e1cdc"><div class="ttname"><a href="classqgis_1_1pktools_1_1pkextract__grid_1_1pkextract__grid.html#a6064a8e5b885a1bad7a28957e70e1cdc">qgis.pktools.pkextract_grid.pkextract_grid.OUTPUT</a></div><div class="ttdeci">string OUTPUT</div><div class="ttdef"><b>Definition:</b> <a href="pktools_2pkextract__grid_8py_source.html#l00090">pkextract_grid.py:90</a></div></div>
+<div class="ttc" id="classqgis_1_1pktools_1_1pkextract__grid_1_1pkextract__grid_html"><div class="ttname"><a href="classqgis_1_1pktools_1_1pkextract__grid_1_1pkextract__grid.html">qgis.pktools.pkextract_grid.pkextract_grid</a></div><div class="ttdef"><b>Definition:</b> <a href="pktools_2pkextract__grid_8py_source.html#l00087">pkextract_grid.py:87</a></div></div>
+<div class="ttc" id="classqgis_1_1pktools_1_1pkextract__grid_1_1pkextract__grid_html_af200c24667122672e45fd9d6f5067efd"><div class="ttname"><a href="classqgis_1_1pktools_1_1pkextract__grid_1_1pkextract__grid.html#af200c24667122672e45fd9d6f5067efd">qgis.pktools.pkextract_grid.pkextract_grid.BUFFER</a></div><div class="ttdeci">string BUFFER</div><div class="ttdef"><b>Definition:</b> <a href="pktools_2pkextract__grid_8py_source.html#l00096">pkextract_grid.py:96</a></div></div>
+<div class="ttc" id="classqgis_1_1pktools_1_1pkextract__grid_1_1pkextract__grid_html_aa8f2f067f0a059b531c53a38b1a85308"><div class="ttname"><a href="classqgis_1_1pktools_1_1pkextract__grid_1_1pkextract__grid.html#aa8f2f067f0a059b531c53a38b1a85308">qgis.pktools.pkextract_grid.pkextract_grid.cliName</a></div><div class="ttdeci">def cliName</div><div class="ttdef"><b>Definition:</b> <a href="pktools_2pkextract__grid_8py_source.html#l00104">pkextract_grid.py:104</a></div></div>
+<div class="ttc" id="classqgis_1_1pktools_1_1pkextract__grid_1_1pkextract__grid_html_a064ad85bca7f4be990fbb62d99a89ba1"><div class="ttname"><a href="classqgis_1_1pktools_1_1pkextract__grid_1_1pkextract__grid.html#a064ad85bca7f4be990fbb62d99a89ba1">qgis.pktools.pkextract_grid.pkextract_grid.FORMAT</a></div><div class="ttdeci">string FORMAT</div><div class="ttdef"><b>Definition:</b> <a href="pktools_2pkextract__grid_8py_source.html#l00102">pkextract_grid.py:102</a></div></div>
+<div class="ttc" id="classqgis_1_1pktools_1_1pkextract__grid_1_1pkextract__grid_html_a5412a66f1947ac26ccbd630b71428157"><div class="ttname"><a href="classqgis_1_1pktools_1_1pkextract__grid_1_1pkextract__grid.html#a5412a66f1947ac26ccbd630b71428157">qgis.pktools.pkextract_grid.pkextract_grid.INPUT</a></div><div class="ttdeci">string INPUT</div><div class="ttdef"><b>Definition:</b> <a href="pktools_2pkextract__grid_8py_source.html#l00089">pkextract_grid.py:89</a></div></div>
+<div class="ttc" id="classqgis_1_1pktools_1_1pkextract__grid_1_1pkextract__grid_html_a694eeda5f32f8f58ec20b873a2c31333"><div class="ttname"><a href="classqgis_1_1pktools_1_1pkextract__grid_1_1pkextract__grid.html#a694eeda5f32f8f58ec20b873a2c31333">qgis.pktools.pkextract_grid.pkextract_grid.RULE</a></div><div class="ttdeci">string RULE</div><div class="ttdef"><b>Definition:</b> <a href="pktools_2pkextract__grid_8py_source.html#l00094">pkextract_grid.py:94</a></div></div>
+<div class="ttc" id="classqgis_1_1pktools_1_1pkextract__grid_1_1pkextract__grid_html_acb46e5b74179c65a686d0a6e5f49d226"><div class="ttname"><a href="classqgis_1_1pktools_1_1pkextract__grid_1_1pkextract__grid.html#acb46e5b74179c65a686d0a6e5f49d226">qgis.pktools.pkextract_grid.pkextract_grid.EXTRA</a></div><div class="ttdeci">string EXTRA</div><div class="ttdef"><b>Definition:</b> <a href="pktools_2pkextract__grid_8py_source.html#l00100">pkextract_grid.py:100</a></div></div>
+<div class="ttc" id="classqgis_1_1pktools_1_1pkextract__grid_1_1pkextract__grid_html_a3fb178091872bc1872478de700caf1b4"><div class="ttname"><a href="classqgis_1_1pktools_1_1pkextract__grid_1_1pkextract__grid.html#a3fb178091872bc1872478de700caf1b4">qgis.pktools.pkextract_grid.pkextract_grid.RULE_OPTIONS</a></div><div class="ttdeci">list RULE_OPTIONS</div><div class="ttdef"><b>Definition:</b> <a href="pktools_2pkextract__grid_8py_source.html#l00092">pkextract_grid.py:92</a></div></div>
+<div class="ttc" id="classqgis_1_1pktools_1_1pkextract__grid_1_1pkextract__grid_html_a7834e2f6a8d96793e5d50c379d69495f"><div class="ttname"><a href="classqgis_1_1pktools_1_1pkextract__grid_1_1pkextract__grid.html#a7834e2f6a8d96793e5d50c379d69495f">qgis.pktools.pkextract_grid.pkextract_grid.POLYGON</a></div><div class="ttdeci">string POLYGON</div><div class="ttdef"><b>Definition:</b> <a href="pktools_2pkextract__grid_8py_source.html#l00095">pkextract_grid.py:95</a></div></div>
+<div class="ttc" id="classqgis_1_1pktools_1_1pkextract__grid_1_1pkextract__grid_html_a67f2914362c1595ea342a4b3a7a4715f"><div class="ttname"><a href="classqgis_1_1pktools_1_1pkextract__grid_1_1pkextract__grid.html#a67f2914362c1595ea342a4b3a7a4715f">qgis.pktools.pkextract_grid.pkextract_grid.BNDNODATA</a></div><div class="ttdeci">string BNDNODATA</div><div class="ttdef"><b>Definition:</b> <a href="pktools_2pkextract__grid_8py_source.html#l00099">pkextract_grid.py:99</a></div></div>
+<div class="ttc" id="classqgis_1_1pktools_1_1pkextract__grid_1_1pkextract__grid_html_af13c9efdff741494bfb58c8b10d4b53e"><div class="ttname"><a href="classqgis_1_1pktools_1_1pkextract__grid_1_1pkextract__grid.html#af13c9efdff741494bfb58c8b10d4b53e">qgis.pktools.pkextract_grid.pkextract_grid.name</a></div><div class="ttdeci">name</div><div class="ttdef"><b>Definition:</b> <a href="pktools_2pkextract__grid_8py_source.html#l00108">pkextract_grid.py:108</a></div></div>
+<div class="ttc" id="classqgis_1_1pktools_1_1pkextract__grid_1_1pkextract__grid_html_a90b6bcee6161de183851f985a02be337"><div class="ttname"><a href="classqgis_1_1pktools_1_1pkextract__grid_1_1pkextract__grid.html#a90b6bcee6161de183851f985a02be337">qgis.pktools.pkextract_grid.pkextract_grid.GRID</a></div><div class="ttdeci">string GRID</div><div class="ttdef"><b>Definition:</b> <a href="pktools_2pkextract__grid_8py_source.html#l00097">pkextract_grid.py:97</a></div></div>
+<div class="ttc" id="classqgis_1_1pktools_1_1pkextract__grid_1_1pkextract__grid_html_a09ae45118a775983455e10ecc7959004"><div class="ttname"><a href="classqgis_1_1pktools_1_1pkextract__grid_1_1pkextract__grid.html#a09ae45118a775983455e10ecc7959004">qgis.pktools.pkextract_grid.pkextract_grid.group</a></div><div class="ttdeci">group</div><div class="ttdef"><b>Definition:</b> <a href="pktools_2pkextract__grid_8py_source.html#l00109">pkextract_grid.py:109</a></div></div>
 </div><!-- fragment --></div><!-- contents -->
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Jun 23 2015 17:09:36 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Tue Nov 3 2015 15:58:26 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/pkextract__random_8py_source.html b/doc/html/pktools_2pkextract__random_8py_source.html
similarity index 69%
copy from doc/html/pkextract__random_8py_source.html
copy to doc/html/pktools_2pkextract__random_8py_source.html
index 9f650c9..62158bb 100644
--- a/doc/html/pkextract__random_8py_source.html
+++ b/doc/html/pktools_2pkextract__random_8py_source.html
@@ -4,7 +4,7 @@
 <meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
 <meta http-equiv="X-UA-Compatible" content="IE=9"/>
 <meta name="generator" content="Doxygen 1.8.6"/>
-<title>pktools: /home/kempenep/pktools/qgis/pkextract_random.py Source File</title>
+<title>pktools: /home/kempenep/pktools/qgis/pktools/pkextract_random.py Source File</title>
 <link href="tabs.css" rel="stylesheet" type="text/css"/>
 <script type="text/javascript" src="jquery.js"></script>
 <script type="text/javascript" src="dynsections.js"></script>
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.3</span>
+    <span id="projectnumber">2.6.4</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -44,7 +44,7 @@
   </div>
 <div id="nav-path" class="navpath">
   <ul>
-<li class="navelem"><a class="el" href="dir_5785acc8d2e42f8795bdbe936856f26d.html">qgis</a></li>  </ul>
+<li class="navelem"><a class="el" href="dir_5785acc8d2e42f8795bdbe936856f26d.html">qgis</a></li><li class="navelem"><a class="el" href="dir_b7cc22b4453454f1e686d9a2e78d988d.html">pktools</a></li>  </ul>
 </div>
 </div><!-- top -->
 <div class="header">
@@ -138,7 +138,7 @@
 <div class="line"><a name="l00084"></a><span class="lineno">   84</span>     <span class="stringliteral">'.pdf'</span>,</div>
 <div class="line"><a name="l00085"></a><span class="lineno">   85</span> ]</div>
 <div class="line"><a name="l00086"></a><span class="lineno">   86</span> </div>
-<div class="line"><a name="l00087"></a><span class="lineno"><a class="line" href="classqgis_1_1pkextract__random_1_1pkextract__random.html">   87</a></span> <span class="keyword">class </span><a class="code" href="classqgis_1_1pkextract__random_1_1pkextract__random.html">pkextract_random</a>(pktoolsAlgorithm):</div>
+<div class="line"><a name="l00087"></a><span class="lineno"><a class="line" href="classqgis_1_1pktools_1_1pkextract__random_1_1pkextract__random.html">   87</a></span> <span class="keyword">class </span><a class="code" href="classqgis_1_1pktools_1_1pkextract__random_1_1pkextract__random.html">pkextract_random</a>(pktoolsAlgorithm):</div>
 <div class="line"><a name="l00088"></a><span class="lineno">   88</span> </div>
 <div class="line"><a name="l00089"></a><span class="lineno">   89</span>     INPUT = <span class="stringliteral">"INPUT"</span></div>
 <div class="line"><a name="l00090"></a><span class="lineno">   90</span>     OUTPUT = <span class="stringliteral">"OUTPUT"</span></div>
@@ -159,38 +159,38 @@
 <div class="line"><a name="l00105"></a><span class="lineno">  105</span>         <span class="keywordflow">return</span> <span class="stringliteral">"pkextract"</span></div>
 <div class="line"><a name="l00106"></a><span class="lineno">  106</span> </div>
 <div class="line"><a name="l00107"></a><span class="lineno">  107</span>     <span class="keyword">def </span>defineCharacteristics(self):</div>
-<div class="line"><a name="l00108"></a><span class="lineno">  108</span>         self.<a class="code" href="classqgis_1_1pkextract__random_1_1pkextract__random.html#a82b3377677efcc9221be352e4048cafd">name</a> = <span class="stringliteral">"extract random points"</span></div>
-<div class="line"><a name="l00109"></a><span class="lineno">  109</span>         self.<a class="code" href="classqgis_1_1pkextract__random_1_1pkextract__random.html#aca5c7763815ce8ed031311ba3a789ca1">group</a> = <span class="stringliteral">"[pktools] raster/vector"</span></div>
-<div class="line"><a name="l00110"></a><span class="lineno">  110</span>         self.addParameter(ParameterRaster(self.<a class="code" href="classqgis_1_1pkextract__random_1_1pkextract__random.html#aa12d40db6d4c1db34cb7c9f577f7c005">INPUT</a>, <span class="stringliteral">'Input raster data set'</span>))</div>
-<div class="line"><a name="l00111"></a><span class="lineno">  111</span>         self.addParameter(ParameterSelection(self.<a class="code" href="classqgis_1_1pkextract__random_1_1pkextract__random.html#afedf8577b67d791e03897075d8aa27ac">RULE</a>,<span class="stringliteral">"extraction rule"</span>,self.<a class="code" href="classqgis_1_1pkextract__random_1_1pkextract__random.html#a85a1e7cb635dcbd857a527768834e990">RULE_OPTIONS</a>, 0))</div>
+<div class="line"><a name="l00108"></a><span class="lineno">  108</span>         self.<a class="code" href="classqgis_1_1pktools_1_1pkextract__random_1_1pkextract__random.html#af22352f109032ed3a3340b13a9013e09">name</a> = <span class="stringliteral">"extract random points"</span></div>
+<div class="line"><a name="l00109"></a><span class="lineno">  109</span>         self.<a class="code" href="classqgis_1_1pktools_1_1pkextract__random_1_1pkextract__random.html#a87570906ed677592d5f8bac33ff7a3d8">group</a> = <span class="stringliteral">"[pktools] raster/vector"</span></div>
+<div class="line"><a name="l00110"></a><span class="lineno">  110</span>         self.addParameter(ParameterRaster(self.<a class="code" href="classqgis_1_1pktools_1_1pkextract__random_1_1pkextract__random.html#af378362e275409fbaadf0164809d9580">INPUT</a>, <span class="stringliteral">'Input raster data set'</span>))</div>
+<div class="line"><a name="l00111"></a><span class="lineno">  111</span>         self.addParameter(ParameterSelection(self.<a class="code" href="classqgis_1_1pktools_1_1pkextract__random_1_1pkextract__random.html#ae3e01342bd3404b653c4b8d24f505f17">RULE</a>,<span class="stringliteral">"extraction rule"</span>,self.<a class="code" href="classqgis_1_1pktools_1_1pkextract__random_1_1pkextract__random.html#ada2bb55cda0c34c8b4a82a13401d2455">RULE_OPTIONS</a>, 0))</div>
 <div class="line"><a name="l00112"></a><span class="lineno">  112</span> </div>
-<div class="line"><a name="l00113"></a><span class="lineno">  113</span>         self.addOutput(OutputVector(self.<a class="code" href="classqgis_1_1pkextract__random_1_1pkextract__random.html#a085ee08ae2a482d8cbaff595892c54a8">OUTPUT</a>, <span class="stringliteral">'Output vector data set'</span>))</div>
-<div class="line"><a name="l00114"></a><span class="lineno">  114</span>         self.addParameter(ParameterSelection(self.<a class="code" href="classqgis_1_1pkextract__random_1_1pkextract__random.html#aa9917fab3df26d469766bfa0ba603ee4">FORMAT</a>,</div>
+<div class="line"><a name="l00113"></a><span class="lineno">  113</span>         self.addOutput(OutputVector(self.<a class="code" href="classqgis_1_1pktools_1_1pkextract__random_1_1pkextract__random.html#ada827e4d57de53322129310d1d2b01ac">OUTPUT</a>, <span class="stringliteral">'Output vector data set'</span>))</div>
+<div class="line"><a name="l00114"></a><span class="lineno">  114</span>         self.addParameter(ParameterSelection(self.<a class="code" href="classqgis_1_1pktools_1_1pkextract__random_1_1pkextract__random.html#aa477d50d42493c4a70f2d985dc235b8c">FORMAT</a>,</div>
 <div class="line"><a name="l00115"></a><span class="lineno">  115</span>                           <span class="stringliteral">'Destination Format'</span>, FORMATS))</div>
 <div class="line"><a name="l00116"></a><span class="lineno">  116</span> </div>
-<div class="line"><a name="l00117"></a><span class="lineno">  117</span>         self.addParameter(ParameterBoolean(self.<a class="code" href="classqgis_1_1pkextract__random_1_1pkextract__random.html#a36283f7921c233717d3f14c8db5c1f0b">POLYGON</a>, <span class="stringliteral">"Create OGRPolygon as geometry instead of OGRPoint"</span>,<span class="keyword">False</span>))</div>
-<div class="line"><a name="l00118"></a><span class="lineno">  118</span>         self.addParameter(ParameterNumber(self.<a class="code" href="classqgis_1_1pkextract__random_1_1pkextract__random.html#acd4d3fcc09b1d4e24614be0afaefbf3e">BUFFER</a>, <span class="stringliteral">"Buffer for calculating statistics for point features"</span>,1,25,1))</div>
-<div class="line"><a name="l00119"></a><span class="lineno">  119</span>         self.addParameter(ParameterNumber(self.<a class="code" href="classqgis_1_1pkextract__random_1_1pkextract__random.html#adcaa31fc02c279d8bbdb849104d939e1">RANDOM</a>, <span class="stringliteral">"Number of random points to generate"</span>,0,1000000,100))</div>
+<div class="line"><a name="l00117"></a><span class="lineno">  117</span>         self.addParameter(ParameterBoolean(self.<a class="code" href="classqgis_1_1pktools_1_1pkextract__random_1_1pkextract__random.html#a6d966809aee7401ccf7c298400e7d590">POLYGON</a>, <span class="stringliteral">"Create OGRPolygon as geometry instead of OGRPoint"</span>,<span class="keyword">False</span>))</div>
+<div class="line"><a name="l00118"></a><span class="lineno">  118</span>         self.addParameter(ParameterNumber(self.<a class="code" href="classqgis_1_1pktools_1_1pkextract__random_1_1pkextract__random.html#a9cae04c4754d9863a12c776286e96fdb">BUFFER</a>, <span class="stringliteral">"Buffer for calculating statistics for point features"</span>,1,25,1))</div>
+<div class="line"><a name="l00119"></a><span class="lineno">  119</span>         self.addParameter(ParameterNumber(self.<a class="code" href="classqgis_1_1pktools_1_1pkextract__random_1_1pkextract__random.html#aae134982ad295e7f2f206c85b6d28528">RANDOM</a>, <span class="stringliteral">"Number of random points to generate"</span>,0,1000000,100))</div>
 <div class="line"><a name="l00120"></a><span class="lineno">  120</span> </div>
-<div class="line"><a name="l00121"></a><span class="lineno">  121</span>         self.addParameter(ParameterString(self.<a class="code" href="classqgis_1_1pkextract__random_1_1pkextract__random.html#a13dc6553f4a7a228ae4b94e810694889">SRCNODATA</a>, <span class="stringliteral">"invalid value(s) for input raster dataset (e.g., 0;255)"</span>,<span class="stringliteral">"none"</span>))</div>
-<div class="line"><a name="l00122"></a><span class="lineno">  122</span>         self.addParameter(ParameterString(self.<a class="code" href="classqgis_1_1pkextract__random_1_1pkextract__random.html#aa443b2341e1b83d1c1cf56f95cdb36a0">BNDNODATA</a>, <span class="stringliteral">"Band(s) in input image to check if pixel is valid (e.g., 0;1)"</span>,<span class="stringliteral">"0"</span>))</div>
-<div class="line"><a name="l00123"></a><span class="lineno">  123</span>         self.addParameter(ParameterString(self.<a class="code" href="classqgis_1_1pkextract__random_1_1pkextract__random.html#acfa85cb06c31b3bf3a7b543e3185368e">EXTRA</a>,</div>
+<div class="line"><a name="l00121"></a><span class="lineno">  121</span>         self.addParameter(ParameterString(self.<a class="code" href="classqgis_1_1pktools_1_1pkextract__random_1_1pkextract__random.html#a7a0f0334d5a3ecc367fc6621a9bfe63f">SRCNODATA</a>, <span class="stringliteral">"invalid value(s) for input raster dataset (e.g., 0;255)"</span>,<span class="stringliteral">"none"</span>))</div>
+<div class="line"><a name="l00122"></a><span class="lineno">  122</span>         self.addParameter(ParameterString(self.<a class="code" href="classqgis_1_1pktools_1_1pkextract__random_1_1pkextract__random.html#aabe205b1faf586f973e527998303d834">BNDNODATA</a>, <span class="stringliteral">"Band(s) in input image to check if pixel is valid (e.g., 0;1)"</span>,<span class="stringliteral">"0"</span>))</div>
+<div class="line"><a name="l00123"></a><span class="lineno">  123</span>         self.addParameter(ParameterString(self.<a class="code" href="classqgis_1_1pktools_1_1pkextract__random_1_1pkextract__random.html#a366ca672a6dc061ca5624107cd1e6701">EXTRA</a>,</div>
 <div class="line"><a name="l00124"></a><span class="lineno">  124</span>                           <span class="stringliteral">'Additional parameters'</span>, <span class="stringliteral">''</span>, optional=<span class="keyword">True</span>))</div>
 <div class="line"><a name="l00125"></a><span class="lineno">  125</span> </div>
 <div class="line"><a name="l00126"></a><span class="lineno">  126</span>     <span class="keyword">def </span>processAlgorithm(self, progress):</div>
-<div class="line"><a name="l00127"></a><span class="lineno">  127</span>         cliPath = <span class="stringliteral">'"'</span> + os.path.join(pktoolsUtils.pktoolsPath(), self.<a class="code" href="classqgis_1_1pkextract__random_1_1pkextract__random.html#a12d5f2e69fb4d44ceaa3446295ae8c99">cliName</a>()) + <span class="stringliteral">'"'</span></div>
+<div class="line"><a name="l00127"></a><span class="lineno">  127</span>         cliPath = <span class="stringliteral">'"'</span> + os.path.join(pktoolsUtils.pktoolsPath(), self.<a class="code" href="classqgis_1_1pktools_1_1pkextract__random_1_1pkextract__random.html#a4ad3adfb8949647f7e2ce887ef844473">cliName</a>()) + <span class="stringliteral">'"'</span></div>
 <div class="line"><a name="l00128"></a><span class="lineno">  128</span>         commands = [cliPath]</div>
 <div class="line"><a name="l00129"></a><span class="lineno">  129</span> </div>
-<div class="line"><a name="l00130"></a><span class="lineno">  130</span>         input=self.getParameterValue(self.<a class="code" href="classqgis_1_1pkextract__random_1_1pkextract__random.html#aa12d40db6d4c1db34cb7c9f577f7c005">INPUT</a>)</div>
+<div class="line"><a name="l00130"></a><span class="lineno">  130</span>         input=self.getParameterValue(self.<a class="code" href="classqgis_1_1pktools_1_1pkextract__random_1_1pkextract__random.html#af378362e275409fbaadf0164809d9580">INPUT</a>)</div>
 <div class="line"><a name="l00131"></a><span class="lineno">  131</span>         commands.append(<span class="stringliteral">'-i'</span>)</div>
 <div class="line"><a name="l00132"></a><span class="lineno">  132</span>         commands.append(<span class="stringliteral">'"'</span> + input + <span class="stringliteral">'"'</span>)</div>
 <div class="line"><a name="l00133"></a><span class="lineno">  133</span> </div>
 <div class="line"><a name="l00134"></a><span class="lineno">  134</span>         commands.append(<span class="stringliteral">"-r"</span>)</div>
-<div class="line"><a name="l00135"></a><span class="lineno">  135</span>         commands.append(self.<a class="code" href="classqgis_1_1pkextract__random_1_1pkextract__random.html#a85a1e7cb635dcbd857a527768834e990">RULE_OPTIONS</a>[self.getParameterValue(self.<a class="code" href="classqgis_1_1pkextract__random_1_1pkextract__random.html#afedf8577b67d791e03897075d8aa27ac">RULE</a>)])</div>
+<div class="line"><a name="l00135"></a><span class="lineno">  135</span>         commands.append(self.<a class="code" href="classqgis_1_1pktools_1_1pkextract__random_1_1pkextract__random.html#ada2bb55cda0c34c8b4a82a13401d2455">RULE_OPTIONS</a>[self.getParameterValue(self.<a class="code" href="classqgis_1_1pktools_1_1pkextract__random_1_1pkextract__random.html#ae3e01342bd3404b653c4b8d24f505f17">RULE</a>)])</div>
 <div class="line"><a name="l00136"></a><span class="lineno">  136</span> </div>
-<div class="line"><a name="l00137"></a><span class="lineno">  137</span>         output = self.getOutputFromName(self.<a class="code" href="classqgis_1_1pkextract__random_1_1pkextract__random.html#a085ee08ae2a482d8cbaff595892c54a8">OUTPUT</a>)</div>
+<div class="line"><a name="l00137"></a><span class="lineno">  137</span>         output = self.getOutputFromName(self.<a class="code" href="classqgis_1_1pktools_1_1pkextract__random_1_1pkextract__random.html#ada827e4d57de53322129310d1d2b01ac">OUTPUT</a>)</div>
 <div class="line"><a name="l00138"></a><span class="lineno">  138</span>         outFile = output.value</div>
-<div class="line"><a name="l00139"></a><span class="lineno">  139</span>         formatIdx = self.getParameterValue(self.<a class="code" href="classqgis_1_1pkextract__random_1_1pkextract__random.html#aa9917fab3df26d469766bfa0ba603ee4">FORMAT</a>)</div>
+<div class="line"><a name="l00139"></a><span class="lineno">  139</span>         formatIdx = self.getParameterValue(self.<a class="code" href="classqgis_1_1pktools_1_1pkextract__random_1_1pkextract__random.html#aa477d50d42493c4a70f2d985dc235b8c">FORMAT</a>)</div>
 <div class="line"><a name="l00140"></a><span class="lineno">  140</span>         outFormat = <span class="stringliteral">'"'</span> + FORMATS[formatIdx] + <span class="stringliteral">'"'</span></div>
 <div class="line"><a name="l00141"></a><span class="lineno">  141</span>         commands.append(<span class="stringliteral">'-f'</span>)</div>
 <div class="line"><a name="l00142"></a><span class="lineno">  142</span>         commands.append(outFormat)</div>
@@ -201,55 +201,55 @@
 <div class="line"><a name="l00147"></a><span class="lineno">  147</span>         commands.append(<span class="stringliteral">'-o'</span>)</div>
 <div class="line"><a name="l00148"></a><span class="lineno">  148</span>         commands.append(<span class="stringliteral">'"'</span> + outFile + <span class="stringliteral">'"'</span>)</div>
 <div class="line"><a name="l00149"></a><span class="lineno">  149</span> </div>
-<div class="line"><a name="l00150"></a><span class="lineno">  150</span>         <span class="keywordflow">if</span> self.getParameterValue(self.<a class="code" href="classqgis_1_1pkextract__random_1_1pkextract__random.html#a36283f7921c233717d3f14c8db5c1f0b">POLYGON</a>):</div>
+<div class="line"><a name="l00150"></a><span class="lineno">  150</span>         <span class="keywordflow">if</span> self.getParameterValue(self.<a class="code" href="classqgis_1_1pktools_1_1pkextract__random_1_1pkextract__random.html#a6d966809aee7401ccf7c298400e7d590">POLYGON</a>):</div>
 <div class="line"><a name="l00151"></a><span class="lineno">  151</span>             commands.append(<span class="stringliteral">"-polygon"</span>)</div>
-<div class="line"><a name="l00152"></a><span class="lineno">  152</span>         buffer=self.getParameterValue(self.<a class="code" href="classqgis_1_1pkextract__random_1_1pkextract__random.html#acd4d3fcc09b1d4e24614be0afaefbf3e">BUFFER</a>)</div>
+<div class="line"><a name="l00152"></a><span class="lineno">  152</span>         buffer=self.getParameterValue(self.<a class="code" href="classqgis_1_1pktools_1_1pkextract__random_1_1pkextract__random.html#a9cae04c4754d9863a12c776286e96fdb">BUFFER</a>)</div>
 <div class="line"><a name="l00153"></a><span class="lineno">  153</span>         <span class="keywordflow">if</span> buffer > 1:</div>
 <div class="line"><a name="l00154"></a><span class="lineno">  154</span>             commands.append(<span class="stringliteral">"-buf"</span>)</div>
 <div class="line"><a name="l00155"></a><span class="lineno">  155</span>             commands.append(str(buffer))</div>
 <div class="line"><a name="l00156"></a><span class="lineno">  156</span> </div>
-<div class="line"><a name="l00157"></a><span class="lineno">  157</span>         <span class="keywordflow">if</span> self.getParameterValue(self.<a class="code" href="classqgis_1_1pkextract__random_1_1pkextract__random.html#adcaa31fc02c279d8bbdb849104d939e1">RANDOM</a>) > 0:</div>
+<div class="line"><a name="l00157"></a><span class="lineno">  157</span>         <span class="keywordflow">if</span> self.getParameterValue(self.<a class="code" href="classqgis_1_1pktools_1_1pkextract__random_1_1pkextract__random.html#aae134982ad295e7f2f206c85b6d28528">RANDOM</a>) > 0:</div>
 <div class="line"><a name="l00158"></a><span class="lineno">  158</span>             commands.append(<span class="stringliteral">"-rand"</span>)</div>
-<div class="line"><a name="l00159"></a><span class="lineno">  159</span>             commands.append(str(self.getParameterValue(self.<a class="code" href="classqgis_1_1pkextract__random_1_1pkextract__random.html#adcaa31fc02c279d8bbdb849104d939e1">RANDOM</a>)))</div>
+<div class="line"><a name="l00159"></a><span class="lineno">  159</span>             commands.append(str(self.getParameterValue(self.<a class="code" href="classqgis_1_1pktools_1_1pkextract__random_1_1pkextract__random.html#aae134982ad295e7f2f206c85b6d28528">RANDOM</a>)))</div>
 <div class="line"><a name="l00160"></a><span class="lineno">  160</span> </div>
-<div class="line"><a name="l00161"></a><span class="lineno">  161</span>         srcnodata=self.getParameterValue(self.<a class="code" href="classqgis_1_1pkextract__random_1_1pkextract__random.html#a13dc6553f4a7a228ae4b94e810694889">SRCNODATA</a>)</div>
+<div class="line"><a name="l00161"></a><span class="lineno">  161</span>         srcnodata=self.getParameterValue(self.<a class="code" href="classqgis_1_1pktools_1_1pkextract__random_1_1pkextract__random.html#a7a0f0334d5a3ecc367fc6621a9bfe63f">SRCNODATA</a>)</div>
 <div class="line"><a name="l00162"></a><span class="lineno">  162</span>         <span class="keywordflow">if</span> srcnodata != <span class="stringliteral">"none"</span>:</div>
 <div class="line"><a name="l00163"></a><span class="lineno">  163</span>             srcnodataValues = srcnodata.split(<span class="stringliteral">';'</span>)</div>
 <div class="line"><a name="l00164"></a><span class="lineno">  164</span>             <span class="keywordflow">for</span> srcnodataValue <span class="keywordflow">in</span> srcnodataValues:</div>
 <div class="line"><a name="l00165"></a><span class="lineno">  165</span>                 commands.append(<span class="stringliteral">'-srcnodata'</span>)</div>
 <div class="line"><a name="l00166"></a><span class="lineno">  166</span>                 commands.append(srcnodataValue)</div>
-<div class="line"><a name="l00167"></a><span class="lineno">  167</span>         bndnodata=self.getParameterValue(self.<a class="code" href="classqgis_1_1pkextract__random_1_1pkextract__random.html#aa443b2341e1b83d1c1cf56f95cdb36a0">BNDNODATA</a>)</div>
+<div class="line"><a name="l00167"></a><span class="lineno">  167</span>         bndnodata=self.getParameterValue(self.<a class="code" href="classqgis_1_1pktools_1_1pkextract__random_1_1pkextract__random.html#aabe205b1faf586f973e527998303d834">BNDNODATA</a>)</div>
 <div class="line"><a name="l00168"></a><span class="lineno">  168</span>         bndnodataValues = bndnodata.split(<span class="stringliteral">';'</span>)</div>
 <div class="line"><a name="l00169"></a><span class="lineno">  169</span>         <span class="keywordflow">for</span> bndnodataValue <span class="keywordflow">in</span> bndnodataValues:</div>
 <div class="line"><a name="l00170"></a><span class="lineno">  170</span>             commands.append(<span class="stringliteral">'-bndnodata'</span>)</div>
 <div class="line"><a name="l00171"></a><span class="lineno">  171</span>             commands.append(bndnodataValue)</div>
 <div class="line"><a name="l00172"></a><span class="lineno">  172</span> </div>
-<div class="line"><a name="l00173"></a><span class="lineno">  173</span>         extra = str(self.getParameterValue(self.<a class="code" href="classqgis_1_1pkextract__random_1_1pkextract__random.html#acfa85cb06c31b3bf3a7b543e3185368e">EXTRA</a>))</div>
+<div class="line"><a name="l00173"></a><span class="lineno">  173</span>         extra = str(self.getParameterValue(self.<a class="code" href="classqgis_1_1pktools_1_1pkextract__random_1_1pkextract__random.html#a366ca672a6dc061ca5624107cd1e6701">EXTRA</a>))</div>
 <div class="line"><a name="l00174"></a><span class="lineno">  174</span>         <span class="keywordflow">if</span> len(extra) > 0:</div>
 <div class="line"><a name="l00175"></a><span class="lineno">  175</span>             commands.append(extra)</div>
 <div class="line"><a name="l00176"></a><span class="lineno">  176</span> </div>
 <div class="line"><a name="l00177"></a><span class="lineno">  177</span> </div>
 <div class="line"><a name="l00178"></a><span class="lineno">  178</span>         pktoolsUtils.runpktools(commands, progress)</div>
-<div class="ttc" id="classqgis_1_1pkextract__random_1_1pkextract__random_html_aca5c7763815ce8ed031311ba3a789ca1"><div class="ttname"><a href="classqgis_1_1pkextract__random_1_1pkextract__random.html#aca5c7763815ce8ed031311ba3a789ca1">qgis.pkextract_random.pkextract_random.group</a></div><div class="ttdeci">group</div><div class="ttdef"><b>Definition:</b> <a href="pkextract__random_8py_source.html#l00109">pkextract_random.py:109</a></div></div>
-<div class="ttc" id="classqgis_1_1pkextract__random_1_1pkextract__random_html_adcaa31fc02c279d8bbdb849104d939e1"><div class="ttname"><a href="classqgis_1_1pkextract__random_1_1pkextract__random.html#adcaa31fc02c279d8bbdb849104d939e1">qgis.pkextract_random.pkextract_random.RANDOM</a></div><div class="ttdeci">string RANDOM</div><div class="ttdef"><b>Definition:</b> <a href="pkextract__random_8py_source.html#l00097">pkextract_random.py:97</a></div></div>
-<div class="ttc" id="classqgis_1_1pkextract__random_1_1pkextract__random_html_afedf8577b67d791e03897075d8aa27ac"><div class="ttname"><a href="classqgis_1_1pkextract__random_1_1pkextract__random.html#afedf8577b67d791e03897075d8aa27ac">qgis.pkextract_random.pkextract_random.RULE</a></div><div class="ttdeci">string RULE</div><div class="ttdef"><b>Definition:</b> <a href="pkextract__random_8py_source.html#l00094">pkextract_random.py:94</a></div></div>
-<div class="ttc" id="classqgis_1_1pkextract__random_1_1pkextract__random_html"><div class="ttname"><a href="classqgis_1_1pkextract__random_1_1pkextract__random.html">qgis.pkextract_random.pkextract_random</a></div><div class="ttdef"><b>Definition:</b> <a href="pkextract__random_8py_source.html#l00087">pkextract_random.py:87</a></div></div>
-<div class="ttc" id="classqgis_1_1pkextract__random_1_1pkextract__random_html_a82b3377677efcc9221be352e4048cafd"><div class="ttname"><a href="classqgis_1_1pkextract__random_1_1pkextract__random.html#a82b3377677efcc9221be352e4048cafd">qgis.pkextract_random.pkextract_random.name</a></div><div class="ttdeci">name</div><div class="ttdef"><b>Definition:</b> <a href="pkextract__random_8py_source.html#l00108">pkextract_random.py:108</a></div></div>
-<div class="ttc" id="classqgis_1_1pkextract__random_1_1pkextract__random_html_a36283f7921c233717d3f14c8db5c1f0b"><div class="ttname"><a href="classqgis_1_1pkextract__random_1_1pkextract__random.html#a36283f7921c233717d3f14c8db5c1f0b">qgis.pkextract_random.pkextract_random.POLYGON</a></div><div class="ttdeci">string POLYGON</div><div class="ttdef"><b>Definition:</b> <a href="pkextract__random_8py_source.html#l00095">pkextract_random.py:95</a></div></div>
-<div class="ttc" id="classqgis_1_1pkextract__random_1_1pkextract__random_html_aa9917fab3df26d469766bfa0ba603ee4"><div class="ttname"><a href="classqgis_1_1pkextract__random_1_1pkextract__random.html#aa9917fab3df26d469766bfa0ba603ee4">qgis.pkextract_random.pkextract_random.FORMAT</a></div><div class="ttdeci">string FORMAT</div><div class="ttdef"><b>Definition:</b> <a href="pkextract__random_8py_source.html#l00102">pkextract_random.py:102</a></div></div>
-<div class="ttc" id="classqgis_1_1pkextract__random_1_1pkextract__random_html_aa443b2341e1b83d1c1cf56f95cdb36a0"><div class="ttname"><a href="classqgis_1_1pkextract__random_1_1pkextract__random.html#aa443b2341e1b83d1c1cf56f95cdb36a0">qgis.pkextract_random.pkextract_random.BNDNODATA</a></div><div class="ttdeci">string BNDNODATA</div><div class="ttdef"><b>Definition:</b> <a href="pkextract__random_8py_source.html#l00099">pkextract_random.py:99</a></div></div>
-<div class="ttc" id="classqgis_1_1pkextract__random_1_1pkextract__random_html_acd4d3fcc09b1d4e24614be0afaefbf3e"><div class="ttname"><a href="classqgis_1_1pkextract__random_1_1pkextract__random.html#acd4d3fcc09b1d4e24614be0afaefbf3e">qgis.pkextract_random.pkextract_random.BUFFER</a></div><div class="ttdeci">string BUFFER</div><div class="ttdef"><b>Definition:</b> <a href="pkextract__random_8py_source.html#l00096">pkextract_random.py:96</a></div></div>
-<div class="ttc" id="classqgis_1_1pkextract__random_1_1pkextract__random_html_acfa85cb06c31b3bf3a7b543e3185368e"><div class="ttname"><a href="classqgis_1_1pkextract__random_1_1pkextract__random.html#acfa85cb06c31b3bf3a7b543e3185368e">qgis.pkextract_random.pkextract_random.EXTRA</a></div><div class="ttdeci">string EXTRA</div><div class="ttdef"><b>Definition:</b> <a href="pkextract__random_8py_source.html#l00100">pkextract_random.py:100</a></div></div>
-<div class="ttc" id="classqgis_1_1pkextract__random_1_1pkextract__random_html_a13dc6553f4a7a228ae4b94e810694889"><div class="ttname"><a href="classqgis_1_1pkextract__random_1_1pkextract__random.html#a13dc6553f4a7a228ae4b94e810694889">qgis.pkextract_random.pkextract_random.SRCNODATA</a></div><div class="ttdeci">string SRCNODATA</div><div class="ttdef"><b>Definition:</b> <a href="pkextract__random_8py_source.html#l00098">pkextract_random.py:98</a></div></div>
-<div class="ttc" id="classqgis_1_1pkextract__random_1_1pkextract__random_html_a12d5f2e69fb4d44ceaa3446295ae8c99"><div class="ttname"><a href="classqgis_1_1pkextract__random_1_1pkextract__random.html#a12d5f2e69fb4d44ceaa3446295ae8c99">qgis.pkextract_random.pkextract_random.cliName</a></div><div class="ttdeci">def cliName</div><div class="ttdef"><b>Definition:</b> <a href="pkextract__random_8py_source.html#l00104">pkextract_random.py:104</a></div></div>
-<div class="ttc" id="classqgis_1_1pkextract__random_1_1pkextract__random_html_a085ee08ae2a482d8cbaff595892c54a8"><div class="ttname"><a href="classqgis_1_1pkextract__random_1_1pkextract__random.html#a085ee08ae2a482d8cbaff595892c54a8">qgis.pkextract_random.pkextract_random.OUTPUT</a></div><div class="ttdeci">string OUTPUT</div><div class="ttdef"><b>Definition:</b> <a href="pkextract__random_8py_source.html#l00090">pkextract_random.py:90</a></div></div>
-<div class="ttc" id="classqgis_1_1pkextract__random_1_1pkextract__random_html_aa12d40db6d4c1db34cb7c9f577f7c005"><div class="ttname"><a href="classqgis_1_1pkextract__random_1_1pkextract__random.html#aa12d40db6d4c1db34cb7c9f577f7c005">qgis.pkextract_random.pkextract_random.INPUT</a></div><div class="ttdeci">string INPUT</div><div class="ttdef"><b>Definition:</b> <a href="pkextract__random_8py_source.html#l00089">pkextract_random.py:89</a></div></div>
-<div class="ttc" id="classqgis_1_1pkextract__random_1_1pkextract__random_html_a85a1e7cb635dcbd857a527768834e990"><div class="ttname"><a href="classqgis_1_1pkextract__random_1_1pkextract__random.html#a85a1e7cb635dcbd857a527768834e990">qgis.pkextract_random.pkextract_random.RULE_OPTIONS</a></div><div class="ttdeci">list RULE_OPTIONS</div><div class="ttdef"><b>Definition:</b> <a href="pkextract__random_8py_source.html#l00092">pkextract_random.py:92</a></div></div>
+<div class="ttc" id="classqgis_1_1pktools_1_1pkextract__random_1_1pkextract__random_html_a6d966809aee7401ccf7c298400e7d590"><div class="ttname"><a href="classqgis_1_1pktools_1_1pkextract__random_1_1pkextract__random.html#a6d966809aee7401ccf7c298400e7d590">qgis.pktools.pkextract_random.pkextract_random.POLYGON</a></div><div class="ttdeci">string POLYGON</div><div class="ttdef"><b>Definition:</b> <a href="pktools_2pkextract__random_8py_source.html#l00095">pkextract_random.py:95</a></div></div>
+<div class="ttc" id="classqgis_1_1pktools_1_1pkextract__random_1_1pkextract__random_html_a366ca672a6dc061ca5624107cd1e6701"><div class="ttname"><a href="classqgis_1_1pktools_1_1pkextract__random_1_1pkextract__random.html#a366ca672a6dc061ca5624107cd1e6701">qgis.pktools.pkextract_random.pkextract_random.EXTRA</a></div><div class="ttdeci">string EXTRA</div><div class="ttdef"><b>Definition:</b> <a href="pktools_2pkextract__random_8py_source.html#l00100">pkextract_random.py:100</a></div></div>
+<div class="ttc" id="classqgis_1_1pktools_1_1pkextract__random_1_1pkextract__random_html_a87570906ed677592d5f8bac33ff7a3d8"><div class="ttname"><a href="classqgis_1_1pktools_1_1pkextract__random_1_1pkextract__random.html#a87570906ed677592d5f8bac33ff7a3d8">qgis.pktools.pkextract_random.pkextract_random.group</a></div><div class="ttdeci">group</div><div class="ttdef"><b>Definition:</b> <a href="pktools_2pkextract__random_8py_source.html#l00109">pkextract_random.py:109</a></div></div>
+<div class="ttc" id="classqgis_1_1pktools_1_1pkextract__random_1_1pkextract__random_html_ada2bb55cda0c34c8b4a82a13401d2455"><div class="ttname"><a href="classqgis_1_1pktools_1_1pkextract__random_1_1pkextract__random.html#ada2bb55cda0c34c8b4a82a13401d2455">qgis.pktools.pkextract_random.pkextract_random.RULE_OPTIONS</a></div><div class="ttdeci">list RULE_OPTIONS</div><div class="ttdef"><b>Definition:</b> <a href="pktools_2pkextract__random_8py_source.html#l00092">pkextract_random.py:92</a> [...]
+<div class="ttc" id="classqgis_1_1pktools_1_1pkextract__random_1_1pkextract__random_html_aae134982ad295e7f2f206c85b6d28528"><div class="ttname"><a href="classqgis_1_1pktools_1_1pkextract__random_1_1pkextract__random.html#aae134982ad295e7f2f206c85b6d28528">qgis.pktools.pkextract_random.pkextract_random.RANDOM</a></div><div class="ttdeci">string RANDOM</div><div class="ttdef"><b>Definition:</b> <a href="pktools_2pkextract__random_8py_source.html#l00097">pkextract_random.py:97</a></div></div>
+<div class="ttc" id="classqgis_1_1pktools_1_1pkextract__random_1_1pkextract__random_html_aabe205b1faf586f973e527998303d834"><div class="ttname"><a href="classqgis_1_1pktools_1_1pkextract__random_1_1pkextract__random.html#aabe205b1faf586f973e527998303d834">qgis.pktools.pkextract_random.pkextract_random.BNDNODATA</a></div><div class="ttdeci">string BNDNODATA</div><div class="ttdef"><b>Definition:</b> <a href="pktools_2pkextract__random_8py_source.html#l00099">pkextract_random.py:99</a></di [...]
+<div class="ttc" id="classqgis_1_1pktools_1_1pkextract__random_1_1pkextract__random_html_a7a0f0334d5a3ecc367fc6621a9bfe63f"><div class="ttname"><a href="classqgis_1_1pktools_1_1pkextract__random_1_1pkextract__random.html#a7a0f0334d5a3ecc367fc6621a9bfe63f">qgis.pktools.pkextract_random.pkextract_random.SRCNODATA</a></div><div class="ttdeci">string SRCNODATA</div><div class="ttdef"><b>Definition:</b> <a href="pktools_2pkextract__random_8py_source.html#l00098">pkextract_random.py:98</a></di [...]
+<div class="ttc" id="classqgis_1_1pktools_1_1pkextract__random_1_1pkextract__random_html_a4ad3adfb8949647f7e2ce887ef844473"><div class="ttname"><a href="classqgis_1_1pktools_1_1pkextract__random_1_1pkextract__random.html#a4ad3adfb8949647f7e2ce887ef844473">qgis.pktools.pkextract_random.pkextract_random.cliName</a></div><div class="ttdeci">def cliName</div><div class="ttdef"><b>Definition:</b> <a href="pktools_2pkextract__random_8py_source.html#l00104">pkextract_random.py:104</a></div></div>
+<div class="ttc" id="classqgis_1_1pktools_1_1pkextract__random_1_1pkextract__random_html_aa477d50d42493c4a70f2d985dc235b8c"><div class="ttname"><a href="classqgis_1_1pktools_1_1pkextract__random_1_1pkextract__random.html#aa477d50d42493c4a70f2d985dc235b8c">qgis.pktools.pkextract_random.pkextract_random.FORMAT</a></div><div class="ttdeci">string FORMAT</div><div class="ttdef"><b>Definition:</b> <a href="pktools_2pkextract__random_8py_source.html#l00102">pkextract_random.py:102</a></div></div>
+<div class="ttc" id="classqgis_1_1pktools_1_1pkextract__random_1_1pkextract__random_html_a9cae04c4754d9863a12c776286e96fdb"><div class="ttname"><a href="classqgis_1_1pktools_1_1pkextract__random_1_1pkextract__random.html#a9cae04c4754d9863a12c776286e96fdb">qgis.pktools.pkextract_random.pkextract_random.BUFFER</a></div><div class="ttdeci">string BUFFER</div><div class="ttdef"><b>Definition:</b> <a href="pktools_2pkextract__random_8py_source.html#l00096">pkextract_random.py:96</a></div></div>
+<div class="ttc" id="classqgis_1_1pktools_1_1pkextract__random_1_1pkextract__random_html_af378362e275409fbaadf0164809d9580"><div class="ttname"><a href="classqgis_1_1pktools_1_1pkextract__random_1_1pkextract__random.html#af378362e275409fbaadf0164809d9580">qgis.pktools.pkextract_random.pkextract_random.INPUT</a></div><div class="ttdeci">string INPUT</div><div class="ttdef"><b>Definition:</b> <a href="pktools_2pkextract__random_8py_source.html#l00089">pkextract_random.py:89</a></div></div>
+<div class="ttc" id="classqgis_1_1pktools_1_1pkextract__random_1_1pkextract__random_html_ae3e01342bd3404b653c4b8d24f505f17"><div class="ttname"><a href="classqgis_1_1pktools_1_1pkextract__random_1_1pkextract__random.html#ae3e01342bd3404b653c4b8d24f505f17">qgis.pktools.pkextract_random.pkextract_random.RULE</a></div><div class="ttdeci">string RULE</div><div class="ttdef"><b>Definition:</b> <a href="pktools_2pkextract__random_8py_source.html#l00094">pkextract_random.py:94</a></div></div>
+<div class="ttc" id="classqgis_1_1pktools_1_1pkextract__random_1_1pkextract__random_html"><div class="ttname"><a href="classqgis_1_1pktools_1_1pkextract__random_1_1pkextract__random.html">qgis.pktools.pkextract_random.pkextract_random</a></div><div class="ttdef"><b>Definition:</b> <a href="pktools_2pkextract__random_8py_source.html#l00087">pkextract_random.py:87</a></div></div>
+<div class="ttc" id="classqgis_1_1pktools_1_1pkextract__random_1_1pkextract__random_html_af22352f109032ed3a3340b13a9013e09"><div class="ttname"><a href="classqgis_1_1pktools_1_1pkextract__random_1_1pkextract__random.html#af22352f109032ed3a3340b13a9013e09">qgis.pktools.pkextract_random.pkextract_random.name</a></div><div class="ttdeci">name</div><div class="ttdef"><b>Definition:</b> <a href="pktools_2pkextract__random_8py_source.html#l00108">pkextract_random.py:108</a></div></div>
+<div class="ttc" id="classqgis_1_1pktools_1_1pkextract__random_1_1pkextract__random_html_ada827e4d57de53322129310d1d2b01ac"><div class="ttname"><a href="classqgis_1_1pktools_1_1pkextract__random_1_1pkextract__random.html#ada827e4d57de53322129310d1d2b01ac">qgis.pktools.pkextract_random.pkextract_random.OUTPUT</a></div><div class="ttdeci">string OUTPUT</div><div class="ttdef"><b>Definition:</b> <a href="pktools_2pkextract__random_8py_source.html#l00090">pkextract_random.py:90</a></div></div>
 </div><!-- fragment --></div><!-- contents -->
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Jun 23 2015 17:09:36 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Tue Nov 3 2015 15:58:26 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/pkfilter__spatial_8py_source.html b/doc/html/pktools_2pkfilter__spatial_8py_source.html
similarity index 63%
copy from doc/html/pkfilter__spatial_8py_source.html
copy to doc/html/pktools_2pkfilter__spatial_8py_source.html
index d8b3c71..b849f4b 100644
--- a/doc/html/pkfilter__spatial_8py_source.html
+++ b/doc/html/pktools_2pkfilter__spatial_8py_source.html
@@ -4,7 +4,7 @@
 <meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
 <meta http-equiv="X-UA-Compatible" content="IE=9"/>
 <meta name="generator" content="Doxygen 1.8.6"/>
-<title>pktools: /home/kempenep/pktools/qgis/pkfilter_spatial.py Source File</title>
+<title>pktools: /home/kempenep/pktools/qgis/pktools/pkfilter_spatial.py Source File</title>
 <link href="tabs.css" rel="stylesheet" type="text/css"/>
 <script type="text/javascript" src="jquery.js"></script>
 <script type="text/javascript" src="dynsections.js"></script>
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.3</span>
+    <span id="projectnumber">2.6.4</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -44,7 +44,7 @@
   </div>
 <div id="nav-path" class="navpath">
   <ul>
-<li class="navelem"><a class="el" href="dir_5785acc8d2e42f8795bdbe936856f26d.html">qgis</a></li>  </ul>
+<li class="navelem"><a class="el" href="dir_5785acc8d2e42f8795bdbe936856f26d.html">qgis</a></li><li class="navelem"><a class="el" href="dir_b7cc22b4453454f1e686d9a2e78d988d.html">pktools</a></li>  </ul>
 </div>
 </div><!-- top -->
 <div class="header">
@@ -89,7 +89,7 @@
 <div class="line"><a name="l00035"></a><span class="lineno">   35</span> <span class="keyword">from</span> processing.core.parameters <span class="keyword">import</span> ParameterBoolean</div>
 <div class="line"><a name="l00036"></a><span class="lineno">   36</span> <span class="keyword">from</span> processing.core.parameters <span class="keyword">import</span> ParameterExtent</div>
 <div class="line"><a name="l00037"></a><span class="lineno">   37</span> </div>
-<div class="line"><a name="l00038"></a><span class="lineno"><a class="line" href="classqgis_1_1pkfilter__spatial_1_1pkfilter__spatial.html">   38</a></span> <span class="keyword">class </span><a class="code" href="classqgis_1_1pkfilter__spatial_1_1pkfilter__spatial.html">pkfilter_spatial</a>(pktoolsAlgorithm):</div>
+<div class="line"><a name="l00038"></a><span class="lineno"><a class="line" href="classqgis_1_1pktools_1_1pkfilter__spatial_1_1pkfilter__spatial.html">   38</a></span> <span class="keyword">class </span><a class="code" href="classqgis_1_1pktools_1_1pkfilter__spatial_1_1pkfilter__spatial.html">pkfilter_spatial</a>(pktoolsAlgorithm):</div>
 <div class="line"><a name="l00039"></a><span class="lineno">   39</span> </div>
 <div class="line"><a name="l00040"></a><span class="lineno">   40</span>     INPUT = <span class="stringliteral">"INPUT"</span></div>
 <div class="line"><a name="l00041"></a><span class="lineno">   41</span>     OUTPUT = <span class="stringliteral">"OUTPUT"</span></div>
@@ -109,81 +109,81 @@
 <div class="line"><a name="l00055"></a><span class="lineno">   55</span>         <span class="keywordflow">return</span> <span class="stringliteral">"pkfilter"</span></div>
 <div class="line"><a name="l00056"></a><span class="lineno">   56</span> </div>
 <div class="line"><a name="l00057"></a><span class="lineno">   57</span>     <span class="keyword">def </span>defineCharacteristics(self):</div>
-<div class="line"><a name="l00058"></a><span class="lineno">   58</span>         self.<a class="code" href="classqgis_1_1pkfilter__spatial_1_1pkfilter__spatial.html#abb1b57dd0e00851665ec24a1df526ab6">name</a> = <span class="stringliteral">"spatial filter"</span></div>
-<div class="line"><a name="l00059"></a><span class="lineno">   59</span>         self.<a class="code" href="classqgis_1_1pkfilter__spatial_1_1pkfilter__spatial.html#ab468aa6da0990f5884debd8bfbe27e21">group</a> = <span class="stringliteral">"[pktools] filter"</span></div>
+<div class="line"><a name="l00058"></a><span class="lineno">   58</span>         self.<a class="code" href="classqgis_1_1pktools_1_1pkfilter__spatial_1_1pkfilter__spatial.html#a94b3480f40673e5016d7383c63ec83a5">name</a> = <span class="stringliteral">"spatial filter"</span></div>
+<div class="line"><a name="l00059"></a><span class="lineno">   59</span>         self.<a class="code" href="classqgis_1_1pktools_1_1pkfilter__spatial_1_1pkfilter__spatial.html#afff9b2d6386a3a2f623056162d9d5cfd">group</a> = <span class="stringliteral">"[pktools] filter"</span></div>
 <div class="line"><a name="l00060"></a><span class="lineno">   60</span> </div>
-<div class="line"><a name="l00061"></a><span class="lineno">   61</span>         self.addParameter(ParameterRaster(self.<a class="code" href="classqgis_1_1pkfilter__spatial_1_1pkfilter__spatial.html#aab43173cb62c16cccd2311cc2351ea72">INPUT</a>, <span class="stringliteral">'Input layer raster data set'</span>,ParameterRaster))</div>
-<div class="line"><a name="l00062"></a><span class="lineno">   62</span>         self.addParameter(ParameterSelection(self.<a class="code" href="classqgis_1_1pkfilter__spatial_1_1pkfilter__spatial.html#a17c23d864a0778596b436f6fdb864de5">METHOD</a>,<span class="stringliteral">"filter rule"</span>,self.<a class="code" href="classqgis_1_1pkfilter__spatial_1_1pkfilter__spatial.html#af2ee51651a6a19a6922db57a4d72d549">METHOD_OPTIONS</a>, 0))</div>
-<div class="line"><a name="l00063"></a><span class="lineno">   63</span>         self.addOutput(OutputRaster(self.<a class="code" href="classqgis_1_1pkfilter__spatial_1_1pkfilter__spatial.html#a17420bcb37a89c2b89f4531ab6180de0">OUTPUT</a>, <span class="stringliteral">"Output raster data set"</span>))</div>
-<div class="line"><a name="l00064"></a><span class="lineno">   64</span>         self.addParameter(ParameterSelection(self.<a class="code" href="classqgis_1_1pkfilter__spatial_1_1pkfilter__spatial.html#a556dd033f6fbe62238ea73f26f142752">RTYPE</a>, <span class="stringliteral">'Output raster type (leave as none to keep original type)'</span>, self.<a class="code" href="classqgis_1_1pkfilter__spatial_1_1pkfilter__spatial.html#ac9bc83f6c62747fafd30efecb13c5d62">TYPE</a>, 0))</div>
-<div class="line"><a name="l00065"></a><span class="lineno">   65</span>         self.addParameter(ParameterNumber(self.<a class="code" href="classqgis_1_1pkfilter__spatial_1_1pkfilter__spatial.html#ac31abd8117f135e1e7f43bcbdd8456c9">DIM</a>, <span class="stringliteral">"Filter kernel size (odd value)"</span>,0.0,<span class="keywordtype">None</span>,3.0))</div>
+<div class="line"><a name="l00061"></a><span class="lineno">   61</span>         self.addParameter(ParameterRaster(self.<a class="code" href="classqgis_1_1pktools_1_1pkfilter__spatial_1_1pkfilter__spatial.html#a70643eead7c6d1505fad7e785fb65360">INPUT</a>, <span class="stringliteral">'Input layer raster data set'</span>,ParameterRaster))</div>
+<div class="line"><a name="l00062"></a><span class="lineno">   62</span>         self.addParameter(ParameterSelection(self.<a class="code" href="classqgis_1_1pktools_1_1pkfilter__spatial_1_1pkfilter__spatial.html#a50ea23abc53abb9a4b5b829c9e1ed221">METHOD</a>,<span class="stringliteral">"filter rule"</span>,self.<a class="code" href="classqgis_1_1pktools_1_1pkfilter__spatial_1_1pkfilter__spatial.html#a5f7665673481e0fc3fcec2249af3ded1">METHOD_OPTIONS</a>, 0))</div>
+<div class="line"><a name="l00063"></a><span class="lineno">   63</span>         self.addOutput(OutputRaster(self.<a class="code" href="classqgis_1_1pktools_1_1pkfilter__spatial_1_1pkfilter__spatial.html#a2bded0b49bef4a2fbd1fb93c5448cd31">OUTPUT</a>, <span class="stringliteral">"Output raster data set"</span>))</div>
+<div class="line"><a name="l00064"></a><span class="lineno">   64</span>         self.addParameter(ParameterSelection(self.<a class="code" href="classqgis_1_1pktools_1_1pkfilter__spatial_1_1pkfilter__spatial.html#a417eebdeec4c9e85ff7bf759c0f9396d">RTYPE</a>, <span class="stringliteral">'Output raster type (leave as none to keep original type)'</span>, self.<a class="code" href="classqgis_1_1pktools_1_1pkfilter__spatial_1_1pkfilter__spatial.html#a1b6d5e87c0633ad7b7297d8689b68 [...]
+<div class="line"><a name="l00065"></a><span class="lineno">   65</span>         self.addParameter(ParameterNumber(self.<a class="code" href="classqgis_1_1pktools_1_1pkfilter__spatial_1_1pkfilter__spatial.html#a5b3e50fc81018403e22380d4a9f81376">DIM</a>, <span class="stringliteral">"Filter kernel size (odd value)"</span>,0.0,<span class="keywordtype">None</span>,3.0))</div>
 <div class="line"><a name="l00066"></a><span class="lineno">   66</span>         <span class="comment">#for smooth nodata:</span></div>
-<div class="line"><a name="l00067"></a><span class="lineno">   67</span>         self.addParameter(ParameterString(self.<a class="code" href="classqgis_1_1pkfilter__spatial_1_1pkfilter__spatial.html#a241b1a8c1933b44e84da25c708a93e61">NODATA</a>, <span class="stringliteral">"invalid value(s) for input raster dataset (e.g., 0;255)"</span>,<span class="stringliteral">"none"</span>))</div>
-<div class="line"><a name="l00068"></a><span class="lineno">   68</span>         self.addParameter(ParameterSelection(self.<a class="code" href="classqgis_1_1pkfilter__spatial_1_1pkfilter__spatial.html#a359fadbd1e77c36bfa229b1708b364a0">PADDING</a>,<span class="stringliteral">"Padding (edge effects)"</span>,self.<a class="code" href="classqgis_1_1pkfilter__spatial_1_1pkfilter__spatial.html#a199b3a2d3018c67ea5046c7c38a9e974">PADDING_OPTIONS</a>, 0))</div>
+<div class="line"><a name="l00067"></a><span class="lineno">   67</span>         self.addParameter(ParameterString(self.<a class="code" href="classqgis_1_1pktools_1_1pkfilter__spatial_1_1pkfilter__spatial.html#a9f53b19e3f757101071ad12687ea8133">NODATA</a>, <span class="stringliteral">"invalid value(s) for input raster dataset (e.g., 0;255)"</span>,<span class="stringliteral">"none"</span>))</div>
+<div class="line"><a name="l00068"></a><span class="lineno">   68</span>         self.addParameter(ParameterSelection(self.<a class="code" href="classqgis_1_1pktools_1_1pkfilter__spatial_1_1pkfilter__spatial.html#a4c65e79b498ae3c1455181680af356ae">PADDING</a>,<span class="stringliteral">"Padding (edge effects)"</span>,self.<a class="code" href="classqgis_1_1pktools_1_1pkfilter__spatial_1_1pkfilter__spatial.html#a701591dea36d98ef8ebc551500eb38f7">PADDING_OPTIONS</a>, 0))</div>
 <div class="line"><a name="l00069"></a><span class="lineno">   69</span> <span class="comment">#        self.addParameter(ParameterSelection(self.RESAMPLE,"resampling method",self.RESAMPLE_OPTIONS, 0))</span></div>
-<div class="line"><a name="l00070"></a><span class="lineno">   70</span>         self.addParameter(ParameterString(self.<a class="code" href="classqgis_1_1pkfilter__spatial_1_1pkfilter__spatial.html#a1a3a4d8cc8523b66376f621feed86909">EXTRA</a>,</div>
+<div class="line"><a name="l00070"></a><span class="lineno">   70</span>         self.addParameter(ParameterString(self.<a class="code" href="classqgis_1_1pktools_1_1pkfilter__spatial_1_1pkfilter__spatial.html#aea043fa4377c44c0e081e7377f6b30b3">EXTRA</a>,</div>
 <div class="line"><a name="l00071"></a><span class="lineno">   71</span>                           <span class="stringliteral">'Additional parameters'</span>, <span class="stringliteral">'-of GTiff'</span>, optional=<span class="keyword">True</span>))</div>
 <div class="line"><a name="l00072"></a><span class="lineno">   72</span> </div>
 <div class="line"><a name="l00073"></a><span class="lineno">   73</span>     <span class="keyword">def </span>processAlgorithm(self, progress):</div>
-<div class="line"><a name="l00074"></a><span class="lineno">   74</span>         cliPath = <span class="stringliteral">'"'</span> + os.path.join(pktoolsUtils.pktoolsPath(), self.<a class="code" href="classqgis_1_1pkfilter__spatial_1_1pkfilter__spatial.html#a8517fc04fd5f13c52e174efc16736f83">cliName</a>()) + <span class="stringliteral">'"'</span></div>
+<div class="line"><a name="l00074"></a><span class="lineno">   74</span>         cliPath = <span class="stringliteral">'"'</span> + os.path.join(pktoolsUtils.pktoolsPath(), self.<a class="code" href="classqgis_1_1pktools_1_1pkfilter__spatial_1_1pkfilter__spatial.html#a49b7370981ec4d1b7ce7fe15c26138bd">cliName</a>()) + <span class="stringliteral">'"'</span></div>
 <div class="line"><a name="l00075"></a><span class="lineno">   75</span>         commands = [cliPath]</div>
 <div class="line"><a name="l00076"></a><span class="lineno">   76</span> </div>
-<div class="line"><a name="l00077"></a><span class="lineno">   77</span>         input=self.getParameterValue(self.<a class="code" href="classqgis_1_1pkfilter__spatial_1_1pkfilter__spatial.html#aab43173cb62c16cccd2311cc2351ea72">INPUT</a>)</div>
+<div class="line"><a name="l00077"></a><span class="lineno">   77</span>         input=self.getParameterValue(self.<a class="code" href="classqgis_1_1pktools_1_1pkfilter__spatial_1_1pkfilter__spatial.html#a70643eead7c6d1505fad7e785fb65360">INPUT</a>)</div>
 <div class="line"><a name="l00078"></a><span class="lineno">   78</span>         <span class="keywordflow">if</span> input != <span class="stringliteral">""</span>:</div>
 <div class="line"><a name="l00079"></a><span class="lineno">   79</span>             commands.append(<span class="stringliteral">'-i'</span>)</div>
 <div class="line"><a name="l00080"></a><span class="lineno">   80</span>             commands.append(<span class="stringliteral">'"'</span> + input + <span class="stringliteral">'"'</span>)</div>
 <div class="line"><a name="l00081"></a><span class="lineno">   81</span> </div>
-<div class="line"><a name="l00082"></a><span class="lineno">   82</span>         method=self.<a class="code" href="classqgis_1_1pkfilter__spatial_1_1pkfilter__spatial.html#af2ee51651a6a19a6922db57a4d72d549">METHOD_OPTIONS</a>[self.getParameterValue(self.<a class="code" href="classqgis_1_1pkfilter__spatial_1_1pkfilter__spatial.html#a17c23d864a0778596b436f6fdb864de5">METHOD</a>)]</div>
+<div class="line"><a name="l00082"></a><span class="lineno">   82</span>         method=self.<a class="code" href="classqgis_1_1pktools_1_1pkfilter__spatial_1_1pkfilter__spatial.html#a5f7665673481e0fc3fcec2249af3ded1">METHOD_OPTIONS</a>[self.getParameterValue(self.<a class="code" href="classqgis_1_1pktools_1_1pkfilter__spatial_1_1pkfilter__spatial.html#a50ea23abc53abb9a4b5b829c9e1ed221">METHOD</a>)]</div>
 <div class="line"><a name="l00083"></a><span class="lineno">   83</span>         <span class="keywordflow">if</span> method != <span class="stringliteral">"none"</span>:</div>
 <div class="line"><a name="l00084"></a><span class="lineno">   84</span>             commands.append(<span class="stringliteral">"-f"</span>)</div>
 <div class="line"><a name="l00085"></a><span class="lineno">   85</span>             commands.append(method)</div>
 <div class="line"><a name="l00086"></a><span class="lineno">   86</span>         commands.append(<span class="stringliteral">"-pad"</span>)</div>
-<div class="line"><a name="l00087"></a><span class="lineno">   87</span>         commands.append(self.<a class="code" href="classqgis_1_1pkfilter__spatial_1_1pkfilter__spatial.html#a199b3a2d3018c67ea5046c7c38a9e974">PADDING_OPTIONS</a>[self.getParameterValue(self.<a class="code" href="classqgis_1_1pkfilter__spatial_1_1pkfilter__spatial.html#a359fadbd1e77c36bfa229b1708b364a0">PADDING</a>)])</div>
+<div class="line"><a name="l00087"></a><span class="lineno">   87</span>         commands.append(self.<a class="code" href="classqgis_1_1pktools_1_1pkfilter__spatial_1_1pkfilter__spatial.html#a701591dea36d98ef8ebc551500eb38f7">PADDING_OPTIONS</a>[self.getParameterValue(self.<a class="code" href="classqgis_1_1pktools_1_1pkfilter__spatial_1_1pkfilter__spatial.html#a4c65e79b498ae3c1455181680af356ae">PADDING</a>)])</div>
 <div class="line"><a name="l00088"></a><span class="lineno">   88</span> </div>
-<div class="line"><a name="l00089"></a><span class="lineno">   89</span>         <span class="keywordflow">if</span> self.<a class="code" href="classqgis_1_1pkfilter__spatial_1_1pkfilter__spatial.html#ac9bc83f6c62747fafd30efecb13c5d62">TYPE</a>[self.getParameterValue(self.<a class="code" href="classqgis_1_1pkfilter__spatial_1_1pkfilter__spatial.html#a556dd033f6fbe62238ea73f26f142752">RTYPE</a>)] != <span class="stringliteral">"none"</span>:</div>
+<div class="line"><a name="l00089"></a><span class="lineno">   89</span>         <span class="keywordflow">if</span> self.<a class="code" href="classqgis_1_1pktools_1_1pkfilter__spatial_1_1pkfilter__spatial.html#a1b6d5e87c0633ad7b7297d8689b681d8">TYPE</a>[self.getParameterValue(self.<a class="code" href="classqgis_1_1pktools_1_1pkfilter__spatial_1_1pkfilter__spatial.html#a417eebdeec4c9e85ff7bf759c0f9396d">RTYPE</a>)] != <span class="stringliteral">"none"</span>:</div>
 <div class="line"><a name="l00090"></a><span class="lineno">   90</span>             commands.append(<span class="stringliteral">'-ot'</span>)</div>
-<div class="line"><a name="l00091"></a><span class="lineno">   91</span>             commands.append(self.<a class="code" href="classqgis_1_1pkfilter__spatial_1_1pkfilter__spatial.html#ac9bc83f6c62747fafd30efecb13c5d62">TYPE</a>[self.getParameterValue(self.<a class="code" href="classqgis_1_1pkfilter__spatial_1_1pkfilter__spatial.html#a556dd033f6fbe62238ea73f26f142752">RTYPE</a>)])</div>
-<div class="line"><a name="l00092"></a><span class="lineno">   92</span>         output=self.getOutputValue(self.<a class="code" href="classqgis_1_1pkfilter__spatial_1_1pkfilter__spatial.html#a17420bcb37a89c2b89f4531ab6180de0">OUTPUT</a>)</div>
+<div class="line"><a name="l00091"></a><span class="lineno">   91</span>             commands.append(self.<a class="code" href="classqgis_1_1pktools_1_1pkfilter__spatial_1_1pkfilter__spatial.html#a1b6d5e87c0633ad7b7297d8689b681d8">TYPE</a>[self.getParameterValue(self.<a class="code" href="classqgis_1_1pktools_1_1pkfilter__spatial_1_1pkfilter__spatial.html#a417eebdeec4c9e85ff7bf759c0f9396d">RTYPE</a>)])</div>
+<div class="line"><a name="l00092"></a><span class="lineno">   92</span>         output=self.getOutputValue(self.<a class="code" href="classqgis_1_1pktools_1_1pkfilter__spatial_1_1pkfilter__spatial.html#a2bded0b49bef4a2fbd1fb93c5448cd31">OUTPUT</a>)</div>
 <div class="line"><a name="l00093"></a><span class="lineno">   93</span>         <span class="keywordflow">if</span> output != <span class="stringliteral">""</span>:</div>
 <div class="line"><a name="l00094"></a><span class="lineno">   94</span>             commands.append(<span class="stringliteral">"-o"</span>)</div>
 <div class="line"><a name="l00095"></a><span class="lineno">   95</span>             commands.append(<span class="stringliteral">'"'</span> + output + <span class="stringliteral">'"'</span>)</div>
 <div class="line"><a name="l00096"></a><span class="lineno">   96</span> </div>
-<div class="line"><a name="l00097"></a><span class="lineno">   97</span>         <span class="keywordflow">if</span> self.getParameterValue(self.<a class="code" href="classqgis_1_1pkfilter__spatial_1_1pkfilter__spatial.html#ac31abd8117f135e1e7f43bcbdd8456c9">DIM</a>) != 0:</div>
+<div class="line"><a name="l00097"></a><span class="lineno">   97</span>         <span class="keywordflow">if</span> self.getParameterValue(self.<a class="code" href="classqgis_1_1pktools_1_1pkfilter__spatial_1_1pkfilter__spatial.html#a5b3e50fc81018403e22380d4a9f81376">DIM</a>) != 0:</div>
 <div class="line"><a name="l00098"></a><span class="lineno">   98</span>             commands.append(<span class="stringliteral">"-dx"</span>)</div>
-<div class="line"><a name="l00099"></a><span class="lineno">   99</span>             commands.append(str(self.getParameterValue(self.<a class="code" href="classqgis_1_1pkfilter__spatial_1_1pkfilter__spatial.html#ac31abd8117f135e1e7f43bcbdd8456c9">DIM</a>)))</div>
+<div class="line"><a name="l00099"></a><span class="lineno">   99</span>             commands.append(str(self.getParameterValue(self.<a class="code" href="classqgis_1_1pktools_1_1pkfilter__spatial_1_1pkfilter__spatial.html#a5b3e50fc81018403e22380d4a9f81376">DIM</a>)))</div>
 <div class="line"><a name="l00100"></a><span class="lineno">  100</span>             commands.append(<span class="stringliteral">"-dy"</span>)</div>
-<div class="line"><a name="l00101"></a><span class="lineno">  101</span>             commands.append(str(self.getParameterValue(self.<a class="code" href="classqgis_1_1pkfilter__spatial_1_1pkfilter__spatial.html#ac31abd8117f135e1e7f43bcbdd8456c9">DIM</a>)))</div>
-<div class="line"><a name="l00102"></a><span class="lineno">  102</span>         nodata=self.getParameterValue(self.<a class="code" href="classqgis_1_1pkfilter__spatial_1_1pkfilter__spatial.html#a241b1a8c1933b44e84da25c708a93e61">NODATA</a>)</div>
+<div class="line"><a name="l00101"></a><span class="lineno">  101</span>             commands.append(str(self.getParameterValue(self.<a class="code" href="classqgis_1_1pktools_1_1pkfilter__spatial_1_1pkfilter__spatial.html#a5b3e50fc81018403e22380d4a9f81376">DIM</a>)))</div>
+<div class="line"><a name="l00102"></a><span class="lineno">  102</span>         nodata=self.getParameterValue(self.<a class="code" href="classqgis_1_1pktools_1_1pkfilter__spatial_1_1pkfilter__spatial.html#a9f53b19e3f757101071ad12687ea8133">NODATA</a>)</div>
 <div class="line"><a name="l00103"></a><span class="lineno">  103</span>         <span class="keywordflow">if</span> nodata != <span class="stringliteral">"none"</span>:</div>
 <div class="line"><a name="l00104"></a><span class="lineno">  104</span>             nodataValues = nodata.split(<span class="stringliteral">';'</span>)</div>
 <div class="line"><a name="l00105"></a><span class="lineno">  105</span>             <span class="keywordflow">for</span> nodataValue <span class="keywordflow">in</span> nodataValues:</div>
 <div class="line"><a name="l00106"></a><span class="lineno">  106</span>                 commands.append(<span class="stringliteral">'-nodata'</span>)</div>
 <div class="line"><a name="l00107"></a><span class="lineno">  107</span>                 commands.append(nodataValue)</div>
-<div class="line"><a name="l00108"></a><span class="lineno">  108</span>         extra = str(self.getParameterValue(self.<a class="code" href="classqgis_1_1pkfilter__spatial_1_1pkfilter__spatial.html#a1a3a4d8cc8523b66376f621feed86909">EXTRA</a>))</div>
+<div class="line"><a name="l00108"></a><span class="lineno">  108</span>         extra = str(self.getParameterValue(self.<a class="code" href="classqgis_1_1pktools_1_1pkfilter__spatial_1_1pkfilter__spatial.html#aea043fa4377c44c0e081e7377f6b30b3">EXTRA</a>))</div>
 <div class="line"><a name="l00109"></a><span class="lineno">  109</span>         <span class="keywordflow">if</span> len(extra) > 0:</div>
 <div class="line"><a name="l00110"></a><span class="lineno">  110</span>             commands.append(extra)</div>
 <div class="line"><a name="l00111"></a><span class="lineno">  111</span> </div>
 <div class="line"><a name="l00112"></a><span class="lineno">  112</span>         pktoolsUtils.runpktools(commands, progress)</div>
-<div class="ttc" id="classqgis_1_1pkfilter__spatial_1_1pkfilter__spatial_html_af2ee51651a6a19a6922db57a4d72d549"><div class="ttname"><a href="classqgis_1_1pkfilter__spatial_1_1pkfilter__spatial.html#af2ee51651a6a19a6922db57a4d72d549">qgis.pkfilter_spatial.pkfilter_spatial.METHOD_OPTIONS</a></div><div class="ttdeci">list METHOD_OPTIONS</div><div class="ttdef"><b>Definition:</b> <a href="pkfilter__spatial_8py_source.html#l00042">pkfilter_spatial.py:42</a></div></div>
-<div class="ttc" id="classqgis_1_1pkfilter__spatial_1_1pkfilter__spatial_html_ac31abd8117f135e1e7f43bcbdd8456c9"><div class="ttname"><a href="classqgis_1_1pkfilter__spatial_1_1pkfilter__spatial.html#ac31abd8117f135e1e7f43bcbdd8456c9">qgis.pkfilter_spatial.pkfilter_spatial.DIM</a></div><div class="ttdeci">string DIM</div><div class="ttdef"><b>Definition:</b> <a href="pkfilter__spatial_8py_source.html#l00046">pkfilter_spatial.py:46</a></div></div>
-<div class="ttc" id="classqgis_1_1pkfilter__spatial_1_1pkfilter__spatial_html_a359fadbd1e77c36bfa229b1708b364a0"><div class="ttname"><a href="classqgis_1_1pkfilter__spatial_1_1pkfilter__spatial.html#a359fadbd1e77c36bfa229b1708b364a0">qgis.pkfilter_spatial.pkfilter_spatial.PADDING</a></div><div class="ttdeci">string PADDING</div><div class="ttdef"><b>Definition:</b> <a href="pkfilter__spatial_8py_source.html#l00049">pkfilter_spatial.py:49</a></div></div>
-<div class="ttc" id="classqgis_1_1pkfilter__spatial_1_1pkfilter__spatial_html_a1a3a4d8cc8523b66376f621feed86909"><div class="ttname"><a href="classqgis_1_1pkfilter__spatial_1_1pkfilter__spatial.html#a1a3a4d8cc8523b66376f621feed86909">qgis.pkfilter_spatial.pkfilter_spatial.EXTRA</a></div><div class="ttdeci">string EXTRA</div><div class="ttdef"><b>Definition:</b> <a href="pkfilter__spatial_8py_source.html#l00052">pkfilter_spatial.py:52</a></div></div>
-<div class="ttc" id="classqgis_1_1pkfilter__spatial_1_1pkfilter__spatial_html_aab43173cb62c16cccd2311cc2351ea72"><div class="ttname"><a href="classqgis_1_1pkfilter__spatial_1_1pkfilter__spatial.html#aab43173cb62c16cccd2311cc2351ea72">qgis.pkfilter_spatial.pkfilter_spatial.INPUT</a></div><div class="ttdeci">string INPUT</div><div class="ttdef"><b>Definition:</b> <a href="pkfilter__spatial_8py_source.html#l00040">pkfilter_spatial.py:40</a></div></div>
-<div class="ttc" id="classqgis_1_1pkfilter__spatial_1_1pkfilter__spatial_html_a199b3a2d3018c67ea5046c7c38a9e974"><div class="ttname"><a href="classqgis_1_1pkfilter__spatial_1_1pkfilter__spatial.html#a199b3a2d3018c67ea5046c7c38a9e974">qgis.pkfilter_spatial.pkfilter_spatial.PADDING_OPTIONS</a></div><div class="ttdeci">list PADDING_OPTIONS</div><div class="ttdef"><b>Definition:</b> <a href="pkfilter__spatial_8py_source.html#l00048">pkfilter_spatial.py:48</a></div></div>
-<div class="ttc" id="classqgis_1_1pkfilter__spatial_1_1pkfilter__spatial_html_a17c23d864a0778596b436f6fdb864de5"><div class="ttname"><a href="classqgis_1_1pkfilter__spatial_1_1pkfilter__spatial.html#a17c23d864a0778596b436f6fdb864de5">qgis.pkfilter_spatial.pkfilter_spatial.METHOD</a></div><div class="ttdeci">string METHOD</div><div class="ttdef"><b>Definition:</b> <a href="pkfilter__spatial_8py_source.html#l00043">pkfilter_spatial.py:43</a></div></div>
-<div class="ttc" id="classqgis_1_1pkfilter__spatial_1_1pkfilter__spatial_html_a556dd033f6fbe62238ea73f26f142752"><div class="ttname"><a href="classqgis_1_1pkfilter__spatial_1_1pkfilter__spatial.html#a556dd033f6fbe62238ea73f26f142752">qgis.pkfilter_spatial.pkfilter_spatial.RTYPE</a></div><div class="ttdeci">string RTYPE</div><div class="ttdef"><b>Definition:</b> <a href="pkfilter__spatial_8py_source.html#l00050">pkfilter_spatial.py:50</a></div></div>
-<div class="ttc" id="classqgis_1_1pkfilter__spatial_1_1pkfilter__spatial_html"><div class="ttname"><a href="classqgis_1_1pkfilter__spatial_1_1pkfilter__spatial.html">qgis.pkfilter_spatial.pkfilter_spatial</a></div><div class="ttdef"><b>Definition:</b> <a href="pkfilter__spatial_8py_source.html#l00038">pkfilter_spatial.py:38</a></div></div>
-<div class="ttc" id="classqgis_1_1pkfilter__spatial_1_1pkfilter__spatial_html_a17420bcb37a89c2b89f4531ab6180de0"><div class="ttname"><a href="classqgis_1_1pkfilter__spatial_1_1pkfilter__spatial.html#a17420bcb37a89c2b89f4531ab6180de0">qgis.pkfilter_spatial.pkfilter_spatial.OUTPUT</a></div><div class="ttdeci">string OUTPUT</div><div class="ttdef"><b>Definition:</b> <a href="pkfilter__spatial_8py_source.html#l00041">pkfilter_spatial.py:41</a></div></div>
-<div class="ttc" id="classqgis_1_1pkfilter__spatial_1_1pkfilter__spatial_html_a241b1a8c1933b44e84da25c708a93e61"><div class="ttname"><a href="classqgis_1_1pkfilter__spatial_1_1pkfilter__spatial.html#a241b1a8c1933b44e84da25c708a93e61">qgis.pkfilter_spatial.pkfilter_spatial.NODATA</a></div><div class="ttdeci">string NODATA</div><div class="ttdef"><b>Definition:</b> <a href="pkfilter__spatial_8py_source.html#l00047">pkfilter_spatial.py:47</a></div></div>
-<div class="ttc" id="classqgis_1_1pkfilter__spatial_1_1pkfilter__spatial_html_abb1b57dd0e00851665ec24a1df526ab6"><div class="ttname"><a href="classqgis_1_1pkfilter__spatial_1_1pkfilter__spatial.html#abb1b57dd0e00851665ec24a1df526ab6">qgis.pkfilter_spatial.pkfilter_spatial.name</a></div><div class="ttdeci">name</div><div class="ttdef"><b>Definition:</b> <a href="pkfilter__spatial_8py_source.html#l00058">pkfilter_spatial.py:58</a></div></div>
-<div class="ttc" id="classqgis_1_1pkfilter__spatial_1_1pkfilter__spatial_html_a8517fc04fd5f13c52e174efc16736f83"><div class="ttname"><a href="classqgis_1_1pkfilter__spatial_1_1pkfilter__spatial.html#a8517fc04fd5f13c52e174efc16736f83">qgis.pkfilter_spatial.pkfilter_spatial.cliName</a></div><div class="ttdeci">def cliName</div><div class="ttdef"><b>Definition:</b> <a href="pkfilter__spatial_8py_source.html#l00054">pkfilter_spatial.py:54</a></div></div>
-<div class="ttc" id="classqgis_1_1pkfilter__spatial_1_1pkfilter__spatial_html_ab468aa6da0990f5884debd8bfbe27e21"><div class="ttname"><a href="classqgis_1_1pkfilter__spatial_1_1pkfilter__spatial.html#ab468aa6da0990f5884debd8bfbe27e21">qgis.pkfilter_spatial.pkfilter_spatial.group</a></div><div class="ttdeci">group</div><div class="ttdef"><b>Definition:</b> <a href="pkfilter__spatial_8py_source.html#l00059">pkfilter_spatial.py:59</a></div></div>
-<div class="ttc" id="classqgis_1_1pkfilter__spatial_1_1pkfilter__spatial_html_ac9bc83f6c62747fafd30efecb13c5d62"><div class="ttname"><a href="classqgis_1_1pkfilter__spatial_1_1pkfilter__spatial.html#ac9bc83f6c62747fafd30efecb13c5d62">qgis.pkfilter_spatial.pkfilter_spatial.TYPE</a></div><div class="ttdeci">list TYPE</div><div class="ttdef"><b>Definition:</b> <a href="pkfilter__spatial_8py_source.html#l00051">pkfilter_spatial.py:51</a></div></div>
+<div class="ttc" id="classqgis_1_1pktools_1_1pkfilter__spatial_1_1pkfilter__spatial_html_a4c65e79b498ae3c1455181680af356ae"><div class="ttname"><a href="classqgis_1_1pktools_1_1pkfilter__spatial_1_1pkfilter__spatial.html#a4c65e79b498ae3c1455181680af356ae">qgis.pktools.pkfilter_spatial.pkfilter_spatial.PADDING</a></div><div class="ttdeci">string PADDING</div><div class="ttdef"><b>Definition:</b> <a href="pktools_2pkfilter__spatial_8py_source.html#l00049">pkfilter_spatial.py:49</a></div></div>
+<div class="ttc" id="classqgis_1_1pktools_1_1pkfilter__spatial_1_1pkfilter__spatial_html_a417eebdeec4c9e85ff7bf759c0f9396d"><div class="ttname"><a href="classqgis_1_1pktools_1_1pkfilter__spatial_1_1pkfilter__spatial.html#a417eebdeec4c9e85ff7bf759c0f9396d">qgis.pktools.pkfilter_spatial.pkfilter_spatial.RTYPE</a></div><div class="ttdeci">string RTYPE</div><div class="ttdef"><b>Definition:</b> <a href="pktools_2pkfilter__spatial_8py_source.html#l00050">pkfilter_spatial.py:50</a></div></div>
+<div class="ttc" id="classqgis_1_1pktools_1_1pkfilter__spatial_1_1pkfilter__spatial_html_a1b6d5e87c0633ad7b7297d8689b681d8"><div class="ttname"><a href="classqgis_1_1pktools_1_1pkfilter__spatial_1_1pkfilter__spatial.html#a1b6d5e87c0633ad7b7297d8689b681d8">qgis.pktools.pkfilter_spatial.pkfilter_spatial.TYPE</a></div><div class="ttdeci">list TYPE</div><div class="ttdef"><b>Definition:</b> <a href="pktools_2pkfilter__spatial_8py_source.html#l00051">pkfilter_spatial.py:51</a></div></div>
+<div class="ttc" id="classqgis_1_1pktools_1_1pkfilter__spatial_1_1pkfilter__spatial_html_a5b3e50fc81018403e22380d4a9f81376"><div class="ttname"><a href="classqgis_1_1pktools_1_1pkfilter__spatial_1_1pkfilter__spatial.html#a5b3e50fc81018403e22380d4a9f81376">qgis.pktools.pkfilter_spatial.pkfilter_spatial.DIM</a></div><div class="ttdeci">string DIM</div><div class="ttdef"><b>Definition:</b> <a href="pktools_2pkfilter__spatial_8py_source.html#l00046">pkfilter_spatial.py:46</a></div></div>
+<div class="ttc" id="classqgis_1_1pktools_1_1pkfilter__spatial_1_1pkfilter__spatial_html"><div class="ttname"><a href="classqgis_1_1pktools_1_1pkfilter__spatial_1_1pkfilter__spatial.html">qgis.pktools.pkfilter_spatial.pkfilter_spatial</a></div><div class="ttdef"><b>Definition:</b> <a href="pktools_2pkfilter__spatial_8py_source.html#l00038">pkfilter_spatial.py:38</a></div></div>
+<div class="ttc" id="classqgis_1_1pktools_1_1pkfilter__spatial_1_1pkfilter__spatial_html_aea043fa4377c44c0e081e7377f6b30b3"><div class="ttname"><a href="classqgis_1_1pktools_1_1pkfilter__spatial_1_1pkfilter__spatial.html#aea043fa4377c44c0e081e7377f6b30b3">qgis.pktools.pkfilter_spatial.pkfilter_spatial.EXTRA</a></div><div class="ttdeci">string EXTRA</div><div class="ttdef"><b>Definition:</b> <a href="pktools_2pkfilter__spatial_8py_source.html#l00052">pkfilter_spatial.py:52</a></div></div>
+<div class="ttc" id="classqgis_1_1pktools_1_1pkfilter__spatial_1_1pkfilter__spatial_html_a94b3480f40673e5016d7383c63ec83a5"><div class="ttname"><a href="classqgis_1_1pktools_1_1pkfilter__spatial_1_1pkfilter__spatial.html#a94b3480f40673e5016d7383c63ec83a5">qgis.pktools.pkfilter_spatial.pkfilter_spatial.name</a></div><div class="ttdeci">name</div><div class="ttdef"><b>Definition:</b> <a href="pktools_2pkfilter__spatial_8py_source.html#l00058">pkfilter_spatial.py:58</a></div></div>
+<div class="ttc" id="classqgis_1_1pktools_1_1pkfilter__spatial_1_1pkfilter__spatial_html_a2bded0b49bef4a2fbd1fb93c5448cd31"><div class="ttname"><a href="classqgis_1_1pktools_1_1pkfilter__spatial_1_1pkfilter__spatial.html#a2bded0b49bef4a2fbd1fb93c5448cd31">qgis.pktools.pkfilter_spatial.pkfilter_spatial.OUTPUT</a></div><div class="ttdeci">string OUTPUT</div><div class="ttdef"><b>Definition:</b> <a href="pktools_2pkfilter__spatial_8py_source.html#l00041">pkfilter_spatial.py:41</a></div></div>
+<div class="ttc" id="classqgis_1_1pktools_1_1pkfilter__spatial_1_1pkfilter__spatial_html_a5f7665673481e0fc3fcec2249af3ded1"><div class="ttname"><a href="classqgis_1_1pktools_1_1pkfilter__spatial_1_1pkfilter__spatial.html#a5f7665673481e0fc3fcec2249af3ded1">qgis.pktools.pkfilter_spatial.pkfilter_spatial.METHOD_OPTIONS</a></div><div class="ttdeci">list METHOD_OPTIONS</div><div class="ttdef"><b>Definition:</b> <a href="pktools_2pkfilter__spatial_8py_source.html#l00042">pkfilter_spatial.py:42 [...]
+<div class="ttc" id="classqgis_1_1pktools_1_1pkfilter__spatial_1_1pkfilter__spatial_html_a49b7370981ec4d1b7ce7fe15c26138bd"><div class="ttname"><a href="classqgis_1_1pktools_1_1pkfilter__spatial_1_1pkfilter__spatial.html#a49b7370981ec4d1b7ce7fe15c26138bd">qgis.pktools.pkfilter_spatial.pkfilter_spatial.cliName</a></div><div class="ttdeci">def cliName</div><div class="ttdef"><b>Definition:</b> <a href="pktools_2pkfilter__spatial_8py_source.html#l00054">pkfilter_spatial.py:54</a></div></div>
+<div class="ttc" id="classqgis_1_1pktools_1_1pkfilter__spatial_1_1pkfilter__spatial_html_afff9b2d6386a3a2f623056162d9d5cfd"><div class="ttname"><a href="classqgis_1_1pktools_1_1pkfilter__spatial_1_1pkfilter__spatial.html#afff9b2d6386a3a2f623056162d9d5cfd">qgis.pktools.pkfilter_spatial.pkfilter_spatial.group</a></div><div class="ttdeci">group</div><div class="ttdef"><b>Definition:</b> <a href="pktools_2pkfilter__spatial_8py_source.html#l00059">pkfilter_spatial.py:59</a></div></div>
+<div class="ttc" id="classqgis_1_1pktools_1_1pkfilter__spatial_1_1pkfilter__spatial_html_a70643eead7c6d1505fad7e785fb65360"><div class="ttname"><a href="classqgis_1_1pktools_1_1pkfilter__spatial_1_1pkfilter__spatial.html#a70643eead7c6d1505fad7e785fb65360">qgis.pktools.pkfilter_spatial.pkfilter_spatial.INPUT</a></div><div class="ttdeci">string INPUT</div><div class="ttdef"><b>Definition:</b> <a href="pktools_2pkfilter__spatial_8py_source.html#l00040">pkfilter_spatial.py:40</a></div></div>
+<div class="ttc" id="classqgis_1_1pktools_1_1pkfilter__spatial_1_1pkfilter__spatial_html_a50ea23abc53abb9a4b5b829c9e1ed221"><div class="ttname"><a href="classqgis_1_1pktools_1_1pkfilter__spatial_1_1pkfilter__spatial.html#a50ea23abc53abb9a4b5b829c9e1ed221">qgis.pktools.pkfilter_spatial.pkfilter_spatial.METHOD</a></div><div class="ttdeci">string METHOD</div><div class="ttdef"><b>Definition:</b> <a href="pktools_2pkfilter__spatial_8py_source.html#l00043">pkfilter_spatial.py:43</a></div></div>
+<div class="ttc" id="classqgis_1_1pktools_1_1pkfilter__spatial_1_1pkfilter__spatial_html_a9f53b19e3f757101071ad12687ea8133"><div class="ttname"><a href="classqgis_1_1pktools_1_1pkfilter__spatial_1_1pkfilter__spatial.html#a9f53b19e3f757101071ad12687ea8133">qgis.pktools.pkfilter_spatial.pkfilter_spatial.NODATA</a></div><div class="ttdeci">string NODATA</div><div class="ttdef"><b>Definition:</b> <a href="pktools_2pkfilter__spatial_8py_source.html#l00047">pkfilter_spatial.py:47</a></div></div>
+<div class="ttc" id="classqgis_1_1pktools_1_1pkfilter__spatial_1_1pkfilter__spatial_html_a701591dea36d98ef8ebc551500eb38f7"><div class="ttname"><a href="classqgis_1_1pktools_1_1pkfilter__spatial_1_1pkfilter__spatial.html#a701591dea36d98ef8ebc551500eb38f7">qgis.pktools.pkfilter_spatial.pkfilter_spatial.PADDING_OPTIONS</a></div><div class="ttdeci">list PADDING_OPTIONS</div><div class="ttdef"><b>Definition:</b> <a href="pktools_2pkfilter__spatial_8py_source.html#l00048">pkfilter_spatial.py: [...]
 </div><!-- fragment --></div><!-- contents -->
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Jun 23 2015 17:09:36 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Tue Nov 3 2015 15:58:26 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/pkfilter__spectral_8py_source.html b/doc/html/pktools_2pkfilter__spectral_8py_source.html
similarity index 61%
copy from doc/html/pkfilter__spectral_8py_source.html
copy to doc/html/pktools_2pkfilter__spectral_8py_source.html
index 503a272..2ad847a 100644
--- a/doc/html/pkfilter__spectral_8py_source.html
+++ b/doc/html/pktools_2pkfilter__spectral_8py_source.html
@@ -4,7 +4,7 @@
 <meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
 <meta http-equiv="X-UA-Compatible" content="IE=9"/>
 <meta name="generator" content="Doxygen 1.8.6"/>
-<title>pktools: /home/kempenep/pktools/qgis/pkfilter_spectral.py Source File</title>
+<title>pktools: /home/kempenep/pktools/qgis/pktools/pkfilter_spectral.py Source File</title>
 <link href="tabs.css" rel="stylesheet" type="text/css"/>
 <script type="text/javascript" src="jquery.js"></script>
 <script type="text/javascript" src="dynsections.js"></script>
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.3</span>
+    <span id="projectnumber">2.6.4</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -44,7 +44,7 @@
   </div>
 <div id="nav-path" class="navpath">
   <ul>
-<li class="navelem"><a class="el" href="dir_5785acc8d2e42f8795bdbe936856f26d.html">qgis</a></li>  </ul>
+<li class="navelem"><a class="el" href="dir_5785acc8d2e42f8795bdbe936856f26d.html">qgis</a></li><li class="navelem"><a class="el" href="dir_b7cc22b4453454f1e686d9a2e78d988d.html">pktools</a></li>  </ul>
 </div>
 </div><!-- top -->
 <div class="header">
@@ -89,7 +89,7 @@
 <div class="line"><a name="l00035"></a><span class="lineno">   35</span> <span class="keyword">from</span> processing.core.parameters <span class="keyword">import</span> ParameterBoolean</div>
 <div class="line"><a name="l00036"></a><span class="lineno">   36</span> <span class="keyword">from</span> processing.core.parameters <span class="keyword">import</span> ParameterExtent</div>
 <div class="line"><a name="l00037"></a><span class="lineno">   37</span> </div>
-<div class="line"><a name="l00038"></a><span class="lineno"><a class="line" href="classqgis_1_1pkfilter__spectral_1_1pkfilter__spectral.html">   38</a></span> <span class="keyword">class </span><a class="code" href="classqgis_1_1pkfilter__spectral_1_1pkfilter__spectral.html">pkfilter_spectral</a>(pktoolsAlgorithm):</div>
+<div class="line"><a name="l00038"></a><span class="lineno"><a class="line" href="classqgis_1_1pktools_1_1pkfilter__spectral_1_1pkfilter__spectral.html">   38</a></span> <span class="keyword">class </span><a class="code" href="classqgis_1_1pktools_1_1pkfilter__spectral_1_1pkfilter__spectral.html">pkfilter_spectral</a>(pktoolsAlgorithm):</div>
 <div class="line"><a name="l00039"></a><span class="lineno">   39</span> </div>
 <div class="line"><a name="l00040"></a><span class="lineno">   40</span>     INPUT = <span class="stringliteral">"INPUT"</span></div>
 <div class="line"><a name="l00041"></a><span class="lineno">   41</span>     OUTPUT = <span class="stringliteral">"OUTPUT"</span></div>
@@ -107,77 +107,77 @@
 <div class="line"><a name="l00053"></a><span class="lineno">   53</span>         <span class="keywordflow">return</span> <span class="stringliteral">"pkfilter"</span></div>
 <div class="line"><a name="l00054"></a><span class="lineno">   54</span> </div>
 <div class="line"><a name="l00055"></a><span class="lineno">   55</span>     <span class="keyword">def </span>defineCharacteristics(self):</div>
-<div class="line"><a name="l00056"></a><span class="lineno">   56</span>         self.<a class="code" href="classqgis_1_1pkfilter__spectral_1_1pkfilter__spectral.html#a85b2c92f62e8260f9f51d8d8f10ff44a">name</a> = <span class="stringliteral">"spectral/temporal filter"</span></div>
-<div class="line"><a name="l00057"></a><span class="lineno">   57</span>         self.<a class="code" href="classqgis_1_1pkfilter__spectral_1_1pkfilter__spectral.html#ad21f52f89d4b6cbe06e4bf830a8f5678">group</a> = <span class="stringliteral">"[pktools] filter"</span></div>
-<div class="line"><a name="l00058"></a><span class="lineno">   58</span>         self.addParameter(ParameterRaster(self.<a class="code" href="classqgis_1_1pkfilter__spectral_1_1pkfilter__spectral.html#a20a6cee11be7abd9325358a564819d26">INPUT</a>, <span class="stringliteral">'Input layer raster data set'</span>,ParameterRaster))</div>
-<div class="line"><a name="l00059"></a><span class="lineno">   59</span>         self.addParameter(ParameterSelection(self.<a class="code" href="classqgis_1_1pkfilter__spectral_1_1pkfilter__spectral.html#a15c6950b12c57ff838be9ba415e28c8e">METHOD</a>,<span class="stringliteral">"filter rule"</span>,self.<a class="code" href="classqgis_1_1pkfilter__spectral_1_1pkfilter__spectral.html#a88267ee3b205fbfc5e6823c693eb4e14">METHOD_OPTIONS</a>, 0))</div>
-<div class="line"><a name="l00060"></a><span class="lineno">   60</span>         self.addOutput(OutputRaster(self.<a class="code" href="classqgis_1_1pkfilter__spectral_1_1pkfilter__spectral.html#a0be5ed45033cae15184219a6485a396b">OUTPUT</a>, <span class="stringliteral">"Output raster data set"</span>))</div>
-<div class="line"><a name="l00061"></a><span class="lineno">   61</span>         self.addParameter(ParameterSelection(self.<a class="code" href="classqgis_1_1pkfilter__spectral_1_1pkfilter__spectral.html#ab8240d9589b85c133897e73224e6bcb2">RTYPE</a>, <span class="stringliteral">'Output raster type (leave as none to keep original type)'</span>, self.<a class="code" href="classqgis_1_1pkfilter__spectral_1_1pkfilter__spectral.html#a43e8b1dc19ef86bee9a3c933f9f83529">TYPE</a>, 0))</div>
-<div class="line"><a name="l00062"></a><span class="lineno">   62</span>         self.addParameter(ParameterNumber(self.<a class="code" href="classqgis_1_1pkfilter__spectral_1_1pkfilter__spectral.html#aeff20f41be397170c8e351d0aa74bc79">DZ</a>, <span class="stringliteral">"Filter kernel size"</span>,0.0,<span class="keywordtype">None</span>,1.0))</div>
+<div class="line"><a name="l00056"></a><span class="lineno">   56</span>         self.<a class="code" href="classqgis_1_1pktools_1_1pkfilter__spectral_1_1pkfilter__spectral.html#a3acd427b14996200c28731af93881230">name</a> = <span class="stringliteral">"spectral/temporal filter"</span></div>
+<div class="line"><a name="l00057"></a><span class="lineno">   57</span>         self.<a class="code" href="classqgis_1_1pktools_1_1pkfilter__spectral_1_1pkfilter__spectral.html#a564ebf9df0204af2dcdddddd4242e8e1">group</a> = <span class="stringliteral">"[pktools] filter"</span></div>
+<div class="line"><a name="l00058"></a><span class="lineno">   58</span>         self.addParameter(ParameterRaster(self.<a class="code" href="classqgis_1_1pktools_1_1pkfilter__spectral_1_1pkfilter__spectral.html#a66e04e576250870781b5354957894c96">INPUT</a>, <span class="stringliteral">'Input layer raster data set'</span>,ParameterRaster))</div>
+<div class="line"><a name="l00059"></a><span class="lineno">   59</span>         self.addParameter(ParameterSelection(self.<a class="code" href="classqgis_1_1pktools_1_1pkfilter__spectral_1_1pkfilter__spectral.html#a2161052c92e79f5af48d6777d37afe2f">METHOD</a>,<span class="stringliteral">"filter rule"</span>,self.<a class="code" href="classqgis_1_1pktools_1_1pkfilter__spectral_1_1pkfilter__spectral.html#a0b6ef52a12318176d8a7274b0b3c0992">METHOD_OPTIONS</a>, 0))</div>
+<div class="line"><a name="l00060"></a><span class="lineno">   60</span>         self.addOutput(OutputRaster(self.<a class="code" href="classqgis_1_1pktools_1_1pkfilter__spectral_1_1pkfilter__spectral.html#a0386672f58fdda479ca994c7dd7ceda8">OUTPUT</a>, <span class="stringliteral">"Output raster data set"</span>))</div>
+<div class="line"><a name="l00061"></a><span class="lineno">   61</span>         self.addParameter(ParameterSelection(self.<a class="code" href="classqgis_1_1pktools_1_1pkfilter__spectral_1_1pkfilter__spectral.html#a6464f37811e617e629087e4760f353d8">RTYPE</a>, <span class="stringliteral">'Output raster type (leave as none to keep original type)'</span>, self.<a class="code" href="classqgis_1_1pktools_1_1pkfilter__spectral_1_1pkfilter__spectral.html#ae43cc505f2d02b9bbc05f4a84 [...]
+<div class="line"><a name="l00062"></a><span class="lineno">   62</span>         self.addParameter(ParameterNumber(self.<a class="code" href="classqgis_1_1pktools_1_1pkfilter__spectral_1_1pkfilter__spectral.html#a818a9a5d4a7484deaa19a4445e034c60">DZ</a>, <span class="stringliteral">"Filter kernel size"</span>,0.0,<span class="keywordtype">None</span>,1.0))</div>
 <div class="line"><a name="l00063"></a><span class="lineno">   63</span>         <span class="comment">#for smooth nodata:</span></div>
-<div class="line"><a name="l00064"></a><span class="lineno">   64</span>         self.addParameter(ParameterString(self.<a class="code" href="classqgis_1_1pkfilter__spectral_1_1pkfilter__spectral.html#a68d3c2ee722166fa9d8ddf3151fd8e55">NODATA</a>, <span class="stringliteral">"nodata value to smooth(e.g., 0;255)"</span>,<span class="stringliteral">"none"</span>))</div>
-<div class="line"><a name="l00065"></a><span class="lineno">   65</span>         self.addParameter(ParameterSelection(self.<a class="code" href="classqgis_1_1pkfilter__spectral_1_1pkfilter__spectral.html#ae9fcf789fcc3b4871f5419bbce84511a">PADDING</a>,<span class="stringliteral">"Padding (edge effects)"</span>,self.<a class="code" href="classqgis_1_1pkfilter__spectral_1_1pkfilter__spectral.html#a706e766bf47d4fab85e95879c6d657a4">PADDING_OPTIONS</a>, 0))</div>
-<div class="line"><a name="l00066"></a><span class="lineno">   66</span>         self.addParameter(ParameterString(self.<a class="code" href="classqgis_1_1pkfilter__spectral_1_1pkfilter__spectral.html#a916a5975c9e4fc03fdf55a8a02dcb91e">EXTRA</a>,</div>
+<div class="line"><a name="l00064"></a><span class="lineno">   64</span>         self.addParameter(ParameterString(self.<a class="code" href="classqgis_1_1pktools_1_1pkfilter__spectral_1_1pkfilter__spectral.html#a9f1e339aa49f2753729f9fcd4ed43d09">NODATA</a>, <span class="stringliteral">"nodata value to smooth(e.g., 0;255)"</span>,<span class="stringliteral">"none"</span>))</div>
+<div class="line"><a name="l00065"></a><span class="lineno">   65</span>         self.addParameter(ParameterSelection(self.<a class="code" href="classqgis_1_1pktools_1_1pkfilter__spectral_1_1pkfilter__spectral.html#aeab6b7f6a3471187ae33f3597a86721a">PADDING</a>,<span class="stringliteral">"Padding (edge effects)"</span>,self.<a class="code" href="classqgis_1_1pktools_1_1pkfilter__spectral_1_1pkfilter__spectral.html#a90860af18044f5ce29b36c7c4ef112dd">PADDING_OPTIONS</a>, 0))</div>
+<div class="line"><a name="l00066"></a><span class="lineno">   66</span>         self.addParameter(ParameterString(self.<a class="code" href="classqgis_1_1pktools_1_1pkfilter__spectral_1_1pkfilter__spectral.html#a9c91be195b361b2616904f3ee2990ff5">EXTRA</a>,</div>
 <div class="line"><a name="l00067"></a><span class="lineno">   67</span>                           <span class="stringliteral">'Additional parameters'</span>, <span class="stringliteral">'-of GTiff'</span>, optional=<span class="keyword">True</span>))</div>
 <div class="line"><a name="l00068"></a><span class="lineno">   68</span> </div>
 <div class="line"><a name="l00069"></a><span class="lineno">   69</span>     <span class="keyword">def </span>processAlgorithm(self, progress):</div>
-<div class="line"><a name="l00070"></a><span class="lineno">   70</span>         cliPath = <span class="stringliteral">'"'</span> + os.path.join(pktoolsUtils.pktoolsPath(), self.<a class="code" href="classqgis_1_1pkfilter__spectral_1_1pkfilter__spectral.html#a67ee5ff2f1cb29dd15291e3ac0e5331c">cliName</a>()) + <span class="stringliteral">'"'</span></div>
+<div class="line"><a name="l00070"></a><span class="lineno">   70</span>         cliPath = <span class="stringliteral">'"'</span> + os.path.join(pktoolsUtils.pktoolsPath(), self.<a class="code" href="classqgis_1_1pktools_1_1pkfilter__spectral_1_1pkfilter__spectral.html#ae4ff77f62787c22082b90cce278fe647">cliName</a>()) + <span class="stringliteral">'"'</span></div>
 <div class="line"><a name="l00071"></a><span class="lineno">   71</span>         commands = [cliPath]</div>
 <div class="line"><a name="l00072"></a><span class="lineno">   72</span> </div>
-<div class="line"><a name="l00073"></a><span class="lineno">   73</span>         input=self.getParameterValue(self.<a class="code" href="classqgis_1_1pkfilter__spectral_1_1pkfilter__spectral.html#a20a6cee11be7abd9325358a564819d26">INPUT</a>)</div>
+<div class="line"><a name="l00073"></a><span class="lineno">   73</span>         input=self.getParameterValue(self.<a class="code" href="classqgis_1_1pktools_1_1pkfilter__spectral_1_1pkfilter__spectral.html#a66e04e576250870781b5354957894c96">INPUT</a>)</div>
 <div class="line"><a name="l00074"></a><span class="lineno">   74</span>         <span class="keywordflow">if</span> input != <span class="stringliteral">""</span>:</div>
 <div class="line"><a name="l00075"></a><span class="lineno">   75</span>             commands.append(<span class="stringliteral">'-i'</span>)</div>
 <div class="line"><a name="l00076"></a><span class="lineno">   76</span>             commands.append(<span class="stringliteral">'"'</span> + input + <span class="stringliteral">'"'</span>)</div>
 <div class="line"><a name="l00077"></a><span class="lineno">   77</span> </div>
-<div class="line"><a name="l00078"></a><span class="lineno">   78</span>         method=self.<a class="code" href="classqgis_1_1pkfilter__spectral_1_1pkfilter__spectral.html#a88267ee3b205fbfc5e6823c693eb4e14">METHOD_OPTIONS</a>[self.getParameterValue(self.<a class="code" href="classqgis_1_1pkfilter__spectral_1_1pkfilter__spectral.html#a15c6950b12c57ff838be9ba415e28c8e">METHOD</a>)]</div>
+<div class="line"><a name="l00078"></a><span class="lineno">   78</span>         method=self.<a class="code" href="classqgis_1_1pktools_1_1pkfilter__spectral_1_1pkfilter__spectral.html#a0b6ef52a12318176d8a7274b0b3c0992">METHOD_OPTIONS</a>[self.getParameterValue(self.<a class="code" href="classqgis_1_1pktools_1_1pkfilter__spectral_1_1pkfilter__spectral.html#a2161052c92e79f5af48d6777d37afe2f">METHOD</a>)]</div>
 <div class="line"><a name="l00079"></a><span class="lineno">   79</span>         <span class="keywordflow">if</span> method != <span class="stringliteral">"none"</span>:</div>
 <div class="line"><a name="l00080"></a><span class="lineno">   80</span>             commands.append(<span class="stringliteral">"-f"</span>)</div>
 <div class="line"><a name="l00081"></a><span class="lineno">   81</span>             commands.append(method)</div>
 <div class="line"><a name="l00082"></a><span class="lineno">   82</span>         commands.append(<span class="stringliteral">"-pad"</span>)</div>
-<div class="line"><a name="l00083"></a><span class="lineno">   83</span>         commands.append(self.<a class="code" href="classqgis_1_1pkfilter__spectral_1_1pkfilter__spectral.html#a706e766bf47d4fab85e95879c6d657a4">PADDING_OPTIONS</a>[self.getParameterValue(self.<a class="code" href="classqgis_1_1pkfilter__spectral_1_1pkfilter__spectral.html#ae9fcf789fcc3b4871f5419bbce84511a">PADDING</a>)])</div>
+<div class="line"><a name="l00083"></a><span class="lineno">   83</span>         commands.append(self.<a class="code" href="classqgis_1_1pktools_1_1pkfilter__spectral_1_1pkfilter__spectral.html#a90860af18044f5ce29b36c7c4ef112dd">PADDING_OPTIONS</a>[self.getParameterValue(self.<a class="code" href="classqgis_1_1pktools_1_1pkfilter__spectral_1_1pkfilter__spectral.html#aeab6b7f6a3471187ae33f3597a86721a">PADDING</a>)])</div>
 <div class="line"><a name="l00084"></a><span class="lineno">   84</span> </div>
-<div class="line"><a name="l00085"></a><span class="lineno">   85</span>         <span class="keywordflow">if</span> self.<a class="code" href="classqgis_1_1pkfilter__spectral_1_1pkfilter__spectral.html#a43e8b1dc19ef86bee9a3c933f9f83529">TYPE</a>[self.getParameterValue(self.<a class="code" href="classqgis_1_1pkfilter__spectral_1_1pkfilter__spectral.html#ab8240d9589b85c133897e73224e6bcb2">RTYPE</a>)] != <span class="stringliteral">"none"</span>:</div>
+<div class="line"><a name="l00085"></a><span class="lineno">   85</span>         <span class="keywordflow">if</span> self.<a class="code" href="classqgis_1_1pktools_1_1pkfilter__spectral_1_1pkfilter__spectral.html#ae43cc505f2d02b9bbc05f4a84658a792">TYPE</a>[self.getParameterValue(self.<a class="code" href="classqgis_1_1pktools_1_1pkfilter__spectral_1_1pkfilter__spectral.html#a6464f37811e617e629087e4760f353d8">RTYPE</a>)] != <span class="stringliteral">"none"</span>:</div>
 <div class="line"><a name="l00086"></a><span class="lineno">   86</span>             commands.append(<span class="stringliteral">'-ot'</span>)</div>
-<div class="line"><a name="l00087"></a><span class="lineno">   87</span>             commands.append(self.<a class="code" href="classqgis_1_1pkfilter__spectral_1_1pkfilter__spectral.html#a43e8b1dc19ef86bee9a3c933f9f83529">TYPE</a>[self.getParameterValue(self.<a class="code" href="classqgis_1_1pkfilter__spectral_1_1pkfilter__spectral.html#ab8240d9589b85c133897e73224e6bcb2">RTYPE</a>)])</div>
-<div class="line"><a name="l00088"></a><span class="lineno">   88</span>         output=self.getOutputValue(self.<a class="code" href="classqgis_1_1pkfilter__spectral_1_1pkfilter__spectral.html#a0be5ed45033cae15184219a6485a396b">OUTPUT</a>)</div>
+<div class="line"><a name="l00087"></a><span class="lineno">   87</span>             commands.append(self.<a class="code" href="classqgis_1_1pktools_1_1pkfilter__spectral_1_1pkfilter__spectral.html#ae43cc505f2d02b9bbc05f4a84658a792">TYPE</a>[self.getParameterValue(self.<a class="code" href="classqgis_1_1pktools_1_1pkfilter__spectral_1_1pkfilter__spectral.html#a6464f37811e617e629087e4760f353d8">RTYPE</a>)])</div>
+<div class="line"><a name="l00088"></a><span class="lineno">   88</span>         output=self.getOutputValue(self.<a class="code" href="classqgis_1_1pktools_1_1pkfilter__spectral_1_1pkfilter__spectral.html#a0386672f58fdda479ca994c7dd7ceda8">OUTPUT</a>)</div>
 <div class="line"><a name="l00089"></a><span class="lineno">   89</span>         <span class="keywordflow">if</span> output != <span class="stringliteral">""</span>:</div>
 <div class="line"><a name="l00090"></a><span class="lineno">   90</span>             commands.append(<span class="stringliteral">"-o"</span>)</div>
 <div class="line"><a name="l00091"></a><span class="lineno">   91</span>             commands.append(<span class="stringliteral">'"'</span> + output + <span class="stringliteral">'"'</span>)</div>
 <div class="line"><a name="l00092"></a><span class="lineno">   92</span> </div>
-<div class="line"><a name="l00093"></a><span class="lineno">   93</span>         <span class="keywordflow">if</span> self.getParameterValue(self.<a class="code" href="classqgis_1_1pkfilter__spectral_1_1pkfilter__spectral.html#aeff20f41be397170c8e351d0aa74bc79">DZ</a>) != 0:</div>
+<div class="line"><a name="l00093"></a><span class="lineno">   93</span>         <span class="keywordflow">if</span> self.getParameterValue(self.<a class="code" href="classqgis_1_1pktools_1_1pkfilter__spectral_1_1pkfilter__spectral.html#a818a9a5d4a7484deaa19a4445e034c60">DZ</a>) != 0:</div>
 <div class="line"><a name="l00094"></a><span class="lineno">   94</span>             commands.append(<span class="stringliteral">"-dz"</span>)</div>
-<div class="line"><a name="l00095"></a><span class="lineno">   95</span>             commands.append(str(self.getParameterValue(self.<a class="code" href="classqgis_1_1pkfilter__spectral_1_1pkfilter__spectral.html#aeff20f41be397170c8e351d0aa74bc79">DZ</a>)))</div>
-<div class="line"><a name="l00096"></a><span class="lineno">   96</span>         nodata=self.getParameterValue(self.<a class="code" href="classqgis_1_1pkfilter__spectral_1_1pkfilter__spectral.html#a68d3c2ee722166fa9d8ddf3151fd8e55">NODATA</a>)</div>
+<div class="line"><a name="l00095"></a><span class="lineno">   95</span>             commands.append(str(self.getParameterValue(self.<a class="code" href="classqgis_1_1pktools_1_1pkfilter__spectral_1_1pkfilter__spectral.html#a818a9a5d4a7484deaa19a4445e034c60">DZ</a>)))</div>
+<div class="line"><a name="l00096"></a><span class="lineno">   96</span>         nodata=self.getParameterValue(self.<a class="code" href="classqgis_1_1pktools_1_1pkfilter__spectral_1_1pkfilter__spectral.html#a9f1e339aa49f2753729f9fcd4ed43d09">NODATA</a>)</div>
 <div class="line"><a name="l00097"></a><span class="lineno">   97</span>         <span class="keywordflow">if</span> nodata != <span class="stringliteral">"none"</span>:</div>
 <div class="line"><a name="l00098"></a><span class="lineno">   98</span>             nodataValues = nodata.split(<span class="stringliteral">';'</span>)</div>
 <div class="line"><a name="l00099"></a><span class="lineno">   99</span>             <span class="keywordflow">for</span> nodataValue <span class="keywordflow">in</span> nodataValues:</div>
 <div class="line"><a name="l00100"></a><span class="lineno">  100</span>                 commands.append(<span class="stringliteral">'-nodata'</span>)</div>
 <div class="line"><a name="l00101"></a><span class="lineno">  101</span>                 commands.append(nodataValue)</div>
-<div class="line"><a name="l00102"></a><span class="lineno">  102</span>         extra = str(self.getParameterValue(self.<a class="code" href="classqgis_1_1pkfilter__spectral_1_1pkfilter__spectral.html#a916a5975c9e4fc03fdf55a8a02dcb91e">EXTRA</a>))</div>
+<div class="line"><a name="l00102"></a><span class="lineno">  102</span>         extra = str(self.getParameterValue(self.<a class="code" href="classqgis_1_1pktools_1_1pkfilter__spectral_1_1pkfilter__spectral.html#a9c91be195b361b2616904f3ee2990ff5">EXTRA</a>))</div>
 <div class="line"><a name="l00103"></a><span class="lineno">  103</span>         <span class="keywordflow">if</span> len(extra) > 0:</div>
 <div class="line"><a name="l00104"></a><span class="lineno">  104</span>             commands.append(extra)</div>
 <div class="line"><a name="l00105"></a><span class="lineno">  105</span> </div>
 <div class="line"><a name="l00106"></a><span class="lineno">  106</span>         pktoolsUtils.runpktools(commands, progress)</div>
-<div class="ttc" id="classqgis_1_1pkfilter__spectral_1_1pkfilter__spectral_html"><div class="ttname"><a href="classqgis_1_1pkfilter__spectral_1_1pkfilter__spectral.html">qgis.pkfilter_spectral.pkfilter_spectral</a></div><div class="ttdef"><b>Definition:</b> <a href="pkfilter__spectral_8py_source.html#l00038">pkfilter_spectral.py:38</a></div></div>
-<div class="ttc" id="classqgis_1_1pkfilter__spectral_1_1pkfilter__spectral_html_a15c6950b12c57ff838be9ba415e28c8e"><div class="ttname"><a href="classqgis_1_1pkfilter__spectral_1_1pkfilter__spectral.html#a15c6950b12c57ff838be9ba415e28c8e">qgis.pkfilter_spectral.pkfilter_spectral.METHOD</a></div><div class="ttdeci">string METHOD</div><div class="ttdef"><b>Definition:</b> <a href="pkfilter__spectral_8py_source.html#l00043">pkfilter_spectral.py:43</a></div></div>
-<div class="ttc" id="classqgis_1_1pkfilter__spectral_1_1pkfilter__spectral_html_ad21f52f89d4b6cbe06e4bf830a8f5678"><div class="ttname"><a href="classqgis_1_1pkfilter__spectral_1_1pkfilter__spectral.html#ad21f52f89d4b6cbe06e4bf830a8f5678">qgis.pkfilter_spectral.pkfilter_spectral.group</a></div><div class="ttdeci">group</div><div class="ttdef"><b>Definition:</b> <a href="pkfilter__spectral_8py_source.html#l00057">pkfilter_spectral.py:57</a></div></div>
-<div class="ttc" id="classqgis_1_1pkfilter__spectral_1_1pkfilter__spectral_html_a88267ee3b205fbfc5e6823c693eb4e14"><div class="ttname"><a href="classqgis_1_1pkfilter__spectral_1_1pkfilter__spectral.html#a88267ee3b205fbfc5e6823c693eb4e14">qgis.pkfilter_spectral.pkfilter_spectral.METHOD_OPTIONS</a></div><div class="ttdeci">list METHOD_OPTIONS</div><div class="ttdef"><b>Definition:</b> <a href="pkfilter__spectral_8py_source.html#l00042">pkfilter_spectral.py:42</a></div></div>
-<div class="ttc" id="classqgis_1_1pkfilter__spectral_1_1pkfilter__spectral_html_a0be5ed45033cae15184219a6485a396b"><div class="ttname"><a href="classqgis_1_1pkfilter__spectral_1_1pkfilter__spectral.html#a0be5ed45033cae15184219a6485a396b">qgis.pkfilter_spectral.pkfilter_spectral.OUTPUT</a></div><div class="ttdeci">string OUTPUT</div><div class="ttdef"><b>Definition:</b> <a href="pkfilter__spectral_8py_source.html#l00041">pkfilter_spectral.py:41</a></div></div>
-<div class="ttc" id="classqgis_1_1pkfilter__spectral_1_1pkfilter__spectral_html_ab8240d9589b85c133897e73224e6bcb2"><div class="ttname"><a href="classqgis_1_1pkfilter__spectral_1_1pkfilter__spectral.html#ab8240d9589b85c133897e73224e6bcb2">qgis.pkfilter_spectral.pkfilter_spectral.RTYPE</a></div><div class="ttdeci">string RTYPE</div><div class="ttdef"><b>Definition:</b> <a href="pkfilter__spectral_8py_source.html#l00048">pkfilter_spectral.py:48</a></div></div>
-<div class="ttc" id="classqgis_1_1pkfilter__spectral_1_1pkfilter__spectral_html_ae9fcf789fcc3b4871f5419bbce84511a"><div class="ttname"><a href="classqgis_1_1pkfilter__spectral_1_1pkfilter__spectral.html#ae9fcf789fcc3b4871f5419bbce84511a">qgis.pkfilter_spectral.pkfilter_spectral.PADDING</a></div><div class="ttdeci">string PADDING</div><div class="ttdef"><b>Definition:</b> <a href="pkfilter__spectral_8py_source.html#l00047">pkfilter_spectral.py:47</a></div></div>
-<div class="ttc" id="classqgis_1_1pkfilter__spectral_1_1pkfilter__spectral_html_a67ee5ff2f1cb29dd15291e3ac0e5331c"><div class="ttname"><a href="classqgis_1_1pkfilter__spectral_1_1pkfilter__spectral.html#a67ee5ff2f1cb29dd15291e3ac0e5331c">qgis.pkfilter_spectral.pkfilter_spectral.cliName</a></div><div class="ttdeci">def cliName</div><div class="ttdef"><b>Definition:</b> <a href="pkfilter__spectral_8py_source.html#l00052">pkfilter_spectral.py:52</a></div></div>
-<div class="ttc" id="classqgis_1_1pkfilter__spectral_1_1pkfilter__spectral_html_a68d3c2ee722166fa9d8ddf3151fd8e55"><div class="ttname"><a href="classqgis_1_1pkfilter__spectral_1_1pkfilter__spectral.html#a68d3c2ee722166fa9d8ddf3151fd8e55">qgis.pkfilter_spectral.pkfilter_spectral.NODATA</a></div><div class="ttdeci">string NODATA</div><div class="ttdef"><b>Definition:</b> <a href="pkfilter__spectral_8py_source.html#l00045">pkfilter_spectral.py:45</a></div></div>
-<div class="ttc" id="classqgis_1_1pkfilter__spectral_1_1pkfilter__spectral_html_a706e766bf47d4fab85e95879c6d657a4"><div class="ttname"><a href="classqgis_1_1pkfilter__spectral_1_1pkfilter__spectral.html#a706e766bf47d4fab85e95879c6d657a4">qgis.pkfilter_spectral.pkfilter_spectral.PADDING_OPTIONS</a></div><div class="ttdeci">list PADDING_OPTIONS</div><div class="ttdef"><b>Definition:</b> <a href="pkfilter__spectral_8py_source.html#l00046">pkfilter_spectral.py:46</a></div></div>
-<div class="ttc" id="classqgis_1_1pkfilter__spectral_1_1pkfilter__spectral_html_a20a6cee11be7abd9325358a564819d26"><div class="ttname"><a href="classqgis_1_1pkfilter__spectral_1_1pkfilter__spectral.html#a20a6cee11be7abd9325358a564819d26">qgis.pkfilter_spectral.pkfilter_spectral.INPUT</a></div><div class="ttdeci">string INPUT</div><div class="ttdef"><b>Definition:</b> <a href="pkfilter__spectral_8py_source.html#l00040">pkfilter_spectral.py:40</a></div></div>
-<div class="ttc" id="classqgis_1_1pkfilter__spectral_1_1pkfilter__spectral_html_a916a5975c9e4fc03fdf55a8a02dcb91e"><div class="ttname"><a href="classqgis_1_1pkfilter__spectral_1_1pkfilter__spectral.html#a916a5975c9e4fc03fdf55a8a02dcb91e">qgis.pkfilter_spectral.pkfilter_spectral.EXTRA</a></div><div class="ttdeci">string EXTRA</div><div class="ttdef"><b>Definition:</b> <a href="pkfilter__spectral_8py_source.html#l00050">pkfilter_spectral.py:50</a></div></div>
-<div class="ttc" id="classqgis_1_1pkfilter__spectral_1_1pkfilter__spectral_html_a43e8b1dc19ef86bee9a3c933f9f83529"><div class="ttname"><a href="classqgis_1_1pkfilter__spectral_1_1pkfilter__spectral.html#a43e8b1dc19ef86bee9a3c933f9f83529">qgis.pkfilter_spectral.pkfilter_spectral.TYPE</a></div><div class="ttdeci">list TYPE</div><div class="ttdef"><b>Definition:</b> <a href="pkfilter__spectral_8py_source.html#l00049">pkfilter_spectral.py:49</a></div></div>
-<div class="ttc" id="classqgis_1_1pkfilter__spectral_1_1pkfilter__spectral_html_aeff20f41be397170c8e351d0aa74bc79"><div class="ttname"><a href="classqgis_1_1pkfilter__spectral_1_1pkfilter__spectral.html#aeff20f41be397170c8e351d0aa74bc79">qgis.pkfilter_spectral.pkfilter_spectral.DZ</a></div><div class="ttdeci">string DZ</div><div class="ttdef"><b>Definition:</b> <a href="pkfilter__spectral_8py_source.html#l00044">pkfilter_spectral.py:44</a></div></div>
-<div class="ttc" id="classqgis_1_1pkfilter__spectral_1_1pkfilter__spectral_html_a85b2c92f62e8260f9f51d8d8f10ff44a"><div class="ttname"><a href="classqgis_1_1pkfilter__spectral_1_1pkfilter__spectral.html#a85b2c92f62e8260f9f51d8d8f10ff44a">qgis.pkfilter_spectral.pkfilter_spectral.name</a></div><div class="ttdeci">name</div><div class="ttdef"><b>Definition:</b> <a href="pkfilter__spectral_8py_source.html#l00056">pkfilter_spectral.py:56</a></div></div>
+<div class="ttc" id="classqgis_1_1pktools_1_1pkfilter__spectral_1_1pkfilter__spectral_html_a0386672f58fdda479ca994c7dd7ceda8"><div class="ttname"><a href="classqgis_1_1pktools_1_1pkfilter__spectral_1_1pkfilter__spectral.html#a0386672f58fdda479ca994c7dd7ceda8">qgis.pktools.pkfilter_spectral.pkfilter_spectral.OUTPUT</a></div><div class="ttdeci">string OUTPUT</div><div class="ttdef"><b>Definition:</b> <a href="pktools_2pkfilter__spectral_8py_source.html#l00041">pkfilter_spectral.py:41</a></ [...]
+<div class="ttc" id="classqgis_1_1pktools_1_1pkfilter__spectral_1_1pkfilter__spectral_html_a0b6ef52a12318176d8a7274b0b3c0992"><div class="ttname"><a href="classqgis_1_1pktools_1_1pkfilter__spectral_1_1pkfilter__spectral.html#a0b6ef52a12318176d8a7274b0b3c0992">qgis.pktools.pkfilter_spectral.pkfilter_spectral.METHOD_OPTIONS</a></div><div class="ttdeci">list METHOD_OPTIONS</div><div class="ttdef"><b>Definition:</b> <a href="pktools_2pkfilter__spectral_8py_source.html#l00042">pkfilter_spectr [...]
+<div class="ttc" id="classqgis_1_1pktools_1_1pkfilter__spectral_1_1pkfilter__spectral_html_a2161052c92e79f5af48d6777d37afe2f"><div class="ttname"><a href="classqgis_1_1pktools_1_1pkfilter__spectral_1_1pkfilter__spectral.html#a2161052c92e79f5af48d6777d37afe2f">qgis.pktools.pkfilter_spectral.pkfilter_spectral.METHOD</a></div><div class="ttdeci">string METHOD</div><div class="ttdef"><b>Definition:</b> <a href="pktools_2pkfilter__spectral_8py_source.html#l00043">pkfilter_spectral.py:43</a></ [...]
+<div class="ttc" id="classqgis_1_1pktools_1_1pkfilter__spectral_1_1pkfilter__spectral_html_a9f1e339aa49f2753729f9fcd4ed43d09"><div class="ttname"><a href="classqgis_1_1pktools_1_1pkfilter__spectral_1_1pkfilter__spectral.html#a9f1e339aa49f2753729f9fcd4ed43d09">qgis.pktools.pkfilter_spectral.pkfilter_spectral.NODATA</a></div><div class="ttdeci">string NODATA</div><div class="ttdef"><b>Definition:</b> <a href="pktools_2pkfilter__spectral_8py_source.html#l00045">pkfilter_spectral.py:45</a></ [...]
+<div class="ttc" id="classqgis_1_1pktools_1_1pkfilter__spectral_1_1pkfilter__spectral_html_ae43cc505f2d02b9bbc05f4a84658a792"><div class="ttname"><a href="classqgis_1_1pktools_1_1pkfilter__spectral_1_1pkfilter__spectral.html#ae43cc505f2d02b9bbc05f4a84658a792">qgis.pktools.pkfilter_spectral.pkfilter_spectral.TYPE</a></div><div class="ttdeci">list TYPE</div><div class="ttdef"><b>Definition:</b> <a href="pktools_2pkfilter__spectral_8py_source.html#l00049">pkfilter_spectral.py:49</a></div></div>
+<div class="ttc" id="classqgis_1_1pktools_1_1pkfilter__spectral_1_1pkfilter__spectral_html_a66e04e576250870781b5354957894c96"><div class="ttname"><a href="classqgis_1_1pktools_1_1pkfilter__spectral_1_1pkfilter__spectral.html#a66e04e576250870781b5354957894c96">qgis.pktools.pkfilter_spectral.pkfilter_spectral.INPUT</a></div><div class="ttdeci">string INPUT</div><div class="ttdef"><b>Definition:</b> <a href="pktools_2pkfilter__spectral_8py_source.html#l00040">pkfilter_spectral.py:40</a></di [...]
+<div class="ttc" id="classqgis_1_1pktools_1_1pkfilter__spectral_1_1pkfilter__spectral_html"><div class="ttname"><a href="classqgis_1_1pktools_1_1pkfilter__spectral_1_1pkfilter__spectral.html">qgis.pktools.pkfilter_spectral.pkfilter_spectral</a></div><div class="ttdef"><b>Definition:</b> <a href="pktools_2pkfilter__spectral_8py_source.html#l00038">pkfilter_spectral.py:38</a></div></div>
+<div class="ttc" id="classqgis_1_1pktools_1_1pkfilter__spectral_1_1pkfilter__spectral_html_a90860af18044f5ce29b36c7c4ef112dd"><div class="ttname"><a href="classqgis_1_1pktools_1_1pkfilter__spectral_1_1pkfilter__spectral.html#a90860af18044f5ce29b36c7c4ef112dd">qgis.pktools.pkfilter_spectral.pkfilter_spectral.PADDING_OPTIONS</a></div><div class="ttdeci">list PADDING_OPTIONS</div><div class="ttdef"><b>Definition:</b> <a href="pktools_2pkfilter__spectral_8py_source.html#l00046">pkfilter_spec [...]
+<div class="ttc" id="classqgis_1_1pktools_1_1pkfilter__spectral_1_1pkfilter__spectral_html_a9c91be195b361b2616904f3ee2990ff5"><div class="ttname"><a href="classqgis_1_1pktools_1_1pkfilter__spectral_1_1pkfilter__spectral.html#a9c91be195b361b2616904f3ee2990ff5">qgis.pktools.pkfilter_spectral.pkfilter_spectral.EXTRA</a></div><div class="ttdeci">string EXTRA</div><div class="ttdef"><b>Definition:</b> <a href="pktools_2pkfilter__spectral_8py_source.html#l00050">pkfilter_spectral.py:50</a></di [...]
+<div class="ttc" id="classqgis_1_1pktools_1_1pkfilter__spectral_1_1pkfilter__spectral_html_a818a9a5d4a7484deaa19a4445e034c60"><div class="ttname"><a href="classqgis_1_1pktools_1_1pkfilter__spectral_1_1pkfilter__spectral.html#a818a9a5d4a7484deaa19a4445e034c60">qgis.pktools.pkfilter_spectral.pkfilter_spectral.DZ</a></div><div class="ttdeci">string DZ</div><div class="ttdef"><b>Definition:</b> <a href="pktools_2pkfilter__spectral_8py_source.html#l00044">pkfilter_spectral.py:44</a></div></div>
+<div class="ttc" id="classqgis_1_1pktools_1_1pkfilter__spectral_1_1pkfilter__spectral_html_aeab6b7f6a3471187ae33f3597a86721a"><div class="ttname"><a href="classqgis_1_1pktools_1_1pkfilter__spectral_1_1pkfilter__spectral.html#aeab6b7f6a3471187ae33f3597a86721a">qgis.pktools.pkfilter_spectral.pkfilter_spectral.PADDING</a></div><div class="ttdeci">string PADDING</div><div class="ttdef"><b>Definition:</b> <a href="pktools_2pkfilter__spectral_8py_source.html#l00047">pkfilter_spectral.py:47</a> [...]
+<div class="ttc" id="classqgis_1_1pktools_1_1pkfilter__spectral_1_1pkfilter__spectral_html_ae4ff77f62787c22082b90cce278fe647"><div class="ttname"><a href="classqgis_1_1pktools_1_1pkfilter__spectral_1_1pkfilter__spectral.html#ae4ff77f62787c22082b90cce278fe647">qgis.pktools.pkfilter_spectral.pkfilter_spectral.cliName</a></div><div class="ttdeci">def cliName</div><div class="ttdef"><b>Definition:</b> <a href="pktools_2pkfilter__spectral_8py_source.html#l00052">pkfilter_spectral.py:52</a></d [...]
+<div class="ttc" id="classqgis_1_1pktools_1_1pkfilter__spectral_1_1pkfilter__spectral_html_a3acd427b14996200c28731af93881230"><div class="ttname"><a href="classqgis_1_1pktools_1_1pkfilter__spectral_1_1pkfilter__spectral.html#a3acd427b14996200c28731af93881230">qgis.pktools.pkfilter_spectral.pkfilter_spectral.name</a></div><div class="ttdeci">name</div><div class="ttdef"><b>Definition:</b> <a href="pktools_2pkfilter__spectral_8py_source.html#l00056">pkfilter_spectral.py:56</a></div></div>
+<div class="ttc" id="classqgis_1_1pktools_1_1pkfilter__spectral_1_1pkfilter__spectral_html_a6464f37811e617e629087e4760f353d8"><div class="ttname"><a href="classqgis_1_1pktools_1_1pkfilter__spectral_1_1pkfilter__spectral.html#a6464f37811e617e629087e4760f353d8">qgis.pktools.pkfilter_spectral.pkfilter_spectral.RTYPE</a></div><div class="ttdeci">string RTYPE</div><div class="ttdef"><b>Definition:</b> <a href="pktools_2pkfilter__spectral_8py_source.html#l00048">pkfilter_spectral.py:48</a></di [...]
+<div class="ttc" id="classqgis_1_1pktools_1_1pkfilter__spectral_1_1pkfilter__spectral_html_a564ebf9df0204af2dcdddddd4242e8e1"><div class="ttname"><a href="classqgis_1_1pktools_1_1pkfilter__spectral_1_1pkfilter__spectral.html#a564ebf9df0204af2dcdddddd4242e8e1">qgis.pktools.pkfilter_spectral.pkfilter_spectral.group</a></div><div class="ttdeci">group</div><div class="ttdef"><b>Definition:</b> <a href="pktools_2pkfilter__spectral_8py_source.html#l00057">pkfilter_spectral.py:57</a></div></div>
 </div><!-- fragment --></div><!-- contents -->
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Jun 23 2015 17:09:36 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Tue Nov 3 2015 15:58:26 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/pkfilterdem_8py_source.html b/doc/html/pktools_2pkfilterdem_8py_source.html
similarity index 64%
copy from doc/html/pkfilterdem_8py_source.html
copy to doc/html/pktools_2pkfilterdem_8py_source.html
index 7f835cc..11aee87 100644
--- a/doc/html/pkfilterdem_8py_source.html
+++ b/doc/html/pktools_2pkfilterdem_8py_source.html
@@ -4,7 +4,7 @@
 <meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
 <meta http-equiv="X-UA-Compatible" content="IE=9"/>
 <meta name="generator" content="Doxygen 1.8.6"/>
-<title>pktools: /home/kempenep/pktools/qgis/pkfilterdem.py Source File</title>
+<title>pktools: /home/kempenep/pktools/qgis/pktools/pkfilterdem.py Source File</title>
 <link href="tabs.css" rel="stylesheet" type="text/css"/>
 <script type="text/javascript" src="jquery.js"></script>
 <script type="text/javascript" src="dynsections.js"></script>
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.3</span>
+    <span id="projectnumber">2.6.4</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -44,7 +44,7 @@
   </div>
 <div id="nav-path" class="navpath">
   <ul>
-<li class="navelem"><a class="el" href="dir_5785acc8d2e42f8795bdbe936856f26d.html">qgis</a></li>  </ul>
+<li class="navelem"><a class="el" href="dir_5785acc8d2e42f8795bdbe936856f26d.html">qgis</a></li><li class="navelem"><a class="el" href="dir_b7cc22b4453454f1e686d9a2e78d988d.html">pktools</a></li>  </ul>
 </div>
 </div><!-- top -->
 <div class="header">
@@ -90,7 +90,7 @@
 <div class="line"><a name="l00036"></a><span class="lineno">   36</span> <span class="keyword">from</span> processing.core.parameters <span class="keyword">import</span> ParameterBoolean</div>
 <div class="line"><a name="l00037"></a><span class="lineno">   37</span> <span class="keyword">from</span> processing.core.parameters <span class="keyword">import</span> ParameterExtent</div>
 <div class="line"><a name="l00038"></a><span class="lineno">   38</span> </div>
-<div class="line"><a name="l00039"></a><span class="lineno"><a class="line" href="classqgis_1_1pkfilterdem_1_1pkfilterdem.html">   39</a></span> <span class="keyword">class </span><a class="code" href="classqgis_1_1pkfilterdem_1_1pkfilterdem.html">pkfilterdem</a>(pktoolsAlgorithm):</div>
+<div class="line"><a name="l00039"></a><span class="lineno"><a class="line" href="classqgis_1_1pktools_1_1pkfilterdem_1_1pkfilterdem.html">   39</a></span> <span class="keyword">class </span><a class="code" href="classqgis_1_1pktools_1_1pkfilterdem_1_1pkfilterdem.html">pkfilterdem</a>(pktoolsAlgorithm):</div>
 <div class="line"><a name="l00040"></a><span class="lineno">   40</span> </div>
 <div class="line"><a name="l00041"></a><span class="lineno">   41</span>     INPUT = <span class="stringliteral">"INPUT"</span></div>
 <div class="line"><a name="l00042"></a><span class="lineno">   42</span>     OUTPUT = <span class="stringliteral">"OUTPUT"</span></div>
@@ -105,65 +105,65 @@
 <div class="line"><a name="l00051"></a><span class="lineno">   51</span>         <span class="keywordflow">return</span> <span class="stringliteral">"pkfilterdem"</span></div>
 <div class="line"><a name="l00052"></a><span class="lineno">   52</span> </div>
 <div class="line"><a name="l00053"></a><span class="lineno">   53</span>     <span class="keyword">def </span>defineCharacteristics(self):</div>
-<div class="line"><a name="l00054"></a><span class="lineno">   54</span>         self.<a class="code" href="classqgis_1_1pkfilterdem_1_1pkfilterdem.html#a6cda59e12b5d35384148d3a9e50a380c">name</a> = <span class="stringliteral">"Create DTM from DEM raster dataset)"</span></div>
-<div class="line"><a name="l00055"></a><span class="lineno">   55</span>         self.<a class="code" href="classqgis_1_1pkfilterdem_1_1pkfilterdem.html#a362a12d7bac87e1ef6bd3b0921893e4b">group</a> = <span class="stringliteral">"[pktools] LiDAR"</span></div>
+<div class="line"><a name="l00054"></a><span class="lineno">   54</span>         self.<a class="code" href="classqgis_1_1pktools_1_1pkfilterdem_1_1pkfilterdem.html#acf67738f3f769ecd8c908f883aaf585a">name</a> = <span class="stringliteral">"Create DTM from DEM raster dataset)"</span></div>
+<div class="line"><a name="l00055"></a><span class="lineno">   55</span>         self.<a class="code" href="classqgis_1_1pktools_1_1pkfilterdem_1_1pkfilterdem.html#a2b10663adca2f38835d50d6872e157ce">group</a> = <span class="stringliteral">"[pktools] LiDAR"</span></div>
 <div class="line"><a name="l00056"></a><span class="lineno">   56</span> </div>
-<div class="line"><a name="l00057"></a><span class="lineno">   57</span>         self.addParameter(ParameterRaster(self.<a class="code" href="classqgis_1_1pkfilterdem_1_1pkfilterdem.html#ac63e9625819c3df9a3f210a44577de8d">INPUT</a>, <span class="stringliteral">'Input layer raster data set'</span>,ParameterRaster))</div>
-<div class="line"><a name="l00058"></a><span class="lineno">   58</span>         self.addParameter(ParameterSelection(self.<a class="code" href="classqgis_1_1pkfilterdem_1_1pkfilterdem.html#a231a73cc70938e1e8c0fbfe2ad354666">FILTER</a>,<span class="stringliteral">"filter"</span>,self.<a class="code" href="classqgis_1_1pkfilterdem_1_1pkfilterdem.html#aa684f5dff3236fff634fd644507ead3f">FILTER_OPTIONS</a>, 0))</div>
-<div class="line"><a name="l00059"></a><span class="lineno">   59</span>         self.addParameter(ParameterNumber(self.<a class="code" href="classqgis_1_1pkfilterdem_1_1pkfilterdem.html#a36f24e3cf45c53076e40bf050690c9e4">DIM</a>, <span class="stringliteral">"maximum filter kernel size"</span>,3,<span class="keywordtype">None</span>,17))</div>
+<div class="line"><a name="l00057"></a><span class="lineno">   57</span>         self.addParameter(ParameterRaster(self.<a class="code" href="classqgis_1_1pktools_1_1pkfilterdem_1_1pkfilterdem.html#ae1e46a26be886bacea781ad51b4410a8">INPUT</a>, <span class="stringliteral">'Input layer raster data set'</span>,ParameterRaster))</div>
+<div class="line"><a name="l00058"></a><span class="lineno">   58</span>         self.addParameter(ParameterSelection(self.<a class="code" href="classqgis_1_1pktools_1_1pkfilterdem_1_1pkfilterdem.html#a7f5103cdd44f324038b46d976a5b83fd">FILTER</a>,<span class="stringliteral">"filter"</span>,self.<a class="code" href="classqgis_1_1pktools_1_1pkfilterdem_1_1pkfilterdem.html#a638ece9d2b2398b40299138509bfb82b">FILTER_OPTIONS</a>, 0))</div>
+<div class="line"><a name="l00059"></a><span class="lineno">   59</span>         self.addParameter(ParameterNumber(self.<a class="code" href="classqgis_1_1pktools_1_1pkfilterdem_1_1pkfilterdem.html#ad307370f861c20fe353817b2ab0b8d30">DIM</a>, <span class="stringliteral">"maximum filter kernel size"</span>,3,<span class="keywordtype">None</span>,17))</div>
 <div class="line"><a name="l00060"></a><span class="lineno">   60</span> </div>
-<div class="line"><a name="l00061"></a><span class="lineno">   61</span>         self.addOutput(OutputRaster(self.<a class="code" href="classqgis_1_1pkfilterdem_1_1pkfilterdem.html#af1b0b8b6543976e0436e35269673d135">OUTPUT</a>, <span class="stringliteral">"Output raster data set"</span>))</div>
-<div class="line"><a name="l00062"></a><span class="lineno">   62</span>         self.addParameter(ParameterSelection(self.<a class="code" href="classqgis_1_1pkfilterdem_1_1pkfilterdem.html#a93d222282debe7b1e835fe457e42668e">RTYPE</a>, <span class="stringliteral">'Output raster type'</span>, self.<a class="code" href="classqgis_1_1pkfilterdem_1_1pkfilterdem.html#a609a8357c611c1b7291714359d293205">TYPE</a>, 0))</div>
-<div class="line"><a name="l00063"></a><span class="lineno">   63</span>         self.addParameter(ParameterString(self.<a class="code" href="classqgis_1_1pkfilterdem_1_1pkfilterdem.html#a8d539783f415aef729ad8eec26d1befc">EXTRA</a>,</div>
+<div class="line"><a name="l00061"></a><span class="lineno">   61</span>         self.addOutput(OutputRaster(self.<a class="code" href="classqgis_1_1pktools_1_1pkfilterdem_1_1pkfilterdem.html#af8b963b1053b7cb062180301e101f6e8">OUTPUT</a>, <span class="stringliteral">"Output raster data set"</span>))</div>
+<div class="line"><a name="l00062"></a><span class="lineno">   62</span>         self.addParameter(ParameterSelection(self.<a class="code" href="classqgis_1_1pktools_1_1pkfilterdem_1_1pkfilterdem.html#aabf2e76352764ec3bd9c181276da0022">RTYPE</a>, <span class="stringliteral">'Output raster type'</span>, self.<a class="code" href="classqgis_1_1pktools_1_1pkfilterdem_1_1pkfilterdem.html#aa4a697381f67ada0cfdf81a7f103cfcb">TYPE</a>, 0))</div>
+<div class="line"><a name="l00063"></a><span class="lineno">   63</span>         self.addParameter(ParameterString(self.<a class="code" href="classqgis_1_1pktools_1_1pkfilterdem_1_1pkfilterdem.html#a350392989faf79142d8005da7a13056b">EXTRA</a>,</div>
 <div class="line"><a name="l00064"></a><span class="lineno">   64</span>                           <span class="stringliteral">'Additional parameters'</span>, <span class="stringliteral">'-of GTiff'</span>, optional=<span class="keyword">True</span>))</div>
 <div class="line"><a name="l00065"></a><span class="lineno">   65</span> </div>
 <div class="line"><a name="l00066"></a><span class="lineno">   66</span>     <span class="keyword">def </span>processAlgorithm(self, progress):</div>
-<div class="line"><a name="l00067"></a><span class="lineno">   67</span>         cliPath = <span class="stringliteral">'"'</span> + os.path.join(pktoolsUtils.pktoolsPath(), self.<a class="code" href="classqgis_1_1pkfilterdem_1_1pkfilterdem.html#a0f4ab9a21d0270b9215bdeadd24be172">cliName</a>()) + <span class="stringliteral">'"'</span></div>
+<div class="line"><a name="l00067"></a><span class="lineno">   67</span>         cliPath = <span class="stringliteral">'"'</span> + os.path.join(pktoolsUtils.pktoolsPath(), self.<a class="code" href="classqgis_1_1pktools_1_1pkfilterdem_1_1pkfilterdem.html#a0aac6f68d72ca4b02b164f5d76f25e6e">cliName</a>()) + <span class="stringliteral">'"'</span></div>
 <div class="line"><a name="l00068"></a><span class="lineno">   68</span>         commands = [cliPath]</div>
 <div class="line"><a name="l00069"></a><span class="lineno">   69</span> </div>
-<div class="line"><a name="l00070"></a><span class="lineno">   70</span>         input=self.getParameterValue(self.<a class="code" href="classqgis_1_1pkfilterdem_1_1pkfilterdem.html#ac63e9625819c3df9a3f210a44577de8d">INPUT</a>)</div>
+<div class="line"><a name="l00070"></a><span class="lineno">   70</span>         input=self.getParameterValue(self.<a class="code" href="classqgis_1_1pktools_1_1pkfilterdem_1_1pkfilterdem.html#ae1e46a26be886bacea781ad51b4410a8">INPUT</a>)</div>
 <div class="line"><a name="l00071"></a><span class="lineno">   71</span>         <span class="keywordflow">if</span> input != <span class="stringliteral">""</span>:</div>
 <div class="line"><a name="l00072"></a><span class="lineno">   72</span>             commands.append(<span class="stringliteral">'-i'</span>)</div>
 <div class="line"><a name="l00073"></a><span class="lineno">   73</span>             commands.append(<span class="stringliteral">'"'</span> + input + <span class="stringliteral">'"'</span>)</div>
 <div class="line"><a name="l00074"></a><span class="lineno">   74</span> </div>
-<div class="line"><a name="l00075"></a><span class="lineno">   75</span>         filter=self.<a class="code" href="classqgis_1_1pkfilterdem_1_1pkfilterdem.html#aa684f5dff3236fff634fd644507ead3f">FILTER_OPTIONS</a>[self.getParameterValue(self.<a class="code" href="classqgis_1_1pkfilterdem_1_1pkfilterdem.html#a231a73cc70938e1e8c0fbfe2ad354666">FILTER</a>)]</div>
+<div class="line"><a name="l00075"></a><span class="lineno">   75</span>         filter=self.<a class="code" href="classqgis_1_1pktools_1_1pkfilterdem_1_1pkfilterdem.html#a638ece9d2b2398b40299138509bfb82b">FILTER_OPTIONS</a>[self.getParameterValue(self.<a class="code" href="classqgis_1_1pktools_1_1pkfilterdem_1_1pkfilterdem.html#a7f5103cdd44f324038b46d976a5b83fd">FILTER</a>)]</div>
 <div class="line"><a name="l00076"></a><span class="lineno">   76</span>         <span class="keywordflow">if</span> filter != <span class="stringliteral">"none"</span>:</div>
 <div class="line"><a name="l00077"></a><span class="lineno">   77</span>             commands.append(<span class="stringliteral">"-f"</span>)</div>
 <div class="line"><a name="l00078"></a><span class="lineno">   78</span>             commands.append(filter)</div>
-<div class="line"><a name="l00079"></a><span class="lineno">   79</span>         <span class="keywordflow">if</span> self.getParameterValue(self.<a class="code" href="classqgis_1_1pkfilterdem_1_1pkfilterdem.html#a36f24e3cf45c53076e40bf050690c9e4">DIM</a>) != 0:</div>
+<div class="line"><a name="l00079"></a><span class="lineno">   79</span>         <span class="keywordflow">if</span> self.getParameterValue(self.<a class="code" href="classqgis_1_1pktools_1_1pkfilterdem_1_1pkfilterdem.html#ad307370f861c20fe353817b2ab0b8d30">DIM</a>) != 0:</div>
 <div class="line"><a name="l00080"></a><span class="lineno">   80</span>             commands.append(<span class="stringliteral">"-dim"</span>)</div>
-<div class="line"><a name="l00081"></a><span class="lineno">   81</span>             commands.append(str(self.getParameterValue(self.<a class="code" href="classqgis_1_1pkfilterdem_1_1pkfilterdem.html#a36f24e3cf45c53076e40bf050690c9e4">DIM</a>)))</div>
+<div class="line"><a name="l00081"></a><span class="lineno">   81</span>             commands.append(str(self.getParameterValue(self.<a class="code" href="classqgis_1_1pktools_1_1pkfilterdem_1_1pkfilterdem.html#ad307370f861c20fe353817b2ab0b8d30">DIM</a>)))</div>
 <div class="line"><a name="l00082"></a><span class="lineno">   82</span> </div>
-<div class="line"><a name="l00083"></a><span class="lineno">   83</span>         <span class="keywordflow">if</span> self.<a class="code" href="classqgis_1_1pkfilterdem_1_1pkfilterdem.html#a609a8357c611c1b7291714359d293205">TYPE</a>[self.getParameterValue(self.<a class="code" href="classqgis_1_1pkfilterdem_1_1pkfilterdem.html#a93d222282debe7b1e835fe457e42668e">RTYPE</a>)] != <span class="stringliteral">"none"</span>:</div>
+<div class="line"><a name="l00083"></a><span class="lineno">   83</span>         <span class="keywordflow">if</span> self.<a class="code" href="classqgis_1_1pktools_1_1pkfilterdem_1_1pkfilterdem.html#aa4a697381f67ada0cfdf81a7f103cfcb">TYPE</a>[self.getParameterValue(self.<a class="code" href="classqgis_1_1pktools_1_1pkfilterdem_1_1pkfilterdem.html#aabf2e76352764ec3bd9c181276da0022">RTYPE</a>)] != <span class="stringliteral">"none"</span>:</div>
 <div class="line"><a name="l00084"></a><span class="lineno">   84</span>             commands.append(<span class="stringliteral">'-ot'</span>)</div>
-<div class="line"><a name="l00085"></a><span class="lineno">   85</span>             commands.append(self.<a class="code" href="classqgis_1_1pkfilterdem_1_1pkfilterdem.html#a609a8357c611c1b7291714359d293205">TYPE</a>[self.getParameterValue(self.<a class="code" href="classqgis_1_1pkfilterdem_1_1pkfilterdem.html#a93d222282debe7b1e835fe457e42668e">RTYPE</a>)])</div>
-<div class="line"><a name="l00086"></a><span class="lineno">   86</span>         output=self.getOutputValue(self.<a class="code" href="classqgis_1_1pkfilterdem_1_1pkfilterdem.html#af1b0b8b6543976e0436e35269673d135">OUTPUT</a>)</div>
+<div class="line"><a name="l00085"></a><span class="lineno">   85</span>             commands.append(self.<a class="code" href="classqgis_1_1pktools_1_1pkfilterdem_1_1pkfilterdem.html#aa4a697381f67ada0cfdf81a7f103cfcb">TYPE</a>[self.getParameterValue(self.<a class="code" href="classqgis_1_1pktools_1_1pkfilterdem_1_1pkfilterdem.html#aabf2e76352764ec3bd9c181276da0022">RTYPE</a>)])</div>
+<div class="line"><a name="l00086"></a><span class="lineno">   86</span>         output=self.getOutputValue(self.<a class="code" href="classqgis_1_1pktools_1_1pkfilterdem_1_1pkfilterdem.html#af8b963b1053b7cb062180301e101f6e8">OUTPUT</a>)</div>
 <div class="line"><a name="l00087"></a><span class="lineno">   87</span>         <span class="keywordflow">if</span> output != <span class="stringliteral">""</span>:</div>
 <div class="line"><a name="l00088"></a><span class="lineno">   88</span>             commands.append(<span class="stringliteral">"-o"</span>)</div>
 <div class="line"><a name="l00089"></a><span class="lineno">   89</span>             commands.append(<span class="stringliteral">'"'</span> + output + <span class="stringliteral">'"'</span>)</div>
 <div class="line"><a name="l00090"></a><span class="lineno">   90</span> </div>
-<div class="line"><a name="l00091"></a><span class="lineno">   91</span>         extra = str(self.getParameterValue(self.<a class="code" href="classqgis_1_1pkfilterdem_1_1pkfilterdem.html#a8d539783f415aef729ad8eec26d1befc">EXTRA</a>))</div>
+<div class="line"><a name="l00091"></a><span class="lineno">   91</span>         extra = str(self.getParameterValue(self.<a class="code" href="classqgis_1_1pktools_1_1pkfilterdem_1_1pkfilterdem.html#a350392989faf79142d8005da7a13056b">EXTRA</a>))</div>
 <div class="line"><a name="l00092"></a><span class="lineno">   92</span>         <span class="keywordflow">if</span> len(extra) > 0:</div>
 <div class="line"><a name="l00093"></a><span class="lineno">   93</span>             commands.append(extra)</div>
 <div class="line"><a name="l00094"></a><span class="lineno">   94</span> </div>
 <div class="line"><a name="l00095"></a><span class="lineno">   95</span>         pktoolsUtils.runpktools(commands, progress)</div>
-<div class="ttc" id="classqgis_1_1pkfilterdem_1_1pkfilterdem_html_af1b0b8b6543976e0436e35269673d135"><div class="ttname"><a href="classqgis_1_1pkfilterdem_1_1pkfilterdem.html#af1b0b8b6543976e0436e35269673d135">qgis.pkfilterdem.pkfilterdem.OUTPUT</a></div><div class="ttdeci">string OUTPUT</div><div class="ttdef"><b>Definition:</b> <a href="pkfilterdem_8py_source.html#l00042">pkfilterdem.py:42</a></div></div>
-<div class="ttc" id="classqgis_1_1pkfilterdem_1_1pkfilterdem_html_a609a8357c611c1b7291714359d293205"><div class="ttname"><a href="classqgis_1_1pkfilterdem_1_1pkfilterdem.html#a609a8357c611c1b7291714359d293205">qgis.pkfilterdem.pkfilterdem.TYPE</a></div><div class="ttdeci">list TYPE</div><div class="ttdef"><b>Definition:</b> <a href="pkfilterdem_8py_source.html#l00045">pkfilterdem.py:45</a></div></div>
-<div class="ttc" id="classqgis_1_1pkfilterdem_1_1pkfilterdem_html_a93d222282debe7b1e835fe457e42668e"><div class="ttname"><a href="classqgis_1_1pkfilterdem_1_1pkfilterdem.html#a93d222282debe7b1e835fe457e42668e">qgis.pkfilterdem.pkfilterdem.RTYPE</a></div><div class="ttdeci">string RTYPE</div><div class="ttdef"><b>Definition:</b> <a href="pkfilterdem_8py_source.html#l00044">pkfilterdem.py:44</a></div></div>
-<div class="ttc" id="classqgis_1_1pkfilterdem_1_1pkfilterdem_html_a231a73cc70938e1e8c0fbfe2ad354666"><div class="ttname"><a href="classqgis_1_1pkfilterdem_1_1pkfilterdem.html#a231a73cc70938e1e8c0fbfe2ad354666">qgis.pkfilterdem.pkfilterdem.FILTER</a></div><div class="ttdeci">string FILTER</div><div class="ttdef"><b>Definition:</b> <a href="pkfilterdem_8py_source.html#l00047">pkfilterdem.py:47</a></div></div>
-<div class="ttc" id="classqgis_1_1pkfilterdem_1_1pkfilterdem_html_aa684f5dff3236fff634fd644507ead3f"><div class="ttname"><a href="classqgis_1_1pkfilterdem_1_1pkfilterdem.html#aa684f5dff3236fff634fd644507ead3f">qgis.pkfilterdem.pkfilterdem.FILTER_OPTIONS</a></div><div class="ttdeci">list FILTER_OPTIONS</div><div class="ttdef"><b>Definition:</b> <a href="pkfilterdem_8py_source.html#l00046">pkfilterdem.py:46</a></div></div>
-<div class="ttc" id="classqgis_1_1pkfilterdem_1_1pkfilterdem_html_a8d539783f415aef729ad8eec26d1befc"><div class="ttname"><a href="classqgis_1_1pkfilterdem_1_1pkfilterdem.html#a8d539783f415aef729ad8eec26d1befc">qgis.pkfilterdem.pkfilterdem.EXTRA</a></div><div class="ttdeci">string EXTRA</div><div class="ttdef"><b>Definition:</b> <a href="pkfilterdem_8py_source.html#l00048">pkfilterdem.py:48</a></div></div>
-<div class="ttc" id="classqgis_1_1pkfilterdem_1_1pkfilterdem_html_ac63e9625819c3df9a3f210a44577de8d"><div class="ttname"><a href="classqgis_1_1pkfilterdem_1_1pkfilterdem.html#ac63e9625819c3df9a3f210a44577de8d">qgis.pkfilterdem.pkfilterdem.INPUT</a></div><div class="ttdeci">string INPUT</div><div class="ttdef"><b>Definition:</b> <a href="pkfilterdem_8py_source.html#l00041">pkfilterdem.py:41</a></div></div>
-<div class="ttc" id="classqgis_1_1pkfilterdem_1_1pkfilterdem_html"><div class="ttname"><a href="classqgis_1_1pkfilterdem_1_1pkfilterdem.html">qgis.pkfilterdem.pkfilterdem</a></div><div class="ttdef"><b>Definition:</b> <a href="pkfilterdem_8py_source.html#l00039">pkfilterdem.py:39</a></div></div>
-<div class="ttc" id="classqgis_1_1pkfilterdem_1_1pkfilterdem_html_a6cda59e12b5d35384148d3a9e50a380c"><div class="ttname"><a href="classqgis_1_1pkfilterdem_1_1pkfilterdem.html#a6cda59e12b5d35384148d3a9e50a380c">qgis.pkfilterdem.pkfilterdem.name</a></div><div class="ttdeci">name</div><div class="ttdef"><b>Definition:</b> <a href="pkfilterdem_8py_source.html#l00054">pkfilterdem.py:54</a></div></div>
-<div class="ttc" id="classqgis_1_1pkfilterdem_1_1pkfilterdem_html_a362a12d7bac87e1ef6bd3b0921893e4b"><div class="ttname"><a href="classqgis_1_1pkfilterdem_1_1pkfilterdem.html#a362a12d7bac87e1ef6bd3b0921893e4b">qgis.pkfilterdem.pkfilterdem.group</a></div><div class="ttdeci">group</div><div class="ttdef"><b>Definition:</b> <a href="pkfilterdem_8py_source.html#l00055">pkfilterdem.py:55</a></div></div>
-<div class="ttc" id="classqgis_1_1pkfilterdem_1_1pkfilterdem_html_a36f24e3cf45c53076e40bf050690c9e4"><div class="ttname"><a href="classqgis_1_1pkfilterdem_1_1pkfilterdem.html#a36f24e3cf45c53076e40bf050690c9e4">qgis.pkfilterdem.pkfilterdem.DIM</a></div><div class="ttdeci">string DIM</div><div class="ttdef"><b>Definition:</b> <a href="pkfilterdem_8py_source.html#l00043">pkfilterdem.py:43</a></div></div>
-<div class="ttc" id="classqgis_1_1pkfilterdem_1_1pkfilterdem_html_a0f4ab9a21d0270b9215bdeadd24be172"><div class="ttname"><a href="classqgis_1_1pkfilterdem_1_1pkfilterdem.html#a0f4ab9a21d0270b9215bdeadd24be172">qgis.pkfilterdem.pkfilterdem.cliName</a></div><div class="ttdeci">def cliName</div><div class="ttdef"><b>Definition:</b> <a href="pkfilterdem_8py_source.html#l00050">pkfilterdem.py:50</a></div></div>
+<div class="ttc" id="classqgis_1_1pktools_1_1pkfilterdem_1_1pkfilterdem_html_a350392989faf79142d8005da7a13056b"><div class="ttname"><a href="classqgis_1_1pktools_1_1pkfilterdem_1_1pkfilterdem.html#a350392989faf79142d8005da7a13056b">qgis.pktools.pkfilterdem.pkfilterdem.EXTRA</a></div><div class="ttdeci">string EXTRA</div><div class="ttdef"><b>Definition:</b> <a href="pktools_2pkfilterdem_8py_source.html#l00048">pkfilterdem.py:48</a></div></div>
+<div class="ttc" id="classqgis_1_1pktools_1_1pkfilterdem_1_1pkfilterdem_html_ad307370f861c20fe353817b2ab0b8d30"><div class="ttname"><a href="classqgis_1_1pktools_1_1pkfilterdem_1_1pkfilterdem.html#ad307370f861c20fe353817b2ab0b8d30">qgis.pktools.pkfilterdem.pkfilterdem.DIM</a></div><div class="ttdeci">string DIM</div><div class="ttdef"><b>Definition:</b> <a href="pktools_2pkfilterdem_8py_source.html#l00043">pkfilterdem.py:43</a></div></div>
+<div class="ttc" id="classqgis_1_1pktools_1_1pkfilterdem_1_1pkfilterdem_html_af8b963b1053b7cb062180301e101f6e8"><div class="ttname"><a href="classqgis_1_1pktools_1_1pkfilterdem_1_1pkfilterdem.html#af8b963b1053b7cb062180301e101f6e8">qgis.pktools.pkfilterdem.pkfilterdem.OUTPUT</a></div><div class="ttdeci">string OUTPUT</div><div class="ttdef"><b>Definition:</b> <a href="pktools_2pkfilterdem_8py_source.html#l00042">pkfilterdem.py:42</a></div></div>
+<div class="ttc" id="classqgis_1_1pktools_1_1pkfilterdem_1_1pkfilterdem_html_a638ece9d2b2398b40299138509bfb82b"><div class="ttname"><a href="classqgis_1_1pktools_1_1pkfilterdem_1_1pkfilterdem.html#a638ece9d2b2398b40299138509bfb82b">qgis.pktools.pkfilterdem.pkfilterdem.FILTER_OPTIONS</a></div><div class="ttdeci">list FILTER_OPTIONS</div><div class="ttdef"><b>Definition:</b> <a href="pktools_2pkfilterdem_8py_source.html#l00046">pkfilterdem.py:46</a></div></div>
+<div class="ttc" id="classqgis_1_1pktools_1_1pkfilterdem_1_1pkfilterdem_html_acf67738f3f769ecd8c908f883aaf585a"><div class="ttname"><a href="classqgis_1_1pktools_1_1pkfilterdem_1_1pkfilterdem.html#acf67738f3f769ecd8c908f883aaf585a">qgis.pktools.pkfilterdem.pkfilterdem.name</a></div><div class="ttdeci">name</div><div class="ttdef"><b>Definition:</b> <a href="pktools_2pkfilterdem_8py_source.html#l00054">pkfilterdem.py:54</a></div></div>
+<div class="ttc" id="classqgis_1_1pktools_1_1pkfilterdem_1_1pkfilterdem_html_a7f5103cdd44f324038b46d976a5b83fd"><div class="ttname"><a href="classqgis_1_1pktools_1_1pkfilterdem_1_1pkfilterdem.html#a7f5103cdd44f324038b46d976a5b83fd">qgis.pktools.pkfilterdem.pkfilterdem.FILTER</a></div><div class="ttdeci">string FILTER</div><div class="ttdef"><b>Definition:</b> <a href="pktools_2pkfilterdem_8py_source.html#l00047">pkfilterdem.py:47</a></div></div>
+<div class="ttc" id="classqgis_1_1pktools_1_1pkfilterdem_1_1pkfilterdem_html"><div class="ttname"><a href="classqgis_1_1pktools_1_1pkfilterdem_1_1pkfilterdem.html">qgis.pktools.pkfilterdem.pkfilterdem</a></div><div class="ttdef"><b>Definition:</b> <a href="pktools_2pkfilterdem_8py_source.html#l00039">pkfilterdem.py:39</a></div></div>
+<div class="ttc" id="classqgis_1_1pktools_1_1pkfilterdem_1_1pkfilterdem_html_aabf2e76352764ec3bd9c181276da0022"><div class="ttname"><a href="classqgis_1_1pktools_1_1pkfilterdem_1_1pkfilterdem.html#aabf2e76352764ec3bd9c181276da0022">qgis.pktools.pkfilterdem.pkfilterdem.RTYPE</a></div><div class="ttdeci">string RTYPE</div><div class="ttdef"><b>Definition:</b> <a href="pktools_2pkfilterdem_8py_source.html#l00044">pkfilterdem.py:44</a></div></div>
+<div class="ttc" id="classqgis_1_1pktools_1_1pkfilterdem_1_1pkfilterdem_html_a2b10663adca2f38835d50d6872e157ce"><div class="ttname"><a href="classqgis_1_1pktools_1_1pkfilterdem_1_1pkfilterdem.html#a2b10663adca2f38835d50d6872e157ce">qgis.pktools.pkfilterdem.pkfilterdem.group</a></div><div class="ttdeci">group</div><div class="ttdef"><b>Definition:</b> <a href="pktools_2pkfilterdem_8py_source.html#l00055">pkfilterdem.py:55</a></div></div>
+<div class="ttc" id="classqgis_1_1pktools_1_1pkfilterdem_1_1pkfilterdem_html_ae1e46a26be886bacea781ad51b4410a8"><div class="ttname"><a href="classqgis_1_1pktools_1_1pkfilterdem_1_1pkfilterdem.html#ae1e46a26be886bacea781ad51b4410a8">qgis.pktools.pkfilterdem.pkfilterdem.INPUT</a></div><div class="ttdeci">string INPUT</div><div class="ttdef"><b>Definition:</b> <a href="pktools_2pkfilterdem_8py_source.html#l00041">pkfilterdem.py:41</a></div></div>
+<div class="ttc" id="classqgis_1_1pktools_1_1pkfilterdem_1_1pkfilterdem_html_a0aac6f68d72ca4b02b164f5d76f25e6e"><div class="ttname"><a href="classqgis_1_1pktools_1_1pkfilterdem_1_1pkfilterdem.html#a0aac6f68d72ca4b02b164f5d76f25e6e">qgis.pktools.pkfilterdem.pkfilterdem.cliName</a></div><div class="ttdeci">def cliName</div><div class="ttdef"><b>Definition:</b> <a href="pktools_2pkfilterdem_8py_source.html#l00050">pkfilterdem.py:50</a></div></div>
+<div class="ttc" id="classqgis_1_1pktools_1_1pkfilterdem_1_1pkfilterdem_html_aa4a697381f67ada0cfdf81a7f103cfcb"><div class="ttname"><a href="classqgis_1_1pktools_1_1pkfilterdem_1_1pkfilterdem.html#aa4a697381f67ada0cfdf81a7f103cfcb">qgis.pktools.pkfilterdem.pkfilterdem.TYPE</a></div><div class="ttdeci">list TYPE</div><div class="ttdef"><b>Definition:</b> <a href="pktools_2pkfilterdem_8py_source.html#l00045">pkfilterdem.py:45</a></div></div>
 </div><!-- fragment --></div><!-- contents -->
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Jun 23 2015 17:09:36 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Tue Nov 3 2015 15:58:26 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/pkgetmask_8py_source.html b/doc/html/pktools_2pkgetmask_8py_source.html
similarity index 59%
copy from doc/html/pkgetmask_8py_source.html
copy to doc/html/pktools_2pkgetmask_8py_source.html
index 1a6b48a..f4935ae 100644
--- a/doc/html/pkgetmask_8py_source.html
+++ b/doc/html/pktools_2pkgetmask_8py_source.html
@@ -4,7 +4,7 @@
 <meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
 <meta http-equiv="X-UA-Compatible" content="IE=9"/>
 <meta name="generator" content="Doxygen 1.8.6"/>
-<title>pktools: /home/kempenep/pktools/qgis/pkgetmask.py Source File</title>
+<title>pktools: /home/kempenep/pktools/qgis/pktools/pkgetmask.py Source File</title>
 <link href="tabs.css" rel="stylesheet" type="text/css"/>
 <script type="text/javascript" src="jquery.js"></script>
 <script type="text/javascript" src="dynsections.js"></script>
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.3</span>
+    <span id="projectnumber">2.6.4</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -44,7 +44,7 @@
   </div>
 <div id="nav-path" class="navpath">
   <ul>
-<li class="navelem"><a class="el" href="dir_5785acc8d2e42f8795bdbe936856f26d.html">qgis</a></li>  </ul>
+<li class="navelem"><a class="el" href="dir_5785acc8d2e42f8795bdbe936856f26d.html">qgis</a></li><li class="navelem"><a class="el" href="dir_b7cc22b4453454f1e686d9a2e78d988d.html">pktools</a></li>  </ul>
 </div>
 </div><!-- top -->
 <div class="header">
@@ -89,7 +89,7 @@
 <div class="line"><a name="l00035"></a><span class="lineno">   35</span> <span class="keyword">from</span> processing.core.parameters <span class="keyword">import</span> ParameterBoolean</div>
 <div class="line"><a name="l00036"></a><span class="lineno">   36</span> <span class="keyword">from</span> processing.core.parameters <span class="keyword">import</span> ParameterExtent</div>
 <div class="line"><a name="l00037"></a><span class="lineno">   37</span> </div>
-<div class="line"><a name="l00038"></a><span class="lineno"><a class="line" href="classqgis_1_1pkgetmask_1_1pkgetmask.html">   38</a></span> <span class="keyword">class </span><a class="code" href="classqgis_1_1pkgetmask_1_1pkgetmask.html">pkgetmask</a>(pktoolsAlgorithm):</div>
+<div class="line"><a name="l00038"></a><span class="lineno"><a class="line" href="classqgis_1_1pktools_1_1pkgetmask_1_1pkgetmask.html">   38</a></span> <span class="keyword">class </span><a class="code" href="classqgis_1_1pktools_1_1pkgetmask_1_1pkgetmask.html">pkgetmask</a>(pktoolsAlgorithm):</div>
 <div class="line"><a name="l00039"></a><span class="lineno">   39</span> </div>
 <div class="line"><a name="l00040"></a><span class="lineno">   40</span>     INPUT = <span class="stringliteral">"INPUT"</span></div>
 <div class="line"><a name="l00041"></a><span class="lineno">   41</span>     BAND = <span class="stringliteral">"BAND"</span></div>
@@ -108,94 +108,95 @@
 <div class="line"><a name="l00054"></a><span class="lineno">   54</span>         <span class="keywordflow">return</span> <span class="stringliteral">"pkgetmask"</span></div>
 <div class="line"><a name="l00055"></a><span class="lineno">   55</span> </div>
 <div class="line"><a name="l00056"></a><span class="lineno">   56</span>     <span class="keyword">def </span>defineCharacteristics(self):</div>
-<div class="line"><a name="l00057"></a><span class="lineno">   57</span>         self.<a class="code" href="classqgis_1_1pkgetmask_1_1pkgetmask.html#ab9a736f64545f8ac36bbf1eae8576cd5">name</a> = <span class="stringliteral">"create mask from raster dataset"</span></div>
-<div class="line"><a name="l00058"></a><span class="lineno">   58</span>         self.<a class="code" href="classqgis_1_1pkgetmask_1_1pkgetmask.html#aa0e0d197447b16bee323b2e9fdaa876b">group</a> = <span class="stringliteral">"[pktools] raster"</span></div>
-<div class="line"><a name="l00059"></a><span class="lineno">   59</span>         self.addParameter(ParameterRaster(self.<a class="code" href="classqgis_1_1pkgetmask_1_1pkgetmask.html#a1990e1aab12f8a84394b7c44c9c78efd">INPUT</a>, <span class="stringliteral">'Input layer raster data set'</span>,ParameterRaster))</div>
-<div class="line"><a name="l00060"></a><span class="lineno">   60</span>         self.addParameter(ParameterString(self.<a class="code" href="classqgis_1_1pkgetmask_1_1pkgetmask.html#ad45ff2519baa645c8bf75e063fc2939d">BAND</a>, <span class="stringliteral">"Band(s) used for mask (e.g., 0;1)"</span>,<span class="stringliteral">"0"</span>))</div>
-<div class="line"><a name="l00061"></a><span class="lineno">   61</span>         self.addParameter(ParameterString(self.<a class="code" href="classqgis_1_1pkgetmask_1_1pkgetmask.html#a86f16ca18fe18083446f0a2fdab1c989">MIN</a>, <span class="stringliteral">"Minimum valid value (one value per band)"</span>,<span class="stringliteral">"none"</span>))</div>
-<div class="line"><a name="l00062"></a><span class="lineno">   62</span>         self.addParameter(ParameterString(self.<a class="code" href="classqgis_1_1pkgetmask_1_1pkgetmask.html#a74d4d91d62405ae1cb788e0fc52b64c6">MAX</a>, <span class="stringliteral">"Maximum valid value (one value per band)"</span>,<span class="stringliteral">"none"</span>))</div>
-<div class="line"><a name="l00063"></a><span class="lineno">   63</span>         self.addParameter(ParameterSelection(self.<a class="code" href="classqgis_1_1pkgetmask_1_1pkgetmask.html#a2a1d0302fefa56238c42d3ea6f747941">OPERATOR</a>,<span class="stringliteral">"getmask rule"</span>,self.<a class="code" href="classqgis_1_1pkgetmask_1_1pkgetmask.html#a418e9d844d597fb600d16afc0b7e70cd">OPERATOR_OPTIONS</a>, 0))</div>
-<div class="line"><a name="l00064"></a><span class="lineno">   64</span>         self.addParameter(ParameterString(self.<a class="code" href="classqgis_1_1pkgetmask_1_1pkgetmask.html#a579e059d072a57554c9a61180a9fd08c">DATA</a>, <span class="stringliteral">"write value(s) for valid pixels (e.g., 0;255)"</span>,<span class="stringliteral">"1"</span>))</div>
-<div class="line"><a name="l00065"></a><span class="lineno">   65</span>         self.addParameter(ParameterString(self.<a class="code" href="classqgis_1_1pkgetmask_1_1pkgetmask.html#ab851d0b2d6acf47df89a9d89373f804b">NODATA</a>, <span class="stringliteral">"write value(s) for invalid pixels"</span>,<span class="stringliteral">"0"</span>))</div>
-<div class="line"><a name="l00066"></a><span class="lineno">   66</span>         self.addOutput(OutputRaster(self.<a class="code" href="classqgis_1_1pkgetmask_1_1pkgetmask.html#a5eedd82f4dda4923e8560ff43b657f73">OUTPUT</a>, <span class="stringliteral">"Output raster data set"</span>))</div>
-<div class="line"><a name="l00067"></a><span class="lineno">   67</span>         self.addParameter(ParameterSelection(self.<a class="code" href="classqgis_1_1pkgetmask_1_1pkgetmask.html#a091f5ee5165bde746ed9841909d06d5c">RTYPE</a>, <span class="stringliteral">'Output raster type (leave as none to keep original type)'</span>, self.<a class="code" href="classqgis_1_1pkgetmask_1_1pkgetmask.html#a7f1272eeb8cf07f429440cdf387c2d17">TYPE</a>, 0))</div>
-<div class="line"><a name="l00068"></a><span class="lineno">   68</span>         self.addParameter(ParameterString(self.<a class="code" href="classqgis_1_1pkgetmask_1_1pkgetmask.html#a7c46da38f871a5211efe90216afff4ef">EXTRA</a>,</div>
+<div class="line"><a name="l00057"></a><span class="lineno">   57</span>         self.<a class="code" href="classqgis_1_1pktools_1_1pkgetmask_1_1pkgetmask.html#ac4229d79e7fdbcc320c34b70b4996c61">name</a> = <span class="stringliteral">"create mask from raster dataset"</span></div>
+<div class="line"><a name="l00058"></a><span class="lineno">   58</span>         self.<a class="code" href="classqgis_1_1pktools_1_1pkgetmask_1_1pkgetmask.html#afe1f40dd307ff76950c2b7095fa51b2d">group</a> = <span class="stringliteral">"[pktools] raster"</span></div>
+<div class="line"><a name="l00059"></a><span class="lineno">   59</span>         self.addParameter(ParameterRaster(self.<a class="code" href="classqgis_1_1pktools_1_1pkgetmask_1_1pkgetmask.html#aaf2310f968ae6d6254816539b83b424b">INPUT</a>, <span class="stringliteral">'Input layer raster data set'</span>,ParameterRaster))</div>
+<div class="line"><a name="l00060"></a><span class="lineno">   60</span>         self.addParameter(ParameterString(self.<a class="code" href="classqgis_1_1pktools_1_1pkgetmask_1_1pkgetmask.html#a4b3b39185a49678924fa180770112465">BAND</a>, <span class="stringliteral">"Band(s) used for mask (e.g., 0;1)"</span>,<span class="stringliteral">"0"</span>))</div>
+<div class="line"><a name="l00061"></a><span class="lineno">   61</span>         self.addParameter(ParameterString(self.<a class="code" href="classqgis_1_1pktools_1_1pkgetmask_1_1pkgetmask.html#accd8fb321226d11fb68b2564297d3b13">MIN</a>, <span class="stringliteral">"Minimum valid value (one value per band)"</span>,<span class="stringliteral">"none"</span>))</div>
+<div class="line"><a name="l00062"></a><span class="lineno">   62</span>         self.addParameter(ParameterString(self.<a class="code" href="classqgis_1_1pktools_1_1pkgetmask_1_1pkgetmask.html#a89fc80dd3cf449b57ee883116ea2b4a7">MAX</a>, <span class="stringliteral">"Maximum valid value (one value per band)"</span>,<span class="stringliteral">"none"</span>))</div>
+<div class="line"><a name="l00063"></a><span class="lineno">   63</span>         self.addParameter(ParameterSelection(self.<a class="code" href="classqgis_1_1pktools_1_1pkgetmask_1_1pkgetmask.html#af34e465611d97efa0f38d938c61391d6">OPERATOR</a>,<span class="stringliteral">"getmask rule"</span>,self.<a class="code" href="classqgis_1_1pktools_1_1pkgetmask_1_1pkgetmask.html#a8e2b218c2424a51cbc4a93fe83d07c04">OPERATOR_OPTIONS</a>, 0))</div>
+<div class="line"><a name="l00064"></a><span class="lineno">   64</span>         self.addParameter(ParameterString(self.<a class="code" href="classqgis_1_1pktools_1_1pkgetmask_1_1pkgetmask.html#a70f3dbf7f080106837a8b17c006d81ac">DATA</a>, <span class="stringliteral">"write value(s) for valid pixels (e.g., 0;255)"</span>,<span class="stringliteral">"1"</span>))</div>
+<div class="line"><a name="l00065"></a><span class="lineno">   65</span>         self.addParameter(ParameterString(self.<a class="code" href="classqgis_1_1pktools_1_1pkgetmask_1_1pkgetmask.html#af966197d692f8351d058f374fbc5179c">NODATA</a>, <span class="stringliteral">"write value(s) for invalid pixels"</span>,<span class="stringliteral">"0"</span>))</div>
+<div class="line"><a name="l00066"></a><span class="lineno">   66</span>         self.addOutput(OutputRaster(self.<a class="code" href="classqgis_1_1pktools_1_1pkgetmask_1_1pkgetmask.html#a9923121c7323d34231111da4876b6ae1">OUTPUT</a>, <span class="stringliteral">"Output raster data set"</span>))</div>
+<div class="line"><a name="l00067"></a><span class="lineno">   67</span>         self.addParameter(ParameterSelection(self.<a class="code" href="classqgis_1_1pktools_1_1pkgetmask_1_1pkgetmask.html#ac7313cff3a0c24fab4a0c93b49a46ed8">RTYPE</a>, <span class="stringliteral">'Output raster type (leave as none to keep original type)'</span>, self.<a class="code" href="classqgis_1_1pktools_1_1pkgetmask_1_1pkgetmask.html#a5d4080e59895fdae293320e363dbfa03">TYPE</a>, 0))</div>
+<div class="line"><a name="l00068"></a><span class="lineno">   68</span>         self.addParameter(ParameterString(self.<a class="code" href="classqgis_1_1pktools_1_1pkgetmask_1_1pkgetmask.html#a67fb04dae201f7eeacd2c1c15ea8a68b">EXTRA</a>,</div>
 <div class="line"><a name="l00069"></a><span class="lineno">   69</span>                           <span class="stringliteral">'Additional parameters'</span>, <span class="stringliteral">'-of GTiff'</span>, optional=<span class="keyword">True</span>))</div>
 <div class="line"><a name="l00070"></a><span class="lineno">   70</span> </div>
 <div class="line"><a name="l00071"></a><span class="lineno">   71</span>     <span class="keyword">def </span>processAlgorithm(self, progress):</div>
-<div class="line"><a name="l00072"></a><span class="lineno">   72</span>         cliPath = <span class="stringliteral">'"'</span> + os.path.join(pktoolsUtils.pktoolsPath(), self.<a class="code" href="classqgis_1_1pkgetmask_1_1pkgetmask.html#ae9c628f2f53021c654f6cf1a597b3c54">cliName</a>()) + <span class="stringliteral">'"'</span></div>
+<div class="line"><a name="l00072"></a><span class="lineno">   72</span>         cliPath = <span class="stringliteral">'"'</span> + os.path.join(pktoolsUtils.pktoolsPath(), self.<a class="code" href="classqgis_1_1pktools_1_1pkgetmask_1_1pkgetmask.html#af8638a18a992135f0d2333599455da9d">cliName</a>()) + <span class="stringliteral">'"'</span></div>
 <div class="line"><a name="l00073"></a><span class="lineno">   73</span>         commands = [cliPath]</div>
 <div class="line"><a name="l00074"></a><span class="lineno">   74</span> </div>
-<div class="line"><a name="l00075"></a><span class="lineno">   75</span>         input=self.getParameterValue(self.<a class="code" href="classqgis_1_1pkgetmask_1_1pkgetmask.html#a1990e1aab12f8a84394b7c44c9c78efd">INPUT</a>)</div>
+<div class="line"><a name="l00075"></a><span class="lineno">   75</span>         input=self.getParameterValue(self.<a class="code" href="classqgis_1_1pktools_1_1pkgetmask_1_1pkgetmask.html#aaf2310f968ae6d6254816539b83b424b">INPUT</a>)</div>
 <div class="line"><a name="l00076"></a><span class="lineno">   76</span>         commands.append(<span class="stringliteral">'-i'</span>)</div>
 <div class="line"><a name="l00077"></a><span class="lineno">   77</span>         commands.append(<span class="stringliteral">'"'</span> + input + <span class="stringliteral">'"'</span>)</div>
 <div class="line"><a name="l00078"></a><span class="lineno">   78</span> </div>
-<div class="line"><a name="l00079"></a><span class="lineno">   79</span>         band=self.getParameterValue(self.<a class="code" href="classqgis_1_1pkgetmask_1_1pkgetmask.html#ad45ff2519baa645c8bf75e063fc2939d">BAND</a>)</div>
+<div class="line"><a name="l00079"></a><span class="lineno">   79</span>         band=self.getParameterValue(self.<a class="code" href="classqgis_1_1pktools_1_1pkgetmask_1_1pkgetmask.html#a4b3b39185a49678924fa180770112465">BAND</a>)</div>
 <div class="line"><a name="l00080"></a><span class="lineno">   80</span>         bandValues = band.split(<span class="stringliteral">';'</span>)</div>
 <div class="line"><a name="l00081"></a><span class="lineno">   81</span>         <span class="keywordflow">for</span> bandValue <span class="keywordflow">in</span> bandValues:</div>
 <div class="line"><a name="l00082"></a><span class="lineno">   82</span>             commands.append(<span class="stringliteral">'-band'</span>)</div>
 <div class="line"><a name="l00083"></a><span class="lineno">   83</span>             commands.append(bandValue)</div>
-<div class="line"><a name="l00084"></a><span class="lineno">   84</span>         min=self.getParameterValue(self.<a class="code" href="classqgis_1_1pkgetmask_1_1pkgetmask.html#a86f16ca18fe18083446f0a2fdab1c989">MIN</a>)</div>
+<div class="line"><a name="l00084"></a><span class="lineno">   84</span>         min=self.getParameterValue(self.<a class="code" href="classqgis_1_1pktools_1_1pkgetmask_1_1pkgetmask.html#accd8fb321226d11fb68b2564297d3b13">MIN</a>)</div>
 <div class="line"><a name="l00085"></a><span class="lineno">   85</span>         <span class="keywordflow">if</span> min != <span class="stringliteral">"none"</span>:</div>
 <div class="line"><a name="l00086"></a><span class="lineno">   86</span>             minValues = min.split(<span class="stringliteral">';'</span>)</div>
 <div class="line"><a name="l00087"></a><span class="lineno">   87</span>             <span class="keywordflow">for</span> minValue <span class="keywordflow">in</span> minValues:</div>
 <div class="line"><a name="l00088"></a><span class="lineno">   88</span>                 commands.append(<span class="stringliteral">'-min'</span>)</div>
 <div class="line"><a name="l00089"></a><span class="lineno">   89</span>                 commands.append(minValue)</div>
-<div class="line"><a name="l00090"></a><span class="lineno">   90</span>         max=self.getParameterValue(self.<a class="code" href="classqgis_1_1pkgetmask_1_1pkgetmask.html#a74d4d91d62405ae1cb788e0fc52b64c6">MAX</a>)</div>
+<div class="line"><a name="l00090"></a><span class="lineno">   90</span>         max=self.getParameterValue(self.<a class="code" href="classqgis_1_1pktools_1_1pkgetmask_1_1pkgetmask.html#a89fc80dd3cf449b57ee883116ea2b4a7">MAX</a>)</div>
 <div class="line"><a name="l00091"></a><span class="lineno">   91</span>         <span class="keywordflow">if</span> max != <span class="stringliteral">"none"</span>:</div>
 <div class="line"><a name="l00092"></a><span class="lineno">   92</span>             maxValues = max.split(<span class="stringliteral">';'</span>)</div>
 <div class="line"><a name="l00093"></a><span class="lineno">   93</span>             <span class="keywordflow">for</span> maxValue <span class="keywordflow">in</span> maxValues:</div>
 <div class="line"><a name="l00094"></a><span class="lineno">   94</span>                 commands.append(<span class="stringliteral">'-max'</span>)</div>
 <div class="line"><a name="l00095"></a><span class="lineno">   95</span>                 commands.append(maxValue)</div>
 <div class="line"><a name="l00096"></a><span class="lineno">   96</span>         commands.append(<span class="stringliteral">"-p"</span>)</div>
-<div class="line"><a name="l00097"></a><span class="lineno">   97</span>         commands.append(self.<a class="code" href="classqgis_1_1pkgetmask_1_1pkgetmask.html#a418e9d844d597fb600d16afc0b7e70cd">OPERATOR_OPTIONS</a>[self.getParameterValue(self.<a class="code" href="classqgis_1_1pkgetmask_1_1pkgetmask.html#a2a1d0302fefa56238c42d3ea6f747941">OPERATOR</a>)])</div>
-<div class="line"><a name="l00098"></a><span class="lineno">   98</span>         <span class="keywordflow">if</span> data != <span class="stringliteral">"none"</span>:</div>
-<div class="line"><a name="l00099"></a><span class="lineno">   99</span>             dataValues = data.split(<span class="stringliteral">';'</span>)</div>
-<div class="line"><a name="l00100"></a><span class="lineno">  100</span>             <span class="keywordflow">for</span> dataValue <span class="keywordflow">in</span> dataValues:</div>
-<div class="line"><a name="l00101"></a><span class="lineno">  101</span>                 commands.append(<span class="stringliteral">'-data'</span>)</div>
-<div class="line"><a name="l00102"></a><span class="lineno">  102</span>                 commands.append(dataValue)</div>
-<div class="line"><a name="l00103"></a><span class="lineno">  103</span>         nodata=self.getParameterValue(self.<a class="code" href="classqgis_1_1pkgetmask_1_1pkgetmask.html#ab851d0b2d6acf47df89a9d89373f804b">NODATA</a>)</div>
-<div class="line"><a name="l00104"></a><span class="lineno">  104</span>         <span class="keywordflow">if</span> nodata != <span class="stringliteral">"none"</span>:</div>
-<div class="line"><a name="l00105"></a><span class="lineno">  105</span>             nodataValues = nodata.split(<span class="stringliteral">';'</span>)</div>
-<div class="line"><a name="l00106"></a><span class="lineno">  106</span>             <span class="keywordflow">for</span> nodataValue <span class="keywordflow">in</span> nodataValues:</div>
-<div class="line"><a name="l00107"></a><span class="lineno">  107</span>                 commands.append(<span class="stringliteral">'-nodata'</span>)</div>
-<div class="line"><a name="l00108"></a><span class="lineno">  108</span>                 commands.append(nodataValue)</div>
-<div class="line"><a name="l00109"></a><span class="lineno">  109</span>         <span class="keywordflow">if</span> self.<a class="code" href="classqgis_1_1pkgetmask_1_1pkgetmask.html#a7f1272eeb8cf07f429440cdf387c2d17">TYPE</a>[self.getParameterValue(self.<a class="code" href="classqgis_1_1pkgetmask_1_1pkgetmask.html#a091f5ee5165bde746ed9841909d06d5c">RTYPE</a>)] != <span class="stringliteral">"none"</span>:</div>
-<div class="line"><a name="l00110"></a><span class="lineno">  110</span>             commands.append(<span class="stringliteral">'-ot'</span>)</div>
-<div class="line"><a name="l00111"></a><span class="lineno">  111</span>             commands.append(self.<a class="code" href="classqgis_1_1pkgetmask_1_1pkgetmask.html#a7f1272eeb8cf07f429440cdf387c2d17">TYPE</a>[self.getParameterValue(self.<a class="code" href="classqgis_1_1pkgetmask_1_1pkgetmask.html#a091f5ee5165bde746ed9841909d06d5c">RTYPE</a>)])</div>
-<div class="line"><a name="l00112"></a><span class="lineno">  112</span>         output=self.getOutputValue(self.<a class="code" href="classqgis_1_1pkgetmask_1_1pkgetmask.html#a5eedd82f4dda4923e8560ff43b657f73">OUTPUT</a>)</div>
-<div class="line"><a name="l00113"></a><span class="lineno">  113</span>         <span class="keywordflow">if</span> output != <span class="stringliteral">""</span>:</div>
-<div class="line"><a name="l00114"></a><span class="lineno">  114</span>             commands.append(<span class="stringliteral">"-o"</span>)</div>
-<div class="line"><a name="l00115"></a><span class="lineno">  115</span>             commands.append(<span class="stringliteral">'"'</span> + output + <span class="stringliteral">'"'</span>)</div>
-<div class="line"><a name="l00116"></a><span class="lineno">  116</span> </div>
-<div class="line"><a name="l00117"></a><span class="lineno">  117</span>         data=self.getParameterValue(self.<a class="code" href="classqgis_1_1pkgetmask_1_1pkgetmask.html#a579e059d072a57554c9a61180a9fd08c">DATA</a>)</div>
-<div class="line"><a name="l00118"></a><span class="lineno">  118</span> </div>
-<div class="line"><a name="l00119"></a><span class="lineno">  119</span>         extra = str(self.getParameterValue(self.<a class="code" href="classqgis_1_1pkgetmask_1_1pkgetmask.html#a7c46da38f871a5211efe90216afff4ef">EXTRA</a>))</div>
-<div class="line"><a name="l00120"></a><span class="lineno">  120</span>         <span class="keywordflow">if</span> len(extra) > 0:</div>
-<div class="line"><a name="l00121"></a><span class="lineno">  121</span>             commands.append(extra)</div>
-<div class="line"><a name="l00122"></a><span class="lineno">  122</span> </div>
-<div class="line"><a name="l00123"></a><span class="lineno">  123</span>         pktoolsUtils.runpktools(commands, progress)</div>
-<div class="ttc" id="classqgis_1_1pkgetmask_1_1pkgetmask_html_a418e9d844d597fb600d16afc0b7e70cd"><div class="ttname"><a href="classqgis_1_1pkgetmask_1_1pkgetmask.html#a418e9d844d597fb600d16afc0b7e70cd">qgis.pkgetmask.pkgetmask.OPERATOR_OPTIONS</a></div><div class="ttdeci">list OPERATOR_OPTIONS</div><div class="ttdef"><b>Definition:</b> <a href="pkgetmask_8py_source.html#l00044">pkgetmask.py:44</a></div></div>
-<div class="ttc" id="classqgis_1_1pkgetmask_1_1pkgetmask_html_a091f5ee5165bde746ed9841909d06d5c"><div class="ttname"><a href="classqgis_1_1pkgetmask_1_1pkgetmask.html#a091f5ee5165bde746ed9841909d06d5c">qgis.pkgetmask.pkgetmask.RTYPE</a></div><div class="ttdeci">string RTYPE</div><div class="ttdef"><b>Definition:</b> <a href="pkgetmask_8py_source.html#l00049">pkgetmask.py:49</a></div></div>
-<div class="ttc" id="classqgis_1_1pkgetmask_1_1pkgetmask_html_a7f1272eeb8cf07f429440cdf387c2d17"><div class="ttname"><a href="classqgis_1_1pkgetmask_1_1pkgetmask.html#a7f1272eeb8cf07f429440cdf387c2d17">qgis.pkgetmask.pkgetmask.TYPE</a></div><div class="ttdeci">list TYPE</div><div class="ttdef"><b>Definition:</b> <a href="pkgetmask_8py_source.html#l00050">pkgetmask.py:50</a></div></div>
-<div class="ttc" id="classqgis_1_1pkgetmask_1_1pkgetmask_html_ae9c628f2f53021c654f6cf1a597b3c54"><div class="ttname"><a href="classqgis_1_1pkgetmask_1_1pkgetmask.html#ae9c628f2f53021c654f6cf1a597b3c54">qgis.pkgetmask.pkgetmask.cliName</a></div><div class="ttdeci">def cliName</div><div class="ttdef"><b>Definition:</b> <a href="pkgetmask_8py_source.html#l00053">pkgetmask.py:53</a></div></div>
-<div class="ttc" id="classqgis_1_1pkgetmask_1_1pkgetmask_html_ad45ff2519baa645c8bf75e063fc2939d"><div class="ttname"><a href="classqgis_1_1pkgetmask_1_1pkgetmask.html#ad45ff2519baa645c8bf75e063fc2939d">qgis.pkgetmask.pkgetmask.BAND</a></div><div class="ttdeci">string BAND</div><div class="ttdef"><b>Definition:</b> <a href="pkgetmask_8py_source.html#l00041">pkgetmask.py:41</a></div></div>
-<div class="ttc" id="classqgis_1_1pkgetmask_1_1pkgetmask_html_ab9a736f64545f8ac36bbf1eae8576cd5"><div class="ttname"><a href="classqgis_1_1pkgetmask_1_1pkgetmask.html#ab9a736f64545f8ac36bbf1eae8576cd5">qgis.pkgetmask.pkgetmask.name</a></div><div class="ttdeci">name</div><div class="ttdef"><b>Definition:</b> <a href="pkgetmask_8py_source.html#l00057">pkgetmask.py:57</a></div></div>
-<div class="ttc" id="classqgis_1_1pkgetmask_1_1pkgetmask_html_a74d4d91d62405ae1cb788e0fc52b64c6"><div class="ttname"><a href="classqgis_1_1pkgetmask_1_1pkgetmask.html#a74d4d91d62405ae1cb788e0fc52b64c6">qgis.pkgetmask.pkgetmask.MAX</a></div><div class="ttdeci">string MAX</div><div class="ttdef"><b>Definition:</b> <a href="pkgetmask_8py_source.html#l00043">pkgetmask.py:43</a></div></div>
-<div class="ttc" id="classqgis_1_1pkgetmask_1_1pkgetmask_html_a5eedd82f4dda4923e8560ff43b657f73"><div class="ttname"><a href="classqgis_1_1pkgetmask_1_1pkgetmask.html#a5eedd82f4dda4923e8560ff43b657f73">qgis.pkgetmask.pkgetmask.OUTPUT</a></div><div class="ttdeci">string OUTPUT</div><div class="ttdef"><b>Definition:</b> <a href="pkgetmask_8py_source.html#l00048">pkgetmask.py:48</a></div></div>
-<div class="ttc" id="classqgis_1_1pkgetmask_1_1pkgetmask_html_a2a1d0302fefa56238c42d3ea6f747941"><div class="ttname"><a href="classqgis_1_1pkgetmask_1_1pkgetmask.html#a2a1d0302fefa56238c42d3ea6f747941">qgis.pkgetmask.pkgetmask.OPERATOR</a></div><div class="ttdeci">string OPERATOR</div><div class="ttdef"><b>Definition:</b> <a href="pkgetmask_8py_source.html#l00045">pkgetmask.py:45</a></div></div>
-<div class="ttc" id="classqgis_1_1pkgetmask_1_1pkgetmask_html_ab851d0b2d6acf47df89a9d89373f804b"><div class="ttname"><a href="classqgis_1_1pkgetmask_1_1pkgetmask.html#ab851d0b2d6acf47df89a9d89373f804b">qgis.pkgetmask.pkgetmask.NODATA</a></div><div class="ttdeci">string NODATA</div><div class="ttdef"><b>Definition:</b> <a href="pkgetmask_8py_source.html#l00047">pkgetmask.py:47</a></div></div>
-<div class="ttc" id="classqgis_1_1pkgetmask_1_1pkgetmask_html_aa0e0d197447b16bee323b2e9fdaa876b"><div class="ttname"><a href="classqgis_1_1pkgetmask_1_1pkgetmask.html#aa0e0d197447b16bee323b2e9fdaa876b">qgis.pkgetmask.pkgetmask.group</a></div><div class="ttdeci">group</div><div class="ttdef"><b>Definition:</b> <a href="pkgetmask_8py_source.html#l00058">pkgetmask.py:58</a></div></div>
-<div class="ttc" id="classqgis_1_1pkgetmask_1_1pkgetmask_html_a7c46da38f871a5211efe90216afff4ef"><div class="ttname"><a href="classqgis_1_1pkgetmask_1_1pkgetmask.html#a7c46da38f871a5211efe90216afff4ef">qgis.pkgetmask.pkgetmask.EXTRA</a></div><div class="ttdeci">string EXTRA</div><div class="ttdef"><b>Definition:</b> <a href="pkgetmask_8py_source.html#l00051">pkgetmask.py:51</a></div></div>
-<div class="ttc" id="classqgis_1_1pkgetmask_1_1pkgetmask_html"><div class="ttname"><a href="classqgis_1_1pkgetmask_1_1pkgetmask.html">qgis.pkgetmask.pkgetmask</a></div><div class="ttdef"><b>Definition:</b> <a href="pkgetmask_8py_source.html#l00038">pkgetmask.py:38</a></div></div>
-<div class="ttc" id="classqgis_1_1pkgetmask_1_1pkgetmask_html_a1990e1aab12f8a84394b7c44c9c78efd"><div class="ttname"><a href="classqgis_1_1pkgetmask_1_1pkgetmask.html#a1990e1aab12f8a84394b7c44c9c78efd">qgis.pkgetmask.pkgetmask.INPUT</a></div><div class="ttdeci">string INPUT</div><div class="ttdef"><b>Definition:</b> <a href="pkgetmask_8py_source.html#l00040">pkgetmask.py:40</a></div></div>
-<div class="ttc" id="classqgis_1_1pkgetmask_1_1pkgetmask_html_a579e059d072a57554c9a61180a9fd08c"><div class="ttname"><a href="classqgis_1_1pkgetmask_1_1pkgetmask.html#a579e059d072a57554c9a61180a9fd08c">qgis.pkgetmask.pkgetmask.DATA</a></div><div class="ttdeci">string DATA</div><div class="ttdef"><b>Definition:</b> <a href="pkgetmask_8py_source.html#l00046">pkgetmask.py:46</a></div></div>
-<div class="ttc" id="classqgis_1_1pkgetmask_1_1pkgetmask_html_a86f16ca18fe18083446f0a2fdab1c989"><div class="ttname"><a href="classqgis_1_1pkgetmask_1_1pkgetmask.html#a86f16ca18fe18083446f0a2fdab1c989">qgis.pkgetmask.pkgetmask.MIN</a></div><div class="ttdeci">string MIN</div><div class="ttdef"><b>Definition:</b> <a href="pkgetmask_8py_source.html#l00042">pkgetmask.py:42</a></div></div>
+<div class="line"><a name="l00097"></a><span class="lineno">   97</span>         commands.append(self.<a class="code" href="classqgis_1_1pktools_1_1pkgetmask_1_1pkgetmask.html#a8e2b218c2424a51cbc4a93fe83d07c04">OPERATOR_OPTIONS</a>[self.getParameterValue(self.<a class="code" href="classqgis_1_1pktools_1_1pkgetmask_1_1pkgetmask.html#af34e465611d97efa0f38d938c61391d6">OPERATOR</a>)])</div>
+<div class="line"><a name="l00098"></a><span class="lineno">   98</span>         data=self.getParameterValue(self.<a class="code" href="classqgis_1_1pktools_1_1pkgetmask_1_1pkgetmask.html#a70f3dbf7f080106837a8b17c006d81ac">DATA</a>)</div>
+<div class="line"><a name="l00099"></a><span class="lineno">   99</span>         <span class="keywordflow">if</span> data != <span class="stringliteral">"none"</span>:</div>
+<div class="line"><a name="l00100"></a><span class="lineno">  100</span>             dataValues = data.split(<span class="stringliteral">';'</span>)</div>
+<div class="line"><a name="l00101"></a><span class="lineno">  101</span>             <span class="keywordflow">for</span> dataValue <span class="keywordflow">in</span> dataValues:</div>
+<div class="line"><a name="l00102"></a><span class="lineno">  102</span>                 commands.append(<span class="stringliteral">'-data'</span>)</div>
+<div class="line"><a name="l00103"></a><span class="lineno">  103</span>                 commands.append(dataValue)</div>
+<div class="line"><a name="l00104"></a><span class="lineno">  104</span>         nodata=self.getParameterValue(self.<a class="code" href="classqgis_1_1pktools_1_1pkgetmask_1_1pkgetmask.html#af966197d692f8351d058f374fbc5179c">NODATA</a>)</div>
+<div class="line"><a name="l00105"></a><span class="lineno">  105</span>         <span class="keywordflow">if</span> nodata != <span class="stringliteral">"none"</span>:</div>
+<div class="line"><a name="l00106"></a><span class="lineno">  106</span>             nodataValues = nodata.split(<span class="stringliteral">';'</span>)</div>
+<div class="line"><a name="l00107"></a><span class="lineno">  107</span>             <span class="keywordflow">for</span> nodataValue <span class="keywordflow">in</span> nodataValues:</div>
+<div class="line"><a name="l00108"></a><span class="lineno">  108</span>                 commands.append(<span class="stringliteral">'-nodata'</span>)</div>
+<div class="line"><a name="l00109"></a><span class="lineno">  109</span>                 commands.append(nodataValue)</div>
+<div class="line"><a name="l00110"></a><span class="lineno">  110</span>         <span class="keywordflow">if</span> self.<a class="code" href="classqgis_1_1pktools_1_1pkgetmask_1_1pkgetmask.html#a5d4080e59895fdae293320e363dbfa03">TYPE</a>[self.getParameterValue(self.<a class="code" href="classqgis_1_1pktools_1_1pkgetmask_1_1pkgetmask.html#ac7313cff3a0c24fab4a0c93b49a46ed8">RTYPE</a>)] != <span class="stringliteral">"none"</span>:</div>
+<div class="line"><a name="l00111"></a><span class="lineno">  111</span>             commands.append(<span class="stringliteral">'-ot'</span>)</div>
+<div class="line"><a name="l00112"></a><span class="lineno">  112</span>             commands.append(self.<a class="code" href="classqgis_1_1pktools_1_1pkgetmask_1_1pkgetmask.html#a5d4080e59895fdae293320e363dbfa03">TYPE</a>[self.getParameterValue(self.<a class="code" href="classqgis_1_1pktools_1_1pkgetmask_1_1pkgetmask.html#ac7313cff3a0c24fab4a0c93b49a46ed8">RTYPE</a>)])</div>
+<div class="line"><a name="l00113"></a><span class="lineno">  113</span>         output=self.getOutputValue(self.<a class="code" href="classqgis_1_1pktools_1_1pkgetmask_1_1pkgetmask.html#a9923121c7323d34231111da4876b6ae1">OUTPUT</a>)</div>
+<div class="line"><a name="l00114"></a><span class="lineno">  114</span>         <span class="keywordflow">if</span> output != <span class="stringliteral">""</span>:</div>
+<div class="line"><a name="l00115"></a><span class="lineno">  115</span>             commands.append(<span class="stringliteral">"-o"</span>)</div>
+<div class="line"><a name="l00116"></a><span class="lineno">  116</span>             commands.append(<span class="stringliteral">'"'</span> + output + <span class="stringliteral">'"'</span>)</div>
+<div class="line"><a name="l00117"></a><span class="lineno">  117</span> </div>
+<div class="line"><a name="l00118"></a><span class="lineno">  118</span>         data=self.getParameterValue(self.<a class="code" href="classqgis_1_1pktools_1_1pkgetmask_1_1pkgetmask.html#a70f3dbf7f080106837a8b17c006d81ac">DATA</a>)</div>
+<div class="line"><a name="l00119"></a><span class="lineno">  119</span> </div>
+<div class="line"><a name="l00120"></a><span class="lineno">  120</span>         extra = str(self.getParameterValue(self.<a class="code" href="classqgis_1_1pktools_1_1pkgetmask_1_1pkgetmask.html#a67fb04dae201f7eeacd2c1c15ea8a68b">EXTRA</a>))</div>
+<div class="line"><a name="l00121"></a><span class="lineno">  121</span>         <span class="keywordflow">if</span> len(extra) > 0:</div>
+<div class="line"><a name="l00122"></a><span class="lineno">  122</span>             commands.append(extra)</div>
+<div class="line"><a name="l00123"></a><span class="lineno">  123</span> </div>
+<div class="line"><a name="l00124"></a><span class="lineno">  124</span>         pktoolsUtils.runpktools(commands, progress)</div>
+<div class="ttc" id="classqgis_1_1pktools_1_1pkgetmask_1_1pkgetmask_html_a8e2b218c2424a51cbc4a93fe83d07c04"><div class="ttname"><a href="classqgis_1_1pktools_1_1pkgetmask_1_1pkgetmask.html#a8e2b218c2424a51cbc4a93fe83d07c04">qgis.pktools.pkgetmask.pkgetmask.OPERATOR_OPTIONS</a></div><div class="ttdeci">list OPERATOR_OPTIONS</div><div class="ttdef"><b>Definition:</b> <a href="pktools_2pkgetmask_8py_source.html#l00044">pkgetmask.py:44</a></div></div>
+<div class="ttc" id="classqgis_1_1pktools_1_1pkgetmask_1_1pkgetmask_html"><div class="ttname"><a href="classqgis_1_1pktools_1_1pkgetmask_1_1pkgetmask.html">qgis.pktools.pkgetmask.pkgetmask</a></div><div class="ttdef"><b>Definition:</b> <a href="pktools_2pkgetmask_8py_source.html#l00038">pkgetmask.py:38</a></div></div>
+<div class="ttc" id="classqgis_1_1pktools_1_1pkgetmask_1_1pkgetmask_html_af8638a18a992135f0d2333599455da9d"><div class="ttname"><a href="classqgis_1_1pktools_1_1pkgetmask_1_1pkgetmask.html#af8638a18a992135f0d2333599455da9d">qgis.pktools.pkgetmask.pkgetmask.cliName</a></div><div class="ttdeci">def cliName</div><div class="ttdef"><b>Definition:</b> <a href="pktools_2pkgetmask_8py_source.html#l00053">pkgetmask.py:53</a></div></div>
+<div class="ttc" id="classqgis_1_1pktools_1_1pkgetmask_1_1pkgetmask_html_a9923121c7323d34231111da4876b6ae1"><div class="ttname"><a href="classqgis_1_1pktools_1_1pkgetmask_1_1pkgetmask.html#a9923121c7323d34231111da4876b6ae1">qgis.pktools.pkgetmask.pkgetmask.OUTPUT</a></div><div class="ttdeci">string OUTPUT</div><div class="ttdef"><b>Definition:</b> <a href="pktools_2pkgetmask_8py_source.html#l00048">pkgetmask.py:48</a></div></div>
+<div class="ttc" id="classqgis_1_1pktools_1_1pkgetmask_1_1pkgetmask_html_a5d4080e59895fdae293320e363dbfa03"><div class="ttname"><a href="classqgis_1_1pktools_1_1pkgetmask_1_1pkgetmask.html#a5d4080e59895fdae293320e363dbfa03">qgis.pktools.pkgetmask.pkgetmask.TYPE</a></div><div class="ttdeci">list TYPE</div><div class="ttdef"><b>Definition:</b> <a href="pktools_2pkgetmask_8py_source.html#l00050">pkgetmask.py:50</a></div></div>
+<div class="ttc" id="classqgis_1_1pktools_1_1pkgetmask_1_1pkgetmask_html_aaf2310f968ae6d6254816539b83b424b"><div class="ttname"><a href="classqgis_1_1pktools_1_1pkgetmask_1_1pkgetmask.html#aaf2310f968ae6d6254816539b83b424b">qgis.pktools.pkgetmask.pkgetmask.INPUT</a></div><div class="ttdeci">string INPUT</div><div class="ttdef"><b>Definition:</b> <a href="pktools_2pkgetmask_8py_source.html#l00040">pkgetmask.py:40</a></div></div>
+<div class="ttc" id="classqgis_1_1pktools_1_1pkgetmask_1_1pkgetmask_html_af966197d692f8351d058f374fbc5179c"><div class="ttname"><a href="classqgis_1_1pktools_1_1pkgetmask_1_1pkgetmask.html#af966197d692f8351d058f374fbc5179c">qgis.pktools.pkgetmask.pkgetmask.NODATA</a></div><div class="ttdeci">string NODATA</div><div class="ttdef"><b>Definition:</b> <a href="pktools_2pkgetmask_8py_source.html#l00047">pkgetmask.py:47</a></div></div>
+<div class="ttc" id="classqgis_1_1pktools_1_1pkgetmask_1_1pkgetmask_html_a4b3b39185a49678924fa180770112465"><div class="ttname"><a href="classqgis_1_1pktools_1_1pkgetmask_1_1pkgetmask.html#a4b3b39185a49678924fa180770112465">qgis.pktools.pkgetmask.pkgetmask.BAND</a></div><div class="ttdeci">string BAND</div><div class="ttdef"><b>Definition:</b> <a href="pktools_2pkgetmask_8py_source.html#l00041">pkgetmask.py:41</a></div></div>
+<div class="ttc" id="classqgis_1_1pktools_1_1pkgetmask_1_1pkgetmask_html_a70f3dbf7f080106837a8b17c006d81ac"><div class="ttname"><a href="classqgis_1_1pktools_1_1pkgetmask_1_1pkgetmask.html#a70f3dbf7f080106837a8b17c006d81ac">qgis.pktools.pkgetmask.pkgetmask.DATA</a></div><div class="ttdeci">string DATA</div><div class="ttdef"><b>Definition:</b> <a href="pktools_2pkgetmask_8py_source.html#l00046">pkgetmask.py:46</a></div></div>
+<div class="ttc" id="classqgis_1_1pktools_1_1pkgetmask_1_1pkgetmask_html_accd8fb321226d11fb68b2564297d3b13"><div class="ttname"><a href="classqgis_1_1pktools_1_1pkgetmask_1_1pkgetmask.html#accd8fb321226d11fb68b2564297d3b13">qgis.pktools.pkgetmask.pkgetmask.MIN</a></div><div class="ttdeci">string MIN</div><div class="ttdef"><b>Definition:</b> <a href="pktools_2pkgetmask_8py_source.html#l00042">pkgetmask.py:42</a></div></div>
+<div class="ttc" id="classqgis_1_1pktools_1_1pkgetmask_1_1pkgetmask_html_a67fb04dae201f7eeacd2c1c15ea8a68b"><div class="ttname"><a href="classqgis_1_1pktools_1_1pkgetmask_1_1pkgetmask.html#a67fb04dae201f7eeacd2c1c15ea8a68b">qgis.pktools.pkgetmask.pkgetmask.EXTRA</a></div><div class="ttdeci">string EXTRA</div><div class="ttdef"><b>Definition:</b> <a href="pktools_2pkgetmask_8py_source.html#l00051">pkgetmask.py:51</a></div></div>
+<div class="ttc" id="classqgis_1_1pktools_1_1pkgetmask_1_1pkgetmask_html_af34e465611d97efa0f38d938c61391d6"><div class="ttname"><a href="classqgis_1_1pktools_1_1pkgetmask_1_1pkgetmask.html#af34e465611d97efa0f38d938c61391d6">qgis.pktools.pkgetmask.pkgetmask.OPERATOR</a></div><div class="ttdeci">string OPERATOR</div><div class="ttdef"><b>Definition:</b> <a href="pktools_2pkgetmask_8py_source.html#l00045">pkgetmask.py:45</a></div></div>
+<div class="ttc" id="classqgis_1_1pktools_1_1pkgetmask_1_1pkgetmask_html_ac7313cff3a0c24fab4a0c93b49a46ed8"><div class="ttname"><a href="classqgis_1_1pktools_1_1pkgetmask_1_1pkgetmask.html#ac7313cff3a0c24fab4a0c93b49a46ed8">qgis.pktools.pkgetmask.pkgetmask.RTYPE</a></div><div class="ttdeci">string RTYPE</div><div class="ttdef"><b>Definition:</b> <a href="pktools_2pkgetmask_8py_source.html#l00049">pkgetmask.py:49</a></div></div>
+<div class="ttc" id="classqgis_1_1pktools_1_1pkgetmask_1_1pkgetmask_html_afe1f40dd307ff76950c2b7095fa51b2d"><div class="ttname"><a href="classqgis_1_1pktools_1_1pkgetmask_1_1pkgetmask.html#afe1f40dd307ff76950c2b7095fa51b2d">qgis.pktools.pkgetmask.pkgetmask.group</a></div><div class="ttdeci">group</div><div class="ttdef"><b>Definition:</b> <a href="pktools_2pkgetmask_8py_source.html#l00058">pkgetmask.py:58</a></div></div>
+<div class="ttc" id="classqgis_1_1pktools_1_1pkgetmask_1_1pkgetmask_html_a89fc80dd3cf449b57ee883116ea2b4a7"><div class="ttname"><a href="classqgis_1_1pktools_1_1pkgetmask_1_1pkgetmask.html#a89fc80dd3cf449b57ee883116ea2b4a7">qgis.pktools.pkgetmask.pkgetmask.MAX</a></div><div class="ttdeci">string MAX</div><div class="ttdef"><b>Definition:</b> <a href="pktools_2pkgetmask_8py_source.html#l00043">pkgetmask.py:43</a></div></div>
+<div class="ttc" id="classqgis_1_1pktools_1_1pkgetmask_1_1pkgetmask_html_ac4229d79e7fdbcc320c34b70b4996c61"><div class="ttname"><a href="classqgis_1_1pktools_1_1pkgetmask_1_1pkgetmask.html#ac4229d79e7fdbcc320c34b70b4996c61">qgis.pktools.pkgetmask.pkgetmask.name</a></div><div class="ttdeci">name</div><div class="ttdef"><b>Definition:</b> <a href="pktools_2pkgetmask_8py_source.html#l00057">pkgetmask.py:57</a></div></div>
 </div><!-- fragment --></div><!-- contents -->
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Jun 23 2015 17:09:36 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Tue Nov 3 2015 15:58:26 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/pklas2img_8py_source.html b/doc/html/pktools_2pklas2img_8py_source.html
similarity index 61%
copy from doc/html/pklas2img_8py_source.html
copy to doc/html/pktools_2pklas2img_8py_source.html
index 169e72f..3f9a5c2 100644
--- a/doc/html/pklas2img_8py_source.html
+++ b/doc/html/pktools_2pklas2img_8py_source.html
@@ -4,7 +4,7 @@
 <meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
 <meta http-equiv="X-UA-Compatible" content="IE=9"/>
 <meta name="generator" content="Doxygen 1.8.6"/>
-<title>pktools: /home/kempenep/pktools/qgis/pklas2img.py Source File</title>
+<title>pktools: /home/kempenep/pktools/qgis/pktools/pklas2img.py Source File</title>
 <link href="tabs.css" rel="stylesheet" type="text/css"/>
 <script type="text/javascript" src="jquery.js"></script>
 <script type="text/javascript" src="dynsections.js"></script>
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.3</span>
+    <span id="projectnumber">2.6.4</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -44,7 +44,7 @@
   </div>
 <div id="nav-path" class="navpath">
   <ul>
-<li class="navelem"><a class="el" href="dir_5785acc8d2e42f8795bdbe936856f26d.html">qgis</a></li>  </ul>
+<li class="navelem"><a class="el" href="dir_5785acc8d2e42f8795bdbe936856f26d.html">qgis</a></li><li class="navelem"><a class="el" href="dir_b7cc22b4453454f1e686d9a2e78d988d.html">pktools</a></li>  </ul>
 </div>
 </div><!-- top -->
 <div class="header">
@@ -90,7 +90,7 @@
 <div class="line"><a name="l00036"></a><span class="lineno">   36</span> <span class="keyword">from</span> processing.core.parameters <span class="keyword">import</span> ParameterBoolean</div>
 <div class="line"><a name="l00037"></a><span class="lineno">   37</span> <span class="keyword">from</span> processing.core.parameters <span class="keyword">import</span> ParameterExtent</div>
 <div class="line"><a name="l00038"></a><span class="lineno">   38</span> </div>
-<div class="line"><a name="l00039"></a><span class="lineno"><a class="line" href="classqgis_1_1pklas2img_1_1pklas2img.html">   39</a></span> <span class="keyword">class </span><a class="code" href="classqgis_1_1pklas2img_1_1pklas2img.html">pklas2img</a>(pktoolsAlgorithm):</div>
+<div class="line"><a name="l00039"></a><span class="lineno"><a class="line" href="classqgis_1_1pktools_1_1pklas2img_1_1pklas2img.html">   39</a></span> <span class="keyword">class </span><a class="code" href="classqgis_1_1pktools_1_1pklas2img_1_1pklas2img.html">pklas2img</a>(pktoolsAlgorithm):</div>
 <div class="line"><a name="l00040"></a><span class="lineno">   40</span> </div>
 <div class="line"><a name="l00041"></a><span class="lineno">   41</span>     INPUT = <span class="stringliteral">"INPUT"</span></div>
 <div class="line"><a name="l00042"></a><span class="lineno">   42</span>     OUTPUT = <span class="stringliteral">"OUTPUT"</span></div>
@@ -115,56 +115,56 @@
 <div class="line"><a name="l00061"></a><span class="lineno">   61</span>         <span class="keywordflow">return</span> <span class="stringliteral">"pklas2img"</span></div>
 <div class="line"><a name="l00062"></a><span class="lineno">   62</span> </div>
 <div class="line"><a name="l00063"></a><span class="lineno">   63</span>     <span class="keyword">def </span>defineCharacteristics(self):</div>
-<div class="line"><a name="l00064"></a><span class="lineno">   64</span>         self.<a class="code" href="classqgis_1_1pklas2img_1_1pklas2img.html#aa41f6aa59efd28521fd49a8f2740917d">name</a> = <span class="stringliteral">"(Linux only) Create raster dataset from LAS(Z) data point cloud(s)"</span></div>
-<div class="line"><a name="l00065"></a><span class="lineno">   65</span>         self.<a class="code" href="classqgis_1_1pklas2img_1_1pklas2img.html#a5504eac2d342bdae408e9ce3d51a6a6a">group</a> = <span class="stringliteral">"[pktools] LiDAR"</span></div>
+<div class="line"><a name="l00064"></a><span class="lineno">   64</span>         self.<a class="code" href="classqgis_1_1pktools_1_1pklas2img_1_1pklas2img.html#accc880de7d62d73a9a3c5b34d2c1205a">name</a> = <span class="stringliteral">"(Linux only) Create raster dataset from LAS(Z) data point cloud(s)"</span></div>
+<div class="line"><a name="l00065"></a><span class="lineno">   65</span>         self.<a class="code" href="classqgis_1_1pktools_1_1pklas2img_1_1pklas2img.html#ae424f891aaec9acfd3d85259f0b5ebca">group</a> = <span class="stringliteral">"[pktools] LiDAR"</span></div>
 <div class="line"><a name="l00066"></a><span class="lineno">   66</span> </div>
-<div class="line"><a name="l00067"></a><span class="lineno">   67</span>         self.addParameter(ParameterFile(self.<a class="code" href="classqgis_1_1pklas2img_1_1pklas2img.html#a7b57ce9958d387ac60e2564b468c9121">INPUT</a>, <span class="stringliteral">"Input LAS(Z) data set(s)"</span>, <span class="keyword">False</span>, <span class="keyword">False</span>))</div>
+<div class="line"><a name="l00067"></a><span class="lineno">   67</span>         self.addParameter(ParameterFile(self.<a class="code" href="classqgis_1_1pktools_1_1pklas2img_1_1pklas2img.html#ac7de684f0362601c5bf667db9b68763a">INPUT</a>, <span class="stringliteral">"Input LAS(Z) data set(s)"</span>, <span class="keyword">False</span>, <span class="keyword">False</span>))</div>
 <div class="line"><a name="l00068"></a><span class="lineno">   68</span> </div>
-<div class="line"><a name="l00069"></a><span class="lineno">   69</span>         self.addParameter(ParameterSelection(self.<a class="code" href="classqgis_1_1pklas2img_1_1pklas2img.html#a130c1acc3e9b615079634fd9685b8dec">ATTRIBUTE</a>,<span class="stringliteral">"name of the point attribute to select"</span>,self.<a class="code" href="classqgis_1_1pklas2img_1_1pklas2img.html#a0409e973a7b8cdf6057c607a998354a5">ATTRIBUTE_OPTIONS</a>, 0))</div>
-<div class="line"><a name="l00070"></a><span class="lineno">   70</span>         self.addParameter(ParameterSelection(self.<a class="code" href="classqgis_1_1pklas2img_1_1pklas2img.html#ae0c885711f536f96a5c63d535f1bb878">COMPOSITE</a>,<span class="stringliteral">"composite for multiple points in cell"</span>,self.<a class="code" href="classqgis_1_1pklas2img_1_1pklas2img.html#ad00b69bd446875f229cadeb69ac6a8f7">COMPOSITE_OPTIONS</a>, 0))</div>
-<div class="line"><a name="l00071"></a><span class="lineno">   71</span>         self.addParameter(ParameterSelection(self.<a class="code" href="classqgis_1_1pklas2img_1_1pklas2img.html#a63d7f043f1912491e2e34857ac4b498a">FILTER</a>,<span class="stringliteral">"filter las points"</span>,self.<a class="code" href="classqgis_1_1pklas2img_1_1pklas2img.html#ac7ef9219de8e84423760309190deb56e">FILTER_OPTIONS</a>, 0))</div>
-<div class="line"><a name="l00072"></a><span class="lineno">   72</span>         self.addOutput(OutputRaster(self.<a class="code" href="classqgis_1_1pklas2img_1_1pklas2img.html#a6b94eb994fa787dc2a90c4df618b7192">OUTPUT</a>, <span class="stringliteral">"Output raster data set"</span>))</div>
-<div class="line"><a name="l00073"></a><span class="lineno">   73</span>         self.addParameter(ParameterSelection(self.<a class="code" href="classqgis_1_1pklas2img_1_1pklas2img.html#a60a126c8d52d3911d75f9e67231e3730">RTYPE</a>, <span class="stringliteral">'Output raster type'</span>, self.<a class="code" href="classqgis_1_1pklas2img_1_1pklas2img.html#ab2c9b209aebe166c5202551470dcf7f0">TYPE</a>, 0))</div>
-<div class="line"><a name="l00074"></a><span class="lineno">   74</span>         self.addParameter(ParameterNumber(self.<a class="code" href="classqgis_1_1pklas2img_1_1pklas2img.html#a320a11359d403b61b67cdf113770723e">PERCENTILE</a>, <span class="stringliteral">"Percentile value used for rule percentile"</span>,0.0,100.0,95))</div>
-<div class="line"><a name="l00075"></a><span class="lineno">   75</span>         self.addParameter(ParameterNumber(self.<a class="code" href="classqgis_1_1pklas2img_1_1pklas2img.html#a6aa0d7c47f3a6c8b9eb4375049e69824">DX</a>, <span class="stringliteral">"Output resolution in x"</span>,0.0,<span class="keywordtype">None</span>,1.0))</div>
-<div class="line"><a name="l00076"></a><span class="lineno">   76</span>         self.addParameter(ParameterNumber(self.<a class="code" href="classqgis_1_1pklas2img_1_1pklas2img.html#a165ee10778d2f0bdbe5abfae21f36d8f">DY</a>, <span class="stringliteral">"Output resolution in y"</span>,0.0,<span class="keywordtype">None</span>,1.0))</div>
+<div class="line"><a name="l00069"></a><span class="lineno">   69</span>         self.addParameter(ParameterSelection(self.<a class="code" href="classqgis_1_1pktools_1_1pklas2img_1_1pklas2img.html#adfbb8aab172e26f0382162c1a81fa863">ATTRIBUTE</a>,<span class="stringliteral">"name of the point attribute to select"</span>,self.<a class="code" href="classqgis_1_1pktools_1_1pklas2img_1_1pklas2img.html#afe4c444f4c7f89fd2851e4517c66e82d">ATTRIBUTE_OPTIONS</a>, 0))</div>
+<div class="line"><a name="l00070"></a><span class="lineno">   70</span>         self.addParameter(ParameterSelection(self.<a class="code" href="classqgis_1_1pktools_1_1pklas2img_1_1pklas2img.html#a8e27277f96bb3c59dc7fa3e39050ac85">COMPOSITE</a>,<span class="stringliteral">"composite for multiple points in cell"</span>,self.<a class="code" href="classqgis_1_1pktools_1_1pklas2img_1_1pklas2img.html#a95fe33a74c29ec44b4601b384358e024">COMPOSITE_OPTIONS</a>, 0))</div>
+<div class="line"><a name="l00071"></a><span class="lineno">   71</span>         self.addParameter(ParameterSelection(self.<a class="code" href="classqgis_1_1pktools_1_1pklas2img_1_1pklas2img.html#acf62ddc2366d8d598fbee8185a363c9d">FILTER</a>,<span class="stringliteral">"filter las points"</span>,self.<a class="code" href="classqgis_1_1pktools_1_1pklas2img_1_1pklas2img.html#a18f6b8223a9c56b4fd5676f5c8062d13">FILTER_OPTIONS</a>, 0))</div>
+<div class="line"><a name="l00072"></a><span class="lineno">   72</span>         self.addOutput(OutputRaster(self.<a class="code" href="classqgis_1_1pktools_1_1pklas2img_1_1pklas2img.html#aa923079e3e31c6f9045fc26402066b28">OUTPUT</a>, <span class="stringliteral">"Output raster data set"</span>))</div>
+<div class="line"><a name="l00073"></a><span class="lineno">   73</span>         self.addParameter(ParameterSelection(self.<a class="code" href="classqgis_1_1pktools_1_1pklas2img_1_1pklas2img.html#a450ccb8c2deb11dff9a0debe2ab3873a">RTYPE</a>, <span class="stringliteral">'Output raster type'</span>, self.<a class="code" href="classqgis_1_1pktools_1_1pklas2img_1_1pklas2img.html#ae724a48a4f739d510c3d4aadfa069b83">TYPE</a>, 0))</div>
+<div class="line"><a name="l00074"></a><span class="lineno">   74</span>         self.addParameter(ParameterNumber(self.<a class="code" href="classqgis_1_1pktools_1_1pklas2img_1_1pklas2img.html#ac0a6e98dcb6d3726d1e861e1485cf3d9">PERCENTILE</a>, <span class="stringliteral">"Percentile value used for rule percentile"</span>,0.0,100.0,95))</div>
+<div class="line"><a name="l00075"></a><span class="lineno">   75</span>         self.addParameter(ParameterNumber(self.<a class="code" href="classqgis_1_1pktools_1_1pklas2img_1_1pklas2img.html#a4b50520fa826ccb6a6bc24e414ec5391">DX</a>, <span class="stringliteral">"Output resolution in x"</span>,0.0,<span class="keywordtype">None</span>,1.0))</div>
+<div class="line"><a name="l00076"></a><span class="lineno">   76</span>         self.addParameter(ParameterNumber(self.<a class="code" href="classqgis_1_1pktools_1_1pklas2img_1_1pklas2img.html#ab450e8c2f27160d69f5f376a6e39dfa1">DY</a>, <span class="stringliteral">"Output resolution in y"</span>,0.0,<span class="keywordtype">None</span>,1.0))</div>
 <div class="line"><a name="l00077"></a><span class="lineno">   77</span>         <span class="comment"># self.addParameter(ParameterExtent(self.PROJWIN,</span></div>
 <div class="line"><a name="l00078"></a><span class="lineno">   78</span>         <span class="comment">#                   'Georeferenced boundingbox'))</span></div>
-<div class="line"><a name="l00079"></a><span class="lineno">   79</span>         self.addParameter(ParameterNumber(self.<a class="code" href="classqgis_1_1pklas2img_1_1pklas2img.html#a9cbf569ff7b068dade13fb6dc0ede553">NODATA</a>, <span class="stringliteral">"nodata value to put in image"</span>,0,<span class="keywordtype">None</span>,0))</div>
-<div class="line"><a name="l00080"></a><span class="lineno">   80</span>         self.addParameter(ParameterString(self.<a class="code" href="classqgis_1_1pklas2img_1_1pklas2img.html#a8cf9933f7aca1f1ace4957cbde0f958e">EXTRA</a>,</div>
+<div class="line"><a name="l00079"></a><span class="lineno">   79</span>         self.addParameter(ParameterNumber(self.<a class="code" href="classqgis_1_1pktools_1_1pklas2img_1_1pklas2img.html#a2072186e8c3a370ceb38067d56b33868">NODATA</a>, <span class="stringliteral">"nodata value to put in image"</span>,0,<span class="keywordtype">None</span>,0))</div>
+<div class="line"><a name="l00080"></a><span class="lineno">   80</span>         self.addParameter(ParameterString(self.<a class="code" href="classqgis_1_1pktools_1_1pklas2img_1_1pklas2img.html#a534a211c9476179786a5b4fd526aa76b">EXTRA</a>,</div>
 <div class="line"><a name="l00081"></a><span class="lineno">   81</span>                           <span class="stringliteral">'Additional parameters'</span>, <span class="stringliteral">'-of GTiff'</span>, optional=<span class="keyword">True</span>))</div>
 <div class="line"><a name="l00082"></a><span class="lineno">   82</span> </div>
 <div class="line"><a name="l00083"></a><span class="lineno">   83</span>     <span class="keyword">def </span>processAlgorithm(self, progress):</div>
-<div class="line"><a name="l00084"></a><span class="lineno">   84</span>         cliPath = <span class="stringliteral">'"'</span> + os.path.join(pktoolsUtils.pktoolsPath(), self.<a class="code" href="classqgis_1_1pklas2img_1_1pklas2img.html#a32b88cd9bfc7602df94418d953cc44a7">cliName</a>()) + <span class="stringliteral">'"'</span></div>
+<div class="line"><a name="l00084"></a><span class="lineno">   84</span>         cliPath = <span class="stringliteral">'"'</span> + os.path.join(pktoolsUtils.pktoolsPath(), self.<a class="code" href="classqgis_1_1pktools_1_1pklas2img_1_1pklas2img.html#a341f95eb3efccf5c63b40c2aaf5b84d9">cliName</a>()) + <span class="stringliteral">'"'</span></div>
 <div class="line"><a name="l00085"></a><span class="lineno">   85</span>         commands = [cliPath]</div>
 <div class="line"><a name="l00086"></a><span class="lineno">   86</span> </div>
-<div class="line"><a name="l00087"></a><span class="lineno">   87</span>         input=self.getParameterValue(self.<a class="code" href="classqgis_1_1pklas2img_1_1pklas2img.html#a7b57ce9958d387ac60e2564b468c9121">INPUT</a>)</div>
+<div class="line"><a name="l00087"></a><span class="lineno">   87</span>         input=self.getParameterValue(self.<a class="code" href="classqgis_1_1pktools_1_1pklas2img_1_1pklas2img.html#ac7de684f0362601c5bf667db9b68763a">INPUT</a>)</div>
 <div class="line"><a name="l00088"></a><span class="lineno">   88</span>         inputFiles = input.split(<span class="stringliteral">';'</span>)</div>
 <div class="line"><a name="l00089"></a><span class="lineno">   89</span>         <span class="keywordflow">for</span> inputFile <span class="keywordflow">in</span> inputFiles:</div>
 <div class="line"><a name="l00090"></a><span class="lineno">   90</span>             commands.append(<span class="stringliteral">'-i'</span>)</div>
 <div class="line"><a name="l00091"></a><span class="lineno">   91</span>             commands.append(<span class="stringliteral">'"'</span> + inputFile + <span class="stringliteral">'"'</span>)</div>
 <div class="line"><a name="l00092"></a><span class="lineno">   92</span> </div>
-<div class="line"><a name="l00093"></a><span class="lineno">   93</span>         <span class="keywordflow">if</span> self.<a class="code" href="classqgis_1_1pklas2img_1_1pklas2img.html#ab2c9b209aebe166c5202551470dcf7f0">TYPE</a>[self.getParameterValue(self.<a class="code" href="classqgis_1_1pklas2img_1_1pklas2img.html#a60a126c8d52d3911d75f9e67231e3730">RTYPE</a>)] != <span class="stringliteral">"none"</span>:</div>
+<div class="line"><a name="l00093"></a><span class="lineno">   93</span>         <span class="keywordflow">if</span> self.<a class="code" href="classqgis_1_1pktools_1_1pklas2img_1_1pklas2img.html#ae724a48a4f739d510c3d4aadfa069b83">TYPE</a>[self.getParameterValue(self.<a class="code" href="classqgis_1_1pktools_1_1pklas2img_1_1pklas2img.html#a450ccb8c2deb11dff9a0debe2ab3873a">RTYPE</a>)] != <span class="stringliteral">"none"</span>:</div>
 <div class="line"><a name="l00094"></a><span class="lineno">   94</span>             commands.append(<span class="stringliteral">'-ot'</span>)</div>
-<div class="line"><a name="l00095"></a><span class="lineno">   95</span>             commands.append(self.<a class="code" href="classqgis_1_1pklas2img_1_1pklas2img.html#ab2c9b209aebe166c5202551470dcf7f0">TYPE</a>[self.getParameterValue(self.<a class="code" href="classqgis_1_1pklas2img_1_1pklas2img.html#a60a126c8d52d3911d75f9e67231e3730">RTYPE</a>)])</div>
+<div class="line"><a name="l00095"></a><span class="lineno">   95</span>             commands.append(self.<a class="code" href="classqgis_1_1pktools_1_1pklas2img_1_1pklas2img.html#ae724a48a4f739d510c3d4aadfa069b83">TYPE</a>[self.getParameterValue(self.<a class="code" href="classqgis_1_1pktools_1_1pklas2img_1_1pklas2img.html#a450ccb8c2deb11dff9a0debe2ab3873a">RTYPE</a>)])</div>
 <div class="line"><a name="l00096"></a><span class="lineno">   96</span> </div>
-<div class="line"><a name="l00097"></a><span class="lineno">   97</span>         output=self.getOutputValue(self.<a class="code" href="classqgis_1_1pklas2img_1_1pklas2img.html#a6b94eb994fa787dc2a90c4df618b7192">OUTPUT</a>)</div>
+<div class="line"><a name="l00097"></a><span class="lineno">   97</span>         output=self.getOutputValue(self.<a class="code" href="classqgis_1_1pktools_1_1pklas2img_1_1pklas2img.html#aa923079e3e31c6f9045fc26402066b28">OUTPUT</a>)</div>
 <div class="line"><a name="l00098"></a><span class="lineno">   98</span>         <span class="keywordflow">if</span> output != <span class="stringliteral">""</span>:</div>
 <div class="line"><a name="l00099"></a><span class="lineno">   99</span>             commands.append(<span class="stringliteral">"-o"</span>)</div>
 <div class="line"><a name="l00100"></a><span class="lineno">  100</span>             commands.append(<span class="stringliteral">'"'</span> + output + <span class="stringliteral">'"'</span>)</div>
 <div class="line"><a name="l00101"></a><span class="lineno">  101</span> </div>
 <div class="line"><a name="l00102"></a><span class="lineno">  102</span>         commands.append(<span class="stringliteral">"-n"</span>)</div>
-<div class="line"><a name="l00103"></a><span class="lineno">  103</span>         commands.append(self.<a class="code" href="classqgis_1_1pklas2img_1_1pklas2img.html#a0409e973a7b8cdf6057c607a998354a5">ATTRIBUTE_OPTIONS</a>[self.getParameterValue(self.<a class="code" href="classqgis_1_1pklas2img_1_1pklas2img.html#a130c1acc3e9b615079634fd9685b8dec">ATTRIBUTE</a>)])</div>
+<div class="line"><a name="l00103"></a><span class="lineno">  103</span>         commands.append(self.<a class="code" href="classqgis_1_1pktools_1_1pklas2img_1_1pklas2img.html#afe4c444f4c7f89fd2851e4517c66e82d">ATTRIBUTE_OPTIONS</a>[self.getParameterValue(self.<a class="code" href="classqgis_1_1pktools_1_1pklas2img_1_1pklas2img.html#adfbb8aab172e26f0382162c1a81fa863">ATTRIBUTE</a>)])</div>
 <div class="line"><a name="l00104"></a><span class="lineno">  104</span>         commands.append(<span class="stringliteral">"-comp"</span>)</div>
-<div class="line"><a name="l00105"></a><span class="lineno">  105</span>         commands.append(self.<a class="code" href="classqgis_1_1pklas2img_1_1pklas2img.html#ad00b69bd446875f229cadeb69ac6a8f7">COMPOSITE_OPTIONS</a>[self.getParameterValue(self.<a class="code" href="classqgis_1_1pklas2img_1_1pklas2img.html#ae0c885711f536f96a5c63d535f1bb878">COMPOSITE</a>)])</div>
+<div class="line"><a name="l00105"></a><span class="lineno">  105</span>         commands.append(self.<a class="code" href="classqgis_1_1pktools_1_1pklas2img_1_1pklas2img.html#a95fe33a74c29ec44b4601b384358e024">COMPOSITE_OPTIONS</a>[self.getParameterValue(self.<a class="code" href="classqgis_1_1pktools_1_1pklas2img_1_1pklas2img.html#a8e27277f96bb3c59dc7fa3e39050ac85">COMPOSITE</a>)])</div>
 <div class="line"><a name="l00106"></a><span class="lineno">  106</span>         commands.append(<span class="stringliteral">"-fir"</span>)</div>
-<div class="line"><a name="l00107"></a><span class="lineno">  107</span>         commands.append(self.<a class="code" href="classqgis_1_1pklas2img_1_1pklas2img.html#ac7ef9219de8e84423760309190deb56e">FILTER_OPTIONS</a>[self.getParameterValue(self.<a class="code" href="classqgis_1_1pklas2img_1_1pklas2img.html#a63d7f043f1912491e2e34857ac4b498a">FILTER</a>)])</div>
-<div class="line"><a name="l00108"></a><span class="lineno">  108</span>         <span class="keywordflow">if</span> self.getParameterValue(self.<a class="code" href="classqgis_1_1pklas2img_1_1pklas2img.html#a6aa0d7c47f3a6c8b9eb4375049e69824">DX</a>) != 0:</div>
+<div class="line"><a name="l00107"></a><span class="lineno">  107</span>         commands.append(self.<a class="code" href="classqgis_1_1pktools_1_1pklas2img_1_1pklas2img.html#a18f6b8223a9c56b4fd5676f5c8062d13">FILTER_OPTIONS</a>[self.getParameterValue(self.<a class="code" href="classqgis_1_1pktools_1_1pklas2img_1_1pklas2img.html#acf62ddc2366d8d598fbee8185a363c9d">FILTER</a>)])</div>
+<div class="line"><a name="l00108"></a><span class="lineno">  108</span>         <span class="keywordflow">if</span> self.getParameterValue(self.<a class="code" href="classqgis_1_1pktools_1_1pklas2img_1_1pklas2img.html#a4b50520fa826ccb6a6bc24e414ec5391">DX</a>) != 0:</div>
 <div class="line"><a name="l00109"></a><span class="lineno">  109</span>             commands.append(<span class="stringliteral">"-dx"</span>)</div>
-<div class="line"><a name="l00110"></a><span class="lineno">  110</span>             commands.append(str(self.getParameterValue(self.<a class="code" href="classqgis_1_1pklas2img_1_1pklas2img.html#a6aa0d7c47f3a6c8b9eb4375049e69824">DX</a>)))</div>
-<div class="line"><a name="l00111"></a><span class="lineno">  111</span>         <span class="keywordflow">if</span> self.getParameterValue(self.<a class="code" href="classqgis_1_1pklas2img_1_1pklas2img.html#a165ee10778d2f0bdbe5abfae21f36d8f">DY</a>) != 0:</div>
+<div class="line"><a name="l00110"></a><span class="lineno">  110</span>             commands.append(str(self.getParameterValue(self.<a class="code" href="classqgis_1_1pktools_1_1pklas2img_1_1pklas2img.html#a4b50520fa826ccb6a6bc24e414ec5391">DX</a>)))</div>
+<div class="line"><a name="l00111"></a><span class="lineno">  111</span>         <span class="keywordflow">if</span> self.getParameterValue(self.<a class="code" href="classqgis_1_1pktools_1_1pklas2img_1_1pklas2img.html#ab450e8c2f27160d69f5f376a6e39dfa1">DY</a>) != 0:</div>
 <div class="line"><a name="l00112"></a><span class="lineno">  112</span>             commands.append(<span class="stringliteral">"-dy"</span>)</div>
-<div class="line"><a name="l00113"></a><span class="lineno">  113</span>             commands.append(str(self.getParameterValue(self.<a class="code" href="classqgis_1_1pklas2img_1_1pklas2img.html#a165ee10778d2f0bdbe5abfae21f36d8f">DY</a>)))</div>
+<div class="line"><a name="l00113"></a><span class="lineno">  113</span>             commands.append(str(self.getParameterValue(self.<a class="code" href="classqgis_1_1pktools_1_1pklas2img_1_1pklas2img.html#ab450e8c2f27160d69f5f376a6e39dfa1">DY</a>)))</div>
 <div class="line"><a name="l00114"></a><span class="lineno">  114</span>         <span class="comment">#projwin = str(self.getParameterValue(self.PROJWIN))</span></div>
 <div class="line"><a name="l00115"></a><span class="lineno">  115</span>         <span class="comment"># regionCoords = projwin.split(',')</span></div>
 <div class="line"><a name="l00116"></a><span class="lineno">  116</span>         <span class="comment"># commands.append('-ulx')</span></div>
@@ -176,37 +176,37 @@
 <div class="line"><a name="l00122"></a><span class="lineno">  122</span>         <span class="comment"># commands.append('-lry')</span></div>
 <div class="line"><a name="l00123"></a><span class="lineno">  123</span>         <span class="comment"># commands.append(regionCoords[2])</span></div>
 <div class="line"><a name="l00124"></a><span class="lineno">  124</span>         commands.append(<span class="stringliteral">'-nodata'</span>)</div>
-<div class="line"><a name="l00125"></a><span class="lineno">  125</span>         commands.append(str(self.getParameterValue(self.<a class="code" href="classqgis_1_1pklas2img_1_1pklas2img.html#a9cbf569ff7b068dade13fb6dc0ede553">NODATA</a>)))</div>
+<div class="line"><a name="l00125"></a><span class="lineno">  125</span>         commands.append(str(self.getParameterValue(self.<a class="code" href="classqgis_1_1pktools_1_1pklas2img_1_1pklas2img.html#a2072186e8c3a370ceb38067d56b33868">NODATA</a>)))</div>
 <div class="line"><a name="l00126"></a><span class="lineno">  126</span> </div>
-<div class="line"><a name="l00127"></a><span class="lineno">  127</span>         extra = str(self.getParameterValue(self.<a class="code" href="classqgis_1_1pklas2img_1_1pklas2img.html#a8cf9933f7aca1f1ace4957cbde0f958e">EXTRA</a>))</div>
+<div class="line"><a name="l00127"></a><span class="lineno">  127</span>         extra = str(self.getParameterValue(self.<a class="code" href="classqgis_1_1pktools_1_1pklas2img_1_1pklas2img.html#a534a211c9476179786a5b4fd526aa76b">EXTRA</a>))</div>
 <div class="line"><a name="l00128"></a><span class="lineno">  128</span>         <span class="keywordflow">if</span> len(extra) > 0:</div>
 <div class="line"><a name="l00129"></a><span class="lineno">  129</span>             commands.append(extra)</div>
 <div class="line"><a name="l00130"></a><span class="lineno">  130</span> </div>
 <div class="line"><a name="l00131"></a><span class="lineno">  131</span>         pktoolsUtils.runpktools(commands, progress)</div>
-<div class="ttc" id="classqgis_1_1pklas2img_1_1pklas2img_html_a6aa0d7c47f3a6c8b9eb4375049e69824"><div class="ttname"><a href="classqgis_1_1pklas2img_1_1pklas2img.html#a6aa0d7c47f3a6c8b9eb4375049e69824">qgis.pklas2img.pklas2img.DX</a></div><div class="ttdeci">string DX</div><div class="ttdef"><b>Definition:</b> <a href="pklas2img_8py_source.html#l00052">pklas2img.py:52</a></div></div>
-<div class="ttc" id="classqgis_1_1pklas2img_1_1pklas2img_html_a63d7f043f1912491e2e34857ac4b498a"><div class="ttname"><a href="classqgis_1_1pklas2img_1_1pklas2img.html#a63d7f043f1912491e2e34857ac4b498a">qgis.pklas2img.pklas2img.FILTER</a></div><div class="ttdeci">string FILTER</div><div class="ttdef"><b>Definition:</b> <a href="pklas2img_8py_source.html#l00049">pklas2img.py:49</a></div></div>
-<div class="ttc" id="classqgis_1_1pklas2img_1_1pklas2img_html_a60a126c8d52d3911d75f9e67231e3730"><div class="ttname"><a href="classqgis_1_1pklas2img_1_1pklas2img.html#a60a126c8d52d3911d75f9e67231e3730">qgis.pklas2img.pklas2img.RTYPE</a></div><div class="ttdeci">string RTYPE</div><div class="ttdef"><b>Definition:</b> <a href="pklas2img_8py_source.html#l00056">pklas2img.py:56</a></div></div>
-<div class="ttc" id="classqgis_1_1pklas2img_1_1pklas2img_html_a7b57ce9958d387ac60e2564b468c9121"><div class="ttname"><a href="classqgis_1_1pklas2img_1_1pklas2img.html#a7b57ce9958d387ac60e2564b468c9121">qgis.pklas2img.pklas2img.INPUT</a></div><div class="ttdeci">string INPUT</div><div class="ttdef"><b>Definition:</b> <a href="pklas2img_8py_source.html#l00041">pklas2img.py:41</a></div></div>
-<div class="ttc" id="classqgis_1_1pklas2img_1_1pklas2img_html_ad00b69bd446875f229cadeb69ac6a8f7"><div class="ttname"><a href="classqgis_1_1pklas2img_1_1pklas2img.html#ad00b69bd446875f229cadeb69ac6a8f7">qgis.pklas2img.pklas2img.COMPOSITE_OPTIONS</a></div><div class="ttdeci">list COMPOSITE_OPTIONS</div><div class="ttdef"><b>Definition:</b> <a href="pklas2img_8py_source.html#l00044">pklas2img.py:44</a></div></div>
-<div class="ttc" id="classqgis_1_1pklas2img_1_1pklas2img_html"><div class="ttname"><a href="classqgis_1_1pklas2img_1_1pklas2img.html">qgis.pklas2img.pklas2img</a></div><div class="ttdef"><b>Definition:</b> <a href="pklas2img_8py_source.html#l00039">pklas2img.py:39</a></div></div>
-<div class="ttc" id="classqgis_1_1pklas2img_1_1pklas2img_html_a320a11359d403b61b67cdf113770723e"><div class="ttname"><a href="classqgis_1_1pklas2img_1_1pklas2img.html#a320a11359d403b61b67cdf113770723e">qgis.pklas2img.pklas2img.PERCENTILE</a></div><div class="ttdeci">string PERCENTILE</div><div class="ttdef"><b>Definition:</b> <a href="pklas2img_8py_source.html#l00051">pklas2img.py:51</a></div></div>
-<div class="ttc" id="classqgis_1_1pklas2img_1_1pklas2img_html_a5504eac2d342bdae408e9ce3d51a6a6a"><div class="ttname"><a href="classqgis_1_1pklas2img_1_1pklas2img.html#a5504eac2d342bdae408e9ce3d51a6a6a">qgis.pklas2img.pklas2img.group</a></div><div class="ttdeci">group</div><div class="ttdef"><b>Definition:</b> <a href="pklas2img_8py_source.html#l00065">pklas2img.py:65</a></div></div>
-<div class="ttc" id="classqgis_1_1pklas2img_1_1pklas2img_html_aa41f6aa59efd28521fd49a8f2740917d"><div class="ttname"><a href="classqgis_1_1pklas2img_1_1pklas2img.html#aa41f6aa59efd28521fd49a8f2740917d">qgis.pklas2img.pklas2img.name</a></div><div class="ttdeci">name</div><div class="ttdef"><b>Definition:</b> <a href="pklas2img_8py_source.html#l00064">pklas2img.py:64</a></div></div>
-<div class="ttc" id="classqgis_1_1pklas2img_1_1pklas2img_html_a32b88cd9bfc7602df94418d953cc44a7"><div class="ttname"><a href="classqgis_1_1pklas2img_1_1pklas2img.html#a32b88cd9bfc7602df94418d953cc44a7">qgis.pklas2img.pklas2img.cliName</a></div><div class="ttdeci">def cliName</div><div class="ttdef"><b>Definition:</b> <a href="pklas2img_8py_source.html#l00060">pklas2img.py:60</a></div></div>
-<div class="ttc" id="classqgis_1_1pklas2img_1_1pklas2img_html_a165ee10778d2f0bdbe5abfae21f36d8f"><div class="ttname"><a href="classqgis_1_1pklas2img_1_1pklas2img.html#a165ee10778d2f0bdbe5abfae21f36d8f">qgis.pklas2img.pklas2img.DY</a></div><div class="ttdeci">string DY</div><div class="ttdef"><b>Definition:</b> <a href="pklas2img_8py_source.html#l00053">pklas2img.py:53</a></div></div>
-<div class="ttc" id="classqgis_1_1pklas2img_1_1pklas2img_html_a130c1acc3e9b615079634fd9685b8dec"><div class="ttname"><a href="classqgis_1_1pklas2img_1_1pklas2img.html#a130c1acc3e9b615079634fd9685b8dec">qgis.pklas2img.pklas2img.ATTRIBUTE</a></div><div class="ttdeci">string ATTRIBUTE</div><div class="ttdef"><b>Definition:</b> <a href="pklas2img_8py_source.html#l00047">pklas2img.py:47</a></div></div>
-<div class="ttc" id="classqgis_1_1pklas2img_1_1pklas2img_html_a8cf9933f7aca1f1ace4957cbde0f958e"><div class="ttname"><a href="classqgis_1_1pklas2img_1_1pklas2img.html#a8cf9933f7aca1f1ace4957cbde0f958e">qgis.pklas2img.pklas2img.EXTRA</a></div><div class="ttdeci">string EXTRA</div><div class="ttdef"><b>Definition:</b> <a href="pklas2img_8py_source.html#l00058">pklas2img.py:58</a></div></div>
-<div class="ttc" id="classqgis_1_1pklas2img_1_1pklas2img_html_a0409e973a7b8cdf6057c607a998354a5"><div class="ttname"><a href="classqgis_1_1pklas2img_1_1pklas2img.html#a0409e973a7b8cdf6057c607a998354a5">qgis.pklas2img.pklas2img.ATTRIBUTE_OPTIONS</a></div><div class="ttdeci">list ATTRIBUTE_OPTIONS</div><div class="ttdef"><b>Definition:</b> <a href="pklas2img_8py_source.html#l00043">pklas2img.py:43</a></div></div>
-<div class="ttc" id="classqgis_1_1pklas2img_1_1pklas2img_html_ae0c885711f536f96a5c63d535f1bb878"><div class="ttname"><a href="classqgis_1_1pklas2img_1_1pklas2img.html#ae0c885711f536f96a5c63d535f1bb878">qgis.pklas2img.pklas2img.COMPOSITE</a></div><div class="ttdeci">string COMPOSITE</div><div class="ttdef"><b>Definition:</b> <a href="pklas2img_8py_source.html#l00048">pklas2img.py:48</a></div></div>
-<div class="ttc" id="classqgis_1_1pklas2img_1_1pklas2img_html_ab2c9b209aebe166c5202551470dcf7f0"><div class="ttname"><a href="classqgis_1_1pklas2img_1_1pklas2img.html#ab2c9b209aebe166c5202551470dcf7f0">qgis.pklas2img.pklas2img.TYPE</a></div><div class="ttdeci">list TYPE</div><div class="ttdef"><b>Definition:</b> <a href="pklas2img_8py_source.html#l00057">pklas2img.py:57</a></div></div>
-<div class="ttc" id="classqgis_1_1pklas2img_1_1pklas2img_html_a6b94eb994fa787dc2a90c4df618b7192"><div class="ttname"><a href="classqgis_1_1pklas2img_1_1pklas2img.html#a6b94eb994fa787dc2a90c4df618b7192">qgis.pklas2img.pklas2img.OUTPUT</a></div><div class="ttdeci">string OUTPUT</div><div class="ttdef"><b>Definition:</b> <a href="pklas2img_8py_source.html#l00042">pklas2img.py:42</a></div></div>
-<div class="ttc" id="classqgis_1_1pklas2img_1_1pklas2img_html_ac7ef9219de8e84423760309190deb56e"><div class="ttname"><a href="classqgis_1_1pklas2img_1_1pklas2img.html#ac7ef9219de8e84423760309190deb56e">qgis.pklas2img.pklas2img.FILTER_OPTIONS</a></div><div class="ttdeci">list FILTER_OPTIONS</div><div class="ttdef"><b>Definition:</b> <a href="pklas2img_8py_source.html#l00045">pklas2img.py:45</a></div></div>
-<div class="ttc" id="classqgis_1_1pklas2img_1_1pklas2img_html_a9cbf569ff7b068dade13fb6dc0ede553"><div class="ttname"><a href="classqgis_1_1pklas2img_1_1pklas2img.html#a9cbf569ff7b068dade13fb6dc0ede553">qgis.pklas2img.pklas2img.NODATA</a></div><div class="ttdeci">string NODATA</div><div class="ttdef"><b>Definition:</b> <a href="pklas2img_8py_source.html#l00055">pklas2img.py:55</a></div></div>
+<div class="ttc" id="classqgis_1_1pktools_1_1pklas2img_1_1pklas2img_html_a8e27277f96bb3c59dc7fa3e39050ac85"><div class="ttname"><a href="classqgis_1_1pktools_1_1pklas2img_1_1pklas2img.html#a8e27277f96bb3c59dc7fa3e39050ac85">qgis.pktools.pklas2img.pklas2img.COMPOSITE</a></div><div class="ttdeci">string COMPOSITE</div><div class="ttdef"><b>Definition:</b> <a href="pktools_2pklas2img_8py_source.html#l00048">pklas2img.py:48</a></div></div>
+<div class="ttc" id="classqgis_1_1pktools_1_1pklas2img_1_1pklas2img_html_aa923079e3e31c6f9045fc26402066b28"><div class="ttname"><a href="classqgis_1_1pktools_1_1pklas2img_1_1pklas2img.html#aa923079e3e31c6f9045fc26402066b28">qgis.pktools.pklas2img.pklas2img.OUTPUT</a></div><div class="ttdeci">string OUTPUT</div><div class="ttdef"><b>Definition:</b> <a href="pktools_2pklas2img_8py_source.html#l00042">pklas2img.py:42</a></div></div>
+<div class="ttc" id="classqgis_1_1pktools_1_1pklas2img_1_1pklas2img_html_a450ccb8c2deb11dff9a0debe2ab3873a"><div class="ttname"><a href="classqgis_1_1pktools_1_1pklas2img_1_1pklas2img.html#a450ccb8c2deb11dff9a0debe2ab3873a">qgis.pktools.pklas2img.pklas2img.RTYPE</a></div><div class="ttdeci">string RTYPE</div><div class="ttdef"><b>Definition:</b> <a href="pktools_2pklas2img_8py_source.html#l00056">pklas2img.py:56</a></div></div>
+<div class="ttc" id="classqgis_1_1pktools_1_1pklas2img_1_1pklas2img_html_ac0a6e98dcb6d3726d1e861e1485cf3d9"><div class="ttname"><a href="classqgis_1_1pktools_1_1pklas2img_1_1pklas2img.html#ac0a6e98dcb6d3726d1e861e1485cf3d9">qgis.pktools.pklas2img.pklas2img.PERCENTILE</a></div><div class="ttdeci">string PERCENTILE</div><div class="ttdef"><b>Definition:</b> <a href="pktools_2pklas2img_8py_source.html#l00051">pklas2img.py:51</a></div></div>
+<div class="ttc" id="classqgis_1_1pktools_1_1pklas2img_1_1pklas2img_html_a341f95eb3efccf5c63b40c2aaf5b84d9"><div class="ttname"><a href="classqgis_1_1pktools_1_1pklas2img_1_1pklas2img.html#a341f95eb3efccf5c63b40c2aaf5b84d9">qgis.pktools.pklas2img.pklas2img.cliName</a></div><div class="ttdeci">def cliName</div><div class="ttdef"><b>Definition:</b> <a href="pktools_2pklas2img_8py_source.html#l00060">pklas2img.py:60</a></div></div>
+<div class="ttc" id="classqgis_1_1pktools_1_1pklas2img_1_1pklas2img_html_accc880de7d62d73a9a3c5b34d2c1205a"><div class="ttname"><a href="classqgis_1_1pktools_1_1pklas2img_1_1pklas2img.html#accc880de7d62d73a9a3c5b34d2c1205a">qgis.pktools.pklas2img.pklas2img.name</a></div><div class="ttdeci">name</div><div class="ttdef"><b>Definition:</b> <a href="pktools_2pklas2img_8py_source.html#l00064">pklas2img.py:64</a></div></div>
+<div class="ttc" id="classqgis_1_1pktools_1_1pklas2img_1_1pklas2img_html"><div class="ttname"><a href="classqgis_1_1pktools_1_1pklas2img_1_1pklas2img.html">qgis.pktools.pklas2img.pklas2img</a></div><div class="ttdef"><b>Definition:</b> <a href="pktools_2pklas2img_8py_source.html#l00039">pklas2img.py:39</a></div></div>
+<div class="ttc" id="classqgis_1_1pktools_1_1pklas2img_1_1pklas2img_html_a534a211c9476179786a5b4fd526aa76b"><div class="ttname"><a href="classqgis_1_1pktools_1_1pklas2img_1_1pklas2img.html#a534a211c9476179786a5b4fd526aa76b">qgis.pktools.pklas2img.pklas2img.EXTRA</a></div><div class="ttdeci">string EXTRA</div><div class="ttdef"><b>Definition:</b> <a href="pktools_2pklas2img_8py_source.html#l00058">pklas2img.py:58</a></div></div>
+<div class="ttc" id="classqgis_1_1pktools_1_1pklas2img_1_1pklas2img_html_a2072186e8c3a370ceb38067d56b33868"><div class="ttname"><a href="classqgis_1_1pktools_1_1pklas2img_1_1pklas2img.html#a2072186e8c3a370ceb38067d56b33868">qgis.pktools.pklas2img.pklas2img.NODATA</a></div><div class="ttdeci">string NODATA</div><div class="ttdef"><b>Definition:</b> <a href="pktools_2pklas2img_8py_source.html#l00055">pklas2img.py:55</a></div></div>
+<div class="ttc" id="classqgis_1_1pktools_1_1pklas2img_1_1pklas2img_html_ae424f891aaec9acfd3d85259f0b5ebca"><div class="ttname"><a href="classqgis_1_1pktools_1_1pklas2img_1_1pklas2img.html#ae424f891aaec9acfd3d85259f0b5ebca">qgis.pktools.pklas2img.pklas2img.group</a></div><div class="ttdeci">group</div><div class="ttdef"><b>Definition:</b> <a href="pktools_2pklas2img_8py_source.html#l00065">pklas2img.py:65</a></div></div>
+<div class="ttc" id="classqgis_1_1pktools_1_1pklas2img_1_1pklas2img_html_ae724a48a4f739d510c3d4aadfa069b83"><div class="ttname"><a href="classqgis_1_1pktools_1_1pklas2img_1_1pklas2img.html#ae724a48a4f739d510c3d4aadfa069b83">qgis.pktools.pklas2img.pklas2img.TYPE</a></div><div class="ttdeci">list TYPE</div><div class="ttdef"><b>Definition:</b> <a href="pktools_2pklas2img_8py_source.html#l00057">pklas2img.py:57</a></div></div>
+<div class="ttc" id="classqgis_1_1pktools_1_1pklas2img_1_1pklas2img_html_a18f6b8223a9c56b4fd5676f5c8062d13"><div class="ttname"><a href="classqgis_1_1pktools_1_1pklas2img_1_1pklas2img.html#a18f6b8223a9c56b4fd5676f5c8062d13">qgis.pktools.pklas2img.pklas2img.FILTER_OPTIONS</a></div><div class="ttdeci">list FILTER_OPTIONS</div><div class="ttdef"><b>Definition:</b> <a href="pktools_2pklas2img_8py_source.html#l00045">pklas2img.py:45</a></div></div>
+<div class="ttc" id="classqgis_1_1pktools_1_1pklas2img_1_1pklas2img_html_afe4c444f4c7f89fd2851e4517c66e82d"><div class="ttname"><a href="classqgis_1_1pktools_1_1pklas2img_1_1pklas2img.html#afe4c444f4c7f89fd2851e4517c66e82d">qgis.pktools.pklas2img.pklas2img.ATTRIBUTE_OPTIONS</a></div><div class="ttdeci">list ATTRIBUTE_OPTIONS</div><div class="ttdef"><b>Definition:</b> <a href="pktools_2pklas2img_8py_source.html#l00043">pklas2img.py:43</a></div></div>
+<div class="ttc" id="classqgis_1_1pktools_1_1pklas2img_1_1pklas2img_html_adfbb8aab172e26f0382162c1a81fa863"><div class="ttname"><a href="classqgis_1_1pktools_1_1pklas2img_1_1pklas2img.html#adfbb8aab172e26f0382162c1a81fa863">qgis.pktools.pklas2img.pklas2img.ATTRIBUTE</a></div><div class="ttdeci">string ATTRIBUTE</div><div class="ttdef"><b>Definition:</b> <a href="pktools_2pklas2img_8py_source.html#l00047">pklas2img.py:47</a></div></div>
+<div class="ttc" id="classqgis_1_1pktools_1_1pklas2img_1_1pklas2img_html_a4b50520fa826ccb6a6bc24e414ec5391"><div class="ttname"><a href="classqgis_1_1pktools_1_1pklas2img_1_1pklas2img.html#a4b50520fa826ccb6a6bc24e414ec5391">qgis.pktools.pklas2img.pklas2img.DX</a></div><div class="ttdeci">string DX</div><div class="ttdef"><b>Definition:</b> <a href="pktools_2pklas2img_8py_source.html#l00052">pklas2img.py:52</a></div></div>
+<div class="ttc" id="classqgis_1_1pktools_1_1pklas2img_1_1pklas2img_html_a95fe33a74c29ec44b4601b384358e024"><div class="ttname"><a href="classqgis_1_1pktools_1_1pklas2img_1_1pklas2img.html#a95fe33a74c29ec44b4601b384358e024">qgis.pktools.pklas2img.pklas2img.COMPOSITE_OPTIONS</a></div><div class="ttdeci">list COMPOSITE_OPTIONS</div><div class="ttdef"><b>Definition:</b> <a href="pktools_2pklas2img_8py_source.html#l00044">pklas2img.py:44</a></div></div>
+<div class="ttc" id="classqgis_1_1pktools_1_1pklas2img_1_1pklas2img_html_acf62ddc2366d8d598fbee8185a363c9d"><div class="ttname"><a href="classqgis_1_1pktools_1_1pklas2img_1_1pklas2img.html#acf62ddc2366d8d598fbee8185a363c9d">qgis.pktools.pklas2img.pklas2img.FILTER</a></div><div class="ttdeci">string FILTER</div><div class="ttdef"><b>Definition:</b> <a href="pktools_2pklas2img_8py_source.html#l00049">pklas2img.py:49</a></div></div>
+<div class="ttc" id="classqgis_1_1pktools_1_1pklas2img_1_1pklas2img_html_ac7de684f0362601c5bf667db9b68763a"><div class="ttname"><a href="classqgis_1_1pktools_1_1pklas2img_1_1pklas2img.html#ac7de684f0362601c5bf667db9b68763a">qgis.pktools.pklas2img.pklas2img.INPUT</a></div><div class="ttdeci">string INPUT</div><div class="ttdef"><b>Definition:</b> <a href="pktools_2pklas2img_8py_source.html#l00041">pklas2img.py:41</a></div></div>
+<div class="ttc" id="classqgis_1_1pktools_1_1pklas2img_1_1pklas2img_html_ab450e8c2f27160d69f5f376a6e39dfa1"><div class="ttname"><a href="classqgis_1_1pktools_1_1pklas2img_1_1pklas2img.html#ab450e8c2f27160d69f5f376a6e39dfa1">qgis.pktools.pklas2img.pklas2img.DY</a></div><div class="ttdeci">string DY</div><div class="ttdef"><b>Definition:</b> <a href="pktools_2pklas2img_8py_source.html#l00053">pklas2img.py:53</a></div></div>
 </div><!-- fragment --></div><!-- contents -->
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Jun 23 2015 17:09:36 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Tue Nov 3 2015 15:58:26 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/pkreclass_8py_source.html b/doc/html/pktools_2pkreclass_8py_source.html
similarity index 64%
copy from doc/html/pkreclass_8py_source.html
copy to doc/html/pktools_2pkreclass_8py_source.html
index 5b7a7f7..ca93488 100644
--- a/doc/html/pkreclass_8py_source.html
+++ b/doc/html/pktools_2pkreclass_8py_source.html
@@ -4,7 +4,7 @@
 <meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
 <meta http-equiv="X-UA-Compatible" content="IE=9"/>
 <meta name="generator" content="Doxygen 1.8.6"/>
-<title>pktools: /home/kempenep/pktools/qgis/pkreclass.py Source File</title>
+<title>pktools: /home/kempenep/pktools/qgis/pktools/pkreclass.py Source File</title>
 <link href="tabs.css" rel="stylesheet" type="text/css"/>
 <script type="text/javascript" src="jquery.js"></script>
 <script type="text/javascript" src="dynsections.js"></script>
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.3</span>
+    <span id="projectnumber">2.6.4</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -44,7 +44,7 @@
   </div>
 <div id="nav-path" class="navpath">
   <ul>
-<li class="navelem"><a class="el" href="dir_5785acc8d2e42f8795bdbe936856f26d.html">qgis</a></li>  </ul>
+<li class="navelem"><a class="el" href="dir_5785acc8d2e42f8795bdbe936856f26d.html">qgis</a></li><li class="navelem"><a class="el" href="dir_b7cc22b4453454f1e686d9a2e78d988d.html">pktools</a></li>  </ul>
 </div>
 </div><!-- top -->
 <div class="header">
@@ -89,7 +89,7 @@
 <div class="line"><a name="l00035"></a><span class="lineno">   35</span> <span class="keyword">from</span> processing.core.parameters <span class="keyword">import</span> ParameterBoolean</div>
 <div class="line"><a name="l00036"></a><span class="lineno">   36</span> <span class="keyword">from</span> processing.core.parameters <span class="keyword">import</span> ParameterExtent</div>
 <div class="line"><a name="l00037"></a><span class="lineno">   37</span> </div>
-<div class="line"><a name="l00038"></a><span class="lineno"><a class="line" href="classqgis_1_1pkreclass_1_1pkreclass.html">   38</a></span> <span class="keyword">class </span><a class="code" href="classqgis_1_1pkreclass_1_1pkreclass.html">pkreclass</a>(pktoolsAlgorithm):</div>
+<div class="line"><a name="l00038"></a><span class="lineno"><a class="line" href="classqgis_1_1pktools_1_1pkreclass_1_1pkreclass.html">   38</a></span> <span class="keyword">class </span><a class="code" href="classqgis_1_1pktools_1_1pkreclass_1_1pkreclass.html">pkreclass</a>(pktoolsAlgorithm):</div>
 <div class="line"><a name="l00039"></a><span class="lineno">   39</span> </div>
 <div class="line"><a name="l00040"></a><span class="lineno">   40</span>     INPUT = <span class="stringliteral">"INPUT"</span></div>
 <div class="line"><a name="l00041"></a><span class="lineno">   41</span>     OUTPUT = <span class="stringliteral">"OUTPUT"</span></div>
@@ -107,95 +107,95 @@
 <div class="line"><a name="l00053"></a><span class="lineno">   53</span>         <span class="keywordflow">return</span> <span class="stringliteral">"pkreclass"</span></div>
 <div class="line"><a name="l00054"></a><span class="lineno">   54</span> </div>
 <div class="line"><a name="l00055"></a><span class="lineno">   55</span>     <span class="keyword">def </span>defineCharacteristics(self):</div>
-<div class="line"><a name="l00056"></a><span class="lineno">   56</span>         self.<a class="code" href="classqgis_1_1pkreclass_1_1pkreclass.html#a2d3e9d7948ff61e49ecaa646ace3b51c">name</a> = <span class="stringliteral">"reclass raster datasets"</span></div>
-<div class="line"><a name="l00057"></a><span class="lineno">   57</span>         self.<a class="code" href="classqgis_1_1pkreclass_1_1pkreclass.html#a5474989e8a32b4f84da61b1030d928d4">group</a> = <span class="stringliteral">"[pktools] raster"</span></div>
-<div class="line"><a name="l00058"></a><span class="lineno">   58</span>         self.addParameter(ParameterMultipleInput(self.<a class="code" href="classqgis_1_1pkreclass_1_1pkreclass.html#aac30b4b09ec8af2b365ffc60dd969fa4">INPUT</a>, <span class="stringliteral">'Input layer raster data set'</span>,ParameterMultipleInput.TYPE_RASTER))</div>
-<div class="line"><a name="l00059"></a><span class="lineno">   59</span>         self.addOutput(OutputRaster(self.<a class="code" href="classqgis_1_1pkreclass_1_1pkreclass.html#ac06924e2f6d01acffb97d97f5ed30550">OUTPUT</a>, <span class="stringliteral">"Output raster data set"</span>))</div>
-<div class="line"><a name="l00060"></a><span class="lineno">   60</span>         self.addParameter(ParameterString(self.<a class="code" href="classqgis_1_1pkreclass_1_1pkreclass.html#a670784309f5dde13aa8d7c8956b85501">BAND</a>, <span class="stringliteral">"Band index(es) to replace, e.g., 0;1;2 (other bands are copied to output)"</span>, <span class="stringliteral">'0'</span>))</div>
-<div class="line"><a name="l00061"></a><span class="lineno">   61</span>         self.addParameter(ParameterRaster(self.<a class="code" href="classqgis_1_1pkreclass_1_1pkreclass.html#a8d00f95e83e048f830d3541e0006412a">MASK</a>, <span class="stringliteral">"Mask raster dataset"</span>,optional=<span class="keyword">True</span>))</div>
-<div class="line"><a name="l00062"></a><span class="lineno">   62</span>         self.addParameter(ParameterString(self.<a class="code" href="classqgis_1_1pkreclass_1_1pkreclass.html#ad9cb8a5b163ad79ff18263dac1c27ea9">MSKNODATA</a>, <span class="stringliteral">"Mask value(s) not to consider for classification (e.g., 0;255)"</span>,<span class="stringliteral">"0"</span>))</div>
-<div class="line"><a name="l00063"></a><span class="lineno">   63</span>         self.addParameter(ParameterString(self.<a class="code" href="classqgis_1_1pkreclass_1_1pkreclass.html#a6eee06a836cf0cda3bb7d4e471dd0ff8">CLASS</a>, <span class="stringliteral">"list of classes to reclass, in combination with reclass option, e.g., 0;1;2;3"</span>,<span class="stringliteral">""</span>))</div>
-<div class="line"><a name="l00064"></a><span class="lineno">   64</span>         self.addParameter(ParameterString(self.<a class="code" href="classqgis_1_1pkreclass_1_1pkreclass.html#ab677fcc1481ee0f4804a64ba5a9ccf41">RECLASS</a>, <span class="stringliteral">"list of recoded classes, in combination with class option e.g., 10;11;12;13"</span>,<span class="stringliteral">""</span>))</div>
-<div class="line"><a name="l00065"></a><span class="lineno">   65</span>         self.addParameter(ParameterNumber(self.<a class="code" href="classqgis_1_1pkreclass_1_1pkreclass.html#a377d3003bdce66a2ef2083bcd439950f">NODATA</a>, <span class="stringliteral">"nodata value to put in image if not valid"</span>,0,<span class="keywordtype">None</span>,0))</div>
+<div class="line"><a name="l00056"></a><span class="lineno">   56</span>         self.<a class="code" href="classqgis_1_1pktools_1_1pkreclass_1_1pkreclass.html#a556f1db8b0402c9c9c4f7cca81b1c264">name</a> = <span class="stringliteral">"reclass raster datasets"</span></div>
+<div class="line"><a name="l00057"></a><span class="lineno">   57</span>         self.<a class="code" href="classqgis_1_1pktools_1_1pkreclass_1_1pkreclass.html#a2fff886959f64cb10c12a26c056a1e88">group</a> = <span class="stringliteral">"[pktools] raster"</span></div>
+<div class="line"><a name="l00058"></a><span class="lineno">   58</span>         self.addParameter(ParameterMultipleInput(self.<a class="code" href="classqgis_1_1pktools_1_1pkreclass_1_1pkreclass.html#a303601836409f7a7a101ac4af8d8f3a6">INPUT</a>, <span class="stringliteral">'Input layer raster data set'</span>,ParameterMultipleInput.TYPE_RASTER))</div>
+<div class="line"><a name="l00059"></a><span class="lineno">   59</span>         self.addOutput(OutputRaster(self.<a class="code" href="classqgis_1_1pktools_1_1pkreclass_1_1pkreclass.html#a065a117498a6be8d13ee27b0bcc04647">OUTPUT</a>, <span class="stringliteral">"Output raster data set"</span>))</div>
+<div class="line"><a name="l00060"></a><span class="lineno">   60</span>         self.addParameter(ParameterString(self.<a class="code" href="classqgis_1_1pktools_1_1pkreclass_1_1pkreclass.html#a310bec7495dd575a3ac641d81f914ae3">BAND</a>, <span class="stringliteral">"Band index(es) to replace, e.g., 0;1;2 (other bands are copied to output)"</span>, <span class="stringliteral">'0'</span>))</div>
+<div class="line"><a name="l00061"></a><span class="lineno">   61</span>         self.addParameter(ParameterRaster(self.<a class="code" href="classqgis_1_1pktools_1_1pkreclass_1_1pkreclass.html#a801a99540cfdf947b4837778ed0a1f37">MASK</a>, <span class="stringliteral">"Mask raster dataset"</span>,optional=<span class="keyword">True</span>))</div>
+<div class="line"><a name="l00062"></a><span class="lineno">   62</span>         self.addParameter(ParameterString(self.<a class="code" href="classqgis_1_1pktools_1_1pkreclass_1_1pkreclass.html#ad273e7dbdd1610b40f42d3c50295bd3a">MSKNODATA</a>, <span class="stringliteral">"Mask value(s) not to consider for classification (e.g., 0;255)"</span>,<span class="stringliteral">"0"</span>))</div>
+<div class="line"><a name="l00063"></a><span class="lineno">   63</span>         self.addParameter(ParameterString(self.<a class="code" href="classqgis_1_1pktools_1_1pkreclass_1_1pkreclass.html#a47265725eeabaab2bb47e02c34ce8f66">CLASS</a>, <span class="stringliteral">"list of classes to reclass, in combination with reclass option, e.g., 0;1;2;3"</span>,<span class="stringliteral">""</span>))</div>
+<div class="line"><a name="l00064"></a><span class="lineno">   64</span>         self.addParameter(ParameterString(self.<a class="code" href="classqgis_1_1pktools_1_1pkreclass_1_1pkreclass.html#a77d68ecc97bddef7f58cfdb7426139d8">RECLASS</a>, <span class="stringliteral">"list of recoded classes, in combination with class option e.g., 10;11;12;13"</span>,<span class="stringliteral">""</span>))</div>
+<div class="line"><a name="l00065"></a><span class="lineno">   65</span>         self.addParameter(ParameterNumber(self.<a class="code" href="classqgis_1_1pktools_1_1pkreclass_1_1pkreclass.html#ae133eccf7059c47635068612f8d788db">NODATA</a>, <span class="stringliteral">"nodata value to put in image if not valid"</span>,0,<span class="keywordtype">None</span>,0))</div>
 <div class="line"><a name="l00066"></a><span class="lineno">   66</span> </div>
-<div class="line"><a name="l00067"></a><span class="lineno">   67</span>         self.addParameter(ParameterSelection(self.<a class="code" href="classqgis_1_1pkreclass_1_1pkreclass.html#a7b77eea90f50504357742100c95ac454">RTYPE</a>, <span class="stringliteral">'Output raster type (leave as none to keep original type)'</span>, self.<a class="code" href="classqgis_1_1pkreclass_1_1pkreclass.html#af8727418e991db1564e423d9ebeb2c89">TYPE</a>, 0))</div>
-<div class="line"><a name="l00068"></a><span class="lineno">   68</span>         self.addParameter(ParameterString(self.<a class="code" href="classqgis_1_1pkreclass_1_1pkreclass.html#a10e1786759936dd074581841f73c2505">EXTRA</a>,</div>
+<div class="line"><a name="l00067"></a><span class="lineno">   67</span>         self.addParameter(ParameterSelection(self.<a class="code" href="classqgis_1_1pktools_1_1pkreclass_1_1pkreclass.html#ad32491e68ff156791fe09f6435925b64">RTYPE</a>, <span class="stringliteral">'Output raster type (leave as none to keep original type)'</span>, self.<a class="code" href="classqgis_1_1pktools_1_1pkreclass_1_1pkreclass.html#ae0f930fadcfbe749ee6565d75bb090f3">TYPE</a>, 0))</div>
+<div class="line"><a name="l00068"></a><span class="lineno">   68</span>         self.addParameter(ParameterString(self.<a class="code" href="classqgis_1_1pktools_1_1pkreclass_1_1pkreclass.html#a2da5ea965129a52c1559f80b8815b65d">EXTRA</a>,</div>
 <div class="line"><a name="l00069"></a><span class="lineno">   69</span>                           <span class="stringliteral">'Additional parameters'</span>, <span class="stringliteral">'-of GTiff'</span>, optional=<span class="keyword">True</span>))</div>
 <div class="line"><a name="l00070"></a><span class="lineno">   70</span> </div>
 <div class="line"><a name="l00071"></a><span class="lineno">   71</span>     <span class="keyword">def </span>processAlgorithm(self, progress):</div>
-<div class="line"><a name="l00072"></a><span class="lineno">   72</span>         cliPath = <span class="stringliteral">'"'</span> + os.path.join(pktoolsUtils.pktoolsPath(), self.<a class="code" href="classqgis_1_1pkreclass_1_1pkreclass.html#a1e3b6410096d899e755b4c3b8ceb2b63">cliName</a>()) + <span class="stringliteral">'"'</span></div>
+<div class="line"><a name="l00072"></a><span class="lineno">   72</span>         cliPath = <span class="stringliteral">'"'</span> + os.path.join(pktoolsUtils.pktoolsPath(), self.<a class="code" href="classqgis_1_1pktools_1_1pkreclass_1_1pkreclass.html#a984813cdec014931ab57b85348708d12">cliName</a>()) + <span class="stringliteral">'"'</span></div>
 <div class="line"><a name="l00073"></a><span class="lineno">   73</span>         commands = [cliPath]</div>
 <div class="line"><a name="l00074"></a><span class="lineno">   74</span> </div>
-<div class="line"><a name="l00075"></a><span class="lineno">   75</span>         input=self.getParameterValue(self.<a class="code" href="classqgis_1_1pkreclass_1_1pkreclass.html#aac30b4b09ec8af2b365ffc60dd969fa4">INPUT</a>)</div>
+<div class="line"><a name="l00075"></a><span class="lineno">   75</span>         input=self.getParameterValue(self.<a class="code" href="classqgis_1_1pktools_1_1pkreclass_1_1pkreclass.html#a303601836409f7a7a101ac4af8d8f3a6">INPUT</a>)</div>
 <div class="line"><a name="l00076"></a><span class="lineno">   76</span>         commands.append(<span class="stringliteral">'-i'</span>)</div>
 <div class="line"><a name="l00077"></a><span class="lineno">   77</span>         commands.append(<span class="stringliteral">'"'</span> + input + <span class="stringliteral">'"'</span>)</div>
 <div class="line"><a name="l00078"></a><span class="lineno">   78</span> </div>
-<div class="line"><a name="l00079"></a><span class="lineno">   79</span>         <span class="keywordflow">if</span> self.<a class="code" href="classqgis_1_1pkreclass_1_1pkreclass.html#af8727418e991db1564e423d9ebeb2c89">TYPE</a>[self.getParameterValue(self.<a class="code" href="classqgis_1_1pkreclass_1_1pkreclass.html#a7b77eea90f50504357742100c95ac454">RTYPE</a>)] != <span class="stringliteral">"none"</span>:</div>
+<div class="line"><a name="l00079"></a><span class="lineno">   79</span>         <span class="keywordflow">if</span> self.<a class="code" href="classqgis_1_1pktools_1_1pkreclass_1_1pkreclass.html#ae0f930fadcfbe749ee6565d75bb090f3">TYPE</a>[self.getParameterValue(self.<a class="code" href="classqgis_1_1pktools_1_1pkreclass_1_1pkreclass.html#ad32491e68ff156791fe09f6435925b64">RTYPE</a>)] != <span class="stringliteral">"none"</span>:</div>
 <div class="line"><a name="l00080"></a><span class="lineno">   80</span>             commands.append(<span class="stringliteral">'-ot'</span>)</div>
-<div class="line"><a name="l00081"></a><span class="lineno">   81</span>             commands.append(self.<a class="code" href="classqgis_1_1pkreclass_1_1pkreclass.html#af8727418e991db1564e423d9ebeb2c89">TYPE</a>[self.getParameterValue(self.<a class="code" href="classqgis_1_1pkreclass_1_1pkreclass.html#a7b77eea90f50504357742100c95ac454">RTYPE</a>)])</div>
+<div class="line"><a name="l00081"></a><span class="lineno">   81</span>             commands.append(self.<a class="code" href="classqgis_1_1pktools_1_1pkreclass_1_1pkreclass.html#ae0f930fadcfbe749ee6565d75bb090f3">TYPE</a>[self.getParameterValue(self.<a class="code" href="classqgis_1_1pktools_1_1pkreclass_1_1pkreclass.html#ad32491e68ff156791fe09f6435925b64">RTYPE</a>)])</div>
 <div class="line"><a name="l00082"></a><span class="lineno">   82</span> </div>
-<div class="line"><a name="l00083"></a><span class="lineno">   83</span>         output=self.getOutputValue(self.<a class="code" href="classqgis_1_1pkreclass_1_1pkreclass.html#ac06924e2f6d01acffb97d97f5ed30550">OUTPUT</a>)</div>
+<div class="line"><a name="l00083"></a><span class="lineno">   83</span>         output=self.getOutputValue(self.<a class="code" href="classqgis_1_1pktools_1_1pkreclass_1_1pkreclass.html#a065a117498a6be8d13ee27b0bcc04647">OUTPUT</a>)</div>
 <div class="line"><a name="l00084"></a><span class="lineno">   84</span>         commands.append(<span class="stringliteral">"-o"</span>)</div>
 <div class="line"><a name="l00085"></a><span class="lineno">   85</span>         commands.append(<span class="stringliteral">'"'</span> + output + <span class="stringliteral">'"'</span>)</div>
 <div class="line"><a name="l00086"></a><span class="lineno">   86</span> </div>
 <div class="line"><a name="l00087"></a><span class="lineno">   87</span>         commands.append(<span class="stringliteral">'-nodata'</span>)</div>
-<div class="line"><a name="l00088"></a><span class="lineno">   88</span>         commands.append(str(self.getParameterValue(self.<a class="code" href="classqgis_1_1pkreclass_1_1pkreclass.html#a377d3003bdce66a2ef2083bcd439950f">NODATA</a>)))</div>
+<div class="line"><a name="l00088"></a><span class="lineno">   88</span>         commands.append(str(self.getParameterValue(self.<a class="code" href="classqgis_1_1pktools_1_1pkreclass_1_1pkreclass.html#ae133eccf7059c47635068612f8d788db">NODATA</a>)))</div>
 <div class="line"><a name="l00089"></a><span class="lineno">   89</span>         </div>
-<div class="line"><a name="l00090"></a><span class="lineno">   90</span>         band=str(self.getParameterValue(self.<a class="code" href="classqgis_1_1pkreclass_1_1pkreclass.html#a670784309f5dde13aa8d7c8956b85501">BAND</a>))</div>
+<div class="line"><a name="l00090"></a><span class="lineno">   90</span>         band=str(self.getParameterValue(self.<a class="code" href="classqgis_1_1pktools_1_1pkreclass_1_1pkreclass.html#a310bec7495dd575a3ac641d81f914ae3">BAND</a>))</div>
 <div class="line"><a name="l00091"></a><span class="lineno">   91</span>         <span class="keywordflow">if</span> band != <span class="stringliteral">''</span>:</div>
 <div class="line"><a name="l00092"></a><span class="lineno">   92</span>             bandValues = band.split(<span class="stringliteral">';'</span>)</div>
 <div class="line"><a name="l00093"></a><span class="lineno">   93</span>             <span class="keywordflow">for</span> bandValue <span class="keywordflow">in</span> bandValues:</div>
 <div class="line"><a name="l00094"></a><span class="lineno">   94</span>                 commands.append(<span class="stringliteral">'-b'</span>)</div>
 <div class="line"><a name="l00095"></a><span class="lineno">   95</span>                 commands.append(bandValue)</div>
 <div class="line"><a name="l00096"></a><span class="lineno">   96</span> </div>
-<div class="line"><a name="l00097"></a><span class="lineno">   97</span>         theclass=str(self.getParameterValue(self.<a class="code" href="classqgis_1_1pkreclass_1_1pkreclass.html#a6eee06a836cf0cda3bb7d4e471dd0ff8">CLASS</a>))</div>
+<div class="line"><a name="l00097"></a><span class="lineno">   97</span>         theclass=str(self.getParameterValue(self.<a class="code" href="classqgis_1_1pktools_1_1pkreclass_1_1pkreclass.html#a47265725eeabaab2bb47e02c34ce8f66">CLASS</a>))</div>
 <div class="line"><a name="l00098"></a><span class="lineno">   98</span>         <span class="keywordflow">if</span> theclass != <span class="stringliteral">''</span>:</div>
 <div class="line"><a name="l00099"></a><span class="lineno">   99</span>             classValues = theclass.split(<span class="stringliteral">';'</span>)</div>
 <div class="line"><a name="l00100"></a><span class="lineno">  100</span>             <span class="keywordflow">for</span> classValue <span class="keywordflow">in</span> classValues:</div>
 <div class="line"><a name="l00101"></a><span class="lineno">  101</span>                 commands.append(<span class="stringliteral">'-c'</span>)</div>
 <div class="line"><a name="l00102"></a><span class="lineno">  102</span>                 commands.append(classValue)</div>
-<div class="line"><a name="l00103"></a><span class="lineno">  103</span>         reclass=str(self.getParameterValue(self.<a class="code" href="classqgis_1_1pkreclass_1_1pkreclass.html#ab677fcc1481ee0f4804a64ba5a9ccf41">RECLASS</a>))</div>
+<div class="line"><a name="l00103"></a><span class="lineno">  103</span>         reclass=str(self.getParameterValue(self.<a class="code" href="classqgis_1_1pktools_1_1pkreclass_1_1pkreclass.html#a77d68ecc97bddef7f58cfdb7426139d8">RECLASS</a>))</div>
 <div class="line"><a name="l00104"></a><span class="lineno">  104</span>         <span class="keywordflow">if</span> reclass != <span class="stringliteral">''</span>:</div>
 <div class="line"><a name="l00105"></a><span class="lineno">  105</span>             reclassValues = reclass.split(<span class="stringliteral">';'</span>)</div>
 <div class="line"><a name="l00106"></a><span class="lineno">  106</span>             <span class="keywordflow">for</span> reclassValue <span class="keywordflow">in</span> reclassValues:</div>
 <div class="line"><a name="l00107"></a><span class="lineno">  107</span>                 commands.append(<span class="stringliteral">'-r'</span>)</div>
 <div class="line"><a name="l00108"></a><span class="lineno">  108</span>                 commands.append(reclassValue)</div>
 <div class="line"><a name="l00109"></a><span class="lineno">  109</span> </div>
-<div class="line"><a name="l00110"></a><span class="lineno">  110</span>         mask = str(self.getParameterValue(self.<a class="code" href="classqgis_1_1pkreclass_1_1pkreclass.html#a8d00f95e83e048f830d3541e0006412a">MASK</a>))</div>
+<div class="line"><a name="l00110"></a><span class="lineno">  110</span>         mask = str(self.getParameterValue(self.<a class="code" href="classqgis_1_1pktools_1_1pkreclass_1_1pkreclass.html#a801a99540cfdf947b4837778ed0a1f37">MASK</a>))</div>
 <div class="line"><a name="l00111"></a><span class="lineno">  111</span>         <span class="keywordflow">if</span> mask != <span class="stringliteral">"None"</span>:</div>
 <div class="line"><a name="l00112"></a><span class="lineno">  112</span>             commands.append(<span class="stringliteral">'-m'</span>)</div>
 <div class="line"><a name="l00113"></a><span class="lineno">  113</span>             commands.append(mask)</div>
-<div class="line"><a name="l00114"></a><span class="lineno">  114</span>             msknodata=str(self.getParameterValue(self.<a class="code" href="classqgis_1_1pkreclass_1_1pkreclass.html#ad9cb8a5b163ad79ff18263dac1c27ea9">MSKNODATA</a>))</div>
+<div class="line"><a name="l00114"></a><span class="lineno">  114</span>             msknodata=str(self.getParameterValue(self.<a class="code" href="classqgis_1_1pktools_1_1pkreclass_1_1pkreclass.html#ad273e7dbdd1610b40f42d3c50295bd3a">MSKNODATA</a>))</div>
 <div class="line"><a name="l00115"></a><span class="lineno">  115</span>             msknodataValues = msknodata.split(<span class="stringliteral">';'</span>)</div>
 <div class="line"><a name="l00116"></a><span class="lineno">  116</span>             <span class="keywordflow">for</span> msknodataValue <span class="keywordflow">in</span> msknodataValues:</div>
 <div class="line"><a name="l00117"></a><span class="lineno">  117</span>                 commands.append(<span class="stringliteral">'-msknodata'</span>)</div>
 <div class="line"><a name="l00118"></a><span class="lineno">  118</span>                 commands.append(msknodataValue)</div>
 <div class="line"><a name="l00119"></a><span class="lineno">  119</span> </div>
-<div class="line"><a name="l00120"></a><span class="lineno">  120</span>         extra = str(self.getParameterValue(self.<a class="code" href="classqgis_1_1pkreclass_1_1pkreclass.html#a10e1786759936dd074581841f73c2505">EXTRA</a>))</div>
+<div class="line"><a name="l00120"></a><span class="lineno">  120</span>         extra = str(self.getParameterValue(self.<a class="code" href="classqgis_1_1pktools_1_1pkreclass_1_1pkreclass.html#a2da5ea965129a52c1559f80b8815b65d">EXTRA</a>))</div>
 <div class="line"><a name="l00121"></a><span class="lineno">  121</span>         <span class="keywordflow">if</span> len(extra) > 0:</div>
 <div class="line"><a name="l00122"></a><span class="lineno">  122</span>             commands.append(extra)</div>
 <div class="line"><a name="l00123"></a><span class="lineno">  123</span> </div>
 <div class="line"><a name="l00124"></a><span class="lineno">  124</span>         pktoolsUtils.runpktools(commands, progress)</div>
-<div class="ttc" id="classqgis_1_1pkreclass_1_1pkreclass_html_ad9cb8a5b163ad79ff18263dac1c27ea9"><div class="ttname"><a href="classqgis_1_1pkreclass_1_1pkreclass.html#ad9cb8a5b163ad79ff18263dac1c27ea9">qgis.pkreclass.pkreclass.MSKNODATA</a></div><div class="ttdeci">string MSKNODATA</div><div class="ttdef"><b>Definition:</b> <a href="pkreclass_8py_source.html#l00046">pkreclass.py:46</a></div></div>
-<div class="ttc" id="classqgis_1_1pkreclass_1_1pkreclass_html_aac30b4b09ec8af2b365ffc60dd969fa4"><div class="ttname"><a href="classqgis_1_1pkreclass_1_1pkreclass.html#aac30b4b09ec8af2b365ffc60dd969fa4">qgis.pkreclass.pkreclass.INPUT</a></div><div class="ttdeci">string INPUT</div><div class="ttdef"><b>Definition:</b> <a href="pkreclass_8py_source.html#l00040">pkreclass.py:40</a></div></div>
-<div class="ttc" id="classqgis_1_1pkreclass_1_1pkreclass_html_a1e3b6410096d899e755b4c3b8ceb2b63"><div class="ttname"><a href="classqgis_1_1pkreclass_1_1pkreclass.html#a1e3b6410096d899e755b4c3b8ceb2b63">qgis.pkreclass.pkreclass.cliName</a></div><div class="ttdeci">def cliName</div><div class="ttdef"><b>Definition:</b> <a href="pkreclass_8py_source.html#l00052">pkreclass.py:52</a></div></div>
-<div class="ttc" id="classqgis_1_1pkreclass_1_1pkreclass_html_a6eee06a836cf0cda3bb7d4e471dd0ff8"><div class="ttname"><a href="classqgis_1_1pkreclass_1_1pkreclass.html#a6eee06a836cf0cda3bb7d4e471dd0ff8">qgis.pkreclass.pkreclass.CLASS</a></div><div class="ttdeci">string CLASS</div><div class="ttdef"><b>Definition:</b> <a href="pkreclass_8py_source.html#l00042">pkreclass.py:42</a></div></div>
-<div class="ttc" id="classqgis_1_1pkreclass_1_1pkreclass_html_a670784309f5dde13aa8d7c8956b85501"><div class="ttname"><a href="classqgis_1_1pkreclass_1_1pkreclass.html#a670784309f5dde13aa8d7c8956b85501">qgis.pkreclass.pkreclass.BAND</a></div><div class="ttdeci">string BAND</div><div class="ttdef"><b>Definition:</b> <a href="pkreclass_8py_source.html#l00043">pkreclass.py:43</a></div></div>
-<div class="ttc" id="classqgis_1_1pkreclass_1_1pkreclass_html_ab677fcc1481ee0f4804a64ba5a9ccf41"><div class="ttname"><a href="classqgis_1_1pkreclass_1_1pkreclass.html#ab677fcc1481ee0f4804a64ba5a9ccf41">qgis.pkreclass.pkreclass.RECLASS</a></div><div class="ttdeci">string RECLASS</div><div class="ttdef"><b>Definition:</b> <a href="pkreclass_8py_source.html#l00044">pkreclass.py:44</a></div></div>
-<div class="ttc" id="classqgis_1_1pkreclass_1_1pkreclass_html_a7b77eea90f50504357742100c95ac454"><div class="ttname"><a href="classqgis_1_1pkreclass_1_1pkreclass.html#a7b77eea90f50504357742100c95ac454">qgis.pkreclass.pkreclass.RTYPE</a></div><div class="ttdeci">string RTYPE</div><div class="ttdef"><b>Definition:</b> <a href="pkreclass_8py_source.html#l00048">pkreclass.py:48</a></div></div>
-<div class="ttc" id="classqgis_1_1pkreclass_1_1pkreclass_html_a8d00f95e83e048f830d3541e0006412a"><div class="ttname"><a href="classqgis_1_1pkreclass_1_1pkreclass.html#a8d00f95e83e048f830d3541e0006412a">qgis.pkreclass.pkreclass.MASK</a></div><div class="ttdeci">string MASK</div><div class="ttdef"><b>Definition:</b> <a href="pkreclass_8py_source.html#l00045">pkreclass.py:45</a></div></div>
-<div class="ttc" id="classqgis_1_1pkreclass_1_1pkreclass_html_a10e1786759936dd074581841f73c2505"><div class="ttname"><a href="classqgis_1_1pkreclass_1_1pkreclass.html#a10e1786759936dd074581841f73c2505">qgis.pkreclass.pkreclass.EXTRA</a></div><div class="ttdeci">string EXTRA</div><div class="ttdef"><b>Definition:</b> <a href="pkreclass_8py_source.html#l00050">pkreclass.py:50</a></div></div>
-<div class="ttc" id="classqgis_1_1pkreclass_1_1pkreclass_html_a2d3e9d7948ff61e49ecaa646ace3b51c"><div class="ttname"><a href="classqgis_1_1pkreclass_1_1pkreclass.html#a2d3e9d7948ff61e49ecaa646ace3b51c">qgis.pkreclass.pkreclass.name</a></div><div class="ttdeci">name</div><div class="ttdef"><b>Definition:</b> <a href="pkreclass_8py_source.html#l00056">pkreclass.py:56</a></div></div>
-<div class="ttc" id="classqgis_1_1pkreclass_1_1pkreclass_html_ac06924e2f6d01acffb97d97f5ed30550"><div class="ttname"><a href="classqgis_1_1pkreclass_1_1pkreclass.html#ac06924e2f6d01acffb97d97f5ed30550">qgis.pkreclass.pkreclass.OUTPUT</a></div><div class="ttdeci">string OUTPUT</div><div class="ttdef"><b>Definition:</b> <a href="pkreclass_8py_source.html#l00041">pkreclass.py:41</a></div></div>
-<div class="ttc" id="classqgis_1_1pkreclass_1_1pkreclass_html_af8727418e991db1564e423d9ebeb2c89"><div class="ttname"><a href="classqgis_1_1pkreclass_1_1pkreclass.html#af8727418e991db1564e423d9ebeb2c89">qgis.pkreclass.pkreclass.TYPE</a></div><div class="ttdeci">list TYPE</div><div class="ttdef"><b>Definition:</b> <a href="pkreclass_8py_source.html#l00049">pkreclass.py:49</a></div></div>
-<div class="ttc" id="classqgis_1_1pkreclass_1_1pkreclass_html"><div class="ttname"><a href="classqgis_1_1pkreclass_1_1pkreclass.html">qgis.pkreclass.pkreclass</a></div><div class="ttdef"><b>Definition:</b> <a href="pkreclass_8py_source.html#l00038">pkreclass.py:38</a></div></div>
-<div class="ttc" id="classqgis_1_1pkreclass_1_1pkreclass_html_a5474989e8a32b4f84da61b1030d928d4"><div class="ttname"><a href="classqgis_1_1pkreclass_1_1pkreclass.html#a5474989e8a32b4f84da61b1030d928d4">qgis.pkreclass.pkreclass.group</a></div><div class="ttdeci">group</div><div class="ttdef"><b>Definition:</b> <a href="pkreclass_8py_source.html#l00057">pkreclass.py:57</a></div></div>
-<div class="ttc" id="classqgis_1_1pkreclass_1_1pkreclass_html_a377d3003bdce66a2ef2083bcd439950f"><div class="ttname"><a href="classqgis_1_1pkreclass_1_1pkreclass.html#a377d3003bdce66a2ef2083bcd439950f">qgis.pkreclass.pkreclass.NODATA</a></div><div class="ttdeci">string NODATA</div><div class="ttdef"><b>Definition:</b> <a href="pkreclass_8py_source.html#l00047">pkreclass.py:47</a></div></div>
+<div class="ttc" id="classqgis_1_1pktools_1_1pkreclass_1_1pkreclass_html"><div class="ttname"><a href="classqgis_1_1pktools_1_1pkreclass_1_1pkreclass.html">qgis.pktools.pkreclass.pkreclass</a></div><div class="ttdef"><b>Definition:</b> <a href="pktools_2pkreclass_8py_source.html#l00038">pkreclass.py:38</a></div></div>
+<div class="ttc" id="classqgis_1_1pktools_1_1pkreclass_1_1pkreclass_html_ae133eccf7059c47635068612f8d788db"><div class="ttname"><a href="classqgis_1_1pktools_1_1pkreclass_1_1pkreclass.html#ae133eccf7059c47635068612f8d788db">qgis.pktools.pkreclass.pkreclass.NODATA</a></div><div class="ttdeci">string NODATA</div><div class="ttdef"><b>Definition:</b> <a href="pktools_2pkreclass_8py_source.html#l00047">pkreclass.py:47</a></div></div>
+<div class="ttc" id="classqgis_1_1pktools_1_1pkreclass_1_1pkreclass_html_ad32491e68ff156791fe09f6435925b64"><div class="ttname"><a href="classqgis_1_1pktools_1_1pkreclass_1_1pkreclass.html#ad32491e68ff156791fe09f6435925b64">qgis.pktools.pkreclass.pkreclass.RTYPE</a></div><div class="ttdeci">string RTYPE</div><div class="ttdef"><b>Definition:</b> <a href="pktools_2pkreclass_8py_source.html#l00048">pkreclass.py:48</a></div></div>
+<div class="ttc" id="classqgis_1_1pktools_1_1pkreclass_1_1pkreclass_html_a77d68ecc97bddef7f58cfdb7426139d8"><div class="ttname"><a href="classqgis_1_1pktools_1_1pkreclass_1_1pkreclass.html#a77d68ecc97bddef7f58cfdb7426139d8">qgis.pktools.pkreclass.pkreclass.RECLASS</a></div><div class="ttdeci">string RECLASS</div><div class="ttdef"><b>Definition:</b> <a href="pktools_2pkreclass_8py_source.html#l00044">pkreclass.py:44</a></div></div>
+<div class="ttc" id="classqgis_1_1pktools_1_1pkreclass_1_1pkreclass_html_a801a99540cfdf947b4837778ed0a1f37"><div class="ttname"><a href="classqgis_1_1pktools_1_1pkreclass_1_1pkreclass.html#a801a99540cfdf947b4837778ed0a1f37">qgis.pktools.pkreclass.pkreclass.MASK</a></div><div class="ttdeci">string MASK</div><div class="ttdef"><b>Definition:</b> <a href="pktools_2pkreclass_8py_source.html#l00045">pkreclass.py:45</a></div></div>
+<div class="ttc" id="classqgis_1_1pktools_1_1pkreclass_1_1pkreclass_html_a310bec7495dd575a3ac641d81f914ae3"><div class="ttname"><a href="classqgis_1_1pktools_1_1pkreclass_1_1pkreclass.html#a310bec7495dd575a3ac641d81f914ae3">qgis.pktools.pkreclass.pkreclass.BAND</a></div><div class="ttdeci">string BAND</div><div class="ttdef"><b>Definition:</b> <a href="pktools_2pkreclass_8py_source.html#l00043">pkreclass.py:43</a></div></div>
+<div class="ttc" id="classqgis_1_1pktools_1_1pkreclass_1_1pkreclass_html_a984813cdec014931ab57b85348708d12"><div class="ttname"><a href="classqgis_1_1pktools_1_1pkreclass_1_1pkreclass.html#a984813cdec014931ab57b85348708d12">qgis.pktools.pkreclass.pkreclass.cliName</a></div><div class="ttdeci">def cliName</div><div class="ttdef"><b>Definition:</b> <a href="pktools_2pkreclass_8py_source.html#l00052">pkreclass.py:52</a></div></div>
+<div class="ttc" id="classqgis_1_1pktools_1_1pkreclass_1_1pkreclass_html_a556f1db8b0402c9c9c4f7cca81b1c264"><div class="ttname"><a href="classqgis_1_1pktools_1_1pkreclass_1_1pkreclass.html#a556f1db8b0402c9c9c4f7cca81b1c264">qgis.pktools.pkreclass.pkreclass.name</a></div><div class="ttdeci">name</div><div class="ttdef"><b>Definition:</b> <a href="pktools_2pkreclass_8py_source.html#l00056">pkreclass.py:56</a></div></div>
+<div class="ttc" id="classqgis_1_1pktools_1_1pkreclass_1_1pkreclass_html_a2fff886959f64cb10c12a26c056a1e88"><div class="ttname"><a href="classqgis_1_1pktools_1_1pkreclass_1_1pkreclass.html#a2fff886959f64cb10c12a26c056a1e88">qgis.pktools.pkreclass.pkreclass.group</a></div><div class="ttdeci">group</div><div class="ttdef"><b>Definition:</b> <a href="pktools_2pkreclass_8py_source.html#l00057">pkreclass.py:57</a></div></div>
+<div class="ttc" id="classqgis_1_1pktools_1_1pkreclass_1_1pkreclass_html_ad273e7dbdd1610b40f42d3c50295bd3a"><div class="ttname"><a href="classqgis_1_1pktools_1_1pkreclass_1_1pkreclass.html#ad273e7dbdd1610b40f42d3c50295bd3a">qgis.pktools.pkreclass.pkreclass.MSKNODATA</a></div><div class="ttdeci">string MSKNODATA</div><div class="ttdef"><b>Definition:</b> <a href="pktools_2pkreclass_8py_source.html#l00046">pkreclass.py:46</a></div></div>
+<div class="ttc" id="classqgis_1_1pktools_1_1pkreclass_1_1pkreclass_html_a2da5ea965129a52c1559f80b8815b65d"><div class="ttname"><a href="classqgis_1_1pktools_1_1pkreclass_1_1pkreclass.html#a2da5ea965129a52c1559f80b8815b65d">qgis.pktools.pkreclass.pkreclass.EXTRA</a></div><div class="ttdeci">string EXTRA</div><div class="ttdef"><b>Definition:</b> <a href="pktools_2pkreclass_8py_source.html#l00050">pkreclass.py:50</a></div></div>
+<div class="ttc" id="classqgis_1_1pktools_1_1pkreclass_1_1pkreclass_html_a47265725eeabaab2bb47e02c34ce8f66"><div class="ttname"><a href="classqgis_1_1pktools_1_1pkreclass_1_1pkreclass.html#a47265725eeabaab2bb47e02c34ce8f66">qgis.pktools.pkreclass.pkreclass.CLASS</a></div><div class="ttdeci">string CLASS</div><div class="ttdef"><b>Definition:</b> <a href="pktools_2pkreclass_8py_source.html#l00042">pkreclass.py:42</a></div></div>
+<div class="ttc" id="classqgis_1_1pktools_1_1pkreclass_1_1pkreclass_html_ae0f930fadcfbe749ee6565d75bb090f3"><div class="ttname"><a href="classqgis_1_1pktools_1_1pkreclass_1_1pkreclass.html#ae0f930fadcfbe749ee6565d75bb090f3">qgis.pktools.pkreclass.pkreclass.TYPE</a></div><div class="ttdeci">list TYPE</div><div class="ttdef"><b>Definition:</b> <a href="pktools_2pkreclass_8py_source.html#l00049">pkreclass.py:49</a></div></div>
+<div class="ttc" id="classqgis_1_1pktools_1_1pkreclass_1_1pkreclass_html_a303601836409f7a7a101ac4af8d8f3a6"><div class="ttname"><a href="classqgis_1_1pktools_1_1pkreclass_1_1pkreclass.html#a303601836409f7a7a101ac4af8d8f3a6">qgis.pktools.pkreclass.pkreclass.INPUT</a></div><div class="ttdeci">string INPUT</div><div class="ttdef"><b>Definition:</b> <a href="pktools_2pkreclass_8py_source.html#l00040">pkreclass.py:40</a></div></div>
+<div class="ttc" id="classqgis_1_1pktools_1_1pkreclass_1_1pkreclass_html_a065a117498a6be8d13ee27b0bcc04647"><div class="ttname"><a href="classqgis_1_1pktools_1_1pkreclass_1_1pkreclass.html#a065a117498a6be8d13ee27b0bcc04647">qgis.pktools.pkreclass.pkreclass.OUTPUT</a></div><div class="ttdeci">string OUTPUT</div><div class="ttdef"><b>Definition:</b> <a href="pktools_2pkreclass_8py_source.html#l00041">pkreclass.py:41</a></div></div>
 </div><!-- fragment --></div><!-- contents -->
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Jun 23 2015 17:09:36 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Tue Nov 3 2015 15:58:26 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/pksetmask_8py_source.html b/doc/html/pktools_2pksetmask_8py_source.html
similarity index 60%
copy from doc/html/pksetmask_8py_source.html
copy to doc/html/pktools_2pksetmask_8py_source.html
index 4db1f73..a085649 100644
--- a/doc/html/pksetmask_8py_source.html
+++ b/doc/html/pktools_2pksetmask_8py_source.html
@@ -4,7 +4,7 @@
 <meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
 <meta http-equiv="X-UA-Compatible" content="IE=9"/>
 <meta name="generator" content="Doxygen 1.8.6"/>
-<title>pktools: /home/kempenep/pktools/qgis/pksetmask.py Source File</title>
+<title>pktools: /home/kempenep/pktools/qgis/pktools/pksetmask.py Source File</title>
 <link href="tabs.css" rel="stylesheet" type="text/css"/>
 <script type="text/javascript" src="jquery.js"></script>
 <script type="text/javascript" src="dynsections.js"></script>
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.3</span>
+    <span id="projectnumber">2.6.4</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -44,7 +44,7 @@
   </div>
 <div id="nav-path" class="navpath">
   <ul>
-<li class="navelem"><a class="el" href="dir_5785acc8d2e42f8795bdbe936856f26d.html">qgis</a></li>  </ul>
+<li class="navelem"><a class="el" href="dir_5785acc8d2e42f8795bdbe936856f26d.html">qgis</a></li><li class="navelem"><a class="el" href="dir_b7cc22b4453454f1e686d9a2e78d988d.html">pktools</a></li>  </ul>
 </div>
 </div><!-- top -->
 <div class="header">
@@ -89,7 +89,7 @@
 <div class="line"><a name="l00035"></a><span class="lineno">   35</span> <span class="keyword">from</span> processing.core.parameters <span class="keyword">import</span> ParameterBoolean</div>
 <div class="line"><a name="l00036"></a><span class="lineno">   36</span> <span class="keyword">from</span> processing.core.parameters <span class="keyword">import</span> ParameterExtent</div>
 <div class="line"><a name="l00037"></a><span class="lineno">   37</span> </div>
-<div class="line"><a name="l00038"></a><span class="lineno"><a class="line" href="classqgis_1_1pksetmask_1_1pksetmask.html">   38</a></span> <span class="keyword">class </span><a class="code" href="classqgis_1_1pksetmask_1_1pksetmask.html">pksetmask</a>(pktoolsAlgorithm):</div>
+<div class="line"><a name="l00038"></a><span class="lineno"><a class="line" href="classqgis_1_1pktools_1_1pksetmask_1_1pksetmask.html">   38</a></span> <span class="keyword">class </span><a class="code" href="classqgis_1_1pktools_1_1pksetmask_1_1pksetmask.html">pksetmask</a>(pktoolsAlgorithm):</div>
 <div class="line"><a name="l00039"></a><span class="lineno">   39</span> </div>
 <div class="line"><a name="l00040"></a><span class="lineno">   40</span>     INPUT = <span class="stringliteral">"INPUT"</span></div>
 <div class="line"><a name="l00041"></a><span class="lineno">   41</span>     MASK = <span class="stringliteral">"MASK"</span></div>
@@ -107,87 +107,84 @@
 <div class="line"><a name="l00053"></a><span class="lineno">   53</span>         <span class="keywordflow">return</span> <span class="stringliteral">"pksetmask"</span></div>
 <div class="line"><a name="l00054"></a><span class="lineno">   54</span> </div>
 <div class="line"><a name="l00055"></a><span class="lineno">   55</span>     <span class="keyword">def </span>defineCharacteristics(self):</div>
-<div class="line"><a name="l00056"></a><span class="lineno">   56</span>         self.<a class="code" href="classqgis_1_1pksetmask_1_1pksetmask.html#ac356f16f384fdc78b5419cdbaaac496d">name</a> = <span class="stringliteral">"apply mask to raster dataset"</span></div>
-<div class="line"><a name="l00057"></a><span class="lineno">   57</span>         self.<a class="code" href="classqgis_1_1pksetmask_1_1pksetmask.html#a26a6204cff0e0414422bddb6d714c8d5">group</a> = <span class="stringliteral">"[pktools] raster"</span></div>
-<div class="line"><a name="l00058"></a><span class="lineno">   58</span>         self.addParameter(ParameterRaster(self.<a class="code" href="classqgis_1_1pksetmask_1_1pksetmask.html#a64b4d0cf98dae937536135be3220011d">INPUT</a>, <span class="stringliteral">'Input layer raster data set'</span>,ParameterRaster))</div>
-<div class="line"><a name="l00059"></a><span class="lineno">   59</span>         self.addParameter(ParameterMultipleInput(self.<a class="code" href="classqgis_1_1pksetmask_1_1pksetmask.html#a926a151acae3b3947f8f659c08901a0e">MASK</a>, <span class="stringliteral">'Mask(s) to apply'</span>,ParameterMultipleInput.TYPE_RASTER))</div>
-<div class="line"><a name="l00060"></a><span class="lineno">   60</span>         self.addParameter(ParameterString(self.<a class="code" href="classqgis_1_1pksetmask_1_1pksetmask.html#afd621c70d1c2fc2f29a598ca94f52209">MSKNODATA</a>, <span class="stringliteral">"Mask value(s), provide value for each mask (e.g., 250;255)"</span>,<span class="stringliteral">"1"</span>))</div>
-<div class="line"><a name="l00061"></a><span class="lineno">   61</span>         self.addParameter(ParameterString(self.<a class="code" href="classqgis_1_1pksetmask_1_1pksetmask.html#a72fd0200a13dd69eb8a8e8664288f8f3">MSKBAND</a>, <span class="stringliteral">"Mask band(s) to read, provide band for each mask (e.g., 0;1)"</span>,<span class="stringliteral">"0"</span>))</div>
-<div class="line"><a name="l00062"></a><span class="lineno">   62</span>         self.addParameter(ParameterSelection(self.<a class="code" href="classqgis_1_1pksetmask_1_1pksetmask.html#a68d2802febad55d67d4848ee6553d21e">OPERATOR</a>,<span class="stringliteral">"setmask rule"</span>,self.<a class="code" href="classqgis_1_1pksetmask_1_1pksetmask.html#a0ec16c72e434e986dc7127edd22a8756">OPERATOR_OPTIONS</a>, 0))</div>
-<div class="line"><a name="l00063"></a><span class="lineno">   63</span>         self.addParameter(ParameterString(self.<a class="code" href="classqgis_1_1pksetmask_1_1pksetmask.html#a7db2c15757ac66baf866fcaaba9f27ac">NODATA</a>, <span class="stringliteral">"nodata value to put in image if not valid"</span>,<span class="stringliteral">"0"</span>))</div>
-<div class="line"><a name="l00064"></a><span class="lineno">   64</span>         self.addOutput(OutputRaster(self.<a class="code" href="classqgis_1_1pksetmask_1_1pksetmask.html#a1f43a43129a59344782bd62b9984045b">OUTPUT</a>, <span class="stringliteral">"Output raster data set"</span>))</div>
-<div class="line"><a name="l00065"></a><span class="lineno">   65</span>         self.addParameter(ParameterSelection(self.<a class="code" href="classqgis_1_1pksetmask_1_1pksetmask.html#a53adabeb756e8f6c38b739a182b4c351">RTYPE</a>, <span class="stringliteral">'Output raster type (leave as none to keep original type)'</span>, self.<a class="code" href="classqgis_1_1pksetmask_1_1pksetmask.html#a4c222c8118aa51967806a48f9e67151a">TYPE</a>, 0))</div>
-<div class="line"><a name="l00066"></a><span class="lineno">   66</span>         self.addParameter(ParameterString(self.<a class="code" href="classqgis_1_1pksetmask_1_1pksetmask.html#ae31305e3b79571cc6475b47cf9c4762e">EXTRA</a>,</div>
+<div class="line"><a name="l00056"></a><span class="lineno">   56</span>         self.<a class="code" href="classqgis_1_1pktools_1_1pksetmask_1_1pksetmask.html#a0c7a9177b36c398a267bf8de262516eb">name</a> = <span class="stringliteral">"apply mask to raster dataset"</span></div>
+<div class="line"><a name="l00057"></a><span class="lineno">   57</span>         self.<a class="code" href="classqgis_1_1pktools_1_1pksetmask_1_1pksetmask.html#ae1d2501517fe54bab01bb8d797582e84">group</a> = <span class="stringliteral">"[pktools] raster"</span></div>
+<div class="line"><a name="l00058"></a><span class="lineno">   58</span>         self.addParameter(ParameterRaster(self.<a class="code" href="classqgis_1_1pktools_1_1pksetmask_1_1pksetmask.html#a8e87715eedd9a7165b00d55d02833569">INPUT</a>, <span class="stringliteral">'Input layer raster data set'</span>,ParameterRaster))</div>
+<div class="line"><a name="l00059"></a><span class="lineno">   59</span>         self.addParameter(ParameterMultipleInput(self.<a class="code" href="classqgis_1_1pktools_1_1pksetmask_1_1pksetmask.html#ac40b33e07c5ee97c23a151a66df84689">MASK</a>, <span class="stringliteral">'Mask(s) to apply'</span>,ParameterMultipleInput.TYPE_RASTER))</div>
+<div class="line"><a name="l00060"></a><span class="lineno">   60</span>         self.addParameter(ParameterString(self.<a class="code" href="classqgis_1_1pktools_1_1pksetmask_1_1pksetmask.html#a9b66ea21c12be4ad78c2ca6cff1f43f9">MSKNODATA</a>, <span class="stringliteral">"Mask value(s), provide value for each mask (e.g., 250;255)"</span>,<span class="stringliteral">"1"</span>))</div>
+<div class="line"><a name="l00061"></a><span class="lineno">   61</span>         self.addParameter(ParameterString(self.<a class="code" href="classqgis_1_1pktools_1_1pksetmask_1_1pksetmask.html#ace691beff7bf0d303e8fee5efde7b265">MSKBAND</a>, <span class="stringliteral">"Mask band(s) to read, provide band for each mask (e.g., 0;1)"</span>,<span class="stringliteral">"0"</span>))</div>
+<div class="line"><a name="l00062"></a><span class="lineno">   62</span>         self.addParameter(ParameterSelection(self.<a class="code" href="classqgis_1_1pktools_1_1pksetmask_1_1pksetmask.html#a73bb29985c2a59680763c0037397739e">OPERATOR</a>,<span class="stringliteral">"setmask rule"</span>,self.<a class="code" href="classqgis_1_1pktools_1_1pksetmask_1_1pksetmask.html#a51a45aa30286d2a9ff7810da37e28aae">OPERATOR_OPTIONS</a>, 0))</div>
+<div class="line"><a name="l00063"></a><span class="lineno">   63</span>         self.addParameter(ParameterString(self.<a class="code" href="classqgis_1_1pktools_1_1pksetmask_1_1pksetmask.html#a24c98153680e1de66746fd52785ae784">NODATA</a>, <span class="stringliteral">"nodata value to put in image if not valid"</span>,<span class="stringliteral">"0"</span>))</div>
+<div class="line"><a name="l00064"></a><span class="lineno">   64</span>         self.addOutput(OutputRaster(self.<a class="code" href="classqgis_1_1pktools_1_1pksetmask_1_1pksetmask.html#a5883cf4f62435f304fdadd16b2cffc7b">OUTPUT</a>, <span class="stringliteral">"Output raster data set"</span>))</div>
+<div class="line"><a name="l00065"></a><span class="lineno">   65</span>         self.addParameter(ParameterSelection(self.<a class="code" href="classqgis_1_1pktools_1_1pksetmask_1_1pksetmask.html#aebbb05f08af1f26f4bdab58e4765f0f4">RTYPE</a>, <span class="stringliteral">'Output raster type (leave as none to keep original type)'</span>, self.<a class="code" href="classqgis_1_1pktools_1_1pksetmask_1_1pksetmask.html#a9e6a013c1e4fb1d7a17be4c55e414a21">TYPE</a>, 0))</div>
+<div class="line"><a name="l00066"></a><span class="lineno">   66</span>         self.addParameter(ParameterString(self.<a class="code" href="classqgis_1_1pktools_1_1pksetmask_1_1pksetmask.html#a7844f283b29ff1eab06a928d703b1628">EXTRA</a>,</div>
 <div class="line"><a name="l00067"></a><span class="lineno">   67</span>                           <span class="stringliteral">'Additional parameters'</span>, <span class="stringliteral">'-of GTiff'</span>, optional=<span class="keyword">True</span>))</div>
 <div class="line"><a name="l00068"></a><span class="lineno">   68</span> </div>
 <div class="line"><a name="l00069"></a><span class="lineno">   69</span>     <span class="keyword">def </span>processAlgorithm(self, progress):</div>
-<div class="line"><a name="l00070"></a><span class="lineno">   70</span>         cliPath = <span class="stringliteral">'"'</span> + os.path.join(pktoolsUtils.pktoolsPath(), self.<a class="code" href="classqgis_1_1pksetmask_1_1pksetmask.html#a539b2bbbabaa1ea1ac1dcdcc60a87669">cliName</a>()) + <span class="stringliteral">'"'</span></div>
+<div class="line"><a name="l00070"></a><span class="lineno">   70</span>         cliPath = <span class="stringliteral">'"'</span> + os.path.join(pktoolsUtils.pktoolsPath(), self.<a class="code" href="classqgis_1_1pktools_1_1pksetmask_1_1pksetmask.html#a25ebf3b8fa56e16e2dfa077434ee4419">cliName</a>()) + <span class="stringliteral">'"'</span></div>
 <div class="line"><a name="l00071"></a><span class="lineno">   71</span>         commands = [cliPath]</div>
 <div class="line"><a name="l00072"></a><span class="lineno">   72</span> </div>
-<div class="line"><a name="l00073"></a><span class="lineno">   73</span>         input=self.getParameterValue(self.<a class="code" href="classqgis_1_1pksetmask_1_1pksetmask.html#a64b4d0cf98dae937536135be3220011d">INPUT</a>)</div>
+<div class="line"><a name="l00073"></a><span class="lineno">   73</span>         input=self.getParameterValue(self.<a class="code" href="classqgis_1_1pktools_1_1pksetmask_1_1pksetmask.html#a8e87715eedd9a7165b00d55d02833569">INPUT</a>)</div>
 <div class="line"><a name="l00074"></a><span class="lineno">   74</span>         commands.append(<span class="stringliteral">'-i'</span>)</div>
 <div class="line"><a name="l00075"></a><span class="lineno">   75</span>         commands.append(<span class="stringliteral">'"'</span> + input + <span class="stringliteral">'"'</span>)</div>
 <div class="line"><a name="l00076"></a><span class="lineno">   76</span> </div>
-<div class="line"><a name="l00077"></a><span class="lineno">   77</span>         mask=self.getParameterValue(self.<a class="code" href="classqgis_1_1pksetmask_1_1pksetmask.html#a926a151acae3b3947f8f659c08901a0e">MASK</a>)</div>
+<div class="line"><a name="l00077"></a><span class="lineno">   77</span>         mask=self.getParameterValue(self.<a class="code" href="classqgis_1_1pktools_1_1pksetmask_1_1pksetmask.html#ac40b33e07c5ee97c23a151a66df84689">MASK</a>)</div>
 <div class="line"><a name="l00078"></a><span class="lineno">   78</span>         maskFiles = mask.split(<span class="stringliteral">';'</span>)</div>
 <div class="line"><a name="l00079"></a><span class="lineno">   79</span>         <span class="keywordflow">for</span> maskFile <span class="keywordflow">in</span> maskFiles:</div>
 <div class="line"><a name="l00080"></a><span class="lineno">   80</span>             commands.append(<span class="stringliteral">'-m'</span>)</div>
 <div class="line"><a name="l00081"></a><span class="lineno">   81</span>             commands.append(maskFile)</div>
 <div class="line"><a name="l00082"></a><span class="lineno">   82</span> </div>
-<div class="line"><a name="l00083"></a><span class="lineno">   83</span>         commands.append(str(self.getParameterValue(self.<a class="code" href="classqgis_1_1pksetmask_1_1pksetmask.html#a72fd0200a13dd69eb8a8e8664288f8f3">MSKBAND</a>)))</div>
-<div class="line"><a name="l00084"></a><span class="lineno">   84</span>         mskband=self.getParameterValue(self.<a class="code" href="classqgis_1_1pksetmask_1_1pksetmask.html#a72fd0200a13dd69eb8a8e8664288f8f3">MSKBAND</a>)</div>
+<div class="line"><a name="l00083"></a><span class="lineno">   83</span>         commands.append(str(self.getParameterValue(self.<a class="code" href="classqgis_1_1pktools_1_1pksetmask_1_1pksetmask.html#ace691beff7bf0d303e8fee5efde7b265">MSKBAND</a>)))</div>
+<div class="line"><a name="l00084"></a><span class="lineno">   84</span>         mskband=self.getParameterValue(self.<a class="code" href="classqgis_1_1pktools_1_1pksetmask_1_1pksetmask.html#ace691beff7bf0d303e8fee5efde7b265">MSKBAND</a>)</div>
 <div class="line"><a name="l00085"></a><span class="lineno">   85</span>         mskbandValues = mskband.split(<span class="stringliteral">';'</span>)</div>
 <div class="line"><a name="l00086"></a><span class="lineno">   86</span>         <span class="keywordflow">for</span> mskbandValue <span class="keywordflow">in</span> mskbandValues:</div>
 <div class="line"><a name="l00087"></a><span class="lineno">   87</span>                 commands.append(<span class="stringliteral">'-mskband'</span>)</div>
 <div class="line"><a name="l00088"></a><span class="lineno">   88</span>                 commands.append(mskbandValue)</div>
-<div class="line"><a name="l00089"></a><span class="lineno">   89</span>         commands.append(str(self.getParameterValue(self.<a class="code" href="classqgis_1_1pksetmask_1_1pksetmask.html#afd621c70d1c2fc2f29a598ca94f52209">MSKNODATA</a>)))</div>
-<div class="line"><a name="l00090"></a><span class="lineno">   90</span>         msknodata=self.getParameterValue(self.<a class="code" href="classqgis_1_1pksetmask_1_1pksetmask.html#afd621c70d1c2fc2f29a598ca94f52209">MSKNODATA</a>)</div>
+<div class="line"><a name="l00089"></a><span class="lineno">   89</span>         commands.append(str(self.getParameterValue(self.<a class="code" href="classqgis_1_1pktools_1_1pksetmask_1_1pksetmask.html#a9b66ea21c12be4ad78c2ca6cff1f43f9">MSKNODATA</a>)))</div>
+<div class="line"><a name="l00090"></a><span class="lineno">   90</span>         msknodata=self.getParameterValue(self.<a class="code" href="classqgis_1_1pktools_1_1pksetmask_1_1pksetmask.html#a9b66ea21c12be4ad78c2ca6cff1f43f9">MSKNODATA</a>)</div>
 <div class="line"><a name="l00091"></a><span class="lineno">   91</span>         msknodataValues = msknodata.split(<span class="stringliteral">';'</span>)</div>
 <div class="line"><a name="l00092"></a><span class="lineno">   92</span>         <span class="keywordflow">for</span> msknodataValue <span class="keywordflow">in</span> msknodataValues:</div>
 <div class="line"><a name="l00093"></a><span class="lineno">   93</span>                 commands.append(<span class="stringliteral">'-msknodata'</span>)</div>
 <div class="line"><a name="l00094"></a><span class="lineno">   94</span>                 commands.append(msknodataValue)</div>
 <div class="line"><a name="l00095"></a><span class="lineno">   95</span> </div>
-<div class="line"><a name="l00096"></a><span class="lineno">   96</span>         band=self.getParameterValue(self.BAND)</div>
-<div class="line"><a name="l00097"></a><span class="lineno">   97</span>         commands.append(<span class="stringliteral">"-p"</span>)</div>
-<div class="line"><a name="l00098"></a><span class="lineno">   98</span>         commands.append(self.<a class="code" href="classqgis_1_1pksetmask_1_1pksetmask.html#a0ec16c72e434e986dc7127edd22a8756">OPERATOR_OPTIONS</a>[self.getParameterValue(self.<a class="code" href="classqgis_1_1pksetmask_1_1pksetmask.html#a68d2802febad55d67d4848ee6553d21e">OPERATOR</a>)])</div>
-<div class="line"><a name="l00099"></a><span class="lineno">   99</span>         nodata=self.getParameterValue(self.<a class="code" href="classqgis_1_1pksetmask_1_1pksetmask.html#a7db2c15757ac66baf866fcaaba9f27ac">NODATA</a>)</div>
-<div class="line"><a name="l00100"></a><span class="lineno">  100</span>         commands.append(<span class="stringliteral">'-nodata'</span>)</div>
-<div class="line"><a name="l00101"></a><span class="lineno">  101</span>         commands.append(nodataValue)</div>
-<div class="line"><a name="l00102"></a><span class="lineno">  102</span>         <span class="keywordflow">if</span> self.<a class="code" href="classqgis_1_1pksetmask_1_1pksetmask.html#a4c222c8118aa51967806a48f9e67151a">TYPE</a>[self.getParameterValue(self.<a class="code" href="classqgis_1_1pksetmask_1_1pksetmask.html#a53adabeb756e8f6c38b739a182b4c351">RTYPE</a>)] != <span class="stringliteral">"none"</span>:</div>
-<div class="line"><a name="l00103"></a><span class="lineno">  103</span>             commands.append(<span class="stringliteral">'-ot'</span>)</div>
-<div class="line"><a name="l00104"></a><span class="lineno">  104</span>             commands.append(self.<a class="code" href="classqgis_1_1pksetmask_1_1pksetmask.html#a4c222c8118aa51967806a48f9e67151a">TYPE</a>[self.getParameterValue(self.<a class="code" href="classqgis_1_1pksetmask_1_1pksetmask.html#a53adabeb756e8f6c38b739a182b4c351">RTYPE</a>)])</div>
-<div class="line"><a name="l00105"></a><span class="lineno">  105</span>         output=self.getOutputValue(self.<a class="code" href="classqgis_1_1pksetmask_1_1pksetmask.html#a1f43a43129a59344782bd62b9984045b">OUTPUT</a>)</div>
-<div class="line"><a name="l00106"></a><span class="lineno">  106</span>         <span class="keywordflow">if</span> output != <span class="stringliteral">""</span>:</div>
-<div class="line"><a name="l00107"></a><span class="lineno">  107</span>             commands.append(<span class="stringliteral">"-o"</span>)</div>
-<div class="line"><a name="l00108"></a><span class="lineno">  108</span>             commands.append(<span class="stringliteral">'"'</span> + output + <span class="stringliteral">'"'</span>)</div>
-<div class="line"><a name="l00109"></a><span class="lineno">  109</span> </div>
-<div class="line"><a name="l00110"></a><span class="lineno">  110</span>         data=self.getParameterValue(self.DATA)</div>
-<div class="line"><a name="l00111"></a><span class="lineno">  111</span> </div>
-<div class="line"><a name="l00112"></a><span class="lineno">  112</span>         extra = str(self.getParameterValue(self.<a class="code" href="classqgis_1_1pksetmask_1_1pksetmask.html#ae31305e3b79571cc6475b47cf9c4762e">EXTRA</a>))</div>
-<div class="line"><a name="l00113"></a><span class="lineno">  113</span>         <span class="keywordflow">if</span> len(extra) > 0:</div>
-<div class="line"><a name="l00114"></a><span class="lineno">  114</span>             commands.append(extra)</div>
-<div class="line"><a name="l00115"></a><span class="lineno">  115</span> </div>
-<div class="line"><a name="l00116"></a><span class="lineno">  116</span>         pktoolsUtils.runpktools(commands, progress)</div>
-<div class="ttc" id="classqgis_1_1pksetmask_1_1pksetmask_html_a0ec16c72e434e986dc7127edd22a8756"><div class="ttname"><a href="classqgis_1_1pksetmask_1_1pksetmask.html#a0ec16c72e434e986dc7127edd22a8756">qgis.pksetmask.pksetmask.OPERATOR_OPTIONS</a></div><div class="ttdeci">list OPERATOR_OPTIONS</div><div class="ttdef"><b>Definition:</b> <a href="pksetmask_8py_source.html#l00044">pksetmask.py:44</a></div></div>
-<div class="ttc" id="classqgis_1_1pksetmask_1_1pksetmask_html_a4c222c8118aa51967806a48f9e67151a"><div class="ttname"><a href="classqgis_1_1pksetmask_1_1pksetmask.html#a4c222c8118aa51967806a48f9e67151a">qgis.pksetmask.pksetmask.TYPE</a></div><div class="ttdeci">list TYPE</div><div class="ttdef"><b>Definition:</b> <a href="pksetmask_8py_source.html#l00049">pksetmask.py:49</a></div></div>
-<div class="ttc" id="classqgis_1_1pksetmask_1_1pksetmask_html_a68d2802febad55d67d4848ee6553d21e"><div class="ttname"><a href="classqgis_1_1pksetmask_1_1pksetmask.html#a68d2802febad55d67d4848ee6553d21e">qgis.pksetmask.pksetmask.OPERATOR</a></div><div class="ttdeci">string OPERATOR</div><div class="ttdef"><b>Definition:</b> <a href="pksetmask_8py_source.html#l00045">pksetmask.py:45</a></div></div>
-<div class="ttc" id="classqgis_1_1pksetmask_1_1pksetmask_html_a72fd0200a13dd69eb8a8e8664288f8f3"><div class="ttname"><a href="classqgis_1_1pksetmask_1_1pksetmask.html#a72fd0200a13dd69eb8a8e8664288f8f3">qgis.pksetmask.pksetmask.MSKBAND</a></div><div class="ttdeci">string MSKBAND</div><div class="ttdef"><b>Definition:</b> <a href="pksetmask_8py_source.html#l00043">pksetmask.py:43</a></div></div>
-<div class="ttc" id="classqgis_1_1pksetmask_1_1pksetmask_html_a64b4d0cf98dae937536135be3220011d"><div class="ttname"><a href="classqgis_1_1pksetmask_1_1pksetmask.html#a64b4d0cf98dae937536135be3220011d">qgis.pksetmask.pksetmask.INPUT</a></div><div class="ttdeci">string INPUT</div><div class="ttdef"><b>Definition:</b> <a href="pksetmask_8py_source.html#l00040">pksetmask.py:40</a></div></div>
-<div class="ttc" id="classqgis_1_1pksetmask_1_1pksetmask_html_a26a6204cff0e0414422bddb6d714c8d5"><div class="ttname"><a href="classqgis_1_1pksetmask_1_1pksetmask.html#a26a6204cff0e0414422bddb6d714c8d5">qgis.pksetmask.pksetmask.group</a></div><div class="ttdeci">group</div><div class="ttdef"><b>Definition:</b> <a href="pksetmask_8py_source.html#l00057">pksetmask.py:57</a></div></div>
-<div class="ttc" id="classqgis_1_1pksetmask_1_1pksetmask_html_a7db2c15757ac66baf866fcaaba9f27ac"><div class="ttname"><a href="classqgis_1_1pksetmask_1_1pksetmask.html#a7db2c15757ac66baf866fcaaba9f27ac">qgis.pksetmask.pksetmask.NODATA</a></div><div class="ttdeci">string NODATA</div><div class="ttdef"><b>Definition:</b> <a href="pksetmask_8py_source.html#l00046">pksetmask.py:46</a></div></div>
-<div class="ttc" id="classqgis_1_1pksetmask_1_1pksetmask_html_ae31305e3b79571cc6475b47cf9c4762e"><div class="ttname"><a href="classqgis_1_1pksetmask_1_1pksetmask.html#ae31305e3b79571cc6475b47cf9c4762e">qgis.pksetmask.pksetmask.EXTRA</a></div><div class="ttdeci">string EXTRA</div><div class="ttdef"><b>Definition:</b> <a href="pksetmask_8py_source.html#l00050">pksetmask.py:50</a></div></div>
-<div class="ttc" id="classqgis_1_1pksetmask_1_1pksetmask_html_afd621c70d1c2fc2f29a598ca94f52209"><div class="ttname"><a href="classqgis_1_1pksetmask_1_1pksetmask.html#afd621c70d1c2fc2f29a598ca94f52209">qgis.pksetmask.pksetmask.MSKNODATA</a></div><div class="ttdeci">string MSKNODATA</div><div class="ttdef"><b>Definition:</b> <a href="pksetmask_8py_source.html#l00042">pksetmask.py:42</a></div></div>
-<div class="ttc" id="classqgis_1_1pksetmask_1_1pksetmask_html_ac356f16f384fdc78b5419cdbaaac496d"><div class="ttname"><a href="classqgis_1_1pksetmask_1_1pksetmask.html#ac356f16f384fdc78b5419cdbaaac496d">qgis.pksetmask.pksetmask.name</a></div><div class="ttdeci">name</div><div class="ttdef"><b>Definition:</b> <a href="pksetmask_8py_source.html#l00056">pksetmask.py:56</a></div></div>
-<div class="ttc" id="classqgis_1_1pksetmask_1_1pksetmask_html_a53adabeb756e8f6c38b739a182b4c351"><div class="ttname"><a href="classqgis_1_1pksetmask_1_1pksetmask.html#a53adabeb756e8f6c38b739a182b4c351">qgis.pksetmask.pksetmask.RTYPE</a></div><div class="ttdeci">string RTYPE</div><div class="ttdef"><b>Definition:</b> <a href="pksetmask_8py_source.html#l00048">pksetmask.py:48</a></div></div>
-<div class="ttc" id="classqgis_1_1pksetmask_1_1pksetmask_html_a926a151acae3b3947f8f659c08901a0e"><div class="ttname"><a href="classqgis_1_1pksetmask_1_1pksetmask.html#a926a151acae3b3947f8f659c08901a0e">qgis.pksetmask.pksetmask.MASK</a></div><div class="ttdeci">string MASK</div><div class="ttdef"><b>Definition:</b> <a href="pksetmask_8py_source.html#l00041">pksetmask.py:41</a></div></div>
-<div class="ttc" id="classqgis_1_1pksetmask_1_1pksetmask_html_a539b2bbbabaa1ea1ac1dcdcc60a87669"><div class="ttname"><a href="classqgis_1_1pksetmask_1_1pksetmask.html#a539b2bbbabaa1ea1ac1dcdcc60a87669">qgis.pksetmask.pksetmask.cliName</a></div><div class="ttdeci">def cliName</div><div class="ttdef"><b>Definition:</b> <a href="pksetmask_8py_source.html#l00052">pksetmask.py:52</a></div></div>
-<div class="ttc" id="classqgis_1_1pksetmask_1_1pksetmask_html_a1f43a43129a59344782bd62b9984045b"><div class="ttname"><a href="classqgis_1_1pksetmask_1_1pksetmask.html#a1f43a43129a59344782bd62b9984045b">qgis.pksetmask.pksetmask.OUTPUT</a></div><div class="ttdeci">string OUTPUT</div><div class="ttdef"><b>Definition:</b> <a href="pksetmask_8py_source.html#l00047">pksetmask.py:47</a></div></div>
-<div class="ttc" id="classqgis_1_1pksetmask_1_1pksetmask_html"><div class="ttname"><a href="classqgis_1_1pksetmask_1_1pksetmask.html">qgis.pksetmask.pksetmask</a></div><div class="ttdef"><b>Definition:</b> <a href="pksetmask_8py_source.html#l00038">pksetmask.py:38</a></div></div>
+<div class="line"><a name="l00096"></a><span class="lineno">   96</span>         commands.append(<span class="stringliteral">"-p"</span>)</div>
+<div class="line"><a name="l00097"></a><span class="lineno">   97</span>         commands.append(self.<a class="code" href="classqgis_1_1pktools_1_1pksetmask_1_1pksetmask.html#a51a45aa30286d2a9ff7810da37e28aae">OPERATOR_OPTIONS</a>[self.getParameterValue(self.<a class="code" href="classqgis_1_1pktools_1_1pksetmask_1_1pksetmask.html#a73bb29985c2a59680763c0037397739e">OPERATOR</a>)])</div>
+<div class="line"><a name="l00098"></a><span class="lineno">   98</span>         nodata=self.getParameterValue(self.<a class="code" href="classqgis_1_1pktools_1_1pksetmask_1_1pksetmask.html#a24c98153680e1de66746fd52785ae784">NODATA</a>)</div>
+<div class="line"><a name="l00099"></a><span class="lineno">   99</span>         commands.append(<span class="stringliteral">'-nodata'</span>)</div>
+<div class="line"><a name="l00100"></a><span class="lineno">  100</span>         commands.append(nodata)</div>
+<div class="line"><a name="l00101"></a><span class="lineno">  101</span>         <span class="keywordflow">if</span> self.<a class="code" href="classqgis_1_1pktools_1_1pksetmask_1_1pksetmask.html#a9e6a013c1e4fb1d7a17be4c55e414a21">TYPE</a>[self.getParameterValue(self.<a class="code" href="classqgis_1_1pktools_1_1pksetmask_1_1pksetmask.html#aebbb05f08af1f26f4bdab58e4765f0f4">RTYPE</a>)] != <span class="stringliteral">"none"</span>:</div>
+<div class="line"><a name="l00102"></a><span class="lineno">  102</span>             commands.append(<span class="stringliteral">'-ot'</span>)</div>
+<div class="line"><a name="l00103"></a><span class="lineno">  103</span>             commands.append(self.<a class="code" href="classqgis_1_1pktools_1_1pksetmask_1_1pksetmask.html#a9e6a013c1e4fb1d7a17be4c55e414a21">TYPE</a>[self.getParameterValue(self.<a class="code" href="classqgis_1_1pktools_1_1pksetmask_1_1pksetmask.html#aebbb05f08af1f26f4bdab58e4765f0f4">RTYPE</a>)])</div>
+<div class="line"><a name="l00104"></a><span class="lineno">  104</span>         output=self.getOutputValue(self.<a class="code" href="classqgis_1_1pktools_1_1pksetmask_1_1pksetmask.html#a5883cf4f62435f304fdadd16b2cffc7b">OUTPUT</a>)</div>
+<div class="line"><a name="l00105"></a><span class="lineno">  105</span>         <span class="keywordflow">if</span> output != <span class="stringliteral">""</span>:</div>
+<div class="line"><a name="l00106"></a><span class="lineno">  106</span>             commands.append(<span class="stringliteral">"-o"</span>)</div>
+<div class="line"><a name="l00107"></a><span class="lineno">  107</span>             commands.append(<span class="stringliteral">'"'</span> + output + <span class="stringliteral">'"'</span>)</div>
+<div class="line"><a name="l00108"></a><span class="lineno">  108</span> </div>
+<div class="line"><a name="l00109"></a><span class="lineno">  109</span>         extra = str(self.getParameterValue(self.<a class="code" href="classqgis_1_1pktools_1_1pksetmask_1_1pksetmask.html#a7844f283b29ff1eab06a928d703b1628">EXTRA</a>))</div>
+<div class="line"><a name="l00110"></a><span class="lineno">  110</span>         <span class="keywordflow">if</span> len(extra) > 0:</div>
+<div class="line"><a name="l00111"></a><span class="lineno">  111</span>             commands.append(extra)</div>
+<div class="line"><a name="l00112"></a><span class="lineno">  112</span> </div>
+<div class="line"><a name="l00113"></a><span class="lineno">  113</span>         pktoolsUtils.runpktools(commands, progress)</div>
+<div class="ttc" id="classqgis_1_1pktools_1_1pksetmask_1_1pksetmask_html_ac40b33e07c5ee97c23a151a66df84689"><div class="ttname"><a href="classqgis_1_1pktools_1_1pksetmask_1_1pksetmask.html#ac40b33e07c5ee97c23a151a66df84689">qgis.pktools.pksetmask.pksetmask.MASK</a></div><div class="ttdeci">string MASK</div><div class="ttdef"><b>Definition:</b> <a href="pktools_2pksetmask_8py_source.html#l00041">pksetmask.py:41</a></div></div>
+<div class="ttc" id="classqgis_1_1pktools_1_1pksetmask_1_1pksetmask_html_a8e87715eedd9a7165b00d55d02833569"><div class="ttname"><a href="classqgis_1_1pktools_1_1pksetmask_1_1pksetmask.html#a8e87715eedd9a7165b00d55d02833569">qgis.pktools.pksetmask.pksetmask.INPUT</a></div><div class="ttdeci">string INPUT</div><div class="ttdef"><b>Definition:</b> <a href="pktools_2pksetmask_8py_source.html#l00040">pksetmask.py:40</a></div></div>
+<div class="ttc" id="classqgis_1_1pktools_1_1pksetmask_1_1pksetmask_html"><div class="ttname"><a href="classqgis_1_1pktools_1_1pksetmask_1_1pksetmask.html">qgis.pktools.pksetmask.pksetmask</a></div><div class="ttdef"><b>Definition:</b> <a href="pktools_2pksetmask_8py_source.html#l00038">pksetmask.py:38</a></div></div>
+<div class="ttc" id="classqgis_1_1pktools_1_1pksetmask_1_1pksetmask_html_ace691beff7bf0d303e8fee5efde7b265"><div class="ttname"><a href="classqgis_1_1pktools_1_1pksetmask_1_1pksetmask.html#ace691beff7bf0d303e8fee5efde7b265">qgis.pktools.pksetmask.pksetmask.MSKBAND</a></div><div class="ttdeci">string MSKBAND</div><div class="ttdef"><b>Definition:</b> <a href="pktools_2pksetmask_8py_source.html#l00043">pksetmask.py:43</a></div></div>
+<div class="ttc" id="classqgis_1_1pktools_1_1pksetmask_1_1pksetmask_html_a9e6a013c1e4fb1d7a17be4c55e414a21"><div class="ttname"><a href="classqgis_1_1pktools_1_1pksetmask_1_1pksetmask.html#a9e6a013c1e4fb1d7a17be4c55e414a21">qgis.pktools.pksetmask.pksetmask.TYPE</a></div><div class="ttdeci">list TYPE</div><div class="ttdef"><b>Definition:</b> <a href="pktools_2pksetmask_8py_source.html#l00049">pksetmask.py:49</a></div></div>
+<div class="ttc" id="classqgis_1_1pktools_1_1pksetmask_1_1pksetmask_html_a73bb29985c2a59680763c0037397739e"><div class="ttname"><a href="classqgis_1_1pktools_1_1pksetmask_1_1pksetmask.html#a73bb29985c2a59680763c0037397739e">qgis.pktools.pksetmask.pksetmask.OPERATOR</a></div><div class="ttdeci">string OPERATOR</div><div class="ttdef"><b>Definition:</b> <a href="pktools_2pksetmask_8py_source.html#l00045">pksetmask.py:45</a></div></div>
+<div class="ttc" id="classqgis_1_1pktools_1_1pksetmask_1_1pksetmask_html_a24c98153680e1de66746fd52785ae784"><div class="ttname"><a href="classqgis_1_1pktools_1_1pksetmask_1_1pksetmask.html#a24c98153680e1de66746fd52785ae784">qgis.pktools.pksetmask.pksetmask.NODATA</a></div><div class="ttdeci">string NODATA</div><div class="ttdef"><b>Definition:</b> <a href="pktools_2pksetmask_8py_source.html#l00046">pksetmask.py:46</a></div></div>
+<div class="ttc" id="classqgis_1_1pktools_1_1pksetmask_1_1pksetmask_html_a7844f283b29ff1eab06a928d703b1628"><div class="ttname"><a href="classqgis_1_1pktools_1_1pksetmask_1_1pksetmask.html#a7844f283b29ff1eab06a928d703b1628">qgis.pktools.pksetmask.pksetmask.EXTRA</a></div><div class="ttdeci">string EXTRA</div><div class="ttdef"><b>Definition:</b> <a href="pktools_2pksetmask_8py_source.html#l00050">pksetmask.py:50</a></div></div>
+<div class="ttc" id="classqgis_1_1pktools_1_1pksetmask_1_1pksetmask_html_a25ebf3b8fa56e16e2dfa077434ee4419"><div class="ttname"><a href="classqgis_1_1pktools_1_1pksetmask_1_1pksetmask.html#a25ebf3b8fa56e16e2dfa077434ee4419">qgis.pktools.pksetmask.pksetmask.cliName</a></div><div class="ttdeci">def cliName</div><div class="ttdef"><b>Definition:</b> <a href="pktools_2pksetmask_8py_source.html#l00052">pksetmask.py:52</a></div></div>
+<div class="ttc" id="classqgis_1_1pktools_1_1pksetmask_1_1pksetmask_html_ae1d2501517fe54bab01bb8d797582e84"><div class="ttname"><a href="classqgis_1_1pktools_1_1pksetmask_1_1pksetmask.html#ae1d2501517fe54bab01bb8d797582e84">qgis.pktools.pksetmask.pksetmask.group</a></div><div class="ttdeci">group</div><div class="ttdef"><b>Definition:</b> <a href="pktools_2pksetmask_8py_source.html#l00057">pksetmask.py:57</a></div></div>
+<div class="ttc" id="classqgis_1_1pktools_1_1pksetmask_1_1pksetmask_html_a0c7a9177b36c398a267bf8de262516eb"><div class="ttname"><a href="classqgis_1_1pktools_1_1pksetmask_1_1pksetmask.html#a0c7a9177b36c398a267bf8de262516eb">qgis.pktools.pksetmask.pksetmask.name</a></div><div class="ttdeci">name</div><div class="ttdef"><b>Definition:</b> <a href="pktools_2pksetmask_8py_source.html#l00056">pksetmask.py:56</a></div></div>
+<div class="ttc" id="classqgis_1_1pktools_1_1pksetmask_1_1pksetmask_html_a51a45aa30286d2a9ff7810da37e28aae"><div class="ttname"><a href="classqgis_1_1pktools_1_1pksetmask_1_1pksetmask.html#a51a45aa30286d2a9ff7810da37e28aae">qgis.pktools.pksetmask.pksetmask.OPERATOR_OPTIONS</a></div><div class="ttdeci">list OPERATOR_OPTIONS</div><div class="ttdef"><b>Definition:</b> <a href="pktools_2pksetmask_8py_source.html#l00044">pksetmask.py:44</a></div></div>
+<div class="ttc" id="classqgis_1_1pktools_1_1pksetmask_1_1pksetmask_html_aebbb05f08af1f26f4bdab58e4765f0f4"><div class="ttname"><a href="classqgis_1_1pktools_1_1pksetmask_1_1pksetmask.html#aebbb05f08af1f26f4bdab58e4765f0f4">qgis.pktools.pksetmask.pksetmask.RTYPE</a></div><div class="ttdeci">string RTYPE</div><div class="ttdef"><b>Definition:</b> <a href="pktools_2pksetmask_8py_source.html#l00048">pksetmask.py:48</a></div></div>
+<div class="ttc" id="classqgis_1_1pktools_1_1pksetmask_1_1pksetmask_html_a5883cf4f62435f304fdadd16b2cffc7b"><div class="ttname"><a href="classqgis_1_1pktools_1_1pksetmask_1_1pksetmask.html#a5883cf4f62435f304fdadd16b2cffc7b">qgis.pktools.pksetmask.pksetmask.OUTPUT</a></div><div class="ttdeci">string OUTPUT</div><div class="ttdef"><b>Definition:</b> <a href="pktools_2pksetmask_8py_source.html#l00047">pksetmask.py:47</a></div></div>
+<div class="ttc" id="classqgis_1_1pktools_1_1pksetmask_1_1pksetmask_html_a9b66ea21c12be4ad78c2ca6cff1f43f9"><div class="ttname"><a href="classqgis_1_1pktools_1_1pksetmask_1_1pksetmask.html#a9b66ea21c12be4ad78c2ca6cff1f43f9">qgis.pktools.pksetmask.pksetmask.MSKNODATA</a></div><div class="ttdeci">string MSKNODATA</div><div class="ttdef"><b>Definition:</b> <a href="pktools_2pksetmask_8py_source.html#l00042">pksetmask.py:42</a></div></div>
 </div><!-- fragment --></div><!-- contents -->
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Jun 23 2015 17:09:36 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Tue Nov 3 2015 15:58:26 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/pksvm_8py_source.html b/doc/html/pktools_2pksvm_8py_source.html
similarity index 68%
copy from doc/html/pksvm_8py_source.html
copy to doc/html/pktools_2pksvm_8py_source.html
index 97ffab4..71941aa 100644
--- a/doc/html/pksvm_8py_source.html
+++ b/doc/html/pktools_2pksvm_8py_source.html
@@ -4,7 +4,7 @@
 <meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
 <meta http-equiv="X-UA-Compatible" content="IE=9"/>
 <meta name="generator" content="Doxygen 1.8.6"/>
-<title>pktools: /home/kempenep/pktools/qgis/pksvm.py Source File</title>
+<title>pktools: /home/kempenep/pktools/qgis/pktools/pksvm.py Source File</title>
 <link href="tabs.css" rel="stylesheet" type="text/css"/>
 <script type="text/javascript" src="jquery.js"></script>
 <script type="text/javascript" src="dynsections.js"></script>
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.3</span>
+    <span id="projectnumber">2.6.4</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -44,7 +44,7 @@
   </div>
 <div id="nav-path" class="navpath">
   <ul>
-<li class="navelem"><a class="el" href="dir_5785acc8d2e42f8795bdbe936856f26d.html">qgis</a></li>  </ul>
+<li class="navelem"><a class="el" href="dir_5785acc8d2e42f8795bdbe936856f26d.html">qgis</a></li><li class="navelem"><a class="el" href="dir_b7cc22b4453454f1e686d9a2e78d988d.html">pktools</a></li>  </ul>
 </div>
 </div><!-- top -->
 <div class="header">
@@ -90,7 +90,7 @@
 <div class="line"><a name="l00036"></a><span class="lineno">   36</span> <span class="keyword">from</span> processing.core.parameters <span class="keyword">import</span> ParameterBoolean</div>
 <div class="line"><a name="l00037"></a><span class="lineno">   37</span> <span class="keyword">from</span> processing.core.parameters <span class="keyword">import</span> ParameterExtent</div>
 <div class="line"><a name="l00038"></a><span class="lineno">   38</span> </div>
-<div class="line"><a name="l00039"></a><span class="lineno"><a class="line" href="classqgis_1_1pksvm_1_1pksvm.html">   39</a></span> <span class="keyword">class </span><a class="code" href="classqgis_1_1pksvm_1_1pksvm.html">pksvm</a>(pktoolsAlgorithm):</div>
+<div class="line"><a name="l00039"></a><span class="lineno"><a class="line" href="classqgis_1_1pktools_1_1pksvm_1_1pksvm.html">   39</a></span> <span class="keyword">class </span><a class="code" href="classqgis_1_1pktools_1_1pksvm_1_1pksvm.html">pksvm</a>(pktoolsAlgorithm):</div>
 <div class="line"><a name="l00040"></a><span class="lineno">   40</span> </div>
 <div class="line"><a name="l00041"></a><span class="lineno">   41</span>     INPUT = <span class="stringliteral">"INPUT"</span></div>
 <div class="line"><a name="l00042"></a><span class="lineno">   42</span>     TRAINING = <span class="stringliteral">"TRAINING"</span></div>
@@ -112,37 +112,37 @@
 <div class="line"><a name="l00058"></a><span class="lineno">   58</span>         <span class="keywordflow">return</span> <span class="stringliteral">"pksvm"</span></div>
 <div class="line"><a name="l00059"></a><span class="lineno">   59</span> </div>
 <div class="line"><a name="l00060"></a><span class="lineno">   60</span>     <span class="keyword">def </span>defineCharacteristics(self):</div>
-<div class="line"><a name="l00061"></a><span class="lineno">   61</span>         self.<a class="code" href="classqgis_1_1pksvm_1_1pksvm.html#aa5c7d4dda4c1b0316e26dfb3c8f4cf8f">name</a> = <span class="stringliteral">"Support vector machine"</span></div>
-<div class="line"><a name="l00062"></a><span class="lineno">   62</span>         self.<a class="code" href="classqgis_1_1pksvm_1_1pksvm.html#a33cc5cc741eadc78c3fa6687592cd810">group</a> = <span class="stringliteral">"[pktools] supervised classification"</span></div>
-<div class="line"><a name="l00063"></a><span class="lineno">   63</span>         self.addParameter(ParameterRaster(self.<a class="code" href="classqgis_1_1pksvm_1_1pksvm.html#a70980660386dbf0e5a4abbaee81b20b7">INPUT</a>, <span class="stringliteral">'Input layer raster data set'</span>,ParameterRaster))</div>
-<div class="line"><a name="l00064"></a><span class="lineno">   64</span>         self.addParameter(ParameterVector(self.<a class="code" href="classqgis_1_1pksvm_1_1pksvm.html#a52e9137080458d2fa51683e03d046418">TRAINING</a>, <span class="stringliteral">'Training vector file.'</span>))</div>
-<div class="line"><a name="l00065"></a><span class="lineno">   65</span>         self.addParameter(ParameterBoolean(self.<a class="code" href="classqgis_1_1pksvm_1_1pksvm.html#a655f6139a543113d1dd2ad8b11f773b9">ITERATE</a>, <span class="stringliteral">"Iterate over all layers"</span>,<span class="keyword">True</span>))</div>
-<div class="line"><a name="l00066"></a><span class="lineno">   66</span>         self.addParameter(ParameterString(self.<a class="code" href="classqgis_1_1pksvm_1_1pksvm.html#a426fe91136cb5f3e7ebbeba2c4199501">LABEL</a>, <span class="stringliteral">"Attribute name for class label in training vector file"</span>,<span class="stringliteral">"label"</span>))</div>
-<div class="line"><a name="l00067"></a><span class="lineno">   67</span>         self.addParameter(ParameterNumber(self.<a class="code" href="classqgis_1_1pksvm_1_1pksvm.html#ab6c3b8cccb265ca1cfadeaa79fed04a1">GAMMA</a>, <span class="stringliteral">"Gamma in kernel function"</span>,0,100,1.0))</div>
-<div class="line"><a name="l00068"></a><span class="lineno">   68</span>         self.addParameter(ParameterNumber(self.<a class="code" href="classqgis_1_1pksvm_1_1pksvm.html#ab3ec104ab7505d3115c8aa868b4f8cba">COST</a>, <span class="stringliteral">"The parameter C of C_SVC"</span>,0,100000,1000.0))</div>
-<div class="line"><a name="l00069"></a><span class="lineno">   69</span>         self.addParameter(ParameterRaster(self.<a class="code" href="classqgis_1_1pksvm_1_1pksvm.html#a614bbc0b875b73667749b0e58d89fc54">MASK</a>, <span class="stringliteral">"Mask raster dataset"</span>,optional=<span class="keyword">True</span>))</div>
-<div class="line"><a name="l00070"></a><span class="lineno">   70</span>         self.addParameter(ParameterString(self.<a class="code" href="classqgis_1_1pksvm_1_1pksvm.html#a63e8acd9ffce30910af0eed869439190">MSKNODATA</a>, <span class="stringliteral">"Mask value(s) not to consider for classification (e.g., 0;255)"</span>,<span class="stringliteral">"0"</span>))</div>
-<div class="line"><a name="l00071"></a><span class="lineno">   71</span>         self.addOutput(OutputRaster(self.<a class="code" href="classqgis_1_1pksvm_1_1pksvm.html#aeb7332c0838e46bfe82b647cb5085700">OUTPUT</a>, <span class="stringliteral">"Output raster data set"</span>))</div>
-<div class="line"><a name="l00072"></a><span class="lineno">   72</span>         self.addParameter(ParameterString(self.<a class="code" href="classqgis_1_1pksvm_1_1pksvm.html#aead41106feadc1f8d3078aa839df4f79">EXTRA</a>,</div>
+<div class="line"><a name="l00061"></a><span class="lineno">   61</span>         self.<a class="code" href="classqgis_1_1pktools_1_1pksvm_1_1pksvm.html#ac3e6f06386e8ed665adb2168e57e01a8">name</a> = <span class="stringliteral">"Support vector machine"</span></div>
+<div class="line"><a name="l00062"></a><span class="lineno">   62</span>         self.<a class="code" href="classqgis_1_1pktools_1_1pksvm_1_1pksvm.html#aa20dab28c3712708dbd39bf066bfb99c">group</a> = <span class="stringliteral">"[pktools] supervised classification"</span></div>
+<div class="line"><a name="l00063"></a><span class="lineno">   63</span>         self.addParameter(ParameterRaster(self.<a class="code" href="classqgis_1_1pktools_1_1pksvm_1_1pksvm.html#a449dacc23d9df8747a447f46d9f8295e">INPUT</a>, <span class="stringliteral">'Input layer raster data set'</span>,ParameterRaster))</div>
+<div class="line"><a name="l00064"></a><span class="lineno">   64</span>         self.addParameter(ParameterVector(self.<a class="code" href="classqgis_1_1pktools_1_1pksvm_1_1pksvm.html#ac4bd65562ba7f52abb53c6fb35e368ca">TRAINING</a>, <span class="stringliteral">'Training vector file.'</span>))</div>
+<div class="line"><a name="l00065"></a><span class="lineno">   65</span>         self.addParameter(ParameterBoolean(self.<a class="code" href="classqgis_1_1pktools_1_1pksvm_1_1pksvm.html#ae80fe946cdd873ff57e05a3a2ed6131b">ITERATE</a>, <span class="stringliteral">"Iterate over all layers"</span>,<span class="keyword">True</span>))</div>
+<div class="line"><a name="l00066"></a><span class="lineno">   66</span>         self.addParameter(ParameterString(self.<a class="code" href="classqgis_1_1pktools_1_1pksvm_1_1pksvm.html#a8a3efb11fd3716fd738991ec2289e2f1">LABEL</a>, <span class="stringliteral">"Attribute name for class label in training vector file"</span>,<span class="stringliteral">"label"</span>))</div>
+<div class="line"><a name="l00067"></a><span class="lineno">   67</span>         self.addParameter(ParameterNumber(self.<a class="code" href="classqgis_1_1pktools_1_1pksvm_1_1pksvm.html#a5cb924380f4009fa78a99f0e63a98a22">GAMMA</a>, <span class="stringliteral">"Gamma in kernel function"</span>,0,100,1.0))</div>
+<div class="line"><a name="l00068"></a><span class="lineno">   68</span>         self.addParameter(ParameterNumber(self.<a class="code" href="classqgis_1_1pktools_1_1pksvm_1_1pksvm.html#af889c66eadaf2a22a56db24c11b6dc2a">COST</a>, <span class="stringliteral">"The parameter C of C_SVC"</span>,0,100000,1000.0))</div>
+<div class="line"><a name="l00069"></a><span class="lineno">   69</span>         self.addParameter(ParameterRaster(self.<a class="code" href="classqgis_1_1pktools_1_1pksvm_1_1pksvm.html#a749c2182f8ab095d690e08951156f695">MASK</a>, <span class="stringliteral">"Mask raster dataset"</span>,optional=<span class="keyword">True</span>))</div>
+<div class="line"><a name="l00070"></a><span class="lineno">   70</span>         self.addParameter(ParameterString(self.<a class="code" href="classqgis_1_1pktools_1_1pksvm_1_1pksvm.html#a986be02b97ec4cc26f00ea4dd9c878ff">MSKNODATA</a>, <span class="stringliteral">"Mask value(s) not to consider for classification (e.g., 0;255)"</span>,<span class="stringliteral">"0"</span>))</div>
+<div class="line"><a name="l00071"></a><span class="lineno">   71</span>         self.addOutput(OutputRaster(self.<a class="code" href="classqgis_1_1pktools_1_1pksvm_1_1pksvm.html#a81bff218d4c83d0f71a38d81109bd395">OUTPUT</a>, <span class="stringliteral">"Output raster data set"</span>))</div>
+<div class="line"><a name="l00072"></a><span class="lineno">   72</span>         self.addParameter(ParameterString(self.<a class="code" href="classqgis_1_1pktools_1_1pksvm_1_1pksvm.html#aea279cd6acf26d72a740aa6a8149b6fe">EXTRA</a>,</div>
 <div class="line"><a name="l00073"></a><span class="lineno">   73</span>                           <span class="stringliteral">'Additional parameters'</span>, <span class="stringliteral">'-of GTiff'</span>, optional=<span class="keyword">True</span>))</div>
 <div class="line"><a name="l00074"></a><span class="lineno">   74</span> </div>
 <div class="line"><a name="l00075"></a><span class="lineno">   75</span> <span class="comment">#        self.addParameter(ParameterSelection(self.KERNEL_TYPE,"Type of kernel function (linear,polynomial,radial,sigmoid)",self.KERNEL_TYPE_OPTIONS, 2))</span></div>
 <div class="line"><a name="l00076"></a><span class="lineno">   76</span> <span class="comment">#        self.addParameter(ParameterSelection(self.SVM_TYPE,"Type of SVM (C_SVC, nu_SVC,one_class, epsilon_SVR, nu_SVR)",self.SVM_TYPE_OPTIONS, 0))</span></div>
 <div class="line"><a name="l00077"></a><span class="lineno">   77</span> </div>
 <div class="line"><a name="l00078"></a><span class="lineno">   78</span>     <span class="keyword">def </span>processAlgorithm(self, progress):</div>
-<div class="line"><a name="l00079"></a><span class="lineno">   79</span>         cliPath = <span class="stringliteral">'"'</span> + os.path.join(pktoolsUtils.pktoolsPath(), self.<a class="code" href="classqgis_1_1pksvm_1_1pksvm.html#ac0504ade82ce87e0d386db1a50812bf9">cliName</a>()) + <span class="stringliteral">'"'</span></div>
+<div class="line"><a name="l00079"></a><span class="lineno">   79</span>         cliPath = <span class="stringliteral">'"'</span> + os.path.join(pktoolsUtils.pktoolsPath(), self.<a class="code" href="classqgis_1_1pktools_1_1pksvm_1_1pksvm.html#af39f9264502b9f57b573d61861e24061">cliName</a>()) + <span class="stringliteral">'"'</span></div>
 <div class="line"><a name="l00080"></a><span class="lineno">   80</span>         commands = [cliPath]</div>
 <div class="line"><a name="l00081"></a><span class="lineno">   81</span> </div>
-<div class="line"><a name="l00082"></a><span class="lineno">   82</span>         input=self.getParameterValue(self.<a class="code" href="classqgis_1_1pksvm_1_1pksvm.html#a70980660386dbf0e5a4abbaee81b20b7">INPUT</a>)</div>
+<div class="line"><a name="l00082"></a><span class="lineno">   82</span>         input=self.getParameterValue(self.<a class="code" href="classqgis_1_1pktools_1_1pksvm_1_1pksvm.html#a449dacc23d9df8747a447f46d9f8295e">INPUT</a>)</div>
 <div class="line"><a name="l00083"></a><span class="lineno">   83</span>         <span class="keywordflow">if</span> input != <span class="stringliteral">""</span>:</div>
 <div class="line"><a name="l00084"></a><span class="lineno">   84</span>             commands.append(<span class="stringliteral">'-i'</span>)</div>
 <div class="line"><a name="l00085"></a><span class="lineno">   85</span>             commands.append(<span class="stringliteral">'"'</span> + input + <span class="stringliteral">'"'</span>)</div>
 <div class="line"><a name="l00086"></a><span class="lineno">   86</span> </div>
 <div class="line"><a name="l00087"></a><span class="lineno">   87</span>         commands.append(<span class="stringliteral">'-t'</span>)</div>
-<div class="line"><a name="l00088"></a><span class="lineno">   88</span>         training=self.getParameterValue(self.<a class="code" href="classqgis_1_1pksvm_1_1pksvm.html#a52e9137080458d2fa51683e03d046418">TRAINING</a>)</div>
+<div class="line"><a name="l00088"></a><span class="lineno">   88</span>         training=self.getParameterValue(self.<a class="code" href="classqgis_1_1pktools_1_1pksvm_1_1pksvm.html#ac4bd65562ba7f52abb53c6fb35e368ca">TRAINING</a>)</div>
 <div class="line"><a name="l00089"></a><span class="lineno">   89</span> </div>
 <div class="line"><a name="l00090"></a><span class="lineno">   90</span>         if(str(training).find(<span class="stringliteral">'|'</span>)>0):</div>
-<div class="line"><a name="l00091"></a><span class="lineno">   91</span>             <span class="keywordflow">if</span> self.getParameterValue(self.<a class="code" href="classqgis_1_1pksvm_1_1pksvm.html#a655f6139a543113d1dd2ad8b11f773b9">ITERATE</a>):</div>
+<div class="line"><a name="l00091"></a><span class="lineno">   91</span>             <span class="keywordflow">if</span> self.getParameterValue(self.<a class="code" href="classqgis_1_1pktools_1_1pksvm_1_1pksvm.html#ae80fe946cdd873ff57e05a3a2ed6131b">ITERATE</a>):</div>
 <div class="line"><a name="l00092"></a><span class="lineno">   92</span>                 trainingname=str(training)</div>
 <div class="line"><a name="l00093"></a><span class="lineno">   93</span>                 commands.append(trainingname[:trainingname.find(<span class="stringliteral">'|'</span>)])</div>
 <div class="line"><a name="l00094"></a><span class="lineno">   94</span>             <span class="keywordflow">else</span>:</div>
@@ -152,53 +152,53 @@
 <div class="line"><a name="l00098"></a><span class="lineno">   98</span>             commands.append(training)</div>
 <div class="line"><a name="l00099"></a><span class="lineno">   99</span> </div>
 <div class="line"><a name="l00100"></a><span class="lineno">  100</span>         commands.append(<span class="stringliteral">'-label'</span>)</div>
-<div class="line"><a name="l00101"></a><span class="lineno">  101</span>         commands.append(str(self.getParameterValue(self.<a class="code" href="classqgis_1_1pksvm_1_1pksvm.html#a426fe91136cb5f3e7ebbeba2c4199501">LABEL</a>)))</div>
+<div class="line"><a name="l00101"></a><span class="lineno">  101</span>         commands.append(str(self.getParameterValue(self.<a class="code" href="classqgis_1_1pktools_1_1pksvm_1_1pksvm.html#a8a3efb11fd3716fd738991ec2289e2f1">LABEL</a>)))</div>
 <div class="line"><a name="l00102"></a><span class="lineno">  102</span>         <span class="comment"># if self.getParameterValue(self.CV):</span></div>
 <div class="line"><a name="l00103"></a><span class="lineno">  103</span>         <span class="comment">#     commands.append("-cv 2")</span></div>
 <div class="line"><a name="l00104"></a><span class="lineno">  104</span>         commands.append(<span class="stringliteral">'-g'</span>)</div>
-<div class="line"><a name="l00105"></a><span class="lineno">  105</span>         commands.append(str(self.getParameterValue(self.<a class="code" href="classqgis_1_1pksvm_1_1pksvm.html#ab6c3b8cccb265ca1cfadeaa79fed04a1">GAMMA</a>)))</div>
+<div class="line"><a name="l00105"></a><span class="lineno">  105</span>         commands.append(str(self.getParameterValue(self.<a class="code" href="classqgis_1_1pktools_1_1pksvm_1_1pksvm.html#a5cb924380f4009fa78a99f0e63a98a22">GAMMA</a>)))</div>
 <div class="line"><a name="l00106"></a><span class="lineno">  106</span>         commands.append(<span class="stringliteral">'-cc'</span>)</div>
-<div class="line"><a name="l00107"></a><span class="lineno">  107</span>         commands.append(str(self.getParameterValue(self.<a class="code" href="classqgis_1_1pksvm_1_1pksvm.html#ab3ec104ab7505d3115c8aa868b4f8cba">COST</a>)))</div>
+<div class="line"><a name="l00107"></a><span class="lineno">  107</span>         commands.append(str(self.getParameterValue(self.<a class="code" href="classqgis_1_1pktools_1_1pksvm_1_1pksvm.html#af889c66eadaf2a22a56db24c11b6dc2a">COST</a>)))</div>
 <div class="line"><a name="l00108"></a><span class="lineno">  108</span> </div>
-<div class="line"><a name="l00109"></a><span class="lineno">  109</span>         mask = str(self.getParameterValue(self.<a class="code" href="classqgis_1_1pksvm_1_1pksvm.html#a614bbc0b875b73667749b0e58d89fc54">MASK</a>))</div>
+<div class="line"><a name="l00109"></a><span class="lineno">  109</span>         mask = str(self.getParameterValue(self.<a class="code" href="classqgis_1_1pktools_1_1pksvm_1_1pksvm.html#a749c2182f8ab095d690e08951156f695">MASK</a>))</div>
 <div class="line"><a name="l00110"></a><span class="lineno">  110</span>         <span class="keywordflow">if</span> mask != <span class="stringliteral">"None"</span>:</div>
 <div class="line"><a name="l00111"></a><span class="lineno">  111</span>             commands.append(<span class="stringliteral">'-m'</span>)</div>
 <div class="line"><a name="l00112"></a><span class="lineno">  112</span>             commands.append(mask)</div>
-<div class="line"><a name="l00113"></a><span class="lineno">  113</span>             msknodata=str(self.getParameterValue(self.<a class="code" href="classqgis_1_1pksvm_1_1pksvm.html#a63e8acd9ffce30910af0eed869439190">MSKNODATA</a>))</div>
+<div class="line"><a name="l00113"></a><span class="lineno">  113</span>             msknodata=str(self.getParameterValue(self.<a class="code" href="classqgis_1_1pktools_1_1pksvm_1_1pksvm.html#a986be02b97ec4cc26f00ea4dd9c878ff">MSKNODATA</a>))</div>
 <div class="line"><a name="l00114"></a><span class="lineno">  114</span>             msknodataValues = msknodata.split(<span class="stringliteral">';'</span>)</div>
 <div class="line"><a name="l00115"></a><span class="lineno">  115</span>             <span class="keywordflow">for</span> msknodataValue <span class="keywordflow">in</span> msknodataValues:</div>
 <div class="line"><a name="l00116"></a><span class="lineno">  116</span>                 commands.append(<span class="stringliteral">'-msknodata'</span>)</div>
 <div class="line"><a name="l00117"></a><span class="lineno">  117</span>                 commands.append(msknodataValue)</div>
 <div class="line"><a name="l00118"></a><span class="lineno">  118</span>                 </div>
-<div class="line"><a name="l00119"></a><span class="lineno">  119</span>         extra = str(self.getParameterValue(self.<a class="code" href="classqgis_1_1pksvm_1_1pksvm.html#aead41106feadc1f8d3078aa839df4f79">EXTRA</a>))</div>
+<div class="line"><a name="l00119"></a><span class="lineno">  119</span>         extra = str(self.getParameterValue(self.<a class="code" href="classqgis_1_1pktools_1_1pksvm_1_1pksvm.html#aea279cd6acf26d72a740aa6a8149b6fe">EXTRA</a>))</div>
 <div class="line"><a name="l00120"></a><span class="lineno">  120</span>         <span class="keywordflow">if</span> len(extra) > 0:</div>
 <div class="line"><a name="l00121"></a><span class="lineno">  121</span>             commands.append(extra)</div>
 <div class="line"><a name="l00122"></a><span class="lineno">  122</span> </div>
-<div class="line"><a name="l00123"></a><span class="lineno">  123</span>         output=self.getOutputValue(self.<a class="code" href="classqgis_1_1pksvm_1_1pksvm.html#aeb7332c0838e46bfe82b647cb5085700">OUTPUT</a>)</div>
+<div class="line"><a name="l00123"></a><span class="lineno">  123</span>         output=self.getOutputValue(self.<a class="code" href="classqgis_1_1pktools_1_1pksvm_1_1pksvm.html#a81bff218d4c83d0f71a38d81109bd395">OUTPUT</a>)</div>
 <div class="line"><a name="l00124"></a><span class="lineno">  124</span>         <span class="keywordflow">if</span> output != <span class="stringliteral">""</span>:</div>
 <div class="line"><a name="l00125"></a><span class="lineno">  125</span>             commands.append(<span class="stringliteral">'-o'</span>)</div>
 <div class="line"><a name="l00126"></a><span class="lineno">  126</span>             commands.append(<span class="stringliteral">'"'</span> + output + <span class="stringliteral">'"'</span>)</div>
 <div class="line"><a name="l00127"></a><span class="lineno">  127</span> </div>
 <div class="line"><a name="l00128"></a><span class="lineno">  128</span>         pktoolsUtils.runpktools(commands, progress)</div>
-<div class="ttc" id="classqgis_1_1pksvm_1_1pksvm_html_a52e9137080458d2fa51683e03d046418"><div class="ttname"><a href="classqgis_1_1pksvm_1_1pksvm.html#a52e9137080458d2fa51683e03d046418">qgis.pksvm.pksvm.TRAINING</a></div><div class="ttdeci">string TRAINING</div><div class="ttdef"><b>Definition:</b> <a href="pksvm_8py_source.html#l00042">pksvm.py:42</a></div></div>
-<div class="ttc" id="classqgis_1_1pksvm_1_1pksvm_html_aead41106feadc1f8d3078aa839df4f79"><div class="ttname"><a href="classqgis_1_1pksvm_1_1pksvm.html#aead41106feadc1f8d3078aa839df4f79">qgis.pksvm.pksvm.EXTRA</a></div><div class="ttdeci">string EXTRA</div><div class="ttdef"><b>Definition:</b> <a href="pksvm_8py_source.html#l00055">pksvm.py:55</a></div></div>
-<div class="ttc" id="classqgis_1_1pksvm_1_1pksvm_html_a614bbc0b875b73667749b0e58d89fc54"><div class="ttname"><a href="classqgis_1_1pksvm_1_1pksvm.html#a614bbc0b875b73667749b0e58d89fc54">qgis.pksvm.pksvm.MASK</a></div><div class="ttdeci">string MASK</div><div class="ttdef"><b>Definition:</b> <a href="pksvm_8py_source.html#l00049">pksvm.py:49</a></div></div>
-<div class="ttc" id="classqgis_1_1pksvm_1_1pksvm_html_ab6c3b8cccb265ca1cfadeaa79fed04a1"><div class="ttname"><a href="classqgis_1_1pksvm_1_1pksvm.html#ab6c3b8cccb265ca1cfadeaa79fed04a1">qgis.pksvm.pksvm.GAMMA</a></div><div class="ttdeci">string GAMMA</div><div class="ttdef"><b>Definition:</b> <a href="pksvm_8py_source.html#l00046">pksvm.py:46</a></div></div>
-<div class="ttc" id="classqgis_1_1pksvm_1_1pksvm_html_a655f6139a543113d1dd2ad8b11f773b9"><div class="ttname"><a href="classqgis_1_1pksvm_1_1pksvm.html#a655f6139a543113d1dd2ad8b11f773b9">qgis.pksvm.pksvm.ITERATE</a></div><div class="ttdeci">string ITERATE</div><div class="ttdef"><b>Definition:</b> <a href="pksvm_8py_source.html#l00043">pksvm.py:43</a></div></div>
-<div class="ttc" id="classqgis_1_1pksvm_1_1pksvm_html_a63e8acd9ffce30910af0eed869439190"><div class="ttname"><a href="classqgis_1_1pksvm_1_1pksvm.html#a63e8acd9ffce30910af0eed869439190">qgis.pksvm.pksvm.MSKNODATA</a></div><div class="ttdeci">string MSKNODATA</div><div class="ttdef"><b>Definition:</b> <a href="pksvm_8py_source.html#l00050">pksvm.py:50</a></div></div>
-<div class="ttc" id="classqgis_1_1pksvm_1_1pksvm_html_a33cc5cc741eadc78c3fa6687592cd810"><div class="ttname"><a href="classqgis_1_1pksvm_1_1pksvm.html#a33cc5cc741eadc78c3fa6687592cd810">qgis.pksvm.pksvm.group</a></div><div class="ttdeci">group</div><div class="ttdef"><b>Definition:</b> <a href="pksvm_8py_source.html#l00062">pksvm.py:62</a></div></div>
-<div class="ttc" id="classqgis_1_1pksvm_1_1pksvm_html_ab3ec104ab7505d3115c8aa868b4f8cba"><div class="ttname"><a href="classqgis_1_1pksvm_1_1pksvm.html#ab3ec104ab7505d3115c8aa868b4f8cba">qgis.pksvm.pksvm.COST</a></div><div class="ttdeci">string COST</div><div class="ttdef"><b>Definition:</b> <a href="pksvm_8py_source.html#l00047">pksvm.py:47</a></div></div>
-<div class="ttc" id="classqgis_1_1pksvm_1_1pksvm_html_aa5c7d4dda4c1b0316e26dfb3c8f4cf8f"><div class="ttname"><a href="classqgis_1_1pksvm_1_1pksvm.html#aa5c7d4dda4c1b0316e26dfb3c8f4cf8f">qgis.pksvm.pksvm.name</a></div><div class="ttdeci">name</div><div class="ttdef"><b>Definition:</b> <a href="pksvm_8py_source.html#l00061">pksvm.py:61</a></div></div>
-<div class="ttc" id="classqgis_1_1pksvm_1_1pksvm_html_a426fe91136cb5f3e7ebbeba2c4199501"><div class="ttname"><a href="classqgis_1_1pksvm_1_1pksvm.html#a426fe91136cb5f3e7ebbeba2c4199501">qgis.pksvm.pksvm.LABEL</a></div><div class="ttdeci">string LABEL</div><div class="ttdef"><b>Definition:</b> <a href="pksvm_8py_source.html#l00044">pksvm.py:44</a></div></div>
-<div class="ttc" id="classqgis_1_1pksvm_1_1pksvm_html"><div class="ttname"><a href="classqgis_1_1pksvm_1_1pksvm.html">qgis.pksvm.pksvm</a></div><div class="ttdef"><b>Definition:</b> <a href="pksvm_8py_source.html#l00039">pksvm.py:39</a></div></div>
-<div class="ttc" id="classqgis_1_1pksvm_1_1pksvm_html_a70980660386dbf0e5a4abbaee81b20b7"><div class="ttname"><a href="classqgis_1_1pksvm_1_1pksvm.html#a70980660386dbf0e5a4abbaee81b20b7">qgis.pksvm.pksvm.INPUT</a></div><div class="ttdeci">string INPUT</div><div class="ttdef"><b>Definition:</b> <a href="pksvm_8py_source.html#l00041">pksvm.py:41</a></div></div>
-<div class="ttc" id="classqgis_1_1pksvm_1_1pksvm_html_aeb7332c0838e46bfe82b647cb5085700"><div class="ttname"><a href="classqgis_1_1pksvm_1_1pksvm.html#aeb7332c0838e46bfe82b647cb5085700">qgis.pksvm.pksvm.OUTPUT</a></div><div class="ttdeci">string OUTPUT</div><div class="ttdef"><b>Definition:</b> <a href="pksvm_8py_source.html#l00048">pksvm.py:48</a></div></div>
-<div class="ttc" id="classqgis_1_1pksvm_1_1pksvm_html_ac0504ade82ce87e0d386db1a50812bf9"><div class="ttname"><a href="classqgis_1_1pksvm_1_1pksvm.html#ac0504ade82ce87e0d386db1a50812bf9">qgis.pksvm.pksvm.cliName</a></div><div class="ttdeci">def cliName</div><div class="ttdef"><b>Definition:</b> <a href="pksvm_8py_source.html#l00057">pksvm.py:57</a></div></div>
+<div class="ttc" id="classqgis_1_1pktools_1_1pksvm_1_1pksvm_html_af889c66eadaf2a22a56db24c11b6dc2a"><div class="ttname"><a href="classqgis_1_1pktools_1_1pksvm_1_1pksvm.html#af889c66eadaf2a22a56db24c11b6dc2a">qgis.pktools.pksvm.pksvm.COST</a></div><div class="ttdeci">string COST</div><div class="ttdef"><b>Definition:</b> <a href="pktools_2pksvm_8py_source.html#l00047">pksvm.py:47</a></div></div>
+<div class="ttc" id="classqgis_1_1pktools_1_1pksvm_1_1pksvm_html_a81bff218d4c83d0f71a38d81109bd395"><div class="ttname"><a href="classqgis_1_1pktools_1_1pksvm_1_1pksvm.html#a81bff218d4c83d0f71a38d81109bd395">qgis.pktools.pksvm.pksvm.OUTPUT</a></div><div class="ttdeci">string OUTPUT</div><div class="ttdef"><b>Definition:</b> <a href="pktools_2pksvm_8py_source.html#l00048">pksvm.py:48</a></div></div>
+<div class="ttc" id="classqgis_1_1pktools_1_1pksvm_1_1pksvm_html_ac4bd65562ba7f52abb53c6fb35e368ca"><div class="ttname"><a href="classqgis_1_1pktools_1_1pksvm_1_1pksvm.html#ac4bd65562ba7f52abb53c6fb35e368ca">qgis.pktools.pksvm.pksvm.TRAINING</a></div><div class="ttdeci">string TRAINING</div><div class="ttdef"><b>Definition:</b> <a href="pktools_2pksvm_8py_source.html#l00042">pksvm.py:42</a></div></div>
+<div class="ttc" id="classqgis_1_1pktools_1_1pksvm_1_1pksvm_html_a5cb924380f4009fa78a99f0e63a98a22"><div class="ttname"><a href="classqgis_1_1pktools_1_1pksvm_1_1pksvm.html#a5cb924380f4009fa78a99f0e63a98a22">qgis.pktools.pksvm.pksvm.GAMMA</a></div><div class="ttdeci">string GAMMA</div><div class="ttdef"><b>Definition:</b> <a href="pktools_2pksvm_8py_source.html#l00046">pksvm.py:46</a></div></div>
+<div class="ttc" id="classqgis_1_1pktools_1_1pksvm_1_1pksvm_html_aea279cd6acf26d72a740aa6a8149b6fe"><div class="ttname"><a href="classqgis_1_1pktools_1_1pksvm_1_1pksvm.html#aea279cd6acf26d72a740aa6a8149b6fe">qgis.pktools.pksvm.pksvm.EXTRA</a></div><div class="ttdeci">string EXTRA</div><div class="ttdef"><b>Definition:</b> <a href="pktools_2pksvm_8py_source.html#l00055">pksvm.py:55</a></div></div>
+<div class="ttc" id="classqgis_1_1pktools_1_1pksvm_1_1pksvm_html_a8a3efb11fd3716fd738991ec2289e2f1"><div class="ttname"><a href="classqgis_1_1pktools_1_1pksvm_1_1pksvm.html#a8a3efb11fd3716fd738991ec2289e2f1">qgis.pktools.pksvm.pksvm.LABEL</a></div><div class="ttdeci">string LABEL</div><div class="ttdef"><b>Definition:</b> <a href="pktools_2pksvm_8py_source.html#l00044">pksvm.py:44</a></div></div>
+<div class="ttc" id="classqgis_1_1pktools_1_1pksvm_1_1pksvm_html_ac3e6f06386e8ed665adb2168e57e01a8"><div class="ttname"><a href="classqgis_1_1pktools_1_1pksvm_1_1pksvm.html#ac3e6f06386e8ed665adb2168e57e01a8">qgis.pktools.pksvm.pksvm.name</a></div><div class="ttdeci">name</div><div class="ttdef"><b>Definition:</b> <a href="pktools_2pksvm_8py_source.html#l00061">pksvm.py:61</a></div></div>
+<div class="ttc" id="classqgis_1_1pktools_1_1pksvm_1_1pksvm_html_af39f9264502b9f57b573d61861e24061"><div class="ttname"><a href="classqgis_1_1pktools_1_1pksvm_1_1pksvm.html#af39f9264502b9f57b573d61861e24061">qgis.pktools.pksvm.pksvm.cliName</a></div><div class="ttdeci">def cliName</div><div class="ttdef"><b>Definition:</b> <a href="pktools_2pksvm_8py_source.html#l00057">pksvm.py:57</a></div></div>
+<div class="ttc" id="classqgis_1_1pktools_1_1pksvm_1_1pksvm_html"><div class="ttname"><a href="classqgis_1_1pktools_1_1pksvm_1_1pksvm.html">qgis.pktools.pksvm.pksvm</a></div><div class="ttdef"><b>Definition:</b> <a href="pktools_2pksvm_8py_source.html#l00039">pksvm.py:39</a></div></div>
+<div class="ttc" id="classqgis_1_1pktools_1_1pksvm_1_1pksvm_html_aa20dab28c3712708dbd39bf066bfb99c"><div class="ttname"><a href="classqgis_1_1pktools_1_1pksvm_1_1pksvm.html#aa20dab28c3712708dbd39bf066bfb99c">qgis.pktools.pksvm.pksvm.group</a></div><div class="ttdeci">group</div><div class="ttdef"><b>Definition:</b> <a href="pktools_2pksvm_8py_source.html#l00062">pksvm.py:62</a></div></div>
+<div class="ttc" id="classqgis_1_1pktools_1_1pksvm_1_1pksvm_html_a986be02b97ec4cc26f00ea4dd9c878ff"><div class="ttname"><a href="classqgis_1_1pktools_1_1pksvm_1_1pksvm.html#a986be02b97ec4cc26f00ea4dd9c878ff">qgis.pktools.pksvm.pksvm.MSKNODATA</a></div><div class="ttdeci">string MSKNODATA</div><div class="ttdef"><b>Definition:</b> <a href="pktools_2pksvm_8py_source.html#l00050">pksvm.py:50</a></div></div>
+<div class="ttc" id="classqgis_1_1pktools_1_1pksvm_1_1pksvm_html_a449dacc23d9df8747a447f46d9f8295e"><div class="ttname"><a href="classqgis_1_1pktools_1_1pksvm_1_1pksvm.html#a449dacc23d9df8747a447f46d9f8295e">qgis.pktools.pksvm.pksvm.INPUT</a></div><div class="ttdeci">string INPUT</div><div class="ttdef"><b>Definition:</b> <a href="pktools_2pksvm_8py_source.html#l00041">pksvm.py:41</a></div></div>
+<div class="ttc" id="classqgis_1_1pktools_1_1pksvm_1_1pksvm_html_a749c2182f8ab095d690e08951156f695"><div class="ttname"><a href="classqgis_1_1pktools_1_1pksvm_1_1pksvm.html#a749c2182f8ab095d690e08951156f695">qgis.pktools.pksvm.pksvm.MASK</a></div><div class="ttdeci">string MASK</div><div class="ttdef"><b>Definition:</b> <a href="pktools_2pksvm_8py_source.html#l00049">pksvm.py:49</a></div></div>
+<div class="ttc" id="classqgis_1_1pktools_1_1pksvm_1_1pksvm_html_ae80fe946cdd873ff57e05a3a2ed6131b"><div class="ttname"><a href="classqgis_1_1pktools_1_1pksvm_1_1pksvm.html#ae80fe946cdd873ff57e05a3a2ed6131b">qgis.pktools.pksvm.pksvm.ITERATE</a></div><div class="ttdeci">string ITERATE</div><div class="ttdef"><b>Definition:</b> <a href="pktools_2pksvm_8py_source.html#l00043">pksvm.py:43</a></div></div>
 </div><!-- fragment --></div><!-- contents -->
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Jun 23 2015 17:09:36 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Tue Nov 3 2015 15:58:26 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/pktoolsAlgorithmProvider_8py_source.html b/doc/html/pktools_2pktoolsAlgorithmProvider_8py_source.html
similarity index 73%
copy from doc/html/pktoolsAlgorithmProvider_8py_source.html
copy to doc/html/pktools_2pktoolsAlgorithmProvider_8py_source.html
index 33dff5e..91c0ee8 100644
--- a/doc/html/pktoolsAlgorithmProvider_8py_source.html
+++ b/doc/html/pktools_2pktoolsAlgorithmProvider_8py_source.html
@@ -4,7 +4,7 @@
 <meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
 <meta http-equiv="X-UA-Compatible" content="IE=9"/>
 <meta name="generator" content="Doxygen 1.8.6"/>
-<title>pktools: /home/kempenep/pktools/qgis/pktoolsAlgorithmProvider.py Source File</title>
+<title>pktools: /home/kempenep/pktools/qgis/pktools/pktoolsAlgorithmProvider.py Source File</title>
 <link href="tabs.css" rel="stylesheet" type="text/css"/>
 <script type="text/javascript" src="jquery.js"></script>
 <script type="text/javascript" src="dynsections.js"></script>
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.3</span>
+    <span id="projectnumber">2.6.4</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -44,7 +44,7 @@
   </div>
 <div id="nav-path" class="navpath">
   <ul>
-<li class="navelem"><a class="el" href="dir_5785acc8d2e42f8795bdbe936856f26d.html">qgis</a></li>  </ul>
+<li class="navelem"><a class="el" href="dir_5785acc8d2e42f8795bdbe936856f26d.html">qgis</a></li><li class="navelem"><a class="el" href="dir_b7cc22b4453454f1e686d9a2e78d988d.html">pktools</a></li>  </ul>
 </div>
 </div><!-- top -->
 <div class="header">
@@ -106,52 +106,52 @@
 <div class="line"><a name="l00052"></a><span class="lineno">   52</span> <span class="keyword">from</span> pktools.pktoolsUtils <span class="keyword">import</span> pktoolsUtils</div>
 <div class="line"><a name="l00053"></a><span class="lineno">   53</span> </div>
 <div class="line"><a name="l00054"></a><span class="lineno">   54</span> </div>
-<div class="line"><a name="l00055"></a><span class="lineno"><a class="line" href="classqgis_1_1pktoolsAlgorithmProvider_1_1pktoolsAlgorithmProvider.html">   55</a></span> <span class="keyword">class </span><a class="code" href="classqgis_1_1pktoolsAlgorithmProvider_1_1pktoolsAlgorithmProvider.html">pktoolsAlgorithmProvider</a>(AlgorithmProvider):</div>
+<div class="line"><a name="l00055"></a><span class="lineno"><a class="line" href="classqgis_1_1pktools_1_1pktoolsAlgorithmProvider_1_1pktoolsAlgorithmProvider.html">   55</a></span> <span class="keyword">class </span><a class="code" href="classqgis_1_1pktools_1_1pktoolsAlgorithmProvider_1_1pktoolsAlgorithmProvider.html">pktoolsAlgorithmProvider</a>(AlgorithmProvider):</div>
 <div class="line"><a name="l00056"></a><span class="lineno">   56</span> </div>
 <div class="line"><a name="l00057"></a><span class="lineno">   57</span>     MY_DUMMY_SETTING = <span class="stringliteral">"MY_DUMMY_SETTING"</span></div>
 <div class="line"><a name="l00058"></a><span class="lineno">   58</span> </div>
 <div class="line"><a name="l00059"></a><span class="lineno">   59</span>     <span class="keyword">def </span>__init__(self):</div>
 <div class="line"><a name="l00060"></a><span class="lineno">   60</span>         AlgorithmProvider.__init__(self)</div>
 <div class="line"><a name="l00061"></a><span class="lineno">   61</span>         <span class="comment"># deactivate provider by default</span></div>
-<div class="line"><a name="l00062"></a><span class="lineno">   62</span>         self.<a class="code" href="classqgis_1_1pktoolsAlgorithmProvider_1_1pktoolsAlgorithmProvider.html#a431ba8d9bcf8cb86744888c39ce0159e">activate</a> = <span class="keyword">True</span></div>
+<div class="line"><a name="l00062"></a><span class="lineno">   62</span>         self.<a class="code" href="classqgis_1_1pktools_1_1pktoolsAlgorithmProvider_1_1pktoolsAlgorithmProvider.html#a37d8a69b9b2e4f771040c39ec10d54c4">activate</a> = <span class="keyword">True</span></div>
 <div class="line"><a name="l00063"></a><span class="lineno">   63</span>         <span class="comment"># load algorithms</span></div>
 <div class="line"><a name="l00064"></a><span class="lineno">   64</span> <span class="comment">#        self.alglist = [pkinfo()]</span></div>
-<div class="line"><a name="l00065"></a><span class="lineno">   65</span>         self.<a class="code" href="classqgis_1_1pktoolsAlgorithmProvider_1_1pktoolsAlgorithmProvider.html#a18808e0ef41167a503d619e8dcf39c33">alglist</a> = [pkreclass(),pkcrop(),pkcomposite(),pkgetmask(),pksetmask(),pkextract(),pkextract_grid(),pkextract_random(),pksvm(),pkdiff_accuracy(),pklas2img(),pkfilterdem(),pkfilter_spectral(),pkfilter_spatial()]</div>
+<div class="line"><a name="l00065"></a><span class="lineno">   65</span>         self.<a class="code" href="classqgis_1_1pktools_1_1pktoolsAlgorithmProvider_1_1pktoolsAlgorithmProvider.html#ad3d4d7c0de7717299ac1936a24c0e933">alglist</a> = [pkreclass(),pkcrop(),pkcomposite(),pkgetmask(),pksetmask(),pkextract(),pkextract_grid(),pkextract_random(),pksvm(),pkdiff_accuracy(),pklas2img(),pkfilterdem(),pkfilter_spectral(),pkfilter_spatial()]</div>
 <div class="line"><a name="l00066"></a><span class="lineno">   66</span>         <span class="comment"># pktools = [pkinfo()]</span></div>
 <div class="line"><a name="l00067"></a><span class="lineno">   67</span>         <span class="comment"># for alg in pktools:</span></div>
 <div class="line"><a name="l00068"></a><span class="lineno">   68</span>         <span class="comment">#     alg.group = "pktools"</span></div>
 <div class="line"><a name="l00069"></a><span class="lineno">   69</span>         <span class="comment">#     self.alglist.extend(pktools)</span></div>
-<div class="line"><a name="l00070"></a><span class="lineno">   70</span>         <span class="keywordflow">for</span> alg <span class="keywordflow">in</span> self.<a class="code" href="classqgis_1_1pktoolsAlgorithmProvider_1_1pktoolsAlgorithmProvider.html#a18808e0ef41167a503d619e8dcf39c33">alglist</a>:</div>
+<div class="line"><a name="l00070"></a><span class="lineno">   70</span>         <span class="keywordflow">for</span> alg <span class="keywordflow">in</span> self.<a class="code" href="classqgis_1_1pktools_1_1pktoolsAlgorithmProvider_1_1pktoolsAlgorithmProvider.html#ad3d4d7c0de7717299ac1936a24c0e933">alglist</a>:</div>
 <div class="line"><a name="l00071"></a><span class="lineno">   71</span>             alg.provider = self</div>
 <div class="line"><a name="l00072"></a><span class="lineno">   72</span> </div>
-<div class="line"><a name="l00073"></a><span class="lineno"><a class="line" href="classqgis_1_1pktoolsAlgorithmProvider_1_1pktoolsAlgorithmProvider.html#a41cbf8f2612d0ba5e7e858f421e4c344">   73</a></span>     <span class="keyword">def </span><a class="code" href="classqgis_1_1pktoolsAlgorithmProvider_1_1pktoolsAlgorithmProvider.html#a41cbf8f2612d0ba5e7e858f421e4c344">initializeSettings</a>(self):</div>
+<div class="line"><a name="l00073"></a><span class="lineno"><a class="line" href="classqgis_1_1pktools_1_1pktoolsAlgorithmProvider_1_1pktoolsAlgorithmProvider.html#a3c0515d681ec29ab388bc10d2d5cb455">   73</a></span>     <span class="keyword">def </span><a class="code" href="classqgis_1_1pktools_1_1pktoolsAlgorithmProvider_1_1pktoolsAlgorithmProvider.html#a3c0515d681ec29ab388bc10d2d5cb455">initializeSettings</a>(self):</div>
 <div class="line"><a name="l00074"></a><span class="lineno">   74</span>         <span class="stringliteral">'''In this method we add settings needed to configure our provider.</span></div>
 <div class="line"><a name="l00075"></a><span class="lineno">   75</span> <span class="stringliteral">        Do not forget to call the parent method, since it takes care or</span></div>
 <div class="line"><a name="l00076"></a><span class="lineno">   76</span> <span class="stringliteral">        automatically adding a setting for activating or deactivating the</span></div>
 <div class="line"><a name="l00077"></a><span class="lineno">   77</span> <span class="stringliteral">        algorithms in the provider</span></div>
 <div class="line"><a name="l00078"></a><span class="lineno">   78</span> <span class="stringliteral">        '''</span></div>
 <div class="line"><a name="l00079"></a><span class="lineno">   79</span>         AlgorithmProvider.initializeSettings(self)</div>
-<div class="line"><a name="l00080"></a><span class="lineno">   80</span>         ProcessingConfig.addSetting(Setting(self.<a class="code" href="classqgis_1_1pktoolsAlgorithmProvider_1_1pktoolsAlgorithmProvider.html#aa6d4f9562f9502ae7c12e90d0d95d7b1">getDescription</a>(), pktoolsUtils.PKTOOLS_FOLDER, <span class="stringliteral">"pktools folder"</span>, pktoolsUtils.pktoolsPath()))</div>
+<div class="line"><a name="l00080"></a><span class="lineno">   80</span>         ProcessingConfig.addSetting(Setting(self.<a class="code" href="classqgis_1_1pktools_1_1pktoolsAlgorithmProvider_1_1pktoolsAlgorithmProvider.html#a7ccc5c08d6d0d906b57e978657d628c8">getDescription</a>(), pktoolsUtils.PKTOOLS_FOLDER, <span class="stringliteral">"pktools folder"</span>, pktoolsUtils.pktoolsPath()))</div>
 <div class="line"><a name="l00081"></a><span class="lineno">   81</span> </div>
 <div class="line"><a name="l00082"></a><span class="lineno">   82</span> <span class="comment">#        ProcessingConfig.addSetting(Setting("Example algorithms", pktoolsAlgorithmProvider.MY_DUMMY_SETTING, "Example setting", "Default value"))</span></div>
 <div class="line"><a name="l00083"></a><span class="lineno">   83</span>  <span class="comment">#       '''To get the parameter of a setting parameter, use</span></div>
 <div class="line"><a name="l00084"></a><span class="lineno">   84</span> <span class="comment">#        ProcessingConfig.getSetting(name_of_parameter)</span></div>
 <div class="line"><a name="l00085"></a><span class="lineno">   85</span> <span class="comment">#        '''</span></div>
 <div class="line"><a name="l00086"></a><span class="lineno">   86</span> </div>
-<div class="line"><a name="l00087"></a><span class="lineno"><a class="line" href="classqgis_1_1pktoolsAlgorithmProvider_1_1pktoolsAlgorithmProvider.html#a458d5bb02c856ca83d7ca332ff4125aa">   87</a></span>     <span class="keyword">def </span><a class="code" href="classqgis_1_1pktoolsAlgorithmProvider_1_1pktoolsAlgorithmProvider.html#a458d5bb02c856ca83d7ca332ff4125aa">unload</a>(self):</div>
+<div class="line"><a name="l00087"></a><span class="lineno"><a class="line" href="classqgis_1_1pktools_1_1pktoolsAlgorithmProvider_1_1pktoolsAlgorithmProvider.html#a0d55ab57e07e57292f309173cf65114f">   87</a></span>     <span class="keyword">def </span><a class="code" href="classqgis_1_1pktools_1_1pktoolsAlgorithmProvider_1_1pktoolsAlgorithmProvider.html#a0d55ab57e07e57292f309173cf65114f">unload</a>(self):</div>
 <div class="line"><a name="l00088"></a><span class="lineno">   88</span>         <span class="stringliteral">'''Setting should be removed here, so they do not appear anymore</span></div>
 <div class="line"><a name="l00089"></a><span class="lineno">   89</span> <span class="stringliteral">        when the plugin is unloaded'''</span></div>
 <div class="line"><a name="l00090"></a><span class="lineno">   90</span>         AlgorithmProvider.unload(self)</div>
 <div class="line"><a name="l00091"></a><span class="lineno">   91</span>         ProcessingConfig.removeSetting(pktoolsAlgorithmProvider.MY_DUMMY_SETTING)</div>
 <div class="line"><a name="l00092"></a><span class="lineno">   92</span> </div>
-<div class="line"><a name="l00093"></a><span class="lineno"><a class="line" href="classqgis_1_1pktoolsAlgorithmProvider_1_1pktoolsAlgorithmProvider.html#ac0eb1ee881715c3efe5819e23b8ff473">   93</a></span>     <span class="keyword">def </span><a class="code" href="classqgis_1_1pktoolsAlgorithmProvider_1_1pktoolsAlgorithmProvider.html#ac0eb1ee881715c3efe5819e23b8ff473">getName</a>(self):</div>
+<div class="line"><a name="l00093"></a><span class="lineno"><a class="line" href="classqgis_1_1pktools_1_1pktoolsAlgorithmProvider_1_1pktoolsAlgorithmProvider.html#aa1d3118388803531aa5368f90bd0dbce">   93</a></span>     <span class="keyword">def </span><a class="code" href="classqgis_1_1pktools_1_1pktoolsAlgorithmProvider_1_1pktoolsAlgorithmProvider.html#aa1d3118388803531aa5368f90bd0dbce">getName</a>(self):</div>
 <div class="line"><a name="l00094"></a><span class="lineno">   94</span>         <span class="stringliteral">'''This is the name that will appear on the toolbox group.</span></div>
 <div class="line"><a name="l00095"></a><span class="lineno">   95</span> <span class="stringliteral">        It is also used to create the command line name of all the algorithms</span></div>
 <div class="line"><a name="l00096"></a><span class="lineno">   96</span> <span class="stringliteral">        from this provider</span></div>
 <div class="line"><a name="l00097"></a><span class="lineno">   97</span> <span class="stringliteral">        '''</span></div>
 <div class="line"><a name="l00098"></a><span class="lineno">   98</span>         <span class="keywordflow">return</span> <span class="stringliteral">"pktools"</span></div>
 <div class="line"><a name="l00099"></a><span class="lineno">   99</span> </div>
-<div class="line"><a name="l00100"></a><span class="lineno"><a class="line" href="classqgis_1_1pktoolsAlgorithmProvider_1_1pktoolsAlgorithmProvider.html#aa6d4f9562f9502ae7c12e90d0d95d7b1">  100</a></span>     <span class="keyword">def </span><a class="code" href="classqgis_1_1pktoolsAlgorithmProvider_1_1pktoolsAlgorithmProvider.html#aa6d4f9562f9502ae7c12e90d0d95d7b1">getDescription</a>(self):</div>
+<div class="line"><a name="l00100"></a><span class="lineno"><a class="line" href="classqgis_1_1pktools_1_1pktoolsAlgorithmProvider_1_1pktoolsAlgorithmProvider.html#a7ccc5c08d6d0d906b57e978657d628c8">  100</a></span>     <span class="keyword">def </span><a class="code" href="classqgis_1_1pktools_1_1pktoolsAlgorithmProvider_1_1pktoolsAlgorithmProvider.html#a7ccc5c08d6d0d906b57e978657d628c8">getDescription</a>(self):</div>
 <div class="line"><a name="l00101"></a><span class="lineno">  101</span>         <span class="stringliteral">'''This is the provired full name.</span></div>
 <div class="line"><a name="l00102"></a><span class="lineno">  102</span> <span class="stringliteral">        '''</span></div>
 <div class="line"><a name="l00103"></a><span class="lineno">  103</span>         <span class="keywordflow">return</span> <span class="stringliteral">"Utilities for remote sensing image processing"</span></div>
@@ -171,20 +171,20 @@
 <div class="line"><a name="l00117"></a><span class="lineno">  117</span> <span class="stringliteral">        This assignment has to be done in this method even if the list does not change,</span></div>
 <div class="line"><a name="l00118"></a><span class="lineno">  118</span> <span class="stringliteral">        since the self.algs list is cleared before calling this method</span></div>
 <div class="line"><a name="l00119"></a><span class="lineno">  119</span> <span class="stringliteral">        '''</span></div>
-<div class="line"><a name="l00120"></a><span class="lineno">  120</span>         self.<a class="code" href="classqgis_1_1pktoolsAlgorithmProvider_1_1pktoolsAlgorithmProvider.html#ad93cae1d50d4c7fe0d39b40ae0a9f71b">algs</a> = self.<a class="code" href="classqgis_1_1pktoolsAlgorithmProvider_1_1pktoolsAlgorithmProvider.html#a18808e0ef41167a503d619e8dcf39c33">alglist</a></div>
-<div class="ttc" id="classqgis_1_1pktoolsAlgorithmProvider_1_1pktoolsAlgorithmProvider_html_a431ba8d9bcf8cb86744888c39ce0159e"><div class="ttname"><a href="classqgis_1_1pktoolsAlgorithmProvider_1_1pktoolsAlgorithmProvider.html#a431ba8d9bcf8cb86744888c39ce0159e">qgis.pktoolsAlgorithmProvider.pktoolsAlgorithmProvider.activate</a></div><div class="ttdeci">activate</div><div class="ttdef"><b>Definition:</b> <a href="pktoolsAlgorithmProvider_8py_source.html#l00062">pktoolsAlgorithmProvider.py [...]
-<div class="ttc" id="classqgis_1_1pktoolsAlgorithmProvider_1_1pktoolsAlgorithmProvider_html_a41cbf8f2612d0ba5e7e858f421e4c344"><div class="ttname"><a href="classqgis_1_1pktoolsAlgorithmProvider_1_1pktoolsAlgorithmProvider.html#a41cbf8f2612d0ba5e7e858f421e4c344">qgis.pktoolsAlgorithmProvider.pktoolsAlgorithmProvider.initializeSettings</a></div><div class="ttdeci">def initializeSettings</div><div class="ttdef"><b>Definition:</b> <a href="pktoolsAlgorithmProvider_8py_source.html#l00073">pkt [...]
-<div class="ttc" id="classqgis_1_1pktoolsAlgorithmProvider_1_1pktoolsAlgorithmProvider_html_a458d5bb02c856ca83d7ca332ff4125aa"><div class="ttname"><a href="classqgis_1_1pktoolsAlgorithmProvider_1_1pktoolsAlgorithmProvider.html#a458d5bb02c856ca83d7ca332ff4125aa">qgis.pktoolsAlgorithmProvider.pktoolsAlgorithmProvider.unload</a></div><div class="ttdeci">def unload</div><div class="ttdef"><b>Definition:</b> <a href="pktoolsAlgorithmProvider_8py_source.html#l00087">pktoolsAlgorithmProvider.py [...]
-<div class="ttc" id="classqgis_1_1pktoolsAlgorithmProvider_1_1pktoolsAlgorithmProvider_html_a18808e0ef41167a503d619e8dcf39c33"><div class="ttname"><a href="classqgis_1_1pktoolsAlgorithmProvider_1_1pktoolsAlgorithmProvider.html#a18808e0ef41167a503d619e8dcf39c33">qgis.pktoolsAlgorithmProvider.pktoolsAlgorithmProvider.alglist</a></div><div class="ttdeci">alglist</div><div class="ttdef"><b>Definition:</b> <a href="pktoolsAlgorithmProvider_8py_source.html#l00065">pktoolsAlgorithmProvider.py:6 [...]
-<div class="ttc" id="classqgis_1_1pktoolsAlgorithmProvider_1_1pktoolsAlgorithmProvider_html"><div class="ttname"><a href="classqgis_1_1pktoolsAlgorithmProvider_1_1pktoolsAlgorithmProvider.html">qgis.pktoolsAlgorithmProvider.pktoolsAlgorithmProvider</a></div><div class="ttdef"><b>Definition:</b> <a href="pktoolsAlgorithmProvider_8py_source.html#l00055">pktoolsAlgorithmProvider.py:55</a></div></div>
-<div class="ttc" id="classqgis_1_1pktoolsAlgorithmProvider_1_1pktoolsAlgorithmProvider_html_aa6d4f9562f9502ae7c12e90d0d95d7b1"><div class="ttname"><a href="classqgis_1_1pktoolsAlgorithmProvider_1_1pktoolsAlgorithmProvider.html#aa6d4f9562f9502ae7c12e90d0d95d7b1">qgis.pktoolsAlgorithmProvider.pktoolsAlgorithmProvider.getDescription</a></div><div class="ttdeci">def getDescription</div><div class="ttdef"><b>Definition:</b> <a href="pktoolsAlgorithmProvider_8py_source.html#l00100">pktoolsAlgo [...]
-<div class="ttc" id="classqgis_1_1pktoolsAlgorithmProvider_1_1pktoolsAlgorithmProvider_html_ac0eb1ee881715c3efe5819e23b8ff473"><div class="ttname"><a href="classqgis_1_1pktoolsAlgorithmProvider_1_1pktoolsAlgorithmProvider.html#ac0eb1ee881715c3efe5819e23b8ff473">qgis.pktoolsAlgorithmProvider.pktoolsAlgorithmProvider.getName</a></div><div class="ttdeci">def getName</div><div class="ttdef"><b>Definition:</b> <a href="pktoolsAlgorithmProvider_8py_source.html#l00093">pktoolsAlgorithmProvider. [...]
-<div class="ttc" id="classqgis_1_1pktoolsAlgorithmProvider_1_1pktoolsAlgorithmProvider_html_ad93cae1d50d4c7fe0d39b40ae0a9f71b"><div class="ttname"><a href="classqgis_1_1pktoolsAlgorithmProvider_1_1pktoolsAlgorithmProvider.html#ad93cae1d50d4c7fe0d39b40ae0a9f71b">qgis.pktoolsAlgorithmProvider.pktoolsAlgorithmProvider.algs</a></div><div class="ttdeci">algs</div><div class="ttdef"><b>Definition:</b> <a href="pktoolsAlgorithmProvider_8py_source.html#l00120">pktoolsAlgorithmProvider.py:120</a> [...]
+<div class="line"><a name="l00120"></a><span class="lineno">  120</span>         self.<a class="code" href="classqgis_1_1pktools_1_1pktoolsAlgorithmProvider_1_1pktoolsAlgorithmProvider.html#aa9f8de9a8f4bd14a137331a681dbad87">algs</a> = self.<a class="code" href="classqgis_1_1pktools_1_1pktoolsAlgorithmProvider_1_1pktoolsAlgorithmProvider.html#ad3d4d7c0de7717299ac1936a24c0e933">alglist</a></div>
+<div class="ttc" id="classqgis_1_1pktools_1_1pktoolsAlgorithmProvider_1_1pktoolsAlgorithmProvider_html"><div class="ttname"><a href="classqgis_1_1pktools_1_1pktoolsAlgorithmProvider_1_1pktoolsAlgorithmProvider.html">qgis.pktools.pktoolsAlgorithmProvider.pktoolsAlgorithmProvider</a></div><div class="ttdef"><b>Definition:</b> <a href="pktools_2pktoolsAlgorithmProvider_8py_source.html#l00055">pktoolsAlgorithmProvider.py:55</a></div></div>
+<div class="ttc" id="classqgis_1_1pktools_1_1pktoolsAlgorithmProvider_1_1pktoolsAlgorithmProvider_html_aa1d3118388803531aa5368f90bd0dbce"><div class="ttname"><a href="classqgis_1_1pktools_1_1pktoolsAlgorithmProvider_1_1pktoolsAlgorithmProvider.html#aa1d3118388803531aa5368f90bd0dbce">qgis.pktools.pktoolsAlgorithmProvider.pktoolsAlgorithmProvider.getName</a></div><div class="ttdeci">def getName</div><div class="ttdef"><b>Definition:</b> <a href="pktools_2pktoolsAlgorithmProvider_8py_source [...]
+<div class="ttc" id="classqgis_1_1pktools_1_1pktoolsAlgorithmProvider_1_1pktoolsAlgorithmProvider_html_ad3d4d7c0de7717299ac1936a24c0e933"><div class="ttname"><a href="classqgis_1_1pktools_1_1pktoolsAlgorithmProvider_1_1pktoolsAlgorithmProvider.html#ad3d4d7c0de7717299ac1936a24c0e933">qgis.pktools.pktoolsAlgorithmProvider.pktoolsAlgorithmProvider.alglist</a></div><div class="ttdeci">alglist</div><div class="ttdef"><b>Definition:</b> <a href="pktools_2pktoolsAlgorithmProvider_8py_source.htm [...]
+<div class="ttc" id="classqgis_1_1pktools_1_1pktoolsAlgorithmProvider_1_1pktoolsAlgorithmProvider_html_aa9f8de9a8f4bd14a137331a681dbad87"><div class="ttname"><a href="classqgis_1_1pktools_1_1pktoolsAlgorithmProvider_1_1pktoolsAlgorithmProvider.html#aa9f8de9a8f4bd14a137331a681dbad87">qgis.pktools.pktoolsAlgorithmProvider.pktoolsAlgorithmProvider.algs</a></div><div class="ttdeci">algs</div><div class="ttdef"><b>Definition:</b> <a href="pktools_2pktoolsAlgorithmProvider_8py_source.html#l001 [...]
+<div class="ttc" id="classqgis_1_1pktools_1_1pktoolsAlgorithmProvider_1_1pktoolsAlgorithmProvider_html_a3c0515d681ec29ab388bc10d2d5cb455"><div class="ttname"><a href="classqgis_1_1pktools_1_1pktoolsAlgorithmProvider_1_1pktoolsAlgorithmProvider.html#a3c0515d681ec29ab388bc10d2d5cb455">qgis.pktools.pktoolsAlgorithmProvider.pktoolsAlgorithmProvider.initializeSettings</a></div><div class="ttdeci">def initializeSettings</div><div class="ttdef"><b>Definition:</b> <a href="pktools_2pktoolsAlgori [...]
+<div class="ttc" id="classqgis_1_1pktools_1_1pktoolsAlgorithmProvider_1_1pktoolsAlgorithmProvider_html_a7ccc5c08d6d0d906b57e978657d628c8"><div class="ttname"><a href="classqgis_1_1pktools_1_1pktoolsAlgorithmProvider_1_1pktoolsAlgorithmProvider.html#a7ccc5c08d6d0d906b57e978657d628c8">qgis.pktools.pktoolsAlgorithmProvider.pktoolsAlgorithmProvider.getDescription</a></div><div class="ttdeci">def getDescription</div><div class="ttdef"><b>Definition:</b> <a href="pktools_2pktoolsAlgorithmProvi [...]
+<div class="ttc" id="classqgis_1_1pktools_1_1pktoolsAlgorithmProvider_1_1pktoolsAlgorithmProvider_html_a37d8a69b9b2e4f771040c39ec10d54c4"><div class="ttname"><a href="classqgis_1_1pktools_1_1pktoolsAlgorithmProvider_1_1pktoolsAlgorithmProvider.html#a37d8a69b9b2e4f771040c39ec10d54c4">qgis.pktools.pktoolsAlgorithmProvider.pktoolsAlgorithmProvider.activate</a></div><div class="ttdeci">activate</div><div class="ttdef"><b>Definition:</b> <a href="pktools_2pktoolsAlgorithmProvider_8py_source.h [...]
+<div class="ttc" id="classqgis_1_1pktools_1_1pktoolsAlgorithmProvider_1_1pktoolsAlgorithmProvider_html_a0d55ab57e07e57292f309173cf65114f"><div class="ttname"><a href="classqgis_1_1pktools_1_1pktoolsAlgorithmProvider_1_1pktoolsAlgorithmProvider.html#a0d55ab57e07e57292f309173cf65114f">qgis.pktools.pktoolsAlgorithmProvider.pktoolsAlgorithmProvider.unload</a></div><div class="ttdeci">def unload</div><div class="ttdef"><b>Definition:</b> <a href="pktools_2pktoolsAlgorithmProvider_8py_source.h [...]
 </div><!-- fragment --></div><!-- contents -->
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Jun 23 2015 17:09:36 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Tue Nov 3 2015 15:58:26 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/pktoolsAlgorithm_8py_source.html b/doc/html/pktools_2pktoolsAlgorithm_8py_source.html
similarity index 91%
copy from doc/html/pktoolsAlgorithm_8py_source.html
copy to doc/html/pktools_2pktoolsAlgorithm_8py_source.html
index 80f57d2..123e6f0 100644
--- a/doc/html/pktoolsAlgorithm_8py_source.html
+++ b/doc/html/pktools_2pktoolsAlgorithm_8py_source.html
@@ -4,7 +4,7 @@
 <meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
 <meta http-equiv="X-UA-Compatible" content="IE=9"/>
 <meta name="generator" content="Doxygen 1.8.6"/>
-<title>pktools: /home/kempenep/pktools/qgis/pktoolsAlgorithm.py Source File</title>
+<title>pktools: /home/kempenep/pktools/qgis/pktools/pktoolsAlgorithm.py Source File</title>
 <link href="tabs.css" rel="stylesheet" type="text/css"/>
 <script type="text/javascript" src="jquery.js"></script>
 <script type="text/javascript" src="dynsections.js"></script>
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.3</span>
+    <span id="projectnumber">2.6.4</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -44,7 +44,7 @@
   </div>
 <div id="nav-path" class="navpath">
   <ul>
-<li class="navelem"><a class="el" href="dir_5785acc8d2e42f8795bdbe936856f26d.html">qgis</a></li>  </ul>
+<li class="navelem"><a class="el" href="dir_5785acc8d2e42f8795bdbe936856f26d.html">qgis</a></li><li class="navelem"><a class="el" href="dir_b7cc22b4453454f1e686d9a2e78d988d.html">pktools</a></li>  </ul>
 </div>
 </div><!-- top -->
 <div class="header">
@@ -92,7 +92,7 @@
 <div class="line"><a name="l00038"></a><span class="lineno">   38</span> <span class="keyword">from</span> processing.core.outputs <span class="keyword">import</span> OutputRaster</div>
 <div class="line"><a name="l00039"></a><span class="lineno">   39</span> <span class="keyword">from</span> processing.core.outputs <span class="keyword">import</span> OutputVector</div>
 <div class="line"><a name="l00040"></a><span class="lineno">   40</span> </div>
-<div class="line"><a name="l00041"></a><span class="lineno"><a class="line" href="classqgis_1_1pktoolsAlgorithm_1_1pktoolsAlgorithm.html">   41</a></span> <span class="keyword">class </span><a class="code" href="classqgis_1_1pktoolsAlgorithm_1_1pktoolsAlgorithm.html">pktoolsAlgorithm</a>(GeoAlgorithm):</div>
+<div class="line"><a name="l00041"></a><span class="lineno"><a class="line" href="classqgis_1_1pktools_1_1pktoolsAlgorithm_1_1pktoolsAlgorithm.html">   41</a></span> <span class="keyword">class </span><a class="code" href="classqgis_1_1pktools_1_1pktoolsAlgorithm_1_1pktoolsAlgorithm.html">pktoolsAlgorithm</a>(GeoAlgorithm):</div>
 <div class="line"><a name="l00042"></a><span class="lineno">   42</span> </div>
 <div class="line"><a name="l00043"></a><span class="lineno">   43</span>     <span class="keyword">def </span>getIcon(self):</div>
 <div class="line"><a name="l00044"></a><span class="lineno">   44</span>         filepath = os.path.dirname(__file__) + <span class="stringliteral">"/logo.png"</span></div>
@@ -109,12 +109,12 @@
 <div class="line"><a name="l00055"></a><span class="lineno">   55</span> </div>
 <div class="line"><a name="l00056"></a><span class="lineno">   56</span>         helpUrl = <span class="stringliteral">'http://pktools.nongnu.org/html/md_{}.html'</span>.format(self.cliName())</div>
 <div class="line"><a name="l00057"></a><span class="lineno">   57</span>         <span class="keywordflow">return</span> <span class="keyword">False</span>, helpUrl        </div>
-<div class="ttc" id="classqgis_1_1pktoolsAlgorithm_1_1pktoolsAlgorithm_html"><div class="ttname"><a href="classqgis_1_1pktoolsAlgorithm_1_1pktoolsAlgorithm.html">qgis.pktoolsAlgorithm.pktoolsAlgorithm</a></div><div class="ttdef"><b>Definition:</b> <a href="pktoolsAlgorithm_8py_source.html#l00041">pktoolsAlgorithm.py:41</a></div></div>
+<div class="ttc" id="classqgis_1_1pktools_1_1pktoolsAlgorithm_1_1pktoolsAlgorithm_html"><div class="ttname"><a href="classqgis_1_1pktools_1_1pktoolsAlgorithm_1_1pktoolsAlgorithm.html">qgis.pktools.pktoolsAlgorithm.pktoolsAlgorithm</a></div><div class="ttdef"><b>Definition:</b> <a href="pktools_2pktoolsAlgorithm_8py_source.html#l00041">pktoolsAlgorithm.py:41</a></div></div>
 </div><!-- fragment --></div><!-- contents -->
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Jun 23 2015 17:09:36 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Tue Nov 3 2015 15:58:26 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/pktoolsUtils_8py_source.html b/doc/html/pktools_2pktoolsUtils_8py_source.html
similarity index 94%
copy from doc/html/pktoolsUtils_8py_source.html
copy to doc/html/pktools_2pktoolsUtils_8py_source.html
index 8bcc521..6b04b61 100644
--- a/doc/html/pktoolsUtils_8py_source.html
+++ b/doc/html/pktools_2pktoolsUtils_8py_source.html
@@ -4,7 +4,7 @@
 <meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
 <meta http-equiv="X-UA-Compatible" content="IE=9"/>
 <meta name="generator" content="Doxygen 1.8.6"/>
-<title>pktools: /home/kempenep/pktools/qgis/pktoolsUtils.py Source File</title>
+<title>pktools: /home/kempenep/pktools/qgis/pktools/pktoolsUtils.py Source File</title>
 <link href="tabs.css" rel="stylesheet" type="text/css"/>
 <script type="text/javascript" src="jquery.js"></script>
 <script type="text/javascript" src="dynsections.js"></script>
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.3</span>
+    <span id="projectnumber">2.6.4</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -44,7 +44,7 @@
   </div>
 <div id="nav-path" class="navpath">
   <ul>
-<li class="navelem"><a class="el" href="dir_5785acc8d2e42f8795bdbe936856f26d.html">qgis</a></li>  </ul>
+<li class="navelem"><a class="el" href="dir_5785acc8d2e42f8795bdbe936856f26d.html">qgis</a></li><li class="navelem"><a class="el" href="dir_b7cc22b4453454f1e686d9a2e78d988d.html">pktools</a></li>  </ul>
 </div>
 </div><!-- top -->
 <div class="header">
@@ -86,7 +86,7 @@
 <div class="line"><a name="l00032"></a><span class="lineno">   32</span> <span class="keyword">from</span> processing.core.ProcessingConfig <span class="keyword">import</span> ProcessingConfig</div>
 <div class="line"><a name="l00033"></a><span class="lineno">   33</span> <span class="keyword">from</span> processing.tools.system <span class="keyword">import</span> isWindows, isMac, userFolder</div>
 <div class="line"><a name="l00034"></a><span class="lineno">   34</span> </div>
-<div class="line"><a name="l00035"></a><span class="lineno"><a class="line" href="classqgis_1_1pktoolsUtils_1_1pktoolsUtils.html">   35</a></span> <span class="keyword">class </span><a class="code" href="classqgis_1_1pktoolsUtils_1_1pktoolsUtils.html">pktoolsUtils</a>():</div>
+<div class="line"><a name="l00035"></a><span class="lineno"><a class="line" href="classqgis_1_1pktools_1_1pktoolsUtils_1_1pktoolsUtils.html">   35</a></span> <span class="keyword">class </span><a class="code" href="classqgis_1_1pktools_1_1pktoolsUtils_1_1pktoolsUtils.html">pktoolsUtils</a>():</div>
 <div class="line"><a name="l00036"></a><span class="lineno">   36</span> </div>
 <div class="line"><a name="l00037"></a><span class="lineno">   37</span>     PKTOOLS_FOLDER = <span class="stringliteral">"PKTOOLS_FOLDER"</span></div>
 <div class="line"><a name="l00038"></a><span class="lineno">   38</span> </div>
@@ -142,15 +142,15 @@
 <div class="line"><a name="l00088"></a><span class="lineno">   88</span> <span class="comment">#    @staticmethod</span></div>
 <div class="line"><a name="l00089"></a><span class="lineno">   89</span> <span class="comment">#    def getConsoleOutput():</span></div>
 <div class="line"><a name="l00090"></a><span class="lineno">   90</span> <span class="comment">#        return pktoolsUtils.consoleOutput</span></div>
+<div class="ttc" id="classqgis_1_1pktools_1_1pktoolsUtils_1_1pktoolsUtils_html"><div class="ttname"><a href="classqgis_1_1pktools_1_1pktoolsUtils_1_1pktoolsUtils.html">qgis.pktools.pktoolsUtils.pktoolsUtils</a></div><div class="ttdef"><b>Definition:</b> <a href="pktools_2pktoolsUtils_8py_source.html#l00035">pktoolsUtils.py:35</a></div></div>
 <div class="ttc" id="namespacePyQt4_1_1QtCore_html"><div class="ttname"><a href="namespacePyQt4_1_1QtCore.html">QtCore</a></div></div>
 <div class="ttc" id="namespaceqgis_1_1core_html"><div class="ttname"><a href="namespaceqgis_1_1core.html">core</a></div></div>
-<div class="ttc" id="classqgis_1_1pktoolsUtils_1_1pktoolsUtils_html"><div class="ttname"><a href="classqgis_1_1pktoolsUtils_1_1pktoolsUtils.html">qgis.pktoolsUtils.pktoolsUtils</a></div><div class="ttdef"><b>Definition:</b> <a href="pktoolsUtils_8py_source.html#l00035">pktoolsUtils.py:35</a></div></div>
 <div class="ttc" id="namespacePyQt4_1_1QtGui_html"><div class="ttname"><a href="namespacePyQt4_1_1QtGui.html">QtGui</a></div></div>
 </div><!-- fragment --></div><!-- contents -->
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Jun 23 2015 17:09:36 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Tue Nov 3 2015 15:58:26 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/structIndexValue-members.html b/doc/html/structIndexValue-members.html
index 7195ef7..0841284 100644
--- a/doc/html/structIndexValue-members.html
+++ b/doc/html/structIndexValue-members.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.3</span>
+    <span id="projectnumber">2.6.4</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -60,7 +60,7 @@
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Jun 23 2015 17:09:37 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/structIndexValue.html b/doc/html/structIndexValue.html
index b541190..6aacef3 100644
--- a/doc/html/structIndexValue.html
+++ b/doc/html/structIndexValue.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.3</span>
+    <span id="projectnumber">2.6.4</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -74,7 +74,7 @@ double </td><td class="memItemRight" valign="bottom"><b>value</b></td></tr>
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Jun 23 2015 17:09:37 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/structPosValue-members.html b/doc/html/structPosValue-members.html
index 3fb5d8b..d572a2e 100644
--- a/doc/html/structPosValue-members.html
+++ b/doc/html/structPosValue-members.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.3</span>
+    <span id="projectnumber">2.6.4</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -61,7 +61,7 @@
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Jun 23 2015 17:09:37 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/structPosValue.html b/doc/html/structPosValue.html
index 5109d53..2408e68 100644
--- a/doc/html/structPosValue.html
+++ b/doc/html/structPosValue.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.3</span>
+    <span id="projectnumber">2.6.4</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -77,7 +77,7 @@ double </td><td class="memItemRight" valign="bottom"><b>value</b></td></tr>
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Jun 23 2015 17:09:37 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/structSolver_1_1SolutionInfo-members.html b/doc/html/structSolver_1_1SolutionInfo-members.html
index 43e3cc3..655c739 100644
--- a/doc/html/structSolver_1_1SolutionInfo-members.html
+++ b/doc/html/structSolver_1_1SolutionInfo-members.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.3</span>
+    <span id="projectnumber">2.6.4</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -67,7 +67,7 @@
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Jun 23 2015 17:09:37 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/structSolver_1_1SolutionInfo.html b/doc/html/structSolver_1_1SolutionInfo.html
index de4cd67..2cd0428 100644
--- a/doc/html/structSolver_1_1SolutionInfo.html
+++ b/doc/html/structSolver_1_1SolutionInfo.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.3</span>
+    <span id="projectnumber">2.6.4</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -87,7 +87,7 @@ double </td><td class="memItemRight" valign="bottom"><b>r</b></td></tr>
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Jun 23 2015 17:09:37 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/structdecision__function-members.html b/doc/html/structdecision__function-members.html
index 770f269..57d594e 100644
--- a/doc/html/structdecision__function-members.html
+++ b/doc/html/structdecision__function-members.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.3</span>
+    <span id="projectnumber">2.6.4</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -60,7 +60,7 @@
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Jun 23 2015 17:09:37 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/structdecision__function.html b/doc/html/structdecision__function.html
index 120fe5d..43c7ad2 100644
--- a/doc/html/structdecision__function.html
+++ b/doc/html/structdecision__function.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.3</span>
+    <span id="projectnumber">2.6.4</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -74,7 +74,7 @@ double </td><td class="memItemRight" valign="bottom"><b>rho</b></td></tr>
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Jun 23 2015 17:09:37 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/structsvm__model-members.html b/doc/html/structsvm__model-members.html
index c78df08..3626b45 100644
--- a/doc/html/structsvm__model-members.html
+++ b/doc/html/structsvm__model-members.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.3</span>
+    <span id="projectnumber">2.6.4</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -69,7 +69,7 @@
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Jun 23 2015 17:09:37 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/structsvm__model.html b/doc/html/structsvm__model.html
index 86e2bb7..e74b014 100644
--- a/doc/html/structsvm__model.html
+++ b/doc/html/structsvm__model.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.3</span>
+    <span id="projectnumber">2.6.4</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -108,7 +108,7 @@ int </td><td class="memItemRight" valign="bottom"><b>free_sv</b></td></tr>
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Jun 23 2015 17:09:37 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/structsvm__node-members.html b/doc/html/structsvm__node-members.html
index 019d667..288f402 100644
--- a/doc/html/structsvm__node-members.html
+++ b/doc/html/structsvm__node-members.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.3</span>
+    <span id="projectnumber">2.6.4</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -60,7 +60,7 @@
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Jun 23 2015 17:09:37 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/structsvm__node.html b/doc/html/structsvm__node.html
index 3f4d301..d1971ce 100644
--- a/doc/html/structsvm__node.html
+++ b/doc/html/structsvm__node.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.3</span>
+    <span id="projectnumber">2.6.4</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -74,7 +74,7 @@ double </td><td class="memItemRight" valign="bottom"><b>value</b></td></tr>
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Jun 23 2015 17:09:37 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/structsvm__parameter-members.html b/doc/html/structsvm__parameter-members.html
index ad82d19..87a8a17 100644
--- a/doc/html/structsvm__parameter-members.html
+++ b/doc/html/structsvm__parameter-members.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.3</span>
+    <span id="projectnumber">2.6.4</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -74,7 +74,7 @@
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Jun 23 2015 17:09:37 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/structsvm__parameter.html b/doc/html/structsvm__parameter.html
index aeda96f..b08fde9 100644
--- a/doc/html/structsvm__parameter.html
+++ b/doc/html/structsvm__parameter.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.3</span>
+    <span id="projectnumber">2.6.4</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -116,7 +116,7 @@ bool </td><td class="memItemRight" valign="bottom"><b>verbose</b></td></tr>
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Jun 23 2015 17:09:37 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/structsvm__problem-members.html b/doc/html/structsvm__problem-members.html
index d7d908f..0bd48c8 100644
--- a/doc/html/structsvm__problem-members.html
+++ b/doc/html/structsvm__problem-members.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.3</span>
+    <span id="projectnumber">2.6.4</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -61,7 +61,7 @@
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Jun 23 2015 17:09:37 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/structsvm__problem.html b/doc/html/structsvm__problem.html
index 0aa4603..88804bf 100644
--- a/doc/html/structsvm__problem.html
+++ b/doc/html/structsvm__problem.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.3</span>
+    <span id="projectnumber">2.6.4</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -84,7 +84,7 @@ struct <a class="el" href="structsvm__node.html">svm_node</a> ** </td><td c
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Jun 23 2015 17:09:37 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Tue Nov 3 2015 15:58:27 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/svm_8cpp_source.html b/doc/html/svm_8cpp_source.html
index 57865f7..b77afb9 100644
--- a/doc/html/svm_8cpp_source.html
+++ b/doc/html/svm_8cpp_source.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.3</span>
+    <span id="projectnumber">2.6.4</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -3196,7 +3196,7 @@
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Jun 23 2015 17:09:36 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Tue Nov 3 2015 15:58:26 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/svm_8h_source.html b/doc/html/svm_8h_source.html
index b309cf1..fa6300a 100644
--- a/doc/html/svm_8h_source.html
+++ b/doc/html/svm_8h_source.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.3</span>
+    <span id="projectnumber">2.6.4</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -162,7 +162,7 @@
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Jun 23 2015 17:09:36 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Tue Nov 3 2015 15:58:26 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/html/vis__studio_2config_8h_source.html b/doc/html/vis__studio_2config_8h_source.html
index dfab18d..ab2b2be 100644
--- a/doc/html/vis__studio_2config_8h_source.html
+++ b/doc/html/vis__studio_2config_8h_source.html
@@ -19,7 +19,7 @@
   <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
   <td style="padding-left: 0.5em;">
    <div id="projectname">pktools
-    <span id="projectnumber">2.6.3</span>
+    <span id="projectnumber">2.6.4</span>
    </div>
    <div id="projectbrief">Processing Kernel for geospatial data</div>
   </td>
@@ -137,7 +137,7 @@
 <!-- HTML footer for doxygen 1.8.4-->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
-Generated on Tue Jun 23 2015 17:09:36 for pktools by  <a href="http://www.doxygen.org/index.html">
+Generated on Tue Nov 3 2015 15:58:26 for pktools by  <a href="http://www.doxygen.org/index.html">
 <img class="footer" src="doxygen.png" alt="doxygen"/>
 </a> 1.8.6
 </small></address>
diff --git a/doc/installation_plugins.dox b/doc/installation_plugins.dox
new file mode 100644
index 0000000..594a976
--- /dev/null
+++ b/doc/installation_plugins.dox
@@ -0,0 +1,12 @@
+\section qgis_plugin QGIS plugin
+
+A selection of the pktools utiltities can be run from within QGIS, via the Processing Toolbox. 
+
+Make sure pktools is installed on your system first. Then, you can install the pktools Plugin via the QGIS menu:
+
+Plugins, Manage and Install Plugins... 
+
+Then set the appropriate path of the pktools bin folder via Processing Options, Providers, pktools, pktools folder. 
+
+Click OK and open the Processing Toolbox. The pktools utilities should appear when the Advanced interface is selected. 
+
diff --git a/doc/installation_windows.dox b/doc/installation_windows.dox
index 63971ce..7705fa6 100644
--- a/doc/installation_windows.dox
+++ b/doc/installation_windows.dox
@@ -14,11 +14,5 @@ Unzip the archives to your local hard drive.
 
 The pktools utilities can be run from the command line using a command prompt window (from the Start button, click All Programs, Accessories, and then Command Prompt). First add the bin directory extracted from the pktools zip archive to the environment variable PATH (from the Start button, click on  control panel, then System, Advanced system settings, select Environment Variables and edit PATH)
 
-\subsection Installation_windows_qgis QGIS plugin
-
-A selection of the pktools utiltities can be run from within QGIS, via the Processing Toolbox. First install the pktools plugin via Plugins, Manage and Install Plugins... 
-
-Currently, the pktools <a href="http://plugins.qgis.org/plugins/pktools/">plugin</a> is experimental, so do tick the experimental plugins under Settings. Then set the appropriate path of the pktools bin folder via Processing Options, Providers, pktools, pktools folder. Click OK and open the Processing Toolbox. The pktools utilities should appear when the Advanced interface is selected. 
-
 \subsection Uninstall_windows Older versions of pktools
 Please make sure the latest version of pktools is always installed. Changes with respect to the previous versions can be checked in the text file <a href="http://git.savannah.gnu.org/cgit/pktools.git/tree/ChangeLog">Changelog</a>. Older versions of pktools were installed with a setup exe file. They should be uninstalled first via Programs and Features in Control Panel.
diff --git a/doc/mainpage.dox b/doc/mainpage.dox
index eaace10..53ebf46 100644
--- a/doc/mainpage.dox
+++ b/doc/mainpage.dox
@@ -2,9 +2,10 @@
 
    - \ref pktools_introduction "Introduction"
    - \ref pktools_license "License"
-   - \ref pktools_download "Download"
+   - \ref pktools_how_to_get "How te get pktools?"
    - \ref pktools_refer "How to refer"
    - \ref pktools_installation "Installation"
+   - \ref pktools_plugins "Plugins"
    - \ref available_tools "Available Tools"
    - \ref pktools_bugs "Found a bug or need a change?"
 
@@ -25,15 +26,43 @@ pktools is written by Pieter Kempeneers and released under the GNU General Publi
     
 See http://www.gnu.org/licenses for more details
 
-\section pktools_download Download
+\section pktools_how_to_get How to get pktools?
 
-You can <a href="http://download.savannah.gnu.org/releases/pktools/">download</a> the latest release from <a href="https://savannah.nongnu.org/projects/pktools">Savannah</a>
+\subsection pktools_download Download
 
-Or you can get a copy from the Git repository
+You can <a href="http://download.savannah.gnu.org/releases/pktools/">download</a> the latest stable release from <a href="https://savannah.nongnu.org/projects/pktools">Savannah</a>
 
-~~~
+\subsection From the git repository
+
+Get the latest code in development (bleeding edge) from the Git repository:
+
+\code
 git clone git://git.savannah.nongnu.org/pktools.git
-~~~
+\endcode
+
+In a Linux environment, please perform the following actions before following the \ref install_manual "manual installation procedure"
+
+\code
+cd pktools
+\endcode
+
+Add libtool support to your package:
+
+\code
+libtoolize
+\endcode
+
+Remake the GNU Build System files by scanning 'configure.ac' and running 'autoconf', 'autoheader', 'aclocal', 'automake' and 'libtoolize':
+
+\code
+autoreconf
+\endcode
+
+Finalize package generation:
+
+\code
+automake --add-missing
+\endcode
 
 \section pktools_refer How to refer
 
@@ -49,5 +78,9 @@ Installation for \ref installation_linux "Linux"
 
 Installation for \ref installation_windows "Windows"
 
+\section pktools_plugins Plugins
+
+pktools in QGIS via \ref qgis_plugin "plugin"
+
 \section pktools_bugs Bug reports and change requests
 Please write a <a href="https://savannah.nongnu.org/bugs/?func=additem&group=pktools">ticket</a> in savannah to report bugs and request changes. You will automatically be informed about the ticket status and this helps me to keep track of the bugs/changes.
diff --git a/src/algorithms/Filter.cc b/src/algorithms/Filter.cc
index 958c5a0..2faaaf0 100644
--- a/src/algorithms/Filter.cc
+++ b/src/algorithms/Filter.cc
@@ -51,12 +51,16 @@ void filter::Filter::setTaps(const vector<double> &taps, bool normalize)
   assert(m_taps.size()%2);
 }
 
-int filter::Filter::pushNoDataValue(double noDataValue)
-{
+unsigned int filter::Filter::pushNoDataValue(double noDataValue){
   if(find(m_noDataValues.begin(),m_noDataValues.end(),noDataValue)==m_noDataValues.end())
     m_noDataValues.push_back(noDataValue);
-  return(m_noDataValues.size());
-}
+  return m_noDataValues.size();
+};
+
+unsigned int filter::Filter::setNoDataValues(std::vector<double> vnodata){
+  m_noDataValues=vnodata;
+  return m_noDataValues.size();
+};
 
 void filter::Filter::dwtForward(const ImgReaderGdal& input, ImgWriterGdal& output, const std::string& wavelet_type, int family){
   const char* pszMessage;
@@ -424,6 +428,79 @@ void filter::Filter::stat(const ImgReaderGdal& input, ImgWriterGdal& output, con
   }
 }
 
+void filter::Filter::stats(const ImgReaderGdal& input, ImgWriterGdal& output, const vector<std::string>& methods)
+{
+  assert(output.nrOfBand()==methods.size());
+  Vector2d<double> lineInput(input.nrOfBand(),input.nrOfCol());
+  assert(output.nrOfCol()==input.nrOfCol());
+  Vector2d<double> lineOutput(methods.size(),output.nrOfCol());
+  statfactory::StatFactory stat;
+  stat.setNoDataValues(m_noDataValues);
+  const char* pszMessage;
+  void* pProgressArg=NULL;
+  GDALProgressFunc pfnProgress=GDALTermProgress;
+  double progress=0;
+  pfnProgress(progress,pszMessage,pProgressArg);
+  for(int y=0;y<input.nrOfRow();++y){
+    for(int iband=0;iband<input.nrOfBand();++iband)
+      input.readData(lineInput[iband],GDT_Float64,y,iband);
+    vector<double> pixelInput(input.nrOfBand());
+    for(int x=0;x<input.nrOfCol();++x){
+      pixelInput=lineInput.selectCol(x);
+      int ithreshold=0;//threshold to use for percentiles
+      for(int imethod=0;imethod<methods.size();++imethod){
+	switch(getFilterType(methods[imethod])){
+	case(filter::nvalid):
+	  lineOutput[imethod][x]=stat.nvalid(pixelInput);
+	  break;
+	case(filter::median):
+	  lineOutput[imethod][x]=stat.median(pixelInput);
+	  break;
+	case(filter::min):
+	  lineOutput[imethod][x]=stat.mymin(pixelInput);
+	  break;
+	case(filter::max):
+	  lineOutput[imethod][x]=stat.mymax(pixelInput);
+	  break;
+	case(filter::sum):
+	  lineOutput[imethod][x]=stat.sum(pixelInput);
+	  break;
+	case(filter::var):
+	  lineOutput[imethod][x]=stat.var(pixelInput);
+	  break;
+	case(filter::stdev):
+	  lineOutput[imethod][x]=sqrt(stat.var(pixelInput));
+	  break;
+	case(filter::mean):
+	  lineOutput[imethod][x]=stat.mean(pixelInput);
+	  break;
+	case(filter::percentile):{
+	  assert(m_threshold.size());
+	  double threshold=(ithreshold<m_threshold.size())? m_threshold[ithreshold] : m_threshold[0];
+	  lineOutput[imethod][x]=stat.percentile(pixelInput,pixelInput.begin(),pixelInput.end(),threshold);
+	  ++ithreshold;
+	  break;
+	}
+	default:
+	  std::string errorString="method not supported";
+	  throw(errorString);
+	  break;
+	}
+      }
+    }
+    for(int imethod=0;imethod<methods.size();++imethod){
+      try{
+	output.writeData(lineOutput[imethod],GDT_Float64,y,imethod);
+      }
+      catch(string errorstring){
+	cerr << errorstring << "in line " << y << endl;
+      }
+    }
+    progress=(1.0+y)/output.nrOfRow();
+    pfnProgress(progress,pszMessage,pProgressArg);
+  }
+}
+
 void filter::Filter::filter(const ImgReaderGdal& input, ImgWriterGdal& output, const std::string& method, int dim)
 {
   Vector2d<double> lineInput(input.nrOfBand(),input.nrOfCol());
diff --git a/src/algorithms/Filter.h b/src/algorithms/Filter.h
index b4fec9c..6867e77 100644
--- a/src/algorithms/Filter.h
+++ b/src/algorithms/Filter.h
@@ -33,7 +33,7 @@ extern "C" {
 namespace filter
 {
   
-  enum FILTER_TYPE { median=0, var=1 , min=2, max=3, sum=4, mean=5, minmax=6, dilate=7, erode=8, close=9, open=10, homog=11, sobelx=12, sobely=13, sobelxy=14, sobelyx=-14, smooth=15, density=16, mode=17, mixed=18, smoothnodata=19, threshold=20, ismin=21, ismax=22, heterog=23, order=24, stdev=25, dwt=26, dwti=27, dwt_cut=28, dwt_cut_from=29, savgolay=30, percentile=31};
+  enum FILTER_TYPE { median=0, var=1 , min=2, max=3, sum=4, mean=5, minmax=6, dilate=7, erode=8, close=9, open=10, homog=11, sobelx=12, sobely=13, sobelxy=14, sobelyx=-14, smooth=15, density=16, mode=17, mixed=18, smoothnodata=19, threshold=20, ismin=21, ismax=22, heterog=23, order=24, stdev=25, dwt=26, dwti=27, dwt_cut=28, dwt_cut_from=29, savgolay=30, percentile=31, nvalid=32};
 
    enum PADDING { symmetric=0, replicate=1, circular=2, zero=3};
 
@@ -65,7 +65,8 @@ public:
   void setTaps(const std::vector<double> &taps, bool normalize=true);
   void pushClass(short theClass=1){m_class.push_back(theClass);};
   void pushMask(short theMask=0){m_mask.push_back(theMask);};
-  int pushNoDataValue(double noDataValue=0);//{m_mask.push_back(theMask);};
+  unsigned int pushNoDataValue(double noDataValue);
+  unsigned int setNoDataValues(std::vector<double> vnodata);
   void pushThreshold(double theThreshold){m_threshold.push_back(theThreshold);};
   void setThresholds(const std::vector<double>& theThresholds){m_threshold=theThresholds;};
   template<class T> void filter(const std::vector<T>& input, std::vector<T>& output);
@@ -78,6 +79,7 @@ public:
   void morphology(const ImgReaderGdal& input, ImgWriterGdal& output, const std::string& method, int dim, short verbose=0);
   void filter(const ImgReaderGdal& input, ImgWriterGdal& output);
   void stat(const ImgReaderGdal& input, ImgWriterGdal& output, const std::string& method);
+  void stats(const ImgReaderGdal& input, ImgWriterGdal& output, const std::vector<std::string >& methods);
   void filter(const ImgReaderGdal& input, ImgWriterGdal& output, const std::string& method, int dim);
   void getSavGolayCoefficients(std::vector<double> &c, int np, int nl, int nr, int ld, int m);
   void ludcmp(std::vector<double> &a, std::vector<int> &indx, double &d);
@@ -133,6 +135,7 @@ private:
     m_filterMap["ismax"]=filter::ismax;
     m_filterMap["heterog"]=filter::heterog;
     m_filterMap["order"]=filter::order;
+    m_filterMap["nvalid"]=filter::nvalid;
     m_filterMap["median"]=filter::median;
     m_filterMap["savgolay"]=filter::savgolay;
     m_filterMap["percentile"]=filter::percentile;
@@ -583,6 +586,9 @@ template<class T> void Filter::filter(const std::vector<T>& input, std::vector<T
     }
 
     switch(getFilterType(method)){
+    case(filter::nvalid):
+      output[i]=stat.nvalid(statBuffer);
+      break;
     case(filter::median):
       output[i]=stat.median(statBuffer);
       break;
@@ -635,6 +641,9 @@ template<class T> void Filter::filter(const std::vector<T>& input, std::vector<T
         statBuffer.push_back(input[i-dim/2+t]);
     }
     switch(getFilterType(method)){
+    case(filter::nvalid):
+      output[i]=stat.nvalid(statBuffer);
+      break;
     case(filter::median):
       output[i]=stat.median(statBuffer);
       break;
@@ -723,6 +732,9 @@ template<class T> void Filter::filter(const std::vector<T>& input, std::vector<T
 	statBuffer.push_back(theValue);
     }
     switch(getFilterType(method)){
+    case(filter::nvalid):
+      output[i]=stat.nvalid(statBuffer);
+      break;
     case(filter::median):
       output[i]=stat.median(statBuffer);
       break;
diff --git a/src/algorithms/Filter2d.cc b/src/algorithms/Filter2d.cc
index 1cdfbf3..d41d102 100644
--- a/src/algorithms/Filter2d.cc
+++ b/src/algorithms/Filter2d.cc
@@ -454,6 +454,9 @@ void filter2d::Filter2d::doit(const ImgReaderGdal& input, ImgWriterGdal& output,
 	  }
         }
         switch(getFilterType(method)){
+        case(filter2d::nvalid):
+	  outBuffer[x/down]=stat.nvalid(windowBuffer);
+          break;
         case(filter2d::median):
           if(windowBuffer.empty())
             outBuffer[x/down]=(m_noDataValues.size())? m_noDataValues[0] : 0;
@@ -545,6 +548,18 @@ void filter2d::Filter2d::doit(const ImgReaderGdal& input, ImgWriterGdal& output,
 	  outBuffer[x/down]=stat.percentile(windowBuffer,windowBuffer.begin(),windowBuffer.end(),m_threshold[0]);
 	  break;
 	}
+        case(filter2d::proportion):{
+	  if(windowBuffer.size()){
+	    double sum=stat.sum(windowBuffer);
+	    if(sum)
+	      outBuffer[x/down]=100.0*windowBuffer[centre]/stat.sum(windowBuffer);
+	    else
+	      outBuffer[x/down]=(m_noDataValues.size())? m_noDataValues[0] : 0;
+	  }
+	  else
+	    outBuffer[x/down]=(m_noDataValues.size())? m_noDataValues[0] : 0;
+          break;
+	}
         case(filter2d::homog):
 	  if(occurrence.size()==1)//all values in window are the same
 	    outBuffer[x/down]=inBuffer[(dimY-1)/2][x];
diff --git a/src/algorithms/Filter2d.h b/src/algorithms/Filter2d.h
index 3b3acb3..5b788be 100644
--- a/src/algorithms/Filter2d.h
+++ b/src/algorithms/Filter2d.h
@@ -58,7 +58,7 @@ extern "C" {
 
 namespace filter2d
 {
-  enum FILTER_TYPE { median=100, var=101 , min=102, max=103, sum=104, mean=105, minmax=106, dilate=107, erode=108, close=109, open=110, homog=111, sobelx=112, sobely=113, sobelxy=114, sobelyx=115, smooth=116, density=117, mode=118, mixed=119, threshold=120, ismin=121, ismax=122, heterog=123, order=124, stdev=125, mrf=126, dwt=127, dwti=128, dwt_cut=129, scramble=130, shift=131, linearfeature=132, smoothnodata=133, countid=134, dwt_cut_from=135, savgolay=136, percentile=137};
+  enum FILTER_TYPE { median=100, var=101 , min=102, max=103, sum=104, mean=105, minmax=106, dilate=107, erode=108, close=109, open=110, homog=111, sobelx=112, sobely=113, sobelxy=114, sobelyx=115, smooth=116, density=117, mode=118, mixed=119, threshold=120, ismin=121, ismax=122, heterog=123, order=124, stdev=125, mrf=126, dwt=127, dwti=128, dwt_cut=129, scramble=130, shift=131, linearfeature=132, smoothnodata=133, countid=134, dwt_cut_from=135, savgolay=136, percentile=137, proportion=13 [...]
 
   enum RESAMPLE { NEAR = 0, BILINEAR = 1, BICUBIC = 2 };//bicubic not supported yet...
   
@@ -132,6 +132,7 @@ private:
   static void initMap(std::map<std::string, FILTER_TYPE>& m_filterMap){
     //initialize selMap
     m_filterMap["median"]=filter2d::median;
+    m_filterMap["nvalid"]=filter2d::nvalid;
     m_filterMap["var"]=filter2d::var;
     m_filterMap["min"]=filter2d::min;
     m_filterMap["max"]=filter2d::max;
@@ -169,6 +170,7 @@ private:
     m_filterMap["countid"]=filter2d::countid;
     m_filterMap["savgolay"]=filter2d::savgolay;
     m_filterMap["percentile"]=filter2d::percentile;
+    m_filterMap["proportion"]=filter2d::proportion;
   }
 
   Vector2d<double> m_taps;
@@ -340,6 +342,9 @@ template<class T1, class T2> void Filter2d::doit(const Vector2d<T1>& inputVector
         }
       }
       switch(getFilterType(method)){
+      case(filter2d::nvalid):
+	outBuffer[x/down]=stat.nvalid(windowBuffer);
+        break;
       case(filter2d::median):
         if(windowBuffer.empty())
           outBuffer[x/down]=noDataValue;
@@ -431,6 +436,15 @@ template<class T1, class T2> void Filter2d::doit(const Vector2d<T1>& inputVector
         outBuffer[x/down]=stat.percentile(windowBuffer,windowBuffer.begin(),windowBuffer.end(),m_threshold[0]);
         break;
       }
+      case(filter2d::proportion):{
+	assert(m_threshold.size());
+	double sum=stat.sum(windowBuffer);
+	if(sum)
+	  outBuffer[x/down]=windowBuffer[centre]/sum;
+	else
+	  outBuffer[x/down]=noDataValue;
+        break;
+      }
       case(filter2d::homog):
         if(occurrence.size()==1)//all values in window must be the same
           outBuffer[x/down]=inBuffer[(dimY-1)/2][x];
diff --git a/src/algorithms/StatFactory.h b/src/algorithms/StatFactory.h
index 07a9577..03ef699 100644
--- a/src/algorithms/StatFactory.h
+++ b/src/algorithms/StatFactory.h
@@ -158,6 +158,7 @@ public:
   template<class T> T sum(const std::vector<T>& v) const;
   template<class T> double mean(const std::vector<T>& v) const;
   template<class T> void eraseNoData(std::vector<T>& v) const;
+  template<class T> unsigned int nvalid(const std::vector<T>& v) const;
   template<class T> T median(const std::vector<T>& v) const;
   template<class T> double var(const std::vector<T>& v) const;
   template<class T> double moment(const std::vector<T>& v, int n) const;
@@ -177,6 +178,8 @@ public:
   template<class T> void normalize(const std::vector<T>& input, std::vector<double>& output) const;
   template<class T> void normalize_pct(std::vector<T>& input) const;
   template<class T> double rmse(const std::vector<T>& x, const std::vector<T>& y) const;
+  template<class T> double nrmse(const std::vector<T>& x, const std::vector<T>& y) const;
+  template<class T> double cvrmse(const std::vector<T>& x, const std::vector<T>& y) const;
   template<class T> double correlation(const std::vector<T>& x, const std::vector<T>& y, int delay=0) const;
   //  template<class T> double gsl_correlation(const std::vector<T>& x, const std::vector<T>& y) const;
   template<class T> double gsl_covariance(const std::vector<T>& x, const std::vector<T>& y) const;
@@ -216,12 +219,17 @@ private:
 template<class T> inline typename std::vector<T>::const_iterator StatFactory::mymin(const std::vector<T>& v, typename std::vector<T>::const_iterator begin, typename std::vector<T>::const_iterator end) const
 {
   bool isValid=false;
-  typename std::vector<T>::const_iterator tmpIt=begin;
+  typename std::vector<T>::const_iterator tmpIt;
   for(typename std::vector<T>::const_iterator it = begin; it!=end; ++it){
     if(!isNoData(*it)){
-      isValid=true;
-      if(*tmpIt>*it)
+      if(isValid){
+	if(*tmpIt>*it)
+	  tmpIt=it;
+      }
+      else{
 	tmpIt=it;
+	isValid=true;
+      }
     }
   }
   if(isValid)
@@ -237,12 +245,17 @@ template<class T> inline typename std::vector<T>::const_iterator StatFactory::my
 template<class T> inline typename std::vector<T>::iterator StatFactory::mymin(const std::vector<T>& v, typename std::vector<T>::iterator begin, typename std::vector<T>::iterator end) const
 {
   bool isValid=false;
-  typename std::vector<T>::iterator tmpIt=begin;
+  typename std::vector<T>::iterator tmpIt;
   for (typename std::vector<T>::const_iterator it = begin; it!=end; ++it){
     if(!isNoData(*it)){
-      isValid=true;
-      if(*tmpIt>*it)
+      if(isValid){
+	if(*tmpIt>*it)
+	  tmpIt=it;
+      }
+      else{
 	tmpIt=it;
+	isValid=true;
+      }
     }
   }
   if(isValid)
@@ -258,16 +271,24 @@ template<class T> inline typename std::vector<T>::iterator StatFactory::mymin(co
 template<class T> inline  typename std::vector<T>::const_iterator StatFactory::mymin(const std::vector<T>& v, typename std::vector<T>::const_iterator begin, typename std::vector<T>::const_iterator end, T minConstraint) const
 {
   bool isValid=false;
-  typename std::vector<T>::const_iterator tmpIt=v.end();
+  typename std::vector<T>::const_iterator tmpIt;
   T minValue=minConstraint;
   for (typename std::vector<T>::const_iterator it = begin; it!=end; ++it){
     if(isNoData(*it))
       continue;
-    isValid=true;
-    if((minConstraint<=*it)&&(*it<=minValue)){
+    if(isValid){
+      if((minConstraint<=*it)&&(*it<minValue)){
+	tmpIt=it;
+	minValue=*it;
+      }
+    }
+    else{
+      if(*it<minValue)
+	continue;
       tmpIt=it;
       minValue=*it;
-    }
+      isValid=true;
+    }    
   }
   if(isValid)
     return tmpIt;
@@ -282,16 +303,24 @@ template<class T> inline  typename std::vector<T>::const_iterator StatFactory::m
 template<class T> inline typename std::vector<T>::iterator StatFactory::mymin(const std::vector<T>& v, typename std::vector<T>::iterator begin, typename std::vector<T>::iterator end, T minConstraint) const
 {
   bool isValid=false;
-  typename std::vector<T>::iterator tmpIt=v.end();
+  typename std::vector<T>::iterator tmpIt;
   T minValue=minConstraint;
   for (typename std::vector<T>::const_iterator it = begin; it!=end; ++it){
     if(isNoData(*it))
       continue;
-    isValid=true;
-    if((minConstraint<=*it)&&(*it<=minValue)){
+    if(isValid){
+      if((minConstraint<=*it)&&(*it<minValue)){
+	tmpIt=it;
+	minValue=*it;
+      }
+    }
+    else{
+      if(*it<minConstraint)
+	continue;
       tmpIt=it;
       minValue=*it;
-    }
+      isValid=true;
+    }    
   }
   if(isValid)
     return tmpIt;
@@ -306,13 +335,18 @@ template<class T> inline typename std::vector<T>::iterator StatFactory::mymin(co
 template<class T> inline typename std::vector<T>::const_iterator StatFactory::mymax(const std::vector<T>& v, typename std::vector<T>::const_iterator begin, typename std::vector<T>::const_iterator end) const
 {
   bool isValid=false;
-  typename std::vector<T>::const_iterator tmpIt=begin;
+  typename std::vector<T>::const_iterator tmpIt;
   for (typename std::vector<T>::iterator it = begin; it!=end; ++it){
     if(isNoData(*it))
       continue;
-    isValid=true;
-    if(*tmpIt<*it)
+    if(isValid){
+      if(*tmpIt<*it)
+	tmpIt=it;
+    }
+    else{
       tmpIt=it;
+      isValid=true;
+    }
   }
   if(isValid)
     return tmpIt;
@@ -327,13 +361,18 @@ template<class T> inline typename std::vector<T>::const_iterator StatFactory::my
 template<class T> inline typename std::vector<T>::iterator StatFactory::mymax(const std::vector<T>& v, typename std::vector<T>::iterator begin, typename std::vector<T>::iterator end) const
 {
   bool isValid=false;
-  typename std::vector<T>::iterator tmpIt=begin;
+  typename std::vector<T>::iterator tmpIt;
   for (typename std::vector<T>::iterator it = begin; it!=end; ++it){
     if(isNoData(*it))
       continue;
-    isValid=true;
-    if(*tmpIt<*it)
+    if(isValid){
+      if(*tmpIt<*it)
+	tmpIt=it;
+    }
+    else{
       tmpIt=it;
+      isValid=true;
+    }
   }
   if(isValid)
     return tmpIt;
@@ -344,16 +383,24 @@ template<class T> inline typename std::vector<T>::iterator StatFactory::mymax(co
 template<class T> inline typename std::vector<T>::const_iterator StatFactory::mymax(const std::vector<T>& v, typename std::vector<T>::const_iterator begin, typename std::vector<T>::const_iterator end, T maxConstraint) const
 {
   bool isValid=false;
-  typename std::vector<T>::const_iterator tmpIt=v.end();
+  typename std::vector<T>::const_iterator tmpIt;
   T maxValue=maxConstraint;
   for (typename std::vector<T>::const_iterator it = begin; it!=end; ++it){
     if(isNoData(*it))
       continue;
-    isValid=true;
-    if((maxValue<=*it)&&(*it<=maxConstraint)){
+    if(isValid){
+      if((maxConstraint>=*it)&&(*it>maxValue)){
+	tmpIt=it;
+	maxValue=*it;
+      }
+    }
+    else{
+      if(*it>maxConstraint)
+	continue;
       tmpIt=it;
       maxValue=*it;
-    }
+      isValid=true;
+    }    
   }
   if(isValid)
     return tmpIt;
@@ -369,11 +416,19 @@ template<class T> inline typename std::vector<T>::iterator StatFactory::mymax(co
   for (typename std::vector<T>::const_iterator it = begin; it!=end; ++it){
     if(isNoData(*it))
       continue;
-    isValid=true;
-    if((maxValue<=*it)&&(*it<=maxConstraint)){
+    if(isValid){
+      if((maxConstraint>=*it)&&(*it>maxValue)){
+	tmpIt=it;
+	maxValue=*it;
+      }
+    }
+    else{
+      if(*it>maxValue)
+	continue;
       tmpIt=it;
       maxValue=*it;
-    }
+      isValid=true;
+    }    
   }
   if(isValid)
     return tmpIt;
@@ -388,13 +443,18 @@ template<class T> inline T StatFactory::mymin(const std::vector<T>& v) const
     std::string errorString="Error: vector is empty";
     throw(errorString);
   }
-  T minValue=*(v.begin());
+  T minValue;
   for (typename std::vector<T>::const_iterator it = v.begin(); it!=v.end(); ++it){
     if(isNoData(*it))
       continue;
-    isValid=true;
-    if(minValue>*it)
+    if(isValid){
+      if(minValue>*it)
+      minValue=*it;
+    }
+    else{
       minValue=*it;
+      isValid=true;
+    }
   }
   if(isValid)
     return minValue;
@@ -413,9 +473,16 @@ template<class T> inline T StatFactory::mymin(const std::vector<T>& v) const
   for (typename std::vector<T>::const_iterator it = v.begin(); it!=v.end(); ++it){
     if(isNoData(*it))
       continue;
-    isValid=true;
-    if((minConstraint<=*it)&&(*it<=minValue))
+    if(isValid){
+      if((minConstraint<=*it)&&(*it<minValue))
+	minValue=*it;
+    }
+    else{
+      if(*it<minValue)
+	continue;
       minValue=*it;
+      isValid=true;
+    }    
   }
   if(isValid)
     return minValue;
@@ -434,13 +501,18 @@ template<class T> inline T StatFactory::mymax(const std::vector<T>& v) const
     std::string errorString="Error: vector is empty";
     throw(errorString);
   }
-  T maxValue=*(v.begin());
+  T maxValue;
   for (typename std::vector<T>::const_iterator it = v.begin(); it!=v.end(); ++it){
     if(isNoData(*it))
       continue;
-    isValid=true;
-    if(maxValue<*it)
+    if(isValid){
+      if(maxValue<*it)
+      maxValue=*it;
+    }
+    else{
       maxValue=*it;
+      isValid=true;
+    }
   }
   if(isValid)
     return maxValue;
@@ -459,8 +531,16 @@ template<class T> inline T StatFactory::mymax(const std::vector<T>& v, T maxCons
   for (typename std::vector<T>::const_iterator it = v.begin(); it!=v.end(); ++it){
     if(isNoData(*it))
       continue;
-    if((maxValue<=*it)&&(*it<=maxConstraint))
+    if(isValid){
+      if((*it<=maxConstraint)&&(*it>maxValue))
       maxValue=*it;
+    }
+    else{
+      if(*it>maxValue)
+	continue;
+      maxValue=*it;
+      isValid=true;
+    }
   }
   if(isValid)
     return maxValue;
@@ -475,13 +555,18 @@ template<class T> inline T StatFactory::mymax(const std::vector<T>& v, T maxCons
 template<class T> inline typename std::vector<T>::const_iterator StatFactory::absmax(const std::vector<T>& v, typename std::vector<T>::const_iterator begin, typename std::vector<T>::const_iterator end) const
 {
   bool isValid=false;
-  typename std::vector<T>::const_iterator tmpIt=begin;
+  typename std::vector<T>::const_iterator tmpIt;
   for (typename std::vector<T>::const_iterator it = begin; it!=end; ++it){
     if(isNoData(*it))
       continue;
-    isValid=true;
-    if(abs(*tmpIt)<abs(*it))
+    if(isValid){
+      if(abs(*tmpIt)<abs(*it))
+	tmpIt=it;
+    }
+    else{
       tmpIt=it;
+      isValid=true;
+    }
   }
   if(isValid)
     return tmpIt;
@@ -492,13 +577,18 @@ template<class T> inline typename std::vector<T>::const_iterator StatFactory::ab
 template<class T> inline typename std::vector<T>::const_iterator StatFactory::absmin(const std::vector<T>& v, typename std::vector<T>::const_iterator begin, typename std::vector<T>::const_iterator end) const
 {
   bool isValid=false;
-  typename std::vector<T>::const_iterator tmpIt=begin;
+  typename std::vector<T>::const_iterator tmpIt;
   for (typename std::vector<T>::const_iterator it = begin; it!=end; ++it){
     if(isNoData(*it))
       continue;
-    isValid=true;
-    if(abs(*tmpIt)>abs(*it))
+    if(isValid){
+      if(abs(*tmpIt)>abs(*it))
+	tmpIt=it;
+    }
+    else{
       tmpIt=it;
+      isValid=true;
+    }
   }
   if(isValid)
     return tmpIt;
@@ -508,17 +598,36 @@ template<class T> inline typename std::vector<T>::const_iterator StatFactory::ab
 
 template<class T> inline void StatFactory::minmax(const std::vector<T>& v, typename std::vector<T>::const_iterator begin, typename std::vector<T>::const_iterator end, T& theMin, T& theMax) const
 {
+  bool isConstraint=(theMax>theMin);
+  double minConstraint=theMin;
+  double maxConstraint=theMax;
   bool isValid=false;
-  theMin=*begin;
-  theMax=*begin;
   for (typename std::vector<T>::const_iterator it = begin; it!=end; ++it){
     if(isNoData(*it))
       continue;
-    isValid=true;
-    if(theMin>*it)
+    if(isValid){
+      if(isConstraint){
+	if(*it<minConstraint)
+	  continue;
+	if(*it>maxConstraint)
+	  continue;
+      }
+      if(*it<theMin)
+	theMin=*it;
+      if(*it>theMax)
+	theMax=*it;
+    }
+    else{
+      if(isConstraint){
+	if(*it<minConstraint)
+	  continue;
+	if(*it>maxConstraint)
+	  continue;
+      }
       theMin=*it;
-    if(theMax<*it)
       theMax=*it;
+      isValid=true;
+    }
   }
   if(!isValid){
     if(m_noDataValues.size()){
@@ -587,6 +696,12 @@ template<class T> inline void StatFactory::eraseNoData(std::vector<T>& v) const
   }
 }
 
+ template<class T> unsigned int StatFactory::nvalid(const std::vector<T>& v) const{
+  std::vector<T> tmpV=v;
+  eraseNoData(tmpV);
+  return(tmpV.size());
+ }
+
 template<class T> T StatFactory::median(const std::vector<T>& v) const
 {
   std::vector<T> tmpV=v;
@@ -740,11 +855,11 @@ template<class T> void  StatFactory::distribution(const std::vector<T>& input, t
 {
   double minValue=0;
   double maxValue=0;
-  minmax(input,begin,end,minValue,maxValue);
+  minmax(input,begin,end,minimum,maximum);
   if(minimum<maximum&&minimum>minValue)
-    minValue=minimum;
+  minValue=minimum;
   if(minimum<maximum&&maximum<maxValue)
-    maxValue=maximum;
+  maxValue=maximum;
 
   //todo: check...
   minimum=minValue;
@@ -972,6 +1087,7 @@ template<class T> void  StatFactory::percentiles (const std::vector<T>& input, t
     else
       ++vit;
   }
+  eraseNoData(inputSort);
   std::sort(inputSort.begin(),inputSort.end());
   vit=inputSort.begin();
   std::vector<T> inputBin;
@@ -1018,6 +1134,7 @@ template<class T> T  StatFactory::percentile(const std::vector<T>& input, typena
     else
       ++vit;
   }
+  eraseNoData(inputSort);
   std::sort(inputSort.begin(),inputSort.end());
   return gsl_stats_quantile_from_sorted_data(&(inputSort[0]),1,inputSort.size(),percent/100.0);
 }
@@ -1072,6 +1189,60 @@ template<class T> double StatFactory::rmse(const std::vector<T>& x, const std::v
   return sqrt(mse);
 }
 
+//normalized root mean square error
+template<class T> double StatFactory::nrmse(const std::vector<T>& x, const std::vector<T>& y) const{
+  if(x.size()!=y.size()){
+    std::ostringstream s;
+    s<<"Error: x and y not equal in size";
+    throw(s.str());
+  }
+  if(x.empty()){
+    std::ostringstream s;
+    s<<"Error: x is empty";
+    throw(s.str());
+  }
+  std::vector<T> tmpX=x;
+  eraseNoData(tmpX);
+  std::vector<T> tmpY=y;
+  eraseNoData(tmpY);
+  double maxY=mymax(y);
+  double minY=mymin(y);
+  double rangeY=maxY-minY;
+  double mse=0;
+  for(int isample=0;isample<x.size();++isample){
+    double e=x[isample]-y[isample];
+    mse+=e*e/x.size();
+  }
+  return sqrt(mse)/rangeY;
+}
+
+// coefficient of variation root mean square error
+template<class T> double StatFactory::cvrmse(const std::vector<T>& x, const std::vector<T>& y) const{
+  if(x.size()!=y.size()){
+    std::ostringstream s;
+    s<<"Error: x and y not equal in size";
+    throw(s.str());
+  }
+  if(x.empty()){
+    std::ostringstream s;
+    s<<"Error: x is empty";
+    throw(s.str());
+  }
+  std::vector<T> tmpX=x;
+  eraseNoData(tmpX);
+  std::vector<T> tmpY=y;
+  eraseNoData(tmpY);
+  double maxY=mymax(tmpY);
+  double minY=mymin(tmpY);
+  double rangeY=maxY-minY;
+  double mse=0;
+  for(int isample=0;isample<x.size();++isample){
+    double e=x[isample]-y[isample];
+    mse+=e*e/x.size();
+  }
+  return sqrt(mse)/mean(tmpY);
+}
+
 // template<class T> double StatFactory::gsl_correlation(const std::vector<T>& x, const std::vector<T>& y) const{
 //  return(gsl_stats_correlation(&(x[0]),1,&(y[0]),1,x.size()));
 // }
diff --git a/src/apps/Makefile.am b/src/apps/Makefile.am
index 7308c38..6b8fe52 100644
--- a/src/apps/Makefile.am
+++ b/src/apps/Makefile.am
@@ -6,11 +6,13 @@ LDADD = $(GSL_LIBS) $(GDAL_LDFLAGS) $(top_builddir)/src/algorithms/libalgorithms
 ###############################################################################
 
 # the program to build and install (the names of the final binaries)
-bin_PROGRAMS = pkinfo pkcrop pkdiff pkgetmask pksetmask pkcreatect pkdumpimg pkdumpogr pksieve pkstat pkstatascii pkstatogr pkegcs pkextract pkfillnodata pkfilter pkfilterdem pkfilterascii pkdsm2shadow pkcomposite pkpolygonize pkascii2img pksvm pkfssvm pkascii2ogr pkreclass
+#bin_PROGRAMS = pkinfo pkcrop pkdiff pkgetmask pksetmask pkcreatect pkdumpimg pkdumpogr pksieve pkstat pkstatascii pkstatogr pkstatprofile pkegcs pkextract pkfillnodata pkfilter pkfilterdem pkfilterascii pkdsm2shadow pkcomposite pkpolygonize pkascii2img pksvm pkfssvm pkascii2ogr pkreclass
+bin_PROGRAMS = pkinfo pkcrop pkdiff pkgetmask pksetmask pkcreatect pkdumpimg pkdumpogr pksieve pkstat pkstatascii pkstatogr pkstatprofile pkegcs pkextract pkfillnodata pkfilter pkfilterdem pkfilterascii pkdsm2shadow pkcomposite pkpolygonize pkascii2img pksvm pkfssvm pkascii2ogr pkreclass pkkalman
 
 # the program to build but not install (the names of the final binaries)
 noinst_PROGRAMS = pkkalman
 
+
 if USE_FANN
 bin_PROGRAMS += pkann pkfsann pkregann
 pkann_SOURCES = $(top_srcdir)/src/algorithms/myfann_cpp.h pkann.cc
@@ -49,6 +51,8 @@ pkdumpogr_SOURCES = pkdumpogr.h pkdumpogr.cc
 pksieve_SOURCES = pksieve.cc
 pkstat_SOURCES = $(top_srcdir)/src/algorithms/StatFactory.h $(top_srcdir)/src/algorithms/ImgRegression.h $(top_srcdir)/src/algorithms/ImgRegression.cc pkstat.cc
 pkstat_LDADD = -lgsl -lgslcblas $(GSL_LIBS) $(AM_LDFLAGS)
+pkstatprofile_SOURCES = $(top_srcdir)/src/algorithms/StatFactory.h pkstatprofile.cc
+pkstatprofile_LDADD = -lgsl -lgslcblas $(GSL_LIBS) $(AM_LDFLAGS)
 pkstatascii_SOURCES = $(top_srcdir)/src/algorithms/StatFactory.h pkstatascii.cc
 pkstatascii_LDADD = -lgsl -lgslcblas $(GSL_LIBS) $(AM_LDFLAGS)
 pkstatogr_SOURCES = pkstatogr.cc
diff --git a/src/apps/Makefile.in b/src/apps/Makefile.in
index 2a18ba1..1cf2554 100644
--- a/src/apps/Makefile.in
+++ b/src/apps/Makefile.in
@@ -82,11 +82,12 @@ bin_PROGRAMS = pkinfo$(EXEEXT) pkcrop$(EXEEXT) pkdiff$(EXEEXT) \
 	pkgetmask$(EXEEXT) pksetmask$(EXEEXT) pkcreatect$(EXEEXT) \
 	pkdumpimg$(EXEEXT) pkdumpogr$(EXEEXT) pksieve$(EXEEXT) \
 	pkstat$(EXEEXT) pkstatascii$(EXEEXT) pkstatogr$(EXEEXT) \
-	pkegcs$(EXEEXT) pkextract$(EXEEXT) pkfillnodata$(EXEEXT) \
-	pkfilter$(EXEEXT) pkfilterdem$(EXEEXT) pkfilterascii$(EXEEXT) \
-	pkdsm2shadow$(EXEEXT) pkcomposite$(EXEEXT) \
-	pkpolygonize$(EXEEXT) pkascii2img$(EXEEXT) pksvm$(EXEEXT) \
-	pkfssvm$(EXEEXT) pkascii2ogr$(EXEEXT) pkreclass$(EXEEXT) \
+	pkstatprofile$(EXEEXT) pkegcs$(EXEEXT) pkextract$(EXEEXT) \
+	pkfillnodata$(EXEEXT) pkfilter$(EXEEXT) pkfilterdem$(EXEEXT) \
+	pkfilterascii$(EXEEXT) pkdsm2shadow$(EXEEXT) \
+	pkcomposite$(EXEEXT) pkpolygonize$(EXEEXT) \
+	pkascii2img$(EXEEXT) pksvm$(EXEEXT) pkfssvm$(EXEEXT) \
+	pkascii2ogr$(EXEEXT) pkreclass$(EXEEXT) pkkalman$(EXEEXT) \
 	$(am__EXEEXT_1) $(am__EXEEXT_2) $(am__EXEEXT_3)
 noinst_PROGRAMS = pkkalman$(EXEEXT)
 @USE_FANN_TRUE at am__append_1 = pkann pkfsann pkregann
@@ -292,6 +293,10 @@ pkstatascii_DEPENDENCIES = $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_2)
 am_pkstatogr_OBJECTS = pkstatogr.$(OBJEXT)
 pkstatogr_OBJECTS = $(am_pkstatogr_OBJECTS)
 pkstatogr_DEPENDENCIES =
+am_pkstatprofile_OBJECTS = pkstatprofile.$(OBJEXT)
+pkstatprofile_OBJECTS = $(am_pkstatprofile_OBJECTS)
+pkstatprofile_DEPENDENCIES = $(am__DEPENDENCIES_1) \
+	$(am__DEPENDENCIES_2)
 am_pksvm_OBJECTS = svm.$(OBJEXT) pksvm.$(OBJEXT)
 pksvm_OBJECTS = $(am_pksvm_OBJECTS)
 pksvm_DEPENDENCIES =
@@ -359,7 +364,7 @@ SOURCES = $(pkann_SOURCES) $(pkascii2img_SOURCES) \
 	$(pkoptsvm_SOURCES) $(pkpolygonize_SOURCES) \
 	$(pkreclass_SOURCES) $(pkregann_SOURCES) $(pksetmask_SOURCES) \
 	$(pksieve_SOURCES) $(pkstat_SOURCES) $(pkstatascii_SOURCES) \
-	$(pkstatogr_SOURCES) $(pksvm_SOURCES)
+	$(pkstatogr_SOURCES) $(pkstatprofile_SOURCES) $(pksvm_SOURCES)
 DIST_SOURCES = $(am__pkann_SOURCES_DIST) $(pkascii2img_SOURCES) \
 	$(pkascii2ogr_SOURCES) $(pkcomposite_SOURCES) \
 	$(pkcreatect_SOURCES) $(pkcrop_SOURCES) $(pkdiff_SOURCES) \
@@ -373,7 +378,7 @@ DIST_SOURCES = $(am__pkann_SOURCES_DIST) $(pkascii2img_SOURCES) \
 	$(pkpolygonize_SOURCES) $(pkreclass_SOURCES) \
 	$(am__pkregann_SOURCES_DIST) $(pksetmask_SOURCES) \
 	$(pksieve_SOURCES) $(pkstat_SOURCES) $(pkstatascii_SOURCES) \
-	$(pkstatogr_SOURCES) $(pksvm_SOURCES)
+	$(pkstatogr_SOURCES) $(pkstatprofile_SOURCES) $(pksvm_SOURCES)
 am__can_run_installinfo = \
   case $$AM_UPDATE_INFO_DIR in \
     n|no|NO) false;; \
@@ -569,6 +574,8 @@ pkdumpogr_SOURCES = pkdumpogr.h pkdumpogr.cc
 pksieve_SOURCES = pksieve.cc
 pkstat_SOURCES = $(top_srcdir)/src/algorithms/StatFactory.h $(top_srcdir)/src/algorithms/ImgRegression.h $(top_srcdir)/src/algorithms/ImgRegression.cc pkstat.cc
 pkstat_LDADD = -lgsl -lgslcblas $(GSL_LIBS) $(AM_LDFLAGS)
+pkstatprofile_SOURCES = $(top_srcdir)/src/algorithms/StatFactory.h pkstatprofile.cc
+pkstatprofile_LDADD = -lgsl -lgslcblas $(GSL_LIBS) $(AM_LDFLAGS)
 pkstatascii_SOURCES = $(top_srcdir)/src/algorithms/StatFactory.h pkstatascii.cc
 pkstatascii_LDADD = -lgsl -lgslcblas $(GSL_LIBS) $(AM_LDFLAGS)
 pkstatogr_SOURCES = pkstatogr.cc
@@ -814,6 +821,10 @@ pkstatogr$(EXEEXT): $(pkstatogr_OBJECTS) $(pkstatogr_DEPENDENCIES) $(EXTRA_pksta
 	@rm -f pkstatogr$(EXEEXT)
 	$(AM_V_CXXLD)$(CXXLINK) $(pkstatogr_OBJECTS) $(pkstatogr_LDADD) $(LIBS)
 
+pkstatprofile$(EXEEXT): $(pkstatprofile_OBJECTS) $(pkstatprofile_DEPENDENCIES) $(EXTRA_pkstatprofile_DEPENDENCIES) 
+	@rm -f pkstatprofile$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(pkstatprofile_OBJECTS) $(pkstatprofile_LDADD) $(LIBS)
+
 pksvm$(EXEEXT): $(pksvm_OBJECTS) $(pksvm_DEPENDENCIES) $(EXTRA_pksvm_DEPENDENCIES) 
 	@rm -f pksvm$(EXEEXT)
 	$(AM_V_CXXLD)$(CXXLINK) $(pksvm_OBJECTS) $(pksvm_LDADD) $(LIBS)
@@ -856,6 +867,7 @@ distclean-compile:
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/pkstat.Po at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/pkstatascii.Po at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/pkstatogr.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/pkstatprofile.Po at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/pksvm.Po at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/svm.Po at am__quote@
 
diff --git a/src/apps/pkann.cc b/src/apps/pkann.cc
index f6ad25f..53ceb92 100644
--- a/src/apps/pkann.cc
+++ b/src/apps/pkann.cc
@@ -46,7 +46,7 @@ along with pktools.  If not, see <http://www.gnu.org/licenses/>.
   Options: [-tln layer]* [-c name -r value]* [-of GDALformat|-f OGRformat] [-co NAME=VALUE]* [-ct filename] [-label attribute] [-prior value]* [-nn number]* [-m filename [-msknodata value]*] [-nodata value]
 
   Advanced options:
-       [-b band] [-s band] [-e band] [-bal size]* [-min] [-bag value] [-bs value] [-comb rule] [-cb filename] [-prob filename] [-pim priorimage] [--offset value] [--scale value] [--connection 0|1] [-w weights]* [--learning rate] [--maxit number] [-extent vector] 
+       [-b band] [-sband band -eband band]* [-bal size]* [-min] [-bag value] [-bs value] [-comb rule] [-cb filename] [-prob filename] [-pim priorimage] [--offset value] [--scale value] [--connection 0|1] [-w weights]* [--learning rate] [--maxit number]
 </code>
 
 \section pkann_description Description
@@ -65,10 +65,10 @@ The utility pkann implements an artificial neural network (ANN) to solve a super
  | bal    | balance              | unsigned int | 0     |balance the input data to this number of samples for each class | 
  | min    | min                  | int  | 0     |if number of training pixels is less then min, do not take this class into account (0: consider all classes) | 
  | b      | band                 | short |       |band index (starting from 0, either use band option or use start to end) | 
- | s      | start                | double | 0     |start band sequence number | 
- | e      | end                  | double | 0     |end band sequence number (set to 0 to include bands) | 
+ | sband  | startband            | unsigned short |      |Start band sequence number | 
+ | eband  | endband              | unsigned short |      |End band sequence number   | 
  |        | offset               | double | 0     |offset value for each spectral band input features: refl[band]=(DN[band]-offset[band])/scale[band] | 
- |        | scale                | double | 0     |scale value for each spectral band input features: refl=(DN[band]-offset[band])/scale[band] (use 0 if scale min and max in each band to -1.0 and 1.0) | 
+ | scale  | scale                | double | 0     |scale value for each spectral band input features: refl=(DN[band]-offset[band])/scale[band] (use 0 if scale min and max in each band to -1.0 and 1.0) | 
  | a      | aggreg               | unsigned short | 1     |how to combine aggregated classifiers, see also rc option (1: sum rule, 2: max rule). | 
  | prior  | prior                | double | 0     |prior probabilities for each class (e.g., -p 0.3 -p 0.3 -p 0.2 ) | 
  | pim    | priorimg             | std::string |       |prior probability image (multi-band img with band for each class | 
@@ -83,7 +83,7 @@ The utility pkann implements an artificial neural network (ANN) to solve a super
  | bag    | bag                  | unsigned short | 1     |Number of bootstrap aggregations (default is no bagging: 1) | 
  | bs     | bsize                | int  | 100   |Percentage of features used from available training features for each bootstrap aggregation (one size for all classes, or a different size for each class respectively | 
  | cb     | classbag             | std::string |       |output for each individual bootstrap aggregation (default is blank) | 
- | m      | mask                 | std::string |       |Use the first band of the specified file as a validity mask. Nodata values can be set with the option msknodata. | 
+ | m      | mask                 | std::string |       |Only classify within specified mask (vector or raster). For raster mask, set nodata values with the option msknodata. | 
  | msknodata | msknodata            | short | 0     |mask value(s) not to consider for classification (use negative values if only these values should be taken into account). Values will be taken over in classification image. Default is 0 | 
  | nodata | nodata               | unsigned short | 0     |nodata value to put where image is masked as nodata | 
  | o      | output               | std::string |       |output classification image | 
@@ -96,7 +96,6 @@ The utility pkann implements an artificial neural network (ANN) to solve a super
  | na     | nactive              | unsigned int | 1     |number of active training points | 
  | c      | class                | std::string |       |list of class names. | 
  | r      | reclass              | short |       |list of class values (use same order as in class opt). | 
- | e      | extent               | std::string |       |get boundary to classify from extent from polygons in vector file | 
 
 Usage: pkann -t training [-i input -o output] [-cv value]
 
@@ -120,11 +119,11 @@ int main(int argc, char *argv[])
   Optionpk<unsigned int> balance_opt("bal", "balance", "balance the input data to this number of samples for each class", 0);
   Optionpk<bool> random_opt("random", "random", "in case of balance, randomize input data", true,2);
   Optionpk<int> minSize_opt("min", "min", "if number of training pixels is less then min, do not take this class into account (0: consider all classes)", 0);
-  Optionpk<short> band_opt("b", "band", "band index (starting from 0, either use band option or use start to end)");
-  Optionpk<double> bstart_opt("s", "start", "start band sequence number",0); 
-  Optionpk<double> bend_opt("e", "end", "end band sequence number (set to 0 to include bands)", 0); 
-  Optionpk<double> offset_opt("\0", "offset", "offset value for each spectral band input features: refl[band]=(DN[band]-offset[band])/scale[band]", 0.0);
-  Optionpk<double> scale_opt("\0", "scale", "scale value for each spectral band input features: refl=(DN[band]-offset[band])/scale[band] (use 0 if scale min and max in each band to -1.0 and 1.0)", 0.0);
+  Optionpk<unsigned short> band_opt("b", "band", "band index (starting from 0, either use band option or use start to end)");
+  Optionpk<unsigned short> bstart_opt("sband", "startband", "Start band sequence number"); 
+  Optionpk<unsigned short> bend_opt("eband", "endband", "End band sequence number"); 
+  Optionpk<double> offset_opt("offset", "offset", "offset value for each spectral band input features: refl[band]=(DN[band]-offset[band])/scale[band]", 0.0);
+  Optionpk<double> scale_opt("scale", "scale", "scale value for each spectral band input features: refl=(DN[band]-offset[band])/scale[band] (use 0 if scale min and max in each band to -1.0 and 1.0)", 0.0);
   Optionpk<unsigned short> aggreg_opt("a", "aggreg", "how to combine aggregated classifiers, see also rc option (1: sum rule, 2: max rule).",1);
   Optionpk<double> priors_opt("prior", "prior", "prior probabilities for each class (e.g., -p 0.3 -p 0.3 -p 0.2 )", 0.0); 
   Optionpk<string> priorimg_opt("pim", "priorimg", "prior probability image (multi-band img with band for each class","",2); 
@@ -139,12 +138,12 @@ int main(int argc, char *argv[])
   Optionpk<unsigned short> bag_opt("bag", "bag", "Number of bootstrap aggregations (default is no bagging: 1)", 1);
   Optionpk<int> bagSize_opt("bs", "bsize", "Percentage of features used from available training features for each bootstrap aggregation (one size for all classes, or a different size for each class respectively", 100);
   Optionpk<string> classBag_opt("cb", "classbag", "output for each individual bootstrap aggregation (default is blank)"); 
-  Optionpk<string> mask_opt("m", "mask", "Use the first band of the specified file as a validity mask. Nodata values can be set with the option msknodata.");
+  Optionpk<string> mask_opt("m", "mask", "Only classify within specified mask (vector or raster). For raster mask, set nodata values with the option msknodata.");
   Optionpk<short> msknodata_opt("msknodata", "msknodata", "mask value(s) not to consider for classification (use negative values if only these values should be taken into account). Values will be taken over in classification image. Default is 0", 0);
   Optionpk<unsigned short> nodata_opt("nodata", "nodata", "nodata value to put where image is masked as nodata", 0);
   Optionpk<string> output_opt("o", "output", "output classification image"); 
   Optionpk<string>  otype_opt("ot", "otype", "Data type for output image ({Byte/Int16/UInt16/UInt32/Int32/Float32/Float64/CInt16/CInt32/CFloat32/CFloat64}). Empty string: inherit type from input image");
-  Optionpk<string>  oformat_opt("of", "oformat", "Output image format (see also gdal_translate). Empty string: inherit from input image");
+  Optionpk<string>  oformat_opt("of", "oformat", "Output image format (see also gdal_translate).","GTiff");
   Optionpk<string> option_opt("co", "co", "Creation option for output file. Multiple options can be specified.");
   Optionpk<string> colorTable_opt("ct", "ct", "colour table in ASCII format having 5 columns: id R G B ALFA (0: transparent, 255: solid)"); 
   Optionpk<string> prob_opt("\0", "prob", "probability image. Default is no probability image"); 
@@ -154,9 +153,10 @@ int main(int argc, char *argv[])
   Optionpk<unsigned int> nactive_opt("na", "nactive", "number of active training points",1);
   Optionpk<string> classname_opt("c", "class", "list of class names."); 
   Optionpk<short> classvalue_opt("r", "reclass", "list of class values (use same order as in class opt)."); 
-  Optionpk<string>  extent_opt("extent", "extent", "get boundary to classify from extent from polygons in vector file");
   Optionpk<short> verbose_opt("v", "verbose", "set to: 0 (results only), 1 (confusion matrix), 2 (debug)",0,2);
 
+  option_opt.setHide(1);
+  oformat_opt.setHide(1);
   band_opt.setHide(1);
   bstart_opt.setHide(1);
   bend_opt.setHide(1);
@@ -176,7 +176,6 @@ int main(int argc, char *argv[])
   weights_opt.setHide(1);
   maxit_opt.setHide(1);
   learning_opt.setHide(1);
-  extent_opt.setHide(1);
 
   verbose_opt.setHide(2);
 
@@ -269,12 +268,20 @@ int main(int argc, char *argv[])
   double uly=0;
   double lrx=0;
   double lry=0;
-  if(extent_opt.size()){
-    extentReader.open(extent_opt[0]);
-    readLayer = extentReader.getDataSource()->GetLayer(0);
+
+  bool maskIsVector=false;
+  if(mask_opt.size()){
+    try{
+      extentReader.open(mask_opt[0]);
+      maskIsVector=true;
+      readLayer = extentReader.getDataSource()->GetLayer(0);
       if(!(extentReader.getExtent(ulx,uly,lrx,lry))){
-      cerr << "Error: could not get extent from " << extent_opt[0] << endl;
-      exit(1);
+	cerr << "Error: could not get extent from " << mask_opt[0] << endl;
+	exit(1);
+      }
+    }
+    catch(string errorString){
+      maskIsVector=false;
     }
   }
 
@@ -312,6 +319,28 @@ int main(int argc, char *argv[])
       priors[iclass]/=normPrior;
   }
 
+  //convert start and end band options to vector of band indexes
+  try{
+    if(bstart_opt.size()){
+      if(bend_opt.size()!=bstart_opt.size()){
+	string errorstring="Error: options for start and end band indexes must be provided as pairs, missing end band";
+	throw(errorstring);
+      }
+      band_opt.clear();
+      for(int ipair=0;ipair<bstart_opt.size();++ipair){
+	if(bend_opt[ipair]<=bstart_opt[ipair]){
+	  string errorstring="Error: index for end band must be smaller then start band";
+	  throw(errorstring);
+	}
+	for(int iband=bstart_opt[ipair];iband<=bend_opt[ipair];++iband)
+	  band_opt.push_back(iband);
+      }
+    }
+  }
+  catch(string error){
+    cerr << error << std::endl;
+    exit(1);
+  }
   //sort bands
   if(band_opt.size())
     std::sort(band_opt.begin(),band_opt.end());
@@ -342,7 +371,7 @@ int main(int argc, char *argv[])
         if(band_opt.size())
           totalSamples=trainingReaderBag.readDataImageOgr(trainingMap,fields,band_opt,label_opt[0],tlayer_opt,verbose_opt[0]);
         else
-          totalSamples=trainingReaderBag.readDataImageOgr(trainingMap,fields,bstart_opt[0],bend_opt[0],label_opt[0],tlayer_opt,verbose_opt[0]);
+          totalSamples=trainingReaderBag.readDataImageOgr(trainingMap,fields,0,0,label_opt[0],tlayer_opt,verbose_opt[0]);
         if(trainingMap.size()<2){
           string errorstring="Error: could not read at least two classes from training file, did you provide class labels in training sample (see option label)?";
           throw(errorstring);
@@ -762,7 +791,7 @@ int main(int argc, char *argv[])
     ImgWriterGdal probImage;
     ImgWriterGdal entropyImage;
 
-    string imageType=testImage.getImageType();
+    string imageType;//testImage.getImageType();
     if(oformat_opt.size())//default
       imageType=oformat_opt[0];
     try{
@@ -799,7 +828,8 @@ int main(int argc, char *argv[])
     }
   
     ImgWriterGdal maskWriter;
-    if(extent_opt.size()){
+
+    if(maskIsVector){
       try{
 	maskWriter.open("/vsimem/mask.tif",ncol,nrow,1,GDT_Float32,imageType,option_opt);
 	maskWriter.GDALSetNoDataValue(nodata_opt[0]);
@@ -807,6 +837,7 @@ int main(int argc, char *argv[])
         maskWriter.setProjection(testImage.getProjection());
 	vector<double> burnValues(1,1);//burn value is 1 (single band)
 	maskWriter.rasterizeOgr(extentReader,burnValues);
+	extentReader.close();
 	maskWriter.close();
       }
       catch(string error){
@@ -866,7 +897,7 @@ int main(int argc, char *argv[])
           }
         }
         else{
-          for(int iband=bstart_opt[0];iband<bstart_opt[0]+nband;++iband){
+          for(int iband=0;iband<nband;++iband){
             if(verbose_opt[0]==2)
               std::cout << "reading band " << iband << std::endl;
             assert(iband>=0);
@@ -914,7 +945,7 @@ int main(int argc, char *argv[])
         bool masked=false;
 	double geox=0;
 	double geoy=0;
-        if(extent_opt.size()){
+        if(maskIsVector){
 	  doClassify=false;
 	  testImage.image2geo(icol,iline,geox,geoy);
 	  //check enveloppe first
diff --git a/src/apps/pkcomposite.cc b/src/apps/pkcomposite.cc
index 8928667..fcc3b4c 100644
--- a/src/apps/pkcomposite.cc
+++ b/src/apps/pkcomposite.cc
@@ -65,6 +65,25 @@ sum | Calculate the arithmetic sum of overlapping pixels
 maxallbands | For each individual band, assign the maximum value found in all overlapping pixels. Unlike maxband, output band values cannot be attributed to a single (date) pixel in the input time series
 minallbands | For each individual band, assign the minimum value found in all overlapping pixels. Unlike minband, output band values cannot be attributed to a single (date) pixel in the input time series
 
+Example: Calculate the maximum NDVI composite of two multispectral input images (e.g., red is band 0 and near infrared is band 1)
+
+\code
+pkcomposite -i input1.tif -i input2.tif -o output.tif -cr maxndvi -cb 0 -cb 1
+\endcode
+
+Example: Calculate the minimum nadir composite of two input images, where the forth band (b=3) contains the view zenith angle
+
+\code
+pkcomposite -i input1.tif -i input2.tif -o minzenith.tif -cr minband -cb 3
+\endcode
+
+Example: Calculate the minimum of two input images in all bands
+
+\code
+pkcomposite -i input1.tif -i input2.tif -o minimum.tif -cr minallbands
+\endcode
+
+
 \section pkcomposite_options Options
  - use either `-short` or `--long` options (both `--long=value` and `--long value` are supported)
  - short option `-h` shows basic options only, long option `--help` shows all options
@@ -80,6 +99,7 @@ minallbands | For each individual band, assign the minimum value found in all ov
  | cut      | crop_to_cutline    | bool | false |Crop the extent of the target dataset to the extent of the cutline | 
  | m      | mask                 | std::string |       |Use the first band of the specified file as a validity mask (0 is nodata) | 
  | msknodata | msknodata            | float | 0     |Mask value not to consider for composite
+ | mskband | mskband              | short | 0     |Mask band to read (0 indexed). Provide band for each mask. | 
  | ulx    | ulx                  | double | 0     |Upper left x value bounding box | 
  | uly    | uly                  | double | 0     |Upper left y value bounding box | 
  | lrx    | lrx                  | double | 0     |Lower right x value bounding box | 
@@ -93,7 +113,7 @@ minallbands | For each individual band, assign the minimum value found in all ov
  | dstnodata | dstnodata            | double | 0     |nodata value to put in output raster dataset if not valid or out of bounds. | 
  | r      | resampling-method    | std::string | near  |Resampling method (near: nearest neighbor, bilinear: bi-linear interpolation). | 
  | ot     | otype                | std::string |       |Data type for output image ({Byte/Int16/UInt16/UInt32/Int32/Float32/Float64/CInt16/CInt32/CFloat32/CFloat64}). Empty string: inherit type from input image | 
- | of     | oformat              | std::string |       |Output image format (see also gdal_translate). Empty string: inherit from input image | 
+ | of     | oformat              | std::string | GTiff |Output image format (see also gdal_translate).| 
  | co     | co                   | std::string |       |Creation option for output file. Multiple options can be specified. | 
  | a_srs  | a_srs                | std::string |       |Override the spatial reference for the output file (leave blank to copy from input file, use epsg:3035 to use European projection and force to European grid | 
  | file   | file                 | short | 0     |write number of observations (1) or sequence nr of selected file (2) for each pixels as additional layer in composite | 
@@ -128,6 +148,7 @@ int main(int argc, char *argv[])
   Optionpk<bool> cut_opt("cut", "crop_to_cutline", "Crop the extent of the target dataset to the extent of the cutline.",false);
   Optionpk<string> mask_opt("m", "mask", "Use the first band of the specified file as a validity mask (0 is nodata).");
   Optionpk<float> msknodata_opt("msknodata", "msknodata", "Mask value not to consider for composite.", 0);
+  Optionpk<short> mskband_opt("mskband", "mskband", "Mask band to read (0 indexed). Provide band for each mask.", 0);
   Optionpk<double>  ulx_opt("ulx", "ulx", "Upper left x value bounding box", 0.0);
   Optionpk<double>  uly_opt("uly", "uly", "Upper left y value bounding box", 0.0);
   Optionpk<double>  lrx_opt("lrx", "lrx", "Lower right x value bounding box", 0.0);
@@ -141,7 +162,7 @@ int main(int argc, char *argv[])
   Optionpk<double>  dstnodata_opt("dstnodata", "dstnodata", "nodata value to put in output raster dataset if not valid or out of bounds.", 0);
   Optionpk<string>  resample_opt("r", "resampling-method", "Resampling method (near: nearest neighbor, bilinear: bi-linear interpolation).", "near");
   Optionpk<string>  otype_opt("ot", "otype", "Data type for output image ({Byte/Int16/UInt16/UInt32/Int32/Float32/Float64/CInt16/CInt32/CFloat32/CFloat64}). Empty string: inherit type from input image", "");
-  Optionpk<string>  oformat_opt("of", "oformat", "Output image format (see also gdal_translate). Empty string: inherit from input image");
+  Optionpk<string>  oformat_opt("of", "oformat", "Output image format (see also gdal_translate).","GTiff");
   Optionpk<string> option_opt("co", "co", "Creation option for output file. Multiple options can be specified.");
   Optionpk<string>  projection_opt("a_srs", "a_srs", "Override the spatial reference for the output file (leave blank to copy from input file, use epsg:3035 to use European projection and force to European grid");
   Optionpk<short> file_opt("file", "file", "write number of observations (1) or sequence nr of selected file (2) for each pixels as additional layer in composite", 0);
@@ -155,6 +176,7 @@ int main(int argc, char *argv[])
   cut_opt.setHide(1);
   mask_opt.setHide(1);
   msknodata_opt.setHide(1);
+  mskband_opt.setHide(1);
   option_opt.setHide(1);
   file_opt.setHide(1);
   weight_opt.setHide(1);
@@ -173,6 +195,7 @@ int main(int argc, char *argv[])
     cut_opt.retrieveOption(argc,argv);
     mask_opt.retrieveOption(argc,argv);
     msknodata_opt.retrieveOption(argc,argv);
+    mskband_opt.retrieveOption(argc,argv);
     ulx_opt.retrieveOption(argc,argv);
     uly_opt.retrieveOption(argc,argv);
     lrx_opt.retrieveOption(argc,argv);
@@ -334,37 +357,39 @@ int main(int argc, char *argv[])
   if(verbose_opt[0])
     cout << "--ulx=" << ulx_opt[0] << " --uly=" << uly_opt[0] << " --lrx=" << lrx_opt[0] << " --lry=" << lry_opt[0] << endl;
 
-  ImgReaderGdal imgReader;
+  vector<ImgReaderGdal> imgReader(input_opt.size());
   string theProjection="";
   GDALColorTable* theColorTable=NULL;
   string imageType;
   bool init=false;
   for(int ifile=0;ifile<input_opt.size();++ifile){
     try{
-      imgReader.open(input_opt[ifile]);
+      imgReader[ifile].open(input_opt[ifile]);
     }
     catch(string errorstring){
       cerr << errorstring << " " << input_opt[ifile] << endl;
     }
+
+    //todo: must be in init part only?
     if(colorTable_opt.empty())
-      if(imgReader.getColorTable())
-        theColorTable=(imgReader.getColorTable()->Clone());
+      if(imgReader[ifile].getColorTable())
+	theColorTable=(imgReader[ifile].getColorTable()->Clone());
     if(projection_opt.empty())
-      theProjection=imgReader.getProjection();
+      theProjection=imgReader[ifile].getProjection();
     if(option_opt.findSubstring("INTERLEAVE=")==option_opt.end()){
       string theInterleave="INTERLEAVE=";
-      theInterleave+=imgReader.getInterleave();
+      theInterleave+=imgReader[ifile].getInterleave();
       option_opt.push_back(theInterleave);
     }
 
-    if((ulx_opt[0]||uly_opt[0]||lrx_opt[0]||lry_opt[0])&&(!imgReader.covers(ulx_opt[0],uly_opt[0],lrx_opt[0],lry_opt[0]))){
+    if((ulx_opt[0]||uly_opt[0]||lrx_opt[0]||lry_opt[0])&&(!imgReader[ifile].covers(ulx_opt[0],uly_opt[0],lrx_opt[0],lry_opt[0]))){
       if(verbose_opt[0])
 	cout << input_opt[ifile] << " not within bounding box, skipping..." << endl;
-      imgReader.close();
+      // imgReader.close();
       continue;
     }
     double theULX, theULY, theLRX, theLRY;
-    imgReader.getBoundingBox(theULX,theULY,theLRX,theLRY);
+    imgReader[ifile].getBoundingBox(theULX,theULY,theLRX,theLRY);
     if(theLRY>theULY){
       cerr << "Error: " << input_opt[ifile] << " is not georeferenced, only referenced images are supported for pkcomposite " << endl;
       exit(1);
@@ -418,11 +443,11 @@ int main(int argc, char *argv[])
         bands.resize(band_opt.size());
         for(int iband=0;iband<band_opt.size();++iband){
           bands[iband]=band_opt[iband];
-          assert(bands[iband]<imgReader.nrOfBand());
+          assert(bands[iband]<imgReader[ifile].nrOfBand());
         }
       }
       else{
-	nband=imgReader.nrOfBand();
+	nband=imgReader[ifile].nrOfBand();
         bands.resize(nband);
         for(int iband=0;iband<nband;++iband)
           bands[iband]=iband;
@@ -432,7 +457,7 @@ int main(int argc, char *argv[])
       }
       //if output type not set, get type from input image
       if(theType==GDT_Unknown){
-        theType=imgReader.getDataType();
+        theType=imgReader[ifile].getDataType();
         if(verbose_opt[0])
           cout << "Using data type from input image: " << GDALGetDataTypeName(theType) << endl;
       }
@@ -440,7 +465,7 @@ int main(int argc, char *argv[])
       if(oformat_opt.size())//default
         imageType=oformat_opt[0];
       else
-        imageType=imgReader.getImageType();
+        imageType=imgReader[ifile].getImageType();
 
       // dataType=imgReader.getDataType(0);
       if(verbose_opt[0]){
@@ -455,11 +480,11 @@ int main(int argc, char *argv[])
       if(dx_opt.size())
 	dx=dx_opt[0];
       else
-        dx=imgReader.getDeltaX();
+        dx=imgReader[ifile].getDeltaX();
       if(dy_opt.size())
 	dy=dy_opt[0];
       else
-        dy=imgReader.getDeltaY();
+        dy=imgReader[ifile].getDeltaY();
       // imgReader.getMagicPixel(magic_x,magic_y);
       init=true;
     }
@@ -478,7 +503,7 @@ int main(int argc, char *argv[])
       minULX=(theULX<minULX)?theULX:minULX;
       minLRY=(theLRY<minLRY)?theLRY:minLRY;
     }
-    imgReader.close();
+    // imgReader.close();
   }
   if(verbose_opt[0])
     cout << "bounding box input images (ULX ULY LRX LRY): " << fixed << setprecision(6) << minULX << " " << maxULY << " " << maxLRX << " " << minLRY << endl;
@@ -621,6 +646,10 @@ int main(int argc, char *argv[])
       if(verbose_opt[0]>=1)
 	std::cout << "opening mask image file " << mask_opt[0] << std::endl;
       maskReader.open(mask_opt[0]);
+      if(mskband_opt[0]>=maskReader.nrOfBand()){
+	string errorString="Error: illegal mask band";
+	throw(errorString);
+      }
     }
     catch(string error){
       cerr << error << std::endl;
@@ -638,7 +667,10 @@ int main(int argc, char *argv[])
   Vector2d<double> writeBuffer(nband,imgWriter.nrOfCol());
   vector<short> fileBuffer(ncol);//holds the number of used files
   Vector2d<short> maxBuffer;//buffer used for maximum voting
-  Vector2d<double> readBuffer(nband);
+  // Vector2d<double> readBuffer(nband);
+  vector<Vector2d<double> > readBuffer(input_opt.size());
+  for(int ifile=0;ifile<input_opt.size();++ifile)
+    readBuffer[ifile].resize(imgReader[ifile].nrOfBand());
   statfactory::StatFactory stat;
   if(cruleMap[crule_opt[0]]==crule::maxndvi)//ndvi
     assert(ruleBand_opt.size()==2);
@@ -691,21 +723,22 @@ int main(int argc, char *argv[])
     double oldRowMask=-1;//keep track of row mask to optimize number of line readings
 
     for(int ifile=0;ifile<input_opt.size();++ifile){
-      try{
-        imgReader.open(input_opt[ifile]);
-      }
-      catch(string error){
-        cout << error << endl;
-      }
+      //imgReader already open...
+      // try{
+      //   imgReader.open(input_opt[ifile]);
+      // }
+      // catch(string error){
+      //   cout << error << endl;
+      // }
       // assert(imgReader.getDataType()==theType);
-      assert(imgReader.nrOfBand()>=nband);
-      if(!imgReader.covers(minULX,maxULY,maxLRX,minLRY)){
-        imgReader.close();
+      assert(imgReader[ifile].nrOfBand()>=nband);
+      if(!imgReader[ifile].covers(minULX,maxULY,maxLRX,minLRY)){
+        // imgReader.close();
         continue;
       }
       double uli,ulj,lri,lrj;
-      imgReader.geo2image(minULX+(magic_x-1.0)*imgReader.getDeltaX(),maxULY-(magic_y-1.0)*imgReader.getDeltaY(),uli,ulj);
-      imgReader.geo2image(maxLRX+(magic_x-2.0)*imgReader.getDeltaX(),minLRY-(magic_y-2.0)*imgReader.getDeltaY(),lri,lrj);
+      imgReader[ifile].geo2image(minULX+(magic_x-1.0)*imgReader[ifile].getDeltaX(),maxULY-(magic_y-1.0)*imgReader[ifile].getDeltaY(),uli,ulj);
+      imgReader[ifile].geo2image(maxLRX+(magic_x-2.0)*imgReader[ifile].getDeltaX(),minLRY-(magic_y-2.0)*imgReader[ifile].getDeltaY(),lri,lrj);
       uli=floor(uli);
       ulj=floor(ulj);
       lri=floor(lri);
@@ -715,26 +748,26 @@ int main(int argc, char *argv[])
       double endCol=lri;
       if(uli<0)
         startCol=0;
-      else if(uli>=imgReader.nrOfCol())
-        startCol=imgReader.nrOfCol()-1;
+      else if(uli>=imgReader[ifile].nrOfCol())
+        startCol=imgReader[ifile].nrOfCol()-1;
       if(lri<0)
         endCol=0;
-      else if(lri>=imgReader.nrOfCol())
-        endCol=imgReader.nrOfCol()-1;
+      else if(lri>=imgReader[ifile].nrOfCol())
+        endCol=imgReader[ifile].nrOfCol()-1;
       int readncol=endCol-startCol+1;
 
       //lookup corresponding row for irow in this file
-      imgReader.geo2image(x,y,readCol,readRow);
-      if(readRow<0||readRow>=imgReader.nrOfRow()){
-        imgReader.close();
+      imgReader[ifile].geo2image(x,y,readCol,readRow);
+      if(readRow<0||readRow>=imgReader[ifile].nrOfRow()){
+        // imgReader.close();
         continue;
       }
       // for(int iband=0;iband<imgReader.nrOfBand();++iband){
       for(int iband=0;iband<nband;++iband){
 	int readBand=(band_opt.size()>iband)? band_opt[iband] : iband;
-        readBuffer[iband].resize(readncol);
+        // readBuffer[iband].resize(readncol);
 	try{
-          imgReader.readData(readBuffer[iband],GDT_Float64,startCol,endCol,readRow,readBand,theResample);
+          imgReader[ifile].readData(readBuffer[ifile][iband],GDT_Float64,startCol,endCol,readRow,readBand,theResample);
 	}
 	catch(string error){
 	  cerr << "error reading image " << input_opt[ifile] << ": " << endl;
@@ -759,7 +792,7 @@ int main(int argc, char *argv[])
 
 	      assert(rowMask>=0&&rowMask<maskReader.nrOfRow());
 	      try{
-		maskReader.readData(lineMask,GDT_Float32,static_cast<int>(rowMask));
+		maskReader.readData(lineMask,GDT_Float32,static_cast<int>(rowMask),mskband_opt[0]);
 	      }
 	      catch(string errorstring){
 		cerr << errorstring << endl;
@@ -780,8 +813,8 @@ int main(int argc, char *argv[])
 	  continue;
 
         //lookup corresponding row for irow in this file
-        imgReader.geo2image(x,y,readCol,readRow);
-        if(readCol<0||readCol>=imgReader.nrOfCol())
+        imgReader[ifile].geo2image(x,y,readCol,readRow);
+        if(readCol<0||readCol>=imgReader[ifile].nrOfCol())
           continue;
         double val_current=0;
         double val_new=0;
@@ -794,10 +827,10 @@ int main(int argc, char *argv[])
           upperCol=static_cast<int>(upperCol);
           if(lowerCol<0)
             lowerCol=0;
-          if(upperCol>=imgReader.nrOfCol())
-            upperCol=imgReader.nrOfCol()-1;
+          if(upperCol>=imgReader[ifile].nrOfCol())
+            upperCol=imgReader[ifile].nrOfCol()-1;
           for(int vband=0;vband<bndnodata_opt.size();++vband){
-            val_new=(readCol-0.5-lowerCol)*readBuffer[bndnodata_opt[vband]][upperCol-startCol]+(1-readCol+0.5+lowerCol)*readBuffer[bndnodata_opt[vband]][lowerCol-startCol];
+            val_new=(readCol-0.5-lowerCol)*readBuffer[ifile][bndnodata_opt[vband]][upperCol-startCol]+(1-readCol+0.5+lowerCol)*readBuffer[ifile][bndnodata_opt[vband]][lowerCol-startCol];
 	    if(minValue_opt.size()>vband){
 	      if(val_new<=minValue_opt[vband]){
 		readValid=false;
@@ -821,7 +854,7 @@ int main(int argc, char *argv[])
         default:
           readCol=static_cast<int>(readCol);
           for(int vband=0;vband<bndnodata_opt.size();++vband){
-            val_new=readBuffer[bndnodata_opt[vband]][readCol-startCol];
+            val_new=readBuffer[ifile][bndnodata_opt[vband]][readCol-startCol];
 	    if(minValue_opt.size()>vband){
 	      if(val_new<=minValue_opt[vband]){
 		readValid=false;
@@ -866,15 +899,15 @@ int main(int argc, char *argv[])
                 upperCol=static_cast<int>(upperCol);
                 if(lowerCol<0)
                   lowerCol=0;
-                if(upperCol>=imgReader.nrOfCol())
-                  upperCol=imgReader.nrOfCol()-1;
-                red_new=(readCol-0.5-lowerCol)*readBuffer[ruleBand_opt[0]][upperCol-startCol]+(1-readCol+0.5+lowerCol)*readBuffer[ruleBand_opt[0]][lowerCol-startCol];
-                nir_new=(readCol-0.5-lowerCol)*readBuffer[ruleBand_opt[1]][upperCol-startCol]+(1-readCol+0.5+lowerCol)*readBuffer[ruleBand_opt[1]][lowerCol-startCol];
+                if(upperCol>=imgReader[ifile].nrOfCol())
+                  upperCol=imgReader[ifile].nrOfCol()-1;
+                red_new=(readCol-0.5-lowerCol)*readBuffer[ifile][ruleBand_opt[0]][upperCol-startCol]+(1-readCol+0.5+lowerCol)*readBuffer[ifile][ruleBand_opt[0]][lowerCol-startCol];
+                nir_new=(readCol-0.5-lowerCol)*readBuffer[ifile][ruleBand_opt[1]][upperCol-startCol]+(1-readCol+0.5+lowerCol)*readBuffer[ifile][ruleBand_opt[1]][lowerCol-startCol];
                 if(red_new+nir_new>0&&red_new>=0&&nir_new>=0)
                   ndvi_new=(nir_new-red_new)/(nir_new+red_new);
                 if(ndvi_new>=ndvi_current){
                   for(iband=0;iband<nband;++iband){
-                    val_new=(readCol-0.5-lowerCol)*readBuffer[iband][upperCol-startCol]+(1-readCol+0.5+lowerCol)*readBuffer[iband][lowerCol-startCol];
+                    val_new=(readCol-0.5-lowerCol)*readBuffer[ifile][iband][upperCol-startCol]+(1-readCol+0.5+lowerCol)*readBuffer[ifile][iband][lowerCol-startCol];
                     writeBuffer[iband][ib]=val_new;
                   }
 		  if(file_opt[0]>1)
@@ -883,13 +916,13 @@ int main(int argc, char *argv[])
                 break;
               default:
                 readCol=static_cast<int>(readCol);
-                red_new=readBuffer[ruleBand_opt[0]][readCol-startCol];
-                nir_new=readBuffer[ruleBand_opt[1]][readCol-startCol];
+                red_new=readBuffer[ifile][ruleBand_opt[0]][readCol-startCol];
+                nir_new=readBuffer[ifile][ruleBand_opt[1]][readCol-startCol];
                 if(red_new+nir_new>0&&red_new>=0&&nir_new>=0)
                   ndvi_new=(nir_new-red_new)/(nir_new+red_new);
                 if(ndvi_new>=ndvi_current){
                   for(iband=0;iband<nband;++iband){
-                    val_new=readBuffer[iband][readCol-startCol];
+                    val_new=readBuffer[ifile][iband][readCol-startCol];
                     writeBuffer[iband][ib]=val_new;
                   }
 		  if(file_opt[0]>1)
@@ -911,13 +944,13 @@ int main(int argc, char *argv[])
                 upperCol=static_cast<int>(upperCol);
                 if(lowerCol<0)
                   lowerCol=0;
-                if(upperCol>=imgReader.nrOfCol())
-                  upperCol=imgReader.nrOfCol()-1;
-                val_new=(readCol-0.5-lowerCol)*readBuffer[ruleBand_opt[0]][upperCol-startCol]+(1-readCol+0.5+lowerCol)*readBuffer[ruleBand_opt[0]][lowerCol-startCol];
+                if(upperCol>=imgReader[ifile].nrOfCol())
+                  upperCol=imgReader[ifile].nrOfCol()-1;
+                val_new=(readCol-0.5-lowerCol)*readBuffer[ifile][ruleBand_opt[0]][upperCol-startCol]+(1-readCol+0.5+lowerCol)*readBuffer[ifile][ruleBand_opt[0]][lowerCol-startCol];
                 val_new*=weight_opt[ifile];
                 if((cruleMap[crule_opt[0]]==crule::maxband&&val_new>val_current)||(cruleMap[crule_opt[0]]==crule::minband&&val_new<val_current)||(cruleMap[crule_opt[0]]==crule::validband)){//&&val_new>minValue_opt[0]&&val_new<maxValue_opt[0])){
                   for(iband=0;iband<nband;++iband){
-                    val_new=(readCol-0.5-lowerCol)*readBuffer[iband][upperCol-startCol]+(1-readCol+0.5+lowerCol)*readBuffer[iband][lowerCol-startCol];
+                    val_new=(readCol-0.5-lowerCol)*readBuffer[ifile][iband][upperCol-startCol]+(1-readCol+0.5+lowerCol)*readBuffer[ifile][iband][lowerCol-startCol];
                     val_new*=weight_opt[ifile];
                     writeBuffer[iband][ib]=val_new;
                   }
@@ -927,11 +960,11 @@ int main(int argc, char *argv[])
                 break;
               default:
                 readCol=static_cast<int>(readCol);
-                val_new=readBuffer[ruleBand_opt[0]][readCol-startCol];
+                val_new=readBuffer[ifile][ruleBand_opt[0]][readCol-startCol];
                 val_new*=weight_opt[ifile];
                 if((cruleMap[crule_opt[0]]==crule::maxband&&val_new>val_current)||(cruleMap[crule_opt[0]]==crule::minband&&val_new<val_current)||(cruleMap[crule_opt[0]]==crule::validband)){//&&val_new>minValue_opt[0]&&val_new<maxValue_opt[0])){
                   for(iband=0;iband<nband;++iband){
-                    val_new=readBuffer[iband][readCol-startCol];
+                    val_new=readBuffer[ifile][iband][readCol-startCol];
                     val_new*=weight_opt[ifile];
                     writeBuffer[iband][ib]=val_new;
                   }
@@ -950,10 +983,10 @@ int main(int argc, char *argv[])
                 upperCol=static_cast<int>(upperCol);
                 if(lowerCol<0)
                   lowerCol=0;
-                if(upperCol>=imgReader.nrOfCol())
-                  upperCol=imgReader.nrOfCol()-1;
+                if(upperCol>=imgReader[ifile].nrOfCol())
+                  upperCol=imgReader[ifile].nrOfCol()-1;
                 for(iband=0;iband<nband;++iband){
-                  val_new=(readCol-0.5-lowerCol)*readBuffer[iband][upperCol-startCol]+(1-readCol+0.5+lowerCol)*readBuffer[iband][lowerCol-startCol];
+                  val_new=(readCol-0.5-lowerCol)*readBuffer[ifile][iband][upperCol-startCol]+(1-readCol+0.5+lowerCol)*readBuffer[ifile][iband][lowerCol-startCol];
 		  maxBuffer[ib][val_new]=maxBuffer[ib][val_new]+weight_opt[ifile];
                   // ++(maxBuffer[ib][val_new]);
                 }
@@ -961,7 +994,7 @@ int main(int argc, char *argv[])
               default:
                 readCol=static_cast<int>(readCol);
                 for(iband=0;iband<nband;++iband){
-                  val_new=readBuffer[iband][readCol-startCol];
+                  val_new=readBuffer[ifile][iband][readCol-startCol];
 		  maxBuffer[ib][val_new]=maxBuffer[ib][val_new]+weight_opt[ifile];
 		}
                 break;
@@ -981,10 +1014,10 @@ int main(int argc, char *argv[])
                 upperCol=static_cast<int>(upperCol);
                 if(lowerCol<0)
                   lowerCol=0;
-                if(upperCol>=imgReader.nrOfCol())
-                  upperCol=imgReader.nrOfCol()-1;
+                if(upperCol>=imgReader[ifile].nrOfCol())
+                  upperCol=imgReader[ifile].nrOfCol()-1;
                 for(iband=0;iband<nband;++iband){
-                  val_new=(readCol-0.5-lowerCol)*readBuffer[iband][upperCol-startCol]+(1-readCol+0.5+lowerCol)*readBuffer[iband][lowerCol-startCol];
+                  val_new=(readCol-0.5-lowerCol)*readBuffer[ifile][iband][upperCol-startCol]+(1-readCol+0.5+lowerCol)*readBuffer[ifile][iband][lowerCol-startCol];
                   val_new*=weight_opt[ifile];
                   storeBuffer[iband][ib].push_back(val_new);
                 }
@@ -992,7 +1025,7 @@ int main(int argc, char *argv[])
               default:
                 readCol=static_cast<int>(readCol);
                 for(iband=0;iband<nband;++iband){
-                  val_new=readBuffer[iband][readCol-startCol];
+                  val_new=readBuffer[ifile][iband][readCol-startCol];
                   val_new*=weight_opt[ifile];
                   storeBuffer[iband][ib].push_back(val_new);
                   assert(ifile>0);
@@ -1014,10 +1047,10 @@ int main(int argc, char *argv[])
                 upperCol=static_cast<int>(upperCol);
                 if(lowerCol<0)
                   lowerCol=0;
-                if(upperCol>=imgReader.nrOfCol())
-                  upperCol=imgReader.nrOfCol()-1;
+                if(upperCol>=imgReader[ifile].nrOfCol())
+                  upperCol=imgReader[ifile].nrOfCol()-1;
                 for(iband=0;iband<nband;++iband){
-                  val_new=(readCol-0.5-lowerCol)*readBuffer[iband][upperCol-startCol]+(1-readCol+0.5+lowerCol)*readBuffer[iband][lowerCol-startCol];
+                  val_new=(readCol-0.5-lowerCol)*readBuffer[ifile][iband][upperCol-startCol]+(1-readCol+0.5+lowerCol)*readBuffer[ifile][iband][lowerCol-startCol];
                   val_new*=weight_opt[ifile];
                   writeBuffer[iband][ib]=val_new;
                 }
@@ -1025,7 +1058,7 @@ int main(int argc, char *argv[])
               default:
                 readCol=static_cast<int>(readCol);
                 for(iband=0;iband<nband;++iband){
-                  val_new=readBuffer[iband][readCol-startCol];
+                  val_new=readBuffer[ifile][iband][readCol-startCol];
                   val_new*=weight_opt[ifile];
                   writeBuffer[iband][ib]=val_new;
                 }
@@ -1054,10 +1087,10 @@ int main(int argc, char *argv[])
                 upperCol=static_cast<int>(upperCol);
                 if(lowerCol<0)
                   lowerCol=0;
-                if(upperCol>=imgReader.nrOfCol())
-                  upperCol=imgReader.nrOfCol()-1;
+                if(upperCol>=imgReader[ifile].nrOfCol())
+                  upperCol=imgReader[ifile].nrOfCol()-1;
                 for(iband=0;iband<nband;++iband){
-                  val_new=(readCol-0.5-lowerCol)*readBuffer[iband][upperCol-startCol]+(1-readCol+0.5+lowerCol)*readBuffer[iband][lowerCol-startCol];
+                  val_new=(readCol-0.5-lowerCol)*readBuffer[ifile][iband][upperCol-startCol]+(1-readCol+0.5+lowerCol)*readBuffer[ifile][iband][lowerCol-startCol];
                   val_new*=weight_opt[ifile];
                   storeBuffer[iband][ib].push_back(val_new);
                 }
@@ -1065,7 +1098,7 @@ int main(int argc, char *argv[])
               default:
                 readCol=static_cast<int>(readCol);
                 for(iband=0;iband<nband;++iband){
-                  val_new=readBuffer[iband][readCol-startCol];
+                  val_new=readBuffer[ifile][iband][readCol-startCol];
                   val_new*=weight_opt[ifile];
                   storeBuffer[iband][ib].push_back(val_new);
                 }
@@ -1083,10 +1116,10 @@ int main(int argc, char *argv[])
                 upperCol=static_cast<int>(upperCol);
                 if(lowerCol<0)
                   lowerCol=0;
-                if(upperCol>=imgReader.nrOfCol())
-                  upperCol=imgReader.nrOfCol()-1;
+                if(upperCol>=imgReader[ifile].nrOfCol())
+                  upperCol=imgReader[ifile].nrOfCol()-1;
                 for(iband=0;iband<nband;++iband){
-                  val_new=(readCol-0.5-lowerCol)*readBuffer[iband][upperCol-startCol]+(1-readCol+0.5+lowerCol)*readBuffer[iband][lowerCol-startCol];
+                  val_new=(readCol-0.5-lowerCol)*readBuffer[ifile][iband][upperCol-startCol]+(1-readCol+0.5+lowerCol)*readBuffer[ifile][iband][lowerCol-startCol];
 		  maxBuffer[ib][val_new]=maxBuffer[ib][val_new]+weight_opt[ifile];
                   // ++(maxBuffer[ib][val_new]);
 		}
@@ -1094,7 +1127,7 @@ int main(int argc, char *argv[])
               default:
                 readCol=static_cast<int>(readCol);
                 for(iband=0;iband<nband;++iband){
-		  val_new=readBuffer[iband][readCol-startCol];
+		  val_new=readBuffer[ifile][iband][readCol-startCol];
 		  maxBuffer[ib][val_new]=maxBuffer[ib][val_new]+weight_opt[ifile];
 		}
                   // ++(maxBuffer[ib][val_new]);
@@ -1110,10 +1143,10 @@ int main(int argc, char *argv[])
                 upperCol=static_cast<int>(upperCol);
                 if(lowerCol<0)
                   lowerCol=0;
-                if(upperCol>=imgReader.nrOfCol())
-                  upperCol=imgReader.nrOfCol()-1;
+                if(upperCol>=imgReader[ifile].nrOfCol())
+                  upperCol=imgReader[ifile].nrOfCol()-1;
                 for(iband=0;iband<nband;++iband){
-                  val_new=(readCol-0.5-lowerCol)*readBuffer[iband][upperCol-startCol]+(1-readCol+0.5+lowerCol)*readBuffer[iband][lowerCol-startCol];
+                  val_new=(readCol-0.5-lowerCol)*readBuffer[ifile][iband][upperCol-startCol]+(1-readCol+0.5+lowerCol)*readBuffer[ifile][iband][lowerCol-startCol];
                   val_new*=weight_opt[ifile];
                   writeBuffer[iband][ib]=val_new;
                 }
@@ -1121,7 +1154,7 @@ int main(int argc, char *argv[])
               default:
                 readCol=static_cast<int>(readCol);
                 for(iband=0;iband<nband;++iband){
-                  val_new=readBuffer[iband][readCol-startCol];
+                  val_new=readBuffer[ifile][iband][readCol-startCol];
                   val_new*=weight_opt[ifile];
                   writeBuffer[iband][ib]=val_new;
                 }
@@ -1134,7 +1167,7 @@ int main(int argc, char *argv[])
           }
         }
       }
-      imgReader.close();
+      // imgReader.close();
     }
     if(cruleMap[crule_opt[0]]==crule::mode){
       vector<short> classBuffer(imgWriter.nrOfCol());
@@ -1236,6 +1269,8 @@ int main(int argc, char *argv[])
   if(extent_opt.size()&&cut_opt.size()){
     extentReader.close();
   }
+  for(int ifile=0;ifile<input_opt.size();++ifile)
+    imgReader[ifile].close();
   if(mask_opt.size())
     maskReader.close();
   imgWriter.close();
diff --git a/src/apps/pkcreatect.cc b/src/apps/pkcreatect.cc
index 89313d0..1cf0090 100644
--- a/src/apps/pkcreatect.cc
+++ b/src/apps/pkcreatect.cc
@@ -57,7 +57,7 @@ Utility to include a color table to a raster dataset. You can either define an e
  | g      | grey                 | bool | false |grey scale | 
  | ct     | ct                   | std::string |       |color table (file with 5 columns: id R G B ALFA (0: transparent, 255: solid) | 
  | d      | description          | std::string |       |Set image description | 
- | of     | oformat              | std::string | GTiff |Output image format (see also gdal_translate). Empty string: inherit from input image | 
+ | of     | oformat              | std::string | GTiff |Output image format (see also gdal_translate).| 
  | co     | co                   | std::string |       |Creation option for output file. Multiple options can be specified. | 
 
 Usage: pkcreatect -i input.txt -o output [-ct colortable | -min value -max value]
@@ -84,7 +84,7 @@ int main(int argc,char **argv) {
   Optionpk<double>  max_opt("max", "max", "maximum value", 100);
   Optionpk<bool>  grey_opt("g", "grey", "grey scale", false);
   Optionpk<string>  colorTable_opt("ct", "ct", "color table (file with 5 columns: id R G B ALFA (0: transparent, 255: solid)");
-  Optionpk<string> oformat_opt("of", "oformat", "Output image format (see also gdal_translate). Empty string: inherit from input image", "GTiff");
+  Optionpk<string> oformat_opt("of", "oformat", "Output image format (see also gdal_translate).", "GTiff");
   Optionpk<string> option_opt("co", "co", "Creation option for output file. Multiple options can be specified.");
   Optionpk<string>  description_opt("d", "description", "Set image description");
   Optionpk<bool>  verbose_opt("v", "verbose", "verbose", false,2);
diff --git a/src/apps/pkcrop.cc b/src/apps/pkcrop.cc
index 384ca23..021f0e8 100644
--- a/src/apps/pkcrop.cc
+++ b/src/apps/pkcrop.cc
@@ -43,7 +43,7 @@ along with pktools.  If not, see <http://www.gnu.org/licenses/>.
   Options: [-of out_format] [-ot {Byte/Int16/UInt16/UInt32/Int32/Float32/Float64/CInt16/CInt32/CFloat32/CFloat64}] [-b band]* [-ulx ULX -uly ULY -lrx LRX -lry LRY] [-dx xres] [-dy yres] [-r resampling_method] [-a_srs epsg:number] [-nodata value] 
 
   Advanced options:
-  	   [-e vector [-cut]] [-co NAME=VALUE]* [-x center_x -y center_y] [-nx size_x -ny size_y] [-ns nsample -nl nlines] [-as min -as max] [-s scale]* [-off offset]* [-ct colortable] [-d description] 
+  	   [-e vector [-cut]] [-sband band -eband band]* [-co NAME=VALUE]* [-x center_x -y center_y] [-nx size_x -ny size_y] [-ns nsample -nl nlines] [-as min -as max] [-scale value]* [-off offset]* [-ct colortable] [-d description] 
 </code>
 
 \section pkcrop_description Description
@@ -60,18 +60,22 @@ The utility pkcrop can subset and stack raster images. In the spatial domain it
  | uly    | uly                  | double | 0     |Upper left y value bounding box | 
  | lrx    | lrx                  | double | 0     |Lower right x value bounding box | 
  | lry    | lry                  | double | 0     |Lower right y value bounding box | 
- | b      | band                 | int  |       |band index to crop (leave empty to retain all bands) | 
+ | b      | band                 | unsigned short |       |band index to crop (leave empty to retain all bands) | 
+ | sband  | startband            | unsigned short |      |Start band sequence number | 
+ | eband  | endband              | unsigned short |      |End band sequence number   | 
  | as     | autoscale            | double |       |scale output to min and max, e.g., --autoscale 0 --autoscale 255 | 
  | ot     | otype                | std::string |       |Data type for output image ({Byte/Int16/UInt16/UInt32/Int32/Float32/Float64/CInt16/CInt32/CFloat32/CFloat64}). Empty string: inherit type from input image | 
- | of     | oformat              | std::string |       |Output image format (see also gdal_translate). Empty string: inherit from input image | 
+ | of     | oformat              | std::string | GTiff |Output image format (see also gdal_translate)| 
  | ct     | ct                   | std::string |       |color table (file with 5 columns: id R G B ALFA (0: transparent, 255: solid) | 
  | dx     | dx                   | double |       |Output resolution in x (in meter) (empty: keep original resolution) | 
  | dy     | dy                   | double |       |Output resolution in y (in meter) (empty: keep original resolution) | 
  | r      | resampling-method    | std::string | near  |Resampling method (near: nearest neighbor, bilinear: bi-linear interpolation). | 
  | e      | extent               | std::string |       |get boundary from extent from polygons in vector file | 
  | cut      | crop_to_cutline    | bool | false |Crop the extent of the target dataset to the extent of the cutline | 
- | m      | mask                 | std::string |       |Use the first band of the specified file as a validity mask (0 is nodata) | 
- | msknodata | msknodata            | float | 0     |Mask value not to consider for composite
+ | m      | mask                 | std::string |       |Use the specified file as a validity mask (0 is nodata) | 
+ | msknodata | msknodata            | float | 0     |Mask value not to consider for crop
+ | msknodata | msknodata            | float | 0     |Mask value not to consider for crop
+ | mskband | mskband              | short | 0     |Mask band to read (0 indexed). Provide band for each mask. | 
  | co     | co                   | std::string |       |Creation option for output file. Multiple options can be specified. | 
  | x      | x                    | double |       |x-coordinate of image center to crop (in meter) | 
  | y      | y                    | double |       |y-coordinate of image center to crop (in meter) | 
@@ -79,7 +83,7 @@ The utility pkcrop can subset and stack raster images. In the spatial domain it
  | ny     | ny                   | double |       |image size in y to crop (in meter) | 
  | ns     | ns                   | int  |       |number of samples  to crop (in pixels) | 
  | nl     | nl                   | int  |       |number of lines to crop (in pixels) | 
- | s      | scale                | double |       |output=scale*input+offset | 
+ | scale  | scale                | double |       |output=scale*input+offset | 
  | off    | offset               | double |       |output=scale*input+offset | 
  | nodata | nodata               | float |       |Nodata value to put in image if out of bounds. | 
  | d      | description          | std::string |       |Set image description | 
@@ -102,8 +106,9 @@ int main(int argc, char *argv[])
   //todo: support layer names
   Optionpk<string>  extent_opt("e", "extent", "get boundary from extent from polygons in vector file");
   Optionpk<bool> cut_opt("cut", "crop_to_cutline", "Crop the extent of the target dataset to the extent of the cutline.",false);
-  Optionpk<string> mask_opt("m", "mask", "Use the first band of the specified file as a validity mask (0 is nodata).");
-  Optionpk<float> msknodata_opt("msknodata", "msknodata", "Mask value not to consider for composite.", 0);
+  Optionpk<string> mask_opt("m", "mask", "Use the the specified file as a validity mask (0 is nodata).");
+  Optionpk<float> msknodata_opt("msknodata", "msknodata", "Mask value not to consider for crop.", 0);
+  Optionpk<short> mskband_opt("mskband", "mskband", "Mask band to read (0 indexed). Provide band for each mask.", 0);
   Optionpk<double>  ulx_opt("ulx", "ulx", "Upper left x value bounding box", 0.0);
   Optionpk<double>  uly_opt("uly", "uly", "Upper left y value bounding box", 0.0);
   Optionpk<double>  lrx_opt("lrx", "lrx", "Lower right x value bounding box", 0.0);
@@ -116,12 +121,14 @@ int main(int argc, char *argv[])
   Optionpk<double> ny_opt("ny", "ny", "image size in y to crop (in meter)");
   Optionpk<int> ns_opt("ns", "ns", "number of samples  to crop (in pixels)");
   Optionpk<int> nl_opt("nl", "nl", "number of lines to crop (in pixels)");
-  Optionpk<int>  band_opt("b", "band", "band index to crop (leave empty to retain all bands)");
+  Optionpk<unsigned short>  band_opt("b", "band", "band index to crop (leave empty to retain all bands)");
+  Optionpk<unsigned short> bstart_opt("sband", "startband", "Start band sequence number"); 
+  Optionpk<unsigned short> bend_opt("eband", "endband", "End band sequence number"); 
   Optionpk<double> autoscale_opt("as", "autoscale", "scale output to min and max, e.g., --autoscale 0 --autoscale 255");
-  Optionpk<double> scale_opt("s", "scale", "output=scale*input+offset");
-  Optionpk<double> offset_opt("off", "offset", "output=scale*input+offset");
+  Optionpk<double> scale_opt("scale", "scale", "output=scale*input+offset");
+  Optionpk<double> offset_opt("offset", "offset", "output=scale*input+offset");
   Optionpk<string>  otype_opt("ot", "otype", "Data type for output image ({Byte/Int16/UInt16/UInt32/Int32/Float32/Float64/CInt16/CInt32/CFloat32/CFloat64}). Empty string: inherit type from input image","");
-  Optionpk<string>  oformat_opt("of", "oformat", "Output image format (see also gdal_translate). Empty string: inherit from input image");
+  Optionpk<string>  oformat_opt("of", "oformat", "Output image format (see also gdal_translate).","GTiff");
   Optionpk<string> option_opt("co", "co", "Creation option for output file. Multiple options can be specified.");
   Optionpk<string>  colorTable_opt("ct", "ct", "color table (file with 5 columns: id R G B ALFA (0: transparent, 255: solid)");
   Optionpk<float>  nodata_opt("nodata", "nodata", "Nodata value to put in image if out of bounds.");
@@ -131,8 +138,11 @@ int main(int argc, char *argv[])
 
   extent_opt.setHide(1);
   cut_opt.setHide(1);
+  bstart_opt.setHide(1);
+  bend_opt.setHide(1);
   mask_opt.setHide(1);
   msknodata_opt.setHide(1);
+  mskband_opt.setHide(1);
   option_opt.setHide(1);
   cx_opt.setHide(1);
   cy_opt.setHide(1);
@@ -155,6 +165,8 @@ int main(int argc, char *argv[])
     lrx_opt.retrieveOption(argc,argv);
     lry_opt.retrieveOption(argc,argv);
     band_opt.retrieveOption(argc,argv);
+    bstart_opt.retrieveOption(argc,argv);
+    bend_opt.retrieveOption(argc,argv);
     autoscale_opt.retrieveOption(argc,argv);
     otype_opt.retrieveOption(argc,argv);
     oformat_opt.retrieveOption(argc,argv);
@@ -166,6 +178,7 @@ int main(int argc, char *argv[])
     cut_opt.retrieveOption(argc,argv);
     mask_opt.retrieveOption(argc,argv);
     msknodata_opt.retrieveOption(argc,argv);
+    mskband_opt.retrieveOption(argc,argv);
     option_opt.retrieveOption(argc,argv);
     cx_opt.retrieveOption(argc,argv);
     cy_opt.retrieveOption(argc,argv);
@@ -235,6 +248,29 @@ int main(int argc, char *argv[])
   if(dy_opt.size())
     dy=dy_opt[0];
 
+  //convert start and end band options to vector of band indexes
+  try{
+    if(bstart_opt.size()){
+      if(bend_opt.size()!=bstart_opt.size()){
+	string errorstring="Error: options for start and end band indexes must be provided as pairs, missing end band";
+	throw(errorstring);
+      }
+      band_opt.clear();
+      for(int ipair=0;ipair<bstart_opt.size();++ipair){
+	if(bend_opt[ipair]<=bstart_opt[ipair]){
+	  string errorstring="Error: index for end band must be smaller then start band";
+	  throw(errorstring);
+	}
+	for(int iband=bstart_opt[ipair];iband<=bend_opt[ipair];++iband)
+	  band_opt.push_back(iband);
+      }
+    }
+  }
+  catch(string error){
+    cerr << error << std::endl;
+    exit(1);
+  }
+
   bool isGeoRef=false;
   string projectionString;
   for(int iimg=0;iimg<input_opt.size();++iimg){
@@ -393,6 +429,10 @@ int main(int argc, char *argv[])
       if(verbose_opt[0]>=1)
 	std::cout << "opening mask image file " << mask_opt[0] << std::endl;
       maskReader.open(mask_opt[0]);
+      if(mskband_opt[0]>=maskReader.nrOfBand()){
+	string errorString="Error: illegal mask band";
+	throw(errorString);
+      }
     }
     catch(string error){
       cerr << error << std::endl;
@@ -534,7 +574,7 @@ int main(int argc, char *argv[])
       //   theInterleave=interleave_opt[0];
       // else
       //   theInterleave=imgReader.getInterleave();
-      string imageType=imgReader.getImageType();
+      string imageType;//=imgReader.getImageType();
       if(oformat_opt.size())//default
         imageType=oformat_opt[0];
       try{
@@ -699,7 +739,7 @@ int main(int argc, char *argv[])
 
 		      assert(rowMask>=0&&rowMask<maskReader.nrOfRow());
 		      try{
-			maskReader.readData(lineMask,GDT_Float32,static_cast<int>(rowMask));
+			maskReader.readData(lineMask,GDT_Float32,static_cast<int>(rowMask),mskband_opt[0]);
 		      }
 		      catch(string errorstring){
 			cerr << errorstring << endl;
diff --git a/src/apps/pkdiff.cc b/src/apps/pkdiff.cc
index d3c2766..b097268 100644
--- a/src/apps/pkdiff.cc
+++ b/src/apps/pkdiff.cc
@@ -70,6 +70,7 @@ A typical use of the utility is to assess the accuracy of an input raster land c
  | msknodata | msknodata            | double | 0     |Mask value(s) where image is invalid. Use negative value for valid data (example: use -t -1: if only -1 is valid value) | 
  | o      | output               | std::string |       |Output dataset (optional) | 
  | f      | f                    | std::string | SQLite |OGR format for output vector (for vector reference datasets only) | 
+ | of     | oformat              | std::string | GTiff |Output image format (see also gdal_translate).| 
  | lc     | lclass               | std::string | class |Attribute name of the classified label (for vector reference datasets only) | 
  | cmf    | cmf                  | std::string | ascii |Format for confusion matrix (ascii or latex) | 
  | cmo    | cmo                  | std::string |       |Output file for confusion matrix | 
@@ -111,6 +112,7 @@ int main(int argc, char *argv[])
   Optionpk<short> classvalue_opt("r", "reclass", "List of class values (use same order as in classname option)."); 
   Optionpk<string> output_opt("o", "output", "Output dataset (optional)");
   Optionpk<string> ogrformat_opt("f", "f", "OGR format for output vector (for vector reference datasets only)","SQLite");
+  Optionpk<string>  oformat_opt("of", "oformat", "Output image format (see also gdal_translate).","GTiff");
   Optionpk<string> labelclass_opt("lc", "lclass", "Attribute name of the classified label (for vector reference datasets only)", "class");
   Optionpk<short> boundary_opt("bnd", "boundary", "Boundary for selecting the sample (for vector reference datasets only)", 1,1);
   Optionpk<bool> homogeneous_opt("hom", "homogeneous", "Only take regions with homogeneous boundary into account (for reference datasets only)", false,1);
@@ -124,6 +126,7 @@ int main(int argc, char *argv[])
 
   output_opt.setHide(1);
   ogrformat_opt.setHide(1);
+  oformat_opt.setHide(1);
   labelclass_opt.setHide(1);
   boundary_opt.setHide(1);
   homogeneous_opt.setHide(1);
@@ -675,7 +678,7 @@ int main(int argc, char *argv[])
           theInterleave+=inputReader.getInterleave();
           option_opt.push_back(theInterleave);
         }
-        gdalWriter.open(output_opt[0],inputReader.nrOfCol(),inputReader.nrOfRow(),1,inputReader.getDataType(),inputReader.getImageType(),option_opt);
+        gdalWriter.open(output_opt[0],inputReader.nrOfCol(),inputReader.nrOfRow(),1,inputReader.getDataType(),oformat_opt[0],option_opt);
 	if(nodata_opt.size())
 	  gdalWriter.GDALSetNoDataValue(nodata_opt[0]);
 	gdalWriter.copyGeoTransform(inputReader);
diff --git a/src/apps/pkdsm2shadow.cc b/src/apps/pkdsm2shadow.cc
index edd0d5e..fab6011 100644
--- a/src/apps/pkdsm2shadow.cc
+++ b/src/apps/pkdsm2shadow.cc
@@ -65,7 +65,7 @@ Utility to create a binary shadow mask from a digital surface model, based on Su
  | off    | offset               | double |       |offset used for input dsm: height=scale*input+offset | 
  | co     | co                   | std::string |       |Creation option for output file. Multiple options can be specified. | 
  | ot     | otype                | std::string |       |Data type for output image ({Byte/Int16/UInt16/UInt32/Int32/Float32/Float64/CInt16/CInt32/CFloat32/CFloat64}). Empty string: inherit type from input image | 
- | of     | oformat              | std::string |       |Output image format (see also gdal_translate). Empty string: inherit from input image | 
+ | of     | oformat              | std::string | GTiff |Output image format (see also gdal_translate).| 
  | ct     | ct                   | std::string |       |color table (file with 5 columns: id R G B ALFA (0: transparent, 255: solid) | 
 
 Usage: pkdsm2shadow -i input.txt -o output [-sza angle] [-saa angle]
@@ -88,7 +88,7 @@ int main(int argc,char **argv) {
   Optionpk<double> saa_opt("saa", "saa", "Sun azimuth angle (N=0 E=90 S=180 W=270).");
   Optionpk<int> flag_opt("f", "flag", "Flag to put in image if pixel shadow", 0);
   Optionpk<std::string>  otype_opt("ot", "otype", "Data type for output image ({Byte/Int16/UInt16/UInt32/Int32/Float32/Float64/CInt16/CInt32/CFloat32/CFloat64}). Empty string: inherit type from input image", "");
-  Optionpk<string>  oformat_opt("of", "oformat", "Output image format (see also gdal_translate). Empty string: inherit from input image");
+  Optionpk<string>  oformat_opt("of", "oformat", "Output image format (see also gdal_translate).","GTiff");
   Optionpk<string>  colorTable_opt("ct", "ct", "color table (file with 5 columns: id R G B ALFA (0: transparent, 255: solid)");
   Optionpk<string> option_opt("co", "co", "Creation option for output file. Multiple options can be specified.");
   Optionpk<double> scale_opt("s", "scale", "scale used for input dsm: height=scale*input+offset");
@@ -153,7 +153,7 @@ int main(int argc,char **argv) {
   if(verbose_opt[0])
     std::cout << std::endl << "Output pixel type:  " << GDALGetDataTypeName(theType) << endl;
 
-  string imageType=input.getImageType();
+  string imageType;//=input.getImageType();
   if(oformat_opt.size())
     imageType=oformat_opt[0];
 
diff --git a/src/apps/pkextract.cc b/src/apps/pkextract.cc
index 5215460..98ad942 100644
--- a/src/apps/pkextract.cc
+++ b/src/apps/pkextract.cc
@@ -48,7 +48,7 @@ along with pktools.  If not, see <http://www.gnu.org/licenses/>.
   Options: [-ln layer]* [-c class]* [-t threshold]* [-f format] [-ft fieldType] [-lt labelType] [-polygon] [-b band]* [-r rule]
 
   Advanced options:
-       [-bndnodata band -srcnodata value]* [-tp threshold] [-test testSample] [-bn attribute] [-cn attribute] [-geo value] [-down value] [-buf value [-circ]]
+  [-sband band -eband band]* [-bndnodata band -srcnodata value]* [-tp threshold] [-test testSample] [-bn attribute] [-cn attribute] [-geo value] [-down value] [-buf value [-circ]]
 </code>
 
 \section pkextract_description Description
@@ -59,6 +59,25 @@ Instead of a vector dataset, the sample can also be a raster dataset with catego
 
 A typical usage of pkextract is to prepare a training sample for one of the classifiers implemented in pktools.
 
+\anchor pkextract_rules 
+
+Overview of the possible extraction rules:
+
+extraction rule | output features
+--------------- | ---------------
+point | Extract all pixel values covered by the polygon (option -polygon not set) or extract a pixel on the surface option (-polygon set).
+centroid | Extract pixel value at the centroid of the polygon.
+mean | Extract average of all pixel values within the polygon.
+stdev | Extract standard deviation of all pixel values within the polygon.
+median | Extract median of all pixel values within the polygon.
+min | Extract minimum value of all pixels within the polygon.
+max | Extract maximum value of all pixels within the polygon.
+sum | Extract sum of the values of all pixels within the polygon.
+mode | Extract the mode of classes within the polygon (classes must be set with the option class).
+proportion | Extract proportion of class(es) within the polygon (classes must be set with the option class).
+count | Extract count of class(es) within the polygon (classes must be set with the option class).
+percentile | Extract percentile as defined by option perc (e.g, 95th percentile of values covered by polygon).
+
 \section pkextract_options Options
  - use either `-short` or `--long` options (both `--long=value` and `--long value` are supported)
  - short option `-h` shows basic options only, long option `--help` shows all options
@@ -70,7 +89,7 @@ A typical usage of pkextract is to prepare a training sample for one of the clas
  | rand   | random               | unsigned int |       |Create simple random sample of points. Provide number of points to generate | 
  | grid   | grid                 | double |       |Create systematic grid of points. Provide cell grid size (in projected units, e.g,. m) | 
  | o      | output               | std::string |       |Output sample dataset | 
- | c      | class                | int  |       |Class(es) to extract from input sample image. Leave empty to extract all valid data pixels from sample dataset. Make sure to set classes if rule is set to mode or proportion | 
+ | c      | class                | int  |       |Class(es) to extract from input sample image. Leave empty to extract all valid data pixels from sample dataset. Make sure to set classes if rule is set to mode, proportion or count | 
  | t      | threshold            | float | 100   |Probability threshold for selecting samples (randomly). Provide probability in percentage (>0) or absolute (<0). Use a single threshold for vector sample datasets. If using raster land cover maps as a sample dataset, you can provide a threshold value for each class (e.g. -t 80 -t 60). Use value 100 to select all pixels for selected class(es) | 
  | perc   | perc                 | double | 95    |Percentile value used for rule percentile | 
  | f      | f                    | std::string | SQLite |Output sample dataset format | 
@@ -78,7 +97,9 @@ A typical usage of pkextract is to prepare a training sample for one of the clas
  | lt     | ltype                | std::string | Integer |Label type: In16 or String | 
  | polygon | polygon              | bool | false |Create OGRPolygon as geometry instead of OGRPoint. | 
  | b      | band                 | int  |       |Band index(es) to extract (0 based). Leave empty to use all bands | 
- | r      | rule                 | std::string | centroid |Rule how to report image information per feature (only for vector sample). point (value at each point or at centroid if polygon), centroid, mean, stdev, median, proportion, min, max, mode, sum, percentile. | 
+ | sband  | startband            | unsigned short |      |Start band sequence number | 
+ | eband  | endband              | unsigned short |      |End band sequence number   | 
+ | r      | rule                 | std::string | centroid |Rule how to report image information per feature (only for vector sample). point (value at each point or at centroid if polygon), centroid, mean, stdev, median, proportion, count, min, max, mode, sum, percentile. | 
  | bndnodata | bndnodata            | int  | 0     |Band(s) in input image to check if pixel is valid (used for srcnodata) | 
  | srcnodata | srcnodata            | double |       |Invalid value(s) for input image | 
  | tp     | thresholdPolygon     | float |       |(absolute) threshold for selecting samples in each polygon | 
@@ -99,7 +120,7 @@ Some examples how to use pkextract can be found \ref examples_pkextract "here"
 **/
 
 namespace rule{
-  enum RULE_TYPE {point=0, mean=1, proportion=2, custom=3, min=4, max=5, mode=6, centroid=7, sum=8, median=9, stdev=10, percentile=11};
+  enum RULE_TYPE {point=0, mean=1, proportion=2, custom=3, min=4, max=5, mode=6, centroid=7, sum=8, median=9, stdev=10, percentile=11, count=12};
 }
 
 using namespace std;
@@ -112,7 +133,7 @@ int main(int argc, char *argv[])
   Optionpk<unsigned int> random_opt("rand", "random", "Create simple random sample of points. Provide number of points to generate");
   Optionpk<double> grid_opt("grid", "grid", "Create systematic grid of points. Provide cell grid size (in projected units, e.g,. m)");
   Optionpk<string> output_opt("o", "output", "Output sample dataset");
-  Optionpk<int> class_opt("c", "class", "Class(es) to extract from input sample image. Leave empty to extract all valid data pixels from sample dataset. Make sure to set classes if rule is set to mode or proportion");
+  Optionpk<int> class_opt("c", "class", "Class(es) to extract from input sample image. Leave empty to extract all valid data pixels from sample dataset. Make sure to set classes if rule is set to mode, proportion or count");
   Optionpk<float> threshold_opt("t", "threshold", "Probability threshold for selecting samples (randomly). Provide probability in percentage (>0) or absolute (<0). Use a single threshold for vector sample datasets. If using raster land cover maps as a sample dataset, you can provide a threshold value for each class (e.g. -t 80 -t 60). Use value 100 to select all pixels for selected class(es)", 100);
   Optionpk<double> percentile_opt("perc","perc","Percentile value used for rule percentile",95);
   Optionpk<string> ogrformat_opt("f", "f", "Output sample dataset format","SQLite");
@@ -120,7 +141,9 @@ int main(int argc, char *argv[])
   Optionpk<string> ltype_opt("lt", "ltype", "Label type: In16 or String", "Integer");
   Optionpk<bool> polygon_opt("polygon", "polygon", "Create OGRPolygon as geometry instead of OGRPoint.", false);
   Optionpk<int> band_opt("b", "band", "Band index(es) to extract (0 based). Leave empty to use all bands");
-  Optionpk<string> rule_opt("r", "rule", "Rule how to report image information per feature (only for vector sample). point (value at each point or at centroid if polygon), centroid, mean, stdev, median, proportion, min, max, mode, sum, percentile.", "centroid");
+  Optionpk<unsigned short> bstart_opt("sband", "startband", "Start band sequence number"); 
+  Optionpk<unsigned short> bend_opt("eband", "endband", "End band sequence number"); 
+  Optionpk<string> rule_opt("r", "rule", "Rule how to report image information per feature (only for vector sample). point (value at each point or at centroid if polygon), centroid, mean, stdev, median, proportion, count, min, max, mode, sum, percentile.", "centroid");
   Optionpk<double> srcnodata_opt("srcnodata", "srcnodata", "Invalid value(s) for input image");
   Optionpk<int> bndnodata_opt("bndnodata", "bndnodata", "Band(s) in input image to check if pixel is valid (used for srcnodata)", 0);
   Optionpk<float> polythreshold_opt("tp", "thresholdPolygon", "(absolute) threshold for selecting samples in each polygon");
@@ -133,6 +156,8 @@ int main(int argc, char *argv[])
   Optionpk<bool> disc_opt("circ", "circular", "Use a circular disc kernel buffer (for vector point sample datasets only, use in combination with buffer option)", false);
   Optionpk<short> verbose_opt("v", "verbose", "Verbose mode if > 0", 0,2);
 
+  bstart_opt.setHide(1);
+  bend_opt.setHide(1);
   bndnodata_opt.setHide(1);
   srcnodata_opt.setHide(1);
   polythreshold_opt.setHide(1);
@@ -161,6 +186,8 @@ int main(int argc, char *argv[])
     ltype_opt.retrieveOption(argc,argv);
     polygon_opt.retrieveOption(argc,argv);
     band_opt.retrieveOption(argc,argv);
+    bstart_opt.retrieveOption(argc,argv);
+    bend_opt.retrieveOption(argc,argv);
     rule_opt.retrieveOption(argc,argv);
     bndnodata_opt.retrieveOption(argc,argv);
     srcnodata_opt.retrieveOption(argc,argv);
@@ -196,6 +223,7 @@ int main(int argc, char *argv[])
   ruleMap["stdev"]=rule::stdev;
   ruleMap["median"]=rule::median;
   ruleMap["proportion"]=rule::proportion;
+  ruleMap["count"]=rule::count;
   ruleMap["min"]=rule::min;
   ruleMap["max"]=rule::max;
   ruleMap["custom"]=rule::custom;
@@ -241,6 +269,29 @@ int main(int argc, char *argv[])
     std::cout << errorstring << std::endl;
     exit(0);
   }
+
+  //convert start and end band options to vector of band indexes
+  try{
+    if(bstart_opt.size()){
+      if(bend_opt.size()!=bstart_opt.size()){
+	string errorstring="Error: options for start and end band indexes must be provided as pairs, missing end band";
+	throw(errorstring);
+      }
+      band_opt.clear();
+      for(int ipair=0;ipair<bstart_opt.size();++ipair){
+	if(bend_opt[ipair]<=bstart_opt[ipair]){
+	  string errorstring="Error: index for end band must be smaller then start band";
+	  throw(errorstring);
+	}
+	for(int iband=bstart_opt[ipair];iband<=bend_opt[ipair];++iband)
+	  band_opt.push_back(iband);
+      }
+    }
+  }
+  catch(string error){
+    cerr << error << std::endl;
+    exit(1);
+  }
   
   int nband=(band_opt.size()) ? band_opt.size() : imgReader.nrOfBand();
 
@@ -806,17 +857,44 @@ int main(int argc, char *argv[])
       std::cout << "creating image sample writer " << output_opt[0] << std::endl;
     ImgWriterOgr ogrWriter;
     ImgWriterOgr ogrTestWriter;
-    ogrWriter.open(output_opt[0],ogrformat_opt[0]);
-    if(test_opt.size()){
-      if(verbose_opt[0]>1)
-	std::cout << "creating image test writer " << test_opt[0] << std::endl;
-      try{
+    try{
+      ogrWriter.open(output_opt[0],ogrformat_opt[0]);
+      if(test_opt.size()){
+	if(verbose_opt[0]>1)
+	  std::cout << "creating image test writer " << test_opt[0] << std::endl;
 	ogrTestWriter.open(test_opt[0],ogrformat_opt[0]);
       }
-      catch(string errorString){
-	cerr << errorString << endl;
+
+      //if class_opt not set, get number of classes from input image for these rules
+      switch(ruleMap[rule_opt[0]]){
+      case(rule::proportion):
+      case(rule::count):
+      case(rule::custom):
+      case(rule::mode):{
+	if(class_opt.empty()){
+	  int theBand=0;
+	  double minValue=0;
+	  double maxValue=0;
+	  if(band_opt.size())
+	    theBand=band_opt[0];
+	  imgReader.getMinMax(minValue,maxValue,theBand);
+	  int nclass=maxValue-minValue+1;
+	  if(nclass<0&&nclass<256){
+	    string errorString="Could not automatically define classes, please set class option";
+	    throw(errorString);
+	  }
+	  for(int iclass=minValue;iclass<=maxValue;++iclass)
+	    class_opt.push_back(iclass);
+	}
+	break;
       }
+      }
+    }
+    catch(string errorString){
+      cerr << errorString << endl;
+      exit(1);
     }
+    
     //support multiple layers
     int nlayerRead=sampleReaderOgr.getDataSource()->GetLayerCount();
     int ilayerWrite=0;
@@ -872,7 +950,8 @@ int main(int argc, char *argv[])
 
       if(class_opt.size()){
 	switch(ruleMap[rule_opt[0]]){
-	case(rule::proportion):{//proportion for each class
+	case(rule::proportion)://proportion for each class
+	case(rule::count):{//count for each class
 	  for(int iclass=0;iclass<class_opt.size();++iclass){
 	    ostringstream cs;
 	    cs << class_opt[iclass];
@@ -1076,15 +1155,6 @@ int main(int argc, char *argv[])
 	    vector< Vector2d<double> > readValues(nband);
 	    for(int iband=0;iband<nband;++iband){
 	      int theBand=(band_opt.size()) ? band_opt[iband] : iband;
-	      //test
-	      assert(uli>=0);
-	      assert(uli<imgReader.nrOfCol());	      
-	      assert(lri>=0);
-	      assert(lri<imgReader.nrOfCol());	      
-	      assert(ulj>=0);
-	      assert(ulj<imgReader.nrOfRow());	      
-	      assert(lrj>=0);
-	      assert(lrj<imgReader.nrOfRow());	      
 	      imgReader.readDataBlock(readValues[iband],GDT_Float64,uli,lri,ulj,lrj,theBand);
 	    }
 
@@ -1373,10 +1443,11 @@ int main(int argc, char *argv[])
 		}
 	      }
 	      else{//class_opt is set
-		if(ruleMap[rule_opt[0]]==rule::proportion){
+		if(ruleMap[rule_opt[0]]==rule::proportion||ruleMap[rule_opt[0]]==rule::count){
 		  if(verbose_opt[0])
 		    std::cout << "number of points in polygon: " << nPointWindow << std::endl;
-		  stat.normalize_pct(windowClassValues);
+		  if(ruleMap[rule_opt[0]]==rule::proportion)
+		    stat.normalize_pct(windowClassValues);
 		  for(int index=0;index<windowClassValues.size();++index){
 		    double theValue=windowClassValues[index];
 		    ostringstream fs;
@@ -1488,9 +1559,10 @@ int main(int argc, char *argv[])
 	      std::cout << "get point on polygon" << std::endl;
 	    if(ruleMap[rule_opt[0]]==rule::centroid)
 	      readPolygon.Centroid(&writeCentroidPoint);
-	    else
-	      readPolygon.PointOnSurface(&writeCentroidPoint);
-
+	    else if(readPolygon.PointOnSurface(&writeCentroidPoint)!=OGRERR_NONE){
+	      // cerr << "function PointOnSurface failed, trying centroid instead" << endl;
+	      readPolygon.Centroid(&writeCentroidPoint);
+	    }
 	    double ulx,uly,lrx,lry;
 	    double uli,ulj,lri,lrj;
 	    if((polygon_opt[0]&&ruleMap[rule_opt[0]]==rule::point)||(ruleMap[rule_opt[0]]==rule::centroid)){
@@ -1579,15 +1651,6 @@ int main(int argc, char *argv[])
 	    vector< Vector2d<double> > readValues(nband);
 	    for(int iband=0;iband<nband;++iband){
 	      int theBand=(band_opt.size()) ? band_opt[iband] : iband;
-	      //test
-	      assert(uli>=0);
-	      assert(uli<imgReader.nrOfCol());	      
-	      assert(lri>=0);
-	      assert(lri<imgReader.nrOfCol());	      
-	      assert(ulj>=0);
-	      assert(ulj<imgReader.nrOfRow());	      
-	      assert(lrj>=0);
-	      assert(lrj<imgReader.nrOfRow());	      
 	      imgReader.readDataBlock(readValues[iband],GDT_Float64,uli,lri,ulj,lrj,theBand);
 	    }
 
@@ -1605,7 +1668,6 @@ int main(int argc, char *argv[])
 		imgReader.image2geo(i,j,theX,theY);
 		thePoint.setX(theX);
 		thePoint.setY(theY);
-		
 		if(ruleMap[rule_opt[0]]!=rule::centroid&&!readPolygon.Contains(&thePoint))
 		  continue;
 
@@ -1654,7 +1716,6 @@ int main(int argc, char *argv[])
 		    //test
 		    writePointFeature->SetGeometry(&thePoint);
 		    assert(wkbFlatten(writePointFeature->GetGeometryRef()->getGeometryType()) == wkbPoint);
-		    //test
 		    // OGRGeometry *updateGeometry;
 		    // updateGeometry = writePointFeature->GetGeometryRef();
 		    // OGRPoint *poPoint = (OGRPoint *) updateGeometry;
@@ -1671,13 +1732,7 @@ int main(int argc, char *argv[])
 		}
 		else{
 		  for(int iband=0;iband<nband;++iband){
-		    int theBand=(band_opt.size()) ? band_opt[iband] : iband;
-		    assert(j-ulj>=0);
-		    assert(j-ulj<readValues[iband].size());
-		    assert(i-uli>=0);
-		    assert(i-uli<((readValues[iband])[j-ulj]).size());
 		    double value=((readValues[iband])[j-ulj])[i-uli];
-		    // imgReader.readData(value,GDT_Float64,i,j,theBand);
 		    if(verbose_opt[0]>1)
 		      std::cout << ": " << value << std::endl;
 		    if(polygon_opt[0]||ruleMap[rule_opt[0]]!=rule::point)
@@ -1753,16 +1808,10 @@ int main(int argc, char *argv[])
 		//create feature
 		if(verbose_opt[0]>1)
 		  std::cout << "copying fields from polygons " << std::endl;
-		//test
-		//writeCentroidFeature->SetGeometry(&writeCentroidPoint);
 		if(writeCentroidFeature->SetFrom(readFeature)!= OGRERR_NONE)
 		  cerr << "writing feature failed" << std::endl;
-		//test
 		writeCentroidFeature->SetGeometry(&writeCentroidPoint);
 		assert(wkbFlatten(writeCentroidFeature->GetGeometryRef()->getGeometryType()) == wkbPoint );
-		// OGRGeometry *updateGeometry;
-		// updateGeometry = writeCentroidFeature->GetGeometryRef();
-		// assert(wkbFlatten(updateGeometry->getGeometryType()) == wkbPoint );
 		if(verbose_opt[0]>1)
 		  std::cout << "write feature has " << writeCentroidFeature->GetFieldCount() << " fields" << std::endl;
 	      }
@@ -1865,10 +1914,11 @@ int main(int argc, char *argv[])
 		}
 	      }
 	      else{//class_opt is set
-		if(ruleMap[rule_opt[0]]==rule::proportion){
+		if(ruleMap[rule_opt[0]]==rule::proportion||ruleMap[rule_opt[0]]==rule::count){
 		  if(verbose_opt[0])
 		    std::cout << "number of points in polygon: " << nPointPolygon << std::endl;
-		  stat.normalize_pct(polyClassValues);
+		  if(ruleMap[rule_opt[0]]==rule::proportion)
+		    stat.normalize_pct(polyClassValues);
 		  for(int index=0;index<polyClassValues.size();++index){
 		    double theValue=polyClassValues[index];
 		    ostringstream fs;
@@ -1977,7 +2027,6 @@ int main(int argc, char *argv[])
 
 	    if(verbose_opt[0]>1)
 	      std::cout << "get centroid point from polygon" << std::endl;
-
 	    readPolygon.Centroid(&writeCentroidPoint);
 
 	    double ulx,uly,lrx,lry;
@@ -2066,15 +2115,6 @@ int main(int argc, char *argv[])
 	    vector< Vector2d<double> > readValues(nband);
 	    for(int iband=0;iband<nband;++iband){
 	      int theBand=(band_opt.size()) ? band_opt[iband] : iband;
-	      //test
-	      assert(uli>=0);
-	      assert(uli<imgReader.nrOfCol());	      
-	      assert(lri>=0);
-	      assert(lri<imgReader.nrOfCol());	      
-	      assert(ulj>=0);
-	      assert(ulj<imgReader.nrOfRow());	      
-	      assert(lrj>=0);
-	      assert(lrj<imgReader.nrOfRow());	      
 	      imgReader.readDataBlock(readValues[iband],GDT_Float64,uli,lri,ulj,lrj,theBand);
 	    }
 
@@ -2134,10 +2174,10 @@ int main(int argc, char *argv[])
 			writePointFeature = OGRFeature::CreateFeature(writeLayer->GetLayerDefn());
 		      if(verbose_opt[0]>1)
 			std::cout << "copying fields from polygons " << std::endl;
-		      //test
-		      // writePointFeature->SetGeometry(&thePoint);
 		      if(writePointFeature->SetFrom(readFeature)!= OGRERR_NONE)
 			cerr << "writing feature failed" << std::endl;
+		      if(verbose_opt[0]>1)
+			std::cout << "set geometry as point " << std::endl;
 		      //test
 		      writePointFeature->SetGeometry(&thePoint);
 		      assert(wkbFlatten(writePointFeature->GetGeometryRef()->getGeometryType()) == wkbPoint);
@@ -2157,13 +2197,7 @@ int main(int argc, char *argv[])
 		  }
 		  else{
 		    for(int iband=0;iband<nband;++iband){
-		      //test
-		      assert(j-ulj>=0);
-		      assert(j-ulj<readValues[iband].size());
-		      assert(i-uli>=0);
-		      assert(i-uli<((readValues[iband])[j-ulj]).size());
 		      double value=((readValues[iband])[j-ulj])[i-uli];
-		      // imgReader.readData(value,GDT_Float64,i,j,theBand);
 		      if(verbose_opt[0]>1)
 			std::cout << ": " << value << std::endl;
 		      if(polygon_opt[0]||ruleMap[rule_opt[0]]!=rule::point)
@@ -2179,17 +2213,6 @@ int main(int argc, char *argv[])
 			case OFTString:
 			  writePointFeature->SetField(fieldname_opt[iband].c_str(),type2string<double>(value).c_str());
 			  break;
-			  // case OFTRealList:{
-			  //   int fieldIndex=writePointFeature->GetFieldIndex(fieldname_opt[iband].c_str());
-			  //   int nCount;
-			  //   const double *theList;
-			  //   theList=writePointFeature->GetFieldAsDoubleList(fieldIndex,&nCount);
-			  //   vector<double> vectorList(nCount+1);
-			  //   for(int index=0;index<nCount;++index)
-			  // 	vectorList[nCount]=value;
-			  //   writePointFeature->SetField(fieldIndex,vectorList.size(),&(vectorList[0]));
-			  //   break;
-			  // }
 			default://not supported
 			  assert(0);
 			  break;
@@ -2251,16 +2274,10 @@ int main(int argc, char *argv[])
 		//create feature
 		if(verbose_opt[0]>1)
 		  std::cout << "copying fields from polygons " << std::endl;
-		//test
-		// writeCentroidFeature->SetGeometry(&writeCentroidPoint);
 		if(writeCentroidFeature->SetFrom(readFeature)!= OGRERR_NONE)
 		  cerr << "writing feature failed" << std::endl;
 		writeCentroidFeature->SetGeometry(&writeCentroidPoint);
 		assert(wkbFlatten(writeCentroidFeature->GetGeometryRef()->getGeometryType()) == wkbPoint);
-		//test
-		// OGRGeometry *updateGeometry;
-		// updateGeometry = writeCentroidFeature->GetGeometryRef();
-		// assert(wkbFlatten(updateGeometry->getGeometryType()) == wkbPoint );
 		if(verbose_opt[0]>1)
 		  std::cout << "write feature has " << writeCentroidFeature->GetFieldCount() << " fields" << std::endl;
 	      }
@@ -2363,10 +2380,11 @@ int main(int argc, char *argv[])
 		}
 	      }
 	      else{//class_opt is set
-		if(ruleMap[rule_opt[0]]==rule::proportion){
+		if(ruleMap[rule_opt[0]]==rule::proportion||ruleMap[rule_opt[0]]==rule::count){
 		  if(verbose_opt[0])
 		    std::cout << "number of points in polygon: " << nPointPolygon << std::endl;
-		  stat.normalize_pct(polyClassValues);
+		  if(ruleMap[rule_opt[0]]==rule::proportion)
+		    stat.normalize_pct(polyClassValues);
 		  for(int index=0;index<polyClassValues.size();++index){
 		    double theValue=polyClassValues[index];
 		    ostringstream fs;
@@ -2491,6 +2509,7 @@ int main(int argc, char *argv[])
       pfnProgress(progress,pszMessage,pProgressArg);
       ++ilayerWrite;
     }//for ilayer
+    sampleReaderOgr.close();
     ogrWriter.close();
     if(test_opt.size())
       ogrTestWriter.close();
diff --git a/src/apps/pkfilter.cc b/src/apps/pkfilter.cc
index 252ac8a..32f305f 100644
--- a/src/apps/pkfilter.cc
+++ b/src/apps/pkfilter.cc
@@ -54,20 +54,128 @@ along with pktools.  If not, see <http://www.gnu.org/licenses/>.
 This utility implements spatial and spectral filtering for raster data. In the spatial domain (X, Y), the filter typically involves a rectangular convolution kernel (moving window). To avoid image shifting, the size of the window should be odd (3, 5, 7, ...). You can set the window sizes in X and Y directions separately with the options -dx and -dy. A circular kernel (disc) is applied if option -circ is set. An overview of the supported filters (option -f|--filter) is given below. You ca [...]
 
 \anchor pkfilter_functions
-//hiero
-composite rule | composite output
-------------- | -------------
-overwrite | Overwrite overlapping pixels: the latter input image on the command line overrules the previous image
-maxndvi | Create a maximum NDVI (normalized difference vegetation index) composite from multi-band input images. Use option -cb  to set the indexes of the red and near infrared bands respectively (e.g., -cb 0 -cb 1)
-maxband | Select the pixel with a maximum value in the band specified by option -cb
-minband | Select the pixel with a minimum value in the band specified by option -cb
-mean | Calculate the mean (average) of overlapping pixels
-stdev | Calculate the standard deviation of overlapping pixels
-median | Calculate the median of overlapping pixels
-mode | Select the mode of overlapping pixels (maximum voting): use for Byte images only
-sum | Calculate the arithmetic sum of overlapping pixels
-maxallbands | For each individual band, assign the maximum value found in all overlapping pixels. Unlike maxband, output band values cannot be attributed to a single (date) pixel in the input time series
-minallbands | For each individual band, assign the minimum value found in all overlapping pixels. Unlike minband, output band values cannot be attributed to a single (date) pixel in the input time series
+
+\subsection pkfilter_functions_1 Filters in spatial (dx, dy) and spectral/temporal (dz) domain
+
+\subsubsection pkfilter_functions_1_1 Implemented as moving window: choose dx, dy or dz > 1 and odd (3, 5, 7, etc.)
+
+The number of output bands equals number of input bands
+
+|filter|description|
+|-------------|-------------|
+dilate|morphological dilation|
+|erode|morphological erosion|
+|close|morpholigical closing (dilate+erode)|
+|open|morpholigical opening (erode+dilate)|
+|smoothnodata values|smooth nodata values (set nodata option!)|
+
+Example: "Smooth" (interpolate) nodata in spectral/temporal domain (-dz 1), using a linear interpolation
+\code
+pkfilter -i input.tif -o smoothed.tif -dz 1 -f smoothnodata -interp linear
+\endcode
+
+Example: Filter input.tif in spatial domain with morphological dilation filter with kernel size 3x3.
+
+\code
+pkfilter -i input.tif -o dilated.tif -dx 3 -dy 3 -f dilate
+\endcode
+
+\subsubsection pkfilter_functions_1_2 Implemented as either moving window or statistical function in spectral/temporal domain (choose dz=1). 
+
+In case of moving window, the number of output bands equals number of input bands. In case dz=1, the single output band is calculated as the result of the statistical function applied to all bands.
+
+|filter | description|
+|-------------|-------------|
+nvalid | report number of valid (not nodata) values in window
+median | perform a median filter in spatial (dx, dy) or spectral/temporal (dz) domain
+var | calculate variance in window
+min | calculate minimum in window
+max | calculate maximum in window
+sum | calculate sum in window
+mean | calculate mean in window
+stdev | calculate standard deviation in window
+savgolay | Savitzky-Golay filter (check examples page!)
+percentile | calculate percentile value in window
+proportion | calculate proportion in windoww
+
+Example: Median filter in spatial domain
+
+\code
+pkfilter -i input.tif -o median.tif -dx 3 -dy 3 -f median
+\endcode
+
+Example: Calculate statistical variance in spectral/temporal domain (single output band)
+
+\code
+pkfilter -i input.tif -o var.tif -dz 1 -f var
+\endcode
+
+\subsection pkfilter_functions_2 Wavelet filters 
+
+\subsubsection pkfilter_functions_2_1 Wavelet filter in in spatial or spectral/temporal (set dz = 1) domain. 
+
+The number of output bands equals number of input bands
+
+|filter | description|
+|-------------|-------------|
+dwt | discrete wavelet transform
+dwti | discrete inverse wavelet transform
+dwt_cut | discrete wavelet + inverse transform, using threshold option to cut percentile of coefficients 
+
+Example: Calculate discrete wavelet in spatial domain
+
+\code
+pkfilter -i lena.tif -o lena_dwt.tif -f dwt
+\endcode
+
+Example: Calculate discrete wavelet in spectral/temporal domain
+
+\code
+pkfilter -i timeseries.tif -o dwt.tif -f dwt -dz 1
+\endcode
+
+\subsubsection pkfilter_functions_2_2 Wavelet filter implemented in spectral/temporal domain only. 
+
+The number of output bands equals number of input bands
+
+|filter | description|
+|-------------|-------------|
+dwt_cut_from | discrete wavelet + inverse transform, setting all high frequence coefficients to zero (scale >= threshold)
+
+
+Example: Calculate low frequency time series based on discrete wavelet + inverse transform in spectral/temporal domain, retaining only coefficients until scale 3
+
+\code
+pkfilter -i timeseries.tif -o lowfrequency.tif -f dwt_cut_from -dz 1 -t 4
+\endcode
+
+\subsection pkfilter_functions_3 Filters in spatial domain only (dx, dy > 1 and odd). 
+
+The number of output bands equals number of input bands. 
+
+|filter | description|
+|-------------|-------------|
+mrf | Markov random field
+ismin | pixel is minimum?
+ismax | pixel is maximum?
+shift | perform a pixel shift in spatial window
+scramble | scramble pixels in a spatial window
+mode (majority voting | perform a majority voring (set class option)
+sobelx | horizontal edge detection
+sobely | vertical edge detection 
+sobelxy | diagonal edge detection (NE-SW)
+sobelyx | diagonal edge detection (NW-SE)
+countid | count digital numbers in window
+order | rank pixels in order
+density | calculated the density
+homog | central pixel must be identical to all other pixels within window
+heterog | central pixel must be different than all other pixels within window
+
+Example: Sobel edge detection in horizontal direction
+
+\code
+pkfilter -i lena.tif -o sobelx.tif -f sobelx -dx 5 -dy 5
+\endcode
 
 \section pkfilter_options Options
  - use either `-short` or `--long` options (both `--long=value` and `--long value` are supported)
@@ -76,11 +184,11 @@ minallbands | For each individual band, assign the minimum value found in all ov
 |-----|----|----|-------|-----------|
  | i      | input                | std::string |       |input image file | 
  | o      | output               | std::string |       |Output image file | 
- | f      | filter               | std::string |       |filter function (median, var, min, max, sum, mean, dilate, erode, close, open, homog (central pixel must be identical to all other pixels within window), heterog (central pixel must be different than all other pixels within window), sobelx (horizontal edge detection), sobely (vertical edge detection), sobelxy (diagonal edge detection NE-SW),sobelyx (diagonal edge detection NW-SE), smooth, density, countid, mode (majority voting, onl [...]
+ | f      | filter               | std::string |       |filter function (nvalid, median, var, min, max, sum, mean, dilate, erode, close, open, homog (central pixel must be identical to all other pixels within window), heterog (central pixel must be different than all other pixels within window), sobelx (horizontal edge detection), sobely (vertical edge detection), sobelxy (diagonal edge detection NE-SW),sobelyx (diagonal edge detection NW-SE), density, countid, mode (majority voting, onl [...]
  | srf    | srf                  | std::string |       |list of ASCII files containing spectral response functions (two columns: wavelength response) | 
  | fwhm   | fwhm                 | double |       |list of full width half to apply spectral filtering (-fwhm band1 -fwhm band2 ...) | 
- | dx     | dx                   | double | 3     |filter kernel size in x, better use odd value to avoid image shift | 
- | dy     | dy                   | double | 3     |filter kernel size in y, better use odd value to avoid image shift | 
+ | dx     | dx                   | double | 3     |filter kernel size in x, use odd values only | 
+ | dy     | dy                   | double | 3     |filter kernel size in y, use odd values only | 
  | dz     | dz                   | int  |       |filter kernel size in z (spectral/temporal dimension), must be odd (example: 3).. Set dz>0 if 1-D filter must be used in band domain | 
  | nodata | nodata               | double |       |nodata value(s) (used for smoothnodata filter) | 
  | r      | resampling-method    | std::string | near  |Resampling method for shifting operation (near: nearest neighbour, bilinear: bi-linear interpolation). | 
@@ -102,7 +210,7 @@ minallbands | For each individual band, assign the minimum value found in all ov
  | beta   | beta                 | std::string |       |ASCII file with beta for each class transition in Markov Random Field | 
  | interp | interp               | std::string | akima |type of interpolation for spectral filtering (see http://www.gnu.org/software/gsl/manual/html_node/Interpolation-Types.html) | 
  | ot     | otype                | std::string |       |Data type for output image ({Byte/Int16/UInt16/UInt32/Int32/Float32/Float64/CInt16/CInt32/CFloat32/CFloat64}). Empty string: inherit type from input image | 
- | of     | oformat              | std::string |       |Output image format (see also gdal_translate). Empty string: inherit from input image | 
+ | of     | oformat              | std::string | GTiff |Output image format (see also gdal_translate).| 
  | ct     | ct                   | std::string |       |color table (file with 5 columns: id R G B ALFA (0: transparent, 255: solid). Use none to ommit color table | 
  | circ   | circular             | bool | false |circular disc kernel for dilation and erosion | 
 
@@ -124,10 +232,10 @@ int main(int argc,char **argv) {
   // Optionpk<std::string> tmpdir_opt("tmp", "tmp", "Temporary directory","/tmp",2);
   Optionpk<bool> disc_opt("circ", "circular", "circular disc kernel for dilation and erosion", false);
   // Optionpk<double> angle_opt("a", "angle", "angle used for directional filtering in dilation (North=0, East=90, South=180, West=270).");
-  Optionpk<std::string> method_opt("f", "filter", "filter function (median, var, min, max, sum, mean, dilate, erode, close, open, homog (central pixel must be identical to all other pixels within window), heterog (central pixel must be different than all other pixels within window), sobelx (horizontal edge detection), sobely (vertical edge detection), sobelxy (diagonal edge detection NE-SW),sobelyx (diagonal edge detection NW-SE), smooth, density, countid, mode (majority voting, only for [...]
+  Optionpk<std::string> method_opt("f", "filter", "filter function (nvalid, median, var, min, max, sum, mean, dilate, erode, close, open, homog (central pixel must be identical to all other pixels within window), heterog (central pixel must be different than all other pixels within window), sobelx (horizontal edge detection), sobely (vertical edge detection), sobelxy (diagonal edge detection NE-SW),sobelyx (diagonal edge detection NW-SE), density, countid, mode (majority voting, only for [...]
   Optionpk<std::string> resample_opt("r", "resampling-method", "Resampling method for shifting operation (near: nearest neighbour, bilinear: bi-linear interpolation).", "near");
-  Optionpk<double> dimX_opt("dx", "dx", "filter kernel size in x, better use odd value to avoid image shift", 3);
-  Optionpk<double> dimY_opt("dy", "dy", "filter kernel size in y, better use odd value to avoid image shift", 3);
+  Optionpk<double> dimX_opt("dx", "dx", "filter kernel size in x, use odd values only", 3);
+  Optionpk<double> dimY_opt("dy", "dy", "filter kernel size in y, use odd values only", 3);
   Optionpk<int> dimZ_opt("dz", "dz", "filter kernel size in z (spectral/temporal dimension), must be odd (example: 3).. Set dz>0 if 1-D filter must be used in band domain");
   Optionpk<std::string> wavelet_type_opt("wt", "wavelet", "wavelet type: daubechies,daubechies_centered, haar, haar_centered, bspline, bspline_centered", "daubechies");
   Optionpk<int> family_opt("wf", "family", "wavelet family (vanishing moment, see also http://www.gnu.org/software/gsl/manual/html_node/DWT-Initialization.html)", 4);
@@ -147,7 +255,7 @@ int main(int argc,char **argv) {
   Optionpk<double> wavelengthOut_opt("wout", "wavelengthOut", "list of wavelengths in output spectrum (-wout band1 -wout band2 ...)");
   Optionpk<std::string> interpolationType_opt("interp", "interp", "type of interpolation for spectral filtering (see http://www.gnu.org/software/gsl/manual/html_node/Interpolation-Types.html)","akima");
   Optionpk<std::string>  otype_opt("ot", "otype", "Data type for output image ({Byte/Int16/UInt16/UInt32/Int32/Float32/Float64/CInt16/CInt32/CFloat32/CFloat64}). Empty string: inherit type from input image","");
-  Optionpk<string>  oformat_opt("of", "oformat", "Output image format (see also gdal_translate). Empty string: inherit from input image");
+  Optionpk<string>  oformat_opt("of", "oformat", "Output image format (see also gdal_translate).","GTiff");
   Optionpk<string>  colorTable_opt("ct", "ct", "color table (file with 5 columns: id R G B ALFA (0: transparent, 255: solid). Use none to ommit color table");
   Optionpk<string> option_opt("co", "co", "Creation option for output file. Multiple options can be specified.");
   Optionpk<short> down_opt("d", "down", "down sampling factor. Use value 1 for no downsampling). Use value n>1 for downsampling (aggregation)", 1);
@@ -272,7 +380,7 @@ int main(int argc,char **argv) {
   if(verbose_opt[0])
     std::cout << std::endl << "Output pixel type:  " << GDALGetDataTypeName(theType) << endl;
 
-  string imageType=input.getImageType();
+  string imageType;//=input.getImageType();
   if(oformat_opt.size())
     imageType=oformat_opt[0];
 
@@ -324,7 +432,7 @@ int main(int argc,char **argv) {
 	  assert(threshold_opt.size());
 	}
 	else{
-	  cerr << "filter not implemented in spectral/temporal domain" << endl;
+	  cerr << "filter not implemented in spatial domain" << endl;
 	  exit(1);
 	}
 	break;
@@ -367,8 +475,10 @@ int main(int argc,char **argv) {
       case(filter2d::max):
       case(filter2d::var):
       case(filter2d::stdev):
+      case(filter2d::nvalid):
       case(filter2d::median):
       case(filter2d::percentile):
+      case(filter2d::proportion):
 	//implemented in spectral/temporal/spatial domain and nband 1 if dimZ==1
 	if(dimZ_opt.size()==1)
 	  if(dimZ_opt[0]==1)
diff --git a/src/apps/pkfilterdem.cc b/src/apps/pkfilterdem.cc
index 4bb4f57..b84e370 100644
--- a/src/apps/pkfilterdem.cc
+++ b/src/apps/pkfilterdem.cc
@@ -60,7 +60,7 @@ The utility pkfilterdem can be used to filter digital elevation models. It is ty
  | ht     | ht                   | double | 0.2   |initial height threshold for progressive morphological filtering. Use low values to remove more height objects. Optionally, a maximum height threshold can be set via a second argument (e.g., -ht 0.2 -ht 2.5 sets an initial threshold at 0.2 m and caps the threshold at 2.5 m). | 
  | minchange | minchange            | short | 0     |Stop iterations when no more pixels are changed than this threshold. | 
  | ot     | otype                | std::string |       |Data type for output image ({Byte/Int16/UInt16/UInt32/Int32/Float32/Float64/CInt16/CInt32/CFloat32/CFloat64}). Empty string: inherit type from input image | 
- | of     | oformat              | std::string |       |Output image format (see also gdal_translate). Empty string: inherit from input image | 
+ | of     | oformat              | std::string | GTiff |Output image format (see also gdal_translate).| 
  | ct     | ct                   | std::string |       |color table (file with 5 columns: id R G B ALFA (0: transparent, 255: solid). Use none to ommit color table | 
  | nodata | nodata               | short |       |nodata value | 
 
@@ -84,7 +84,7 @@ int main(int argc,char **argv) {
   Optionpk<double> hThreshold_opt("ht", "ht", "initial height threshold for progressive morphological filtering. Use low values to remove more height objects. Optionally, a maximum height threshold can be set via a second argument (e.g., -ht 0.2 -ht 2.5 sets an initial threshold at 0.2 m and caps the threshold at 2.5 m).", 0.2);
   Optionpk<short> minChange_opt("minchange", "minchange", "Stop iterations when no more pixels are changed than this threshold.", 0);
   Optionpk<std::string>  otype_opt("ot", "otype", "Data type for output image ({Byte/Int16/UInt16/UInt32/Int32/Float32/Float64/CInt16/CInt32/CFloat32/CFloat64}). Empty string: inherit type from input image","");
-  Optionpk<string>  oformat_opt("of", "oformat", "Output image format (see also gdal_translate). Empty string: inherit from input image");
+  Optionpk<string>  oformat_opt("of", "oformat", "Output image format (see also gdal_translate).","GTiff");
   Optionpk<string>  colorTable_opt("ct", "ct", "color table (file with 5 columns: id R G B ALFA (0: transparent, 255: solid). Use none to ommit color table");
   Optionpk<string> option_opt("co", "co", "Creation option for output file. Multiple options can be specified.");
   Optionpk<short> nodata_opt("nodata", "nodata", "nodata value");
@@ -160,7 +160,7 @@ int main(int argc,char **argv) {
   if(verbose_opt[0])
     std::cout << std::endl << "Output pixel type:  " << GDALGetDataTypeName(theType) << endl;
 
-  string imageType=input.getImageType();
+  string imageType;//=input.getImageType();
   if(oformat_opt.size())
     imageType=oformat_opt[0];
 
diff --git a/src/apps/pkfsann.cc b/src/apps/pkfsann.cc
index 31dd3f0..d876061 100644
--- a/src/apps/pkfsann.cc
+++ b/src/apps/pkfsann.cc
@@ -69,11 +69,11 @@ The utility pkfsann implements a number of feature selection techniques, among w
  |        | balance              | unsigned int | 0     |balance the input data to this number of samples for each class | 
  | random | random               | bool | true  |in case of balance, randomize input data | 
  | min    | min                  | int  | 0     |if number of training pixels is less then min, do not take this class into account | 
- | b      | band                 | short |       |band index (starting from 0, either use band option or use start to end) | 
- | s      | start                | double | 0     |start band sequence number | 
- | e      | end                  | double | 0     |end band sequence number (set to 0 to include all bands) | 
- |        | offset               | double | 0     |offset value for each spectral band input features: refl[band]=(DN[band]-offset[band])/scale[band] | 
- |        | scale                | double | 0     |scale value for each spectral band input features: refl=(DN[band]-offset[band])/scale[band] (use 0 if scale min and max in each band to -1.0 and 1.0) | 
+ | b      | band                 | unsigned short |      |band index (starting from 0, either use band option or use start to end) | 
+ | sband  | startband            | unsigned short |      |Start band sequence number | 
+ | eband  | endband              | unsigned short |      |End band sequence number   | 
+ | offset | offset               | double | 0     |offset value for each spectral band input features: refl[band]=(DN[band]-offset[band])/scale[band] | 
+ | scale  | scale                | double | 0     |scale value for each spectral band input features: refl=(DN[band]-offset[band])/scale[band] (use 0 if scale min and max in each band to -1.0 and 1.0) | 
  | a      | aggreg               | unsigned short | 0     |how to combine aggregated classifiers, see also rc option (0: no aggregation, 1: sum rule, 2: max rule). | 
  | sm     | sm                   | std::string | sffs  |feature selection method (sffs=sequential floating forward search,sfs=sequential forward search, sbs, sequential backward search ,bfs=brute force search) | 
  | ecost  | ecost                | float | 0.001 |epsilon for stopping criterion in cost function to determine optimal number of features | 
@@ -235,9 +235,9 @@ int main(int argc, char *argv[])
   Optionpk<unsigned int> balance_opt("\0", "balance", "balance the input data to this number of samples for each class", 0);
   Optionpk<bool> random_opt("random","random", "in case of balance, randomize input data", true);
   Optionpk<int> minSize_opt("min", "min", "if number of training pixels is less then min, do not take this class into account", 0);
-  Optionpk<short> band_opt("b", "band", "band index (starting from 0, either use band option or use start to end)");
-  Optionpk<double> bstart_opt("s", "start", "start band sequence number",0); 
-  Optionpk<double> bend_opt("e", "end", "end band sequence number (set to 0 to include all bands)", 0); 
+  Optionpk<unsigned short> band_opt("b", "band", "band index (starting from 0, either use band option or use start to end)");
+  Optionpk<unsigned short> bstart_opt("sband", "startband", "Start band sequence number"); 
+  Optionpk<unsigned short> bend_opt("eband", "endband", "End band sequence number"); 
   Optionpk<double> offset_opt("\0", "offset", "offset value for each spectral band input features: refl[band]=(DN[band]-offset[band])/scale[band]", 0.0);
   Optionpk<double> scale_opt("\0", "scale", "scale value for each spectral band input features: refl=(DN[band]-offset[band])/scale[band] (use 0 if scale min and max in each band to -1.0 and 1.0)", 0.0);
   Optionpk<unsigned short> aggreg_opt("a", "aggreg", "how to combine aggregated classifiers, see also rc option (0: no aggregation, 1: sum rule, 2: max rule).",0);
@@ -364,6 +364,28 @@ int main(int argc, char *argv[])
   //     priors[iclass]/=normPrior;
   // }
 
+  //convert start and end band options to vector of band indexes
+  try{
+    if(bstart_opt.size()){
+      if(bend_opt.size()!=bstart_opt.size()){
+	string errorstring="Error: options for start and end band indexes must be provided as pairs, missing end band";
+	throw(errorstring);
+      }
+      band_opt.clear();
+      for(int ipair=0;ipair<bstart_opt.size();++ipair){
+	if(bend_opt[ipair]<=bstart_opt[ipair]){
+	  string errorstring="Error: index for end band must be smaller then start band";
+	  throw(errorstring);
+	}
+	for(int iband=bstart_opt[ipair];iband<=bend_opt[ipair];++iband)
+	  band_opt.push_back(iband);
+      }
+    }
+  }
+  catch(string error){
+    cerr << error << std::endl;
+    exit(1);
+  }
   //sort bands
   if(band_opt.size())
     std::sort(band_opt.begin(),band_opt.end());
@@ -398,10 +420,10 @@ int main(int argc, char *argv[])
       }
     }
     else{
-      totalSamples=trainingReader.readDataImageOgr(trainingMap,fields,bstart_opt[0],bend_opt[0],label_opt[0],tlayer_opt,verbose_opt[0]);
+      totalSamples=trainingReader.readDataImageOgr(trainingMap,fields,0,0,label_opt[0],tlayer_opt,verbose_opt[0]);
       if(input_opt.size()){
 	ImgReaderOgr inputReader(input_opt[0]);
-	totalTestSamples=trainingReader.readDataImageOgr(testMap,fields,bstart_opt[0],bend_opt[0],label_opt[0],tlayer_opt,verbose_opt[0]);
+	totalTestSamples=trainingReader.readDataImageOgr(testMap,fields,0,0,label_opt[0],tlayer_opt,verbose_opt[0]);
 	inputReader.close();
       }
     }
diff --git a/src/apps/pkfssvm.cc b/src/apps/pkfssvm.cc
index 9b3d3a9..047f0c4 100644
--- a/src/apps/pkfssvm.cc
+++ b/src/apps/pkfssvm.cc
@@ -67,11 +67,11 @@ The SVM classifier has been shown to be more robust to this type of problem than
  | bal    | balance              | unsigned int | 0     |balance the input data to this number of samples for each class | 
  | random | random               | bool | true  |in case of balance, randomize input data | 
  | min    | min                  | int  | 0     |if number of training pixels is less then min, do not take this class into account | 
- | b      | band                 | short |       |band index (starting from 0, either use band option or use start to end) | 
- | s      | start                | double | 0     |start band sequence number | 
- | e      | end                  | double | 0     |end band sequence number (set to 0 to include all bands) | 
- |        | offset               | double | 0     |offset value for each spectral band input features: refl[band]=(DN[band]-offset[band])/scale[band] | 
- |        | scale                | double | 0     |scale value for each spectral band input features: refl=(DN[band]-offset[band])/scale[band] (use 0 if scale min and max in each band to -1.0 and 1.0) | 
+ | b      | band                 | unsigned short |      |band index (starting from 0, either use band option or use start to end) | 
+ | sband  | startband            | unsigned short |      |Start band sequence number | 
+ | eband  | endband              | unsigned short |      |End band sequence number   | 
+ | offset | offset               | double | 0     |offset value for each spectral band input features: refl[band]=(DN[band]-offset[band])/scale[band] | 
+ | scale  | scale                | double | 0     |scale value for each spectral band input features: refl=(DN[band]-offset[band])/scale[band] (use 0 if scale min and max in each band to -1.0 and 1.0) | 
  | svmt   | svmtype              | std::string | C_SVC |type of SVM (C_SVC, nu_SVC,one_class, epsilon_SVR, nu_SVR) | 
  | kt     | kerneltype           | std::string | radial |type of kernel function (linear,polynomial,radial,sigmoid)  | 
  | kd     | kd                   | unsigned short | 3     |degree in kernel function | 
@@ -267,11 +267,11 @@ int main(int argc, char *argv[])
   Optionpk<unsigned int> balance_opt("bal", "balance", "balance the input data to this number of samples for each class", 0);
   Optionpk<bool> random_opt("random","random", "in case of balance, randomize input data", true);
   Optionpk<int> minSize_opt("min", "min", "if number of training pixels is less then min, do not take this class into account", 0);
-  Optionpk<short> band_opt("b", "band", "band index (starting from 0, either use band option or use start to end)");
-  Optionpk<double> bstart_opt("s", "start", "start band sequence number",0); 
-  Optionpk<double> bend_opt("e", "end", "end band sequence number (set to 0 to include all bands)", 0); 
-  Optionpk<double> offset_opt("\0", "offset", "offset value for each spectral band input features: refl[band]=(DN[band]-offset[band])/scale[band]", 0.0);
-  Optionpk<double> scale_opt("\0", "scale", "scale value for each spectral band input features: refl=(DN[band]-offset[band])/scale[band] (use 0 if scale min and max in each band to -1.0 and 1.0)", 0.0);
+  Optionpk<unsigned short> band_opt("b", "band", "band index (starting from 0, either use band option or use start to end)");
+  Optionpk<unsigned short> bstart_opt("sband", "startband", "Start band sequence number"); 
+  Optionpk<unsigned short> bend_opt("eband", "endband", "End band sequence number"); 
+  Optionpk<double> offset_opt("offset", "offset", "offset value for each spectral band input features: refl[band]=(DN[band]-offset[band])/scale[band]", 0.0);
+  Optionpk<double> scale_opt("scale", "scale", "scale value for each spectral band input features: refl=(DN[band]-offset[band])/scale[band] (use 0 if scale min and max in each band to -1.0 and 1.0)", 0.0);
   Optionpk<string> selector_opt("sm", "sm", "feature selection method (sffs=sequential floating forward search,sfs=sequential forward search, sbs, sequential backward search ,bfs=brute force search)","sffs"); 
   Optionpk<float> epsilon_cost_opt("ecost", "ecost", "epsilon for stopping criterion in cost function to determine optimal number of features",0.001);
 
@@ -406,6 +406,28 @@ int main(int argc, char *argv[])
   //     priors[iclass]/=normPrior;
   // }
 
+  //convert start and end band options to vector of band indexes
+  try{
+    if(bstart_opt.size()){
+      if(bend_opt.size()!=bstart_opt.size()){
+	string errorstring="Error: options for start and end band indexes must be provided as pairs, missing end band";
+	throw(errorstring);
+      }
+      band_opt.clear();
+      for(int ipair=0;ipair<bstart_opt.size();++ipair){
+	if(bend_opt[ipair]<=bstart_opt[ipair]){
+	  string errorstring="Error: index for end band must be smaller then start band";
+	  throw(errorstring);
+	}
+	for(int iband=bstart_opt[ipair];iband<=bend_opt[ipair];++iband)
+	  band_opt.push_back(iband);
+      }
+    }
+  }
+  catch(string error){
+    cerr << error << std::endl;
+    exit(1);
+  }
   //sort bands
   if(band_opt.size())
     std::sort(band_opt.begin(),band_opt.end());
@@ -442,10 +464,10 @@ int main(int argc, char *argv[])
       }
     }
     else{
-      totalSamples=trainingReader.readDataImageOgr(trainingMap,fields,bstart_opt[0],bend_opt[0],label_opt[0],tlayer_opt,verbose_opt[0]);
+      totalSamples=trainingReader.readDataImageOgr(trainingMap,fields,0,0,label_opt[0],tlayer_opt,verbose_opt[0]);
       if(input_opt.size()){
 	ImgReaderOgr inputReader(input_opt[0]);
-	totalTestSamples=inputReader.readDataImageOgr(testMap,fields,bstart_opt[0],bend_opt[0],label_opt[0],tlayer_opt,verbose_opt[0]);
+	totalTestSamples=inputReader.readDataImageOgr(testMap,fields,0,0,label_opt[0],tlayer_opt,verbose_opt[0]);
 	inputReader.close();
       }
     }
diff --git a/src/apps/pkgetmask.cc b/src/apps/pkgetmask.cc
index 0cddafb..4122d62 100644
--- a/src/apps/pkgetmask.cc
+++ b/src/apps/pkgetmask.cc
@@ -56,7 +56,7 @@ The utility pkgetmask creates a mask raster dataset from an input raster dataset
  | b      | band                 | short | 0     |band(s) used for mask | 
  | p      | operator             | std::string | OR    |Operator: [AND,OR]. | 
  | ot     | otype                | std::string | Byte  |Data type for output image ({Byte/Int16/UInt16/UInt32/Int32/Float32/Float64/CInt16/CInt32/CFloat32/CFloat64}). Empty string: inherit type from input image | 
- | of     | oformat              | std::string |       |Output image format (see also gdal_translate). Empty string: inherit from input image | 
+ | of     | oformat              | std::string | GTiff |Output image format (see also gdal_translate).| 
  | co     | co                   | std::string |       |Creation option for output file. Multiple options can be specified. | 
  | ct     | ct                   | std::string |       |color table (file with 5 columns: id R G B ALFA (0: transparent, 255: solid) | 
 
@@ -79,7 +79,7 @@ int main(int argc,char **argv) {
   Optionpk<unsigned short> nodata_opt("nodata", "nodata", "value(s) for invalid pixels: not between min and max", 0);
   Optionpk<string> output_opt("o", "output", "Output mask file");
   Optionpk<string> otype_opt("ot", "otype", "Data type for output image ({Byte/Int16/UInt16/UInt32/Int32/Float32/Float64/CInt16/CInt32/CFloat32/CFloat64}). Empty string: inherit type from input image", "Byte");
-  Optionpk<string> oformat_opt("of", "oformat", "Output image format (see also gdal_translate). Empty string: inherit from input image");
+  Optionpk<string> oformat_opt("of", "oformat", "Output image format (see also gdal_translate).","GTiff");
   Optionpk<string> option_opt("co", "co", "Creation option for output file. Multiple options can be specified.");
   Optionpk<string> colorTable_opt("ct", "ct", "color table (file with 5 columns: id R G B ALFA (0: transparent, 255: solid)");
   Optionpk<short> verbose_opt("v", "verbose", "verbose", 0,2);
@@ -187,7 +187,7 @@ int main(int argc,char **argv) {
     if(verbose_opt[0])
       cout << "Using data type from input image: " << GDALGetDataTypeName(theType) << endl;
   }
-  string imageType=imgReader.getImageType();
+  string imageType;//=imgReader.getImageType();
   if(oformat_opt.size())//default
     imageType=oformat_opt[0];
   if(option_opt.findSubstring("INTERLEAVE=")==option_opt.end()){
diff --git a/src/apps/pkinfo.cc b/src/apps/pkinfo.cc
index 3375e4f..9619bc1 100644
--- a/src/apps/pkinfo.cc
+++ b/src/apps/pkinfo.cc
@@ -338,7 +338,7 @@ int main(int argc, char *argv[])
 	  imgReader.getMinMax(static_cast<int>(uli),static_cast<int>(lri),static_cast<int>(ulj),static_cast<int>(lrj),theBand,minValue,maxValue);
 	}
 	else
-	  imgReader.getMinMax(minValue,maxValue,theBand,true);
+	  imgReader.getMinMax(minValue,maxValue,theBand);
 	if(minmax_opt[0])
 	  std::cout << "-min " << minValue << " -max " << maxValue << " ";
 	else{
diff --git a/src/apps/pkkalman.cc b/src/apps/pkkalman.cc
index 9774098..cb54d4e 100644
--- a/src/apps/pkkalman.cc
+++ b/src/apps/pkkalman.cc
@@ -25,7 +25,6 @@ along with pktools.  If not, see <http://www.gnu.org/licenses/>.
 #include "imageclasses/ImgReaderGdal.h"
 #include "imageclasses/ImgWriterGdal.h"
 #include "algorithms/StatFactory.h"
-#include "algorithms/ImgRegression.h"
 
 /******************************************************************************/
 /*! \page pkkalman pkkalman
@@ -52,22 +51,17 @@ produce kalman filtered raster time series
  | obw    | outputbw             | std::string |       |Output raster dataset for backward model | 
  | ofb    | outputfb             | std::string |       |Output raster dataset for smooth model | 
  | modnodata | modnodata            | double | 0     |invalid value for model input | 
- | obsnodata | obsnodata            | double | 0     |invalid value for observation input | 
- | modoffset | modoffset            | double |       |offset used to read model input dataset (value=offset+scale*readValue | 
- | modscale | modscale             | double |       |scale used to read model input dataset (value=offset+scale*readValue | 
- | obsoffset | obsoffset            | double |       |offset used to read observation input dataset (value=offset+scale*readValue | 
- | obsscale | obsscale             | double |       |scale used to read observation input dataset (value=offset+scale*readValue | 
+ | obsnodata | obsnodata         | double | 0     |invalid value for observation input | 
+ | obsmin | obsmin               | double |      |Minimum value for observation data | 
+ | obsmax | obsmax               | double |      |Maximum value for observation data | 
  | eps    | eps                  | double | 1e-05 |epsilon for non zero division | 
- | um     | uncertmodel          | double | 2     |Multiply this value with std dev of first model image to obtain uncertainty of model | 
- | uo     | uncertobs            | double | 0     |Uncertainty of valid observations | 
- | w      | weight               | double |       |Set observation uncertainty as weighted difference between observation and model (use -w 0 to use a constant observation uncertainty, use -w value >> 1 to penalize low observation values with respect to model, use -w value << 0 to penalize a high observation values with respect to model | 
- | dobs   | deltaobs             | double |       |Lower and upper thresholds for relative pixel differences (in percentage): (observation-model)/model. For instance to force the observation within a +/- 10 % interval, use: -dobs -10 -dobs 10 (equivalent to -dobs 10). Leave empty to always update on observation | 
- | unodata | uncertnodata         | double | 10000 |Uncertainty in case of no-data values in observation | 
- | rt     | regtime             | double | 1 |Set optional regression for sensor difference (model - observation). | 
- | rs     | regsensor            | double | 1 |Set optional regression for sensor difference (model - observation). | 
+ | um     | uncertmodel          | double | 1     |Uncertainty of the model | 
+ | uo     | uncertobs            | double | 1     |Uncertainty of valid observations | 
+ | unodata | uncertnodata         | double | 100 |Uncertainty in case of no-data values in observation | 
+ | q      | q                    | double | 1     |Process noise: expresses instability (variance) of proportions of fine res pixels within a moderate resolution pixel | 
  | down   | down                 | int  |       |Downsampling factor for reading model data to calculate regression | 
- | th     | threshold            | float | 0     |threshold for selecting samples (randomly). Provide probability in percentage (>0) or absolute (<0). | 
- | win    | window               | unsigned short | 0     |window size for calculating regression (use 0 for global) | 
+ | ot     | otype                | std::string |       |Data type for output image ({Byte/Int16/UInt16/UInt32/Int32/Float32/Float64/CInt16/CInt32/CFloat32/CFloat64}). Empty string: inherit type from input image | 
+ | of     | oformat              | std::string | GTiff |Output image format (see also gdal_translate).| 
  | co     | co                   | std::string |       |Creation option for output file. Multiple options can be specified. | 
  | v      | verbose              | short | 0     |verbose mode when positive | 
 
@@ -87,30 +81,20 @@ int main(int argc,char **argv) {
   Optionpk<string> outputfw_opt("ofw", "outputfw", "Output raster dataset for forward model");
   Optionpk<string> outputbw_opt("obw", "outputbw", "Output raster dataset for backward model");
   Optionpk<string> outputfb_opt("ofb", "outputfb", "Output raster dataset for smooth model");
+  Optionpk<string> gain_opt("gain", "gain", "Output raster dataset for gain");
+  
   Optionpk<double> modnodata_opt("modnodata", "modnodata", "invalid value for model input", 0);
   Optionpk<double> obsnodata_opt("obsnodata", "obsnodata", "invalid value for observation input", 0);
-  Optionpk<double> modoffset_opt("modoffset", "modoffset", "offset used to read model input dataset (value=offset+scale*readValue)");
-  Optionpk<double> obsoffset_opt("obsoffset", "obsoffset", "offset used to read observation input dataset (value=offset+scale*readValue)");
-  Optionpk<double> modscale_opt("modscale", "modscale", "scale used to read model input dataset (value=offset+scale*readValue)");
-  Optionpk<double> obsscale_opt("obsscale", "obsscale", "scale used to read observation input dataset (value=offset+scale*readValue)");
+  Optionpk<double> obsmin_opt("obsmin", "obsmin", "Minimum value for observation data");
+  Optionpk<double> obsmax_opt("obsmax", "obsmax", "Maximum value for observation data");
   Optionpk<double> eps_opt("eps", "eps", "epsilon for non zero division", 0.00001);
-  Optionpk<double> uncertModel_opt("um", "uncertmodel", "Multiply this value with std dev of first model image to obtain uncertainty of model",2);
-  Optionpk<double> uncertObs_opt("uo", "uncertobs", "Uncertainty of valid observations",0);
-  Optionpk<double> weight_opt("w", "weight", "Penalize outliers in measurement via weights. Use first weight to penalize small measurements wrt model and second weight to penalize large measurements wrt model");
-  Optionpk<double> deltaObs_opt("dobs", "deltaobs", "Lower and upper thresholds for relative pixel differences (in percentage): (observation-model)/model. For instance to force the observation within a +/- 10 % interval, use: -dobs -10 -dobs 10 (equivalent to -dobs 10). Leave empty to always update on observation");
-  Optionpk<double> uncertNodata_opt("unodata", "uncertnodata", "Uncertainty in case of no-data values in observation", 10000);
-  Optionpk<double> regTime_opt("rt", "regtime", "Weight for regression in time series", 1.0);
-  Optionpk<double> regSensor_opt("rs", "regsensor", "Weight for regression model - measurement (model - observation).");
+  Optionpk<double> uncertModel_opt("um", "uncertmodel", "Uncertainty of model",1,1);
+  Optionpk<double> uncertObs_opt("uo", "uncertobs", "Uncertainty of valid observations",1,1);
+  Optionpk<double> processNoise_opt("q", "q", "Process noise: expresses instability (variance) of proportions of fine res pixels within a moderate resolution pixel",1);
+  Optionpk<double> uncertNodata_opt("unodata", "uncertnodata", "Uncertainty in case of no-data values in observation", 100);
   Optionpk<int> down_opt("down", "down", "Downsampling factor for reading model data to calculate regression");
-  Optionpk<float> threshold_opt("th", "threshold", "threshold for selecting samples (randomly). Provide probability in percentage (>0) or absolute (<0).", 0);
-  Optionpk<int> minreg_opt("minreg", "minreg", "Minimum number of pixels to take into account for regression", 5, 2);
-  // Optionpk<bool> regObs_opt("regobs", "regobs", "Perform regression between modeled and observed value",false);
-  // Optionpk<double> checkDiff_opt("diff", "diff", "Flag observation as invalid if difference with model is above uncertainty",false);
-  Optionpk<unsigned short> window_opt("win", "window", "window size for calculating regression (use 0 for global)", 0);
-  // Optionpk<string> mask_opt("m", "mask", "Use the first band of the specified file as a validity mask. Nodata values can be set with the option msknodata.");
-  // Optionpk<double> msknodata_opt("msknodata", "msknodata", "Mask value(s) not to consider for filtering. First value will be set in output image.", 0);
-
-  Optionpk<string>  oformat_opt("of", "oformat", "Output image format (see also gdal_translate). Empty string: inherit from input image","GTiff",2);
+  Optionpk<string>  otype_opt("ot", "otype", "Data type for output image ({Byte/Int16/UInt16/UInt32/Int32/Float32/Float64/CInt16/CInt32/CFloat32/CFloat64}). Empty string: inherit type from input image","");
+  Optionpk<string>  oformat_opt("of", "oformat", "Output image format (see also gdal_translate).","GTiff",2);
   Optionpk<string> option_opt("co", "co", "Creation option for output file. Multiple options can be specified.");
   Optionpk<short> verbose_opt("v", "verbose", "verbose mode when positive", 0);
 
@@ -125,28 +109,18 @@ int main(int argc,char **argv) {
     outputfw_opt.retrieveOption(argc,argv);
     outputbw_opt.retrieveOption(argc,argv);
     outputfb_opt.retrieveOption(argc,argv);
+    gain_opt.retrieveOption(argc,argv);
     modnodata_opt.retrieveOption(argc,argv);
     obsnodata_opt.retrieveOption(argc,argv);
-    modoffset_opt.retrieveOption(argc,argv);
-    modscale_opt.retrieveOption(argc,argv);
-    obsoffset_opt.retrieveOption(argc,argv);
-    obsscale_opt.retrieveOption(argc,argv);
+    obsmin_opt.retrieveOption(argc,argv);
+    obsmax_opt.retrieveOption(argc,argv);
     eps_opt.retrieveOption(argc,argv);
     uncertModel_opt.retrieveOption(argc,argv);
     uncertObs_opt.retrieveOption(argc,argv);
-    weight_opt.retrieveOption(argc,argv);
-    deltaObs_opt.retrieveOption(argc,argv);
+    processNoise_opt.retrieveOption(argc,argv);
     uncertNodata_opt.retrieveOption(argc,argv);
-    regTime_opt.retrieveOption(argc,argv);
-    regSensor_opt.retrieveOption(argc,argv);
     down_opt.retrieveOption(argc,argv);
-    threshold_opt.retrieveOption(argc,argv);
-    minreg_opt.retrieveOption(argc,argv);
-    // regObs_opt.retrieveOption(argc,argv);
-    // checkDiff_opt.retrieveOption(argc,argv);
-    window_opt.retrieveOption(argc,argv);
-    // mask_opt.retrieveOption(argc,argv);
-    // msknodata_opt.retrieveOption(argc,argv);
+    otype_opt.retrieveOption(argc,argv);
     oformat_opt.retrieveOption(argc,argv);
     option_opt.retrieveOption(argc,argv);
     verbose_opt.retrieveOption(argc,argv);
@@ -160,16 +134,6 @@ int main(int argc,char **argv) {
     exit(0);//help was invoked, stop processing
   }
 
-  if(deltaObs_opt.size()==1){
-    if(deltaObs_opt[0]<=0)
-      deltaObs_opt.push_back(-deltaObs_opt[0]);
-    else
-      deltaObs_opt.insert(deltaObs_opt.begin(),-deltaObs_opt[0]);
-  }
-  if(weight_opt.size()==1){
-    weight_opt.push_back(weight_opt[0]);
-  }
-
   if(down_opt.empty()){
     std::cerr << "short option -h shows basic options only, use long option --help to show all options" << std::endl;
     exit(0);//help was invoked, stop processing
@@ -234,13 +198,12 @@ int main(int argc,char **argv) {
 
   statfactory::StatFactory stat;
   stat.setNoDataValues(modnodata_opt);
-  imgregression::ImgRegression imgreg;
-  // vector<ImgReaderGdal> imgReaderModel(model_opt.size());
-  // vector<ImgReaderGdal> imgReaderObs(observation_opt.size());
   ImgReaderGdal imgReaderModel1;
   ImgReaderGdal imgReaderModel2;
   ImgReaderGdal imgReaderObs;
   ImgWriterGdal imgWriterEst;
+  //test
+  ImgWriterGdal imgWriterGain;
 
   imgReaderObs.open(observation_opt[0]);
 
@@ -251,7 +214,21 @@ int main(int argc,char **argv) {
   double geotransform[6];
   imgReaderObs.getGeoTransform(geotransform);
 
-  string imageType=imgReaderObs.getImageType();
+  GDALDataType theType=GDT_Unknown;
+  if(verbose_opt[0])
+    cout << "possible output data types: ";
+  for(int iType = 0; iType < GDT_TypeCount; ++iType){
+    if(verbose_opt[0])
+      cout << " " << GDALGetDataTypeName((GDALDataType)iType);
+    if( GDALGetDataTypeName((GDALDataType)iType) != NULL
+        && EQUAL(GDALGetDataTypeName((GDALDataType)iType),
+                 otype_opt[0].c_str()))
+      theType=(GDALDataType) iType;
+  }
+  if(theType==GDT_Unknown)
+    theType=imgReaderObs.getDataType();
+
+  string imageType;//=imgReaderObs.getImageType();
   if(oformat_opt.size())//default
     imageType=oformat_opt[0];
   if(option_opt.findSubstring("INTERLEAVE=")==option_opt.end()){
@@ -272,30 +249,6 @@ int main(int argc,char **argv) {
   }
   imgReaderObs.close();
 
-  if(regSensor_opt.empty())
-    regSensor_opt.push_back(1.0/down_opt[0]);
-  //hiero
-  // ImgReaderGdal maskReader;
-  // double colMask=0;
-  // double rowMask=0;
-
-  // if(mask_opt.size()){
-  //   try{
-  //     if(verbose_opt[0]>=1)
-  // 	std::cout << "opening mask image file " << mask_opt[0] << std::endl;
-  //     maskReader.open(mask_opt[0]);
-  //     maskReader.setNoData(msknodata_opt);
-  //   }
-  //   catch(string error){
-  //     cerr << error << std::endl;
-  //     exit(2);
-  //   }
-  //   catch(...){
-  //     cerr << "error catched" << std::endl;
-  //     exit(1);
-  //   }
-  // }
-
   int obsindex=0;
 
   const char* pszMessage;
@@ -303,21 +256,9 @@ int main(int argc,char **argv) {
   GDALProgressFunc pfnProgress=GDALTermProgress;
   double progress=0;
 
-  imgreg.setDown(down_opt[0]);
-  imgreg.setThreshold(threshold_opt[0]);
-
-  double c0modGlobal=0;//time regression coefficient c0 (offset) calculated on entire image 
-  double c1modGlobal=1;//time regression coefficient c1 (scale) calculated on entire image 
-  double c0mod=0;//time regression coefficient c0 (offset) calculated on local window
-  double c1mod=1;//time regression coefficient c1 (scale) calculated on local window
-
-  double c0obs=0;//offset
-  double c1obs=1;//scale
   double errObs=uncertNodata_opt[0];//start with high initial value in case we do not have first observation at time 0
 
   vector<int> relobsindex;
-  // cout << tmodel_opt << endl;
-  // cout << tobservation_opt << endl;
 
   for(int tindex=0;tindex<tobservation_opt.size();++tindex){
     vector<int>::iterator modit;
@@ -327,8 +268,6 @@ int main(int argc,char **argv) {
     relobsindex.push_back(relpos);
     if(verbose_opt[0])
       cout << "observation " << tindex << ": " << "relative position in model time series is " << relpos << ", date of observation is (tobservation_opt[tindex]): " << tobservation_opt[tindex] << ", relobsindex.back(): " << relobsindex.back() << ", filename observation: " << observation_opt[tindex] << ", filename of corresponding model: " << model_opt[relpos] << endl;
-    // if(verbose_opt[0])
-    //   cout << "tobservation_opt[tindex] " << tobservation_opt[tindex] << " " << relobsindex.back() << endl;
   }
 
   int ndigit=log(1.0*tmodel_opt.back())/log(10.0)+1;
@@ -350,18 +289,24 @@ int main(int argc,char **argv) {
       outputstream << outputfw_opt[0] << "_";
       outputstream << setfill('0') << setw(ndigit) << tmodel_opt[0];
       outputstream << ".tif";
-      //test
-      // outputstream << outputfw_opt[0] << "_" << tmodel_opt[0] << ".tif";
       output=outputstream.str();
     }
     if(verbose_opt[0])
       cout << "Opening image " << output << " for writing " << endl;
 
-    imgWriterEst.open(output,ncol,nrow,2,GDT_Float32,imageType,option_opt);
+    imgWriterEst.open(output,ncol,nrow,2,theType,imageType,option_opt);
     imgWriterEst.setProjectionProj4(projection_opt[0]);
     imgWriterEst.setGeoTransform(geotransform);
     imgWriterEst.GDALSetNoDataValue(obsnodata_opt[0]);
 
+    //test
+    if(gain_opt.size()){
+      imgWriterGain.open(gain_opt[0],ncol,nrow,model_opt.size(),GDT_Float64,imageType,option_opt);
+      imgWriterGain.setProjectionProj4(projection_opt[0]);
+      imgWriterGain.setGeoTransform(geotransform);
+      imgWriterGain.GDALSetNoDataValue(obsnodata_opt[0]);
+    }
+
     if(verbose_opt[0]){
       cout << "processing time " << tmodel_opt[0] << endl;
       if(obsindex<relobsindex.size())
@@ -373,10 +318,6 @@ int main(int argc,char **argv) {
     try{
       imgReaderModel1.open(model_opt[0]);
       imgReaderModel1.setNoData(modnodata_opt);
-      if(modoffset_opt.size())
-	imgReaderModel1.setOffset(modoffset_opt[0]);
-      if(modscale_opt.size())
-	imgReaderModel1.setScale(modscale_opt[0]);
     }
     catch(string errorString){
       cerr << errorString << endl;
@@ -386,50 +327,75 @@ int main(int argc,char **argv) {
     }
       
     //calculate standard deviation of image to serve as model uncertainty
-    GDALRasterBand* rasterBand;
-    rasterBand=imgReaderModel1.getRasterBand(0);
-    double minValue, maxValue, meanValue, stdDev;
-    void* pProgressData;
-    rasterBand->ComputeStatistics(0,&minValue,&maxValue,&meanValue,&stdDev,pfnProgress,pProgressData);
+    // GDALRasterBand* rasterBand;
+    // rasterBand=imgReaderModel1.getRasterBand(0);
+    // double minValue, maxValue, meanValue, stdDev;
+    // void* pProgressData;
+    // rasterBand->ComputeStatistics(0,&minValue,&maxValue,&meanValue,&stdDev,pfnProgress,pProgressData);
     double modRow=0;
     double modCol=0;
+    double lowerCol=0;
+    double upperCol=0;
+    RESAMPLE theResample=BILINEAR;
+
     if(relobsindex[0]>0){//initialize output_opt[0] as model[0]
       //write first model as output
       if(verbose_opt[0])
 	cout << "write first model as output" << endl;
-      for(int irow=0;irow<nrow;++irow){
+      for(int jrow=0;jrow<nrow;jrow+=down_opt[0]){
 	vector<double> estReadBuffer;
 	vector<double> estWriteBuffer(ncol);
 	vector<double> uncertWriteBuffer(ncol);
-	// vector<double> lineMask;
-	imgWriterEst.image2geo(0,irow,geox,geoy);
-	imgReaderModel1.geo2image(geox,geoy,modCol,modRow);
-	if(modRow<0||modRow>=imgReaderModel1.nrOfRow()){
-	  cerr << "Error: geo coordinates (" << geox << "," << geoy << ") not covered in model image " << imgReaderModel1.getFileName() << endl;
-	  assert(modRow>=0&&modRow<imgReaderModel1.nrOfRow());
-	}
+	//test
+	vector<double> gainWriteBuffer(ncol);
 	try{
-	  imgReaderModel1.readData(estReadBuffer,GDT_Float64,modRow);
-	  //simple nearest neighbor
-	  //stat.nearUp(estReadBuffer,estWriteBuffer);
-
-	  // double oldRowMask=-1;//keep track of row mask to optimize number of line readings
-	  for(int icol=0;icol<ncol;++icol){
-	    imgWriterEst.image2geo(icol,irow,geox,geoy);
+	  for(int irow=jrow;irow<jrow+down_opt[0];++irow){
+	    imgWriterEst.image2geo(0,irow,geox,geoy);
 	    imgReaderModel1.geo2image(geox,geoy,modCol,modRow);
-	    double modValue=estReadBuffer[modCol];
-	    if(imgReaderModel1.isNoData(modValue)){
-	      estWriteBuffer[icol]=obsnodata_opt[0];
-	      uncertWriteBuffer[icol]=uncertNodata_opt[0];
+	    if(modRow<0||modRow>=imgReaderModel1.nrOfRow()){
+	      cerr << "Error: geo coordinates (" << geox << "," << geoy << ") not covered in model image " << imgReaderModel1.getFileName() << endl;
+	      assert(modRow>=0&&modRow<imgReaderModel1.nrOfRow());
 	    }
-	    else{
-	      //todo: should take into account regression model-obs...
-	      estWriteBuffer[icol]=modValue;
-	      uncertWriteBuffer[icol]=uncertModel_opt[0]*stdDev;
+	    imgReaderModel1.readData(estReadBuffer,GDT_Float64,modRow,0,theResample);
+	    for(int jcol=0;jcol<ncol;jcol+=down_opt[0]){
+	      for(int icol=icol;icol<icol+down_opt[0];++icol){
+		imgWriterEst.image2geo(icol,irow,geox,geoy);
+		imgReaderModel1.geo2image(geox,geoy,modCol,modRow);
+		lowerCol=modCol-0.5;
+		lowerCol=static_cast<int>(lowerCol);
+		upperCol=modCol+0.5;
+		upperCol=static_cast<int>(upperCol);
+		if(lowerCol<0)
+		  lowerCol=0;
+		if(upperCol>=imgReaderModel1.nrOfCol())
+		  upperCol=imgReaderModel1.nrOfCol()-1;
+		double modValue=(modCol-0.5-lowerCol)*estReadBuffer[upperCol]+(1-modCol+0.5+lowerCol)*estReadBuffer[lowerCol];
+		// double modValue=estReadBuffer[modCol];
+		if(imgReaderModel1.isNoData(modValue)){
+		  estWriteBuffer[icol]=obsnodata_opt[0];
+		  uncertWriteBuffer[icol]=uncertNodata_opt[0];
+		  gainWriteBuffer[icol]=obsnodata_opt[0];
+		}
+		else{
+		  estWriteBuffer[icol]=modValue;
+		  if(obsmin_opt.size()){
+		    if(estWriteBuffer[icol]<obsmin_opt[0])
+		      estWriteBuffer[icol]=obsmin_opt[0];
+		  }
+		  if(obsmax_opt.size()){
+		    if(estWriteBuffer[icol]>obsmax_opt[0])
+		      estWriteBuffer[icol]=obsmax_opt[0];
+		  }
+		  uncertWriteBuffer[icol]=uncertModel_opt[0];//*stdDev*stdDev;
+		  gainWriteBuffer[icol]=0;
+		}
+	      }
 	    }
+	    imgWriterEst.writeData(estWriteBuffer,GDT_Float64,irow,0);
+	    imgWriterEst.writeData(uncertWriteBuffer,GDT_Float64,irow,1);
+	    if(gain_opt.size())
+	      imgWriterGain.writeData(gainWriteBuffer,GDT_Float64,irow,0);
 	  }
-	  imgWriterEst.writeData(estWriteBuffer,GDT_Float64,irow,0);
-	  imgWriterEst.writeData(uncertWriteBuffer,GDT_Float64,irow,1);
 	}
 	catch(string errorString){
 	  cerr << errorString << endl;
@@ -445,132 +411,133 @@ int main(int argc,char **argv) {
       imgReaderObs.open(observation_opt[0]);
       imgReaderObs.getGeoTransform(geotransform);
       imgReaderObs.setNoData(obsnodata_opt);
-      if(obsoffset_opt.size())
-	imgReaderObs.setOffset(obsoffset_opt[0]);
-      if(obsscale_opt.size())
-	imgReaderObs.setScale(obsscale_opt[0]);
-
-      if(regSensor_opt[0]>0){
-	errObs=regSensor_opt[0]*imgreg.getRMSE(imgReaderModel1,imgReaderObs,c0obs,c1obs,0,0,verbose_opt[0]);
-	if(errObs<0){
-	  c0obs=0;
-	  c1obs=1;
-	}
-      }
-      else{
-	c0obs=0;
-	c1obs=1;
-	errObs=0;
-      }
-      if(verbose_opt[0])
-	cout << "c0obs, c1obs: " << c0obs << ", " << c1obs << endl;
 
-      for(int irow=0;irow<nrow;++irow){
-	vector<double> estReadBuffer;
-	imgWriterEst.image2geo(0,irow,geox,geoy);
-	imgReaderModel1.geo2image(geox,geoy,modCol,modRow);
-	assert(modRow>=0&&modRow<imgReaderModel1.nrOfRow());
-	imgReaderModel1.readData(estReadBuffer,GDT_Float64,modRow);
-	vector<double> obsLineBuffer;
-	vector<double> estWriteBuffer(ncol);
-	vector<double> uncertWriteBuffer(ncol);
-	vector<double> uncertObsLineBuffer;
-	// vector<double> lineMask;
-	// imgReaderObs.readData(estWriteBuffer,GDT_Float64,irow,0);
-	imgReaderObs.readData(obsLineBuffer,GDT_Float64,irow,0);
-	
-	if(imgReaderObs.nrOfBand()>1)
-	  imgReaderObs.readData(uncertObsLineBuffer,GDT_Float64,irow,1);
-	// double oldRowMask=-1;//keep track of row mask to optimize number of line readings
-	for(int icol=0;icol<ncol;++icol){
-	  imgWriterEst.image2geo(icol,irow,geox,geoy);
+      vector< vector<double> > obsLineVector(down_opt[0]);
+      vector<double> obsLineBuffer;
+      vector<double> obsWindowBuffer;//buffer for observation to calculate average corresponding to model pixel
+      vector<double> estReadBuffer;
+      vector<double> estWriteBuffer(ncol);
+      vector<double> uncertWriteBuffer(ncol);
+      vector<double> uncertObsLineBuffer;
+      //test
+      vector<double> gainWriteBuffer(ncol);
+
+      if(verbose_opt[0])
+	cout << "initialize obsLineVector" << endl;
+      assert(down_opt[0]%2);//window size must be odd 
+      for(int iline=-down_opt[0]/2;iline<down_opt[0]/2+1;++iline){
+	if(iline<0)//replicate line 0
+	  imgReaderObs.readData(obsLineVector[iline+down_opt[0]/2],GDT_Float64,0,0);
+	else
+	  imgReaderObs.readData(obsLineVector[iline+down_opt[0]/2],GDT_Float64,iline,0);
+      }
+      for(int jrow=0;jrow<nrow;jrow+=down_opt[0]){
+	for(int irow=jrow;irow<jrow+down_opt[0];++irow){
+	  imgWriterEst.image2geo(0,irow,geox,geoy);
 	  imgReaderModel1.geo2image(geox,geoy,modCol,modRow);
 	  assert(modRow>=0&&modRow<imgReaderModel1.nrOfRow());
-	  double modValue=estReadBuffer[modCol];
-	  if(imgReaderModel1.isNoData(modValue)){//model is nodata: retain observation 
-	    estWriteBuffer[icol]=obsLineBuffer[icol];
-	    if(imgReaderObs.isNoData(obsLineBuffer[icol])){
-	      estWriteBuffer[icol]=obsnodata_opt[0];
-	      uncertWriteBuffer[icol]=uncertNodata_opt[0];
-	    }
-	    else if(uncertObsLineBuffer.size()>icol)
-	      uncertWriteBuffer[icol]=uncertObsLineBuffer[icol];
-	    else
-	      uncertWriteBuffer[icol]=uncertObs_opt[0];
-	  }
-	  else{//model is valid: calculate estimate from model
-	    double errMod=uncertModel_opt[0]*stdDev;
-	    errMod*=regTime_opt[0];
-	    // double certNorm=(errMod*errMod+errObs*errObs);
-	    // double certMod=errObs*errObs/certNorm;
-	    // double certObs=errMod*errMod/certNorm;
-	    // double regTime=0;
-	    // double regSensor=(c0obs+c1obs*modValue)*certMod;
-	    // estWriteBuffer[icol]=regTime+regSensor;
-	    estWriteBuffer[icol]=modValue;
-	    double totalUncertainty=errMod;
-	    // if(errMod<eps_opt[0])
-	    //   totalUncertainty=errObs;
-	    // else if(errObs<eps_opt[0])
-	    //   totalUncertainty=errMod;
-	    // else{
-	    //   totalUncertainty=1.0/errMod/errMod+1/errObs/errObs;
-	    //   totalUncertainty=sqrt(1.0/totalUncertainty);
-	    // }
-	    uncertWriteBuffer[icol]=totalUncertainty;//in case observation is not valid
-	  }
-	  // uncertWriteBuffer[icol]+=uncertReadBuffer[icol];
-	  //measurement update
-	  if(!imgReaderObs.isNoData(obsLineBuffer[icol])){
-	    double kalmanGain=1;
-	    double uncertObs=uncertObs_opt[0];
-	    if(uncertObsLineBuffer.size()>icol)
-	      uncertObs=uncertObsLineBuffer[icol];
-	    else if(weight_opt.size()||deltaObs_opt.size()){
-	      vector<double> obsWindowBuffer;//buffer for observation to calculate average corresponding to model pixel
-	      int minCol=(icol>down_opt[0]/2) ? icol-down_opt[0]/2 : 0;
-	      int maxCol=(icol+down_opt[0]/2<imgReaderObs.nrOfCol()) ? icol+down_opt[0]/2 : imgReaderObs.nrOfCol()-1;
-	      int minRow=(irow>down_opt[0]/2) ? irow-down_opt[0]/2 : 0;
-	      int maxRow=(irow+down_opt[0]/2<imgReaderObs.nrOfRow()) ? irow+down_opt[0]/2 : imgReaderObs.nrOfRow()-1;
-	    
-	      imgReaderObs.readDataBlock(obsWindowBuffer,GDT_Float64,minCol,maxCol,minRow,maxRow,0);
-	      statfactory::StatFactory statobs;
-	      statobs.setNoDataValues(obsnodata_opt);
-	      double obsMeanValue=(statobs.mean(obsWindowBuffer)-c0obs)/c1obs;
-	      double difference=obsMeanValue-modValue;
-	      if(modValue){
-		double relativeDifference=difference/modValue;
-		if(deltaObs_opt.size()){
-		  assert(deltaObs_opt.size()>1);
-		  if(100*relativeDifference<deltaObs_opt[0])//lower bound
-		    kalmanGain=0;
-		  else if(100*relativeDifference>deltaObs_opt[1])//upper bound
-		    kalmanGain=0;
+	  imgReaderModel1.readData(estReadBuffer,GDT_Float64,modRow,0,theResample);
+	  int maxRow=(irow+down_opt[0]/2<imgReaderObs.nrOfRow()) ? irow+down_opt[0]/2 : imgReaderObs.nrOfRow()-1;
+	  obsLineVector.erase(obsLineVector.begin());
+	  imgReaderObs.readData(obsLineBuffer,GDT_Float64,maxRow,0);
+	  obsLineVector.push_back(obsLineBuffer);
+	  // obsLineBuffer=obsLineVector[down_opt[0]/2];
+	  if(imgReaderObs.nrOfBand()>1)
+	    imgReaderObs.readData(uncertObsLineBuffer,GDT_Float64,irow,1);
+
+	  for(int jcol=0;jcol<ncol;jcol+=down_opt[0]){
+	    for(int icol=jcol;icol<jcol+down_opt[0];++icol){
+	      imgWriterEst.image2geo(icol,irow,geox,geoy);
+	      imgReaderModel1.geo2image(geox,geoy,modCol,modRow);
+	      assert(modRow>=0&&modRow<imgReaderModel1.nrOfRow());
+	      lowerCol=modCol-0.5;
+	      lowerCol=static_cast<int>(lowerCol);
+	      upperCol=modCol+0.5;
+	      upperCol=static_cast<int>(upperCol);
+	      if(lowerCol<0)
+		lowerCol=0;
+	      if(upperCol>=imgReaderModel1.nrOfCol())
+		upperCol=imgReaderModel1.nrOfCol()-1;
+	      double modValue=(modCol-0.5-lowerCol)*estReadBuffer[upperCol]+(1-modCol+0.5+lowerCol)*estReadBuffer[lowerCol];
+	      // double modValue=estReadBuffer[modCol];
+	      double errMod=uncertModel_opt[0];//*stdDev*stdDev;
+	      if(imgReaderModel1.isNoData(modValue)){//model is nodata: retain observation 
+		if(imgReaderObs.isNoData(obsLineBuffer[icol])){//both model and observation nodata
+		  estWriteBuffer[icol]=obsnodata_opt[0];
+		  uncertWriteBuffer[icol]=uncertNodata_opt[0];
+		  gainWriteBuffer[icol]=obsnodata_opt[0];
+		}
+		else{
+		  estWriteBuffer[icol]=obsLineBuffer[icol];
+		  if(obsmin_opt.size()){
+		    if(estWriteBuffer[icol]<obsmin_opt[0])
+		      estWriteBuffer[icol]=obsmin_opt[0];
+		  }
+		  if(obsmax_opt.size()){
+		    if(estWriteBuffer[icol]>obsmax_opt[0])
+		      estWriteBuffer[icol]=obsmax_opt[0];
+		  }
+		  if(uncertObsLineBuffer.size()>icol)
+		    uncertWriteBuffer[icol]=uncertObsLineBuffer[icol];
+		  else
+		    uncertWriteBuffer[icol]=uncertObs_opt[0];
+		}
+	      }
+	      else{//model is valid: calculate estimate from model
+		estWriteBuffer[icol]=modValue;
+		uncertWriteBuffer[icol]=errMod;//in case observation is not valid
+		gainWriteBuffer[icol]=0;
+	      }
+	      //measurement update
+	      if(!imgReaderObs.isNoData(obsLineBuffer[icol])){
+		// estWriteBuffer[icol]=estReadBuffer[icol]*modValue1/modValue2
+		double kalmanGain=1;
+		int minCol=(icol>down_opt[0]/2) ? icol-down_opt[0]/2 : 0;
+		int maxCol=(icol+down_opt[0]/2<imgReaderObs.nrOfCol()) ? icol+down_opt[0]/2 : imgReaderObs.nrOfCol()-1;
+		int minRow=(irow>down_opt[0]/2) ? irow-down_opt[0]/2 : 0;
+		int maxRow=(irow+down_opt[0]/2<imgReaderObs.nrOfRow()) ? irow+down_opt[0]/2 : imgReaderObs.nrOfRow()-1;
+		obsWindowBuffer.clear();
+		for(int iline=0;iline<obsLineVector.size();++iline){
+		  for(int isample=minCol;isample<=maxCol;++isample){
+		    assert(isample<obsLineVector[iline].size());
+		    obsWindowBuffer.push_back(obsLineVector[iline][isample]);
+		  }
 		}
-		else if(weight_opt.size()){
-		  assert(weight_opt.size()>1);
-		  if(obsMeanValue<modValue)
-		    uncertObs=weight_opt[0]*relativeDifference;
-		  else if(obsMeanValue>modValue)
-		    uncertObs=weight_opt[1]*relativeDifference;
+		if(!imgReaderModel1.isNoData(modValue)){//model is valid
+		  statfactory::StatFactory statobs;
+		  statobs.setNoDataValues(obsnodata_opt);
+		  double obsMeanValue=statobs.mean(obsWindowBuffer);
+		  double difference=0;
+		  difference=obsMeanValue-modValue;
+		  errObs=uncertObs_opt[0]*sqrt(difference*difference);
+		  // errObs=uncertObs_opt[0];//*difference*difference;//uncertainty of the observation (R in Kalman equations)
+		  double errorCovariance=errMod;//assumed initial errorCovariance (P in Kalman equations)
+		  if(errorCovariance+errObs>eps_opt[0])
+		    kalmanGain=errorCovariance/(errorCovariance+errObs);
+		  else 
+		    kalmanGain=1;
+		  estWriteBuffer[icol]+=kalmanGain*(obsLineBuffer[icol]-estWriteBuffer[icol]);
+		  if(obsmin_opt.size()){
+		    if(estWriteBuffer[icol]<obsmin_opt[0])
+		      estWriteBuffer[icol]=obsmin_opt[0];
+		  }
+		  if(obsmax_opt.size()){
+		    if(estWriteBuffer[icol]>obsmax_opt[0])
+		      estWriteBuffer[icol]=obsmax_opt[0];
+		    if(uncertWriteBuffer[icol]>obsmax_opt[0])
+		      uncertWriteBuffer[icol]=obsmax_opt[0];
+		  }
 		}
+		assert(kalmanGain<=1);
+		gainWriteBuffer[icol]=kalmanGain;
 	      }
-	      if(uncertObs<=0)
-		uncertObs=0;
-	      if(verbose_opt[0]>1)
-		cout << "obsMeanValue:" << obsMeanValue << ", modValue: " << modValue << endl;
 	    }
-	    if(kalmanGain>0){
-	      if((uncertWriteBuffer[icol]+uncertObs)>eps_opt[0])
-		kalmanGain=uncertWriteBuffer[icol]/(uncertWriteBuffer[icol]+uncertObs);
-	    }
-	    assert(kalmanGain<=1);
-	    estWriteBuffer[icol]+=kalmanGain*(obsLineBuffer[icol]-estWriteBuffer[icol]);
-	    uncertWriteBuffer[icol]*=(1-kalmanGain);
 	  }
+	  if(gain_opt.size())
+	    imgWriterGain.writeData(gainWriteBuffer,GDT_Float64,irow,0);
+	  imgWriterEst.writeData(estWriteBuffer,GDT_Float64,irow,0);
+	  imgWriterEst.writeData(uncertWriteBuffer,GDT_Float64,irow,1);
 	}
-	imgWriterEst.writeData(estWriteBuffer,GDT_Float64,irow,0);
-	imgWriterEst.writeData(uncertWriteBuffer,GDT_Float64,irow,1);
       }
       imgReaderObs.close();
       ++obsindex;
@@ -599,7 +566,7 @@ int main(int argc,char **argv) {
       }
     
       //two band output band0=estimation, band1=uncertainty
-      imgWriterEst.open(output,ncol,nrow,2,GDT_Float32,imageType,option_opt);
+      imgWriterEst.open(output,ncol,nrow,2,theType,imageType,option_opt);
       imgWriterEst.setProjectionProj4(projection_opt[0]);
       imgWriterEst.setGeoTransform(geotransform);
       imgWriterEst.GDALSetNoDataValue(obsnodata_opt[0]);
@@ -607,32 +574,14 @@ int main(int argc,char **argv) {
       //calculate regression between two subsequence model inputs
       imgReaderModel1.open(model_opt[modindex-1]);
       imgReaderModel1.setNoData(modnodata_opt);
-      if(modoffset_opt.size())
-	imgReaderModel1.setOffset(modoffset_opt[0]);
-      if(modscale_opt.size())
-	imgReaderModel1.setScale(modscale_opt[0]);
       imgReaderModel2.open(model_opt[modindex]);
       imgReaderModel2.setNoData(modnodata_opt);
-      if(modoffset_opt.size())
-	imgReaderModel2.setOffset(modoffset_opt[0]);
-      if(modscale_opt.size())
-	imgReaderModel2.setScale(modscale_opt[0]);
       //calculate regression
       //we could re-use the points from second image from last run, but
       //to keep it general, we must redo it (overlap might have changed)
     
       pfnProgress(progress,pszMessage,pProgressArg);
 
-      if(verbose_opt[0])
-	cout << "Calculating regression for " << imgReaderModel1.getFileName() << " " << imgReaderModel2.getFileName() << endl;
-      
-      double errMod=imgreg.getRMSE(imgReaderModel1,imgReaderModel2,c0modGlobal,c1modGlobal,0,0);
-      errMod*=regTime_opt[0];
-
-      // double errMod=imgreg.getRMSE(imgReaderModel1,imgReaderModel2,c0modGlobal,c1modGlobal,verbose_opt[0]);
-      if(verbose_opt[0])
-	cout << "c0modGlobal, c1modGlobal: " << c0modGlobal << ", " << c1modGlobal << endl;
-
       bool update=false;
       if(obsindex<relobsindex.size()){
 	update=(relobsindex[obsindex]==modindex);
@@ -644,29 +593,8 @@ int main(int argc,char **argv) {
 	imgReaderObs.open(observation_opt[obsindex]);
 	imgReaderObs.getGeoTransform(geotransform);
 	imgReaderObs.setNoData(obsnodata_opt);
-	if(obsoffset_opt.size())
-	  imgReaderObs.setOffset(obsoffset_opt[0]);
-	if(obsscale_opt.size())
-	  imgReaderObs.setScale(obsscale_opt[0]);
-	//calculate regression between model and observation
-	if(verbose_opt[0])
-	  cout << "Calculating regression for " << imgReaderModel2.getFileName() << " " << imgReaderObs.getFileName() << endl;
-	if(regSensor_opt[0]>0){
-	  errObs=regSensor_opt[0]*imgreg.getRMSE(imgReaderModel2,imgReaderObs,c0obs,c1obs,0,0,verbose_opt[0]);
-	  if(errObs<0){
-	    c0obs=0;
-	    c1obs=1;
-	  }
-	}
-	else{
-	  c0obs=0;
-	  c1obs=1;
-	  errObs=0;
-	}
-	if(verbose_opt[0])
-	  cout << "c0obs, c1obs, errObs: " << c0obs << ", " << c1obs << ", " << errObs << endl;
       }
-      //prediction (also to fill cloudy pixels in update mode)
+      //prediction (also to fill cloudy pixels in measurement update mode)
       string input;
       if(outputfw_opt.size()==model_opt.size())
 	input=outputfw_opt[modindex-1];
@@ -682,11 +610,7 @@ int main(int argc,char **argv) {
 	cout << "opening " << input << endl;
       ImgReaderGdal imgReaderEst(input);
       imgReaderEst.setNoData(obsnodata_opt);
-      if(obsoffset_opt.size())
-	imgReaderEst.setOffset(obsoffset_opt[0]);
-      if(obsscale_opt.size())
-	imgReaderEst.setScale(obsscale_opt[0]);
-      
+
       vector< vector<double> > obsLineVector(down_opt[0]);
       vector<double> obsLineBuffer;
       vector<double> obsWindowBuffer;//buffer for observation to calculate average corresponding to model pixel
@@ -695,12 +619,13 @@ int main(int argc,char **argv) {
       vector<double> model1buffer;//buffer for model 1 to calculate time regression based on window
       vector<double> model2buffer;//buffer for model 2 to calculate time regression based on window
       vector<double> uncertObsLineBuffer;
-      vector<double> estReadBuffer;
-      // vector<double> estWindowBuffer;//buffer for estimate to calculate average corresponding to model pixel
+      vector< vector<double> > estLineVector(down_opt[0]);
+      vector<double> estLineBuffer;
+      vector<double> estWindowBuffer;//buffer for estimate to calculate average corresponding to model pixel
       vector<double> uncertReadBuffer;
       vector<double> estWriteBuffer(ncol);
       vector<double> uncertWriteBuffer(ncol);
-      // vector<double> lineMask;
+      vector<double> gainWriteBuffer(ncol);
 
       //initialize obsLineVector if update
       if(update){
@@ -714,192 +639,195 @@ int main(int argc,char **argv) {
 	    imgReaderObs.readData(obsLineVector[iline+down_opt[0]/2],GDT_Float64,iline,0);
 	}
       }
-      for(int irow=0;irow<imgWriterEst.nrOfRow();++irow){
-	//do not read from imgReaderObs, because we read entire window for each pixel...
-	imgReaderEst.readData(estReadBuffer,GDT_Float64,irow,0);
-	imgReaderEst.readData(uncertReadBuffer,GDT_Float64,irow,1);
-	//read model2 in case current estimate is nodata
-	imgReaderEst.image2geo(0,irow,geox,geoy);
-	imgReaderModel2.geo2image(geox,geoy,modCol,modRow);
-	assert(modRow>=0&&modRow<imgReaderModel2.nrOfRow());
-	imgReaderModel2.readData(model2LineBuffer,GDT_Float64,modRow,0);
-
-	imgReaderModel1.geo2image(geox,geoy,modCol,modRow);
-	assert(modRow>=0&&modRow<imgReaderModel1.nrOfRow());
-	imgReaderModel1.readData(model1LineBuffer,GDT_Float64,modRow,0);
+      //initialize estLineVector
+      if(verbose_opt[0])
+	cout << "initialize estLineVector" << endl;
+      assert(down_opt[0]%2);//window size must be odd 
+      for(int iline=-down_opt[0]/2;iline<down_opt[0]/2+1;++iline){
+	if(iline<0)//replicate line 0
+	  imgReaderEst.readData(estLineVector[iline+down_opt[0]/2],GDT_Float64,0,0);
+	else
+	  imgReaderEst.readData(estLineVector[iline+down_opt[0]/2],GDT_Float64,iline,0);
+      }
+      statfactory::StatFactory statobs;
+      statobs.setNoDataValues(obsnodata_opt);
+
+      for(int jrow=0;jrow<nrow;jrow+=down_opt[0]){
+	//todo: read entire window for uncertReadBuffer...
+	for(int irow=jrow;irow<jrow+down_opt[0];++irow){
+	  imgReaderEst.readData(uncertReadBuffer,GDT_Float64,irow,1);
+	  imgReaderEst.image2geo(0,irow,geox,geoy);
+	  imgReaderModel2.geo2image(geox,geoy,modCol,modRow);
+	  assert(modRow>=0&&modRow<imgReaderModel2.nrOfRow());
+	  imgReaderModel2.readData(model2LineBuffer,GDT_Float64,modRow,0,theResample);
+
+	  imgReaderModel1.geo2image(geox,geoy,modCol,modRow);
+	  assert(modRow>=0&&modRow<imgReaderModel1.nrOfRow());
+	  imgReaderModel1.readData(model1LineBuffer,GDT_Float64,modRow,0,theResample);
 
-	if(update){
-	  int maxRow=(irow+down_opt[0]/2<imgReaderEst.nrOfRow()) ? irow+down_opt[0]/2 : imgReaderEst.nrOfRow()-1;
-	  obsLineVector.erase(obsLineVector.begin());
-	  imgReaderObs.readData(obsLineBuffer,GDT_Float64,maxRow,0);
-	  obsLineVector.push_back(obsLineBuffer);
-	  obsLineBuffer=obsLineVector[down_opt[0]/2];
-	  // imgReaderObs.readData(obsLineBuffer,GDT_Float64,irow,0);
-	  if(imgReaderObs.nrOfBand()>1)
-	    imgReaderObs.readData(uncertObsLineBuffer,GDT_Float64,irow,1);
-	}
-	// double oldRowMask=-1;//keep track of row mask to optimize number of line readings
-	for(int icol=0;icol<imgWriterEst.nrOfCol();++icol){
-	  imgReaderEst.image2geo(icol,irow,geox,geoy);
-	  int minCol=(icol>down_opt[0]/2) ? icol-down_opt[0]/2 : 0;
-	  int maxCol=(icol+down_opt[0]/2<imgReaderEst.nrOfCol()) ? icol+down_opt[0]/2 : imgReaderEst.nrOfCol()-1;
-	  int minRow=(irow>down_opt[0]/2) ? irow-down_opt[0]/2 : 0;
 	  int maxRow=(irow+down_opt[0]/2<imgReaderEst.nrOfRow()) ? irow+down_opt[0]/2 : imgReaderEst.nrOfRow()-1;
+	  estLineVector.erase(estLineVector.begin());
+	  imgReaderEst.readData(estLineBuffer,GDT_Float64,maxRow,0);
+	  estLineVector.push_back(estLineBuffer);
+	  estLineBuffer=estLineVector[down_opt[0]/2];
+
 	  if(update){
-	    obsWindowBuffer.clear();
-	    for(int iline=0;iline<obsLineVector.size();++iline){
-	      for(int isample=minCol;isample<=maxCol;++isample){
-		assert(isample<obsLineVector[iline].size());
-		obsWindowBuffer.push_back(obsLineVector[iline][isample]);
-	      }
-	    }
-	    // imgReaderObs.readDataBlock(obsWindowBuffer,GDT_Float64,minCol,maxCol,minRow,maxRow,0);
+	    int maxRow=(irow+down_opt[0]/2<imgReaderObs.nrOfRow()) ? irow+down_opt[0]/2 : imgReaderObs.nrOfRow()-1;
+	    obsLineVector.erase(obsLineVector.begin());
+	    imgReaderObs.readData(obsLineBuffer,GDT_Float64,maxRow,0);
+	    obsLineVector.push_back(obsLineBuffer);
+	    obsLineBuffer=obsLineVector[down_opt[0]/2];
+	    // imgReaderObs.readData(obsLineBuffer,GDT_Float64,irow,0);
+	    if(imgReaderObs.nrOfBand()>1)
+	      imgReaderObs.readData(uncertObsLineBuffer,GDT_Float64,irow,1);
 	  }
-	  double estValue=estReadBuffer[icol];
-	  double estMeanValue=0;//stat.mean(estWindowBuffer);
-	  double nvalid=0;
-	  //time update
-	  imgReaderModel2.geo2image(geox,geoy,modCol,modRow);
-	  assert(modRow>=0&&modRow<imgReaderModel2.nrOfRow());
-	  double modValue=model2LineBuffer[modCol];
-	  bool estNodata=imgReaderEst.isNoData(estValue);//validity of current estimate
-	  if(estNodata){
-	    //we have not found any valid data yet, better here to take the current model value if valid
-	    if(imgReaderModel2.isNoData(modValue)){//if both estimate and model are no-data, set obs to nodata
-	      estWriteBuffer[icol]=obsnodata_opt[0];
-	      uncertWriteBuffer[icol]=uncertNodata_opt[0];
-	    }
-	    else{
-	      estWriteBuffer[icol]=modValue;
-	      uncertWriteBuffer[icol]=uncertModel_opt[0]*stdDev;
-	    }
-	  }	  
-	  else{
-	    if(window_opt[0]>0){
-	      try{
-		// imgReaderModel2.geo2image(geox,geoy,modCol,modRow);//did that already
-		minCol=(modCol>window_opt[0]/2) ? modCol-window_opt[0]/2 : 0;
-		maxCol=(modCol+window_opt[0]/2<imgReaderModel2.nrOfCol()) ? modCol+window_opt[0]/2 : imgReaderModel2.nrOfCol()-1;
-		minRow=(modRow>window_opt[0]/2) ? modRow-window_opt[0]/2 : 0;
-		maxRow=(modRow+window_opt[0]/2<imgReaderModel2.nrOfRow()) ? modRow+window_opt[0]/2 : imgReaderModel2.nrOfRow()-1;
-		imgReaderModel2.readDataBlock(model2buffer,GDT_Float64,minCol,maxCol,minRow,maxRow,0);
-
-		imgReaderModel1.geo2image(geox,geoy,modCol,modRow);
-		assert(modRow>=0&&modRow<imgReaderModel1.nrOfRow());
-		minCol=(modCol>window_opt[0]/2) ? modCol-window_opt[0]/2 : 0;
-		maxCol=(modCol+window_opt[0]/2<imgReaderModel1.nrOfCol()) ? modCol+window_opt[0]/2 : imgReaderModel1.nrOfCol()-1;
-		minRow=(modRow>window_opt[0]/2) ? modRow-window_opt[0]/2 : 0;
-		maxRow=(modRow+window_opt[0]/2<imgReaderModel1.nrOfRow()) ? modRow+window_opt[0]/2 : imgReaderModel1.nrOfRow()-1;
-		imgReaderModel1.readDataBlock(model1buffer,GDT_Float64,minCol,maxCol,minRow,maxRow,0);
-		// imgReaderEst.image2geo(icol,irow,geox,geoy);
+	  for(int jcol=0;jcol<ncol;jcol+=down_opt[0]){
+	    for(int icol=jcol;icol<jcol+down_opt[0];++icol){
+	      imgReaderEst.image2geo(icol,irow,geox,geoy);
+	      int minCol=(icol>down_opt[0]/2) ? icol-down_opt[0]/2 : 0;
+	      int maxCol=(icol+down_opt[0]/2<imgReaderEst.nrOfCol()) ? icol+down_opt[0]/2 : imgReaderEst.nrOfCol()-1;
+	      int minRow=(irow>down_opt[0]/2) ? irow-down_opt[0]/2 : 0;
+	      int maxRow=(irow+down_opt[0]/2<imgReaderEst.nrOfRow()) ? irow+down_opt[0]/2 : imgReaderEst.nrOfRow()-1;
+	      estWindowBuffer.clear();
+	      for(int iline=0;iline<estLineVector.size();++iline){
+		for(int isample=minCol;isample<=maxCol;++isample){
+		  assert(isample<estLineVector[iline].size());
+		  estWindowBuffer.push_back(estLineVector[iline][isample]);
+		}
 	      }
-	      catch(string errorString){
-		cerr << "Error reading data block for " << minCol << "-" << maxCol << ", " << minRow << "-" << maxRow << endl;
+	      if(update){
+		obsWindowBuffer.clear();
+		for(int iline=0;iline<obsLineVector.size();++iline){
+		  for(int isample=minCol;isample<=maxCol;++isample){
+		    assert(isample<obsLineVector[iline].size());
+		    obsWindowBuffer.push_back(obsLineVector[iline][isample]);
+		  }
+		}
 	      }
-	      //erase no-data from buffer
-	      vector<double>::iterator it1=model1buffer.begin();
-	      vector<double>::iterator it2=model2buffer.begin();
-	      while(it1!=model1buffer.end()&&it2!=model2buffer.end()){
-		//erase nodata
-		bool modNodata=false;
-		modNodata=modNodata||imgReaderModel1.isNoData(*it1);
-		modNodata=modNodata||imgReaderModel2.isNoData(*it2);
-		if(modNodata){
-		  model1buffer.erase(it1);
-		  model2buffer.erase(it2);
+	      double estValue=estLineBuffer[icol];
+	      imgReaderModel1.geo2image(geox,geoy,modCol,modRow);
+	      assert(modRow>=0&&modRow<imgReaderModel2.nrOfRow());
+	      lowerCol=modCol-0.5;
+	      lowerCol=static_cast<int>(lowerCol);
+	      upperCol=modCol+0.5;
+	      upperCol=static_cast<int>(upperCol);
+	      if(lowerCol<0)
+		lowerCol=0;
+	      if(upperCol>=imgReaderModel1.nrOfCol())
+		upperCol=imgReaderModel1.nrOfCol()-1;
+	      double modValue1=(modCol-0.5-lowerCol)*model1LineBuffer[upperCol]+(1-modCol+0.5+lowerCol)*model1LineBuffer[lowerCol];
+	      // double modValue1=model1LineBuffer[modCol];
+	      imgReaderModel2.geo2image(geox,geoy,modCol,modRow);
+	      assert(modRow>=0&&modRow<imgReaderModel2.nrOfRow());
+	      lowerCol=modCol-0.5;
+	      lowerCol=static_cast<int>(lowerCol);
+	      upperCol=modCol+0.5;
+	      upperCol=static_cast<int>(upperCol);
+	      if(lowerCol<0)
+		lowerCol=0;
+	      if(upperCol>=imgReaderModel1.nrOfCol())
+		upperCol=imgReaderModel1.nrOfCol()-1;
+	      double modValue2=(modCol-0.5-lowerCol)*model2LineBuffer[upperCol]+(1-modCol+0.5+lowerCol)*model2LineBuffer[lowerCol];
+	      // double modValue2=model2LineBuffer[modCol];
+	      if(imgReaderEst.isNoData(estValue)){
+		//we have not found any valid data yet, better here to take the current model value if valid
+		if(imgReaderModel2.isNoData(modValue2)){//if both estimate and model are no-data, set obs to nodata
+		  estWriteBuffer[icol]=obsnodata_opt[0];
+		  uncertWriteBuffer[icol]=uncertNodata_opt[0];
+		  gainWriteBuffer[icol]=0;
 		}
 		else{
-		  ++it1;
-		  ++it2;
+		  estWriteBuffer[icol]=modValue2;
+		  uncertWriteBuffer[icol]=uncertModel_opt[0];//*stdDev*stdDev;
+		  if(obsmin_opt.size()){
+		    if(estWriteBuffer[icol]<obsmin_opt[0])
+		      estWriteBuffer[icol]=obsmin_opt[0];
+		  }
+		  if(obsmax_opt.size()){
+		    if(estWriteBuffer[icol]>obsmax_opt[0])
+		      estWriteBuffer[icol]=obsmax_opt[0];
+		    if(uncertWriteBuffer[icol]>obsmax_opt[0])
+		      uncertWriteBuffer[icol]=obsmax_opt[0];
+		  }
+		  gainWriteBuffer[icol]=0;
 		}
 	      }
-	      if(model1buffer.size()>minreg_opt[0]&&model2buffer.size()>minreg_opt[0]){
-		errMod=stat.linear_regression_err(model1buffer,model2buffer,c0mod,c1mod);
-		errMod*=regTime_opt[0];
-	      }
-	      else{//use global regression...
-		c0mod=c0modGlobal;
-		c1mod=c1modGlobal;
-	      }
-	    }
-	    else{
-	      c0mod=c0modGlobal;
-	      c1mod=c1modGlobal;
-	    }
-	    double certNorm=(errMod*errMod+errObs*errObs);
-	    double certMod=errObs*errObs/certNorm;
-	    double certObs=errMod*errMod/certNorm;
-	    double regTime=(c0mod+c1mod*estValue)*certObs;
-	    double regSensor=(c0obs+c1obs*modValue)*certMod;
-	    // double regSensor=(c0obs+c1obs*estValue)*certObs;
-	    estWriteBuffer[icol]=regTime+regSensor;
-	    //test
-	    // if(regTime<regSensor){
-	    //   cout << "regTime = (" << c0mod << "+" << c1mod << "*" << estValue << ")*" << certObs << " = " << regTime << endl;
-	    //   cout << "regSensor = (" << c0obs << "+" << c1obs << "*" << modValue << ")*" << certMod << " = " << regSensor << endl;
-	    //   assert(regTime+regSensor>0);
-	    //   assert(regTime+regSensor<=1);
-	    // }
-
-	    double totalUncertainty=0;
-	    if(errMod<eps_opt[0])
-	      totalUncertainty=errObs;
-	    else if(errObs<eps_opt[0])
-	      totalUncertainty=errMod;
-	    else{
-	      totalUncertainty=1.0/errMod/errMod+1/errObs/errObs;
-	      totalUncertainty=sqrt(1.0/totalUncertainty);
-	    }
-	    uncertWriteBuffer[icol]=totalUncertainty+uncertReadBuffer[icol];
-	  }
-	  //measurement update
-	  if(update&&!imgReaderObs.isNoData(obsLineBuffer[icol])){
-	    double kalmanGain=1;
-	    double uncertObs=uncertObs_opt[0];
-	    if(uncertObsLineBuffer.size()>icol)
-	      uncertObs=uncertObsLineBuffer[icol];
-	    else if(weight_opt.size()>1||deltaObs_opt.size()){
-	      statfactory::StatFactory statobs;
-	      statobs.setNoDataValues(obsnodata_opt);
-	      double obsMeanValue=(statobs.mean(obsWindowBuffer)-c0obs)/c1obs;
-	      double difference=obsMeanValue-modValue;
-	      if(modValue){
-		double relativeDifference=difference/modValue;
-		if(deltaObs_opt.size()){
-		  assert(deltaObs_opt.size()>1);
-		  if(100*relativeDifference<deltaObs_opt[0])//lower bound
-		    kalmanGain=0;
-		  else if(100*relativeDifference>deltaObs_opt[1])//upper bound
-		    kalmanGain=0;
+	      else{//previous estimate is valid
+		double estMeanValue=statobs.mean(estWindowBuffer);
+		double nvalid=0;
+		//time update
+		double processNoiseVariance=processNoise_opt[0];
+		//todo: estimate process noise variance expressing instability of weights over time
+		//estimate stability of weight distribution from model (low resolution) data in a window mod1 -> mod2 and assume distribution holds at fine spatial resolution. 
+
+		if(imgReaderModel1.isNoData(modValue1)||imgReaderModel2.isNoData(modValue2)){
+		  estWriteBuffer[icol]=estValue;
+		  uncertWriteBuffer[icol]=uncertReadBuffer[icol]+processNoiseVariance;
 		}
-		else if(weight_opt.size()){
-		  assert(weight_opt.size()>1);
-		  if(obsMeanValue<modValue)
-		    uncertObs=weight_opt[0]*relativeDifference;
-		  else if(obsMeanValue>modValue)
-		    uncertObs=weight_opt[1]*relativeDifference;
+		else{//model is good
+		  double modRatio=modValue2/modValue1;//transition matrix A in Kalman equations
+		  estWriteBuffer[icol]=estValue*modRatio;
+		  uncertWriteBuffer[icol]=uncertReadBuffer[icol]*modRatio*modRatio+processNoiseVariance;
+		}
+		if(obsmin_opt.size()){
+		  if(estWriteBuffer[icol]<obsmin_opt[0])
+		    estWriteBuffer[icol]=obsmin_opt[0];
+		}
+		if(obsmax_opt.size()){
+		  if(estWriteBuffer[icol]>obsmax_opt[0])
+		    estWriteBuffer[icol]=obsmax_opt[0];
+		  if(uncertWriteBuffer[icol]>obsmax_opt[0])
+		    uncertWriteBuffer[icol]=obsmax_opt[0];
 		}
 	      }
-	      if(uncertObs<=0)
-		uncertObs=0;
-	      if(verbose_opt[0]>1)
-		cout << "obsMeanValue:" << obsMeanValue << ", modValue: " << modValue << endl;
-	    }
-	    if(kalmanGain>0){
-	      if((uncertWriteBuffer[icol]+uncertObs)>eps_opt[0])
-	      kalmanGain=uncertWriteBuffer[icol]/(uncertWriteBuffer[icol]+uncertObs);
+	      //measurement update
+	      if(update&&!imgReaderObs.isNoData(obsLineBuffer[icol])){
+		double kalmanGain=1;
+		if(!imgReaderModel2.isNoData(modValue2)){//model is valid
+		  statfactory::StatFactory statobs;
+		  statobs.setNoDataValues(obsnodata_opt);
+		  double obsMeanValue=statobs.mean(obsWindowBuffer);
+		  double difference=0;
+		  difference=obsMeanValue-modValue2;
+		  errObs=uncertObs_opt[0]*sqrt(difference*difference);
+		  // errObs=uncertObs_opt[0];//*difference*difference;//uncertainty of the observation (R in Kalman equations)
+
+		  if(errObs<eps_opt[0])
+		    errObs=eps_opt[0];
+		  double errorCovariance=uncertWriteBuffer[icol];//P in Kalman equations
+
+		  if(errorCovariance+errObs>eps_opt[0])
+		    kalmanGain=errorCovariance/(errorCovariance+errObs);
+		  else 
+		    kalmanGain=1;
+		  estWriteBuffer[icol]+=kalmanGain*(obsLineBuffer[icol]-estWriteBuffer[icol]);
+		  uncertWriteBuffer[icol]*=(1-kalmanGain);
+		  if(obsmin_opt.size()){
+		    if(estWriteBuffer[icol]<obsmin_opt[0])
+		      estWriteBuffer[icol]=obsmin_opt[0];
+		  }
+		  if(obsmax_opt.size()){
+		    if(estWriteBuffer[icol]>obsmax_opt[0])
+		      estWriteBuffer[icol]=obsmax_opt[0];
+		    if(uncertWriteBuffer[icol]>obsmax_opt[0])
+		      uncertWriteBuffer[icol]=obsmax_opt[0];
+		  }
+		}
+		assert(kalmanGain<=1);
+		gainWriteBuffer[icol]=kalmanGain;
+	      }
 	    }
-	    assert(kalmanGain<=1);
-	    estWriteBuffer[icol]+=kalmanGain*(obsLineBuffer[icol]-estWriteBuffer[icol]);
-	    uncertWriteBuffer[icol]*=(1-kalmanGain);
 	  }
+	  //test
+	  if(gain_opt.size()){
+	    imgWriterGain.writeData(gainWriteBuffer,GDT_Float64,irow,modindex);
+	  }
+	  imgWriterEst.writeData(estWriteBuffer,GDT_Float64,irow,0);
+	  imgWriterEst.writeData(uncertWriteBuffer,GDT_Float64,irow,1);
+	  progress=static_cast<float>((irow+1.0)/imgWriterEst.nrOfRow());
+	  pfnProgress(progress,pszMessage,pProgressArg);
 	}
-	imgWriterEst.writeData(estWriteBuffer,GDT_Float64,irow,0);
-	imgWriterEst.writeData(uncertWriteBuffer,GDT_Float64,irow,1);
-	progress=static_cast<float>((irow+1.0)/imgWriterEst.nrOfRow());
-	pfnProgress(progress,pszMessage,pProgressArg);
       }
-
       imgWriterEst.close();
       imgReaderEst.close();
 
@@ -910,6 +838,8 @@ int main(int argc,char **argv) {
       imgReaderModel1.close();
       imgReaderModel2.close();
     }
+    if(gain_opt.size())
+      imgWriterGain.close();
   }
   if(find(direction_opt.begin(),direction_opt.end(),"backward")!=direction_opt.end()){
     ///////////////////////////// backward model /////////////////////////
@@ -929,7 +859,8 @@ int main(int argc,char **argv) {
     }
     if(verbose_opt[0])
       cout << "Opening image " << output << " for writing " << endl;
-    imgWriterEst.open(output,ncol,nrow,2,GDT_Float32,imageType,option_opt);
+
+    imgWriterEst.open(output,ncol,nrow,2,theType,imageType,option_opt);
     imgWriterEst.setProjectionProj4(projection_opt[0]);
     imgWriterEst.setGeoTransform(geotransform);
     imgWriterEst.GDALSetNoDataValue(obsnodata_opt[0]);
@@ -945,10 +876,6 @@ int main(int argc,char **argv) {
     try{
       imgReaderModel1.open(model_opt.back());
       imgReaderModel1.setNoData(modnodata_opt);
-      if(modoffset_opt.size())
-	imgReaderModel1.setOffset(modoffset_opt[0]);
-      if(modscale_opt.size())
-	imgReaderModel1.setScale(modscale_opt[0]);
     }
     catch(string errorString){
       cerr << errorString << endl;
@@ -958,46 +885,69 @@ int main(int argc,char **argv) {
     }
 
     //calculate standard deviation of image to serve as model uncertainty
-    GDALRasterBand* rasterBand;
-    rasterBand=imgReaderModel1.getRasterBand(0);
-    double minValue, maxValue, meanValue, stdDev;
-    void* pProgressData;
-    rasterBand->ComputeStatistics(0,&minValue,&maxValue,&meanValue,&stdDev,pfnProgress,pProgressData);
+    // GDALRasterBand* rasterBand;
+    // rasterBand=imgReaderModel1.getRasterBand(0);
+    // double minValue, maxValue, meanValue, stdDev;
+    // void* pProgressData;
+    // rasterBand->ComputeStatistics(0,&minValue,&maxValue,&meanValue,&stdDev,pfnProgress,pProgressData);
     double modRow=0;
     double modCol=0;
+    double lowerCol=0;
+    double upperCol=0;
+    RESAMPLE theResample=BILINEAR;
+
     if(relobsindex.back()<model_opt.size()-1){//initialize output_opt.back() as model[0]
       //write last model as output
       if(verbose_opt[0])
 	cout << "write last model as output" << endl;
-      for(int irow=0;irow<nrow;++irow){
+      for(int jrow=0;jrow<nrow;jrow+=down_opt[0]){
 	vector<double> estReadBuffer;
 	vector<double> estWriteBuffer(ncol);
 	vector<double> uncertWriteBuffer(ncol);
-	// vector<double> lineMask;
-	imgWriterEst.image2geo(0,irow,geox,geoy);
-	imgReaderModel1.geo2image(geox,geoy,modCol,modRow);
-	assert(modRow>=0&&modRow<imgReaderModel1.nrOfRow());
 	try{
-	  imgReaderModel1.readData(estReadBuffer,GDT_Float64,modRow);
-	  //simple nearest neighbor
-	  //stat.nearUp(estReadBuffer,estWriteBuffer);
-
-	  // double oldRowMask=-1;//keep track of row mask to optimize number of line readings
-	  for(int icol=0;icol<imgWriterEst.nrOfCol();++icol){
-	    imgWriterEst.image2geo(icol,irow,geox,geoy);	    
+	  for(int irow=jrow;irow<jrow+down_opt[0];++irow){
+	    imgWriterEst.image2geo(0,irow,geox,geoy);
 	    imgReaderModel1.geo2image(geox,geoy,modCol,modRow);
-	    double modValue=estReadBuffer[modCol];
-	    if(imgReaderModel1.isNoData(modValue)){
-	      estWriteBuffer[icol]=obsnodata_opt[0];
-	      uncertWriteBuffer[icol]=uncertNodata_opt[0];
-	    }
-	    else{
-	      estWriteBuffer[icol]=modValue;
-	      uncertWriteBuffer[icol]=uncertModel_opt[0]*stdDev;
+	    assert(modRow>=0&&modRow<imgReaderModel1.nrOfRow());
+	    imgReaderModel1.readData(estReadBuffer,GDT_Float64,modRow,0,theResample);
+	    for(int jcol=0;jcol<ncol;jcol+=down_opt[0]){
+	      for(int icol=icol;icol<icol+down_opt[0];++icol){
+		imgWriterEst.image2geo(icol,irow,geox,geoy);
+		imgReaderModel1.geo2image(geox,geoy,modCol,modRow);
+		lowerCol=modCol-0.5;
+		lowerCol=static_cast<int>(lowerCol);
+		upperCol=modCol+0.5;
+		upperCol=static_cast<int>(upperCol);
+		if(lowerCol<0)
+		  lowerCol=0;
+		if(upperCol>=imgReaderModel1.nrOfCol())
+		  upperCol=imgReaderModel1.nrOfCol()-1;
+		double modValue=(modCol-0.5-lowerCol)*estReadBuffer[upperCol]+(1-modCol+0.5+lowerCol)*estReadBuffer[lowerCol];
+
+		// double modValue=estReadBuffer[modCol];
+		if(imgReaderModel1.isNoData(modValue)){
+		  estWriteBuffer[icol]=obsnodata_opt[0];
+		  uncertWriteBuffer[icol]=uncertNodata_opt[0];
+		}
+		else{
+		  estWriteBuffer[icol]=modValue;
+		  uncertWriteBuffer[icol]=uncertModel_opt[0];//*stdDev*stdDev;
+		  if(obsmin_opt.size()){
+		    if(estWriteBuffer[icol]<obsmin_opt[0])
+		      estWriteBuffer[icol]=obsmin_opt[0];
+		  }
+		  if(obsmax_opt.size()){
+		    if(estWriteBuffer[icol]>obsmax_opt[0])
+		      estWriteBuffer[icol]=obsmax_opt[0];
+		    if(uncertWriteBuffer[icol]>obsmax_opt[0])
+		      uncertWriteBuffer[icol]=obsmax_opt[0];
+		  }
+		}
+	      }
 	    }
+	    imgWriterEst.writeData(estWriteBuffer,GDT_Float64,irow,0);
+	    imgWriterEst.writeData(uncertWriteBuffer,GDT_Float64,irow,1);
 	  }
-	  imgWriterEst.writeData(estWriteBuffer,GDT_Float64,irow,0);
-	  imgWriterEst.writeData(uncertWriteBuffer,GDT_Float64,irow,1);
 	}
 	catch(string errorString){
 	  cerr << errorString << endl;
@@ -1007,141 +957,140 @@ int main(int argc,char **argv) {
 	}
       }
     }
-    else{//we have an measurement at end time
+    else{//we have a measurement at end time
       if(verbose_opt[0])
-	cout << "we have an measurement at end time" << endl;
+	cout << "we have a measurement at end time" << endl;
       imgReaderObs.open(observation_opt.back());
       imgReaderObs.getGeoTransform(geotransform);
       imgReaderObs.setNoData(obsnodata_opt);
-      if(obsoffset_opt.size())
-	imgReaderObs.setOffset(obsoffset_opt[0]);
-      if(obsscale_opt.size())
-	imgReaderObs.setScale(obsscale_opt[0]);
       
-      if(regSensor_opt[0]>0){
-	errObs=regSensor_opt[0]*imgreg.getRMSE(imgReaderModel1,imgReaderObs,c0obs,c1obs,0,0,verbose_opt[0]);
-	if(errObs<0){
-	  c0obs=0;
-	  c1obs=1;
-	}
-      }
-      else{
-	c0obs=0;
-	c1obs=1;
-	errObs=0;
-      }
-      if(verbose_opt[0])
-	cout << "c0obs, c1obs: " << c0obs << ", " << c1obs << endl;
-
-      for(int irow=0;irow<nrow;++irow){
-	vector<double> estReadBuffer;
-	imgWriterEst.image2geo(0,irow,geox,geoy);
-	imgReaderModel1.geo2image(geox,geoy,modCol,modRow);
-	assert(modRow>=0&&modRow<imgReaderModel1.nrOfRow());
-	imgReaderModel1.readData(estReadBuffer,GDT_Float64,modRow);
-	vector<double> obsLineBuffer;
-	vector<double> estWriteBuffer(ncol);
-	vector<double> uncertWriteBuffer(ncol);
-	vector<double> uncertObsLineBuffer;
-	// vector<double> lineMask;
-	// imgReaderObs.readData(estWriteBuffer,GDT_Float64,irow,0);
-	imgReaderObs.readData(obsLineBuffer,GDT_Float64,irow,0);
+      vector< vector<double> > obsLineVector(down_opt[0]);
+      vector<double> obsLineBuffer;
+      vector<double> obsWindowBuffer;//buffer for observation to calculate average corresponding to model pixel
+      vector<double> estReadBuffer;
+      vector<double> estWriteBuffer(ncol);
+      vector<double> uncertWriteBuffer(ncol);
+      vector<double> uncertObsLineBuffer;
 
-	if(imgReaderObs.nrOfBand()>1)
-	  imgReaderObs.readData(uncertObsLineBuffer,GDT_Float64,irow,1);
-	// double oldRowMask=-1;//keep track of row mask to optimize number of line readings
-	for(int icol=0;icol<imgWriterEst.nrOfCol();++icol){
-	  imgWriterEst.image2geo(icol,irow,geox,geoy);
+      if(verbose_opt[0])
+	cout << "initialize obsLineVector" << endl;
+      assert(down_opt[0]%2);//window size must be odd 
+      for(int iline=-down_opt[0]/2;iline<down_opt[0]/2+1;++iline){
+	if(iline<0)//replicate line 0
+	  imgReaderObs.readData(obsLineVector[iline+down_opt[0]/2],GDT_Float64,0,0);
+	else
+	  imgReaderObs.readData(obsLineVector[iline+down_opt[0]/2],GDT_Float64,iline,0);
+      }
+      for(int jrow=0;jrow<nrow;jrow+=down_opt[0]){
+	for(int irow=jrow;irow<jrow+down_opt[0];++irow){
+	  imgWriterEst.image2geo(0,irow,geox,geoy);
 	  imgReaderModel1.geo2image(geox,geoy,modCol,modRow);
 	  assert(modRow>=0&&modRow<imgReaderModel1.nrOfRow());
-	  double modValue=estReadBuffer[modCol];
-	  if(imgReaderModel1.isNoData(modValue)){//model is nodata: retain observation 
-	    estWriteBuffer[icol]=obsLineBuffer[icol];
-	    if(imgReaderObs.isNoData(obsLineBuffer[icol])){
-	      estWriteBuffer[icol]=obsnodata_opt[0];
-	      uncertWriteBuffer[icol]=uncertNodata_opt[0];
-	    }
-	    else if(uncertObsLineBuffer.size()>icol)
-	      uncertWriteBuffer[icol]=uncertObsLineBuffer[icol];
-	    else
-	      uncertWriteBuffer[icol]=uncertObs_opt[0];
-	  }
-	  else{//model is valid: calculate estimate from model
-	    double errMod=uncertModel_opt[0]*stdDev;
-	    errMod*=regTime_opt[0];
-	    // double certNorm=(errMod*errMod+errObs*errObs);
-	    // double certMod=errObs*errObs/certNorm;
-	    // double certObs=errMod*errMod/certNorm;
-	    // double regTime=0;
-	    // double regSensor=(c0obs+c1obs*modValue)*certMod;
-	    // estWriteBuffer[icol]=regTime+regSensor;
-	    estWriteBuffer[icol]=modValue;
-	    double totalUncertainty=errMod;
-	    // if(errMod<eps_opt[0])
-	    //   totalUncertainty=errObs;
-	    // else if(errObs<eps_opt[0])
-	    //   totalUncertainty=errMod;
-	    // else{
-	    //   totalUncertainty=1.0/errMod/errMod+1/errObs/errObs;
-	    //   totalUncertainty=sqrt(1.0/totalUncertainty);
-	    // }
-	    uncertWriteBuffer[icol]=totalUncertainty;//in case observation is not valid
-	  }
-	  //measurement update
-	  if(!imgReaderObs.isNoData(obsLineBuffer[icol])){
-	    double kalmanGain=1;
-	    double uncertObs=uncertObs_opt[0];
-	    if(uncertObsLineBuffer.size()>icol)
-	      uncertObs=uncertObsLineBuffer[icol];
-	    else if(weight_opt.size()>1||deltaObs_opt.size()){
-	      vector<double> obsWindowBuffer;//buffer for observation to calculate average corresponding to model pixel
-	      int minCol=(icol>down_opt[0]/2) ? icol-down_opt[0]/2 : 0;
-	      int maxCol=(icol+down_opt[0]/2<imgReaderObs.nrOfCol()) ? icol+down_opt[0]/2 : imgReaderObs.nrOfCol()-1;
-	      int minRow=(irow>down_opt[0]/2) ? irow-down_opt[0]/2 : 0;
-	      int maxRow=(irow+down_opt[0]/2<imgReaderObs.nrOfRow()) ? irow+down_opt[0]/2 : imgReaderObs.nrOfRow()-1;
-	    
-	      imgReaderObs.readDataBlock(obsWindowBuffer,GDT_Float64,minCol,maxCol,minRow,maxRow,0);
-	      statfactory::StatFactory statobs;
-	      statobs.setNoDataValues(obsnodata_opt);
-	      double obsMeanValue=(statobs.mean(obsWindowBuffer)-c0obs)/c1obs;
-	      double difference=obsMeanValue-modValue;
-	      if(modValue){
-		double relativeDifference=difference/modValue;
-		if(deltaObs_opt.size()){
-		  assert(deltaObs_opt.size()>1);
-		  if(100*relativeDifference<deltaObs_opt[0])//lower bound
-		    kalmanGain=0;
-		  else if(100*relativeDifference>deltaObs_opt[1])//upper bound
-		    kalmanGain=0;
+	  RESAMPLE theResample=BILINEAR;
+	  imgReaderModel1.readData(estReadBuffer,GDT_Float64,modRow,0,theResample);
+	  int maxRow=(irow+down_opt[0]/2<imgReaderObs.nrOfRow()) ? irow+down_opt[0]/2 : imgReaderObs.nrOfRow()-1;
+	  obsLineVector.erase(obsLineVector.begin());
+	  imgReaderObs.readData(obsLineBuffer,GDT_Float64,maxRow,0);
+	  obsLineVector.push_back(obsLineBuffer);
+	  // obsLineBuffer=obsLineVector[down_opt[0]/2];
+	  if(imgReaderObs.nrOfBand()>1)
+	    imgReaderObs.readData(uncertObsLineBuffer,GDT_Float64,irow,1);
+
+	  for(int jcol=0;jcol<ncol;jcol+=down_opt[0]){
+	    for(int icol=jcol;icol<jcol+down_opt[0];++icol){
+	      imgWriterEst.image2geo(icol,irow,geox,geoy);
+	      imgReaderModel1.geo2image(geox,geoy,modCol,modRow);
+	      assert(modRow>=0&&modRow<imgReaderModel1.nrOfRow());
+	      lowerCol=modCol-0.5;
+	      lowerCol=static_cast<int>(lowerCol);
+	      upperCol=modCol+0.5;
+	      upperCol=static_cast<int>(upperCol);
+	      if(lowerCol<0)
+		lowerCol=0;
+	      if(upperCol>=imgReaderModel1.nrOfCol())
+		upperCol=imgReaderModel1.nrOfCol()-1;
+	      double modValue=(modCol-0.5-lowerCol)*estReadBuffer[upperCol]+(1-modCol+0.5+lowerCol)*estReadBuffer[lowerCol];
+	      // double modValue=estReadBuffer[modCol];
+	      double errMod=uncertModel_opt[0];//*stdDev*stdDev;
+	      if(imgReaderModel1.isNoData(modValue)){//model is nodata: retain observation 
+		if(imgReaderObs.isNoData(obsLineBuffer[icol])){//both model and observation nodata
+		  estWriteBuffer[icol]=obsnodata_opt[0];
+		  uncertWriteBuffer[icol]=uncertNodata_opt[0];
 		}
-		else if(weight_opt.size()){
-		  assert(weight_opt.size()>1);
-		  if(obsMeanValue<modValue)
-		    uncertObs=weight_opt[0]*relativeDifference;
-		  else if(obsMeanValue>modValue)
-		    uncertObs=weight_opt[1]*relativeDifference;
+		else{
+		  estWriteBuffer[icol]=obsLineBuffer[icol];
+		  if(uncertObsLineBuffer.size()>icol)
+		    uncertWriteBuffer[icol]=uncertObsLineBuffer[icol];
+		  else
+		    uncertWriteBuffer[icol]=uncertObs_opt[0];
+		  if(obsmin_opt.size()){
+		    if(estWriteBuffer[icol]<obsmin_opt[0])
+		      estWriteBuffer[icol]=obsmin_opt[0];
+		  }
+		  if(obsmax_opt.size()){
+		    if(estWriteBuffer[icol]>obsmax_opt[0])
+		      estWriteBuffer[icol]=obsmax_opt[0];
+		    if(uncertWriteBuffer[icol]>obsmax_opt[0])
+		      uncertWriteBuffer[icol]=obsmax_opt[0];
+		  }
 		}
 	      }
-	      if(uncertObs<=0)
-		uncertObs=0;
-	      if(verbose_opt[0]>1)
-		cout << "obsMeanValue:" << obsMeanValue << ", modValue: " << modValue << endl;
-	    }
-	    if(kalmanGain>0){
-	      if((uncertWriteBuffer[icol]+uncertObs)>eps_opt[0])
-		kalmanGain=uncertWriteBuffer[icol]/(uncertWriteBuffer[icol]+uncertObs);
+	      else{//model is valid: calculate estimate from model
+		estWriteBuffer[icol]=modValue;
+		uncertWriteBuffer[icol]=errMod;//in case observation is not valid
+	      }
+	      //measurement update
+	      if(!imgReaderObs.isNoData(obsLineBuffer[icol])){
+		// estWriteBuffer[icol]=estReadBuffer[icol]*modValue1/modValue2
+		double kalmanGain=1;
+		int minCol=(icol>down_opt[0]/2) ? icol-down_opt[0]/2 : 0;
+		int maxCol=(icol+down_opt[0]/2<imgReaderObs.nrOfCol()) ? icol+down_opt[0]/2 : imgReaderObs.nrOfCol()-1;
+		int minRow=(irow>down_opt[0]/2) ? irow-down_opt[0]/2 : 0;
+		int maxRow=(irow+down_opt[0]/2<imgReaderObs.nrOfRow()) ? irow+down_opt[0]/2 : imgReaderObs.nrOfRow()-1;
+		obsWindowBuffer.clear();
+		for(int iline=0;iline<obsLineVector.size();++iline){
+		  for(int isample=minCol;isample<=maxCol;++isample){
+		    assert(isample<obsLineVector[iline].size());
+		    obsWindowBuffer.push_back(obsLineVector[iline][isample]);
+		  }
+		}
+		if(!imgReaderModel1.isNoData(modValue)){//model is valid
+		  statfactory::StatFactory statobs;
+		  statobs.setNoDataValues(obsnodata_opt);
+		  double obsMeanValue=statobs.mean(obsWindowBuffer);
+		  double difference=0;
+		  difference=obsMeanValue-modValue;
+		  errObs=uncertObs_opt[0]*sqrt(difference*difference);
+		  // errObs=uncertObs_opt[0];//*difference*difference;//uncertainty of the observation (R in Kalman equations)
+		  double errorCovariance=errMod;//assumed initial errorCovariance (P in Kalman equations)
+		  if(errorCovariance+errObs>eps_opt[0])
+		    kalmanGain=errorCovariance/(errorCovariance+errObs);
+		  else 
+		    kalmanGain=1;
+		  estWriteBuffer[icol]+=kalmanGain*(obsLineBuffer[icol]-estWriteBuffer[icol]);
+		  if(obsmin_opt.size()){
+		    if(estWriteBuffer[icol]<obsmin_opt[0])
+		      estWriteBuffer[icol]=obsmin_opt[0];
+		  }
+		  if(obsmax_opt.size()){
+		    if(estWriteBuffer[icol]>obsmax_opt[0])
+		      estWriteBuffer[icol]=obsmax_opt[0];
+		    if(uncertWriteBuffer[icol]>obsmax_opt[0])
+		      uncertWriteBuffer[icol]=obsmax_opt[0];
+		  }
+		}
+		assert(kalmanGain<=1);
+	      }
 	    }
-	    assert(kalmanGain<=1);
-	    estWriteBuffer[icol]+=kalmanGain*(obsLineBuffer[icol]-estWriteBuffer[icol]);
-	    uncertWriteBuffer[icol]*=(1-kalmanGain);
 	  }
+	  imgWriterEst.writeData(estWriteBuffer,GDT_Float64,irow,0);
+	  imgWriterEst.writeData(uncertWriteBuffer,GDT_Float64,irow,1);
 	}
-	imgWriterEst.writeData(estWriteBuffer,GDT_Float64,irow,0);
-	imgWriterEst.writeData(uncertWriteBuffer,GDT_Float64,irow,1);
       }
       imgReaderObs.close();
       --obsindex;
     }
+    
     imgReaderModel1.close();
     imgWriterEst.close();
 
@@ -1166,7 +1115,7 @@ int main(int argc,char **argv) {
       }
 
       //two band output band0=estimation, band1=uncertainty
-      imgWriterEst.open(output,ncol,nrow,2,GDT_Float32,imageType,option_opt);
+      imgWriterEst.open(output,ncol,nrow,2,theType,imageType,option_opt);
       imgWriterEst.setProjectionProj4(projection_opt[0]);
       imgWriterEst.setGeoTransform(geotransform);
       imgWriterEst.GDALSetNoDataValue(obsnodata_opt[0]);
@@ -1174,32 +1123,14 @@ int main(int argc,char **argv) {
       //calculate regression between two subsequence model inputs
       imgReaderModel1.open(model_opt[modindex+1]);
       imgReaderModel1.setNoData(modnodata_opt);
-      if(modoffset_opt.size())
-	imgReaderModel1.setOffset(modoffset_opt[0]);
-      if(modscale_opt.size())
-	imgReaderModel1.setScale(modscale_opt[0]);
       imgReaderModel2.open(model_opt[modindex]);
       imgReaderModel2.setNoData(modnodata_opt);
-      if(modoffset_opt.size())
-	imgReaderModel2.setOffset(modoffset_opt[0]);
-      if(modscale_opt.size())
-	imgReaderModel2.setScale(modscale_opt[0]);
       //calculate regression
       //we could re-use the points from second image from last run, but
       //to keep it general, we must redo it (overlap might have changed)
     
       pfnProgress(progress,pszMessage,pProgressArg);
 
-      if(verbose_opt[0])
-	cout << "Calculating regression for " << imgReaderModel1.getFileName() << " " << imgReaderModel2.getFileName() << endl;
-
-      double errMod=imgreg.getRMSE(imgReaderModel1,imgReaderModel2,c0modGlobal,c1modGlobal,0,0);
-      errMod*=regTime_opt[0];
-
-      // double errMod=imgreg.getRMSE(imgReaderModel1,imgReaderModel2,c0modGlobal,c1modGlobal,verbose_opt[0]);
-      if(verbose_opt[0])
-	cout << "c0modGlobal, c1modGlobal: " << c0modGlobal << ", " << c1modGlobal << endl;
-
       bool update=false;
       if(obsindex<relobsindex.size()){
 	update=(relobsindex[obsindex]==modindex);
@@ -1211,27 +1142,6 @@ int main(int argc,char **argv) {
 	imgReaderObs.open(observation_opt[obsindex]);
 	imgReaderObs.getGeoTransform(geotransform);
 	imgReaderObs.setNoData(obsnodata_opt);
-	if(obsoffset_opt.size())
-	  imgReaderObs.setOffset(obsoffset_opt[0]);
-	if(obsscale_opt.size())
-	  imgReaderObs.setScale(obsscale_opt[0]);
-	//calculate regression between model and observation
-	if(verbose_opt[0])
-	  cout << "Calculating regression for " << imgReaderModel2.getFileName() << " " << imgReaderObs.getFileName() << endl;
-	if(regSensor_opt[0]>0){
-	  errObs=regSensor_opt[0]*imgreg.getRMSE(imgReaderModel2,imgReaderObs,c0obs,c1obs,0,0,verbose_opt[0]);
-	  if(errObs<0){
-	    c0obs=0;
-	    c1obs=1;
-	  }
-	}
-	else{
-	  c0obs=0;
-	  c1obs=1;
-	  errObs=0;
-	}
-	if(verbose_opt[0])
-	  cout << "c0obs, c1obs: " << c0obs << ", " << c1obs << endl;
       }
       //prediction (also to fill cloudy pixels in update mode)
       string input;
@@ -1245,12 +1155,10 @@ int main(int argc,char **argv) {
 	// outputstream << outputbw_opt[0] << "_" << tmodel_opt[modindex+1] << ".tif";
 	input=outputstream.str();
       }
+      if(verbose_opt[0])
+	cout << "opening " << input << endl;
       ImgReaderGdal imgReaderEst(input);
       imgReaderEst.setNoData(obsnodata_opt);
-      if(obsoffset_opt.size())
-	imgReaderEst.setOffset(obsoffset_opt[0]);
-      if(obsscale_opt.size())
-	imgReaderEst.setScale(obsscale_opt[0]);
       
       vector< vector<double> > obsLineVector(down_opt[0]);
       vector<double> obsLineBuffer;
@@ -1260,15 +1168,17 @@ int main(int argc,char **argv) {
       vector<double> model1buffer;//buffer for model 1 to calculate time regression based on window
       vector<double> model2buffer;//buffer for model 2 to calculate time regression based on window
       vector<double> uncertObsLineBuffer;
-      vector<double> estReadBuffer;
-      // vector<double> estWindowBuffer;//buffer for estimate to calculate average corresponding to model pixel
+      vector< vector<double> > estLineVector(down_opt[0]);
+      vector<double> estLineBuffer;
+      vector<double> estWindowBuffer;//buffer for estimate to calculate average corresponding to model pixel
       vector<double> uncertReadBuffer;
       vector<double> estWriteBuffer(ncol);
       vector<double> uncertWriteBuffer(ncol);
-      // vector<double> lineMask;
 
       //initialize obsLineVector
       if(update){
+	if(verbose_opt[0])
+	  cout << "initialize obsLineVector" << endl;
 	assert(down_opt[0]%2);//window size must be odd 
 	for(int iline=-down_opt[0]/2;iline<down_opt[0]/2+1;++iline){
 	  if(iline<0)//replicate line 0
@@ -1277,186 +1187,185 @@ int main(int argc,char **argv) {
 	    imgReaderObs.readData(obsLineVector[iline+down_opt[0]/2],GDT_Float64,iline,0);
 	}
       }
-      for(int irow=0;irow<imgWriterEst.nrOfRow();++irow){
-	assert(irow<imgReaderEst.nrOfRow());
-	//do not read from imgReaderObs, because we read entire window for each pixel...
-	imgReaderEst.readData(estReadBuffer,GDT_Float64,irow,0);
-	imgReaderEst.readData(uncertReadBuffer,GDT_Float64,irow,1);
-	//read model2 in case current estimate is nodata
-	imgReaderEst.image2geo(0,irow,geox,geoy);
-	imgReaderModel2.geo2image(geox,geoy,modCol,modRow);
-	assert(modRow>=0&&modRow<imgReaderModel2.nrOfRow());
-	imgReaderModel2.readData(model2LineBuffer,GDT_Float64,modRow,0);
-
-	imgReaderModel1.geo2image(geox,geoy,modCol,modRow);
-	assert(modRow>=0&&modRow<imgReaderModel1.nrOfRow());
-	imgReaderModel1.readData(model1LineBuffer,GDT_Float64,modRow,0);
+      //initialize estLineVector
+      if(verbose_opt[0])
+	cout << "initialize estLineVector" << endl;
+      assert(down_opt[0]%2);//window size must be odd 
+      for(int iline=-down_opt[0]/2;iline<down_opt[0]/2+1;++iline){
+	if(iline<0)//replicate line 0
+	  imgReaderEst.readData(estLineVector[iline+down_opt[0]/2],GDT_Float64,0,0);
+	else
+	  imgReaderEst.readData(estLineVector[iline+down_opt[0]/2],GDT_Float64,iline,0);
+      }
+      statfactory::StatFactory statobs;
+      statobs.setNoDataValues(obsnodata_opt);
+
+      for(int jrow=0;jrow<nrow;jrow+=down_opt[0]){
+	//todo: read entire window for uncertReadBuffer...
+	for(int irow=jrow;irow<jrow+down_opt[0];++irow){
+	  imgReaderEst.readData(uncertReadBuffer,GDT_Float64,irow,1);
+	  imgReaderEst.image2geo(0,irow,geox,geoy);
+	  imgReaderModel2.geo2image(geox,geoy,modCol,modRow);
+	  assert(modRow>=0&&modRow<imgReaderModel2.nrOfRow());
+	  imgReaderModel2.readData(model2LineBuffer,GDT_Float64,modRow,0,theResample);
+
+	  imgReaderModel1.geo2image(geox,geoy,modCol,modRow);
+	  assert(modRow>=0&&modRow<imgReaderModel1.nrOfRow());
+	  imgReaderModel1.readData(model1LineBuffer,GDT_Float64,modRow,0,theResample);
 
-	if(update){
-	  int maxRow=(irow+down_opt[0]/2<imgReaderEst.nrOfRow()) ? irow+down_opt[0]/2 : imgReaderEst.nrOfRow()-1;
-	  obsLineVector.erase(obsLineVector.begin());
-	  imgReaderObs.readData(obsLineBuffer,GDT_Float64,maxRow,0);
-	  obsLineVector.push_back(obsLineBuffer);
-	  obsLineBuffer=obsLineVector[down_opt[0]/2];
-	  // imgReaderObs.readData(obsLineBuffer,GDT_Float64,irow,0);
-	  if(imgReaderObs.nrOfBand()>1)
-	    imgReaderObs.readData(uncertObsLineBuffer,GDT_Float64,irow,1);
-	}
-	// double oldRowMask=-1;//keep track of row mask to optimize number of line readings
-	for(int icol=0;icol<imgWriterEst.nrOfCol();++icol){
-	  imgReaderEst.image2geo(icol,irow,geox,geoy);
-	  int minCol=(icol>down_opt[0]/2) ? icol-down_opt[0]/2 : 0;
-	  int maxCol=(icol+down_opt[0]/2<imgReaderEst.nrOfCol()) ? icol+down_opt[0]/2 : imgReaderEst.nrOfCol()-1;
-	  int minRow=(irow>down_opt[0]/2) ? irow-down_opt[0]/2 : 0;
 	  int maxRow=(irow+down_opt[0]/2<imgReaderEst.nrOfRow()) ? irow+down_opt[0]/2 : imgReaderEst.nrOfRow()-1;
+	  estLineVector.erase(estLineVector.begin());
+	  imgReaderEst.readData(estLineBuffer,GDT_Float64,maxRow,0);
+	  estLineVector.push_back(estLineBuffer);
+	  estLineBuffer=estLineVector[down_opt[0]/2];
+
 	  if(update){
-	    obsWindowBuffer.clear();
-	    for(int iline=0;iline<obsLineVector.size();++iline){
-	      for(int isample=minCol;isample<=maxCol;++isample){
-		assert(isample<obsLineVector[iline].size());
-		obsWindowBuffer.push_back(obsLineVector[iline][isample]);
-	      }
-	    }
-	    // imgReaderObs.readDataBlock(obsWindowBuffer,GDT_Float64,minCol,maxCol,minRow,maxRow,0);
+	    int maxRow=(irow+down_opt[0]/2<imgReaderObs.nrOfRow()) ? irow+down_opt[0]/2 : imgReaderObs.nrOfRow()-1;
+	    obsLineVector.erase(obsLineVector.begin());
+	    imgReaderObs.readData(obsLineBuffer,GDT_Float64,maxRow,0);
+	    obsLineVector.push_back(obsLineBuffer);
+	    obsLineBuffer=obsLineVector[down_opt[0]/2];
+	    // imgReaderObs.readData(obsLineBuffer,GDT_Float64,irow,0);
+	    if(imgReaderObs.nrOfBand()>1)
+	      imgReaderObs.readData(uncertObsLineBuffer,GDT_Float64,irow,1);
 	  }
-	  double estValue=estReadBuffer[icol];
-	  double estMeanValue=0;//stat.mean(estWindowBuffer);
-	  double nvalid=0;
-	  //time update
-	  imgReaderModel2.geo2image(geox,geoy,modCol,modRow);
-	  assert(modRow>=0&&modRow<imgReaderModel2.nrOfRow());
-	  double modValue=model2LineBuffer[modCol];
-	  bool estNodata=imgReaderEst.isNoData(estValue);
-	  if(estNodata){
-	    //we have not found any valid data yet, better here to take the current model value if valid
-	    if(imgReaderModel2.isNoData(modValue)){//if both estimate and model are no-data, set obs to nodata
-	      estWriteBuffer[icol]=obsnodata_opt[0];
-	      uncertWriteBuffer[icol]=uncertNodata_opt[0];
-	    }
-	    else{
-	      estWriteBuffer[icol]=modValue;
-	      uncertWriteBuffer[icol]=uncertModel_opt[0]*stdDev;
-	    }
-	  }	  
-	  else{
-	    if(window_opt[0]>0){
-	      try{
-		// imgReaderModel2.geo2image(geox,geoy,modCol,modRow);//did that already
-		minCol=(modCol>window_opt[0]/2) ? modCol-window_opt[0]/2 : 0;
-		maxCol=(modCol+window_opt[0]/2<imgReaderModel2.nrOfCol()) ? modCol+window_opt[0]/2 : imgReaderModel2.nrOfCol()-1;
-		minRow=(modRow>window_opt[0]/2) ? modRow-window_opt[0]/2 : 0;
-		maxRow=(modRow+window_opt[0]/2<imgReaderModel2.nrOfRow()) ? modRow+window_opt[0]/2 : imgReaderModel2.nrOfRow()-1;
-		imgReaderModel2.readDataBlock(model2buffer,GDT_Float64,minCol,maxCol,minRow,maxRow,0);
-
-		imgReaderModel1.geo2image(geox,geoy,modCol,modRow);
-		assert(modRow>=0&&modRow<imgReaderModel1.nrOfRow());
-		minCol=(modCol>window_opt[0]/2) ? modCol-window_opt[0]/2 : 0;
-		maxCol=(modCol+window_opt[0]/2<imgReaderModel1.nrOfCol()) ? modCol+window_opt[0]/2 : imgReaderModel1.nrOfCol()-1;
-		minRow=(modRow>window_opt[0]/2) ? modRow-window_opt[0]/2 : 0;
-		maxRow=(modRow+window_opt[0]/2<imgReaderModel1.nrOfRow()) ? modRow+window_opt[0]/2 : imgReaderModel1.nrOfRow()-1;
-		imgReaderModel1.readDataBlock(model1buffer,GDT_Float64,minCol,maxCol,minRow,maxRow,0);
-		// imgReaderEst.image2geo(icol,irow,geox,geoy);
+	  for(int jcol=0;jcol<ncol;jcol+=down_opt[0]){
+	    for(int icol=jcol;icol<jcol+down_opt[0];++icol){
+	      imgReaderEst.image2geo(icol,irow,geox,geoy);
+	      int minCol=(icol>down_opt[0]/2) ? icol-down_opt[0]/2 : 0;
+	      int maxCol=(icol+down_opt[0]/2<imgReaderEst.nrOfCol()) ? icol+down_opt[0]/2 : imgReaderEst.nrOfCol()-1;
+	      int minRow=(irow>down_opt[0]/2) ? irow-down_opt[0]/2 : 0;
+	      int maxRow=(irow+down_opt[0]/2<imgReaderEst.nrOfRow()) ? irow+down_opt[0]/2 : imgReaderEst.nrOfRow()-1;
+	      estWindowBuffer.clear();
+	      for(int iline=0;iline<estLineVector.size();++iline){
+		for(int isample=minCol;isample<=maxCol;++isample){
+		  assert(isample<estLineVector[iline].size());
+		  estWindowBuffer.push_back(estLineVector[iline][isample]);
+		}
 	      }
-	      catch(string errorString){
-		cerr << "Error reading data block for " << minCol << "-" << maxCol << ", " << minRow << "-" << maxRow << endl;
+	      if(update){
+		obsWindowBuffer.clear();
+		for(int iline=0;iline<obsLineVector.size();++iline){
+		  for(int isample=minCol;isample<=maxCol;++isample){
+		    assert(isample<obsLineVector[iline].size());
+		    obsWindowBuffer.push_back(obsLineVector[iline][isample]);
+		  }
+		}
 	      }
-	      //erase no-data from buffer
-	      vector<double>::iterator it1=model1buffer.begin();
-	      vector<double>::iterator it2=model2buffer.begin();
-	      while(it1!=model1buffer.end()&&it2!=model2buffer.end()){
-		//erase nodata
-		bool modNodata=false;
-		modNodata=modNodata||imgReaderModel1.isNoData(*it1);
-		modNodata=modNodata||imgReaderModel2.isNoData(*it2);
-		if(modNodata){
-		  model1buffer.erase(it1);
-		  model2buffer.erase(it2);
+	      double estValue=estLineBuffer[icol];
+	      imgReaderModel1.geo2image(geox,geoy,modCol,modRow);
+	      assert(modRow>=0&&modRow<imgReaderModel2.nrOfRow());
+	      lowerCol=modCol-0.5;
+	      lowerCol=static_cast<int>(lowerCol);
+	      upperCol=modCol+0.5;
+	      upperCol=static_cast<int>(upperCol);
+	      if(lowerCol<0)
+		lowerCol=0;
+	      if(upperCol>=imgReaderModel1.nrOfCol())
+		upperCol=imgReaderModel1.nrOfCol()-1;
+	      double modValue1=(modCol-0.5-lowerCol)*model1LineBuffer[upperCol]+(1-modCol+0.5+lowerCol)*model1LineBuffer[lowerCol];
+	      // double modValue1=model1LineBuffer[modCol];
+	      imgReaderModel2.geo2image(geox,geoy,modCol,modRow);
+	      assert(modRow>=0&&modRow<imgReaderModel2.nrOfRow());
+	      lowerCol=modCol-0.5;
+	      lowerCol=static_cast<int>(lowerCol);
+	      upperCol=modCol+0.5;
+	      upperCol=static_cast<int>(upperCol);
+	      if(lowerCol<0)
+		lowerCol=0;
+	      if(upperCol>=imgReaderModel1.nrOfCol())
+		upperCol=imgReaderModel1.nrOfCol()-1;
+	      double modValue2=(modCol-0.5-lowerCol)*model2LineBuffer[upperCol]+(1-modCol+0.5+lowerCol)*model2LineBuffer[lowerCol];
+	      // double modValue2=model2LineBuffer[modCol];
+	      if(imgReaderEst.isNoData(estValue)){
+		//we have not found any valid data yet, better here to take the current model value if valid
+		if(imgReaderModel2.isNoData(modValue2)){//if both estimate and model are no-data, set obs to nodata
+		  estWriteBuffer[icol]=obsnodata_opt[0];
+		  uncertWriteBuffer[icol]=uncertNodata_opt[0];
 		}
 		else{
-		  ++it1;
-		  ++it2;
+		  estWriteBuffer[icol]=modValue2;
+		  uncertWriteBuffer[icol]=uncertModel_opt[0];//*stdDev*stdDev;
+		  if(obsmin_opt.size()){
+		    if(estWriteBuffer[icol]<obsmin_opt[0])
+		      estWriteBuffer[icol]=obsmin_opt[0];
+		  }
+		  if(obsmax_opt.size()){
+		    if(estWriteBuffer[icol]>obsmax_opt[0])
+		      estWriteBuffer[icol]=obsmax_opt[0];
+		    if(uncertWriteBuffer[icol]>obsmax_opt[0])
+		      uncertWriteBuffer[icol]=obsmax_opt[0];
+		  }
 		}
 	      }
-	      if(model1buffer.size()>minreg_opt[0]&&model2buffer.size()>minreg_opt[0]){
-		errMod=stat.linear_regression_err(model1buffer,model2buffer,c0mod,c1mod);
-		errMod*=regTime_opt[0];
-	      }
-	      else{//use global regression...
-		c0mod=c0modGlobal;
-		c1mod=c1modGlobal;
-	      }
-	    }
-	    else{
-	      c0mod=c0modGlobal;
-	      c1mod=c1modGlobal;
-	    }
-	    double certNorm=(errMod*errMod+errObs*errObs);
-	    double certMod=errObs*errObs/certNorm;
-	    double certObs=errMod*errMod/certNorm;
-	    double regTime=(c0mod+c1mod*estValue)*certObs;
-
-	    // double regSensor=(c0obs+c1obs*estValue)*certObs;
-	    double regSensor=(c0obs+c1obs*modValue)*certMod;
-	    estWriteBuffer[icol]=regTime+regSensor;
-	    double totalUncertainty=0;
-	    if(errMod<eps_opt[0])
-	      totalUncertainty=errObs;
-	    else if(errObs<eps_opt[0])
-	      totalUncertainty=errMod;
-	    else{
-	      totalUncertainty=1.0/errMod/errMod+1/errObs/errObs;
-	      totalUncertainty=sqrt(1.0/totalUncertainty);
-	    }
-	    uncertWriteBuffer[icol]=totalUncertainty+uncertReadBuffer[icol];
-	  }
-	  //measurement update
-	  if(update&&!imgReaderObs.isNoData(obsLineBuffer[icol])){
-	    double kalmanGain=1;
-	    double uncertObs=uncertObs_opt[0];
-	    if(uncertObsLineBuffer.size()>icol)
-	      uncertObs=uncertObsLineBuffer[icol];
-	    else if(weight_opt.size()>1||deltaObs_opt.size()){
-	      statfactory::StatFactory statobs;
-	      statobs.setNoDataValues(obsnodata_opt);
-	      double obsMeanValue=(statobs.mean(obsWindowBuffer)-c0obs)/c1obs;
-	      double difference=obsMeanValue-modValue;
-	      if(modValue){
-		double relativeDifference=difference/modValue;
-		if(deltaObs_opt.size()){
-		  assert(deltaObs_opt.size()>1);
-		  if(100*relativeDifference<deltaObs_opt[0])//lower bound
-		    kalmanGain=0;
-		  else if(100*relativeDifference>deltaObs_opt[1])//upper bound
-		    kalmanGain=0;
+	      else{//previous estimate is valid
+		double estMeanValue=statobs.mean(estWindowBuffer);
+		double nvalid=0;
+		//time update
+		double processNoiseVariance=processNoise_opt[0];
+		//todo: estimate process noise variance expressing instabilityof weights over time
+		//estimate stability of weight distribution from model (low resolution) data in a window mod1 -> mod2 and assume distribution holds at fine spatial resolution. 
+
+		if(imgReaderModel1.isNoData(modValue1)||imgReaderModel2.isNoData(modValue2)){
+		  estWriteBuffer[icol]=estValue;
+		  uncertWriteBuffer[icol]=uncertReadBuffer[icol]+processNoiseVariance;
+		}
+		else{//model is good
+		  double modRatio=modValue2/modValue1;//transition matrix A in Kalman equations
+		  estWriteBuffer[icol]=estValue*modRatio;
+		  uncertWriteBuffer[icol]=uncertReadBuffer[icol]*modRatio*modRatio+processNoiseVariance;
+		}
+		if(obsmin_opt.size()){
+		  if(estWriteBuffer[icol]<obsmin_opt[0])
+		    estWriteBuffer[icol]=obsmin_opt[0];
 		}
-		else if(weight_opt.size()){
-		  assert(weight_opt.size()>1);
-		  if(obsMeanValue<modValue)
-		    uncertObs=weight_opt[0]*relativeDifference;
-		  else if(obsMeanValue>modValue)
-		    uncertObs=weight_opt[1]*relativeDifference;
+		if(obsmax_opt.size()){
+		  if(estWriteBuffer[icol]>obsmax_opt[0])
+		    estWriteBuffer[icol]=obsmax_opt[0];
+		  if(uncertWriteBuffer[icol]>obsmax_opt[0])
+		    uncertWriteBuffer[icol]=obsmax_opt[0];
 		}
 	      }
-	      if(uncertObs<=0)
-		uncertObs=0;
-	      if(verbose_opt[0]>1)
-		cout << "obsMeanValue:" << obsMeanValue << ", modValue: " << modValue << endl;
-	    }
-	    if(kalmanGain>0){
-	      if((uncertWriteBuffer[icol]+uncertObs)>eps_opt[0])
-		kalmanGain=uncertWriteBuffer[icol]/(uncertWriteBuffer[icol]+uncertObs);
+	      //measurement update
+	      if(update&&!imgReaderObs.isNoData(obsLineBuffer[icol])){
+		double kalmanGain=1;
+		if(!imgReaderModel2.isNoData(modValue2)){//model is valid
+		  statfactory::StatFactory statobs;
+		  statobs.setNoDataValues(obsnodata_opt);
+		  double obsMeanValue=statobs.mean(obsWindowBuffer);
+		  double difference=0;
+		  difference=obsMeanValue-modValue2;
+		  errObs=uncertObs_opt[0]*sqrt(difference*difference);
+		  // errObs=uncertObs_opt[0];//*difference*difference;//uncertainty of the observation (R in Kalman equations)
+		  double errorCovariance=uncertWriteBuffer[icol];//P in Kalman equations
+
+		  if(errorCovariance+errObs>eps_opt[0])
+		    kalmanGain=errorCovariance/(errorCovariance+errObs);
+		  else 
+		    kalmanGain=1;
+		  estWriteBuffer[icol]+=kalmanGain*(obsLineBuffer[icol]-estWriteBuffer[icol]);
+		  uncertWriteBuffer[icol]*=(1-kalmanGain);
+		  if(obsmin_opt.size()){
+		    if(estWriteBuffer[icol]<obsmin_opt[0])
+		      estWriteBuffer[icol]=obsmin_opt[0];
+		  }
+		  if(obsmax_opt.size()){
+		    if(estWriteBuffer[icol]>obsmax_opt[0])
+		      estWriteBuffer[icol]=obsmax_opt[0];
+		    if(uncertWriteBuffer[icol]>obsmax_opt[0])
+		      uncertWriteBuffer[icol]=obsmax_opt[0];
+		  }
+		}
+		assert(kalmanGain<=1);
+	      }
 	    }
-	    assert(kalmanGain<=1);
-	    estWriteBuffer[icol]+=kalmanGain*(obsLineBuffer[icol]-estWriteBuffer[icol]);
-	    uncertWriteBuffer[icol]*=(1-kalmanGain);
 	  }
+	  imgWriterEst.writeData(estWriteBuffer,GDT_Float64,irow,0);
+	  imgWriterEst.writeData(uncertWriteBuffer,GDT_Float64,irow,1);
+	  progress=static_cast<float>((irow+1.0)/imgWriterEst.nrOfRow());
+	  pfnProgress(progress,pszMessage,pProgressArg);
 	}
-	imgWriterEst.writeData(estWriteBuffer,GDT_Float64,irow,0);
-	imgWriterEst.writeData(uncertWriteBuffer,GDT_Float64,irow,1);
-	progress=static_cast<float>((irow+1.0)/imgWriterEst.nrOfRow());
-	pfnProgress(progress,pszMessage,pProgressArg);
       }
-
       imgWriterEst.close();
       imgReaderEst.close();
 
@@ -1493,7 +1402,7 @@ int main(int argc,char **argv) {
       }
     
       //two band output band0=estimation, band1=uncertainty
-      imgWriterEst.open(output,ncol,nrow,2,GDT_Float32,imageType,option_opt);
+      imgWriterEst.open(output,ncol,nrow,2,theType,imageType,option_opt);
       imgWriterEst.setProjectionProj4(projection_opt[0]);
       imgWriterEst.setGeoTransform(geotransform);
       imgWriterEst.GDALSetNoDataValue(obsnodata_opt[0]);
@@ -1526,15 +1435,7 @@ int main(int argc,char **argv) {
       ImgReaderGdal imgReaderForward(inputfw);
       ImgReaderGdal imgReaderBackward(inputbw);
       imgReaderForward.setNoData(obsnodata_opt);
-      if(obsoffset_opt.size())
-	imgReaderForward.setOffset(obsoffset_opt[0]);
-      if(obsscale_opt.size())
-	imgReaderForward.setScale(obsscale_opt[0]);
       imgReaderBackward.setNoData(obsnodata_opt);
-      if(obsoffset_opt.size())
-	imgReaderBackward.setOffset(obsoffset_opt[0]);
-      if(obsscale_opt.size())
-	imgReaderBackward.setScale(obsscale_opt[0]);
       
       vector<double> estForwardBuffer;
       vector<double> estBackwardBuffer;
@@ -1557,10 +1458,6 @@ int main(int argc,char **argv) {
 	imgReaderObs.open(observation_opt[obsindex]);
 	imgReaderObs.getGeoTransform(geotransform);
 	imgReaderObs.setNoData(obsnodata_opt);
-	if(obsoffset_opt.size())
-	  imgReaderObs.setOffset(obsoffset_opt[0]);
-	if(obsscale_opt.size())
-	  imgReaderObs.setScale(obsscale_opt[0]);
 	//calculate regression between model and observation
       }
 
@@ -1585,8 +1482,8 @@ int main(int argc,char **argv) {
 	  imgWriterEst.image2geo(icol,irow,geox,geoy);
 	  double A=estForwardBuffer[icol];
 	  double B=estBackwardBuffer[icol];
-	  double C=uncertForwardBuffer[icol]*uncertForwardBuffer[icol];
-	  double D=uncertBackwardBuffer[icol]*uncertBackwardBuffer[icol];
+	  double C=uncertForwardBuffer[icol];
+	  double D=uncertBackwardBuffer[icol];
 	  double uncertObs=uncertObs_opt[0];
 
 	  // if(update){//check for nodata in observation
@@ -1613,22 +1510,31 @@ int main(int argc,char **argv) {
 	  else{
 	    if(noemer<eps_opt[0]){//simple average if both uncertainties are ~>0
 	      estWriteBuffer[icol]=0.5*(A+B);
-	      uncertWriteBuffer[icol]=uncertObs;
+	      uncertWriteBuffer[icol]=eps_opt[0];
 	    }
 	    else{
 	      estWriteBuffer[icol]=(A*D+B*C)/noemer;
-	      double P=0;
-	      if(C>eps_opt[0])
-		P+=1.0/C;
-	      if(D>eps_opt[0])
-		P+=1.0/D;
-	      if(uncertObs*uncertObs>eps_opt[0])
-		P-=1.0/uncertObs/uncertObs;
-	      if(P>eps_opt[0])
-		P=sqrt(1.0/P);
-	      else
-		P=0;
-	      uncertWriteBuffer[icol]=P;
+	      uncertWriteBuffer[icol]=C*D/noemer;
+	      if(obsmin_opt.size()){
+		if(estWriteBuffer[icol]<obsmin_opt[0])
+		estWriteBuffer[icol]=obsmin_opt[0];
+	      }
+	      if(obsmax_opt.size()){
+		if(estWriteBuffer[icol]>obsmax_opt[0])
+		  estWriteBuffer[icol]=obsmax_opt[0];
+		if(uncertWriteBuffer[icol]>obsmax_opt[0])
+		  uncertWriteBuffer[icol]=obsmax_opt[0];
+	      }
+	      // double P=0;
+	      // if(C>eps_opt[0])
+	      // 	P+=1.0/C;
+	      // if(D>eps_opt[0])
+	      // 	P+=1.0/D;
+	      // if(P>eps_opt[0])
+	      // 	P=1.0/P;
+	      // else
+	      // 	P=0;
+	      // uncertWriteBuffer[icol]=P;
 	    }
 	  }
 	}
diff --git a/src/apps/pklas2img.cc b/src/apps/pklas2img.cc
index 0746df3..08c63fc 100644
--- a/src/apps/pklas2img.cc
+++ b/src/apps/pklas2img.cc
@@ -45,18 +45,20 @@ along with pktools.  If not, see <http://www.gnu.org/licenses/>.
 
 \section pklas2img_description Description
 
-The utility pklas2img converts a las/laz point cloud into a gridded raster dataset. The implementation is based on <a href="www.liblas.org">liblas</a> API. You can define the bounding box, grid cell size and spatial reference set. The composite rule for multiple returns within a single grid cell can be set with the option -comp. The default attribute is z (heiht), but can also be intensity (if available), the return number (-n return) or the total number of returns in that grid cell (-n  [...]
+The utility pklas2img converts a las/laz point cloud into a gridded raster dataset. The implementation is based on <a href="www.liblas.org">liblas</a> API. You can define the bounding box, grid cell size and spatial reference set. The composite rule for multiple returns within a single grid cell can be set with the option -comp. The default attribute is z (heiht), but can also be intensity (if available), scan angle rank (-n angle), the return number (-n return) or the total number of re [...]
 \section pklas2img_options Options
  - use either `-short` or `--long` options (both `--long=value` and `--long value` are supported)
  - short option `-h` shows basic options only, long option `--help` shows all options
 |short|long|type|default|description|
 |-----|----|----|-------|-----------|
  | i      | input                | std::string |       |Input las file | 
- | n      | name                 | std::string | z     |names of the attribute to select: intensity, return, nreturn, z | 
+ | n      | name                 | std::string | z     |names of the attribute to select: intensity, angle, return, nreturn, z | 
  | ret    | ret                  | unsigned short |       |number(s) of returns to include | 
  | class  | class                | unsigned short |       |classes to keep: 0 (created, never classified), 1 (unclassified), 2 (ground), 3 (low vegetation), 4 (medium vegetation), 5 (high vegetation), 6 (building), 7 (low point, noise), 8 (model key-point), 9 (water), 10 (reserved), 11 (reserved), 12 (overlap) | 
  | comp   | comp                 | std::string | last  |composite for multiple points in cell (min, max, median, mean, sum, first, last, profile (percentile height values), percentile, number (point density)). Last: overwrite cells with latest point | 
  | fir    | filter               | std::string | all   |filter las points (first,last,single,multiple,all). | 
+ | angle_min  | angle_min        | unsigned short |    |minimum scan angle to read points. | 
+ | angle_max  | angle_max        | unsigned short |    |maximum scan angle to read points. | 
  | o      | output               | std::string |       |Output image file | 
  | a_srs  | a_srs                | std::string |       |assign the projection for the output file in epsg code, e.g., epsg:3035 for European LAEA projection | 
  | ulx    | ulx                  | double | 0     |Upper left x value bounding box (in geocoordinates if georef is true). 0 is read from input file | 
@@ -64,7 +66,7 @@ The utility pklas2img converts a las/laz point cloud into a gridded raster datas
  | lrx    | lrx                  | double | 0     |Lower right x value bounding box (in geocoordinates if georef is true). 0 is read from input file | 
  | lry    | lry                  | double | 0     |Lower right y value bounding box (in geocoordinates if georef is true). 0 is read from input file | 
  | ot     | otype                | std::string | Byte  |Data type for output image ({Byte/Int16/UInt16/UInt32/Int32/Float32/Float64/CInt16/CInt32/CFloat32/CFloat64}). Empty string: inherit type from input image | 
- | of     | oformat              | std::string | GTiff |Output image format (see also gdal_translate). Empty string: inherit from input image | 
+ | of     | oformat              | std::string | GTiff |Output image format (see also gdal_translate).| 
  | dx     | dx                   | double | 1     |Output resolution in x (in meter) | 
  | dy     | dy                   | double | 1     |Output resolution in y (in meter) | 
  | nbin   | nbin                 | short | 10    |Number of percentile bins for calculating percentile height value profile (=number of output bands) | 
@@ -82,7 +84,7 @@ using namespace std;
 
 int main(int argc,char **argv) {
   Optionpk<string> input_opt("i", "input", "Input las file");
-  Optionpk<string> attribute_opt("n", "name", "names of the point attribute to select: intensity, return, nreturn, z", "z");
+  Optionpk<string> attribute_opt("n", "name", "names of the point attribute to select: intensity, angle, return, nreturn, angle, z", "z");
   // Optionpk<bool> disc_opt("circ", "circular", "circular disc kernel for dilation and erosion", false);
   // Optionpk<double> maxSlope_opt("s", "maxSlope", "Maximum slope used for morphological filtering", 0.0);
   // Optionpk<double> hThreshold_opt("ht", "maxHeight", "initial and maximum height threshold for progressive morphological filtering (e.g., -ht 0.2 -ht 2.5)", 0.2);
@@ -91,6 +93,8 @@ int main(int argc,char **argv) {
   Optionpk<unsigned short> classes_opt("class", "class", "classes to keep: 0 (created, never classified), 1 (unclassified), 2 (ground), 3 (low vegetation), 4 (medium vegetation), 5 (high vegetation), 6 (building), 7 (low point, noise), 8 (model key-point), 9 (water), 10 (reserved), 11 (reserved), 12 (overlap)");
   Optionpk<string> composite_opt("comp", "comp", "composite for multiple points in cell (min, max, median, mean, sum, first, last, profile (percentile height values), percentile, number (point density)). Last: overwrite cells with latest point", "last");
   Optionpk<string> filter_opt("fir", "filter", "filter las points (first,last,single,multiple,all).", "all");
+  Optionpk<unsigned short> angle_min_opt("angle_min", "angle_min", "Minimum scan angle to read points.");
+  Optionpk<unsigned short> angle_max_opt("angle_max", "angle_max", "Maximum scan angle to read points.");
   // Optionpk<string> postFilter_opt("pf", "pfilter", "post processing filter (etew_min,promorph (progressive morphological filter),bunting (adapted promorph),open,close,none).", "none");
   // Optionpk<short> dimx_opt("dimx", "dimx", "Dimension X of postFilter", 3);
   // Optionpk<short> dimy_opt("dimy", "dimy", "Dimension Y of postFilter", 3);
@@ -101,11 +105,11 @@ int main(int argc,char **argv) {
   Optionpk<double> lrx_opt("lrx", "lrx", "Lower right x value bounding box (in geocoordinates if georef is true). 0 is read from input file", 0.0);
   Optionpk<double> lry_opt("lry", "lry", "Lower right y value bounding box (in geocoordinates if georef is true). 0 is read from input file", 0.0);
   Optionpk<string> otype_opt("ot", "otype", "Data type for output image ({Byte/Int16/UInt16/UInt32/Int32/Float32/Float64/CInt16/CInt32/CFloat32/CFloat64}). Empty string: inherit type from input image", "Byte");
-  Optionpk<string> oformat_opt("of", "oformat", "Output image format (see also gdal_translate). Empty string: inherit from input image", "GTiff");
+  Optionpk<string> oformat_opt("of", "oformat", "Output image format (see also gdal_translate).", "GTiff");
   Optionpk<double> dx_opt("dx", "dx", "Output resolution in x (in meter)", 1.0);
   Optionpk<double> dy_opt("dy", "dy", "Output resolution in y (in meter)", 1.0);
   Optionpk<short> nbin_opt("nbin", "nbin", "Number of percentile bins for calculating percentile height value profile (=number of output bands)", 10.0);
-  Optionpk<double> percentile_opt("perc","perc","Percentile value used for rule percentile",95);
+  Optionpk<double> percentile_opt("perc","percentile","Percentile value used for rule percentile",95);
   Optionpk<short> nodata_opt("nodata", "nodata", "nodata value to put in image", 0);
   Optionpk<string> option_opt("co", "co", "Creation option for output file. Multiple options can be specified.");
   Optionpk<string> colorTable_opt("ct", "ct", "color table (file with 5 columns: id R G B ALFA (0: transparent, 255: solid)");
@@ -125,6 +129,8 @@ int main(int argc,char **argv) {
     classes_opt.retrieveOption(argc,argv);
     composite_opt.retrieveOption(argc,argv);
     filter_opt.retrieveOption(argc,argv);
+    angle_min_opt.retrieveOption(argc,argv);
+    angle_max_opt.retrieveOption(argc,argv);
     output_opt.retrieveOption(argc,argv);
     projection_opt.retrieveOption(argc,argv);
     ulx_opt.retrieveOption(argc,argv);
@@ -249,6 +255,10 @@ int main(int argc,char **argv) {
     std::cout << setprecision(12) << "--ulx=" << minULX << " --uly=" << maxULY << " --lrx=" << maxLRX << " --lry=" << minLRY << std::endl;
     std::cout << "total number of points before filtering: " << totalPoints << std::endl;
     std::cout << "filter set to " << filter_opt[0] << std::endl;
+    if(angle_min_opt.size())
+      std::cout << "minimum scan angle: " << angle_min_opt[0] << std::endl;
+    if(angle_max_opt.size())
+      std::cout << "maximum scan angle: " << angle_max_opt[0] << std::endl;
     // std::cout << "postFilter set to " << postFilter_opt[0] << std::endl;
   }
   int ncol=ceil(maxLRX-minULX)/dx_opt[0];//number of columns in outputGrid
@@ -324,6 +334,11 @@ int main(int argc,char **argv) {
             std::cout << "writing intensity" << std::endl;
           ++ait;
         }
+        if(*ait=="angle"){
+          if(verbose_opt[0])
+            std::cout << "writing angle" << std::endl;
+          ++ait;
+        }
         else if(*ait=="return"){
           if(verbose_opt[0])
             std::cout << "writing return number" << std::endl;
@@ -354,6 +369,14 @@ int main(int argc,char **argv) {
 	continue;
       if((filter_opt[0]=="first")&&(thePoint.GetReturnNumber()!=1))
 	continue;
+      if(angle_min_opt.size()){
+	if(angle_min_opt[0]>thePoint.GetScanAngleRank())
+	  continue;
+      }
+      if(angle_max_opt.size()){
+	if(angle_max_opt[0]<thePoint.GetScanAngleRank())
+	  continue;
+      }
       double dcol,drow;
       outputWriter.geo2image(thePoint.GetX(),thePoint.GetY(),dcol,drow);
       int icol=static_cast<int>(dcol);
@@ -378,6 +401,8 @@ int main(int argc,char **argv) {
         inputData[irow][icol].push_back(thePoint.GetZ());
       else if(attribute_opt[0]=="intensity")
         inputData[irow][icol].push_back(thePoint.GetIntensity());
+      else if(attribute_opt[0]=="angle")
+        inputData[irow][icol].push_back(thePoint.GetScanAngleRank());
       else if(attribute_opt[0]=="return")
         inputData[irow][icol].push_back(thePoint.GetReturnNumber());
       else if(attribute_opt[0]=="nreturn")
diff --git a/src/apps/pkoptsvm.cc b/src/apps/pkoptsvm.cc
index f17dcbd..9500422 100644
--- a/src/apps/pkoptsvm.cc
+++ b/src/apps/pkoptsvm.cc
@@ -24,7 +24,6 @@ along with pktools.  If not, see <http://www.gnu.org/licenses/>.
 #include <math.h>
 #include <nlopt.hpp>
 #include "base/Optionpk.h"
-#include "base/Optionpk.h"
 #include "algorithms/ConfusionMatrix.h"
 #include "algorithms/FeatureSelector.h"
 #include "algorithms/OptFactory.h"
@@ -74,11 +73,11 @@ The optimization routine uses a grid search. The initial and final values of the
  | bal    | balance              | unsigned int | 0     |balance the input data to this number of samples for each class | 
  | random | random               | bool | true  |in case of balance, randomize input data | 
  | min    | min                  | int  | 0     |if number of training pixels is less then min, do not take this class into account | 
- | b      | band                 | short |       |band index (starting from 0, either use band option or use start to end) | 
- | s      | start                | double | 0     |start band sequence number | 
- | e      | end                  | double | 0     |end band sequence number (set to 0 to include all bands) | 
- |        | offset               | double | 0     |offset value for each spectral band input features: refl[band]=(DN[band]-offset[band])/scale[band] | 
- |        | scale                | double | 0     |scale value for each spectral band input features: refl=(DN[band]-offset[band])/scale[band] (use 0 if scale min and max in each band to -1.0 and 1.0) | 
+ | b      | band                 | unsigned short |      |band index (starting from 0, either use band option or use start to end) | 
+ | sband  | startband            | unsigned short |      |Start band sequence number | 
+ | eband  | endband              | unsigned short |      |End band sequence number   | 
+ | offset | offset               | double | 0     |offset value for each spectral band input features: refl[band]=(DN[band]-offset[band])/scale[band] | 
+ | scale  | scale                | double | 0     |scale value for each spectral band input features: refl=(DN[band]-offset[band])/scale[band] (use 0 if scale min and max in each band to -1.0 and 1.0) | 
  | svmt   | svmtype              | std::string | C_SVC |type of SVM (C_SVC, nu_SVC,one_class, epsilon_SVR, nu_SVR) | 
  | kt     | kerneltype           | std::string | radial |type of kernel function (linear,polynomial,radial,sigmoid)  | 
  | kd     | kd                   | unsigned short | 3     |degree in kernel function | 
@@ -187,11 +186,11 @@ int main(int argc, char *argv[])
   Optionpk<unsigned int> balance_opt("bal", "balance", "balance the input data to this number of samples for each class", 0);
   Optionpk<bool> random_opt("random","random", "in case of balance, randomize input data", true);
   Optionpk<int> minSize_opt("min", "min", "if number of training pixels is less then min, do not take this class into account", 0);
-  Optionpk<short> band_opt("b", "band", "band index (starting from 0, either use band option or use start to end)");
-  Optionpk<double> bstart_opt("s", "start", "start band sequence number",0); 
-  Optionpk<double> bend_opt("e", "end", "end band sequence number (set to 0 to include all bands)", 0); 
-  Optionpk<double> offset_opt("\0", "offset", "offset value for each spectral band input features: refl[band]=(DN[band]-offset[band])/scale[band]", 0.0);
-  Optionpk<double> scale_opt("\0", "scale", "scale value for each spectral band input features: refl=(DN[band]-offset[band])/scale[band] (use 0 if scale min and max in each band to -1.0 and 1.0)", 0.0);
+  Optionpk<unsigned short> band_opt("b", "band", "band index (starting from 0, either use band option or use start to end)");
+  Optionpk<unsigned short> bstart_opt("sband", "startband", "Start band sequence number"); 
+  Optionpk<unsigned short> bend_opt("eband", "endband", "End band sequence number"); 
+  Optionpk<double> offset_opt("offset", "offset", "offset value for each spectral band input features: refl[band]=(DN[band]-offset[band])/scale[band]", 0.0);
+  Optionpk<double> scale_opt("scale", "scale", "scale value for each spectral band input features: refl=(DN[band]-offset[band])/scale[band] (use 0 if scale min and max in each band to -1.0 and 1.0)", 0.0);
   Optionpk<unsigned int> maxit_opt("maxit","maxit","maximum number of iterations",500);
 //Optionpk<string> algorithm_opt("a", "algorithm", "GRID, or any optimization algorithm from http://ab-initio.mit.edu/wiki/index.php/NLopt_Algorithms","GRID"); 
   Optionpk<double> tolerance_opt("tol","tolerance","relative tolerance for stopping criterion",0.0001);
@@ -311,6 +310,28 @@ int main(int argc, char *argv[])
   //     priors[iclass]/=normPrior;
   // }
 
+  //convert start and end band options to vector of band indexes
+  try{
+    if(bstart_opt.size()){
+      if(bend_opt.size()!=bstart_opt.size()){
+	string errorstring="Error: options for start and end band indexes must be provided as pairs, missing end band";
+	throw(errorstring);
+      }
+      band_opt.clear();
+      for(int ipair=0;ipair<bstart_opt.size();++ipair){
+	if(bend_opt[ipair]<=bstart_opt[ipair]){
+	  string errorstring="Error: index for end band must be smaller then start band";
+	  throw(errorstring);
+	}
+	for(int iband=bstart_opt[ipair];iband<=bend_opt[ipair];++iband)
+	  band_opt.push_back(iband);
+      }
+    }
+  }
+  catch(string error){
+    cerr << error << std::endl;
+    exit(1);
+  }
   //sort bands
   if(band_opt.size())
     std::sort(band_opt.begin(),band_opt.end());
@@ -343,10 +364,10 @@ int main(int argc, char *argv[])
       }
     }
     else{
-      totalSamples=trainingReader.readDataImageOgr(trainingMap,fields,bstart_opt[0],bend_opt[0],label_opt[0],tlayer_opt,verbose_opt[0]);
+      totalSamples=trainingReader.readDataImageOgr(trainingMap,fields,0,0,label_opt[0],tlayer_opt,verbose_opt[0]);
       if(input_opt.size()){
 	ImgReaderOgr inputReader(input_opt[0]);
-	totalTestSamples=inputReader.readDataImageOgr(testMap,fields,bstart_opt[0],bend_opt[0],label_opt[0],tlayer_opt,verbose_opt[0]);
+	totalTestSamples=inputReader.readDataImageOgr(testMap,fields,0,0,label_opt[0],tlayer_opt,verbose_opt[0]);
 	inputReader.close();
       }
       trainingReader.close();
diff --git a/src/apps/pkreclass.cc b/src/apps/pkreclass.cc
index d091b9c..6c6d77c 100644
--- a/src/apps/pkreclass.cc
+++ b/src/apps/pkreclass.cc
@@ -49,6 +49,7 @@ along with pktools.  If not, see <http://www.gnu.org/licenses/>.
  | ct     | ct                   | std::string |       |color table (file with 5 columns: id R G B ALFA (0: transparent, 255: solid) | 
  | o      | output               | std::string |       |Output mask file | 
  | ot     | otype                | std::string |       |Data type for output image ({Byte/Int16/UInt16/UInt32/Int32/Float32/Float64/CInt16/CInt32/CFloat32/CFloat64}). Empty string: inherit type from input image | 
+ | of     | oformat              | std::string | GTiff |Output image format (see also gdal_translate)| 
  | b      | band                 | unsigned short | 0     |band index(es) to replace (other bands are copied to output) | 
  | n      | fname                | std::string | label |field name of the shape file to be replaced | 
  | co     | co                   | std::string |       |Creation option for output file. Multiple options can be specified. | 
@@ -75,6 +76,7 @@ int main(int argc, char *argv[])
   Optionpk<string> colorTable_opt("ct", "ct", "color table (file with 5 columns: id R G B ALFA (0: transparent, 255: solid)");
   Optionpk<unsigned short>  band_opt("b", "band", "band index(es) to replace (other bands are copied to output)", 0);
   Optionpk<string> type_opt("ot", "otype", "Data type for output image ({Byte/Int16/UInt16/UInt32/Int32/Float32/Float64/CInt16/CInt32/CFloat32/CFloat64}). Empty string: inherit type from input image", "");
+  Optionpk<string>  oformat_opt("of", "oformat", "Output image format (see also gdal_translate).","GTiff");
   Optionpk<string> code_opt("code", "code", "Recode text file (2 colums: from to)");
   Optionpk<string> class_opt("c", "class", "list of classes to reclass (in combination with reclass option)");
   Optionpk<string> reclass_opt("r", "reclass", "list of recoded classes (in combination with class option)");
@@ -95,6 +97,7 @@ int main(int argc, char *argv[])
     colorTable_opt.retrieveOption(argc,argv);
     output_opt.retrieveOption(argc,argv);
     type_opt.retrieveOption(argc,argv);
+    oformat_opt.retrieveOption(argc,argv);
     band_opt.retrieveOption(argc,argv);
     fieldname_opt.retrieveOption(argc,argv);
     option_opt.retrieveOption(argc,argv);
@@ -252,7 +255,7 @@ int main(int argc, char *argv[])
       theInterleave+=inputReader.getInterleave();
       option_opt.push_back(theInterleave);
     }
-    outputWriter.open(output_opt[0],inputReader.nrOfCol(),inputReader.nrOfRow(),inputReader.nrOfBand(),theType,inputReader.getImageType(),option_opt);
+    outputWriter.open(output_opt[0],inputReader.nrOfCol(),inputReader.nrOfRow(),inputReader.nrOfBand(),theType,oformat_opt[0],option_opt);
     for(int iband=0;iband<inputReader.nrOfBand();++iband)
       outputWriter.GDALSetNoDataValue(nodata_opt[0],iband);
     if(description_opt.size())
diff --git a/src/apps/pksetmask.cc b/src/apps/pksetmask.cc
index 17587f6..4a85fed 100644
--- a/src/apps/pksetmask.cc
+++ b/src/apps/pksetmask.cc
@@ -28,14 +28,14 @@ along with pktools.  If not, see <http://www.gnu.org/licenses/>.
 ## SYNOPSIS
 
 <code>
-  Usage: pksetmask -i input -m mask [-msknodata value] -o output
+  Usage: pksetmask -i input -m mask [-m mask]* -o output
 </code>
 
 <code>
   
-  Options: [-min value]* [-max value]* [-data value]* [-nodata value]*
+  Options: [-mskband value]* [-msknodata value -nodata value]*
  
-  Advanced options: [-b band]* [--operator '<'|'='|'<'] [-ot type] [-of format] [-co option]* [-ct table] 
+  Advanced options: [--operator '<'|'='|'<'] [-ot type] [-of format] [-co option]* [-ct table] 
 
 </code>
 
@@ -54,12 +54,11 @@ The utility pksetmask sets a mask provided with option -m to an input raster dat
  | nodata | nodata               | int  | 0     |nodata value to put in image if not valid | 
  | p      | operator             | char | =     |Operator: < = > !. Use operator for each msknodata option | 
  | ot     | otype                | std::string |       |Data type for output image ({Byte/Int16/UInt16/UInt32/Int32/Float32/Float64/CInt16/CInt32/CFloat32/CFloat64}). Empty string: inherit type from input image | 
- | of     | oformat              | std::string |       |Output image format (see also gdal_translate). Empty string: inherit from input image | 
+ | of     | oformat              | std::string | GTiff |Output image format (see also gdal_translate)| 
  | co     | co                   | std::string |       |Creation option for output file. Multiple options can be specified. | 
  | ct     | ct                   | std::string |       |color table (file with 5 columns: id R G B ALFA (0: transparent, 255: solid) | 
 
-Usage: pksetmask -i input -m mask [-msknodata value] -o output
-
+Usage: pksetmask -i input -m mask [-m mask]* [-msknodata value -nodata value]* -o output
 
 Examples
 ========
@@ -78,7 +77,7 @@ int main(int argc, char *argv[])
   Optionpk<string> mask_opt("m", "mask", "Mask image(s)");
   Optionpk<string> output_opt("o", "output", "Output mask file");
   Optionpk<string> otype_opt("ot", "otype", "Data type for output image ({Byte/Int16/UInt16/UInt32/Int32/Float32/Float64/CInt16/CInt32/CFloat32/CFloat64}). Empty string: inherit type from input image", "");
-  Optionpk<string> oformat_opt("of", "oformat", "Output image format (see also gdal_translate). Empty string: inherit from input image");
+  Optionpk<string> oformat_opt("of", "oformat", "Output image format (see also gdal_translate)","GTiff");
   Optionpk<string> option_opt("co", "co", "Creation option for output file. Multiple options can be specified.");
   Optionpk<int> msknodata_opt("msknodata", "msknodata", "Mask value(s) where image has nodata. Use one value for each mask, or multiple values for a single mask.", 1);
   Optionpk<short> mskband_opt("mskband", "mskband", "Mask band to read (0 indexed). Provide band for each mask.", 0);
@@ -114,7 +113,7 @@ int main(int argc, char *argv[])
   }
   if(!doProcess){
     cout << endl;
-    cout << "Usage: pksetmask -i input -m mask [-msknodata value] -o output" << endl;
+    cout << "Usage: pksetmask -i input -m mask [-m mask]* [-msknodata value -nodata value]* -o output" << endl;
     cout << endl;
     std::cout << "short option -h shows basic options only, use long option --help to show all options" << std::endl;
     exit(0);//help was invoked, stop processing
@@ -138,7 +137,7 @@ int main(int argc, char *argv[])
     cout << "opening input image file " << input_opt[0] << endl;
   ImgReaderGdal inputReader;
   inputReader.open(input_opt[0]);
-  string imageType=inputReader.getImageType();
+  string imageType;//=inputReader.getImageType();
   if(oformat_opt.size())//default
     imageType=oformat_opt[0];
   GDALDataType theType=GDT_Unknown;
diff --git a/src/apps/pkstat.cc b/src/apps/pkstat.cc
index 9bf5eef..e980351 100644
--- a/src/apps/pkstat.cc
+++ b/src/apps/pkstat.cc
@@ -82,7 +82,8 @@ int main(int argc, char *argv[])
   Optionpk<string> input_opt("i","input","name of the input raster dataset");
   Optionpk<unsigned short> band_opt("b","band","band(s) on which to calculate statistics",0);
   Optionpk<bool>  filename_opt("f", "filename", "Shows image filename ", false);
-  Optionpk<bool>  stat_opt("stats", "statistics", "Shows basic statistics (min,max, mean and stdDev of the raster datasets)", false);
+  Optionpk<bool>  stat_opt("stats", "statistics", "Shows basic statistics (calculate in memory) (min,max, mean and stdDev of the raster datasets)", false);
+  Optionpk<bool>  fstat_opt("fstats", "fstatistics", "Shows basic statistics using GDAL computeStatistics  (min,max, mean and stdDev of the raster datasets)", false);
   Optionpk<double>  ulx_opt("ulx", "ulx", "Upper left x value bounding box");
   Optionpk<double>  uly_opt("uly", "uly", "Upper left y value bounding box");
   Optionpk<double>  lrx_opt("lrx", "lrx", "Lower right x value bounding box");
@@ -119,6 +120,7 @@ int main(int argc, char *argv[])
   Optionpk<bool> regerr_opt("regerr","regerr","calculate linear regression between two raster datasets and get root mean square error",false);
   Optionpk<bool> preg_opt("preg","preg","calculate perpendicular regression between two raster datasets and get correlation coefficient",false);
   Optionpk<short> verbose_opt("v", "verbose", "verbose mode when positive", 0,2);
+  fstat_opt.setHide(1);
   ulx_opt.setHide(1);
   uly_opt.setHide(1);
   lrx_opt.setHide(1);
@@ -142,6 +144,7 @@ int main(int argc, char *argv[])
     band_opt.retrieveOption(argc,argv);
     filename_opt.retrieveOption(argc,argv);
     stat_opt.retrieveOption(argc,argv);
+    fstat_opt.retrieveOption(argc,argv);
     nodata_opt.retrieveOption(argc,argv);
     mean_opt.retrieveOption(argc,argv);
     median_opt.retrieveOption(argc,argv);
@@ -198,9 +201,10 @@ int main(int argc, char *argv[])
   double minY=0;
   double maxX=0;
   double maxY=0;
-  double minValue=0;
-  double maxValue=0;
+  double minValue=(src_min_opt.size())? src_min_opt[0] : 0;
+  double maxValue=(src_max_opt.size())? src_max_opt[0] : 0;
   double meanValue=0;
+  double medianValue=0;
   double stdDev=0;
 
   const char* pszMessage;
@@ -256,23 +260,37 @@ int main(int argc, char *argv[])
       if(scale_opt.size()>ifile)
         imgReader.setScale(scale_opt[ifile],band_opt[iband]);
 
-      // if(stat_opt[0]||mean_opt[0]||var_opt[0]||stdev_opt[0]){
-      // 	assert(band_opt[iband]<imgReader.nrOfBand());
-	// GDALProgressFunc pfnProgress;
-	// void* pProgressData;
-	// GDALRasterBand* rasterBand;
-      // 	rasterBand=imgReader.getRasterBand(band_opt[iband]);
-      // 	rasterBand->ComputeStatistics(0,&minValue,&maxValue,&meanValue,&stdDev,pfnProgress,pProgressData);
-
-      // 	if(mean_opt[0])
-      // 	  std::cout << "--mean " << meanValue << " ";
-      // 	if(stdev_opt[0])
-      // 	  std::cout << "--stdDev " << stdDev << " ";
-      // 	if(var_opt[0])
-      // 	  std::cout << "--var " << stdDev*stdDev << " ";
-      // 	if(stat_opt[0])
-      // 	  std::cout << "-min " << minValue << " -max " << maxValue << " --mean " << meanValue << " --stdDev " << stdDev << " ";
-      // }
+      if(stat_opt[0]||mean_opt[0]||median_opt[0]||var_opt[0]||stdev_opt[0]){//the hard way (in memory)
+	statfactory::StatFactory stat;
+	vector<double> readBuffer;
+	double varValue;
+	imgReader.readDataBlock(readBuffer, GDT_Float64, 0, imgReader.nrOfCol()-1, 0, imgReader.nrOfRow()-1, band_opt[0]);
+	stat.setNoDataValues(nodata_opt);
+	stat.meanVar(readBuffer,meanValue,varValue);
+	medianValue=stat.median(readBuffer);
+	stat.minmax(readBuffer,readBuffer.begin(),readBuffer.end(),minValue,maxValue);
+      	if(mean_opt[0])
+      	  std::cout << "--mean " << meanValue << " ";
+      	if(median_opt[0])
+      	  std::cout << "--median " << medianValue << " ";
+      	if(stdev_opt[0])
+      	  std::cout << "--stdDev " << sqrt(varValue) << " ";
+      	if(var_opt[0])
+      	  std::cout << "--var " << varValue << " ";
+      	if(stat_opt[0])
+      	  std::cout << "-min " << minValue << " -max " << maxValue << " --mean " << meanValue << " --stdDev " << sqrt(varValue) << " ";
+      }
+
+      if(fstat_opt[0]){//the fast way
+      	assert(band_opt[iband]<imgReader.nrOfBand());
+	GDALProgressFunc pfnProgress;
+	void* pProgressData;
+	GDALRasterBand* rasterBand;
+      	rasterBand=imgReader.getRasterBand(band_opt[iband]);
+      	rasterBand->ComputeStatistics(0,&minValue,&maxValue,&meanValue,&stdDev,pfnProgress,pProgressData);
+
+	std::cout << "-min " << minValue << " -max " << maxValue << " --mean " << meanValue << " --stdDev " << stdDev << " ";
+      }
 
       if(minmax_opt[0]||min_opt[0]||max_opt[0]){
 	assert(band_opt[iband]<imgReader.nrOfBand());
@@ -284,7 +302,7 @@ int main(int argc, char *argv[])
 	  imgReader.getMinMax(static_cast<int>(uli),static_cast<int>(lri),static_cast<int>(ulj),static_cast<int>(lrj),band_opt[iband],minValue,maxValue);
 	}
 	else{
-	  imgReader.getMinMax(minValue,maxValue,band_opt[iband],true);
+	  imgReader.getMinMax(minValue,maxValue,band_opt[iband]);
 	}
 	if(minmax_opt[0])
 	  std::cout << "-min " << minValue << " -max " << maxValue << " ";
@@ -519,12 +537,36 @@ int main(int argc, char *argv[])
     if(rmse_opt[0]&&input_opt.size()<2){
       if(band_opt.size()<2)
 	continue;
-      imgreg.setDown(down_opt[0]);
-      imgreg.setThreshold(random_opt[0]);
-      double c0=0;//offset
-      double c1=1;//scale
-      double err=imgreg.getRMSE(imgReader,band_opt[0],band_opt[1],c0,c1,verbose_opt[0]);
-      std::cout << " -rmse " << err << std::endl;
+      vector<double> xBuffer(imgReader.nrOfCol());
+      vector<double> yBuffer(imgReader.nrOfCol());
+      double mse=0;
+      double nValid=0;
+      double nPixel=imgReader.nrOfCol()/down_opt[0]*imgReader.nrOfRow()/down_opt[0];
+      for(int irow;irow<imgReader.nrOfRow();irow+=down_opt[0]){
+	imgReader.readData(xBuffer,GDT_Float64,irow,band_opt[0]);
+	imgReader.readData(yBuffer,GDT_Float64,irow,band_opt[1]);
+	for(int icol;icol<imgReader.nrOfCol();icol+=down_opt[0]){
+	  double xValue=xBuffer[icol];
+	  double yValue=yBuffer[icol];
+	  if(imgReader.isNoData(xValue)||imgReader.isNoData(yValue)){
+	    continue;
+	  }
+	  if(imgReader.isNoData(xValue)||imgReader.isNoData(yValue)){
+	    continue;
+	  }
+	  if(xValue<src_min_opt[0]||xValue>src_max_opt[0]||yValue<src_min_opt[0]||yValue>src_max_opt[0])
+	    continue;
+	  ++nValid;
+	  double e=xValue-yValue;
+	  if(relative_opt[0])
+	    e/=yValue;
+	  mse+=e*e/nPixel;
+	}
+      }
+      double correctNorm=nValid;
+      correctNorm/=nPixel;
+      mse/=correctNorm;
+      std::cout << " -rmse " << sqrt(mse) << std::endl;
     }
     if(preg_opt[0]&&input_opt.size()<2){
       if(band_opt.size()<2)
@@ -538,6 +580,73 @@ int main(int argc, char *argv[])
     }
     imgReader.close();
   }
+  // if(rmse_opt[0]&&(input_opt.size()>1)){
+  //   while(band_opt.size()<input_opt.size())
+  //     band_opt.push_back(band_opt[0]);
+  //   if(src_min_opt.size()){
+  //     while(src_min_opt.size()<input_opt.size())
+  // 	src_min_opt.push_back(src_min_opt[0]);
+  //   }
+  //   if(src_max_opt.size()){
+  //     while(src_max_opt.size()<input_opt.size())
+  // 	src_max_opt.push_back(src_max_opt[0]);
+  //   }
+  //   ImgReaderGdal imgReader1(input_opt[0]);
+  //   ImgReaderGdal imgReader2(input_opt[1]);
+
+  //   if(offset_opt.size())
+  //     imgReader1.setOffset(offset_opt[0],band_opt[0]);
+  //   if(scale_opt.size())
+  //     imgReader1.setScale(scale_opt[0],band_opt[0]);
+  //   if(offset_opt.size()>1)
+  //     imgReader2.setOffset(offset_opt[1],band_opt[1]);
+  //   if(scale_opt.size()>1)
+  //     imgReader2.setScale(scale_opt[1],band_opt[1]);
+
+  //   for(int inodata=0;inodata<nodata_opt.size();++inodata){
+  //     imgReader1.pushNoDataValue(nodata_opt[inodata]);
+  //     imgReader2.pushNoDataValue(nodata_opt[inodata]);
+  //   }
+  //   vector<double> xBuffer(imgReader1.nrOfCol());
+  //   vector<double> yBuffer(imgReader2.nrOfCol());
+  //   double mse=0;
+  //   double nValid=0;
+  //   double nPixel=imgReader.nrOfCol()/imgReader.nrOfRow()/down_opt[0]/down_opt[0];
+  //   for(int irow;irow<imgReader1.nrOfRow();irow+=down_opt[0]){
+  //     double irow1=irow;
+  //     double irow2=0;
+  //     double icol1=0;
+  //     double icol2=0;
+  //     double geoX=0;
+  //     double geoY=0;
+  //     imgReader1.image2geo(icol1,irow1,geoX,geoY);
+  //     imgReader2.geo2image(geoX,geoY,icol2,irow2);
+  //     irow2=static_cast<int>(irow2);
+  //     imgReader1.readData(xBuffer,GDT_Float64,irow1,band_opt[0]);
+  //     imgReader2.readData(yBuffer,GDT_Float64,irow2,band_opt[1]);
+  //     for(int icol;icol<imgReader.nrOfCol();icol+=down_opt[0]){
+  // 	icol1=icol;
+  // 	imgReader1.image2geo(icol1,irow1,geoX,geoY);
+  // 	imgReader2.geo2image(geoX,geoY,icol2,irow2);
+  // 	double xValue=xBuffer[icol1];
+  // 	double yValue=yBuffer[icol2];
+  // 	if(imgReader.isNoData(xValue)||imgReader.isNoData(yValue)){
+  // 	  continue;
+  // 	}
+  // 	if(xValue<src_min_opt[0]||xValue>src_max_opt[0]||yValue<src_min_opt[1]||yValue>src_max_opt[1])
+  // 	  continue;
+  // 	++nValid;
+  // 	double e=xValue-yValue;
+  // 	if(relative_opt[0])
+  // 	  e/=yValue;
+  // 	mse+=e*e/nPixel;
+  //     }
+  //   }
+  //   double correctNorm=nValid;
+  //   correctNorm/=nPixel;
+  //   mse/=correctNorm;
+  //   std::cout << " -rmse " << sqrt(mse) << std::endl;
+  // }
   if(reg_opt[0]&&(input_opt.size()>1)){
     imgreg.setDown(down_opt[0]);
     imgreg.setThreshold(random_opt[0]);
diff --git a/src/apps/pkdsm2shadow.cc b/src/apps/pkstatprofile.cc
similarity index 50%
copy from src/apps/pkdsm2shadow.cc
copy to src/apps/pkstatprofile.cc
index edd0d5e..1e02188 100644
--- a/src/apps/pkdsm2shadow.cc
+++ b/src/apps/pkstatprofile.cc
@@ -1,6 +1,6 @@
 /**********************************************************************
-pkdsm2shadow.cc: program to calculate sun shadow based on digital surface model and sun angles
-Copyright (C) 2008-2014 Pieter Kempeneers
+pkstatz.cc: program to calculate statistics in temporal or spectral profile
+Copyright (C) 2008-2015 Pieter Kempeneers
 
 This file is part of pktools
 
@@ -27,87 +27,105 @@ along with pktools.  If not, see <http://www.gnu.org/licenses/>.
 #include "base/Optionpk.h"
 #include "base/Vector2d.h"
 #include "algorithms/Filter2d.h"
+#include "algorithms/Filter.h"
 #include "imageclasses/ImgReaderGdal.h"
 #include "imageclasses/ImgWriterGdal.h"
+#include "algorithms/StatFactory.h"
 
 /******************************************************************************/
-/*! \page pkdsm2shadow pkdsm2shadow
- program to calculate sun shadow based on digital surface model and sun angles
+/*! \page pkstatz pkstatz
+ program to calculate statistics in temporal or spectral profile
 ## SYNOPSIS
 
 <code>
-  Usage: pkdsm2shadow -i input.txt -o output [-sza angle] [-saa angle]
+  Usage: pkstatz -i input -o output [-f function]*
 </code>
 
 <code>
+  Options: [-nodata value]
 
-  
-  Options: [-f value] [-ot type] [-of GDALformat] [-ct filename] [-co option]* 
-
-  Advanced options: [--scale value] [--offset value]
+  Advanced options: check table
 </code>
 
-\section pkdsm2shadow_description Description
+\section pkstatz_description Description
+
+This utility calculates statistics for a temporal (time series) or spectral profile
+
+\anchor pkstatz_functions
 
-Utility to create a binary shadow mask from a digital surface model, based on Sun zenith (-sza) and azimuth angles (-saa).
+|function | description|
+|-------------|-------------|
+mean | calculate mean in window
+median | perform a median filter in spatial (dx, dy) or spectral/temporal (dz) domain
+var | calculate variance in window
+stdev | calculate standard deviation in window
+min | calculate minimum in window
+max | calculate maximum in window
+sum | calculate sum in window
+mode | calculate mode of all values
+ismin | 1 if value is minimum, else 0
+ismax | 1 if value is maximum, else 0
+per | calculate percentile in time series (provide percentage value as argument)
+prop  |calculate proportion
+nvalid | report number of valid observations
 
-\section pkdsm2shadow_options Options
+Example: Calculate min and max NDVI in time series
+
+\code
+pkstatz -i modis_ndvi_2010.tif -o modis_stats_2010.tif -f min -f max
+\endcode
+
+\section pkfilter_options Options
  - use either `-short` or `--long` options (both `--long=value` and `--long value` are supported)
  - short option `-h` shows basic options only, long option `--help` shows all options
 |short|long|type|default|description|
 |-----|----|----|-------|-----------|
  | i      | input                | std::string |       |input image file | 
  | o      | output               | std::string |       |Output image file | 
- | sza    | sza                  | double |       |Sun zenith angle. | 
- | saa    | saa                  | double |       |Sun azimuth angle (N=0 E=90 S=180 W=270). | 
- | f      | flag                 | int  | 0     |Flag to put in image if pixel shadow | 
- | s      | scale                | double |       |scale used for input dsm: height=scale*input+offset | 
- | off    | offset               | double |       |offset used for input dsm: height=scale*input+offset | 
- | co     | co                   | std::string |       |Creation option for output file. Multiple options can be specified. | 
- | ot     | otype                | std::string |       |Data type for output image ({Byte/Int16/UInt16/UInt32/Int32/Float32/Float64/CInt16/CInt32/CFloat32/CFloat64}). Empty string: inherit type from input image | 
- | of     | oformat              | std::string |       |Output image format (see also gdal_translate). Empty string: inherit from input image | 
- | ct     | ct                   | std::string |       |color table (file with 5 columns: id R G B ALFA (0: transparent, 255: solid) | 
+ | f      | function             | std::string |       |statistics function (see table) | 
+ | perc   | percentile           | double |  |percentile value(s) for percentile function | 
+ |class | class | std::string | | class value(s) to use for mode, proportion |
+ |nodata | nodata | double | | nodata value(s) |
 
-Usage: pkdsm2shadow -i input.txt -o output [-sza angle] [-saa angle]
+Usage: pkstatz -i input -o ouptut [-f function]*
 
 
 Examples
 ========
-Some examples how to use pkdsm2shadow can be found \ref examples_pkdsm2shadow "here"
+Some examples how to use pkstatz can be found \ref examples_pkstatz "here"
 **/
 
 using namespace std;
-
 /*------------------
   Main procedure
   ----------------*/
 int main(int argc,char **argv) {
   Optionpk<std::string> input_opt("i","input","input image file");
   Optionpk<std::string> output_opt("o", "output", "Output image file");
-  Optionpk<double> sza_opt("sza", "sza", "Sun zenith angle.");
-  Optionpk<double> saa_opt("saa", "saa", "Sun azimuth angle (N=0 E=90 S=180 W=270).");
-  Optionpk<int> flag_opt("f", "flag", "Flag to put in image if pixel shadow", 0);
-  Optionpk<std::string>  otype_opt("ot", "otype", "Data type for output image ({Byte/Int16/UInt16/UInt32/Int32/Float32/Float64/CInt16/CInt32/CFloat32/CFloat64}). Empty string: inherit type from input image", "");
-  Optionpk<string>  oformat_opt("of", "oformat", "Output image format (see also gdal_translate). Empty string: inherit from input image");
-  Optionpk<string>  colorTable_opt("ct", "ct", "color table (file with 5 columns: id R G B ALFA (0: transparent, 255: solid)");
+  Optionpk<std::string> function_opt("f", "function", "Statistics function (mean, median, var, stdev, min, max, sum, mode (provide classes), ismin, ismax, proportion (provide classes), percentile, nvalid");
+  Optionpk<double> percentile_opt("perc","perc","Percentile value(s) used for rule percentile");
+  Optionpk<short> class_opt("class", "class", "class value(s) to use for mode, proportion");
+  Optionpk<double> nodata_opt("nodata", "nodata", "nodata value(s)");
+  Optionpk<std::string>  otype_opt("ot", "otype", "Data type for output image ({Byte/Int16/UInt16/UInt32/Int32/Float32/Float64/CInt16/CInt32/CFloat32/CFloat64}). Empty string: inherit type from input image","");
+  Optionpk<string>  oformat_opt("of", "oformat", "Output image format (see also gdal_translate)","GTiff");
+  Optionpk<string>  colorTable_opt("ct", "ct", "color table (file with 5 columns: id R G B ALFA (0: transparent, 255: solid). Use none to ommit color table");
   Optionpk<string> option_opt("co", "co", "Creation option for output file. Multiple options can be specified.");
-  Optionpk<double> scale_opt("s", "scale", "scale used for input dsm: height=scale*input+offset");
-  Optionpk<double> offset_opt("off", "offset", "offset used for input dsm: height=scale*input+offset");
+  // Optionpk<short> down_opt("d", "down", "down sampling factor. Use value 1 for no downsampling). Use value n>1 for downsampling (aggregation)", 1);
   Optionpk<short> verbose_opt("v", "verbose", "verbose mode if > 0", 0,2);
 
-  scale_opt.setHide(1);
-  offset_opt.setHide(1);
+  percentile_opt.setHide(1);
+  class_opt.setHide(1);
+  otype_opt.setHide(1);
+  oformat_opt.setHide(1);
+  colorTable_opt.setHide(1);
 
   bool doProcess;//stop process when program was invoked with help option (-h --help)
   try{
     doProcess=input_opt.retrieveOption(argc,argv);
     output_opt.retrieveOption(argc,argv);
-    sza_opt.retrieveOption(argc,argv);
-    saa_opt.retrieveOption(argc,argv);
-    flag_opt.retrieveOption(argc,argv);
-    scale_opt.retrieveOption(argc,argv);
-    offset_opt.retrieveOption(argc,argv);
-    option_opt.retrieveOption(argc,argv);
+    function_opt.retrieveOption(argc,argv);
+    percentile_opt.retrieveOption(argc,argv);
+    nodata_opt.retrieveOption(argc,argv);
     otype_opt.retrieveOption(argc,argv);
     oformat_opt.retrieveOption(argc,argv);
     colorTable_opt.retrieveOption(argc,argv);
@@ -119,23 +137,42 @@ int main(int argc,char **argv) {
   }
   if(!doProcess){
     cout << endl;
-    cout << "Usage: pkdsm2shadow -i input.txt -o output [-sza angle] [-saa angle]" << endl;
+    cout << "Usage: pkstatz -i input -o ouptut [-function]*" << endl;
     cout << endl;
     std::cout << "short option -h shows basic options only, use long option --help to show all options" << std::endl;
     exit(0);//help was invoked, stop processing
   }
 
+  if(function_opt.empty()){
+    cerr << "Error: no function selected, use option -f" << endl;
+    exit(1);
+  }
+
+  filter::Filter filter1d;
+  filter1d.setNoDataValues(nodata_opt);
+  for(int iclass=0;iclass<class_opt.size();++iclass)
+    filter1d.pushClass(class_opt[iclass]);
+
+  filter1d.setThresholds(percentile_opt);
+
   ImgReaderGdal input;
   ImgWriterGdal output;
-  assert(input_opt.size());
-  assert(output_opt.size());
-  input.open(input_opt[0]);
-  if(scale_opt.size())
-    input.setScale(scale_opt[0]);
-  if(offset_opt.size())
-    input.setOffset(offset_opt[0]);
-  
-  // output.open(output_opt[0],input);
+  if(input_opt.empty()){
+    cerr << "Error: no input file selected, use option -i" << endl;
+    exit(1);
+  }
+  if(output_opt.empty()){
+    cerr << "Error: no output file selected, use option -o" << endl;
+    exit(1);
+  }
+  try{
+    input.open(input_opt[0]);
+  }
+  catch(string errorstring){
+    cout << errorstring << endl;
+    exit(1);
+  }
+
   GDALDataType theType=GDT_Unknown;
   if(verbose_opt[0])
     cout << "possible output data types: ";
@@ -153,7 +190,7 @@ int main(int argc,char **argv) {
   if(verbose_opt[0])
     std::cout << std::endl << "Output pixel type:  " << GDALGetDataTypeName(theType) << endl;
 
-  string imageType=input.getImageType();
+  string imageType;//=input.getImageType();
   if(oformat_opt.size())
     imageType=oformat_opt[0];
 
@@ -162,27 +199,43 @@ int main(int argc,char **argv) {
     theInterleave+=input.getInterleave();
     option_opt.push_back(theInterleave);
   }
+  if(verbose_opt[0])
+    cout << "Calculating statistic metrics: " << function_opt.size() << endl;
   try{
-    output.open(output_opt[0],input.nrOfCol(),input.nrOfRow(),input.nrOfBand(),theType,imageType,option_opt);
+    output.open(output_opt[0],input.nrOfCol(),input.nrOfRow(),function_opt.size(),theType,imageType,option_opt);
   }
   catch(string errorstring){
     cout << errorstring << endl;
     exit(4);
   }
+
   output.setProjection(input.getProjection());
   double gt[6];
   input.getGeoTransform(gt);
   output.setGeoTransform(gt);
-
-  if(input.getColorTable()!=NULL)
+  
+  if(colorTable_opt.size()){
+    if(colorTable_opt[0]!="none"){
+      if(verbose_opt[0])
+	cout << "set colortable " << colorTable_opt[0] << endl;
+      assert(output.getDataType()==GDT_Byte);
+      output.setColorTable(colorTable_opt[0]);
+    }
+  }
+  else if(input.getColorTable()!=NULL)
     output.setColorTable(input.getColorTable());
+  
+  if(nodata_opt.size()){
+    for(int iband=0;iband<output.nrOfBand();++iband)
+      output.GDALSetNoDataValue(nodata_opt[0],iband);
+  }
 
-  filter2d::Filter2d filter2d;
-  if(verbose_opt[0])
-    std::cout<< "class values: ";
-  if(colorTable_opt.size())
-    output.setColorTable(colorTable_opt[0]);
-  filter2d.shadowDsm(input,output,sza_opt[0],saa_opt[0],input.getDeltaX(),flag_opt[0]);
+  try{
+    filter1d.stats(input,output,function_opt);
+  }
+  catch(string errorstring){
+    cerr << errorstring << endl;
+  }
   input.close();
   output.close();
   return 0;
diff --git a/src/apps/pksvm.cc b/src/apps/pksvm.cc
index b6e9ff4..df1e74d 100644
--- a/src/apps/pksvm.cc
+++ b/src/apps/pksvm.cc
@@ -47,7 +47,7 @@ along with pktools.  If not, see <http://www.gnu.org/licenses/>.
   Options: [-tln layer]* [-c name -r value]* [-of GDALformat|-f OGRformat] [-co NAME=VALUE]* [-ct filename] [-label attribute] [-prior value]* [-g gamma] [-cc cost] [-m filename [-msknodata value]*] [-nodata value]
 
   Advanced options:
-       [-b band] [-s band] [-e band] [-bal size]* [-min] [-bag value] [-bs value] [-comb rule] [-cb filename] [-prob filename] [-pim priorimage] [--offset value] [--scale value] [-svmt type] [-kt type] [-kd value]  [-c0 value] [-nu value] [-eloss value] [-cache value] [-etol value] [-shrink] [-extent vector]
+       [-b band] [-sband band -eband band]* [-bal size]* [-min] [-bag value] [-bs value] [-comb rule] [-cb filename] [-prob filename] [-pim priorimage] [--offset value] [--scale value] [-svmt type] [-kt type] [-kd value]  [-c0 value] [-nu value] [-eloss value] [-cache value] [-etol value] [-shrink]
 </code>
 
 \section pksvm_description Description
@@ -68,7 +68,7 @@ Both raster and vector files are supported as input. The output will contain the
  | tln    | tln                  | std::string |       |Training layer name(s) | 
  | c      | class                | std::string |       |List of class names. | 
  | r      | reclass              | short |       |List of class values (use same order as in class opt). | 
- | of     | oformat              | std::string |       |Output image format (see also gdal_translate). Empty string: inherit from input image | 
+ | of     | oformat              | std::string | GTiff |Output image format (see also gdal_translate).| 
  | f      | f                    | std::string | SQLite |Output ogr format for active training sample | 
  | co     | co                   | std::string |       |Creation option for output file. Multiple options can be specified. | 
  | ct     | ct                   | std::string |       |Color table in ASCII format having 5 columns: id R G B ALFA (0: transparent, 255: solid) | 
@@ -76,12 +76,12 @@ Both raster and vector files are supported as input. The output will contain the
  | prior  | prior                | double | 0     |Prior probabilities for each class (e.g., -p 0.3 -p 0.3 -p 0.2 ). Used for input only (ignored for cross validation) | 
  | g      | gamma                | float | 1     |Gamma in kernel function | 
  | cc     | ccost                | float | 1000  |The parameter C of C_SVC, epsilon_SVR, and nu_SVR | 
- | m      | mask                 | std::string |       |Use the first band of the specified file as a validity mask. Nodata values can be set with the option msknodata. | 
+ | m      | mask                 | std::string |       |Only classify within specified mask (vector or raster). For raster mask, set nodata values with the option msknodata. | 
  | msknodata | msknodata            | short | 0     |Mask value(s) not to consider for classification (use negative values if only these values should be taken into account). Values will be taken over in classification image. | 
  | nodata | nodata               | unsigned short | 0     |Nodata value to put where image is masked as nodata | 
  | b      | band                 | short |       |Band index (starting from 0, either use band option or use start to end) | 
- | s      | start                | double | 0     |Start band sequence number | 
- | e      | end                  | double | 0     |End band sequence number (set to 0 to include all bands) | 
+ | sband  | startband            | unsigned short |      |Start band sequence number | 
+ | eband  | endband              | unsigned short |      |End band sequence number   | 
  | bal    | balance              | unsigned int | 0     |Balance the input data to this number of samples for each class | 
  | min    | min                  | int  | 0     |If number of training pixels is less then min, do not take this class into account (0: consider all classes) | 
  | bag    | bag                  | unsigned short | 1     |Number of bootstrap aggregations | 
@@ -90,8 +90,8 @@ Both raster and vector files are supported as input. The output will contain the
  | cb     | classbag             | std::string |       |Output for each individual bootstrap aggregation | 
  | prob   | prob                 | std::string |       |Probability image. | 
  | pim    | priorimg             | std::string |       |Prior probability image (multi-band img with band for each class | 
- |        | offset               | double | 0     |Offset value for each spectral band input features: refl[band]=(DN[band]-offset[band])/scale[band] | 
- |        | scale                | double | 0     |Scale value for each spectral band input features: refl=(DN[band]-offset[band])/scale[band] (use 0 if scale min and max in each band to -1.0 and 1.0) | 
+ | offset | offset               | double | 0     |Offset value for each spectral band input features: refl[band]=(DN[band]-offset[band])/scale[band] | 
+ | scale  | scale                | double | 0     |Scale value for each spectral band input features: refl=(DN[band]-offset[band])/scale[band] (use 0 if scale min and max in each band to -1.0 and 1.0) | 
  | svmt   | svmtype              | std::string | C_SVC |Type of SVM (C_SVC, nu_SVC,one_class, epsilon_SVR, nu_SVR) | 
  | kt     | kerneltype           | std::string | radial |Type of kernel function (linear,polynomial,radial,sigmoid)  | 
  | kd     | kd                   | unsigned short | 3     |Degree in kernel function | 
@@ -106,7 +106,6 @@ Both raster and vector files are supported as input. The output will contain the
  | active | active               | std::string |       |Ogr output for active training sample. | 
  | na     | nactive              | unsigned int | 1     |Number of active training points | 
  | random | random               | bool | true  |Randomize training data for balancing and bagging | 
- | e      | extent               | std::string |       |get boundary to classify from extent from polygons in vector file | 
 
 Usage: pksvm -t training [-i input -o output] [-cv value]
 
@@ -137,11 +136,11 @@ int main(int argc, char *argv[])
   Optionpk<unsigned int> balance_opt("bal", "balance", "Balance the input data to this number of samples for each class", 0);
   Optionpk<bool> random_opt("random", "random", "Randomize training data for balancing and bagging", true, 2);
   Optionpk<int> minSize_opt("min", "min", "If number of training pixels is less then min, do not take this class into account (0: consider all classes)", 0);
-  Optionpk<short> band_opt("b", "band", "Band index (starting from 0, either use band option or use start to end)");
-  Optionpk<double> bstart_opt("s", "start", "Start band sequence number",0); 
-  Optionpk<double> bend_opt("e", "end", "End band sequence number (set to 0 to include all bands)", 0); 
-  Optionpk<double> offset_opt("\0", "offset", "Offset value for each spectral band input features: refl[band]=(DN[band]-offset[band])/scale[band]", 0.0);
-  Optionpk<double> scale_opt("\0", "scale", "Scale value for each spectral band input features: refl=(DN[band]-offset[band])/scale[band] (use 0 if scale min and max in each band to -1.0 and 1.0)", 0.0);
+  Optionpk<unsigned short> band_opt("b", "band", "Band index (starting from 0, either use band option or use start to end)");
+  Optionpk<unsigned short> bstart_opt("sband", "startband", "Start band sequence number"); 
+  Optionpk<unsigned short> bend_opt("eband", "endband", "End band sequence number"); 
+  Optionpk<double> offset_opt("offset", "offset", "Offset value for each spectral band input features: refl[band]=(DN[band]-offset[band])/scale[band]", 0.0);
+  Optionpk<double> scale_opt("scale", "scale", "Scale value for each spectral band input features: refl=(DN[band]-offset[band])/scale[band] (use 0 if scale min and max in each band to -1.0 and 1.0)", 0.0);
   Optionpk<double> priors_opt("prior", "prior", "Prior probabilities for each class (e.g., -p 0.3 -p 0.3 -p 0.2 ). Used for input only (ignored for cross validation)", 0.0); 
   Optionpk<string> priorimg_opt("pim", "priorimg", "Prior probability image (multi-band img with band for each class","",2); 
   Optionpk<unsigned short> cv_opt("cv", "cv", "N-fold cross validation mode",0);
@@ -163,11 +162,11 @@ int main(int argc, char *argv[])
   Optionpk<unsigned short> bag_opt("bag", "bag", "Number of bootstrap aggregations", 1);
   Optionpk<int> bagSize_opt("bagsize", "bagsize", "Percentage of features used from available training features for each bootstrap aggregation (one size for all classes, or a different size for each class respectively", 100);
   Optionpk<string> classBag_opt("cb", "classbag", "Output for each individual bootstrap aggregation");
-  Optionpk<string> mask_opt("m", "mask", "Use the first band of the specified file as a validity mask. Nodata values can be set with the option msknodata.");
+  Optionpk<string> mask_opt("m", "mask", "Only classify within specified mask (vector or raster). For raster mask, set nodata values with the option msknodata.");
   Optionpk<short> msknodata_opt("msknodata", "msknodata", "Mask value(s) not to consider for classification (use negative values if only these values should be taken into account). Values will be taken over in classification image.", 0);
   Optionpk<unsigned short> nodata_opt("nodata", "nodata", "Nodata value to put where image is masked as nodata", 0);
   Optionpk<string> output_opt("o", "output", "Output classification image"); 
-  Optionpk<string>  oformat_opt("of", "oformat", "Output image format (see also gdal_translate). Empty string: inherit from input image");
+  Optionpk<string>  oformat_opt("of", "oformat", "Output image format (see also gdal_translate).","GTiff");
   Optionpk<string> option_opt("co", "co", "Creation option for output file. Multiple options can be specified.");
   Optionpk<string> colorTable_opt("ct", "ct", "Color table in ASCII format having 5 columns: id R G B ALFA (0: transparent, 255: solid)"); 
   Optionpk<string> prob_opt("prob", "prob", "Probability image."); 
@@ -177,9 +176,10 @@ int main(int argc, char *argv[])
   Optionpk<unsigned int> nactive_opt("na", "nactive", "Number of active training points",1);
   Optionpk<string> classname_opt("c", "class", "List of class names."); 
   Optionpk<short> classvalue_opt("r", "reclass", "List of class values (use same order as in class opt)."); 
-  Optionpk<string>  extent_opt("extent", "extent", "get boundary to classify from extent from polygons in vector file");
   Optionpk<short> verbose_opt("v", "verbose", "Verbose level",0,2);
 
+  oformat_opt.setHide(1);
+  option_opt.setHide(1);
   band_opt.setHide(1);
   bstart_opt.setHide(1);
   bend_opt.setHide(1);
@@ -207,7 +207,6 @@ int main(int argc, char *argv[])
   active_opt.setHide(1);
   nactive_opt.setHide(1);
   random_opt.setHide(1);
-  extent_opt.setHide(1);
 
   verbose_opt.setHide(2);
 
@@ -261,7 +260,6 @@ int main(int argc, char *argv[])
     nactive_opt.retrieveOption(argc,argv);
     verbose_opt.retrieveOption(argc,argv);
     random_opt.retrieveOption(argc,argv);
-    extent_opt.retrieveOption(argc,argv);
   }
   catch(string predefinedString){
     std::cout << predefinedString << std::endl;
@@ -321,12 +319,20 @@ int main(int argc, char *argv[])
   double uly=0;
   double lrx=0;
   double lry=0;
-  if(extent_opt.size()){
-    extentReader.open(extent_opt[0]);
-    readLayer = extentReader.getDataSource()->GetLayer(0);
+
+  bool maskIsVector=false;
+  if(mask_opt.size()){
+    try{
+      extentReader.open(mask_opt[0]);
+      maskIsVector=true;
+      readLayer = extentReader.getDataSource()->GetLayer(0);
       if(!(extentReader.getExtent(ulx,uly,lrx,lry))){
-      cerr << "Error: could not get extent from " << extent_opt[0] << endl;
-      exit(1);
+	cerr << "Error: could not get extent from " << mask_opt[0] << endl;
+	exit(1);
+      }
+    }
+    catch(string errorString){
+      maskIsVector=false;
     }
   }
 
@@ -367,6 +373,28 @@ int main(int argc, char *argv[])
       priors[iclass]/=normPrior;
   }
 
+  //convert start and end band options to vector of band indexes
+  try{
+    if(bstart_opt.size()){
+      if(bend_opt.size()!=bstart_opt.size()){
+	string errorstring="Error: options for start and end band indexes must be provided as pairs, missing end band";
+	throw(errorstring);
+      }
+      band_opt.clear();
+      for(int ipair=0;ipair<bstart_opt.size();++ipair){
+	if(bend_opt[ipair]<=bstart_opt[ipair]){
+	  string errorstring="Error: index for end band must be smaller then start band";
+	  throw(errorstring);
+	}
+	for(int iband=bstart_opt[ipair];iband<=bend_opt[ipair];++iband)
+	  band_opt.push_back(iband);
+      }
+    }
+  }
+  catch(string error){
+    cerr << error << std::endl;
+    exit(1);
+  }
   //sort bands
   if(band_opt.size())
     std::sort(band_opt.begin(),band_opt.end());
@@ -402,7 +430,7 @@ int main(int argc, char *argv[])
         if(band_opt.size())
           totalSamples=trainingReaderBag.readDataImageOgr(trainingMap,fields,band_opt,label_opt[0],tlayer_opt,verbose_opt[0]);
         else
-          totalSamples=trainingReaderBag.readDataImageOgr(trainingMap,fields,bstart_opt[0],bend_opt[0],label_opt[0],tlayer_opt,verbose_opt[0]);
+          totalSamples=trainingReaderBag.readDataImageOgr(trainingMap,fields,0,0,label_opt[0],tlayer_opt,verbose_opt[0]);
         if(trainingMap.size()<2){
           string errorstring="Error: could not read at least two classes from training file, did you provide class labels in training sample (see option label)?";
           throw(errorstring);
@@ -813,7 +841,8 @@ int main(int argc, char *argv[])
     }
   
     ImgWriterGdal maskWriter;
-    if(extent_opt.size()){
+
+    if(maskIsVector){
       try{
 	maskWriter.open("/vsimem/mask.tif",ncol,nrow,1,GDT_Float32,imageType,option_opt);
 	maskWriter.GDALSetNoDataValue(nodata_opt[0]);
@@ -821,6 +850,7 @@ int main(int argc, char *argv[])
         maskWriter.setProjection(testImage.getProjection());
 	vector<double> burnValues(1,1);//burn value is 1 (single band)
 	maskWriter.rasterizeOgr(extentReader,burnValues);
+	extentReader.close();
 	maskWriter.close();
       }
       catch(string error){
@@ -876,7 +906,7 @@ int main(int argc, char *argv[])
           }
         }
         else{
-          for(int iband=bstart_opt[0];iband<bstart_opt[0]+nband;++iband){
+          for(int iband=0;iband<nband;++iband){
             if(verbose_opt[0]==2)
               std::cout << "reading band " << iband << std::endl;
             assert(iband>=0);
@@ -924,7 +954,7 @@ int main(int argc, char *argv[])
         bool masked=false;
 	double geox=0;
 	double geoy=0;
-        if(extent_opt.size()){
+        if(maskIsVector){
 	  doClassify=false;
 	  testImage.image2geo(icol,iline,geox,geoy);
 	  //check enveloppe first
@@ -1361,8 +1391,6 @@ int main(int argc, char *argv[])
   try{
     if(active_opt.size())
       activeWriter.close();
-    if(extent_opt.size())
-      extentReader.close();
   }
   catch(string errorString){
     std::cerr << "Error: errorString" << std::endl;
diff --git a/src/imageclasses/ImgReaderGdal.cc b/src/imageclasses/ImgReaderGdal.cc
index dec3f55..d03860b 100644
--- a/src/imageclasses/ImgReaderGdal.cc
+++ b/src/imageclasses/ImgReaderGdal.cc
@@ -367,27 +367,28 @@ bool ImgReaderGdal::covers(double ulx, double  uly, double lrx, double lry) cons
 double ImgReaderGdal::getMin(int& x, int& y, int band) const{
   double minValue=0;
   std::vector<double> lineBuffer(nrOfCol());
-  bool init=false;
+  bool isValid=false;
   for(int irow=0;irow<nrOfRow();++irow){
     readData(lineBuffer,GDT_Float64,irow,band);
     for(int icol=0;icol<nrOfCol();++icol){
-      // bool valid=(find(m_noDataValues.begin(),m_noDataValues.end(),lineBuffer[icol])==m_noDataValues.end());
-      if(!isNoData(lineBuffer[icol])){
-        if(!init){
-          y=irow;
-          x=icol;
-          minValue=lineBuffer[icol];
-          init=true;
-        }
-        else if(minValue>lineBuffer[icol]){
+      if(isNoData(lineBuffer[icol]))
+	continue;
+      if(isValid){
+	if(lineBuffer[icol]<minValue){
           y=irow;
           x=icol;
           minValue=lineBuffer[icol];
         }
       }
+      else{
+	y=irow;
+	x=icol;
+	minValue=lineBuffer[icol];
+	isValid=true;
+      }
     }
   }
-  if(init)
+  if(isValid)
     return minValue;
   else
     throw(static_cast<std::string>("Warning: not initialized"));
@@ -396,28 +397,28 @@ double ImgReaderGdal::getMin(int& x, int& y, int band) const{
 double ImgReaderGdal::getMax(int& x, int& y, int band) const{
   double maxValue=0;
   std::vector<double> lineBuffer(nrOfCol());
-  bool init=false;
+  bool isValid=false;
   for(int irow=0;irow<nrOfRow();++irow){
     readData(lineBuffer,GDT_Float64,irow,band);
     for(int icol=0;icol<nrOfCol();++icol){
-      // bool valid=(find(m_noDataValues.begin(),m_noDataValues.end(),lineBuffer[icol])==m_noDataValues.end());
-      // if(valid){
-      if(!isNoData(lineBuffer[icol])){
-        if(!init){
-          y=irow;
-          x=icol;
-          maxValue=lineBuffer[icol];
-          init=true;
-        }
-        else if(maxValue<lineBuffer[icol]){
+      if(isNoData(lineBuffer[icol]))
+	continue;
+      if(isValid){
+	if(lineBuffer[icol]>maxValue){
           y=irow;
           x=icol;
           maxValue=lineBuffer[icol];
         }
       }
+      else{
+	y=irow;
+	x=icol;
+	maxValue=lineBuffer[icol];
+	isValid=true;
+      }
     }
   }
-  if(init)
+  if(isValid)
     return maxValue;
   else
     throw(static_cast<std::string>("Warning: not initialized"));
@@ -425,93 +426,85 @@ double ImgReaderGdal::getMax(int& x, int& y, int band) const{
 
 void ImgReaderGdal::getMinMax(int startCol, int endCol, int startRow, int endRow, int band, double& minValue, double& maxValue) const
 {
-  // GDALRasterBand  *poBand;
-  // int             bGotMin, bGotMax;
-  // double          adfMinMax[2];
-        
-  // poBand = m_gds->GetRasterBand(band+1);
-  // adfMinMax[0] = poBand->GetMinimum( &bGotMin );
-  // adfMinMax[1] = poBand->GetMaximum( &bGotMax );
-  // if( ! (bGotMin && bGotMax) )
-  //   GDALComputeRasterMinMax((GDALRasterBandH)poBand, FALSE, adfMinMax);
-  //   // GDALComputeRasterMinMax((GDALRasterBandH)poBand, TRUE, adfMinMax);
-  // minValue=adfMinMax[0];
-  // maxValue=adfMinMax[1];
-
+  bool isConstraint=(maxValue>minValue);
+  double minConstraint=minValue;
+  double maxConstraint=maxValue;
   std::vector<double> lineBuffer(endCol-startCol+1);
-  bool init=false;
+  bool isValid=false;
   assert(endRow<nrOfRow());
   for(int irow=startCol;irow<endRow+1;++irow){
     readData(lineBuffer,GDT_Float64,startCol,endCol,irow,band);
     for(int icol=0;icol<lineBuffer.size();++icol){
-      if(!isNoData(lineBuffer[icol])){
-	if(!init){
+      if(isNoData(lineBuffer[icol]))
+	continue;
+      if(isValid){
+	if(isConstraint){
+	  if(lineBuffer[icol]<minConstraint)
+	    continue;
+	  if(lineBuffer[icol]>maxConstraint)
+	    continue;
+	}
+	if(lineBuffer[icol]<minValue)
 	  minValue=lineBuffer[icol];
+	if(lineBuffer[icol]>maxValue)
 	  maxValue=lineBuffer[icol];
-	  init=true;
-	}
-	else{
-	  if(minValue>lineBuffer[icol])
-	    minValue=lineBuffer[icol];
-	  if(maxValue<lineBuffer[icol])
-	    maxValue=lineBuffer[icol];
+      }
+      else{
+	if(isConstraint){
+	  if(lineBuffer[icol]<minConstraint)
+	    continue;
+	  if(lineBuffer[icol]>maxConstraint)
+	    continue;
 	}
+	minValue=lineBuffer[icol];
+	maxValue=lineBuffer[icol];
+	isValid=true;
       }
     }
   }
-  if(!init)
+  if(!isValid)
     throw(static_cast<std::string>("Warning: not initialized"));
 }
 
-void ImgReaderGdal::getMinMax(double& minValue, double& maxValue, int band, bool exhaustiveSearch) const
+void ImgReaderGdal::getMinMax(double& minValue, double& maxValue, int band) const
 {
-  if(exhaustiveSearch){//force exhaustive search
-    std::vector<double> lineBuffer(nrOfCol());
-    bool init=false;
-    for(int irow=0;irow<nrOfRow();++irow){
-      readData(lineBuffer,GDT_Float64,irow,band);
-      for(int icol=0;icol<nrOfCol();++icol){
-        // bool valid=(find(m_noDataValues.begin(),m_noDataValues.end(),lineBuffer[icol])==m_noDataValues.end());
-        // if(valid){
-	if(!isNoData(lineBuffer[icol])){
-          if(!init){
-            minValue=lineBuffer[icol];
-            maxValue=lineBuffer[icol];
-            init=true;
-          }
-          else{
-            if(minValue>lineBuffer[icol])
-              minValue=lineBuffer[icol];
-            if(maxValue<lineBuffer[icol])
-              maxValue=lineBuffer[icol];
-          }
-        }
+  bool isConstraint=(maxValue>minValue);
+  double minConstraint=minValue;
+  double maxConstraint=maxValue;
+  std::vector<double> lineBuffer(nrOfCol());
+  bool isValid=false;
+  for(int irow=0;irow<nrOfRow();++irow){
+    readData(lineBuffer,GDT_Float64,irow,band);
+    for(int icol=0;icol<nrOfCol();++icol){
+      if(isNoData(lineBuffer[icol]))
+	continue;
+      if(isValid){
+	if(isConstraint){
+	  if(lineBuffer[icol]<minConstraint)
+	    continue;
+	  if(lineBuffer[icol]>maxConstraint)
+	    continue;
+	}
+	if(lineBuffer[icol]<minValue)
+	  minValue=lineBuffer[icol];
+	if(lineBuffer[icol]>maxValue)
+	  maxValue=lineBuffer[icol];
+      }
+      else{
+	if(isConstraint){
+	  if(lineBuffer[icol]<minConstraint)
+	    continue;
+	  if(lineBuffer[icol]>maxConstraint)
+	    continue;
+	}
+	minValue=lineBuffer[icol];
+	maxValue=lineBuffer[icol];
+	isValid=true;
       }
-    }
-    if(!init)
-      throw(static_cast<std::string>("Warning: not initialized"));
-  }
-  else{
-    GDALRasterBand  *poBand;
-    int             bGotMin, bGotMax;
-    double          adfMinMax[2];
-        
-    poBand = m_gds->GetRasterBand(band+1);
-    adfMinMax[0] = poBand->GetMinimum( &bGotMin );
-    adfMinMax[1] = poBand->GetMaximum( &bGotMax );
-    if( ! (bGotMin && bGotMax) )
-      GDALComputeRasterMinMax((GDALRasterBandH)poBand, FALSE, adfMinMax);
-    minValue=adfMinMax[0];
-    maxValue=adfMinMax[1];
-    if(m_scale.size()>band){
-      minValue*=m_scale[band];
-      maxValue*=m_scale[band];
-    }
-    if(m_offset.size()>band){
-      minValue+=m_offset[band];
-      maxValue+=m_offset[band];
     }
   }
+  if(!isValid)
+    throw(static_cast<std::string>("Warning: not initialized"));
 }
 
 double ImgReaderGdal::getHistogram(std::vector<double>& histvector, double& min, double& max, unsigned int& nbin, int theBand, bool kde){
diff --git a/src/imageclasses/ImgReaderGdal.h b/src/imageclasses/ImgReaderGdal.h
index b0e523f..c44dc5e 100644
--- a/src/imageclasses/ImgReaderGdal.h
+++ b/src/imageclasses/ImgReaderGdal.h
@@ -81,7 +81,7 @@ public:
   int getNoDataValues(std::vector<double>& noDataValues) const;
   bool isNoData(double value) const{if(m_noDataValues.empty()) return false;else return find(m_noDataValues.begin(),m_noDataValues.end(),value)!=m_noDataValues.end();};
   int pushNoDataValue(double noDataValue);
-  int setNoData(const std::vector<double> nodata){m_noDataValues=nodata;};
+  int setNoData(const std::vector<double> nodata){m_noDataValues=nodata; return(m_noDataValues.size());};
   CPLErr GDALSetNoDataValue(double noDataValue, int band=0) {return getRasterBand(band)->SetNoDataValue(noDataValue);};
   bool covers(double x, double y) const;
   bool covers(double ulx, double  uly, double lrx, double lry) const;
@@ -97,7 +97,7 @@ public:
   template<typename T> void readData(std::vector<T>& buffer, const GDALDataType& dataType, int row, int band=0) const;
   template<typename T> void readData(std::vector<T>& buffer, const GDALDataType& dataType, double row, int band=0, RESAMPLE resample=NEAR) const;
   void getMinMax(int startCol, int endCol, int startRow, int endRow, int band, double& minValue, double& maxValue) const;
-  void getMinMax(double& minValue, double& maxValue, int band=0, bool exhaustiveSearch=true) const;
+  void getMinMax(double& minValue, double& maxValue, int band=0) const;
   double getMin(int& col, int& row, int band=0) const;
   double getHistogram(std::vector<double>& histvector, double& min, double& max,unsigned int& nbin, int theBand=0, bool kde=false);
   double getMax(int& col, int& row, int band=0) const;
diff --git a/src/imageclasses/ImgReaderOgr.cc b/src/imageclasses/ImgReaderOgr.cc
index a303005..5b6d23b 100644
--- a/src/imageclasses/ImgReaderOgr.cc
+++ b/src/imageclasses/ImgReaderOgr.cc
@@ -48,15 +48,26 @@ void ImgReaderOgr::open(const std::string& filename)
 //---------------------------------------------------------------------------
 void ImgReaderOgr::close(void)
 {
+#if GDAL_VERSION_MAJOR < 2
   OGRDataSource::DestroyDataSource(m_datasource);
+#else
+  GDALClose(m_datasource);
+#endif
 }
 
 //---------------------------------------------------------------------------
 void ImgReaderOgr::setCodec(void){
+#if GDAL_VERSION_MAJOR < 2
   //register the drivers
   OGRRegisterAll();
   //open the input OGR datasource. Datasources can be files, RDBMSes, directories full of files, or even remote web services depending on the driver being used. However, the datasource name is always a single string.
   m_datasource = OGRSFDriverRegistrar::Open(m_filename.c_str(), FALSE);//FAlSE: do not update
+#else
+  //register the drivers
+  GDALAllRegister();
+  //open the input OGR datasource. Datasources can be files, RDBMSes, directories full of files, or even remote web services depending on the driver being used. However, the datasource name is always a single string.
+  m_datasource = (GDALDataset*) GDALOpenEx(m_filename.c_str(), GDAL_OF_READONLY, NULL, NULL, NULL);
+#endif
   if( m_datasource == NULL ){
     std::string errorString="Open failed";
     throw(errorString);
@@ -252,7 +263,7 @@ std::ostream& operator<<(std::ostream& theOstream, ImgReaderOgr& theImageReader)
 
 unsigned int ImgReaderOgr::readDataImageOgr(std::map<std::string,Vector2d<float> > &mapPixels, //[classNr][pixelNr][bandNr],
 					    std::vector<std::string>& fields,
-					    const std::vector<short>& bands,
+					    const std::vector<unsigned short>& bands,
 					    const std::string& label,
 					    const std::vector<std::string>& layers,
 					    int verbose)
diff --git a/src/imageclasses/ImgReaderOgr.h b/src/imageclasses/ImgReaderOgr.h
index ffb3515..9769035 100644
--- a/src/imageclasses/ImgReaderOgr.h
+++ b/src/imageclasses/ImgReaderOgr.h
@@ -50,7 +50,7 @@ public:
   template <typename T> int readData(std::map<std::string,Vector2d<T> >& data, const OGRFieldType& fieldType, std::vector<std::string>& fields, const std::string& label, int layer=0, bool pos=false, bool verbose=false);//default layer 0 and no pos information in data
   unsigned int readDataImageOgr(std::map<std::string,Vector2d<float> > &mapPixels, //[classNr][pixelNr][bandNr],
 				std::vector<std::string>& fields,
-				const std::vector<short>& bands,
+				const std::vector<unsigned short>& bands,
 				const std::string& label,
 				const std::vector<std::string>& layers,
 				int verbose=false);
@@ -73,8 +73,13 @@ public:
   //  int getLayer(int layer=0) const;
   int getFields(std::vector<std::string>& fields, int layer=0) const;
   int getFields(std::vector<OGRFieldDefn*>& fields, int layer=0) const;
+#if GDAL_VERSION_MAJOR < 2
   OGRDataSource* getDataSource(void) {return m_datasource;};
   OGRSFDriver* getDriver(void) const {return m_datasource->GetDriver();};
+#else
+  GDALDataset* getDataSource(void) {return m_datasource;};
+  GDALDriver* getDriver(void) const {return m_datasource->GetDriver();};
+#endif
   int getLayerCount(void) const {return m_datasource->GetLayerCount();};
 //   OGRLayer *executeSql(const std::string& output,const std::string& sqlStatement, OGRGeometry* spatialFilter=NULL);
   template<typename T> int readSql(Vector2d<T>& data, const OGRFieldType& fieldType, std::vector<std::string>& fields, const std::string& sqlStatement, OGRGeometry* spatialFilter=NULL, int layer=0, bool pos=false, bool verbose=false);
@@ -90,7 +95,11 @@ protected:
   void setCodec(void);
 
   std::string m_filename;
+#if GDAL_VERSION_MAJOR < 2
   OGRDataSource *m_datasource;
+#else
+  GDALDataset *m_datasource;
+#endif
   char m_fs;
 };
 
diff --git a/src/imageclasses/ImgWriterOgr.cc b/src/imageclasses/ImgWriterOgr.cc
index 4297190..2044d66 100644
--- a/src/imageclasses/ImgWriterOgr.cc
+++ b/src/imageclasses/ImgWriterOgr.cc
@@ -125,31 +125,58 @@ void ImgWriterOgr::open(const std::string& filename, const std::string& imageTyp
 //---------------------------------------------------------------------------
 void ImgWriterOgr::close(void)
 {
+#if GDAL_VERSION_MAJOR < 2
   OGRDataSource::DestroyDataSource(m_datasource);
+#else
+  GDALClose(m_datasource);
+#endif
 }
 
 //---------------------------------------------------------------------------
 void ImgWriterOgr::setCodec(const std::string& imageType){
+#if GDAL_VERSION_MAJOR < 2
   //register the drivers
   OGRRegisterAll();
   //fetch the OGR file driver
   OGRSFDriver *poDriver;
   poDriver = OGRSFDriverRegistrar::GetRegistrar()->GetDriverByName(imageType.c_str());
+#else
+  //register the drivers
+  GDALAllRegister();
+  GDALDriver *poDriver;
+  poDriver = GetGDALDriverManager()->GetDriverByName(imageType.c_str());
+#endif
   if( poDriver == NULL ){
     std::string errorString="FileOpenError";
     throw(errorString);
   }
+#if GDAL_VERSION_MAJOR < 2
   m_datasource = OGRSFDriverRegistrar::Open( m_filename.c_str(), TRUE );
+#else
+  m_datasource = (GDALDataset*) GDALOpenEx(m_filename.c_str(), GDAL_OF_UPDATE, NULL, NULL, NULL);
+#endif
   if( m_datasource == NULL ){
+#if GDAL_VERSION_MAJOR < 2
     m_datasource = OGRSFDriverRegistrar::Open( m_filename.c_str(), FALSE );
+#else
+    m_datasource = (GDALDataset*) GDALOpenEx(m_filename.c_str(), GDAL_OF_READONLY, NULL, NULL, NULL);
+#endif
     if ( m_datasource != NULL){// we can only open in not update mode
       std::string errorString="Update mode not supported, delete output dataset first";
       throw(errorString);
+#if GDAL_VERSION_MAJOR < 2
       OGRDataSource::DestroyDataSource(m_datasource);
+#else
+      GDALClose(m_datasource);
+#endif
       m_datasource = NULL;
     }
     else //create the data source
+#if GDAL_VERSION_MAJOR < 2
       m_datasource=poDriver->CreateDataSource(m_filename.c_str(),NULL);
+#else
+      m_datasource=poDriver->Create(m_filename.c_str(),0,0,0,GDT_Unknown,NULL);
+#endif
   }
   else{//datasets exists, always overwrite all layers (no update append for now)
     int nLayerCount = m_datasource->GetLayerCount();
@@ -166,23 +193,44 @@ void ImgWriterOgr::setCodec(const std::string& imageType){
   }
 }
 
+#if GDAL_VERSION_MAJOR < 2
 void ImgWriterOgr::setCodec(OGRSFDriver *poDriver){
   OGRRegisterAll();
+#else
+void ImgWriterOgr::setCodec(GDALDriver *poDriver){
+  GDALAllRegister();
+#endif
   if( poDriver == NULL ){
     std::string errorString="FileOpenError";
     throw(errorString);
   }
+#if GDAL_VERSION_MAJOR < 2
   m_datasource = OGRSFDriverRegistrar::Open( m_filename.c_str(), TRUE );
+#else
+  m_datasource = (GDALDataset*) GDALOpenEx(m_filename.c_str(), GDAL_OF_UPDATE, NULL, NULL, NULL);
+#endif
   if( m_datasource == NULL ){
+#if GDAL_VERSION_MAJOR < 2
     m_datasource = OGRSFDriverRegistrar::Open( m_filename.c_str(), FALSE );
+#else
+    m_datasource = (GDALDataset*) GDALOpenEx(m_filename.c_str(), GDAL_OF_READONLY, NULL, NULL, NULL);
+#endif
     if ( m_datasource != NULL){// we can only open in not update mode
       std::string errorString="Update mode not supported, delete output dataset first";
       throw(errorString);
+#if GDAL_VERSION_MAJOR < 2
       OGRDataSource::DestroyDataSource(m_datasource);
+#else
+      GDALClose(m_datasource);
+#endif
       m_datasource = NULL;
     }
     else //create the data source
+#if GDAL_VERSION_MAJOR < 2
       m_datasource=poDriver->CreateDataSource(m_filename.c_str(),NULL);
+#else
+      m_datasource=poDriver->Create(m_filename.c_str(),0,0,0,GDT_Unknown,NULL);
+#endif
   }
   else{//datasets exists, always overwrite all layers (no update append for now)
     int nLayerCount = m_datasource->GetLayerCount();
@@ -509,13 +557,13 @@ int ImgWriterOgr::ascii2ogr(const std::string& filename, const std::string &laye
             if(eGType==wkbPoint)
               pointFeature->SetField(fieldId,atoi(value.c_str()));
             else if(firstPoint.IsEmpty())
-              polyFeature->SetField(fieldId,atof(value.c_str()));
+              polyFeature->SetField(fieldId,atoi(value.c_str()));
             break;
           case(OFTString):
             if(eGType==wkbPoint)
               pointFeature->SetField(fieldId,value.c_str());
             else if(firstPoint.IsEmpty())
-              polyFeature->SetField(fieldId,atof(value.c_str()));
+              polyFeature->SetField(fieldId,value.c_str());
             break;
           default:
             break;
@@ -573,13 +621,13 @@ int ImgWriterOgr::ascii2ogr(const std::string& filename, const std::string &laye
             if(eGType==wkbPoint)
               pointFeature->SetField(fieldId,atoi(value.c_str()));
             else if(firstPoint.IsEmpty())
-              polyFeature->SetField(fieldId,atof(value.c_str()));
+              polyFeature->SetField(fieldId,atoi(value.c_str()));
             break;
           case(OFTString):
             if(eGType==wkbPoint)
               pointFeature->SetField(fieldId,value.c_str());
             else if(firstPoint.IsEmpty())
-              polyFeature->SetField(fieldId,atof(value.c_str()));
+              polyFeature->SetField(fieldId,value.c_str());
             break;
           default:
             break;
diff --git a/src/imageclasses/ImgWriterOgr.h b/src/imageclasses/ImgWriterOgr.h
index 327b9a7..f6ccffc 100644
--- a/src/imageclasses/ImgWriterOgr.h
+++ b/src/imageclasses/ImgWriterOgr.h
@@ -62,17 +62,30 @@ public:
   OGRErr createFeature(OGRFeature* theFeature, int layer=0);
   int getFieldCount(int layer=0) const;
   int getFeatureCount(int layer=0) const;
+#if GDAL_VERSION_MAJOR < 2
   OGRDataSource* getDataSource(void) {return m_datasource;};
   OGRSFDriver* getDriver(void) const {return m_datasource->GetDriver();};
+#else
+  GDALDataset* getDataSource(void) {return m_datasource;};
+  GDALDriver* getDriver(void) const {return m_datasource->GetDriver();};
+#endif
 
 protected:
   void setCodec(const std::string& imageType);
+#if GDAL_VERSION_MAJOR < 2
   void setCodec(OGRSFDriver *poDriver);
+#else
+  void setCodec(GDALDriver *poDriver);
+#endif
   
 //   OGRLayer* getLayer(int layer=0);
     
   std::string m_filename;
+#if GDAL_VERSION_MAJOR < 2
   OGRDataSource *m_datasource;
+#else
+  GDALDataset *m_datasource;
+#endif
 //   vector<OGRLayer*> m_layers;
 };
 

-- 
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/pkg-grass/pktools.git



More information about the Pkg-grass-devel mailing list